workflow behaviour-pattern-recognition-in-time-series
  template: define-unit -> characterise ->
            loop(define-unit (cluster) -> contextualise -> visualise ->
                 abstract (interpret) -> assess ->
                 characterise (refine features)) ->
            define-unit (label) -> build-model ->
            loop(characterise (predict) -> visualise -> assess ->
                 build-model (refine)) ->
            generate-knowledge
  description: "Human-in-the-loop visual analytics workflow for building
    classification models that recognise behavioural patterns in movement
    trajectories through iterative feature engineering and example
    selection"

# ============================================================================
# INPUT
# ============================================================================

artifact D_trajectories : entities
  origin: given
  internal structure: sequence
  embedment: {set, time}
  features:
    - id: f_movement
      value structure: vector
      value type: {numeric, spatial}
      description: "Geographic positions, speeds, headings"
  description: "Multivariate movement trajectories of multiple vessels
    over extended time period"

# ============================================================================
# STEP 1: PARTITION INTO TRAJECTORY EPISODES
# ============================================================================

transform T_partition :
  intent: define-unit
  manner: "time-partitioning with overlapping windows"
  input: D_trajectories
  output: D_episodes
  actor: hybrid
  description: "Partition continuous trajectories into overlapping episodes
    of appropriate duration to capture behavioural patterns"

artifact D_episodes : entities
  internal structure: episode
  embedment: {set, time}
  features:
    - id: f_entity_id
      value structure: atomic
      value type: reference
      description: "Entity identifier"
    - id: f_temporal_extent
      value structure: atomic
      value type: temporal
      description: "Episode time span"
  description: "Time-bounded trajectory segments potentially containing
    behavioural patterns of interest"

# ============================================================================
# STEP 2: EXTRACT INITIAL SYNOPTIC FEATURES
# ============================================================================

transform T_extract_features :
  intent: characterise
  manner: "compute interval-based synoptic features"
  input: D_episodes
  output: F_synoptic
  actor: machine
  description: "Abstract elementary positional data into summary statistics
    representing behavioural aspects such as speed level, trajectory
    curvature, and spatial context"

artifact F_synoptic : feature(D_episodes)
  value structure: vector
  value type: numeric
  description: "Initial set of synoptic features capturing speed
    characteristics, movement curvature, and spatial relationships"

# ============================================================================
# STEP 3: FEATURE REFINEMENT LOOP
# ============================================================================

loop L_feature_refinement:
  purpose: "Iteratively refine feature space to align with interpretable
    behavioural patterns"
  until: "Features adequately distinguish target patterns from other
    behaviours; episode groups show clear behavioural coherence"
  body:

    # ========================================================================
    # Step 3a: Cluster episodes by feature similarity
    # ========================================================================

    transform T_cluster :
      intent: define-unit
      manner: "cluster-by-similarity"
      input: D_episodes, F_synoptic
      output: D_clusters, F_cluster_label
      actor: machine
      description: "Group episodes with similar feature profiles to reveal
        natural behavioural clusters"

    artifact D_clusters : entities
      internal structure: group/cluster
      embedment: set
      description: "Groups of episodes exhibiting similar behavioural
        characteristics"

    artifact F_cluster_label : feature(D_episodes)
      value structure: atomic
      value type: categorical
      description: "Cluster membership identifier for each episode"

    # ========================================================================
    # Step 3b: Project into low-dimensional space
    # ========================================================================

    transform T_project :
      intent: contextualise
      manner: "projection by dimensionality reduction"
      input: D_episodes, F_synoptic
      output: D_projection_space, A_projection
      actor: machine
      description: "Create low-dimensional projection space from feature
        similarity and arrange episodes within it to expose behavioural
        groupings"

    artifact D_projection_space : entities
      internal structure: elementary
      features:
        - id: f_dimensions
          value structure: atomic
          value type: numeric
          description: "Number of spatial dimensions (2)"
      description: "Computed 2D projection space where proximity reflects
        feature similarity"

    artifact A_projection : arrangement(D_episodes)
      context: D_projection_space
      principle: "similarity-preserving projection from feature space"
      description: "Spatial arrangement where proximity indicates
        behavioural similarity"

    # ========================================================================
    # Step 3c: Visualise clusters
    # ========================================================================

    transform T_vis_clusters :
      intent: visualise
      manner: "coordinated multiple views"
      input: A_projection, F_cluster_label, D_episodes
      output: V_clusters
      actor: machine
      description: "Display episodes in projection space with cluster
        colouring, linked to geographic trajectory views and feature
        distribution displays"

    artifact V_clusters : visualisation(A_projection, F_cluster_label,
        D_episodes)
      layout: "coordinated views: projection plot, geographic map, feature
        distributions"
      form: "coloured points, trajectory lines, distribution charts"
      encoding: "projection position from arrangement; colour from cluster
        membership; trajectory shape and feature values from episode data"
      description: "Interactive visualisation enabling assessment of
        cluster quality and behavioural coherence"

    # ========================================================================
    # Step 3d: Interpret patterns
    # ========================================================================

    transform T_interpret :
      intent: abstract
      manner: "interpret behavioural patterns from clusters"
      input: V_clusters, F_synoptic
      output: P_patterns
      actor: human
      description: "Interpret clusters as behavioural patterns; assign
        preliminary semantic labels to discovered groupings"

    artifact P_patterns : pattern(D_clusters)
      representation form: "tentative behavioural labels with descriptions"
      description: "Conceptual interpretations of discovered behavioural
        patterns with preliminary semantic labels"

    # ========================================================================
    # Step 3e: Assess feature adequacy
    # ========================================================================

    transform T_assess_features :
      intent: assess
      manner: "evaluate feature adequacy and cluster coherence"
      input: V_clusters, D_clusters, F_synoptic, P_patterns
      output: K_feature_quality
      actor: human
      description: "Assess whether episodes within clusters exhibit
        coherent behavioural patterns and evaluate cluster separation;
        determine if feature refinement is needed"

    artifact K_feature_quality : knowledge(D_clusters, F_synoptic)
      representation form: "quality judgment"
      description: "Expert judgment of feature adequacy: whether current
        features achieve meaningful behavioural discrimination and cluster
        coherence, and whether refinement is needed"

    if K_feature_quality indicates refinement needed:
      then:
        transform T_refine_features :
          intent: characterise
          manner: "feature space engineering"
          input: D_episodes, F_synoptic, K_feature_quality
          output: F_synoptic_r
          actor: hybrid
          description: "Refine features based on assessment: add new
            features, apply transformations, adjust feature selection to
            better capture behavioural distinctions"

        artifact F_synoptic_r : feature(D_episodes)
          value structure: vector
          value type: numeric
          description: "Updated synoptic features with refined or expanded
            feature set"

        assign:
          F_synoptic := F_synoptic_r
      else:
        exit loop L_feature_refinement

end loop L_feature_refinement

# ============================================================================
# STEP 4: LABEL REPRESENTATIVE EXEMPLARS
# ============================================================================

transform T_label_exemplars :
  intent: define-unit
  manner: "interactive selection and labelling of representative exemplars"
  input: D_episodes, D_clusters, A_projection, V_clusters, P_patterns
  output: D_exemplars, F_pattern_labels
  actor: human
  description: "Select cluster cores or high-quality representatives
    through visual inspection; label episodes as instances of identified
    behavioural patterns"

artifact D_exemplars : entities
  internal structure: group/cluster
  embedment: set
  features:
    - id: f_cluster_size
      value structure: atomic
      value type: numeric
      description: "Number of labelled episodes per pattern type"
  description: "Labelled training set of behavioural pattern exemplars
    representing diverse pattern types discovered in the data"

artifact F_pattern_labels : feature(D_exemplars)
  value structure: atomic
  value type: categorical
  description: "Expert-assigned behavioural pattern labels for supervised
    learning"

# ============================================================================
# STEP 5: TRAIN INITIAL CLASSIFICATION MODEL
# ============================================================================

transform T_train_model :
  intent: build-model
  manner: "supervised classification model training"
  input: D_exemplars, F_synoptic, F_pattern_labels
  output: M_classifier
  actor: hybrid
  description: "Train machine learning classifier to map synoptic features
    to behavioural pattern labels using labelled exemplars"

artifact M_classifier : model(F_synoptic, F_pattern_labels)
  model type: "classifier"
  representation form: "supervised learning model"
  description: "Computational model for automated recognition of
    behavioural patterns from trajectory episodes"

# ============================================================================
# STEP 6: MODEL REFINEMENT LOOP
# ============================================================================

loop L_model_refinement:
  purpose: "Validate and refine model to ensure reliable pattern
    recognition"
  until: "Model errors are understood and minimised; classification
    accuracy is acceptable for intended application"
  body:

    # ========================================================================
    # Step 6a: Apply model for prediction
    # ========================================================================

    transform T_predict :
      intent: characterise
      manner: "apply model for prediction"
      input: D_episodes, F_synoptic, M_classifier
      output: F_predicted_labels
      actor: machine
      description: "Apply trained model to classify episodes based on
        their feature profiles"

    artifact F_predicted_labels : feature(D_episodes)
      value structure: atomic
      value type: categorical
      description: "Model-predicted behavioural pattern labels"

    # ========================================================================
    # Step 6b: Visualise classification results
    # ========================================================================

    transform T_vis_predictions :
      intent: visualise
      manner: "comparative error analysis display"
      input: D_episodes, D_exemplars, F_pattern_labels, F_predicted_labels,
             A_projection
      output: V_predictions
      actor: machine
      description: "Visualise classification results showing agreement and
        disagreement between predictions and human labels; highlight
        uncertain classifications"

    artifact V_predictions : visualisation(D_episodes, F_pattern_labels,
        F_predicted_labels, A_projection)
      layout: "coordinated views with classification results"
      form: "colour-coded trajectories and confidence indicators"
      encoding: "position from arrangement; colour from predicted class;
        opacity or highlighting indicates classification confidence or
        error"
      description: "Visual display of model performance showing accuracy,
        systematic errors, and uncertain classifications"

    # ========================================================================
    # Step 6c: Assess model performance
    # ========================================================================

    transform T_assess_model :
      intent: assess
      manner: "evaluate model performance and diagnose errors"
      input: V_predictions
      output: K_model_quality
      actor: human
      description: "Analyse classification errors to determine causes:
        ambiguous features, borderline cases, insufficient training
        coverage, labelling inconsistencies; decide if refinement is
        needed"

    artifact K_model_quality : knowledge(M_classifier, D_episodes)
      representation form: "quality judgment with diagnostic insights"
      description: "Understanding of model performance: identification of
        error types, error patterns, and potential causes; assessment of
        whether model refinement is needed"

    if K_model_quality indicates refinement needed:
      then:
        transform T_refine_model :
          intent: build-model
          manner: "model or training set adjustment"
          input: D_exemplars, F_synoptic, F_pattern_labels,
                 K_model_quality, M_classifier
          output: M_classifier_r
          actor: hybrid
          description: "Refine model based on error analysis: adjust
            parameters, modify training examples, or revise feature
            selection"

        artifact M_classifier_r : model(F_synoptic, F_pattern_labels)
          model type: "classifier"
          representation form: "refined supervised learning model"
          description: "Updated behavioural pattern recognition model with
            improved performance"

        assign:
          M_classifier := M_classifier_r
      else:
        exit loop L_model_refinement

end loop L_model_refinement

# ============================================================================
# STEP 7: SYNTHESISE FINDINGS
# ============================================================================

transform T_synthesise :
  intent: generate-knowledge
  manner: "formulate-statements"
  input: P_patterns, K_model_quality, K_feature_quality
  output: K_findings
  actor: human
  description: "Synthesise insights from pattern discovery and model
    development process"

artifact K_findings : knowledge(M_classifier, P_patterns)
  representation form: "statements and insights"
  description: "Discovered behavioural pattern subtypes and their
    characteristics; understanding of pattern manifestations in data;
    insights into data-driven pattern recognition compared to
    specification-based approaches"
	