workflow cluster-calendar
  template: define-unit -> contextualise -> characterise ->
            loop(define-unit (similarity-based) ->
                 characterise (groups) -> visualise ->
                 abstract -> assess) ->
            generate-knowledge
  description: "Identify and analyse recurring daily patterns in time series
    data through interactive clustering and calendar-based visualisation;
    detect standard patterns and exceptional days"

# ============================================================================
# INPUT
# ============================================================================

artifact D_hour : entities
  origin: given
  internal structure: elementary
  embedment: time
  features:
    - id: f_value
      value structure: atomic
      value type: numeric
      description: "Measured value"
  description: "Time series measurements at regular intervals over extended
    period"

artifact D_calendar entities
  origin: given
  internal structure: elementary
  embedment: time
  features:
    - id: f_temporal_coords
      value structure: vector
      value type: {categorical, numeric}
      description: "Month, day of week, day number"
  description: "Calendar structure providing temporal context with month
    and weekday organisation"

# ============================================================================
# STEP 1: PARTITION INTO DAILY EPISODES
# ============================================================================

transform T_partition :
  intent: define-unit
  manner: "time-partitioning into daily episodes"
  input: D_hour
  output: D_day
  actor: machine
  description: "Organise time series into daily episodes, each containing
    measurements for one 24-hour period"

artifact D_day : entities
  internal structure: episode
  embedment: time
  features:
    - id: f_day_index
      value structure: atomic
      value type: ordinal
      description: "Sequential position of day in the year"
  description: "Daily episodes consisting of all measurements within each
    24-hour period"

# ============================================================================
# STEP 2: ARRANGE DAYS IN A CALENDAR CONTEXT
# ============================================================================

transform T_arrange :
  intent: contextualise
  manner: "calendar-based"
  input: D_day, D_calendar
  output: A_calendar
  actor: machine
  description: "Arrange daily episodes in calendar context according to
    their temporal position"

artifact A_calendar : arrangement(D_day)
  context: D_calendar
  principle: "calendar date mapping to grid position"
  description: "Calendar-based arrangement where each day occupies its
    corresponding calendar cell"

# ============================================================================
# STEP 3: EXTRACT DAILY TEMPORAL PROFILES
# ============================================================================

transform T_profile :
  intent: characterize
  manner: "extract temporal profile"
  input: D_day
  output: F_day_profile
  actor: machine
  description: "Represent each day by its measurement sequence"

artifact F_day_profile : feature(D_day)
  value structure: vector
  value type: numeric
  description: "Daily temporal profile: sequence of measurements within
    each day"

# ============================================================================
# SPECIFICATION FOR CLUSTERING (initial loop artifact)
# ============================================================================

artifact S_clustering : specification
  origin: given
  representation form: "parameter settings"
  description: "Initial parameters for hierarchical clustering: number of
    clusters (dendrogram cut level), distance measure (geometric,
    normalised, shift-invariant, max-based), time interval focus"

# ============================================================================
# STEP 4: CLUSTERING LOOP -- INTERACTIVELY DISCOVER PATTERNS
# ============================================================================

loop L_clustering:
  purpose: "Iteratively explore cluster structure to identify meaningful
    and interpretable daily patterns"
  until: "Clusters provide clear, interpretable decomposition of daily
    patterns; standard patterns and exceptional days are identified"
  body:

    transform T_cluster :
      intent: define-unit
      manner: "hierarchical clustering by similarity"
      input: D_day, F_day_profile, S_clustering
      output: D_cluster, F_cluster_label
      actor: hyrbid
      description: "Apply hierarchical clustering to group days with
        similar profiles; user selects cut through dendrogram to determine
        clusters"

    artifact D_cluster : entities
      internal structure: group/cluster
      embedment: set
      features:
        - id: cluster_size
          value structure: atomic
          value type: numeric
          description: "Number of days in cluster"
      description: "Groups of days with similar daily profiles selected
        from hierarchical clustering tree"

    artifact F_cluster_label : feature(D_day)
      value structure: atomic
      value type: categorical
      description: "Cluster membership identifier for each day"

    transform T_aggregate :
      intent: characterise
      manner: "aggregate profiles per cluster"
      input: D_cluster, F_day_profile
      output: F_cluster_profile
      actor: machine
      description: "Compute average daily profile for each cluster to
        represent typical pattern"

    artifact F_cluster_profile : feature(D_cluster)
      value structure: vector
      value type: numeric
      description: "Cluster-level average daily profiles representing
        typical patterns for each group"

    transform T_calendar_vis :
      intent: visualise
      manner: "calendar grid with colour-coded clusters"
      input: A_calender, F_cluster_label
      output: V_calendar
      actor: machine
      description: "Display days on calendar grid, coloured by cluster
        membership"

    artifact V_calendar : visualisation(A_calendar, F_cluster_label)
      layout: "calendar grid (months as rows, weekdays as columns)"
      form: "coloured cells"
      encoding: "position from A_calendar; colour from F_cluster_label"
      description: "Calendar view showing temporal distribution of cluster
        patterns across year and week"

    transform T_profile_vis :
      intent: visualise
      manner: "line graphs of cluster profiles"
      input: F_cluster_profile, D_cluster
      output: V_profiles
      actor: machine
      description: "Display average daily profile for each cluster as line
        graph"

    artifact V_profiles : visualisation(F_cluster_profile, D_cluster)
      layout: "time axis (hour of day)"
      form: "line graphs (one per cluster)"
      encoding: "x-position: time within day; y-position: average
        measurement value; colour: cluster identity matching calendar
        colours"
      description: "Line graphs showing characteristic temporal patterns
        for each cluster"

    transform T_interpret :
      intent: abstract
      manner: "interpret cluster meanings"
      input: V_calendar, V_profiles
      output: P_patterns
      actor: human
      description: "Interpret cluster patterns: identify behavioural
        meaning of each cluster type"

    artifact P_patterns : pattern(D_cluster, F_cluster_profile)
      representation form: "textual labels and descriptions"
      description: "Interpreted meanings of daily patterns (e.g., 'typical
        weekday', 'weekend', 'holiday', 'summer Friday', 'exceptional
        event')"

    transform T_assess_clusters :
      intent: assess
      manner: "evaluate cluster quality and interpretability"
      input: V_calendar, V_profiles, P_patterns
      output: K_cluster_quality
      actor: human
      description: "Assess whether clusters provide meaningful
        decomposition: patterns are interpretable, clusters well-separated,
        standard vs. exceptional days identified"

    artifact K_cluster_quality : knowledge(D_cluster)
      representation form: "quality judgment"
      description: "Assessment of cluster quality: interpretability,
        separation, coverage of pattern types, and whether refinement with
        adjusted parameters is needed"

    if K_cluster_quality indicates satisfactory clustering:
      then:
        exit loop L_clustering
      else:
        transform T_adjust_clustering :
          intent: generate-knowledge
          manner: "adjust clustering parameters based on assessment"
          input: K_cluster_quality, V_calendar, V_profiles, S_clustering
          output: S_clustering_r
          actor: human
          description: "Adjust clustering parameters: modify number of
            clusters, select different distance measure, or change time
            interval focus"

        artifact S_clustering_r : specification
          representation form: "parameter settings"
          description: "Updated clustering parameters after analyst
            refinement"

        assign:
          S_clustering := S_clustering_r

end loop L_clusterng

# ============================================================================
# STEP 5: SYNTHESISE FINDINGS
# ============================================================================

transform T_synthesise :
  intent: generate-knowledge
  manner: "formulate statements about temporal patterns"
  input: P_patterns, V_calendar, V_profiles, K_cluster_quality
  output: K_findings
  actor: human
  description: "Synthesise findings: document discovered patterns, their
    temporal distribution, correlations with external events, and
    exceptional occurrences"

artifact K_findings : knowledge(P_patterns)
  representation form: "statements and explanations"
  description: "Understanding of temporal patterns: standard daily patterns
    identified, their distribution over week and year, correlation with
    calendar events, exceptional patterns and their causes"
