Supplementary · Task 2

COVID-19 Pandemic Behaviour

Designing a workflow for levels, trends, episodes, country grouping, and policy association on European COVID-19 time series, under four scaffold conditions.

1The shared design brief

Every variant for this task received the identical brief below; only the ATWL scaffold material in the context differed.

The design brief (click to expand)

A task on visual analytics workflow design. I want to analyse Google COVID-19 data for countries of Europe. These are daily time series of the counts of reported new cases and deaths. I want to extract episodes of different disease levels (e.g., from very low to very high; the intervals to be defined from data) and trends (rising, stable, decreasing). I want to disregard reporting-related fluctuations such as drops on weekends and peaks on following Mondays. Then I want to analyse the spatio-temporal distribution of the different pandemic behaviour patterns and relate it to the countries' anti-pandemic policies. The COVID data are in file eu.csv looking like below: id,Name,X,Y,CountryName,CapitalName,population, date=15-02-2020: New cases per 100 000 population,date=16-02-2020: New cases per 100 000 population,date=17-02-2020: New cases per 100 000 population,...,date=30-06-2021: New cases per 100 000 population, date=15-02-2020: Deaths per 100 000 population,date=16-02-2020: Deaths per 100 000 population,date=17-02-2020: Deaths per 100 000 population,...,date=30-06-2021: Deaths per 100 000 population AT,Austria,16.366667,48.2,Austria,Vienna,8858775,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.01,0.02,0.05,0.01,0.05,0.06,0.07,0.16,0.10,0.33,0.26,0.32,0.25,0.62,1.23,1.09,2.05,2.37,2.24,2.55,3.91,4.20,5.14,5.75,6.19,6.98,7.76,8.16,8.51,11.92,9.11,6.96,6.17,7.60,6.21,6.19,4.94,4.64,2.86,2.07,3.45,3.26,3.27,3.12,4.03,2.29,1.25,0.98,1.69,1.46,1.26,1.12,0.68,0.53,0.77,0.79,0.82,0.68,0.89,0.70,0.40,0.79,0.55,0.69,0.61,0.42,0.32,0.14,0.34,0.61,0.52,0.45,0.55,0.34,0.17,0.73,0.43,0.59,0.61,0.91,0.17,0.29,0.65,0.69,0.34,0.35,0.32,0.27,0.35,0.28,0.25,0.56,0.21,0.47,0.36,0.06,0.21,0.18,0.60,0.19,0.76,0.35,0.28,0.27,0.17,0.38,0.25,0.42,0.25,0.20,0.60,0.21,0.35,0.36,0.59,0.36,0.33,0.35,0.49,0.40,0.50,0.84,0.51,0.70,0.55,1.14,1.07,0.90,1.51,1.20,0.86,0.77,1.03,1.33,0.81,1.19,1.02,0.59,1.12,1.39,1.46,1.59,1.40,0.91,0.98,1.02,1.55,1.83,1.32,1.73,1.26,1.14,1.08,1.73,1.15,2.14,1.39,0.70,0.79,1.05,0.94,1.79,1.34,1.02,1.17,0.81,1.78,2.11,2.14,2.83,3.94,1.76,1.91,2.92,2.84,3.92,3.74,3.41,2.59,2.18,2.74,3.40,3.61,2.54,4.46,2.68,2.53,2.48,3.23,4.84,4.13,4.29,2.45,4.14,4.47,6.23,7.81,6.75,10.50,4.67,4.67,9.26,8.16,9.64,9.10,9.87,7.53,5.32,6.57,8.12,9.08,7.43,8.60,6.67,6.16,8.33,8.57,9.64,8.92,11.45,8.12,8.33,10.46,12.15,14.38,12.52,14.22,11.45,9.39,12.88,14.91,16.21,17.17,20.26,16.76,13.52,18.59,22.33,29.96,36.48,37.74,33.54,27.93,31.39,49.36,50.44,56.97,64.52,54.07,50.53,58.59,71.84,80.27,78.49,91.32,60.10,64.84,70.51,83.95,103.54,93.22,79.20,57.51,52.07,68.56,84.91,72.63,74.56,72.99,58.15,27.51,52.03,64.79,60.83,56.64,47.82,42.18,26.98,38.08,44.44,40.28,41.26,40.54,32.34,23.33,28.36,29.70,27.99,34.88,32.00,29.77,28.29,30.94,31.13,26.97,22.00,24.28,16.98,15.27,23.66,28.68,32.09,20.34,14.48,13.06,19.14,23.78,33.46,30.50,22.59,17.89,18.42,21.28,25.80,33.30,23.50,22.41,25.80,17.38,15.65,19.04,24.13,18.58,17.28,17.42,14.87,11.38,18.22,18.59,19.56,20.06,16.18,14.18,10.59,15.93,17.69,16.47,15.89,16.66,12.29,12.76,13.67,18.37,17.01,14.23,15.32,12.93,11.21,13.78,16.40,18.64,17.52,14.20,13.12,13.16,16.74,18.52,21.24,19.05,23.51,18.55,13.74,21.19,22.02,27.51,21.17,28.04,24.96,15.77,24.48,27.53,26.90,26.44,30.97,25.26,21.94,28.27,27.04,32.24,34.33,33.94,28.50,21.49,31.00,32.23,39.62,36.22,41.08,30.33,27.44,33.98,39.79,38.70,36.11,37.07,29.82,36.47,31.40,35.19,38.13,34.72,37.18,31.75,26.27,22.64,31.99,32.17,28.03,38.87,22.14,23.17,25.09,35.68,30.66,26.34,26.53,22.92,22.68,23.42,28.39,29.44,27.90,22.09,21.31,17.78,21.46,25.49,24.18,23.80,18.58,17.29,12.41,16.06,19.22,15.57,15.56,12.88,11.89,8.33,10.33,13.02,11.07,9.60,7.13,7.71,5.86,7.15,9.49,6.83,7.42,6.37,5.72,3.92,4.58,5.35,6.84,6.06,4.79,4.35,3.69,4.06,5.52,3.44,3.96,3.21,3.68,3.51,3.47,4.02,3.24,2.56,2.24,2.34,1.16,1.66,2.03,1.93,1.48,1.68,1.22,1.30,1.15,1.31,1.12,1.22,1.32,0.75,0.82,1.05,1.20,0.90,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.01,0.01,0.02,0.02,0.06,0.03,0.06,0.07,0.09,0.14,0.11,0.10,0.18,0.23,0.21,0.16,0.24,0.21,0.12,0.23,0.20,0.23,0.25,0.35,0.33,0.19,0.25,0.26,0.19,0.14,0.24,0.15,0.18,0.26,0.15,0.20,0.19,0.10,0.20,0.14,0.09,0.09,0.16,0.10,0.07,0.16,0.08,0.08,0.05,0.05,0.10,0.05,0.03,0.08,0.03,0.06,0.08,0.03,0.03,0.01,0.03,0.05,0.00,0.01,0.02,0.05,0.01,0.05,0.03,0.05,0.01,0.01,0.02,0.05,0.01,0.02,0.02,0.00,0.05,0.01,0.03,0.03,0.05,0.02,0.01,0.01,0.03,0.02,0.02,0.01,0.02,0.01,0.06,0.07,0.03,0.01,0.00,0.02,0.03,0.02,0.03,0.02,0.05,0.02,0.01,0.03,0.02,0.01,0.00,0.01,0.03,0.01,0.03,0.00,0.01,0.00,0.00,0.01,0.00,0.03,0.02,0.02,0.01,0.01,0.01,0.00,0.00,0.06,0.03,0.00,0.01,0.02,0.00,0.02,0.00,0.03,0.00,0.01,0.05,0.05,0.03,0.02,0.02,0.00,0.01,0.02,0.05,0.02,0.01,0.00,0.02,0.02,0.03,0.01,0.01,0.01,0.01,0.02,0.02,0.01,0.03,0.02,0.02,0.06,0.00,0.00,0.00,0.01,0.00,0.00,0.03,0.02,0.02,0.01,0.06,0.01,0.02,0.00,0.01,0.01,0.05,0.05,0.05,0.01,0.01,0.01,0.06,0.06,0.05,0.03,0.06,0.05,0.03,0.06,0.07,0.06,0.06,0.07,0.02,0.07,0.03,0.09,0.07,0.06,0.11,0.11,0.12,0.09,0.12,0.10,0.09,0.16,0.11,0.08,0.09,0.07,0.11,0.18,0.10,0.17,0.15,0.23,0.21,0.23,0.18,0.26,0.29,0.35,0.40,0.49,0.46,0.59,0.37,0.46,0.63,0.73,0.69,0.52,0.85,0.62,0.90,0.81,1.03,1.12,1.12,1.08,0.96,1.17,1.19,1.06,1.32,1.43,1.33,1.19,1.38,1.19,1.39,1.35,1.47,1.54,1.37,1.52,1.63,1.55,1.64,1.57,1.39,1.20,1.49,1.32,1.50,1.38,1.56,1.19,1.17,1.33,1.09,1.19,1.22,1.07,1.07,1.03,1.00,1.29,1.12,0.97,0.79,1.06,0.72,1.00,0.94,0.88,0.82,0.78,0.78,0.64,0.85,0.69,0.78,0.80,0.59,0.55,0.68,0.78,0.81,0.72,0.69,0.71,0.79,0.58,0.73,0.64,0.50,0.72,0.56,0.79,0.56,0.59,0.65,0.58,0.56,0.63,0.51,0.64,0.58,0.65,0.41,0.43,0.41,0.44,0.45,0.42,0.45,0.46,0.42,0.38,0.40,0.34,0.38,0.32,0.43,0.34,0.26,0.38,0.36,0.41,0.41,0.40,0.32,0.28,0.36,0.36,0.25,0.34,0.30,0.27,0.34,0.38,0.26,0.27,0.36,0.34,0.38,0.36,0.37,0.34,0.40,0.37,0.44,0.34,0.49,0.34,0.41,0.43,0.25,0.32,0.42,0.32,0.33,0.38,0.42,0.37,0.43,0.41,0.47,0.43,0.53,0.36,0.28,0.56,0.41,0.41,0.38,0.44,0.40,0.37,0.45,0.37,0.38,0.44,0.33,0.34,0.52,0.28,0.38,0.20,0.32,0.21,0.34,0.27,0.35,0.30,0.20,0.35,0.35,0.27,0.30,0.23,0.26,0.26,0.17,0.28,0.17,0.15,0.29,0.12,0.14,0.17,0.14,0.14,0.17,0.03,0.09,0.16,0.10,0.14,0.08,0.11,0.15,0.12,0.15,0.10,0.10,0.08,0.10,0.11,0.05,0.07,0.06,0.07,0.06,0.05,0.07,0.05,0.09,0.06,0.05,0.05,0.05,0.03,0.03,0.08,0.07,0.06,0.06,0.01,0.07,0.03,0.00,0.03,0.01,0.02,0.06,0.03 ...

The policy data are in file responses.csv looking like follows: "Austria","AdaptationOfWorkplace",2020-03-16,2020-04-13 "Austria","AdaptationOfWorkplace",2021-04-01,2022-03-05 "Austria","BanOnAllEvents",2020-11-03,2021-05-18 ...

Please design a workflow.

2Cross-variant comparison

After the four single-pass runs, the model was asked to compare them. Its full assessment, including the summary tables, is reproduced verbatim.

Comparison prompt

Critically assess and compare 4 variants that differ in starting conditions (no ATWL, ATWL lang description, ATWL library, both). I need a summary table contrasting obtained results

Model’s internal reasoning (think block)
The user wants me to critically assess and compare 4 variants of a visual analytics workflow design for COVID-19 pandemic behaviour analysis. The variants differ in their starting conditions:

1. **No ATWL** (fhgeniechat_1782297816938.json) - No ATWL language definition or library provided
2. **ATWL lang description** (fhgeniechat_1782297988891.json) - ATWL language definition attached as scaffold
3. **ATWL library** (fhgeniechat_1782298006850.json) - Library of ATWL workflow descriptors attached as scaffold
4. **Both** (fhgeniechat_1782298018992.json) - Both ATWL language definition and library attached


Now I'm examining the first variant without ATWL support, which produces a free-form markdown workflow with six analytical stages (Data Loading through Policy Correlation), complete with ASCII diagrams, data tables, mathematical formulas for smoothing and thresholds, and specific visualization recommendations like horizon charts.

Variant 2 takes a more formal approach by generating a complete ATWL specification with ten stages, proper artifact and transform notation, explicit iterative refinement loops, and clear distinctions between human, machine, and hybrid actors—though this comes at the cost of being more structured and less immediately practical.

Variant 3 condenses the workflow into seven phases with two iterative loops (one for level definition, another for country clustering), includes a workflow diagram and library references in the design rationale, and handles spatio-temporal clustering and policy analysis comprehensively, but risks over-engineering the country clustering loop and becomes quite lengthy in the process.

Variant 4 streamlines to six phases with a single iterative loop, introduces a well-defined behavior pattern catalogue and explicit policy integration phase, supports multiple coordinated visualizations, and presents clearer design decisions, though it sacrifices the country clustering phase and may sacrifice reproducibility in the pattern definition step.

Now I'm comparing these systematically across different dimensions, starting with formality and language compliance.

Critical Assessment and Comparison of Four ATWL Workflow Variants

Overview of Variants

Variant File Starting Conditions
V1 fhgeniechat_1782297816938.json No ATWL — no language definition, no library
V2 fhgeniechat_1782297988891.json ATWL language definition only
V3 fhgeniechat_1782298006850.json ATWL library only
V4 fhgeniechat_1782298018992.json Both — language definition + library

Critical Assessment per Variant

V1 — No ATWL

Strengths: - Highly practical and actionable: includes concrete mathematical formulas (moving average, relative rate of change), explicit threshold tables, and specific visualization types (horizon charts, DTW). - Clear "design principles" section demonstrating visual analytics literacy. - The most accessible to a non-specialist audience; no notation barrier.

Weaknesses: - No formal artifact/transform ontology—steps conflate data, operations, and outputs. - No explicit iterative refinement loops; "interactive" is mentioned but not structurally encoded. - Actor roles (human vs. machine) are implicit, not specified per step. - Lacks explicit typing of intermediary products (specification, pattern, knowledge).


V2 — ATWL Language Definition

Strengths: - Faithful use of ATWL vocabulary: artifact types (entities, features, specifications, patterns, knowledge, visualisations), transform intents, manner, actor, embedment. - Explicit iterative loop (L1) with formal condition/exit structure for episode quality refinement. - Clear separation of human/machine/hybrid roles. - Comprehensive design rationale with 5 explicit design decisions.

Weaknesses: - Only one loop (episode assessment); level threshold definition is iterative in concept but not structurally looped (Stages 2–3 are sequential; adjustments happen inside L1 which is positioned after episode extraction). - No explicit country clustering/grouping step—spatio-temporal pattern identification is deferred entirely to human perception (T14). - Library references are absent (expected, given no library was provided).


V3 — ATWL Library

Strengths: - Two well-structured iterative loops: L_level_definition (threshold refinement) and L_country_clustering (trajectory grouping). - Explicit library references in the Design Rationale table (e.g., "1.10 Episodes & Topics", "1.12 ST modelling", "1.3 MobilityGraphs"). - Most comprehensive spatio-temporal analysis: includes feature-based sequence encoding, edit-distance clustering, and coordinated views (choropleth + grouped timelines + cluster summaries). - Statistical policy association analysis (transition frequencies, average lags, effect sizes).

Weaknesses: - Verbose—longest output (~7 phases, 2 loops, many intermediate artifacts). - The country clustering loop could be over-engineered for an exploratory workflow. - ATWL notation is slightly less precise without the language definition (e.g., occasional departures in syntax formatting). - Policy analysis is rigorous but may introduce a false sense of statistical power from observational data.


V4 — Both (Language + Library)

Strengths: - Cleanest structural organisation (6 well-delineated phases); easiest to follow. - Introduces an explicit behaviour pattern catalogue (Phase 3: abstraction → naming of level×trend archetypes), which no other variant does as a standalone phase. - Richest visualization specification: animated choropleth, stacked timelines with policy overlay, and policy-aligned comparative display (centred at policy introduction dates). - Comprehensive "Key design decisions" section with clear justifications.

Weaknesses: - Only one iterative loop (episode refinement); no clustering/grouping loop. - No explicit country clustering—spatial patterns are identified solely through human interpretation of visualisations. - The pattern naming step (human actor) introduces subjectivity without reproducibility safeguards. - Does not include the mathematical/algorithmic detail found in V1 (no formulas for smoothing or trend computation).


Summary Comparison Table

Criterion V1 (No ATWL) V2 (Lang def.) V3 (Library) V4 (Both)
ATWL compliance ✗ None ✓✓ High ✓ Moderate ✓✓ High
Formal artifact typing ✓✓ Full ontology ✓✓ Full ontology ✓✓ Full ontology
Transform intents explicit ✓✓ ✓✓ ✓✓
Actor roles (H/M/Hybrid) Implicit ✓✓ Explicit ✓✓ Explicit ✓✓ Explicit
Iterative loops formalized ✗ Mentioned only ✓ 1 loop ✓✓ 2 loops ✓ 1 loop
Smoothing specification ✓✓ Formula given ✓ Described ✓ Described ✓ Described
Level threshold method ✓✓ Quantile + Jenks ✓✓ Hybrid, interactive ✓✓ Loop-refined ✓ Described
Trend extraction detail ✓✓ Formula + δ threshold ✓✓ Window + slope ✓ Described ✓ Described
Episode segmentation ✓✓ RLE + merge rules ✓ Time-partitioning ✓ With merge rules ✓ Time-partitioning
Behaviour pattern typology ✗ Implicit ✓ Abstraction step ✓ Implicit via labels ✓✓ Dedicated phase + catalogue
Country clustering/grouping ✓ Described (DTW, MDS) ✗ None ✓✓ Full loop + features ✗ None
Spatio-temporal visualization ✓✓ Multiple types named ✓ Map + timeline ✓✓ Coordinated views ✓✓ Animated map + timelines + comparison
Policy integration depth ✓✓ Lag analysis, aligned agg. ✓ Overlay + association ✓✓ Statistical associations ✓✓ Temporal alignment + policy-centred view
Library references N/A N/A ✓✓ Explicit (1.10, 1.12, 1.3) ✗ Implicit only
Practical actionability ✓✓ Highest ✓ Moderate ✓ Moderate ✓ Moderate
Conciseness ✓✓ Most concise ✓ Long ✗ Very long ✓ Well-balanced
Readability for non-specialists ✓✓ ✗ Requires ATWL knowledge ✗ Requires ATWL knowledge ✗ Requires ATWL knowledge
Structural rigour ✗ Ad-hoc ✓✓ ✓✓ ✓✓
Design rationale articulated ✓ 4 principles ✓✓ 5 decisions ✓✓ Table with library links ✓✓ Key decisions list

Key Comparative Observations

  1. Effect of language definition (V2, V4): Produces more precise and consistent ATWL notation — artifact embedment, value structures, and transform intents are properly used throughout.

  2. Effect of library (V3, V4): Introduces richer analytical patterns (clustering loops, sequence encoding, statistical associations) drawn from existing workflow templates. V3 leverages the library most explicitly; V4 absorbs library patterns more subtly.

  3. Trade-off between formality and practicality: V1 is the most directly implementable (a developer could code it immediately); V2–V4 are more suitable for workflow documentation, reproducibility, and formal reasoning about the analysis process.

  4. Coverage gap — country grouping: Only V1 (informally) and V3 (formally) include explicit computational clustering of countries by trajectory similarity. V2 and V4 rely on human perception alone for spatial pattern detection — a significant analytical gap for 30+ countries.

  5. Most balanced variant: V4 achieves the best balance between structural rigour, readability, and analytical completeness — though it would benefit from incorporating V3's explicit clustering loop and V1's mathematical specificity.

3The four variant transcripts

The complete single-pass output under each condition. Expand a panel to read it; the model’s internal reasoning is nested inside.

V1 · no ATWL Variant V1 — no scaffold
Model’s internal reasoning (think block)
The user wants me to design a visual analytics workflow for analyzing COVID-19 data in European countries. Let me break down what they want:

1. **Data**: Daily time series of new cases and deaths per 100,000 population for European countries
2. **Goals**:
   - Extract episodes of different disease levels (very low to very high, intervals defined from data)
   - Extract trends (rising, stable, decreasing)
   - Disregard reporting-related fluctuations (weekend drops, Monday peaks)
   - Analyse spatio-temporal distribution of pandemic behaviour patterns
   - Relate patterns to anti-pandemic policies

Let me design a comprehensive workflow covering data preprocessing, analysis, and visualization steps.


Now I'm mapping out the core pipeline: loading the EU and policy datasets, applying smoothing to eliminate day-of-week reporting noise, classifying disease intensity levels, detecting trend directions, extracting continuous episodes, analyzing how patterns vary across space and time, and finally connecting those patterns to policy interventions.

Visual Analytics Workflow for COVID-19 Pandemic Behaviour Patterns

Workflow Overview Diagram

┌─────────────────────────────────────────────────────────────────────────────┐
│                          VISUAL ANALYTICS WORKFLOW                           │
└─────────────────────────────────────────────────────────────────────────────┘

┌──────────┐    ┌──────────┐    ┌───────────┐    ┌───────────┐    ┌─────────┐
│  1. DATA │───▶│2. SMOOTH │───▶│ 3. CLASSI-│───▶│4. EPISODE │───▶│5. SPATIO│
│  LOADING │    │   ING    │    │ FICATION  │    │EXTRACTION │    │-TEMPORAL│
│ & PARSING│    │          │    │           │    │           │    │ ANALYSIS│
└──────────┘    └──────────┘    └───────────┘    └───────────┘    └────┬────┘
                                                                       │
                                                                       ▼
┌──────────────────────────────────────────────────────────────────────────────┐
│                       6. POLICY CORRELATION ANALYSIS                          │
└──────────────────────────────────────────────────────────────────────────────┘

Step 1: Data Loading & Parsing

Input: eu.csv, responses.csv

Tasks: - Parse the multi-row header of eu.csv to separate new cases and deaths time series (each country has two sequential blocks of daily values). - Extract date range (15-02-2020 to 30-06-2021 = 502 days). - Parse responses.csv into structured policy intervals per country.

Output: Two matrices (countries × days) for cases and deaths; a policy table (country, policy type, start, end).


Step 2: Smoothing — Remove Reporting Artefacts

Goal: Eliminate weekday-related fluctuations (weekend under-reporting, Monday catch-up peaks) while preserving genuine trends and level changes.

Method: 7-day centred moving average (symmetric window):

$$\tilde{v}(t) = \frac{1}{7}\sum_{i=-3}^{3} v(t+i)$$

Rationale: A 7-day window exactly covers one reporting cycle, cancelling day-of-week effects without over-smoothing genuine epidemiological dynamics.

Interactive check (visual): - Line chart overlaying raw vs. smoothed series for a selected country. - The analyst verifies that weekend dips disappear while wave shapes are preserved.


Step 3: Classification — Disease Levels and Trends

3a. Disease Level Classification

Goal: Assign each day of each country's smoothed series to a level category.

Method: Data-driven thresholds using the pooled distribution of all smoothed daily values across all countries and all days:

Level Label Threshold definition
1 Very Low [0, Q₂₀)
2 Low [Q₂₀, Q₄₀)
3 Moderate [Q₄₀, Q₆₀)
4 High [Q₆₀, Q₈₀)
5 Very High [Q₈₀, max]

Alternative: Use Jenks Natural Breaks on the pooled distribution to find class boundaries that maximise between-class variance — often more meaningful than fixed quantiles.

Interactive refinement: - Histogram of pooled values with draggable threshold lines. - Analyst can switch between quantile-based, Jenks, or domain-informed thresholds (e.g., WHO incidence levels).

3b. Trend Classification

Goal: Assign each day a trend label: Rising, Stable, or Decreasing.

Method: Compute the slope of a linear regression fitted over a sliding window (e.g., 14 days) on the smoothed series. Normalise slope relative to the current level to get a relative rate of change:

$$r(t) = \frac{\text{slope}(t)}{\tilde{v}(t) + \epsilon}$$

Trend Condition
Rising r(t) > +δ
Stable −δ ≤ r(t) ≤ +δ
Decreasing r(t) < −δ

where δ is a sensitivity threshold (e.g., 0.03 per day ≈ doubling/halving in ~3 weeks). This can also be set interactively.


Step 4: Episode Extraction

Goal: Segment each country's time series into contiguous episodes of homogeneous behaviour (same level + same trend).

Algorithm: 1. Assign each day the composite label (Level, Trend) — e.g., (High, Rising). 2. Run-length encode the label sequence to get raw episodes. 3. Merge short episodes (< minimum duration, e.g., 7 days) into their neighbours (adopt the label of the longer adjacent episode) to avoid fragmentation. 4. Optionally re-check: if a merged episode spans a genuine level change, split it.

Output per country: An ordered sequence of episodes, each described by:

Field Description
Country Country ID
Start date Episode start
End date Episode end
Duration Number of days
Level Very Low … Very High
Trend Rising / Stable / Decreasing
Mean value Average smoothed incidence

Interactive visual: - Colour-coded timeline strip per country (colour = level, hatching/icon = trend). - Analyst adjusts minimum episode duration and verifies plausibility.


Step 5: Spatio-Temporal Pattern Analysis

Visualisations:

5a. Temporal Overview — Horizon / Stripe Chart Matrix

  • Rows = countries (sortable by geography, start of first wave, etc.)
  • Columns = days
  • Colour encodes level; additional glyph/saturation encodes trend.
  • Enables spotting synchronous waves, leads/lags between neighbours.

5b. Animated Choropleth Map

  • Map of Europe coloured by current disease level at time t.
  • Animation slider or small multiples for selected time points.
  • Contour overlays showing wavefront propagation.

5c. Clustering of Episode Sequences

  • Represent each country's episode sequence as a feature vector (e.g., durations spent at each level × trend combination).
  • Apply hierarchical clustering or self-organising maps.
  • Project countries into 2D (PCA / MDS) to reveal groups with similar pandemic trajectories.
  • Colour clusters on the map to see geographic coherence.

5d. Temporal Alignment

  • Dynamic Time Warping (DTW) to measure similarity between country curves.
  • Identify which countries' waves lead/lag others.

Step 6: Policy Correlation Analysis

Goal: Relate extracted episodes and trend changes to the introduction/lifting of anti-pandemic policies.

6a. Policy Timeline Overlay

  • On the per-country time-series or stripe chart, overlay horizontal bars showing active policies (from responses.csv).
  • Colour-code policy types (workplace, events, schools, travel, etc.).

6b. Event-Aligned Aggregation

  • Align all countries at the date a specific policy was introduced (t = 0).
  • Plot the average trajectory (and spread) of incidence before/after the policy.
  • Separate by level at which the policy was introduced.

6c. Transition Analysis

  • From the episodes, extract transition events (e.g., trend changes from Rising → Stable → Decreasing).
  • Compute the lag between policy introduction and the first observed trend reversal.
  • Tabulate/visualise as a scatter plot: (policy start) vs. (trend change date), coloured by policy type.

6d. Comparative Matrix

Country Policy introduced Level at introduction Days to peak Days to trend reversal Subsequent level drop
Austria BanOnAllEvents 2020-11-03 Very High 12 18 2 levels

Summary: Workflow Stages and Tools

Stage Method Key Parameters (interactive) Output
1. Parse CSV parsing Matrices + policy table
2. Smooth 7-day moving average Window width Smoothed series
3a. Levels Quantile / Jenks breaks Number of classes, thresholds Daily level labels
3b. Trends Sliding-window regression Window width, δ threshold Daily trend labels
4. Episodes Run-length encoding + merge Min. episode duration Episode table
5. Patterns Clustering, maps, timelines Distance metric, #clusters Country groups, visualisations
6. Policies Overlay, alignment, lag analysis Policy types of interest Correlation findings

Key Design Principles Applied

  1. Analyst-in-the-loop: Thresholds (level boundaries, trend sensitivity, minimum episode length) are set from data but adjustable interactively — the analyst validates and refines.
  2. Overview first, details on demand: Stripe chart matrix → click country → full time series with policy overlay.
  3. Linked views: Selecting a cluster on the map highlights corresponding rows in the timeline and policy table.
  4. Reproducibility: All parameter choices are logged; the workflow can be re-run with modified settings.
V2 · language Variant V2 &mdash; ATWL language definition only
Model’s internal reasoning (think block)
The user wants me to design a visual analytics workflow using the ATWL (Artifact–Transform Workflow Language) for analyzing Google COVID-19 data for European countries. The workflow should:

1. Start with daily time series of new cases and deaths per 100,000 population for European countries
2. Smooth out reporting-related fluctuations (weekend drops, Monday peaks)
3. Extract episodes of different disease levels (very low to very high, defined from data)
4. Extract trends (rising, stable, decreasing)
5. Analyze spatio-temporal distribution of pandemic behavior patterns
6. Relate patterns to countries' anti-pandemic policies

Let me also consider the data structure:


I'm working with two main datasets: eu.csv containing country metadata and daily time series for cases and deaths per capita, and responses.csv with policy information including type, duration, and affected countries. The workflow will start by smoothing the raw daily measurements to eliminate reporting artifacts, then extract disease episodes characterized by their severity level and trend direction, before finally mapping these patterns against policy timelines to understand their relationship. Very high) and trend (rising, stable, decreasing) to characterize each episode, then abstract these into behavior patterns by combining level and trend categories. From there, I can do spatial-temporal analysis to see how these patterns play out across different countries and time periods, and finally bring in policy data to understand what relationships exist. Let me structure this as a full ATWL workflow, thinking through how to organize the data—whether countries are entities with time series as features, or if I should think of daily observations as the base units. I'm settling on Option A where countries are entities with time series as their internal structure, embedded in geographic space. Then I'll design the workflow starting with characterizing the raw time series, defining disease episodes as units, characterizing those episodes by level and trend, abstracting patterns, contextualizing them spatially and temporally, visualizing the results, and finally relating everything to policy data. I'm drafting the workflow template and identifying the input artifacts needed—countries with daily COVID metrics and policy information. uations from the data. Then I need to classify each time point by its level category, compute local trends using a sliding window on the smoothed series, and segment into episodes where both level and trend remain stable. Alternatively, I could smooth first, then segment based on significant changes in either level or trend, and characterize each resulting episode. I'm leaning toward the second approach: smooth the signal, define level thresholds from the overall data distribution, compute local trends at each time point, then identify episode boundaries where meaningful changes occur.

Now I'm mapping out the full workflow: smooth the data, define level categories and trends, segment into episodes with consistent properties, characterize each episode, extract behavioral patterns, contextualize findings, visualize results, and finally relate observations back to policy changes. I'm structuring this as a formal workflow specification that chains these operations together, starting with the raw country time series and flowing through each analytical step.

Writing workflow specification... Actually, I think the cleaner approach is to treat level classification as a characterization step that groups each day by its value and trend, then segment consecutive days with matching levels into episodes using time-partitioning. From there I can characterize the episodes themselves, abstract patterns across them, and finally relate those patterns back to the policy data to generate insights.

Now I'm working through how to formally define the entities—countries as the primary entities with time series as their internal structure, then episodes as derived entities that inherit both temporal and spatial embedment from their parent country. structure: elementary, and embedment: {set, time} where the set dimension groups by country and time captures the validity period of each policy.

Now I'm laying out the complete workflow. The core question driving this is understanding how pandemic behavior patterns—combinations of activity levels and trends—are distributed across European countries over time, and what relationship they have with the policy interventions in place.

The analytical pipeline starts with smoothing the raw time series, then segments them into episodes where behavior remains consistent, assigns each episode a level and trend category, identifies the distinct behavior patterns that emerge, and finally maps how these patterns distribute spatially and temporally across the countries.

For the level thresholds, I need a data-driven approach rather than arbitrary cutoffs—either quantiles across all observations or natural breaks detection. The trend can be captured through local regression slopes or by comparing consecutive smoothed values. Now I'm drafting the full ATWL workflow, organizing it into stages: exogenous artifacts, smoothing, level and trend classification, episode segmentation, pattern abstraction, spatio-temporal analysis, and finally relating everything back to the policy data.

Writing the workflow specification... Defining the data schema... So the question is whether treating the country as a sequence of daily observations makes more sense than treating it as an elementary entity with time series features. Since we're planning to decompose the time series into episodes anyway, modeling the country's internal structure as a sequence of ordered components seems more appropriate—that way we can actually work with and partition those internals rather than keeping them locked away as atomic features.

Now I'm defining the artifact with the country entities as sequences, where each entity has vector-valued features for the daily cases and deaths across the time period.

Defining the artifact structure... Defining the policy dataset schema with temporal fields for when measures start and end, then moving into the transforms section where I'm setting up a smoothing operation that applies a 7-day moving average to the time series data to filter out weekly reporting noise.

Specifying the smoothing parameters and the resulting smoothed feature artifact that represents the cleaned daily time series per country, then beginning to work through how to determine appropriate threshold levels by analyzing the distribution of these smoothed values to establish meaningful categories. Defining the threshold categories...

I'm realizing the combined vector structure with two categorical types feels clunky, so I should split this into separate features instead for clarity. Defining the feature artifacts for disease levels and trends, then moving into segmentation logic that partitions each country's time series into episodes where the level and trend categories remain constant. The basic episode characterization from the previous step already covers the essentials, but I want to add deeper statistical summaries like mean incidence, peak values, and cumulative measures. I'm defining a transform that computes these aggregate statistics for each episode, producing a feature set with numeric summary values across the dataset.

Now I'm identifying distinct pandemic behavior patterns by grouping episodes based on their disease level and trend direction combinations—things like "high and rising" or "low and stable"—to create a typology that captures up to 15 different pattern types across the spatial and temporal dimensions. Defining temporal arrangement transforms...

I'm also considering whether time needs its own context entity, since episodes already have temporal embedment built in. The contextualisation is really about creating specific visual arrangements rather than adding new information. Let me step back and think about how to structure the spatial and temporal views more cleanly as visualization transforms rather than separate artifacts.

The key visualizations I need are a map showing the current pattern state, a timeline displaying the sequence of episodes for each country, and a combined space-time view that brings both dimensions together.

I'm creating a timeline visualization with each country as a row, color-coded by behavior pattern type, so you can see how patterns evolve over time for each nation. Then I'm building an animated map or small-multiples view showing the geographic distribution of these patterns across Europe at different time points. Next I need to overlay policy information to contextualize these behavioral patterns.

I'm reconsidering how to model the policy relationship—whether it's better as a characterization that identifies which policies are active during each episode, or as a visualization showing both episodes and policies together temporally. Continuing with the combined visualization that overlays behaviour patterns and active policies across countries in aligned timelines, where each country gets its own row with time flowing horizontally, behaviour episodes shown as coloured segments on top and policy measures as annotated bars below. Then I'm moving into the analysis phase where I'll examine these visualizations alongside the extracted patterns and policy features to formulate key findings about the relationship between pandemic policies and behaviour changes.

The findings should capture three main things: how behaviour patterns distributed across space and time, which policies seemed to precede shifts in behaviour, and where countries diverged in their pandemic trajectories. I'm also considering whether the threshold definition step should be iterative—defining thresholds, examining the resulting episodes, checking if they're sensible, then refining as needed.

I should also clarify whether the smoothed time series should be its own artifact or just a feature of the existing country entities. Since it's a transformed version of the same data, treating it as a characterization makes sense. And I need to be explicit about trend parameters—window size, stability thresholds, what counts as rising versus decreasing. Let me build out the complete workflow with these pieces.

Defining trend specification parameters... I should keep the perception step as a separate transform to capture how analysts identify spatio-temporal patterns like waves or clusters from the visualizations. Now I'm working through the complete workflow template, organizing all the transforms from characterization through generation into a coherent sequence.

Visual Analytics Workflow: COVID-19 Pandemic Behaviour Analysis in Europe

Below is the complete ATWL workflow specification.


workflow covid_europe_behaviour_analysis
template: characterise (smooth) → generate-knowledge (define level/trend thresholds) →
          characterise (classify) → define-unit (segment into episodes) →
          abstract (behaviour patterns) → contextualise (space & time) →
          visualise → abstract (spatio-temporal patterns) →
          visualise (combined with policies) → generate-knowledge (relate to policies)
description: "Analyse COVID-19 daily time series for European countries: smooth out
  reporting artifacts, extract episodes of consistent disease levels and trends,
  identify pandemic behaviour patterns, analyse their spatio-temporal distribution,
  and relate observed patterns to countries' anti-pandemic policies."

# ============================================================
# EXOGENOUS ARTIFACTS
# ============================================================

artifact D_countries : entities
  origin: given
  internal structure: sequence
  embedment: space
  features:
    - id: daily_cases
      value structure: vector
      value type: numeric
      description: "Daily new cases per 100,000 population (one value per day)"
    - id: daily_deaths
      value structure: vector
      value type: numeric
      description: "Daily deaths per 100,000 population (one value per day)"
    - id: country_name
      value structure: atomic
      value type: categorical
      description: "Country name"
    - id: capital_name
      value structure: atomic
      value type: categorical
      description: "Capital city name"
    - id: population
      value structure: atomic
      value type: numeric
      description: "Country population"
    - id: coordinates
      value structure: atomic
      value type: spatial
      description: "Capital coordinates (X, Y)"
  description: "European countries with daily COVID-19 time series
    (15 Feb 2020 – 30 Jun 2021); each entity is one country represented
    as a sequence of ~502 daily observations."

artifact D_policies : entities
  origin: given
  internal structure: elementary
  embedment: {set, time}
  features:
    - id: country
      value structure: atomic
      value type: categorical
      description: "Country to which the policy applies"
    - id: policy_type
      value structure: atomic
      value type: categorical
      description: "Type of anti-pandemic measure (e.g., BanOnAllEvents,
        AdaptationOfWorkplace, SchoolClosure, etc.)"
    - id: start_date
      value structure: atomic
      value type: temporal
      description: "Date the policy measure came into effect"
    - id: end_date
      value structure: atomic
      value type: temporal
      description: "Date the policy measure was lifted"
  description: "Anti-pandemic policy measures applied in European countries,
    each defined by country, policy type, and validity period."

artifact D_map : entities
  origin: given
  internal structure: elementary
  embedment: space
  features:
    - id: geometry
      value structure: atomic
      value type: spatial
      description: "Country boundary polygon"
  description: "Geographic boundaries of European countries for map display."

artifact S_smoothing : specification
  origin: given
  representation form: "parameter settings"
  description: "7-day centred moving average to remove weekly reporting
    cycle artifacts (weekend drops, Monday peaks)."

artifact S_trend : specification
  origin: given
  representation form: "parameter settings"
  description: "Parameters for local trend computation: window size for
    slope estimation (e.g., 7–14 days) and slope threshold for classifying
    trend as rising (positive above threshold), stable (within threshold),
    or decreasing (negative below threshold)."

# ============================================================
# STAGE 1: SMOOTH TIME SERIES
# ============================================================

transform T1_smooth :
  intent: characterise
  manner: "smooth (moving average)"
  input: D_countries, S_smoothing
  output: F_smoothed
  actor: machine
  description: "Apply 7-day centred moving average to daily cases and
    deaths time series to eliminate reporting-related weekly fluctuations."

artifact F_smoothed : feature(D_countries)
  value structure: vector
  value type: numeric
  representation form: "smoothed daily time series per country (cases and deaths)"
  description: "Smoothed daily incidence and mortality rates per 100,000
    population for each country, free of weekly reporting artifacts."

# ============================================================
# STAGE 2: DEFINE DISEASE LEVEL THRESHOLDS FROM DATA
# ============================================================

transform T2_distribution :
  intent: characterise
  manner: "compute-statistics"
  input: F_smoothed
  output: F_distribution
  actor: machine
  description: "Compute the overall distribution of smoothed daily
    incidence values across all countries and dates (quantiles,
    histogram, density) to support data-driven threshold definition."

artifact F_distribution : feature(D_countries)
  value structure: vector
  value type: numeric
  representation form: "distribution statistics and quantiles"
  description: "Summary statistics and quantiles of the pooled distribution
    of smoothed incidence values across all countries and time points."

transform T3_vis_distribution :
  intent: visualise
  input: F_distribution, F_smoothed
  output: V_distribution
  actor: machine
  description: "Visualise the distribution of smoothed incidence values
    (e.g., histogram, ECDF) to support interactive threshold selection."

artifact V_distribution : visualisation(F_distribution)
  layout: "single panel"
  form: "histogram and/or ECDF"
  encoding: "x-axis: incidence value; y-axis: frequency or cumulative
    probability; candidate thresholds shown as vertical lines"
  description: "Distribution of all smoothed incidence values with
    candidate level boundaries."

transform T4_define_thresholds :
  intent: generate-knowledge
  manner: "formulate-specification"
  input: F_distribution, V_distribution
  output: S_levels
  actor: hybrid
  description: "Define disease level categories by setting threshold values
    derived from data (e.g., quantile-based breaks or natural breaks /
    Jenks classification), producing five ordinal levels: very low, low,
    medium, high, very high."

artifact S_levels : specification
  representation form: "parameter settings"
  description: "Threshold values defining five disease level categories:
    boundaries between very low, low, medium, high, and very high
    incidence, derived from the pooled data distribution."

# ============================================================
# STAGE 3: CLASSIFY DAILY VALUES BY LEVEL AND TREND
# ============================================================

transform T5_classify :
  intent: characterise
  manner: "classify"
  input: F_smoothed, S_levels, S_trend
  output: F_levels, F_trends
  actor: machine
  description: "For each country and day: (1) classify the smoothed
    incidence into one of five disease level categories using defined
    thresholds; (2) compute local trend from slope of smoothed values
    and classify as rising, stable, or decreasing."

artifact F_levels : feature(D_countries)
  value structure: vector
  value type: ordinal
  representation form: "daily time series of level categories per country"
  description: "Disease level category for each country and day:
    very low, low, medium, high, or very high."

artifact F_trends : feature(D_countries)
  value structure: vector
  value type: ordinal
  representation form: "daily time series of trend categories per country"
  description: "Trend direction for each country and day:
    rising, stable, or decreasing."

# ============================================================
# STAGE 4: SEGMENT INTO EPISODES
# ============================================================

transform T6_segment :
  intent: define-unit
  manner: "time-partitioning"
  input: D_countries, F_levels, F_trends, F_smoothed
  output: D_episodes
  actor: machine
  description: "Segment each country's time series into maximal contiguous
    episodes where the disease level category and trend direction remain
    constant. Each episode inherits the level, trend, and summary
    statistics from its constituent days."

artifact D_episodes : entities
  internal structure: episode
  embedment: {space, time}
  features:
    - id: country_ref
      value structure: atomic
      value type: reference
      description: "Reference to the country this episode belongs to"
    - id: level
      value structure: atomic
      value type: ordinal
      description: "Disease level category (very low / low / medium / high / very high)"
    - id: trend
      value structure: atomic
      value type: ordinal
      description: "Trend direction (rising / stable / decreasing)"
    - id: duration_days
      value structure: atomic
      value type: numeric
      description: "Episode duration in days"
    - id: start_date
      value structure: atomic
      value type: temporal
      description: "Episode start date"
    - id: end_date
      value structure: atomic
      value type: temporal
      description: "Episode end date"
    - id: mean_incidence
      value structure: atomic
      value type: numeric
      description: "Mean smoothed incidence during the episode"
    - id: peak_incidence
      value structure: atomic
      value type: numeric
      description: "Maximum smoothed incidence during the episode"
  description: "Episodes of consistent pandemic behaviour: maximal contiguous
    time intervals within each country where both disease level category
    and trend direction are constant."

# ============================================================
# STAGE 5: ABSTRACT BEHAVIOUR PATTERNS
# ============================================================

transform T7_abstract_patterns :
  intent: abstract
  manner: "find-salient-groups"
  input: D_episodes
  output: P_behaviour_patterns, F_pattern_labels
  actor: hybrid
  description: "Identify the repertoire of pandemic behaviour patterns as
    the set of actually occurring level×trend combinations; assign
    meaningful labels (e.g., 'high-rising', 'low-stable',
    'very high-decreasing'); note frequency and typical duration of each."

artifact P_behaviour_patterns : pattern(D_episodes)
  representation form: "typology with labelled categories"
  description: "Catalogue of pandemic behaviour pattern types defined by
    combinations of disease level and trend direction (up to 15 possible;
    subset that actually occurs), with descriptive labels and frequency
    information."

artifact F_pattern_labels : feature(D_episodes)
  value structure: atomic
  value type: categorical
  description: "Behaviour pattern type label assigned to each episode
    (e.g., 'high-rising', 'medium-stable')."

# ============================================================
# STAGE 6: ASSESS EPISODE QUALITY (ITERATIVE REFINEMENT)
# ============================================================

loop L1:
  purpose: "Iteratively refine level thresholds and trend parameters until
    episodes are meaningful and interpretable (not too short, not too
    fragmented, adequately capturing distinct pandemic phases)"
  until: "Episodes are interpretable: typical duration is at least several
    days; pattern distribution is informative; analyst is satisfied with
    the segmentation."
  body:

    transform T8_vis_episodes_check :
      intent: visualise
      input: D_episodes, F_pattern_labels
      output: V_episodes_check
      actor: machine
      description: "Visualise episode sequences for selected countries
        as colour-coded timelines to assess segmentation quality."

    artifact V_episodes_check : visualisation(D_episodes, F_pattern_labels)
      layout: "aligned timelines (one row per country)"
      form: "coloured segments"
      encoding: "horizontal: time; vertical: countries; colour: pattern type;
        segment width: episode duration"
      description: "Timeline view for checking episode segmentation quality."

    transform T9_assess :
      intent: assess
      input: V_episodes_check, D_episodes, F_pattern_labels
      output: K_assessment
      actor: human
      description: "Judge whether episodes are meaningful: not overly
        fragmented, capture visually distinct phases, and the level/trend
        classification is plausible."

    artifact K_assessment : knowledge(D_episodes)
      representation form: "quality judgment"
      description: "Assessment of episode segmentation quality: fragmentation
        level, interpretability of patterns, need for threshold adjustment."

    if K_assessment indicates refinement needed:
      then:
        transform T10_refine :
          intent: generate-knowledge
          manner: "formulate-specification"
          input: K_assessment, S_levels, S_trend
          output: S_levels_new, S_trend_new
          actor: human
          description: "Adjust level thresholds and/or trend parameters
            (e.g., widen stable-trend band, merge adjacent levels) to
            produce better episodes."

        artifact S_levels_new : specification
          representation form: "parameter settings"
          description: "Revised level thresholds."

        artifact S_trend_new : specification
          representation form: "parameter settings"
          description: "Revised trend parameters."

        assign:
          S_levels := S_levels_new
          S_trend := S_trend_new

        # Re-execute T5 (classify) and T6 (segment) with new specs
        # (implicit re-computation of F_levels, F_trends, D_episodes,
        #  F_pattern_labels)

      else:
        exit loop L1

end loop L1

# ============================================================
# STAGE 7: SPATIO-TEMPORAL CONTEXTUALISATION AND VISUALISATION
# ============================================================

transform T11_contextualise_space :
  intent: contextualise
  manner: "map-based"
  input: D_episodes, D_map
  output: A_spatial
  actor: machine
  description: "Arrange episodes geographically using their country's
    position on the map of Europe."

artifact A_spatial : arrangement(D_episodes)
  context: D_map
  principle: "geographic position (country boundary / centroid)"
  description: "Episodes positioned on the European map through their
    country's geographic location."

transform T12_vis_timeline :
  intent: visualise
  input: D_episodes, F_pattern_labels, P_behaviour_patterns
  output: V_timeline
  actor: machine
  description: "Create a comprehensive timeline visualisation showing
    episode sequences for all countries, sorted by geographic proximity,
    with colour encoding behaviour pattern type."

artifact V_timeline : visualisation(D_episodes, F_pattern_labels)
  layout: "aligned timelines (one row per country, countries sorted
    by latitude or geographic cluster)"
  form: "coloured horizontal segments"
  encoding: "horizontal position: time (start_date to end_date);
    vertical position: country; segment colour: behaviour pattern type
    (hue = level, saturation/brightness = trend)"
  description: "Temporal overview of pandemic behaviour across all
    European countries, enabling detection of synchronous waves and
    cross-country propagation."

transform T13_vis_map :
  intent: visualise
  input: D_episodes, A_spatial, F_pattern_labels, P_behaviour_patterns
  output: V_map
  actor: machine
  description: "Create an animated choropleth or small-multiples map
    showing the spatial distribution of behaviour patterns over time."

artifact V_map : visualisation(A_spatial, F_pattern_labels)
  layout: "geographic map of Europe"
  form: "animated choropleth (or small-multiples snapshots)"
  encoding: "country fill colour: behaviour pattern type at current time;
    animation slider or facets: time progression"
  description: "Map view revealing spatial clustering and propagation of
    pandemic behaviour patterns across Europe over time."

# ============================================================
# STAGE 8: PERCEIVE SPATIO-TEMPORAL PATTERNS
# ============================================================

transform T14_perceive_st_patterns :
  intent: abstract
  manner: "perception-and-interpretation"
  input: V_timeline, V_map
  output: P_spatiotemporal
  actor: human
  description: "Identify spatio-temporal regularities: synchronous waves
    across countries, geographic clusters of similar behaviour, temporal
    propagation patterns (e.g., west-to-east spread), and outlier
    countries with distinct trajectories."

artifact P_spatiotemporal : pattern(V_timeline, V_map)
  representation form: "textual descriptions of spatio-temporal regularities"
  description: "Spatio-temporal patterns such as: pandemic waves
    (synchronous level escalations), geographic clustering of behaviour
    types, propagation directions, and countries with atypical
    trajectories."

# ============================================================
# STAGE 9: RELATE TO ANTI-PANDEMIC POLICIES
# ============================================================

transform T15_characterise_policy_context :
  intent: characterise
  manner: "temporal-overlay"
  input: D_episodes, D_policies
  output: F_active_policies
  actor: machine
  description: "For each episode, determine which anti-pandemic policies
    were active (temporally overlapping) in the same country during
    that episode."

artifact F_active_policies : feature(D_episodes)
  value structure: list
  value type: categorical
  representation form: "list of active policy types per episode"
  description: "Set of anti-pandemic measures active during each episode,
    enabling analysis of policy–behaviour associations."

transform T16_vis_combined :
  intent: visualise
  input: D_episodes, D_policies, F_pattern_labels, F_active_policies
  output: V_combined
  actor: machine
  description: "Create a combined visualisation juxtaposing behaviour
    pattern timelines with policy measure timelines for each country."

artifact V_combined : visualisation(D_episodes, D_policies, F_pattern_labels)
  layout: "aligned dual-track timelines (one pair of tracks per country)"
  form: "coloured segments with policy annotation bars"
  encoding: "upper track: behaviour pattern episodes (colour = pattern type);
    lower track: policy measures (distinct marks/colours per policy type);
    horizontal axis: time; vertical grouping: countries"
  description: "Combined view enabling visual comparison of pandemic
    behaviour episodes and policy measures for each country over time."

transform T17_vis_policy_effect :
  intent: visualise
  input: D_episodes, D_policies, F_pattern_labels, F_active_policies
  output: V_policy_analysis
  actor: machine
  description: "Create visualisations supporting policy–effect analysis:
    e.g., distributions of behaviour patterns under different policy
    combinations, transition analysis showing which pattern follows which
    after policy introduction/removal."

artifact V_policy_analysis : visualisation(D_episodes, F_active_policies,
    F_pattern_labels)
  layout: "small multiples or matrix layout"
  form: "bar charts, transition diagrams, or heatmaps"
  encoding: "policy combination × behaviour pattern frequency; or
    before/after policy change → pattern transition probabilities"
  description: "Analytical views supporting inference about relationships
    between policy measures and pandemic behaviour patterns."

# ============================================================
# STAGE 10: GENERATE KNOWLEDGE
# ============================================================

transform T18_analyse_policy_relations :
  intent: abstract
  manner: "perception-and-interpretation"
  input: V_combined, V_policy_analysis, P_spatiotemporal
  output: P_policy_behaviour
  actor: human
  description: "Identify regularities in the relationship between policy
    measures and behaviour pattern transitions: which policies precede
    shifts toward lower levels or decreasing trends; which policy
    combinations co-occur with which patterns; differences across
    countries."

artifact P_policy_behaviour : pattern(V_combined, V_policy_analysis,
    D_policies, D_episodes)
  representation form: "association rules and observed regularities"
  description: "Patterns linking anti-pandemic policies to pandemic
    behaviour: e.g., 'introduction of BanOnAllEvents is typically
    followed within 2–3 weeks by a transition to decreasing trend';
    'countries with early school closure experienced lower peak levels'."

transform T19_generate_knowledge :
  intent: generate-knowledge
  manner: "formulate-statements"
  input: P_spatiotemporal, P_policy_behaviour, V_combined,
         V_policy_analysis, V_timeline, V_map
  output: K_findings
  actor: human
  description: "Synthesise findings about (1) the spatio-temporal dynamics
    of COVID-19 in Europe, (2) the effectiveness and timing of different
    policy measures, and (3) cross-country similarities and differences."

artifact K_findings : knowledge(P_spatiotemporal, P_policy_behaviour,
    D_episodes, D_policies)
  representation form: "statements, hypotheses, and summary"
  description: "Consolidated findings: (1) characterisation of pandemic
    waves across Europe (timing, severity, geographic spread);
    (2) observed associations between policy measures and subsequent
    behaviour pattern transitions; (3) country clusters with similar
    pandemic trajectories and policy strategies; (4) hypotheses about
    policy effectiveness requiring further validation."

Workflow Summary Diagram

Stage Intent Key Input Key Output Actor
1 characterise (smooth) D_countries, S_smoothing F_smoothed machine
2 characterise + generate-knowledge F_smoothed S_levels (thresholds) hybrid
3 characterise (classify) F_smoothed, S_levels, S_trend F_levels, F_trends machine
4 define-unit (segment) D_countries, F_levels, F_trends D_episodes machine
5 abstract D_episodes P_behaviour_patterns hybrid
6 loop: assess + refine V_episodes_check, S_levels refined S_levels, S_trend human
7 contextualise + visualise D_episodes, D_map V_timeline, V_map machine
8 abstract (perceive) V_timeline, V_map P_spatiotemporal human
9 characterise + visualise D_episodes, D_policies V_combined, V_policy_analysis machine
10 abstract + generate-knowledge all visualisations, patterns K_findings human

Design Rationale

  1. Smoothing before segmentation ensures that reporting artifacts (weekend drops, Monday peaks) do not create spurious short episodes at level/trend boundaries.

  2. Data-driven thresholds (Stage 2) use the pooled distribution of smoothed values across all countries to define level boundaries, ensuring comparability across the continent.

  3. The iterative loop (Stage 6) allows the analyst to refine parameters until the segmentation produces meaningful, interpretable episodes — not too short (over-fragmented) nor too long (missing transitions).

  4. Dual abstraction steps: first extracting behaviour pattern types from episodes (computational), then perceiving higher-order spatio-temporal regularities from visualisations (human) — captures both levels of pattern recognition.

  5. Policy overlay is handled by temporal alignment (characterise) followed by combined visualisation, rather than by statistical modelling, reflecting the exploratory visual analytics approach and the difficulty of establishing causal claims from observational data.

V3 · library Variant V3 &mdash; ATWL library only
Model’s internal reasoning (think block)
The user wants me to design a visual analytics workflow for analyzing COVID-19 pandemic data for European countries. Let me break down the task:

1. **Input data**: 
   - `eu.csv`: Daily time series of new cases and deaths per 100,000 population for European countries (from 15-02-2020 to 30-06-2021)
   - `responses.csv`: Anti-pandemic policy data with country, policy type, start date, and end date

2. **Goals**:
   - Smooth out reporting-related fluctuations (weekend drops, Monday peaks)
   - Extract episodes of different disease levels (very low to very high, intervals defined from data)
   - Identify trends like rising, stable, or decreasing patterns
   - Understand how pandemic behaviors vary across space and time
   - Connect these patterns back to the specific policies each country implemented

I'm looking at relevant workflow patterns from the library—particularly the progressive abstraction approach for temporal data with symbolic encoding and topic modeling, plus the spatio-temporal analysis methods for clustering and modeling spatial time series.

My workflow starts with data preparation by loading COVID and policy datasets, then smoothing the time series with a moving average to eliminate reporting noise. Next I'll classify each period into disease severity levels based on data distribution quantiles, then extract trend directions over rolling windows to capture whether cases are rising, holding steady, or declining.

I'll combine these level and trend classifications into distinct episodes where conditions remain relatively stable, with each episode tagged by country, timespan, severity level, and direction. Then I can visualize these episodes spatially and temporally to spot which countries followed similar pandemic trajectories and when waves synchronized across regions. Finally, I'll layer the policy data on top to see how interventions correlate with shifts in disease levels and trends, revealing which policies appear most effective.

Now I'm formatting this as an ATWL document.

Visual Analytics Workflow: COVID-19 Pandemic Behaviour and Policy Analysis

Concise Workflow Summary

This workflow analyses COVID-19 daily time series (cases and deaths per 100,000) across European countries to extract meaningful pandemic behaviour episodes and relate them to anti-pandemic policies. The workflow proceeds through six main phases:

  1. Data preparation and smoothing: Raw daily time series are smoothed (7-day moving average) to eliminate reporting-related fluctuations (weekend drops, Monday peaks). The analyst visually assesses smoothing adequacy.

  2. Level classification: Data-driven value breaks (e.g., via quantile or natural breaks methods) partition the continuous incidence values into discrete disease levels (very low, low, moderate, high, very high). The analyst iteratively refines break definitions until they produce interpretable, domain-meaningful level categories.

  3. Trend extraction: Local trends (rising, stable, decreasing) are computed over sliding windows on the smoothed series. Combined with levels, each time point receives a composite state label (level × trend).

  4. Episode segmentation: Consecutive time points sharing the same composite state are merged into episodes. Short transitional episodes may be merged with neighbours. The result is a compact sequence of typed episodes per country.

  5. Spatio-temporal pattern analysis: Episodes are visualised in temporal (timeline) and spatial (map) contexts. Countries are clustered by similarity of their episode sequences, revealing synchronous waves, regional groupings, and outlier trajectories.

  6. Policy relation analysis: Policy interventions are overlaid on episode timelines. Temporal associations between policy onsets/offsets and level/trend transitions are explored, leading to insights about policy effectiveness patterns.


ATWL Representation

workflow covid-pandemic-behaviour-policy-analysis

template: define-unit (prepare) → characterise (smooth) → visualise → assess →
         loop(characterise (classify levels) → visualise → assess) →
         characterise (trends) → define-unit (segment episodes) →
         visualise → assess →
         loop(define-unit (cluster countries) → contextualise → visualise → assess) →
         contextualise (policy overlay) → visualise → abstract →
         generate-knowledge

description: "Analyse COVID-19 daily time series for European countries:
  smooth reporting artifacts, extract disease level episodes and trends,
  analyse spatio-temporal distribution of pandemic behaviour patterns,
  and relate them to anti-pandemic policies"

# ============================================================================
# INPUT ARTIFACTS
# ============================================================================

artifact D_covid_raw : entities
  origin: given
  internal structure: elementary
  embedment: {set, time, space}
  features:
    - id: f_country_id
      value structure: atomic
      value type: categorical
      description: "Country identifier (ISO code)"
    - id: f_coordinates
      value structure: vector
      value type: spatial
      description: "Capital coordinates (X, Y)"
    - id: f_population
      value structure: atomic
      value type: numeric
      description: "Country population"
    - id: f_new_cases
      value structure: vector
      value type: numeric
      description: "Daily new cases per 100,000 population"
    - id: f_deaths
      value structure: vector
      value type: numeric
      description: "Daily deaths per 100,000 population"
  description: "COVID-19 daily time series for European countries from
    eu.csv, covering 15-02-2020 to 30-06-2021, with geographic
    coordinates and population"

artifact D_policies : entities
  origin: given
  internal structure: elementary
  embedment: {set, time}
  features:
    - id: f_country
      value structure: atomic
      value type: categorical
      description: "Country name"
    - id: f_policy_type
      value structure: atomic
      value type: categorical
      description: "Type of anti-pandemic policy"
    - id: f_start_date
      value structure: atomic
      value type: temporal
      description: "Policy start date"
    - id: f_end_date
      value structure: atomic
      value type: temporal
      description: "Policy end date"
  description: "Anti-pandemic policy interventions from responses.csv:
    country, policy type, and active period"

# ============================================================================
# PHASE 1: DATA PREPARATION AND SMOOTHING
# ============================================================================

transform T_parse_timeseries :
  intent: define-unit
  manner: "parse CSV columns into structured time series per country"
  input: D_covid_raw
  output: D_countries
  actor: machine
  description: "Parse raw data into country-level entities each
    containing two time series (cases and deaths) with proper
    temporal indexing"

artifact D_countries : entities
  internal structure: elementary
  embedment: {set, time, space}
  features:
    - id: f_cases_ts
      value structure: vector
      value type: numeric
      description: "Daily new cases per 100,000 time series"
    - id: f_deaths_ts
      value structure: vector
      value type: numeric
      description: "Daily deaths per 100,000 time series"
    - id: f_geo
      value structure: vector
      value type: spatial
      description: "Country geographic coordinates"
  description: "European countries with parsed daily COVID-19 time
    series and geographic positions"

artifact S_smoothing : specification
  origin: given
  representation form: "parameter settings"
  description: "Smoothing parameters: window size (default 7 days for
    weekly cycle removal), method (moving average or LOESS)"

transform T_smooth :
  intent: characterise
  manner: "apply moving average or local regression to remove
    reporting-cycle fluctuations"
  input: D_countries, S_smoothing
  output: F_smoothed_cases, F_smoothed_deaths
  actor: machine
  description: "Smooth daily time series to eliminate weekend drops
    and Monday peaks while preserving genuine epidemic dynamics"

artifact F_smoothed_cases : feature(D_countries)
  value structure: vector
  value type: numeric
  description: "Smoothed daily new cases per 100,000, free of
    reporting-cycle artifacts"

artifact F_smoothed_deaths : feature(D_countries)
  value structure: vector
  value type: numeric
  description: "Smoothed daily deaths per 100,000, free of
    reporting-cycle artifacts"

transform T_vis_smoothing :
  intent: visualise
  manner: "overlay raw and smoothed time series"
  input: D_countries, F_smoothed_cases, F_smoothed_deaths
  output: V_smoothing
  actor: machine
  description: "Display raw and smoothed time series side by side for
    selected countries to assess smoothing adequacy"

artifact V_smoothing : visualisation(D_countries, F_smoothed_cases)
  layout: "time graph panels per selected country"
  form: "overlaid line graphs"
  encoding: "x-axis: time; y-axis: incidence value; grey: raw series;
    coloured: smoothed series"
  description: "Comparison of raw and smoothed time series showing
    artifact removal while preserving epidemic dynamics"

transform T_assess_smoothing :
  intent: assess
  manner: "evaluate whether reporting artifacts are removed without
    over-smoothing genuine dynamics"
  input: V_smoothing, S_smoothing
  output: K_smoothing_quality
  actor: human
  description: "Assess smoothing quality: reporting fluctuations
    eliminated, epidemic peaks and troughs preserved, no excessive lag"

artifact K_smoothing_quality : knowledge(F_smoothed_cases)
  representation form: "quality judgment"
  description: "Assessment of smoothing adequacy; if unsatisfactory,
    adjust S_smoothing parameters and repeat"

# ============================================================================
# PHASE 2: DISEASE LEVEL CLASSIFICATION
# ============================================================================

artifact S_level_params : specification
  origin: given
  representation form: "parameter settings"
  description: "Parameters for level classification: number of levels
    (default 5: very low, low, moderate, high, very high), method for
    determining breaks (quantile, natural breaks/Jenks, domain-defined),
    whether to use pooled or per-country distributions"

loop L_level_definition:
  purpose: "Iteratively define disease level breaks from data until
    level categories are interpretable and domain-meaningful"
  until: "Level breaks produce interpretable categories that align with
    epidemiological understanding of pandemic severity"
  body:

    transform T_compute_breaks :
      intent: characterise
      manner: "compute value distribution and determine break points
        using specified method"
      input: F_smoothed_cases, F_smoothed_deaths, S_level_params
      output: F_level_breaks, F_level_labels
      actor: machine
      description: "Analyse pooled value distribution across all
        countries; compute break points separating disease levels;
        assign level labels to each day of each country's time series"

    artifact F_level_breaks : feature(D_countries)
      value structure: vector
      value type: numeric
      description: "Threshold values separating disease levels, derived
        from data distribution (e.g., quantiles of non-zero values
        across all countries)"

    artifact F_level_labels : feature(D_countries)
      value structure: vector
      value type: categorical
      description: "Daily disease level classification for each country:
        very low, low, moderate, high, very high"

    transform T_vis_levels :
      intent: visualise
      manner: "colour-coded time series with level bands and histogram
        of values with break lines"
      input: D_countries, F_smoothed_cases, F_level_breaks, F_level_labels
      output: V_levels
      actor: machine
      description: "Display time series with background colours
        indicating levels, and value distribution histogram with break
        lines, for assessment of level definitions"

    artifact V_levels : visualisation(D_countries, F_level_labels,
        F_level_breaks)
      layout: "time series panel with distribution histogram"
      form: "line graphs with coloured background bands; histogram
        with vertical break lines"
      encoding: "x-axis: time; y-axis: incidence; background colour:
        disease level; histogram: value distribution with marked breaks"
      description: "Time series with level colouring and value
        distribution showing how breaks partition the data"

    transform T_assess_levels :
      intent: assess
      manner: "evaluate whether level categories are meaningful and
        well-separated"
      input: V_levels, F_level_breaks, F_level_labels
      output: K_level_quality
      actor: human
      description: "Assess level definitions: do categories correspond
        to epidemiologically meaningful severity stages? Are breaks
        well-placed relative to the distribution? Are there too
        many/few level transitions?"

    artifact K_level_quality : knowledge(F_level_breaks)
      representation form: "quality judgment"
      description: "Assessment of level break quality: meaningfulness,
        separation, stability, and whether adjustment is needed"

    if K_level_quality indicates refinement needed:
      then:
        transform T_adjust_levels :
          intent: generate-knowledge
          manner: "adjust break method, number of levels, or manual
            thresholds"
          input: K_level_quality, V_levels, S_level_params
          output: S_level_params'
          actor: human
          description: "Modify level classification parameters based on
            assessment"

        artifact S_level_params' : specification
          representation form: "parameter settings"
          description: "Updated level classification parameters"

        assign:
          S_level_params := S_level_params'
      else:
        exit loop L_level_definition

end loop L_level_definition

# ============================================================================
# PHASE 3: TREND EXTRACTION
# ============================================================================

artifact S_trend_params : specification
  origin: given
  representation form: "parameter settings"
  description: "Trend computation parameters: window size for slope
    estimation, thresholds for classifying slope as rising/stable/
    decreasing (e.g., relative change thresholds)"

transform T_compute_trends :
  intent: characterise
  manner: "compute local slope over sliding window; classify as
    rising, stable, or decreasing based on thresholds"
  input: F_smoothed_cases, F_smoothed_deaths, S_trend_params
  output: F_trend_labels
  actor: machine
  description: "For each day and country, estimate local trend
    direction from the smoothed series slope over a window and
    classify into rising/stable/decreasing"

artifact F_trend_labels : feature(D_countries)
  value structure: vector
  value type: categorical
  description: "Daily trend classification for each country:
    rising, stable, or decreasing"

transform T_compose_states :
  intent: characterise
  manner: "combine level and trend into composite state label"
  input: F_level_labels, F_trend_labels
  output: F_composite_states
  actor: machine
  description: "Create composite daily state by combining disease
    level and trend direction (e.g., 'high-rising', 'moderate-stable')"

artifact F_composite_states : feature(D_countries)
  value structure: vector
  value type: categorical
  description: "Daily composite state labels combining disease level
    and trend direction for each country"

# ============================================================================
# PHASE 4: EPISODE SEGMENTATION
# ============================================================================

transform T_segment_episodes :
  intent: define-unit
  manner: "merge consecutive days with identical composite state into
    episodes; optionally merge short transitional episodes with
    neighbours"
  input: D_countries, F_composite_states, F_smoothed_cases
  output: D_episodes
  actor: machine
  description: "Segment each country's time series into contiguous
    episodes of uniform pandemic behaviour (same level + trend);
    filter out very short transitional episodes by merging with
    adjacent dominant state"

artifact D_episodes : entities
  internal structure: episode
  embedment: {set, time, space}
  features:
    - id: f_country
      value structure: atomic
      value type: categorical
      description: "Country identifier"
    - id: f_time_span
      value structure: vector
      value type: temporal
      description: "Episode start and end dates"
    - id: f_level
      value structure: atomic
      value type: categorical
      description: "Disease level during episode"
    - id: f_trend
      value structure: atomic
      value type: categorical
      description: "Trend direction during episode"
    - id: f_composite_state
      value structure: atomic
      value type: categorical
      description: "Combined level-trend state"
    - id: f_duration
      value structure: atomic
      value type: numeric
      description: "Episode duration in days"
    - id: f_mean_value
      value structure: atomic
      value type: numeric
      description: "Mean incidence during episode"
  description: "Pandemic behaviour episodes: contiguous time periods
    with uniform disease level and trend for each country"

transform T_vis_episodes :
  intent: visualise
  manner: "timeline display with episodes as coloured segments;
    small multiples per country ordered geographically"
  input: D_episodes, D_countries
  output: V_episodes
  actor: machine
  description: "Display episode sequences as colour-coded timeline
    strips for all countries, enabling visual comparison of pandemic
    trajectories"

artifact V_episodes : visualisation(D_episodes, D_countries)
  layout: "small-multiple timelines, one row per country, ordered
    by geography (north-south or clustered)"
  form: "horizontal coloured bars"
  encoding: "x-axis: time; bar colour: disease level (sequential
    colour scale); bar pattern/saturation: trend direction;
    bar length: episode duration"
  description: "Comparative timeline view of pandemic behaviour
    episodes across all European countries"

transform T_assess_episodes :
  intent: assess
  manner: "evaluate episode quality and interpretability"
  input: V_episodes, D_episodes
  output: K_episode_quality
  actor: human
  description: "Assess whether episodes are meaningful: not too
    fragmented, not over-merged; transitions correspond to
    observable pandemic waves"

artifact K_episode_quality : knowledge(D_episodes)
  representation form: "quality judgment"
  description: "Assessment of episode segmentation quality; may
    trigger adjustment of smoothing, level breaks, or trend
    parameters if episodes appear fragmented or over-aggregated"

# ============================================================================
# PHASE 5: SPATIO-TEMPORAL PATTERN ANALYSIS
# ============================================================================

artifact S_clustering_params : specification
  origin: given
  representation form: "parameter settings"
  description: "Parameters for clustering countries by episode
    sequence similarity: distance measure (edit distance on episode
    sequences, or feature-based), number of clusters"

loop L_country_clustering:
  purpose: "Iteratively cluster countries by pandemic behaviour
    similarity until groups are spatially coherent and
    interpretable"
  until: "Country groups reveal meaningful spatio-temporal pandemic
    behaviour patterns"
  body:

    transform T_characterise_sequences :
      intent: characterise
      manner: "encode each country's episode sequence as feature
        vector or symbolic string for similarity computation"
      input: D_episodes, D_countries
      output: F_sequence_features
      actor: machine
      description: "Derive features characterising each country's
        pandemic trajectory: episode sequence encoding, timing of
        waves, duration profiles, level distributions"

    artifact F_sequence_features : feature(D_countries)
      value structure: vector
      value type: numeric
      description: "Feature vectors encoding pandemic trajectory
        characteristics for inter-country comparison"

    transform T_cluster_countries :
      intent: define-unit
      manner: "cluster countries by trajectory similarity"
      input: D_countries, F_sequence_features, S_clustering_params
      output: D_country_groups, F_country_group_labels
      actor: machine
      description: "Group countries with similar pandemic behaviour
        trajectories using specified clustering approach"

    artifact D_country_groups : entities
      internal structure: group/cluster
      embedment: set
      features:
        - id: f_group_size
          value structure: atomic
          value type: numeric
          description: "Number of countries in group"
      description: "Groups of countries with similar pandemic
        behaviour trajectories"

    artifact F_country_group_labels : feature(D_countries)
      value structure: atomic
      value type: categorical
      description: "Country cluster membership identifier"

    transform T_arrange_spatial :
      intent: contextualise
      manner: "geographic positioning of countries with cluster
        colouring"
      input: D_countries, F_country_group_labels
      output: A_geographic
      actor: machine
      description: "Arrange countries in geographic context with
        cluster membership for spatial pattern revelation"

    artifact A_geographic : arrangement(D_countries)
      context: D_countries
      principle: "geographic positioning"
      description: "Countries positioned by their geographic
        coordinates"

    transform T_vis_spatiotemporal :
      intent: visualise
      manner: "coordinated map and timeline views with cluster
        colouring"
      input: D_countries, D_episodes, F_country_group_labels,
          A_geographic, D_country_groups
      output: V_spatiotemporal
      actor: machine
      description: "Display country clusters on geographic map and
        episode timelines grouped by cluster; show cluster-level
        representative episode patterns"

    artifact V_spatiotemporal : visualisation(D_countries,
        D_episodes, F_country_group_labels, A_geographic)
      layout: "coordinated views: geographic map, grouped timelines,
        cluster summaries"
      form: "choropleth map, coloured timeline strips, summary
        diagrams"
      encoding: "map colour: cluster membership; timeline colour:
        disease level; timeline grouping: by cluster; summary:
        modal episode sequences per cluster"
      description: "Coordinated spatio-temporal views showing
        geographic distribution of pandemic behaviour groups and
        their characteristic episode sequences"

    transform T_assess_clustering :
      intent: assess
      manner: "evaluate spatial coherence and interpretability of
        country groups"
      input: V_spatiotemporal, D_country_groups
      output: K_clustering_quality
      actor: human
      description: "Assess whether country groups form spatially
        coherent regions with interpretable pandemic behaviour
        differences; evaluate number of clusters"

    artifact K_clustering_quality : knowledge(D_country_groups)
      representation form: "quality judgment"
      description: "Assessment of country clustering quality:
        spatial coherence, trajectory similarity within groups,
        distinctiveness between groups"

    if K_clustering_quality indicates refinement needed:
      then:
        transform T_adjust_clustering :
          intent: generate-knowledge
          manner: "adjust clustering parameters"
          input: K_clustering_quality, V_spatiotemporal,
              S_clustering_params
          output: S_clustering_params'
          actor: human
          description: "Modify number of clusters, distance
            measure, or feature selection"

        artifact S_clustering_params' : specification
          representation form: "parameter settings"
          description: "Updated clustering parameters"

        assign:
          S_clustering_params := S_clustering_params'
      else:
        exit loop L_country_clustering

end loop L_country_clustering

# ============================================================================
# PHASE 6: POLICY RELATION ANALYSIS
# ============================================================================

transform T_prepare_policies :
  intent: characterise
  manner: "parse policy data and align with episode timeline"
  input: D_policies, D_episodes, D_countries
  output: F_policy_context
  actor: machine
  description: "For each country and time period, determine which
    policies were active; compute policy change events (onsets and
    offsets); align policy timeline with episode boundaries"

artifact F_policy_context : feature(D_episodes)
  value structure: vector
  value type: {categorical, temporal}
  description: "Active policies during each episode and policy
    change events (onsets/offsets) near episode boundaries"

transform T_vis_policy_overlay :
  intent: visualise
  manner: "overlay policy intervals on episode timelines with
    aligned event markers"
  input: D_episodes, F_policy_context, D_countries,
      F_country_group_labels
  output: V_policy_episodes
  actor: machine
  description: "Display episode timelines with policy intervention
    periods overlaid; highlight temporal relationships between
    policy changes and episode transitions"

artifact V_policy_episodes : visualisation(D_episodes,
    F_policy_context)
  layout: "timeline per country with policy overlay bands;
    countries grouped by behaviour cluster"
  form: "coloured episode bars with semi-transparent policy
    interval overlays and onset/offset markers"
  encoding: "episode colour: disease level; overlay colour: policy
    type; markers: policy start/end; grouping: by country cluster"
  description: "Integrated visualisation of pandemic behaviour
    episodes with anti-pandemic policy interventions showing
    temporal co-occurrence and potential causal relationships"

transform T_analyse_associations :
  intent: characterise
  manner: "compute temporal associations between policy events and
    episode transitions"
  input: D_episodes, F_policy_context, D_country_groups
  output: F_policy_associations
  actor: machine
  description: "For each policy type, compute statistics on episode
    transitions following policy onset: frequency of level
    decreases, trend reversals, time lags; compare across country
    groups"

artifact F_policy_associations : feature(D_policies)
  value structure: vector
  value type: numeric
  description: "Statistical associations between policy types and
    subsequent pandemic behaviour changes: transition frequencies,
    average lags, effect sizes by country group"

transform T_vis_associations :
  intent: visualise
  manner: "display policy-effect association summaries"
  input: F_policy_associations, D_country_groups
  output: V_associations
  actor: machine
  description: "Visualise statistical associations between policies
    and pandemic behaviour changes across country groups"

artifact V_associations : visualisation(F_policy_associations,
    D_country_groups)
  layout: "matrix or parallel display: policy types vs. country
    groups"
  form: "heatmap cells or bar charts"
  encoding: "rows: policy types; columns: country groups or time
    periods; colour/size: strength of association with level
    reduction or trend reversal"
  description: "Summary of policy-effect associations showing which
    policies correlate with pandemic behaviour improvements and
    how effects vary across country groups"

# ============================================================================
# PHASE 7: PATTERN IDENTIFICATION AND KNOWLEDGE SYNTHESIS
# ============================================================================

transform T_identify_patterns :
  intent: abstract
  manner: "interpret spatio-temporal pandemic behaviour patterns and
    policy relationships"
  input: V_spatiotemporal, V_policy_episodes, V_associations,
      F_policy_associations
  output: P_pandemic_patterns
  actor: human
  description: "Identify key patterns: pandemic wave synchronisation
    across regions, characteristic trajectories of country groups,
    temporal relationships between policy implementations and
    pandemic behaviour changes, differential policy effectiveness"

artifact P_pandemic_patterns : pattern(D_episodes, D_country_groups,
    F_policy_context)
  representation form: "described patterns with evidence"
  description: "Identified patterns: wave timing and synchronisation,
    regional groupings of pandemic behaviour, policy-response
    relationships, differential effectiveness across contexts"

transform T_synthesise_knowledge :
  intent: generate-knowledge
  manner: "formulate statements about pandemic dynamics and policy
    effects"
  input: P_pandemic_patterns, V_spatiotemporal, V_policy_episodes,
      V_associations
  output: K_findings
  actor: human
  description: "Synthesise findings about European COVID-19 pandemic
    dynamics, spatio-temporal behaviour patterns, and relationships
    between anti-pandemic policies and observed pandemic trajectories"

artifact K_findings : knowledge(P_pandemic_patterns)
  representation form: "statements, explanations, and
    illustrative visualisations"
  description: "Understanding of European COVID-19 dynamics:
    identified pandemic waves and their spatio-temporal propagation,
    country groupings by behaviour similarity, relationships between
    policy interventions and subsequent pandemic behaviour changes,
    contextual factors influencing policy effectiveness"

Workflow Diagram (Simplified)

┌─────────────────────────────────────────────────────────────────────────────┐
│                                                                             │
│  D_covid_raw ──► T_parse ──► D_countries                                   │
│  (eu.csv)                                                                   │
│                                                                             │
│  D_policies                                                                 │
│  (responses.csv)                                                            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 1: SMOOTHING                                                          │
│                                                                             │
│  D_countries + S_smoothing ──► T_smooth ──► F_smoothed_cases/deaths         │
│                                    │                                        │
│                              T_vis_smoothing ──► V_smoothing                │
│                                    │                                        │
│                              T_assess_smoothing ──► K_smoothing_quality     │
└─────────────────────────────────────────────────────────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 2: LEVEL CLASSIFICATION (Loop)                                        │
│                                                                             │
│  ┌──────────────────────────────────────────────────────────────────┐       │
│  │ F_smoothed + S_level_params ──► T_compute_breaks ──► F_levels   │       │
│  │         │                                                        │       │
│  │   T_vis_levels ──► T_assess_levels ──► Refine? ──yes──► adjust  │       │
│  │                              │                            │      │       │
│  │                              no ◄─────────────────────────┘      │       │
│  └──────────────────────────────┼───────────────────────────────────┘       │
└─────────────────────────────────┼───────────────────────────────────────────┘
        │                         │
        ▼                         ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 3: TREND EXTRACTION                                                   │
│                                                                             │
│  F_smoothed ──► T_compute_trends ──► F_trend_labels                         │
│                                            │                                │
│  F_level_labels + F_trend_labels ──► T_compose_states ──► F_composite       │
└─────────────────────────────────────────────────────────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 4: EPISODE SEGMENTATION                                               │
│                                                                             │
│  F_composite_states ──► T_segment ──► D_episodes                            │
│                                            │                                │
│                    T_vis_episodes ──► T_assess_episodes                      │
└─────────────────────────────────────────────────────────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 5: SPATIO-TEMPORAL CLUSTERING (Loop)                                  │
│                                                                             │
│  ┌──────────────────────────────────────────────────────────────────┐       │
│  │ D_episodes ──► T_characterise ──► T_cluster_countries            │       │
│  │         │                                                        │       │
│  │   T_vis_spatiotemporal ──► T_assess ──► Refine? ──yes──► adjust │       │
│  │                              │                                   │       │
│  │                              no                                  │       │
│  └──────────────────────────────┼───────────────────────────────────┘       │
└─────────────────────────────────┼───────────────────────────────────────────┘
        │                         │
        ▼                         ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 6: POLICY RELATION                                                    │
│                                                                             │
│  D_policies + D_episodes ──► T_prepare_policies ──► F_policy_context        │
│                                                          │                  │
│       T_vis_policy_overlay ──► V_policy_episodes                            │
│       T_analyse_associations ──► F_policy_associations                      │
│       T_vis_associations ──► V_associations                                 │
└─────────────────────────────────────────────────────────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PHASE 7: KNOWLEDGE SYNTHESIS                                                │
│                                                                             │
│  All views ──► T_identify_patterns ──► P_pandemic_patterns                  │
│                                              │                              │
│                    T_synthesise_knowledge ──► K_findings                     │
└─────────────────────────────────────────────────────────────────────────────┘

Design Rationale

Phase Closest Library Reference Key Adaptation
Smoothing 1.12 (ST modelling: data preparation) 7-day window targets known reporting cycle
Level classification 1.10 (Episodes & Topics: symbolic encoding loop) Data-driven breaks instead of predefined SAX alphabet
Trend extraction 1.10 (Phase 1: characterise temporal variation) Slope-based categorisation into 3 trend types
Episode segmentation 1.10 (define-unit: temporal segmentation) Composite state merging replaces fixed-window episodes
Country clustering 1.12 (grouping loop) + 1.3 (MobilityGraphs temporal clustering) Edit-distance on episode sequences for trajectory similarity
Policy overlay 1.10 (Phase 3: distribution in context) Policy intervals as external context for episode distributions
Knowledge synthesis Common across all library workflows Integrates spatio-temporal patterns with policy associations
V4 · both Variant V4 &mdash; language + library
Model’s internal reasoning (think block)
The user wants me to design a visual analytics workflow using ATWL (Artifact–Transform Workflow Language) for analyzing Google COVID-19 data for European countries. The workflow should:

1. Analyze daily time series of new cases and deaths per 100,000 population
2. Extract episodes of different disease levels (very low to very high, intervals defined from data)
3. Extract trends (rising, stable, decreasing)
4. Disregard reporting-related fluctuations (weekend drops, Monday peaks)
5. Analyze spatio-temporal distribution of pandemic behavior patterns
6. Relate patterns to countries' anti-pandemic policies

Let me design a comprehensive ATWL workflow for this task.


I'm working with two datasets: the EU COVID time series spanning from February 2020 through June 2021 with daily case and death rates per 100K, and a separate policy dataset tracking intervention types and their date ranges by country. My approach will involve loading both datasets, applying a 7-day moving average to smooth out reporting artifacts like weekend dips and Monday spikes, then establishing disease level thresholds derived from the data itself to classify each day into categories ranging from very low to very high.

From there, I'll compute trend directions (rising, stable, or decreasing) from the smoothed values and segment the time series into distinct episodes where the level and trend combination remains consistent. Once I've characterized these episodes by their properties—duration, intensity, trajectory—I can place them in their geographic and temporal context, visualize the spatio-temporal patterns across maps and timelines, and finally overlay the policy data to see how interventions correlate with the observed disease dynamics and identify broader patterns. Continuing with the spatial-temporal analysis to map episodes across countries and time, then integrating policy data to understand how interventions correlate with pattern shifts. I'm recognizing this will be iterative—the smoothing parameters, level thresholds, and trend detection settings will likely need refinement as I work through the data. Now I'll structure this as a proper workflow specification.

Defining the workflow template...

ATWL Workflow: COVID-19 Pandemic Behaviour Analysis in Europe

workflow covid-pandemic-behaviour-analysis
template: characterise (smooth) →
  loop(generate-knowledge (define thresholds) →
       characterise (classify levels and trends) →
       define-unit (extract episodes) →
       characterise (episodes) →
       contextualise →visualise →assess) →
  characterise (policy alignment) →
  contextualise (spatio-temporal) →visualise →
  abstract →generate-knowledge
description: "Analyse spatio-temporal distribution of COVID-19 pandemic
  behaviour patterns across European countries by extracting episodes of
  different disease levels and trends from smoothed time series, and
  relating identified patterns to anti-pandemic policy measures"

# ============================================================================
# INPUT ARTIFACTS
# ============================================================================

artifact D_country_series : entities
  origin: given
  internal structure: elementary
  embedment: {set, time, space}
  features:
    - id: f_new_cases
      value structure: vector
      value type: numeric
      description: "Daily new cases per 100,000 population"
    - id: f_deaths
      value structure: vector
      value type: numeric
      description: "Daily deaths per 100,000 population"
    - id: f_population
      value structure: atomic
      value type: numeric
      description: "Country population"
    - id: f_coordinates
      value structure: vector
      value type: spatial
      description: "Capital coordinates (X, Y)"
  description: "Daily COVID-19 time series for European countries from
    2020-02-15 to 2021-06-30, with new cases and deaths per 100,000
    population; each entity is one country with its full temporal record"

artifact D_policies : entities
  origin: given
  internal structure: elementary
  embedment: {set, time}
  features:
    - id: f_country
      value structure: atomic
      value type: categorical
      description: "Country name"
    - id: f_policy_type
      value structure: atomic
      value type: categorical
      description: "Type of anti-pandemic policy measure"
    - id: f_start_date
      value structure: atomic
      value type: temporal
      description: "Policy start date"
    - id: f_end_date
      value structure: atomic
      value type: temporal
      description: "Policy end date"
  description: "Anti-pandemic policy measures with country, type, and
    active time interval from responses.csv"

artifact D_map : entities
  origin: given
  internal structure: elementary
  embedment: space
  features:
    - id: f_geometry
      value structure: atomic
      value type: spatial
      description: "Country boundary geometry"
  description: "Geographic map of European countries providing spatial
    context for visualisation"

# ============================================================================
# PHASE 1: SMOOTHING TO REMOVE REPORTING ARTIFACTS
# ============================================================================

transform T_smooth :
  intent: characterise
  manner: "temporal smoothing with 7-day rolling average"
  input: D_country_series
  output: F_smoothed
  actor: machine
  description: "Apply 7-day centred moving average to new cases and deaths
    time series for each country to eliminate reporting-related fluctuations
    such as weekend drops and Monday peaks"

artifact F_smoothed : feature(D_country_series)
  value structure: vector
  value type: numeric
  representation form: "smoothed daily time series per country"
  description: "Smoothed time series of new cases and deaths per 100,000
    with weekly reporting cycle artifacts removed"

# ============================================================================
# PHASE 2: LEVEL AND TREND DEFINITION, EPISODE EXTRACTION (iterative)
# ============================================================================

artifact S_classification : specification
  origin: given
  representation form: "parameter settings"
  description: "Initial parameters for level and trend classification:
    number of disease levels (e.g., 5: very low, low, moderate, high,
    very high), method for determining level boundaries (e.g., quantiles
    or natural breaks on pooled distribution), trend detection window
    length, and slope thresholds for rising/stable/decreasing"

loop L_episode_refinement:
  purpose: "Iteratively refine level thresholds, trend parameters, and
    episode extraction until episodes are interpretable, temporally
    coherent, and suitable for spatio-temporal pattern analysis"
  until: "Disease levels correspond to meaningful pandemic severity
    distinctions; trends are robust; episodes are neither too short
    nor too fragmented for meaningful analysis"
  body:

    # ========================================================================
    # Step 2a: Define level thresholds from data distribution
    # ========================================================================

    transform T_define_thresholds :
      intent: generate-knowledge
      manner: "determine classification boundaries from data distribution"
      input: F_smoothed, S_classification
      output: S_thresholds
      actor: hybrid
      description: "Analyse the distribution of smoothed case and death
        values pooled across all countries and time points; determine
        breakpoints for disease levels (e.g., using quantiles, natural
        breaks, or domain-informed thresholds); specify slope thresholds
        for trend categories"

    artifact S_thresholds : specification
      representation form: "threshold values and rules"
      description: "Defined breakpoints separating disease levels (e.g.,
        boundaries between very low/low/moderate/high/very high for cases
        and deaths) and slope thresholds separating rising/stable/decreasing
        trends"

    # ========================================================================
    # Step 2b: Classify daily values into levels and trends
    # ========================================================================

    transform T_classify_levels :
      intent: characterise
      manner: "assign ordinal disease level based on smoothed value and
        thresholds"
      input: D_country_series, F_smoothed, S_thresholds
      output: F_level_labels
      actor: machine
      description: "Classify each day for each country into a disease level
        category based on the smoothed value relative to defined thresholds"

    artifact F_level_labels : feature(D_country_series)
      value structure: vector
      value type: ordinal
      representation form: "daily level time series per country"
      description: "Ordinal disease level for each country-day (e.g., very
        low, low, moderate, high, very high) based on smoothed new cases"

    transform T_compute_trends :
      intent: characterise
      manner: "compute local slope over sliding window and classify trend
        direction"
      input: D_country_series, F_smoothed, S_thresholds
      output: F_trend_labels
      actor: machine
      description: "Compute local trend from smoothed time series using a
        sliding window; classify each day as rising, stable, or decreasing
        based on slope relative to defined thresholds"

    artifact F_trend_labels : feature(D_country_series)
      value structure: vector
      value type: categorical
      representation form: "daily trend time series per country"
      description: "Trend direction (rising, stable, decreasing) for each
        country-day based on local slope of smoothed values"

    # ========================================================================
    # Step 2c: Extract episodes of consistent level and trend
    # ========================================================================

    transform T_extract_episodes :
      intent: define-unit
      manner: "time-partitioning by constancy of level and trend"
      input: D_country_series, F_level_labels, F_trend_labels
      output: D_episodes, F_episode_membership
      actor: machine
      description: "Segment each country's time series into maximal
        consecutive intervals where both disease level and trend direction
        remain constant; each resulting interval is an episode"

    artifact D_episodes : entities
      internal structure: episode
      embedment: {set, time, space}
      features:
        - id: f_country
          value structure: atomic
          value type: categorical
          description: "Country identifier"
        - id: f_level
          value structure: atomic
          value type: ordinal
          description: "Disease level during episode"
        - id: f_trend
          value structure: atomic
          value type: categorical
          description: "Trend direction during episode"
        - id: f_start
          value structure: atomic
          value type: temporal
          description: "Episode start date"
        - id: f_end
          value structure: atomic
          value type: temporal
          description: "Episode end date"
      description: "Temporal episodes of consistent pandemic behaviour
        (level + trend) for each country"

    artifact F_episode_membership : feature(D_country_series)
      value structure: vector
      value type: reference
      description: "Mapping from each country-day to its containing episode"

    # ========================================================================
    # Step 2d: Characterise episodes
    # ========================================================================

    transform T_characterise_episodes :
      intent: characterise
      manner: "compute summary statistics per episode"
      input: D_episodes, F_smoothed
      output: F_episode_stats
      actor: machine
      description: "Compute episode duration, mean and peak case rate,
        cumulative cases, mean death rate, and rate of change"

    artifact F_episode_stats : feature(D_episodes)
      value structure: vector
      value type: numeric
      description: "Episode summary statistics: duration in days, mean
        smoothed case rate, peak case rate, cumulative cases, mean death
        rate, and average slope"

    # ========================================================================
    # Step 2e: Contextualise and visualise episodes
    # ========================================================================

    transform T_arrange_episodes :
      intent: contextualise
      manner: "space-time arrangement on map and timeline"
      input: D_episodes, D_map
      output: A_episodes_spacetime
      actor: machine
      description: "Arrange episodes in a spatio-temporal context with
        countries positioned geographically and episodes placed along
        time axis"

    artifact A_episodes_spacetime : arrangement(D_episodes)
      context: D_map
      principle: "geographic position by country; temporal position by
        episode time interval"
      description: "Spatio-temporal arrangement of episodes for
        coordinated map and timeline display"

    transform T_visualise_episodes :
      intent: visualise
      manner: "space-time display with level and trend encoding"
      input: A_episodes_spacetime, D_episodes, F_episode_stats
      output: V_episodes
      actor: machine
      description: "Display episodes as coloured segments on country
        timelines arranged geographically; colour encodes disease level,
        pattern/hatching encodes trend direction"

    artifact V_episodes : visualisation(A_episodes_spacetime, D_episodes)
      layout: "geographic map with aligned timeline strips per country"
      form: "coloured temporal segments with trend indicators"
      encoding: "position: country on map, time on horizontal axis;
        colour: disease level (gradient from green=very low to red=very
        high); pattern or arrow overlay: trend direction (rising/stable/
        decreasing); segment width: episode duration"
      description: "Spatio-temporal overview of pandemic behaviour episodes
        across European countries showing level and trend patterns"

    # ========================================================================
    # Step 2f: Assess episode quality
    # ========================================================================

    transform T_assess_episodes :
      intent: assess
      manner: "evaluate interpretability and coherence of episodes"
      input: V_episodes, D_episodes, F_episode_stats, S_thresholds
      output: K_episode_quality
      actor: human
      description: "Assess whether level boundaries produce meaningful
        severity distinctions; whether episodes are temporally coherent
        (not too fragmented); whether trend detection captures genuine
        changes without noise-induced oscillations"

    artifact K_episode_quality : knowledge(D_episodes)
      representation form: "quality judgment"
      description: "Assessment of episode extraction quality: whether
        level thresholds are meaningful, trends are robust, and episodes
        are sufficiently coherent and interpretable for pattern analysis"

    if K_episode_quality indicates refinement needed:
      then:
        transform T_adjust_classification :
          intent: generate-knowledge
          manner: "adjust level boundaries and trend parameters"
          input: K_episode_quality, V_episodes, S_classification
          output: S_classification'
          actor: human
          description: "Adjust number of levels, threshold method, trend
            window length, slope thresholds, or minimum episode duration
            based on assessment"

        artifact S_classification' : specification
          representation form: "parameter settings"
          description: "Updated classification parameters after refinement"

        assign:
          S_classification := S_classification'
      else:
        exit loop L_episode_refinement

end loop L_episode_refinement

# ============================================================================
# PHASE 3: DEFINE BEHAVIOUR PATTERNS
# ============================================================================

transform T_define_patterns :
  intent: abstract
  manner: "enumerate and name level-trend combinations as behaviour types"
  input: D_episodes, V_episodes, F_episode_stats
  output: P_behaviour_types
  actor: human
  description: "Identify the set of distinct pandemic behaviour patterns
    from observed level-trend combinations; assign descriptive names
    (e.g., 'rapid escalation' for high+rising, 'plateau' for high+stable,
    'recovery' for moderate+decreasing)"

artifact P_behaviour_types : pattern(D_episodes)
  representation form: "named behaviour type catalogue"
  description: "Catalogue of pandemic behaviour types defined by
    level-trend combinations with descriptive labels characterising
    their epidemiological meaning"

transform T_label_episodes :
  intent: characterise
  manner: "assign behaviour type labels to episodes"
  input: D_episodes, P_behaviour_types
  output: F_behaviour_label
  actor: machine
  description: "Label each episode with its corresponding behaviour type
    from the pattern catalogue"

artifact F_behaviour_label : feature(D_episodes)
  value structure: atomic
  value type: categorical
  description: "Behaviour type label for each episode from the defined
    pattern catalogue"

# ============================================================================
# PHASE 4: POLICY INTEGRATION
# ============================================================================

transform T_align_policies :
  intent: characterise
  manner: "compute active policy context for each episode"
  input: D_episodes, D_policies
  output: F_policy_context
  actor: machine
  description: "For each episode, determine which policy measures were
    active during its time interval in the corresponding country;
    compute policy intensity (number and types of active measures)"

artifact F_policy_context : feature(D_episodes)
  value structure: vector
  value type: {categorical, numeric}
  description: "Active policy measures during each episode: list of
    active policy types, count of active measures, and policy change
    indicators (newly introduced or lifted measures)"

transform T_characterise_policy_changes :
  intent: characterise
  manner: "identify policy transitions at episode boundaries"
  input: D_episodes, D_policies, F_policy_context
  output: F_policy_transitions
  actor: machine
  description: "Identify policy changes occurring shortly before or
    during each episode; compute lag between policy introduction and
    episode onset for temporal relationship analysis"

artifact F_policy_transitions : feature(D_episodes)
  value structure: vector
  value type: {categorical, temporal, numeric}
  description: "Policy transitions associated with each episode:
    newly introduced policies, lifted policies, temporal lag between
    policy change and behaviour change"

# ============================================================================
# PHASE 5: SPATIO-TEMPORAL PATTERN ANALYSIS
# ============================================================================

transform T_visualise_patterns_map :
  intent: visualise
  manner: "animated choropleth map with temporal control"
  input: D_episodes, F_behaviour_label, D_map, A_episodes_spacetime
  output: V_map_animated
  actor: machine
  description: "Display behaviour types on geographic map with temporal
    animation showing how patterns spread across Europe over time"

artifact V_map_animated : visualisation(D_episodes, F_behaviour_label, D_map)
  layout: "geographic map of Europe with time slider"
  form: "choropleth with animated temporal progression"
  encoding: "country fill colour: behaviour type; temporal position:
    controlled by time slider or animation; saturation: episode
    intensity (mean case rate)"
  description: "Animated map showing spatial distribution and temporal
    progression of pandemic behaviour patterns across Europe"

transform T_visualise_patterns_timeline :
  intent: visualise
  manner: "stacked timeline display with policy overlay"
  input: D_episodes, F_behaviour_label, F_policy_context,
    A_episodes_spacetime
  output: V_timeline_policies
  actor: machine
  description: "Display all countries as parallel timeline strips showing
    behaviour type sequences, with policy measures overlaid as markers
    or bands"

artifact V_timeline_policies : visualisation(D_episodes, F_behaviour_label,
  F_policy_context)
  layout: "parallel horizontal timelines, one per country, vertically
    ordered by geography or similarity"
  form: "coloured segments with policy markers"
  encoding: "horizontal position: time; segment colour: behaviour type;
    vertical bands or icons: policy introductions and lifts; country
    ordering: geographic latitude or behaviour similarity"
  description: "Coordinated timeline view showing behaviour episodes
    and policy measures for all countries enabling comparison of
    policy-behaviour relationships"

transform T_visualise_policy_effect :
  intent: visualise
  manner: "policy-aligned comparative display"
  input: D_episodes, F_behaviour_label, F_policy_transitions,
    F_episode_stats
  output: V_policy_comparison
  actor: machine
  description: "Display behaviour patterns before, during, and after
    specific policy types across countries to reveal potential policy
    effects"

artifact V_policy_comparison : visualisation(D_episodes,
  F_policy_transitions)
  layout: "matrix with policy types as columns, countries as rows, or
    aligned timelines centred at policy introduction dates"
  form: "small multiples of behaviour sequences or transition diagrams"
  encoding: "colour: behaviour type; temporal alignment: centred at
    policy start; rows: countries implementing similar policies"
  description: "Comparative view of pandemic behaviour before and after
    policy introductions, enabling assessment of policy effectiveness
    across countries"

# ============================================================================
# PHASE 6: PATTERN IDENTIFICATION AND KNOWLEDGE GENERATION
# ============================================================================

transform T_identify_spatiotemporal_patterns :
  intent: abstract
  manner: "perception-and-interpretation of synchronous and sequential
    patterns"
  input: V_map_animated, V_timeline_policies, V_policy_comparison
  output: P_spatiotemporal
  actor: human
  description: "Identify spatio-temporal regularities: waves propagating
    across countries, synchronous transitions, country clusters with
    similar behaviour sequences, temporal lags between regions"

artifact P_spatiotemporal : pattern(D_episodes)
  representation form: "described spatio-temporal regularities"
  description: "Identified spatio-temporal patterns: pandemic waves and
    their geographic propagation, country groups with similar epidemic
    trajectories, seasonal patterns, and synchronisation phenomena"

transform T_identify_policy_patterns :
  intent: abstract
  manner: "perception-and-interpretation of policy-behaviour associations"
  input: V_timeline_policies, V_policy_comparison, F_policy_transitions
  output: P_policy_effects
  actor: human
  description: "Identify associations between policy measures and
    subsequent behaviour changes: which policies precede transitions
    to lower levels, typical response delays, differences across
    countries"

artifact P_policy_effects : pattern(D_episodes, D_policies)
  representation form: "identified policy-behaviour associations"
  description: "Observed associations between anti-pandemic policies and
    subsequent changes in pandemic behaviour: effective policy
    combinations, typical response lags, country-specific differences
    in policy effectiveness"

transform T_generate_knowledge :
  intent: generate-knowledge
  manner: "formulate-statements"
  input: P_spatiotemporal, P_policy_effects, P_behaviour_types,
    V_map_animated, V_timeline_policies, V_policy_comparison
  output: K_findings
  actor: human
  description: "Synthesise findings about pandemic dynamics in Europe:
    how disease levels and trends distributed across space and time,
    which policy measures appeared associated with behaviour transitions,
    and what spatio-temporal factors (geography, timing, policy
    combinations) influenced pandemic trajectories"

artifact K_findings : knowledge(P_spatiotemporal, P_policy_effects)
  representation form: "statements, explanations, and recommendations"
  description: "Comprehensive understanding of COVID-19 pandemic
    behaviour patterns across Europe: identified waves and their
    geographic propagation, country typologies based on epidemic
    trajectories, observed relationships between policy interventions
    and subsequent behaviour changes, and hypotheses about factors
    influencing policy effectiveness"

Workflow Summary

The workflow proceeds through six main phases:

Phase Purpose Key Transforms
1. Smoothing Remove reporting artifacts (weekend/Monday effects) 7-day moving average
2. Episode extraction (iterative) Define levels from data, detect trends, segment into episodes Threshold definition, classification, temporal segmentation
3. Behaviour patterns Name and catalogue level×trend combinations Abstraction and labelling
4. Policy integration Align policy data with episodes Temporal matching, transition detection
5. Spatio-temporal visualisation Explore geographic and temporal distribution Animated maps, timelines with policy overlay
6. Knowledge generation Identify patterns and policy associations Interpretation and synthesis

Key design decisions:

  • Smoothing before classification ensures that reporting artifacts do not create spurious level/trend changes.
  • Data-driven thresholds (e.g., quantiles of the pooled distribution) make level definitions adaptive to the actual European experience.
  • The iterative loop allows the analyst to refine thresholds and trend parameters until episodes are interpretable and not over-fragmented.
  • Policy alignment uses temporal overlap and lagged associations to relate interventions to behaviour changes without implying causation.
  • Multiple coordinated visualisations (animated map, parallel timelines, policy-centred comparisons) support both spatial pattern discovery and policy–effect exploration.