euler314 commited on
Commit
85a1f3d
·
verified ·
1 Parent(s): 304e00c

Replace Bavi and interactive showcase with verified Yagi MP4

Browse files
Files changed (37) hide show
  1. .gitattributes +8 -0
  2. README.md +29 -23
  3. RELEASE_NOTES_TRACKFORMER_1_2.md +2 -4
  4. docs/daily_storm_benchmark.md +1 -1
  5. docs/repository_layout.md +19 -0
  6. docs/trackformer_1_2_evaluation.md +6 -6
  7. docs/trackformer_1_2_pressure.html +0 -0
  8. docs/{trackformer_1_2_bavi.mp4 → trackformer_1_2_yagi.mp4} +2 -2
  9. evaluation/README.md +12 -0
  10. evaluation/release_data/cohort_270.json +1391 -0
  11. evaluation/release_data/daily_storm_cohort.json +0 -0
  12. evaluation/release_data/map_boundaries.json +1 -0
  13. paper/trackformer_1_2_interactive_pressure_preview.png → evaluation/release_data/routes_270.npz +2 -2
  14. paper/release_data/bavi_video.npz → evaluation/release_data/surigae_pressure.npz +2 -2
  15. evaluation/release_data/surigae_provenance.json +14 -0
  16. paper/release_data/pressure_showcase_coastlines.json → evaluation/release_data/yagi_coastlines.json +1 -1
  17. evaluation/release_data/yagi_video.json +135 -0
  18. paper/release_data/pressure_showcase.npz → evaluation/release_data/yagi_video.npz +2 -2
  19. evaluation/trackformer_1_2_pressure_map_example.png +0 -0
  20. evaluation/trackformer_1_2_showcase_selection.json +0 -0
  21. paper/trackformer_1_2_bavi_video_poster.png → evaluation/trackformer_1_2_surigae_isobars.png +2 -2
  22. evaluation/trackformer_1_2_vs_1_1_270_bars.png +3 -0
  23. evaluation/trackformer_1_2_vs_1_1_270_metrics.json +1506 -0
  24. evaluation/trackformer_1_2_vs_1_1_route_examples.png +3 -0
  25. evaluation/trackformer_1_2_vs_1_1_tip_bars.png +0 -0
  26. evaluation/trackformer_1_2_vs_1_1_tip_metrics.json +28 -0
  27. evaluation/trackformer_1_2_yagi_video_poster.png +3 -0
  28. paper/release_data/bavi_coastlines.json +0 -1
  29. paper/release_data/bavi_video.json +0 -55
  30. paper/release_data/pressure_showcase.json +0 -28
  31. release_tools/build_bavi_video.py +0 -122
  32. release_tools/build_pressure_showcase.py +0 -112
  33. release_tools/build_yagi_video.py +172 -0
  34. release_tools/export_field_1_2.py +61 -0
  35. release_tools/plot_field_1_2.py +69 -0
  36. release_tools/plot_release_270.py +2 -2
  37. release_tools/pressure_showcase_template.html +0 -42
.gitattributes CHANGED
@@ -15,3 +15,11 @@ paper/trackformer_1_2_interactive_pressure_preview.png filter=lfs diff=lfs merge
15
  docs/trackformer_1_2_bavi.mp4 filter=lfs diff=lfs merge=lfs -text
16
  paper/release_data/bavi_video.npz filter=lfs diff=lfs merge=lfs -text
17
  paper/trackformer_1_2_bavi_video_poster.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
15
  docs/trackformer_1_2_bavi.mp4 filter=lfs diff=lfs merge=lfs -text
16
  paper/release_data/bavi_video.npz filter=lfs diff=lfs merge=lfs -text
17
  paper/trackformer_1_2_bavi_video_poster.png filter=lfs diff=lfs merge=lfs -text
18
+ evaluation/trackformer_1_2_surigae_isobars.png filter=lfs diff=lfs merge=lfs -text
19
+ evaluation/trackformer_1_2_vs_1_1_route_examples.png filter=lfs diff=lfs merge=lfs -text
20
+ evaluation/trackformer_1_2_vs_1_1_270_bars.png filter=lfs diff=lfs merge=lfs -text
21
+ evaluation/trackformer_1_2_yagi_video_poster.png filter=lfs diff=lfs merge=lfs -text
22
+ evaluation/release_data/yagi_video.npz filter=lfs diff=lfs merge=lfs -text
23
+ evaluation/release_data/routes_270.npz filter=lfs diff=lfs merge=lfs -text
24
+ evaluation/release_data/surigae_pressure.npz filter=lfs diff=lfs merge=lfs -text
25
+ docs/trackformer_1_2_yagi.mp4 filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -47,55 +47,49 @@ This comparison uses **270 forecast cases from 90 storms**, with the same issue
47
  | Mean track error, +6 to +120 h | 902.3 km | **714.4 km** | Lower |
48
  | Track error at +120 h | 1,833.2 km | **1,433.4 km** | Lower |
49
 
50
- ![270-case direction, route-shape, path and position comparison](paper/trackformer_1_2_vs_1_1_270_bars.png)
51
 
52
  **What “similarity” means:** direction error compares the heading of each six-hour step, on 5,382 common valid case-leads where truth and both models move more than 1 km. Shape similarity compares the centred route curves after removing overall scale, while preserving their orientation; a score of 1 means identical shape under that comparison. Path similarity uses Fréchet distance and the observed route length, so it also responds to geographic displacement. These scores measure different aspects of the forecast and are reported separately.
53
 
54
- The saved 1.1 archive had a coordinate-label bug: its `v11_local` array held absolute latitude/longitude, while the original scorer interpreted it as east/north kilometres. The new comparison converts those coordinates to the same local projection used by 1.2 and verifies a round trip back to the original coordinates. **The old 1,036.3 km score is superseded by 902.3 km.** Original forecast archives are preserved. The [published metrics](paper/trackformer_1_2_vs_1_1_270_metrics.json), small plot-data arrays and [reproduction script](release_tools/plot_release_270.py) record the correction.
 
 
55
 
56
  ### What the routes look like
57
 
58
- These are **six selected best-performing examples from six distinct storms**, not a representative sample. Among in-domain cases with at least 300 km of observed travel, shape similarity ≥0.90 and direction error ≤30° on at least 18 common valid leads, we select the lowest 1.2 mean track errors, with one case per storm. Every curve starts at the same issue-time origin. The [selection manifest and all 270 case scores](paper/trackformer_1_2_showcase_selection.json) make the choice auditable; the aggregate bars above still include every case, including poor forecasts.
59
 
60
- ![Observed, 1.1 and 1.2 routes on six selected best-performing examples](paper/trackformer_1_2_vs_1_1_route_examples.png)
61
 
62
  The 1.2 mean has better aggregate direction, shape and position scores on this previously inspected development cohort. That does not establish an overall win on every storm or pressure metric. A same-270 1.1 central-pressure prediction array was not verified in these route artifacts, so it is not assigned a pressure-error bar. The separate 1.2 report gives 15.73 hPa central-pressure MAE and 2.54 hPa area-weighted regional MSLP MAE. TIP remains a separate diagnostic: its pressure error was worse for 1.2 (30.7 vs 20.1 hPa). See [metric definitions and limitations](docs/trackformer_1_2_evaluation.md).
63
 
64
  ### Expanded daily-issue benchmark: 270 distinct typhoons
65
 
66
- A new **1,473-case / 270-storm** benchmark is in progress; it is not the completed 270-case result above. Each storm contributes at most one forecast per UTC day, through +120 h. Daily errors are averaged within each storm, then the 270 storm scores receive equal weight. Selection was frozen before new inference, without filtering on forecast quality. See the [protocol](docs/daily_storm_benchmark.md) and [frozen cohort](paper/release_data/daily_storm_cohort.json). Results are pending; no improvement is claimed from the partial run.
67
-
68
- ## Bavi pressure forecast — MP4
69
-
70
- <video controls playsinline preload="metadata" width="100%" src="https://huggingface.co/euler314/typhoon-predict/resolve/main/docs/trackformer_1_2_bavi.mp4" poster="https://huggingface.co/euler314/typhoon-predict/resolve/main/paper/trackformer_1_2_bavi_video_poster.png">
71
- <a href="https://huggingface.co/euler314/typhoon-predict/resolve/main/docs/trackformer_1_2_bavi.mp4">Play the Bavi forecast MP4</a>
72
- </video>
73
-
74
- [![Play the Trackformer 1.2 Bavi pressure forecast MP4](paper/trackformer_1_2_bavi_video_poster.png)](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_bavi.mp4)
75
 
76
- **[Play or download the Bavi MP4](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_bavi.mp4)** · 23 seconds · +6 to +120 h · **50-member mean**. This is a video, not an interactive map. Click the preview above to play it; inline video playback depends on the Markdown host.
77
 
78
- The forecast starts **3 July 2026 at 06 UTC**. It shows actual saved model-generated pressure with 4 hPa isobars, the mean forecast track, the observed route, and a central-pressure timeline. Observed pressure is the local IBTrACS **USA** series, not JMA. The dotted map boundary marks the fixed regional reconstruction: after the centre leaves it, only the coarser basin field is available at that location. No detailed pressure core is invented outside coverage. This requested Bavi example is not evidence of typical skill. [Data, source hashes and video provenance](paper/release_data/bavi_video.json).
79
 
80
- ## Interactive forecast pressure and observed route
81
 
82
- **[Open the interactive 1.2 pressure map](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_pressure.html)** — play or scrub from +6 to +120 h, toggle forecast/observed routes, and hover or tap to inspect pressure and position. Click the preview below to open it. GitHub and Hugging Face Markdown cannot execute the interactive controls inside the README itself.
83
 
84
- [![Open the interactive Trackformer 1.2 pressure map against the observed Prapiroon route](paper/trackformer_1_2_interactive_pressure_preview.png)](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_pressure.html)
85
 
86
- This **PRAPIROON forecast issued 19 July 2024 at 00 UTC** uses the actual saved **50-member mean physical pressure field**, member-mean route and central pressure. The observed route uses exact six-hour best-track coordinates from the verification archive. It is the lowest-track-error case among the declared full-map-coverage and pressure-quality candidates: 133.2 km saved-benchmark mean track error and 2.91 hPa central-pressure MAE. This is a deliberately selected showcase, not typical performance or an unbiased evaluation. The [data and selection manifest](paper/release_data/pressure_showcase.json) explains the choice. The mean map has not been moved to match the observed track.
87
 
88
  ### Architecture-only paper
89
 
90
- The revised **[Trackformer 1.2 technical paper (PDF)](paper/trackformer.pdf)** describes only the detailed architecture and how forecasts work: input tensors, multiscale attention, recurrent basin transport, moving pressure core, centre association, physical pressure reconstruction, objectives and 50-member means. [Editable LaTeX source](paper/trackformer.tex). Benchmark results remain separate in the evaluation notes; the previous 1.1 paper source is preserved as [a legacy document](paper/trackformer_1_1_legacy.tex).
91
 
92
  ## Recent pressure forecast with isobars
93
 
94
  The archived **Surigae forecast issued 27 September 2026 at 12:00 UTC** shows the model's regional pressure field at +6, +24 and +36 h. Thin lines are isobars every **4 hPa**, with selected labels every 12 hPa; magenta shows the forecast track and centre. Coastlines provide geographic context. These panels use the actual saved model values.
95
 
96
- ![Surigae model-generated pressure forecast with labelled isobars](paper/trackformer_1_2_surigae_isobars.png)
97
 
98
- This recent example is **one deterministic forecast**, separate from the benchmark's mean of 50. Its input uses nine GFS analyses ending at 06 UTC, six hours before issue time; issue-time JMA central pressure was provided, while wind, prior motion and native regional history were unavailable. This transfer from the training data contract is experimental. The fixed regional map ends at 144°E; the selected leads keep the forecast centre inside it. The [pressure-field provenance](paper/release_data/surigae_provenance.json) records the input limitations and checkpoint hash.
99
 
100
  ## Get the model and run it
101
 
@@ -103,6 +97,18 @@ This recent example is **one deterministic forecast**, separate from the benchma
103
  - [Hugging Face weights and model card](https://huggingface.co/euler314/typhoon-predict)
104
  - [Input schema and inference instructions](models/trackformer_1_2_field/README.md)
105
 
106
- The inference-only `weights.pt` is hosted in the release/Hugging Face model folder, **not committed to GitHub source**. The manifest records its SHA-256 and the original training-checkpoint SHA-256. The three source modules are copied unchanged from the verified training implementation. The root-level `trackformer_1_2.py` and older `examples/predict_trackformer_1_2.py` are legacy artifacts from a withdrawn, unrelated 1.2 candidate; **do not use them with these field weights**.
107
 
108
  Only issue-time and earlier analyses are permitted. The prediction wrapper rejects future-dated history and unexpected input keys, but cannot certify an externally built packet's data provenance. The operator must verify source timestamps and training-only normalization. The included wrapper runs one unperturbed forecast; it does not reproduce the saved 50-member mean automatically.
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  | Mean track error, +6 to +120 h | 902.3 km | **714.4 km** | Lower |
48
  | Track error at +120 h | 1,833.2 km | **1,433.4 km** | Lower |
49
 
50
+ ![270-case direction, route-shape, path and position comparison](evaluation/trackformer_1_2_vs_1_1_270_bars.png)
51
 
52
  **What “similarity” means:** direction error compares the heading of each six-hour step, on 5,382 common valid case-leads where truth and both models move more than 1 km. Shape similarity compares the centred route curves after removing overall scale, while preserving their orientation; a score of 1 means identical shape under that comparison. Path similarity uses Fréchet distance and the observed route length, so it also responds to geographic displacement. These scores measure different aspects of the forecast and are reported separately.
53
 
54
+ **Actual route alignment is the goal:** predicted and observed positions should coincide geographically at the same valid times. A high centred-shape score alone does **not** demonstrate that alignment; a displaced forecast can have the right shape and still be wrong. Position error and the unshifted route overlay must therefore be read alongside the shape score.
55
+
56
+ The saved 1.1 archive had a coordinate-label bug: its `v11_local` array held absolute latitude/longitude, while the original scorer interpreted it as east/north kilometres. The new comparison converts those coordinates to the same local projection used by 1.2 and verifies a round trip back to the original coordinates. **The old 1,036.3 km score is superseded by 902.3 km.** Original forecast archives are preserved. The [published metrics](evaluation/trackformer_1_2_vs_1_1_270_metrics.json), small plot-data arrays and [reproduction script](release_tools/plot_release_270.py) record the correction.
57
 
58
  ### What the routes look like
59
 
60
+ These are **six selected best-performing examples from six distinct storms**, not a representative sample. Among in-domain cases with at least 300 km of observed travel, shape similarity ≥0.90 and direction error ≤30° on at least 18 common valid leads, we select the lowest 1.2 mean track errors, with one case per storm. Every curve starts at the same issue-time origin. The [selection manifest and all 270 case scores](evaluation/trackformer_1_2_showcase_selection.json) make the choice auditable; the aggregate bars above still include every case, including poor forecasts.
61
 
62
+ ![Observed, 1.1 and 1.2 routes on six selected best-performing examples](evaluation/trackformer_1_2_vs_1_1_route_examples.png)
63
 
64
  The 1.2 mean has better aggregate direction, shape and position scores on this previously inspected development cohort. That does not establish an overall win on every storm or pressure metric. A same-270 1.1 central-pressure prediction array was not verified in these route artifacts, so it is not assigned a pressure-error bar. The separate 1.2 report gives 15.73 hPa central-pressure MAE and 2.54 hPa area-weighted regional MSLP MAE. TIP remains a separate diagnostic: its pressure error was worse for 1.2 (30.7 vs 20.1 hPa). See [metric definitions and limitations](docs/trackformer_1_2_evaluation.md).
65
 
66
  ### Expanded daily-issue benchmark: 270 distinct typhoons
67
 
68
+ A new **1,473-case / 270-storm** benchmark is in progress; it is not the completed 270-case result above. Each storm contributes at most one forecast per UTC day, through +120 h. Daily errors are averaged within each storm, then the 270 storm scores receive equal weight. Selection was frozen before new inference, without filtering on forecast quality. See the [protocol](docs/daily_storm_benchmark.md) and [frozen cohort](evaluation/release_data/daily_storm_cohort.json). Results are pending; no improvement is claimed from the partial run.
 
 
 
 
 
 
 
 
69
 
70
+ ## Yagi pressure forecast — MP4
71
 
72
+ <video controls playsinline preload="metadata" width="100%" poster="https://huggingface.co/euler314/typhoon-predict/resolve/main/evaluation/trackformer_1_2_yagi_video_poster.png" src="https://huggingface.co/euler314/typhoon-predict/resolve/main/docs/trackformer_1_2_yagi.mp4"></video>
73
 
74
+ [![Play the Trackformer 1.2 Yagi pressure forecast MP4](evaluation/trackformer_1_2_yagi_video_poster.png)](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_yagi.mp4)
75
 
76
+ **[Play or download the Yagi MP4](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_yagi.mp4)** · 23 seconds · +6 to +120 h · **50-member mean**. Click the preview above to play it; inline video playback depends on the Markdown host.
77
 
78
+ The forecast starts **3 September 2024 at 00 UTC**. Actual saved model-generated pressure with **4 hPa isobars** is shown alongside the mean forecast route and observed best track, at matching valid times and on the same geographic map. Neither route nor field is shifted or rescaled to improve alignment. The central-pressure timeline compares the forecast to **JMA best-track pressure from IBTrACS TOKYO_PRES**, not a JMA forecast.
79
 
80
+ This deliberately selected good-route example has **114.1 km mean geographic error**, **57.2 km at +120 h**, and all 20 leads within 200 km. **Intensity is too weak: central-pressure MAE is 42.0 hPa.** Good route alignment does not imply good pressure prediction or typical performance. These geographic scores use exact observed coordinates and great-circle distances, separately from the saved local-coordinate benchmark scores above. Native-detail input history was unavailable; the regional pressure reconstruction uses 0.25° output sampling, not native resolution. Outside its dotted boundary only the saved coarse basin field is shown. [Data, source hashes and video provenance](evaluation/release_data/yagi_video.json).
81
 
82
  ### Architecture-only paper
83
 
84
+ The **[Trackformer 1.2 technical paper (PDF)](paper/trackformer.pdf)** describes only the detailed architecture and how forecasts work: input tensors, multiscale attention, recurrent basin transport, moving pressure core, centre association, physical pressure reconstruction, objectives and 50-member means. [Editable LaTeX source](paper/trackformer.tex). Benchmark results remain separate in the evaluation notes. Historical material is recoverable from Git history and the [1.1 release](https://github.com/yu314-coder/typhoon-predict/releases/tag/trackformer-1.1).
85
 
86
  ## Recent pressure forecast with isobars
87
 
88
  The archived **Surigae forecast issued 27 September 2026 at 12:00 UTC** shows the model's regional pressure field at +6, +24 and +36 h. Thin lines are isobars every **4 hPa**, with selected labels every 12 hPa; magenta shows the forecast track and centre. Coastlines provide geographic context. These panels use the actual saved model values.
89
 
90
+ ![Surigae model-generated pressure forecast with labelled isobars](evaluation/trackformer_1_2_surigae_isobars.png)
91
 
92
+ This recent example is **one deterministic forecast**, separate from the benchmark's mean of 50. Its input uses nine GFS analyses ending at 06 UTC, six hours before issue time; issue-time JMA central pressure was provided, while wind, prior motion and native regional history were unavailable. This transfer from the training data contract is experimental. The fixed regional map ends at 144°E; the selected leads keep the forecast centre inside it. The [pressure-field provenance](evaluation/release_data/surigae_provenance.json) records the input limitations and checkpoint hash.
93
 
94
  ## Get the model and run it
95
 
 
97
  - [Hugging Face weights and model card](https://huggingface.co/euler314/typhoon-predict)
98
  - [Input schema and inference instructions](models/trackformer_1_2_field/README.md)
99
 
100
+ The inference-only `weights.pt` is hosted in the release/Hugging Face model folder, **not committed to GitHub source**. The manifest records its SHA-256 and the original training-checkpoint SHA-256. The three source modules are copied unchanged from the verified training implementation. Use **`models/trackformer_1_2_field/predict.py`** as the inference entry point. The withdrawn route/scalar candidate and its incompatible example have been removed from the current source tree.
101
 
102
  Only issue-time and earlier analyses are permitted. The prediction wrapper rejects future-dated history and unexpected input keys, but cannot certify an externally built packet's data provenance. The operator must verify source timestamps and training-only normalization. The included wrapper runs one unperturbed forecast; it does not reproduce the saved 50-member mean automatically.
103
+
104
+ ## Repository guide
105
+
106
+ | Folder | Contents |
107
+ | --- | --- |
108
+ | [`models/trackformer_1_2_field/`](models/trackformer_1_2_field/) | Current 1.2 model, inference wrapper and input/provenance contract |
109
+ | [`paper/`](paper/) | Current architecture-only paper: editable source and PDF |
110
+ | [`evaluation/`](evaluation/) | Benchmark charts, selected forecast previews, metrics and saved plot data |
111
+ | [`docs/`](docs/) | Evaluation protocols and published HTML/MP4 showcases |
112
+ | [`release_tools/`](release_tools/) | Reproduction scripts and weight-export utility |
113
+
114
+ The older 1.1 implementation, obsolete Colab notebook, withdrawn candidate, and superseded comparison assets are no longer mixed into the current source tree. Their history and the existing release tags remain intact; the current 1.1-versus-1.2 comparison data are retained. See the [cleanup record](docs/repository_layout.md).
RELEASE_NOTES_TRACKFORMER_1_2.md CHANGED
@@ -1,6 +1,6 @@
1
  # Trackformer 1.2 — research candidate
2
 
3
- This release packages a verified moving-pressure-core model as **Trackformer 1.2**. It supersedes the withdrawn, unrelated route/scalar 1.2 candidate; the older root-level `trackformer_1_2.py` is not compatible with these field weights. Trackformer 1.1 remains available as a separate release.
4
 
5
  The attached archive includes inference-only weights, exact source modules, an input wrapper, a data-contract/provenance manifest, detailed documentation, **270-case direction/route-shape benchmark bars**, paired route examples and recent **Surigae pressure maps with labelled isobars**. The training checkpoint was internally labelled version `1.2.73`, epoch 4; its SHA-256 is `f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0`. The exported inference weights SHA-256 is `db49f36e85a3766defc4c172746897a1f783705d1ce8e6f9dfb8e87ae1d902cb`.
6
 
@@ -8,9 +8,7 @@ On the 270-case development cohort, 1.1 versus 1.2 mean-of-50 scores are: direct
8
 
9
  The route gallery now shows six explicitly selected best-performing examples from distinct storms, with the selection rule and all case scores supplied. It is not representative evidence; the aggregate bars retain all 270 cases. A separate larger benchmark has frozen **270 distinct storms / 1,473 daily issues**, with daily scores averaged per storm and storms weighted equally. Its forecasts are being computed; results are pending.
10
 
11
- The README preview now links to an interactive PRAPIROON pressure/route showcase with playback, lead selection, hover details and observed-track overlays. It uses actual saved 50-member mean pressure fields and a disclosed selected-best rule. The main paper has been replaced with an architecture-only Trackformer 1.2 description; the 1.1 source is preserved separately.
12
-
13
- A separate Bavi MP4 now shows the saved 50-member mean pressure and forecast route against observations through +120 h. The clickable README poster opens the video directly. Regional coverage, the coarse-field fallback and the observed pressure source are explicitly labelled; the paper is unchanged.
14
 
15
  The Surigae illustration is a single forecast issued 2026-09-27 12 UTC, with 4 hPa isobars at +6/+24/+36 h. It is separate from the 50-member historical benchmark. Reproduction data and metric definitions are included. The model weights are unchanged in this documentation revision.
16
 
 
1
  # Trackformer 1.2 — research candidate
2
 
3
+ This release packages a verified moving-pressure-core model as **Trackformer 1.2**. It supersedes the withdrawn, unrelated route/scalar 1.2 candidate. Use `models/trackformer_1_2_field/predict.py`; the incompatible root-level candidate and example are no longer in the current source tree. Trackformer 1.1 remains available as a separate release.
4
 
5
  The attached archive includes inference-only weights, exact source modules, an input wrapper, a data-contract/provenance manifest, detailed documentation, **270-case direction/route-shape benchmark bars**, paired route examples and recent **Surigae pressure maps with labelled isobars**. The training checkpoint was internally labelled version `1.2.73`, epoch 4; its SHA-256 is `f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0`. The exported inference weights SHA-256 is `db49f36e85a3766defc4c172746897a1f783705d1ce8e6f9dfb8e87ae1d902cb`.
6
 
 
8
 
9
  The route gallery now shows six explicitly selected best-performing examples from distinct storms, with the selection rule and all case scores supplied. It is not representative evidence; the aggregate bars retain all 270 cases. A separate larger benchmark has frozen **270 distinct storms / 1,473 daily issues**, with daily scores averaged per storm and storms weighted equally. Its forecasts are being computed; results are pending.
10
 
11
+ The README now shows a **Yagi MP4** in place of Bavi; the interactive PRAPIROON showcase has been removed. The Yagi forecast starts 3 September 2024 at 00 UTC and uses actual saved 50-member mean pressure fields and routes through +120 h. Geographic mean error is 114.1 km and +120 h error is 57.2 km, but central-pressure MAE is 42.0 hPa against JMA best track from IBTrACS. The video explicitly shows the intensity weakness. It is a selected good-route example, not typical skill. Regional coverage, missing native-detail history and observed pressure provenance are disclosed. The architecture-only paper and model weights are unchanged.
 
 
12
 
13
  The Surigae illustration is a single forecast issued 2026-09-27 12 UTC, with 4 hPa isobars at +6/+24/+36 h. It is separate from the 50-member historical benchmark. Reproduction data and metric definitions are included. The model weights are unchanged in this documentation revision.
14
 
docs/daily_storm_benchmark.md CHANGED
@@ -17,7 +17,7 @@ Direction error, route-shape similarity, Fréchet distance and path similarity r
17
  - The entire storm must lie outside the selected 1.2 checkpoint's 2000–2021 fitting and 2022–2023 validation years, with the history/target boundary also outside those years.
18
  - Issue centre within 0–60°N / 100–180°E; exact six-hour weather history through issue; complete route labels through +120 h; matching pressure-atlas coverage for scoring.
19
  - Use all eligible daily starts for each chosen storm. Never drop a case because its forecast looks poor.
20
- - [Cohort manifest](../paper/release_data/daily_storm_cohort.json) freezes rows, dates, storm IDs, source hashes and checkpoint identity before inference. Forecast artifacts are new; some recent storms overlap earlier development comparisons.
21
 
22
  Requiring complete five-day truth excludes short remaining lifetimes. This is a declared coverage limitation, not an all-storm operational sample. Historical cases are retrospective hindcasts from a model trained on later years; reanalysis and best-track issue states do not establish real-time data availability. This cohort has not been certified untouched across all earlier experiments.
23
 
 
17
  - The entire storm must lie outside the selected 1.2 checkpoint's 2000–2021 fitting and 2022–2023 validation years, with the history/target boundary also outside those years.
18
  - Issue centre within 0–60°N / 100–180°E; exact six-hour weather history through issue; complete route labels through +120 h; matching pressure-atlas coverage for scoring.
19
  - Use all eligible daily starts for each chosen storm. Never drop a case because its forecast looks poor.
20
+ - [Cohort manifest](../evaluation/release_data/daily_storm_cohort.json) freezes rows, dates, storm IDs, source hashes and checkpoint identity before inference. Forecast artifacts are new; some recent storms overlap earlier development comparisons.
21
 
22
  Requiring complete five-day truth excludes short remaining lifetimes. This is a declared coverage limitation, not an all-storm operational sample. Historical cases are retrospective hindcasts from a model trained on later years; reanalysis and best-track issue states do not establish real-time data availability. This cohort has not been certified untouched across all earlier experiments.
23
 
docs/repository_layout.md ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Current repository layout
2
+
3
+ The current source tree is focused on the selected pressure-field **Trackformer 1.2** release. The implementation remains at `models/trackformer_1_2_field/`; module filenames such as `v165_base.py` are required architecture dependencies, not unused legacy files. They and their source hashes have not been changed.
4
+
5
+ ## Cleanup on 29 September 2026
6
+
7
+ Removed from the current branch:
8
+
9
+ - The withdrawn route/scalar `trackformer_1_2.py` candidate and its incompatible `examples/predict_trackformer_1_2.py` entry point.
10
+ - Root-level 1.1 inference/route/intensity/temporal modules and their old analysis utility, plus `colab_train_v17.ipynb`.
11
+ - The old 1.1 paper and superseded 1.2.26/matched100 comparison assets.
12
+
13
+ Moved current benchmark figures, metrics and plot data from `paper/` into `evaluation/`, updating documentation and reproduction paths. `paper/trackformer.tex` and `paper/trackformer.pdf` stay at their existing locations. Published HTML and MP4 URLs under `docs/` stay unchanged.
14
+
15
+ The 1.1-versus-1.2 comparison arrays, TIP diagnostic, current paper, weights, model source hashes and release tags are retained. No local research checkpoints, running benchmark, Hugging Face files or historical release assets were deleted by this source-tree cleanup.
16
+
17
+ ## Recovery
18
+
19
+ The complete pre-cleanup repository remains in [commit 459a3d014aa4794652ceba3ecdffcde0beada2cd](https://github.com/yu314-coder/typhoon-predict/tree/459a3d014aa4794652ceba3ecdffcde0beada2cd). The [Trackformer 1.1 release](https://github.com/yu314-coder/typhoon-predict/releases/tag/trackformer-1.1) remains available. This cleanup does not rewrite Git history.
docs/trackformer_1_2_evaluation.md CHANGED
@@ -17,7 +17,7 @@ The main chart compares 270 issue cases from 90 storms and all 20 leads (+6 thro
17
  - **Path similarity:** calculate discrete Fréchet distance on the ordered 20-point forecast/truth curves, then `exp(-distance / observed path length)`, and average over cases. The observed length includes the step from the issue origin. Means: **0.498254 for 1.1; 0.572741 for 1.2**. This responds to geographic displacement as well as the curve.
18
  - **Position error:** mean Euclidean error in the saved benchmark's local-kilometre projection, **902.3001 vs 714.4444 km**. At +120 h it is **1,833.2481 vs 1,433.3863 km**. These are local-coordinate distances, not newly calculated geodesic distances.
19
 
20
- No combined weighted ranking is introduced. The route gallery shows six deliberately selected best-performing examples, one per distinct storm, not a representative sample. Eligibility requires an issue inside 0–60°N / 100–180°E, observed travel ≥300 km, 1.2 shape similarity ≥0.90, and direction error ≤30° on ≥18 common valid leads. Eligible cases are sorted by ascending 1.2 mean track error, then the first six distinct storms are selected. `paper/trackformer_1_2_showcase_selection.json` records the rule, chosen cases and scores for all 270 cases. Axes retain actual kilometre displacements; no route is moved or rotated to improve the visual comparison. Full-cohort bars are unchanged.
21
 
22
  The full 270 cohort includes cases beyond the intended Western Pacific model domain. Its aggregate is a legacy development comparison, not a basin-specific validation claim. The previously inspected 133-case subset is separate and is not substituted for the requested 270 cases.
23
 
@@ -31,21 +31,21 @@ No same-270 1.1 central-pressure prediction array was verified in the route arti
31
 
32
  ## Recent pressure-line example
33
 
34
- ### Interactive selected-best example
35
 
36
- The [interactive PRAPIROON map](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_pressure.html) uses the unchanged saved 50-member fields for case 151, issued 2024-07-19 00 UTC. It is selected by the lowest track error among four cases meeting the disclosed route-shape, heading, central-pressure and complete-map-coverage criteria. Its 133.2 km score is the existing benchmark local-coordinate mean; the UI's individual-lead position error is a great-circle distance to exact observed coordinates and is therefore a separately calculated diagnostic. The pressure MAE is 2.91 hPa. These are showcase results, not typical or new holdout performance.
37
 
38
- The page plays all twenty forecast leads, shows model and observed paths independently, and inspects physical mean pressure on the saved fixed grid. The observed path is taken directly from the storm's six-hour verification coordinates, not reconstructed from cumulative local displacements. Full-path observation overlays are retrospective verification and are never fed into inference. Data, hashes and the selection rule are in `paper/release_data/pressure_showcase.json` and the numerical data are in `pressure_showcase.npz`. Rebuild the standalone page and preview with `python release_tools/build_pressure_showcase.py`; no inference or GPU allocation is required to render saved outputs.
39
 
40
  ### Recent single-member example
41
 
42
  The Surigae archive issued **2026-09-27 12 UTC** supplies real model regional MSLP fields at +6, +24 and +36 h. Isobars are drawn every 4 hPa, with selected labels every 12 hPa and one common colour scale. The magenta curve is the saved model route. Fields are neither relocated nor altered to force the map minimum onto the route. The regional map is a resampled composite and can differ slightly from central pressure sampled in the moving core.
43
 
44
- This example is one deterministic member from the released checkpoint. Inputs contain nine GFS analyses ending at 06 UTC (six hours before issue), issue-time JMA centre/central pressure, and static geography. Issue-time wind, prior motion and native regional history were unavailable and masked/zeroed. The stored +0 field is an input analysis; it is excluded from these forecast panels. The GFS transfer and input lag remain limitations. The selected leads keep the centre within the fixed 114–144°E, 11–41°N map. Names, times, member count and checkpoint/source hashes are in `paper/release_data/surigae_provenance.json`.
45
 
46
  ## Reproduce the figures
47
 
48
- The public repository includes the small numerical plot inputs under `paper/release_data/`, including original 1.1 latitude/longitude, corrected routes, 1.2 mean routes, truth, the three pressure grids and map boundaries. After installing NumPy and Matplotlib, run:
49
 
50
  ```bash
51
  python release_tools/plot_release_270.py
 
17
  - **Path similarity:** calculate discrete Fréchet distance on the ordered 20-point forecast/truth curves, then `exp(-distance / observed path length)`, and average over cases. The observed length includes the step from the issue origin. Means: **0.498254 for 1.1; 0.572741 for 1.2**. This responds to geographic displacement as well as the curve.
18
  - **Position error:** mean Euclidean error in the saved benchmark's local-kilometre projection, **902.3001 vs 714.4444 km**. At +120 h it is **1,833.2481 vs 1,433.3863 km**. These are local-coordinate distances, not newly calculated geodesic distances.
19
 
20
+ No combined weighted ranking is introduced. The route gallery shows six deliberately selected best-performing examples, one per distinct storm, not a representative sample. Eligibility requires an issue inside 0–60°N / 100–180°E, observed travel ≥300 km, 1.2 shape similarity ≥0.90, and direction error ≤30° on ≥18 common valid leads. Eligible cases are sorted by ascending 1.2 mean track error, then the first six distinct storms are selected. `evaluation/trackformer_1_2_showcase_selection.json` records the rule, chosen cases and scores for all 270 cases. Axes retain actual kilometre displacements; no route is moved or rotated to improve the visual comparison. Full-cohort bars are unchanged.
21
 
22
  The full 270 cohort includes cases beyond the intended Western Pacific model domain. Its aggregate is a legacy development comparison, not a basin-specific validation claim. The previously inspected 133-case subset is separate and is not substituted for the requested 270 cases.
23
 
 
31
 
32
  ## Recent pressure-line example
33
 
34
+ ### Yagi MP4: selected good-route example
35
 
36
+ The [Yagi video](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_yagi.mp4) uses the unchanged saved 50-member pressure fields and mean route for case 178, issued 2024-09-03 00 UTC. It is a user-selected development example after inspection of geographic alignment, not an untouched test or a representative sample. The geographic mean error is 114.1 km, the +120 h error is 57.2 km, and maximum error is 193.7 km over 20 leads. These are great-circle distances to exact observed coordinates, separate from the main benchmark's saved local-coordinate scores.
37
 
38
+ The pressure MAE is **42.0 hPa** against IBTrACS TOKYO_PRES (JMA best track), with 20 valid labels. The model substantially underestimates intensity; good route alignment does not establish good pressure skill. The video retains the full pressure comparison. Fields are physical model means on fixed common grids, without shifting them onto the observed track. Native-detail history was unavailable for this issue; the regional reconstruction's 0.25° output sampling is not native resolution. Observed future routes and pressures are verification overlays only. [Data and provenance](../evaluation/release_data/yagi_video.json) record hashes and member policy. Reproduce with `python release_tools/build_yagi_video.py --work /path/to/frames` using NumPy, Matplotlib and ffmpeg with VideoToolbox on macOS; this renders saved outputs without model inference. The former interactive showcase has been removed.
39
 
40
  ### Recent single-member example
41
 
42
  The Surigae archive issued **2026-09-27 12 UTC** supplies real model regional MSLP fields at +6, +24 and +36 h. Isobars are drawn every 4 hPa, with selected labels every 12 hPa and one common colour scale. The magenta curve is the saved model route. Fields are neither relocated nor altered to force the map minimum onto the route. The regional map is a resampled composite and can differ slightly from central pressure sampled in the moving core.
43
 
44
+ This example is one deterministic member from the released checkpoint. Inputs contain nine GFS analyses ending at 06 UTC (six hours before issue), issue-time JMA centre/central pressure, and static geography. Issue-time wind, prior motion and native regional history were unavailable and masked/zeroed. The stored +0 field is an input analysis; it is excluded from these forecast panels. The GFS transfer and input lag remain limitations. The selected leads keep the centre within the fixed 114–144°E, 11–41°N map. Names, times, member count and checkpoint/source hashes are in `evaluation/release_data/surigae_provenance.json`.
45
 
46
  ## Reproduce the figures
47
 
48
+ The public repository includes the small numerical plot inputs under `evaluation/release_data/`, including original 1.1 latitude/longitude, corrected routes, 1.2 mean routes, truth, the three pressure grids and map boundaries. After installing NumPy and Matplotlib, run:
49
 
50
  ```bash
51
  python release_tools/plot_release_270.py
docs/trackformer_1_2_pressure.html DELETED
The diff for this file is too large to render. See raw diff
 
docs/{trackformer_1_2_bavi.mp4 → trackformer_1_2_yagi.mp4} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:33ecd068f1eee144b10301d6261dfad673557b2b38050e159e39935cccc3872c
3
- size 7501391
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:542172829ec361e55e3f8e7c04436c59e575ac70d756759d8bf5596bf4fffb1a
3
+ size 7933310
evaluation/README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation assets
2
+
3
+ This directory holds the current published comparison figures, metrics, selected forecast previews and the numerical inputs under [`release_data/`](release_data/). The architecture paper is separate in [`../paper/`](../paper/).
4
+
5
+ - [270-case comparison and definitions](../docs/trackformer_1_2_evaluation.md): 270 issue times from 90 storms; the 1.2 output is a 50-member input-perturbation mean.
6
+ - [Expanded daily-issue protocol](../docs/daily_storm_benchmark.md): 1,473 daily issues from 270 storms; results are not implied by the existing 270-case charts.
7
+ - [TIP diagnostic](trackformer_1_2_vs_1_1_tip_metrics.json): retain pressure regressions as well as improvements.
8
+ - [Showcase selection](trackformer_1_2_showcase_selection.json): deliberately selected examples, not typical performance or untouched validation.
9
+
10
+ For geographically aligned routes, use errors between forecasts and observations at the **same valid times on the same map**. Centred/scale-normalized shape similarity alone cannot establish alignment. Never translate, rotate or rescale a forecast to make it match the observed route.
11
+
12
+ From the repository root, reproduce the 270-case figures and Surigae isobars using `python release_tools/plot_release_270.py`. The script defaults to this directory and uses its saved plot inputs; it does not run model inference. Rendering requires NumPy and Matplotlib. The [Yagi video builder](../release_tools/build_yagi_video.py) likewise uses saved model fields, not synthetic illustrations. Its [provenance](release_data/yagi_video.json) reports geographic route alignment separately from pressure error.
evaluation/release_data/cohort_270.json ADDED
@@ -0,0 +1,1391 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "case_count": 270,
3
+ "storm_count": 90,
4
+ "cases": [
5
+ {
6
+ "storm_id": "2022096N03150",
7
+ "issue_time_utc": "2022-04-08T06:00:00Z",
8
+ "source_row": 178540
9
+ },
10
+ {
11
+ "storm_id": "2022096N03150",
12
+ "issue_time_utc": "2022-04-11T00:00:00Z",
13
+ "source_row": 178562
14
+ },
15
+ {
16
+ "storm_id": "2022096N03150",
17
+ "issue_time_utc": "2022-04-13T00:00:00Z",
18
+ "source_row": 178578
19
+ },
20
+ {
21
+ "storm_id": "2022167N11269",
22
+ "issue_time_utc": "2022-06-18T00:00:00Z",
23
+ "source_row": 178867
24
+ },
25
+ {
26
+ "storm_id": "2022167N11269",
27
+ "issue_time_utc": "2022-06-22T00:00:00Z",
28
+ "source_row": 178899
29
+ },
30
+ {
31
+ "storm_id": "2022167N11269",
32
+ "issue_time_utc": "2022-06-25T00:00:00Z",
33
+ "source_row": 178923
34
+ },
35
+ {
36
+ "storm_id": "2022179N08310",
37
+ "issue_time_utc": "2022-06-29T18:00:00Z",
38
+ "source_row": 178960
39
+ },
40
+ {
41
+ "storm_id": "2022179N08310",
42
+ "issue_time_utc": "2022-07-03T00:00:00Z",
43
+ "source_row": 178986
44
+ },
45
+ {
46
+ "storm_id": "2022179N08310",
47
+ "issue_time_utc": "2022-07-06T00:00:00Z",
48
+ "source_row": 179010
49
+ },
50
+ {
51
+ "storm_id": "2022180N15117",
52
+ "issue_time_utc": "2022-06-30T18:00:00Z",
53
+ "source_row": 179043
54
+ },
55
+ {
56
+ "storm_id": "2022180N15117",
57
+ "issue_time_utc": "2022-07-01T00:00:00Z",
58
+ "source_row": 179045
59
+ },
60
+ {
61
+ "storm_id": "2022180N15117",
62
+ "issue_time_utc": "2022-07-02T00:00:00Z",
63
+ "source_row": 179055
64
+ },
65
+ {
66
+ "storm_id": "2022180N15130",
67
+ "issue_time_utc": "2022-07-01T00:00:00Z",
68
+ "source_row": 179096
69
+ },
70
+ {
71
+ "storm_id": "2022180N15130",
72
+ "issue_time_utc": "2022-07-04T00:00:00Z",
73
+ "source_row": 179121
74
+ },
75
+ {
76
+ "storm_id": "2022180N15130",
77
+ "issue_time_utc": "2022-07-06T00:00:00Z",
78
+ "source_row": 179138
79
+ },
80
+ {
81
+ "storm_id": "2022197N12260",
82
+ "issue_time_utc": "2022-07-17T12:00:00Z",
83
+ "source_row": 179208
84
+ },
85
+ {
86
+ "storm_id": "2022197N12260",
87
+ "issue_time_utc": "2022-07-18T00:00:00Z",
88
+ "source_row": 179212
89
+ },
90
+ {
91
+ "storm_id": "2022197N12260",
92
+ "issue_time_utc": "2022-07-19T00:00:00Z",
93
+ "source_row": 179220
94
+ },
95
+ {
96
+ "storm_id": "2022207N11262",
97
+ "issue_time_utc": "2022-07-27T12:00:00Z",
98
+ "source_row": 179253
99
+ },
100
+ {
101
+ "storm_id": "2022207N11262",
102
+ "issue_time_utc": "2022-07-29T00:00:00Z",
103
+ "source_row": 179265
104
+ },
105
+ {
106
+ "storm_id": "2022207N11262",
107
+ "issue_time_utc": "2022-07-30T00:00:00Z",
108
+ "source_row": 179273
109
+ },
110
+ {
111
+ "storm_id": "2022209N16246",
112
+ "issue_time_utc": "2022-07-29T12:00:00Z",
113
+ "source_row": 179354
114
+ },
115
+ {
116
+ "storm_id": "2022209N16246",
117
+ "issue_time_utc": "2022-07-30T00:00:00Z",
118
+ "source_row": 179358
119
+ },
120
+ {
121
+ "storm_id": "2022209N16246",
122
+ "issue_time_utc": "2022-07-31T00:00:00Z",
123
+ "source_row": 179366
124
+ },
125
+ {
126
+ "storm_id": "2022225N15253",
127
+ "issue_time_utc": "2022-08-14T12:00:00Z",
128
+ "source_row": 179481
129
+ },
130
+ {
131
+ "storm_id": "2022225N15253",
132
+ "issue_time_utc": "2022-08-16T00:00:00Z",
133
+ "source_row": 179493
134
+ },
135
+ {
136
+ "storm_id": "2022225N15253",
137
+ "issue_time_utc": "2022-08-17T00:00:00Z",
138
+ "source_row": 179501
139
+ },
140
+ {
141
+ "storm_id": "2022239N22150",
142
+ "issue_time_utc": "2022-08-29T00:00:00Z",
143
+ "source_row": 179613
144
+ },
145
+ {
146
+ "storm_id": "2022239N22150",
147
+ "issue_time_utc": "2022-09-01T00:00:00Z",
148
+ "source_row": 179637
149
+ },
150
+ {
151
+ "storm_id": "2022239N22150",
152
+ "issue_time_utc": "2022-09-04T00:00:00Z",
153
+ "source_row": 179661
154
+ },
155
+ {
156
+ "storm_id": "2022244N38313",
157
+ "issue_time_utc": "2022-09-02T12:00:00Z",
158
+ "source_row": 179723
159
+ },
160
+ {
161
+ "storm_id": "2022244N38313",
162
+ "issue_time_utc": "2022-09-06T00:00:00Z",
163
+ "source_row": 179751
164
+ },
165
+ {
166
+ "storm_id": "2022244N38313",
167
+ "issue_time_utc": "2022-09-10T00:00:00Z",
168
+ "source_row": 179783
169
+ },
170
+ {
171
+ "storm_id": "2022246N18301",
172
+ "issue_time_utc": "2022-09-04T18:00:00Z",
173
+ "source_row": 179822
174
+ },
175
+ {
176
+ "storm_id": "2022246N18301",
177
+ "issue_time_utc": "2022-09-07T00:00:00Z",
178
+ "source_row": 179840
179
+ },
180
+ {
181
+ "storm_id": "2022246N18301",
182
+ "issue_time_utc": "2022-09-10T00:00:00Z",
183
+ "source_row": 179864
184
+ },
185
+ {
186
+ "storm_id": "2022247N26147",
187
+ "issue_time_utc": "2022-09-05T18:00:00Z",
188
+ "source_row": 179901
189
+ },
190
+ {
191
+ "storm_id": "2022247N26147",
192
+ "issue_time_utc": "2022-09-09T00:00:00Z",
193
+ "source_row": 179927
194
+ },
195
+ {
196
+ "storm_id": "2022247N26147",
197
+ "issue_time_utc": "2022-09-12T00:00:00Z",
198
+ "source_row": 179951
199
+ },
200
+ {
201
+ "storm_id": "2022248N14259",
202
+ "issue_time_utc": "2022-09-06T12:00:00Z",
203
+ "source_row": 179984
204
+ },
205
+ {
206
+ "storm_id": "2022248N14259",
207
+ "issue_time_utc": "2022-09-07T00:00:00Z",
208
+ "source_row": 179988
209
+ },
210
+ {
211
+ "storm_id": "2022248N14259",
212
+ "issue_time_utc": "2022-09-08T00:00:00Z",
213
+ "source_row": 179996
214
+ },
215
+ {
216
+ "storm_id": "2022254N21158",
217
+ "issue_time_utc": "2022-09-12T12:00:00Z",
218
+ "source_row": 180030
219
+ },
220
+ {
221
+ "storm_id": "2022254N21158",
222
+ "issue_time_utc": "2022-09-13T00:00:00Z",
223
+ "source_row": 180034
224
+ },
225
+ {
226
+ "storm_id": "2022254N21158",
227
+ "issue_time_utc": "2022-09-14T00:00:00Z",
228
+ "source_row": 180042
229
+ },
230
+ {
231
+ "storm_id": "2022254N24143",
232
+ "issue_time_utc": "2022-09-13T06:00:00Z",
233
+ "source_row": 180081
234
+ },
235
+ {
236
+ "storm_id": "2022254N24143",
237
+ "issue_time_utc": "2022-09-14T00:00:00Z",
238
+ "source_row": 180087
239
+ },
240
+ {
241
+ "storm_id": "2022254N24143",
242
+ "issue_time_utc": "2022-09-15T00:00:00Z",
243
+ "source_row": 180095
244
+ },
245
+ {
246
+ "storm_id": "2022255N16256",
247
+ "issue_time_utc": "2022-09-13T12:00:00Z",
248
+ "source_row": 180133
249
+ },
250
+ {
251
+ "storm_id": "2022255N16256",
252
+ "issue_time_utc": "2022-09-17T00:00:00Z",
253
+ "source_row": 180161
254
+ },
255
+ {
256
+ "storm_id": "2022255N16256",
257
+ "issue_time_utc": "2022-09-20T00:00:00Z",
258
+ "source_row": 180185
259
+ },
260
+ {
261
+ "storm_id": "2022257N16312",
262
+ "issue_time_utc": "2022-09-16T06:00:00Z",
263
+ "source_row": 180218
264
+ },
265
+ {
266
+ "storm_id": "2022257N16312",
267
+ "issue_time_utc": "2022-09-19T00:00:00Z",
268
+ "source_row": 180242
269
+ },
270
+ {
271
+ "storm_id": "2022257N16312",
272
+ "issue_time_utc": "2022-09-22T00:00:00Z",
273
+ "source_row": 180268
274
+ },
275
+ {
276
+ "storm_id": "2022266N12294",
277
+ "issue_time_utc": "2022-09-24T18:00:00Z",
278
+ "source_row": 180471
279
+ },
280
+ {
281
+ "storm_id": "2022266N12294",
282
+ "issue_time_utc": "2022-09-25T00:00:00Z",
283
+ "source_row": 180473
284
+ },
285
+ {
286
+ "storm_id": "2022266N12294",
287
+ "issue_time_utc": "2022-09-26T00:00:00Z",
288
+ "source_row": 180481
289
+ },
290
+ {
291
+ "storm_id": "2022270N14136",
292
+ "issue_time_utc": "2022-09-28T12:00:00Z",
293
+ "source_row": 180574
294
+ },
295
+ {
296
+ "storm_id": "2022270N14136",
297
+ "issue_time_utc": "2022-09-29T00:00:00Z",
298
+ "source_row": 180578
299
+ },
300
+ {
301
+ "storm_id": "2022270N14136",
302
+ "issue_time_utc": "2022-09-30T00:00:00Z",
303
+ "source_row": 180586
304
+ },
305
+ {
306
+ "storm_id": "2022284N15152",
307
+ "issue_time_utc": "2022-10-13T06:00:00Z",
308
+ "source_row": 180720
309
+ },
310
+ {
311
+ "storm_id": "2022284N15152",
312
+ "issue_time_utc": "2022-10-14T00:00:00Z",
313
+ "source_row": 180726
314
+ },
315
+ {
316
+ "storm_id": "2022284N15152",
317
+ "issue_time_utc": "2022-10-15T00:00:00Z",
318
+ "source_row": 180734
319
+ },
320
+ {
321
+ "storm_id": "2023138N05151",
322
+ "issue_time_utc": "2023-05-20T00:00:00Z",
323
+ "source_row": 182572
324
+ },
325
+ {
326
+ "storm_id": "2023138N05151",
327
+ "issue_time_utc": "2023-05-25T00:00:00Z",
328
+ "source_row": 182612
329
+ },
330
+ {
331
+ "storm_id": "2023138N05151",
332
+ "issue_time_utc": "2023-05-29T00:00:00Z",
333
+ "source_row": 182644
334
+ },
335
+ {
336
+ "storm_id": "2023156N12135",
337
+ "issue_time_utc": "2023-06-06T18:00:00Z",
338
+ "source_row": 182775
339
+ },
340
+ {
341
+ "storm_id": "2023156N12135",
342
+ "issue_time_utc": "2023-06-09T00:00:00Z",
343
+ "source_row": 182793
344
+ },
345
+ {
346
+ "storm_id": "2023156N12135",
347
+ "issue_time_utc": "2023-06-12T00:00:00Z",
348
+ "source_row": 182817
349
+ },
350
+ {
351
+ "storm_id": "2023156N10067",
352
+ "issue_time_utc": "2023-06-07T00:00:00Z",
353
+ "source_row": 182686
354
+ },
355
+ {
356
+ "storm_id": "2023156N10067",
357
+ "issue_time_utc": "2023-06-11T00:00:00Z",
358
+ "source_row": 182718
359
+ },
360
+ {
361
+ "storm_id": "2023156N10067",
362
+ "issue_time_utc": "2023-06-14T00:00:00Z",
363
+ "source_row": 182742
364
+ },
365
+ {
366
+ "storm_id": "2023191N10262",
367
+ "issue_time_utc": "2023-07-12T06:00:00Z",
368
+ "source_row": 182916
369
+ },
370
+ {
371
+ "storm_id": "2023191N10262",
372
+ "issue_time_utc": "2023-07-13T00:00:00Z",
373
+ "source_row": 182922
374
+ },
375
+ {
376
+ "storm_id": "2023191N10262",
377
+ "issue_time_utc": "2023-07-14T00:00:00Z",
378
+ "source_row": 182930
379
+ },
380
+ {
381
+ "storm_id": "2023193N37305",
382
+ "issue_time_utc": "2023-07-13T12:00:00Z",
383
+ "source_row": 182969
384
+ },
385
+ {
386
+ "storm_id": "2023193N37305",
387
+ "issue_time_utc": "2023-07-17T00:00:00Z",
388
+ "source_row": 182997
389
+ },
390
+ {
391
+ "storm_id": "2023193N37305",
392
+ "issue_time_utc": "2023-07-20T00:00:00Z",
393
+ "source_row": 183021
394
+ },
395
+ {
396
+ "storm_id": "2023201N13134",
397
+ "issue_time_utc": "2023-07-22T06:00:00Z",
398
+ "source_row": 183101
399
+ },
400
+ {
401
+ "storm_id": "2023201N13134",
402
+ "issue_time_utc": "2023-07-24T00:00:00Z",
403
+ "source_row": 183115
404
+ },
405
+ {
406
+ "storm_id": "2023201N13134",
407
+ "issue_time_utc": "2023-07-26T00:00:00Z",
408
+ "source_row": 183131
409
+ },
410
+ {
411
+ "storm_id": "2023207N09141",
412
+ "issue_time_utc": "2023-07-28T06:00:00Z",
413
+ "source_row": 183164
414
+ },
415
+ {
416
+ "storm_id": "2023207N09141",
417
+ "issue_time_utc": "2023-08-02T00:00:00Z",
418
+ "source_row": 183202
419
+ },
420
+ {
421
+ "storm_id": "2023207N09141",
422
+ "issue_time_utc": "2023-08-06T00:00:00Z",
423
+ "source_row": 183234
424
+ },
425
+ {
426
+ "storm_id": "2023213N14257",
427
+ "issue_time_utc": "2023-08-02T12:00:00Z",
428
+ "source_row": 183280
429
+ },
430
+ {
431
+ "storm_id": "2023213N14257",
432
+ "issue_time_utc": "2023-08-10T00:00:00Z",
433
+ "source_row": 183340
434
+ },
435
+ {
436
+ "storm_id": "2023213N14257",
437
+ "issue_time_utc": "2023-08-17T00:00:00Z",
438
+ "source_row": 183396
439
+ },
440
+ {
441
+ "storm_id": "2023218N25145",
442
+ "issue_time_utc": "2023-08-08T00:00:00Z",
443
+ "source_row": 183452
444
+ },
445
+ {
446
+ "storm_id": "2023218N25145",
447
+ "issue_time_utc": "2023-08-11T00:00:00Z",
448
+ "source_row": 183476
449
+ },
450
+ {
451
+ "storm_id": "2023218N25145",
452
+ "issue_time_utc": "2023-08-13T00:00:00Z",
453
+ "source_row": 183492
454
+ },
455
+ {
456
+ "storm_id": "2023225N14248",
457
+ "issue_time_utc": "2023-08-14T12:00:00Z",
458
+ "source_row": 183531
459
+ },
460
+ {
461
+ "storm_id": "2023225N14248",
462
+ "issue_time_utc": "2023-08-17T00:00:00Z",
463
+ "source_row": 183551
464
+ },
465
+ {
466
+ "storm_id": "2023225N14248",
467
+ "issue_time_utc": "2023-08-19T00:00:00Z",
468
+ "source_row": 183567
469
+ },
470
+ {
471
+ "storm_id": "2023231N15313",
472
+ "issue_time_utc": "2023-08-21T00:00:00Z",
473
+ "source_row": 183633
474
+ },
475
+ {
476
+ "storm_id": "2023231N15313",
477
+ "issue_time_utc": "2023-08-26T00:00:00Z",
478
+ "source_row": 183673
479
+ },
480
+ {
481
+ "storm_id": "2023231N15313",
482
+ "issue_time_utc": "2023-08-30T00:00:00Z",
483
+ "source_row": 183705
484
+ },
485
+ {
486
+ "storm_id": "2023232N13300",
487
+ "issue_time_utc": "2023-08-21T18:00:00Z",
488
+ "source_row": 183773
489
+ },
490
+ {
491
+ "storm_id": "2023232N13300",
492
+ "issue_time_utc": "2023-08-28T00:00:00Z",
493
+ "source_row": 183824
494
+ },
495
+ {
496
+ "storm_id": "2023232N13300",
497
+ "issue_time_utc": "2023-09-04T00:00:00Z",
498
+ "source_row": 183880
499
+ },
500
+ {
501
+ "storm_id": "2023234N19154",
502
+ "issue_time_utc": "2023-08-23T12:00:00Z",
503
+ "source_row": 184026
504
+ },
505
+ {
506
+ "storm_id": "2023234N19154",
507
+ "issue_time_utc": "2023-08-24T00:00:00Z",
508
+ "source_row": 184030
509
+ },
510
+ {
511
+ "storm_id": "2023234N19154",
512
+ "issue_time_utc": "2023-08-25T00:00:00Z",
513
+ "source_row": 184038
514
+ },
515
+ {
516
+ "storm_id": "2023234N18128",
517
+ "issue_time_utc": "2023-08-24T00:00:00Z",
518
+ "source_row": 183919
519
+ },
520
+ {
521
+ "storm_id": "2023234N18128",
522
+ "issue_time_utc": "2023-08-27T00:00:00Z",
523
+ "source_row": 183943
524
+ },
525
+ {
526
+ "storm_id": "2023234N18128",
527
+ "issue_time_utc": "2023-08-30T00:00:00Z",
528
+ "source_row": 183967
529
+ },
530
+ {
531
+ "storm_id": "2023239N21274",
532
+ "issue_time_utc": "2023-08-28T12:00:00Z",
533
+ "source_row": 184203
534
+ },
535
+ {
536
+ "storm_id": "2023239N21274",
537
+ "issue_time_utc": "2023-08-31T00:00:00Z",
538
+ "source_row": 184224
539
+ },
540
+ {
541
+ "storm_id": "2023239N21274",
542
+ "issue_time_utc": "2023-09-03T00:00:00Z",
543
+ "source_row": 184248
544
+ },
545
+ {
546
+ "storm_id": "2023239N18144",
547
+ "issue_time_utc": "2023-08-29T00:00:00Z",
548
+ "source_row": 184110
549
+ },
550
+ {
551
+ "storm_id": "2023239N18144",
552
+ "issue_time_utc": "2023-09-02T00:00:00Z",
553
+ "source_row": 184142
554
+ },
555
+ {
556
+ "storm_id": "2023239N18144",
557
+ "issue_time_utc": "2023-09-05T00:00:00Z",
558
+ "source_row": 184166
559
+ },
560
+ {
561
+ "storm_id": "2023241N10158",
562
+ "issue_time_utc": "2023-08-31T00:00:00Z",
563
+ "source_row": 184283
564
+ },
565
+ {
566
+ "storm_id": "2023241N10158",
567
+ "issue_time_utc": "2023-09-01T00:00:00Z",
568
+ "source_row": 184291
569
+ },
570
+ {
571
+ "storm_id": "2023241N10158",
572
+ "issue_time_utc": "2023-09-02T00:00:00Z",
573
+ "source_row": 184299
574
+ },
575
+ {
576
+ "storm_id": "2023242N15339",
577
+ "issue_time_utc": "2023-09-01T00:00:00Z",
578
+ "source_row": 184343
579
+ },
580
+ {
581
+ "storm_id": "2023242N15339",
582
+ "issue_time_utc": "2023-09-06T00:00:00Z",
583
+ "source_row": 184383
584
+ },
585
+ {
586
+ "storm_id": "2023242N15339",
587
+ "issue_time_utc": "2023-09-10T00:00:00Z",
588
+ "source_row": 184415
589
+ },
590
+ {
591
+ "storm_id": "2023248N12257",
592
+ "issue_time_utc": "2023-09-06T12:00:00Z",
593
+ "source_row": 184471
594
+ },
595
+ {
596
+ "storm_id": "2023248N12257",
597
+ "issue_time_utc": "2023-09-08T00:00:00Z",
598
+ "source_row": 184483
599
+ },
600
+ {
601
+ "storm_id": "2023248N12257",
602
+ "issue_time_utc": "2023-09-09T00:00:00Z",
603
+ "source_row": 184491
604
+ },
605
+ {
606
+ "storm_id": "2023249N12320",
607
+ "issue_time_utc": "2023-09-07T12:00:00Z",
608
+ "source_row": 184524
609
+ },
610
+ {
611
+ "storm_id": "2023249N12320",
612
+ "issue_time_utc": "2023-09-10T00:00:00Z",
613
+ "source_row": 184544
614
+ },
615
+ {
616
+ "storm_id": "2023249N12320",
617
+ "issue_time_utc": "2023-09-13T00:00:00Z",
618
+ "source_row": 184568
619
+ },
620
+ {
621
+ "storm_id": "2023251N16334",
622
+ "issue_time_utc": "2023-09-09T12:00:00Z",
623
+ "source_row": 184608
624
+ },
625
+ {
626
+ "storm_id": "2023251N16334",
627
+ "issue_time_utc": "2023-09-11T00:00:00Z",
628
+ "source_row": 184620
629
+ },
630
+ {
631
+ "storm_id": "2023251N16334",
632
+ "issue_time_utc": "2023-09-13T00:00:00Z",
633
+ "source_row": 184636
634
+ },
635
+ {
636
+ "storm_id": "2023258N14318",
637
+ "issue_time_utc": "2023-09-17T06:00:00Z",
638
+ "source_row": 184675
639
+ },
640
+ {
641
+ "storm_id": "2023258N14318",
642
+ "issue_time_utc": "2023-09-19T00:00:00Z",
643
+ "source_row": 184689
644
+ },
645
+ {
646
+ "storm_id": "2023258N14318",
647
+ "issue_time_utc": "2023-09-21T00:00:00Z",
648
+ "source_row": 184705
649
+ },
650
+ {
651
+ "storm_id": "2023266N16323",
652
+ "issue_time_utc": "2023-09-25T06:00:00Z",
653
+ "source_row": 184784
654
+ },
655
+ {
656
+ "storm_id": "2023266N16323",
657
+ "issue_time_utc": "2023-09-28T00:00:00Z",
658
+ "source_row": 184806
659
+ },
660
+ {
661
+ "storm_id": "2023266N16323",
662
+ "issue_time_utc": "2023-10-01T00:00:00Z",
663
+ "source_row": 184830
664
+ },
665
+ {
666
+ "storm_id": "2023271N14144",
667
+ "issue_time_utc": "2023-09-29T12:00:00Z",
668
+ "source_row": 184875
669
+ },
670
+ {
671
+ "storm_id": "2023271N14144",
672
+ "issue_time_utc": "2023-10-02T00:00:00Z",
673
+ "source_row": 184895
674
+ },
675
+ {
676
+ "storm_id": "2023271N14144",
677
+ "issue_time_utc": "2023-10-05T00:00:00Z",
678
+ "source_row": 184919
679
+ },
680
+ {
681
+ "storm_id": "2023279N08157",
682
+ "issue_time_utc": "2023-10-08T00:00:00Z",
683
+ "source_row": 185020
684
+ },
685
+ {
686
+ "storm_id": "2023279N08157",
687
+ "issue_time_utc": "2023-10-10T00:00:00Z",
688
+ "source_row": 185036
689
+ },
690
+ {
691
+ "storm_id": "2023279N08157",
692
+ "issue_time_utc": "2023-10-11T00:00:00Z",
693
+ "source_row": 185044
694
+ },
695
+ {
696
+ "storm_id": "2023292N13309",
697
+ "issue_time_utc": "2023-10-20T18:00:00Z",
698
+ "source_row": 185172
699
+ },
700
+ {
701
+ "storm_id": "2023292N13309",
702
+ "issue_time_utc": "2023-10-23T00:00:00Z",
703
+ "source_row": 185191
704
+ },
705
+ {
706
+ "storm_id": "2023292N13309",
707
+ "issue_time_utc": "2023-10-26T00:00:00Z",
708
+ "source_row": 185215
709
+ },
710
+ {
711
+ "storm_id": "2023302N10267",
712
+ "issue_time_utc": "2023-10-30T12:00:00Z",
713
+ "source_row": 185325
714
+ },
715
+ {
716
+ "storm_id": "2023302N10267",
717
+ "issue_time_utc": "2023-11-01T00:00:00Z",
718
+ "source_row": 185337
719
+ },
720
+ {
721
+ "storm_id": "2023302N10267",
722
+ "issue_time_utc": "2023-11-02T00:00:00Z",
723
+ "source_row": 185345
724
+ },
725
+ {
726
+ "storm_id": "2024141N03142",
727
+ "issue_time_utc": "2024-05-22T00:00:00Z",
728
+ "source_row": 186747
729
+ },
730
+ {
731
+ "storm_id": "2024141N03142",
732
+ "issue_time_utc": "2024-05-25T00:00:00Z",
733
+ "source_row": 186771
734
+ },
735
+ {
736
+ "storm_id": "2024141N03142",
737
+ "issue_time_utc": "2024-05-28T00:00:00Z",
738
+ "source_row": 186795
739
+ },
740
+ {
741
+ "storm_id": "2024181N09320",
742
+ "issue_time_utc": "2024-06-30T12:00:00Z",
743
+ "source_row": 186875
744
+ },
745
+ {
746
+ "storm_id": "2024181N09320",
747
+ "issue_time_utc": "2024-07-03T00:00:00Z",
748
+ "source_row": 186897
749
+ },
750
+ {
751
+ "storm_id": "2024181N09320",
752
+ "issue_time_utc": "2024-07-06T00:00:00Z",
753
+ "source_row": 186922
754
+ },
755
+ {
756
+ "storm_id": "2024198N08130",
757
+ "issue_time_utc": "2024-07-17T12:00:00Z",
758
+ "source_row": 186961
759
+ },
760
+ {
761
+ "storm_id": "2024198N08130",
762
+ "issue_time_utc": "2024-07-19T00:00:00Z",
763
+ "source_row": 186973
764
+ },
765
+ {
766
+ "storm_id": "2024198N08130",
767
+ "issue_time_utc": "2024-07-20T00:00:00Z",
768
+ "source_row": 186981
769
+ },
770
+ {
771
+ "storm_id": "2024201N12133",
772
+ "issue_time_utc": "2024-07-21T00:00:00Z",
773
+ "source_row": 187016
774
+ },
775
+ {
776
+ "storm_id": "2024201N12133",
777
+ "issue_time_utc": "2024-07-22T00:00:00Z",
778
+ "source_row": 187024
779
+ },
780
+ {
781
+ "storm_id": "2024201N12133",
782
+ "issue_time_utc": "2024-07-23T00:00:00Z",
783
+ "source_row": 187032
784
+ },
785
+ {
786
+ "storm_id": "2024218N23143",
787
+ "issue_time_utc": "2024-08-07T00:00:00Z",
788
+ "source_row": 187195
789
+ },
790
+ {
791
+ "storm_id": "2024218N23143",
792
+ "issue_time_utc": "2024-08-08T00:00:00Z",
793
+ "source_row": 187203
794
+ },
795
+ {
796
+ "storm_id": "2024218N23143",
797
+ "issue_time_utc": "2024-08-09T00:00:00Z",
798
+ "source_row": 187211
799
+ },
800
+ {
801
+ "storm_id": "2024225N14313",
802
+ "issue_time_utc": "2024-08-13T18:00:00Z",
803
+ "source_row": 187290
804
+ },
805
+ {
806
+ "storm_id": "2024225N14313",
807
+ "issue_time_utc": "2024-08-14T00:00:00Z",
808
+ "source_row": 187293
809
+ },
810
+ {
811
+ "storm_id": "2024225N14313",
812
+ "issue_time_utc": "2024-08-15T00:00:00Z",
813
+ "source_row": 187301
814
+ },
815
+ {
816
+ "storm_id": "2024225N22135",
817
+ "issue_time_utc": "2024-08-13T12:00:00Z",
818
+ "source_row": 187341
819
+ },
820
+ {
821
+ "storm_id": "2024225N22135",
822
+ "issue_time_utc": "2024-08-15T00:00:00Z",
823
+ "source_row": 187353
824
+ },
825
+ {
826
+ "storm_id": "2024225N22135",
827
+ "issue_time_utc": "2024-08-16T00:00:00Z",
828
+ "source_row": 187361
829
+ },
830
+ {
831
+ "storm_id": "2024231N14251",
832
+ "issue_time_utc": "2024-08-20T06:00:00Z",
833
+ "source_row": 187435
834
+ },
835
+ {
836
+ "storm_id": "2024231N14251",
837
+ "issue_time_utc": "2024-08-22T00:00:00Z",
838
+ "source_row": 187449
839
+ },
840
+ {
841
+ "storm_id": "2024231N14251",
842
+ "issue_time_utc": "2024-08-24T00:00:00Z",
843
+ "source_row": 187465
844
+ },
845
+ {
846
+ "storm_id": "2024233N15148",
847
+ "issue_time_utc": "2024-08-22T06:00:00Z",
848
+ "source_row": 187517
849
+ },
850
+ {
851
+ "storm_id": "2024233N15148",
852
+ "issue_time_utc": "2024-08-25T00:00:00Z",
853
+ "source_row": 187539
854
+ },
855
+ {
856
+ "storm_id": "2024233N15148",
857
+ "issue_time_utc": "2024-08-27T00:00:00Z",
858
+ "source_row": 187555
859
+ },
860
+ {
861
+ "storm_id": "2024235N16223",
862
+ "issue_time_utc": "2024-08-24T00:00:00Z",
863
+ "source_row": 187595
864
+ },
865
+ {
866
+ "storm_id": "2024235N16223",
867
+ "issue_time_utc": "2024-08-26T00:00:00Z",
868
+ "source_row": 187611
869
+ },
870
+ {
871
+ "storm_id": "2024235N16223",
872
+ "issue_time_utc": "2024-08-27T00:00:00Z",
873
+ "source_row": 187619
874
+ },
875
+ {
876
+ "storm_id": "2024238N25077",
877
+ "issue_time_utc": "2024-08-27T00:00:00Z",
878
+ "source_row": 187681
879
+ },
880
+ {
881
+ "storm_id": "2024238N25077",
882
+ "issue_time_utc": "2024-08-28T00:00:00Z",
883
+ "source_row": 187689
884
+ },
885
+ {
886
+ "storm_id": "2024238N25077",
887
+ "issue_time_utc": "2024-08-29T00:00:00Z",
888
+ "source_row": 187697
889
+ },
890
+ {
891
+ "storm_id": "2024244N09137",
892
+ "issue_time_utc": "2024-09-01T12:00:00Z",
893
+ "source_row": 187732
894
+ },
895
+ {
896
+ "storm_id": "2024244N09137",
897
+ "issue_time_utc": "2024-09-03T00:00:00Z",
898
+ "source_row": 187744
899
+ },
900
+ {
901
+ "storm_id": "2024244N09137",
902
+ "issue_time_utc": "2024-09-04T00:00:00Z",
903
+ "source_row": 187752
904
+ },
905
+ {
906
+ "storm_id": "2024253N11148",
907
+ "issue_time_utc": "2024-09-10T18:00:00Z",
908
+ "source_row": 187826
909
+ },
910
+ {
911
+ "storm_id": "2024253N11148",
912
+ "issue_time_utc": "2024-09-12T00:00:00Z",
913
+ "source_row": 187836
914
+ },
915
+ {
916
+ "storm_id": "2024253N11148",
917
+ "issue_time_utc": "2024-09-13T00:00:00Z",
918
+ "source_row": 187844
919
+ },
920
+ {
921
+ "storm_id": "2024259N12145",
922
+ "issue_time_utc": "2024-09-17T00:00:00Z",
923
+ "source_row": 187954
924
+ },
925
+ {
926
+ "storm_id": "2024259N12145",
927
+ "issue_time_utc": "2024-09-18T00:00:00Z",
928
+ "source_row": 187962
929
+ },
930
+ {
931
+ "storm_id": "2024259N12145",
932
+ "issue_time_utc": "2024-09-19T00:00:00Z",
933
+ "source_row": 187970
934
+ },
935
+ {
936
+ "storm_id": "2024269N39302",
937
+ "issue_time_utc": "2024-09-26T12:00:00Z",
938
+ "source_row": 188145
939
+ },
940
+ {
941
+ "storm_id": "2024269N39302",
942
+ "issue_time_utc": "2024-09-27T00:00:00Z",
943
+ "source_row": 188149
944
+ },
945
+ {
946
+ "storm_id": "2024269N39302",
947
+ "issue_time_utc": "2024-09-28T00:00:00Z",
948
+ "source_row": 188157
949
+ },
950
+ {
951
+ "storm_id": "2024274N14328",
952
+ "issue_time_utc": "2024-10-01T18:00:00Z",
953
+ "source_row": 188234
954
+ },
955
+ {
956
+ "storm_id": "2024274N14328",
957
+ "issue_time_utc": "2024-10-03T00:00:00Z",
958
+ "source_row": 188244
959
+ },
960
+ {
961
+ "storm_id": "2024274N14328",
962
+ "issue_time_utc": "2024-10-05T00:00:00Z",
963
+ "source_row": 188260
964
+ },
965
+ {
966
+ "storm_id": "2024275N10336",
967
+ "issue_time_utc": "2024-10-03T00:00:00Z",
968
+ "source_row": 188330
969
+ },
970
+ {
971
+ "storm_id": "2024275N10336",
972
+ "issue_time_utc": "2024-10-05T00:00:00Z",
973
+ "source_row": 188346
974
+ },
975
+ {
976
+ "storm_id": "2024275N10336",
977
+ "issue_time_utc": "2024-10-07T00:00:00Z",
978
+ "source_row": 188362
979
+ },
980
+ {
981
+ "storm_id": "2024278N11150",
982
+ "issue_time_utc": "2024-10-06T06:00:00Z",
983
+ "source_row": 188397
984
+ },
985
+ {
986
+ "storm_id": "2024278N11150",
987
+ "issue_time_utc": "2024-10-08T00:00:00Z",
988
+ "source_row": 188411
989
+ },
990
+ {
991
+ "storm_id": "2024278N11150",
992
+ "issue_time_utc": "2024-10-10T00:00:00Z",
993
+ "source_row": 188427
994
+ },
995
+ {
996
+ "storm_id": "2024293N13141",
997
+ "issue_time_utc": "2024-10-20T12:00:00Z",
998
+ "source_row": 188502
999
+ },
1000
+ {
1001
+ "storm_id": "2024293N13141",
1002
+ "issue_time_utc": "2024-10-22T00:00:00Z",
1003
+ "source_row": 188514
1004
+ },
1005
+ {
1006
+ "storm_id": "2024293N13141",
1007
+ "issue_time_utc": "2024-10-24T00:00:00Z",
1008
+ "source_row": 188530
1009
+ },
1010
+ {
1011
+ "storm_id": "2024298N13150",
1012
+ "issue_time_utc": "2024-10-26T00:00:00Z",
1013
+ "source_row": 188624
1014
+ },
1015
+ {
1016
+ "storm_id": "2024298N13150",
1017
+ "issue_time_utc": "2024-10-27T00:00:00Z",
1018
+ "source_row": 188632
1019
+ },
1020
+ {
1021
+ "storm_id": "2024298N13150",
1022
+ "issue_time_utc": "2024-10-28T00:00:00Z",
1023
+ "source_row": 188640
1024
+ },
1025
+ {
1026
+ "storm_id": "2024307N06143",
1027
+ "issue_time_utc": "2024-11-04T06:00:00Z",
1028
+ "source_row": 188682
1029
+ },
1030
+ {
1031
+ "storm_id": "2024307N06143",
1032
+ "issue_time_utc": "2024-11-06T00:00:00Z",
1033
+ "source_row": 188696
1034
+ },
1035
+ {
1036
+ "storm_id": "2024307N06143",
1037
+ "issue_time_utc": "2024-11-08T00:00:00Z",
1038
+ "source_row": 188712
1039
+ },
1040
+ {
1041
+ "storm_id": "2024313N10169",
1042
+ "issue_time_utc": "2024-11-09T18:00:00Z",
1043
+ "source_row": 188862
1044
+ },
1045
+ {
1046
+ "storm_id": "2024313N10169",
1047
+ "issue_time_utc": "2024-11-12T00:00:00Z",
1048
+ "source_row": 188880
1049
+ },
1050
+ {
1051
+ "storm_id": "2024313N10169",
1052
+ "issue_time_utc": "2024-11-15T00:00:00Z",
1053
+ "source_row": 188904
1054
+ },
1055
+ {
1056
+ "storm_id": "2024329N04089",
1057
+ "issue_time_utc": "2024-11-25T18:00:00Z",
1058
+ "source_row": 189139
1059
+ },
1060
+ {
1061
+ "storm_id": "2024329N04089",
1062
+ "issue_time_utc": "2024-11-27T00:00:00Z",
1063
+ "source_row": 189149
1064
+ },
1065
+ {
1066
+ "storm_id": "2024329N04089",
1067
+ "issue_time_utc": "2024-11-29T00:00:00Z",
1068
+ "source_row": 189165
1069
+ },
1070
+ {
1071
+ "storm_id": "2025182N22149",
1072
+ "issue_time_utc": "2025-07-03T00:00:00Z",
1073
+ "source_row": 190688
1074
+ },
1075
+ {
1076
+ "storm_id": "2025182N22149",
1077
+ "issue_time_utc": "2025-07-05T00:00:00Z",
1078
+ "source_row": 190704
1079
+ },
1080
+ {
1081
+ "storm_id": "2025182N22149",
1082
+ "issue_time_utc": "2025-07-06T00:00:00Z",
1083
+ "source_row": 190712
1084
+ },
1085
+ {
1086
+ "storm_id": "2025203N20124",
1087
+ "issue_time_utc": "2025-07-24T00:00:00Z",
1088
+ "source_row": 190874
1089
+ },
1090
+ {
1091
+ "storm_id": "2025203N20124",
1092
+ "issue_time_utc": "2025-07-27T00:00:00Z",
1093
+ "source_row": 190898
1094
+ },
1095
+ {
1096
+ "storm_id": "2025203N20124",
1097
+ "issue_time_utc": "2025-07-29T00:00:00Z",
1098
+ "source_row": 190914
1099
+ },
1100
+ {
1101
+ "storm_id": "2025205N13145",
1102
+ "issue_time_utc": "2025-07-25T12:00:00Z",
1103
+ "source_row": 190949
1104
+ },
1105
+ {
1106
+ "storm_id": "2025205N13145",
1107
+ "issue_time_utc": "2025-07-28T00:00:00Z",
1108
+ "source_row": 190969
1109
+ },
1110
+ {
1111
+ "storm_id": "2025205N13145",
1112
+ "issue_time_utc": "2025-07-31T00:00:00Z",
1113
+ "source_row": 190993
1114
+ },
1115
+ {
1116
+ "storm_id": "2025215N33284",
1117
+ "issue_time_utc": "2025-08-04T18:00:00Z",
1118
+ "source_row": 191117
1119
+ },
1120
+ {
1121
+ "storm_id": "2025215N33284",
1122
+ "issue_time_utc": "2025-08-06T00:00:00Z",
1123
+ "source_row": 191127
1124
+ },
1125
+ {
1126
+ "storm_id": "2025215N33284",
1127
+ "issue_time_utc": "2025-08-08T00:00:00Z",
1128
+ "source_row": 191143
1129
+ },
1130
+ {
1131
+ "storm_id": "2025216N13243",
1132
+ "issue_time_utc": "2025-08-06T06:00:00Z",
1133
+ "source_row": 191178
1134
+ },
1135
+ {
1136
+ "storm_id": "2025216N13243",
1137
+ "issue_time_utc": "2025-08-08T00:00:00Z",
1138
+ "source_row": 191192
1139
+ },
1140
+ {
1141
+ "storm_id": "2025216N13243",
1142
+ "issue_time_utc": "2025-08-09T00:00:00Z",
1143
+ "source_row": 191200
1144
+ },
1145
+ {
1146
+ "storm_id": "2025218N19149",
1147
+ "issue_time_utc": "2025-08-07T18:00:00Z",
1148
+ "source_row": 191235
1149
+ },
1150
+ {
1151
+ "storm_id": "2025218N19149",
1152
+ "issue_time_utc": "2025-08-09T00:00:00Z",
1153
+ "source_row": 191245
1154
+ },
1155
+ {
1156
+ "storm_id": "2025218N19149",
1157
+ "issue_time_utc": "2025-08-10T00:00:00Z",
1158
+ "source_row": 191253
1159
+ },
1160
+ {
1161
+ "storm_id": "2025223N17337",
1162
+ "issue_time_utc": "2025-08-13T00:00:00Z",
1163
+ "source_row": 191307
1164
+ },
1165
+ {
1166
+ "storm_id": "2025223N17337",
1167
+ "issue_time_utc": "2025-08-18T00:00:00Z",
1168
+ "source_row": 191347
1169
+ },
1170
+ {
1171
+ "storm_id": "2025223N17337",
1172
+ "issue_time_utc": "2025-08-22T00:00:00Z",
1173
+ "source_row": 191379
1174
+ },
1175
+ {
1176
+ "storm_id": "2025243N14239",
1177
+ "issue_time_utc": "2025-09-02T00:00:00Z",
1178
+ "source_row": 191506
1179
+ },
1180
+ {
1181
+ "storm_id": "2025243N14239",
1182
+ "issue_time_utc": "2025-09-04T00:00:00Z",
1183
+ "source_row": 191522
1184
+ },
1185
+ {
1186
+ "storm_id": "2025243N14239",
1187
+ "issue_time_utc": "2025-09-06T00:00:00Z",
1188
+ "source_row": 191538
1189
+ },
1190
+ {
1191
+ "storm_id": "2025260N13138",
1192
+ "issue_time_utc": "2025-09-18T18:00:00Z",
1193
+ "source_row": 191710
1194
+ },
1195
+ {
1196
+ "storm_id": "2025260N13138",
1197
+ "issue_time_utc": "2025-09-19T00:00:00Z",
1198
+ "source_row": 191712
1199
+ },
1200
+ {
1201
+ "storm_id": "2025260N13138",
1202
+ "issue_time_utc": "2025-09-20T00:00:00Z",
1203
+ "source_row": 191720
1204
+ },
1205
+ {
1206
+ "storm_id": "2025261N19312",
1207
+ "issue_time_utc": "2025-09-19T18:00:00Z",
1208
+ "source_row": 191757
1209
+ },
1210
+ {
1211
+ "storm_id": "2025261N19312",
1212
+ "issue_time_utc": "2025-09-21T00:00:00Z",
1213
+ "source_row": 191767
1214
+ },
1215
+ {
1216
+ "storm_id": "2025261N19312",
1217
+ "issue_time_utc": "2025-09-23T00:00:00Z",
1218
+ "source_row": 191783
1219
+ },
1220
+ {
1221
+ "storm_id": "2025261N23166",
1222
+ "issue_time_utc": "2025-09-19T12:00:00Z",
1223
+ "source_row": 191822
1224
+ },
1225
+ {
1226
+ "storm_id": "2025261N23166",
1227
+ "issue_time_utc": "2025-09-23T00:00:00Z",
1228
+ "source_row": 191850
1229
+ },
1230
+ {
1231
+ "storm_id": "2025261N23166",
1232
+ "issue_time_utc": "2025-09-26T00:00:00Z",
1233
+ "source_row": 191874
1234
+ },
1235
+ {
1236
+ "storm_id": "2025265N14261",
1237
+ "issue_time_utc": "2025-09-23T18:00:00Z",
1238
+ "source_row": 191907
1239
+ },
1240
+ {
1241
+ "storm_id": "2025265N14261",
1242
+ "issue_time_utc": "2025-09-25T00:00:00Z",
1243
+ "source_row": 191917
1244
+ },
1245
+ {
1246
+ "storm_id": "2025265N14261",
1247
+ "issue_time_utc": "2025-09-26T00:00:00Z",
1248
+ "source_row": 191925
1249
+ },
1250
+ {
1251
+ "storm_id": "2025270N21285",
1252
+ "issue_time_utc": "2025-09-28T18:00:00Z",
1253
+ "source_row": 192030
1254
+ },
1255
+ {
1256
+ "storm_id": "2025270N21285",
1257
+ "issue_time_utc": "2025-09-30T00:00:00Z",
1258
+ "source_row": 192040
1259
+ },
1260
+ {
1261
+ "storm_id": "2025270N21285",
1262
+ "issue_time_utc": "2025-10-01T00:00:00Z",
1263
+ "source_row": 192048
1264
+ },
1265
+ {
1266
+ "storm_id": "2025273N09248",
1267
+ "issue_time_utc": "2025-10-01T18:00:00Z",
1268
+ "source_row": 192081
1269
+ },
1270
+ {
1271
+ "storm_id": "2025273N09248",
1272
+ "issue_time_utc": "2025-10-03T00:00:00Z",
1273
+ "source_row": 192091
1274
+ },
1275
+ {
1276
+ "storm_id": "2025273N09248",
1277
+ "issue_time_utc": "2025-10-04T00:00:00Z",
1278
+ "source_row": 192099
1279
+ },
1280
+ {
1281
+ "storm_id": "2025280N13147",
1282
+ "issue_time_utc": "2025-10-08T12:00:00Z",
1283
+ "source_row": 192259
1284
+ },
1285
+ {
1286
+ "storm_id": "2025280N13147",
1287
+ "issue_time_utc": "2025-10-10T00:00:00Z",
1288
+ "source_row": 192271
1289
+ },
1290
+ {
1291
+ "storm_id": "2025280N13147",
1292
+ "issue_time_utc": "2025-10-11T00:00:00Z",
1293
+ "source_row": 192279
1294
+ },
1295
+ {
1296
+ "storm_id": "2025294N14290",
1297
+ "issue_time_utc": "2025-10-23T06:00:00Z",
1298
+ "source_row": 192400
1299
+ },
1300
+ {
1301
+ "storm_id": "2025294N14290",
1302
+ "issue_time_utc": "2025-10-25T00:00:00Z",
1303
+ "source_row": 192414
1304
+ },
1305
+ {
1306
+ "storm_id": "2025294N14290",
1307
+ "issue_time_utc": "2025-10-27T00:00:00Z",
1308
+ "source_row": 192430
1309
+ },
1310
+ {
1311
+ "storm_id": "2025308N09144",
1312
+ "issue_time_utc": "2025-11-06T06:00:00Z",
1313
+ "source_row": 192525
1314
+ },
1315
+ {
1316
+ "storm_id": "2025308N09144",
1317
+ "issue_time_utc": "2025-11-07T00:00:00Z",
1318
+ "source_row": 192531
1319
+ },
1320
+ {
1321
+ "storm_id": "2025308N09144",
1322
+ "issue_time_utc": "2025-11-08T00:00:00Z",
1323
+ "source_row": 192539
1324
+ },
1325
+ {
1326
+ "storm_id": "2025328N07132",
1327
+ "issue_time_utc": "2025-11-25T12:00:00Z",
1328
+ "source_row": 192611
1329
+ },
1330
+ {
1331
+ "storm_id": "2025328N07132",
1332
+ "issue_time_utc": "2025-11-27T00:00:00Z",
1333
+ "source_row": 192623
1334
+ },
1335
+ {
1336
+ "storm_id": "2025328N07132",
1337
+ "issue_time_utc": "2025-11-28T00:00:00Z",
1338
+ "source_row": 192631
1339
+ },
1340
+ {
1341
+ "storm_id": "2026014N08133",
1342
+ "issue_time_utc": "2026-01-15T18:00:00Z",
1343
+ "source_row": 192940
1344
+ },
1345
+ {
1346
+ "storm_id": "2026014N08133",
1347
+ "issue_time_utc": "2026-01-16T00:00:00Z",
1348
+ "source_row": 192942
1349
+ },
1350
+ {
1351
+ "storm_id": "2026014N08133",
1352
+ "issue_time_utc": "2026-01-17T00:00:00Z",
1353
+ "source_row": 192950
1354
+ }
1355
+ ],
1356
+ "leads_hours": [
1357
+ 6,
1358
+ 12,
1359
+ 18,
1360
+ 24,
1361
+ 30,
1362
+ 36,
1363
+ 42,
1364
+ 48,
1365
+ 54,
1366
+ 60,
1367
+ 66,
1368
+ 72,
1369
+ 78,
1370
+ 84,
1371
+ 90,
1372
+ 96,
1373
+ 102,
1374
+ 108,
1375
+ 114,
1376
+ 120
1377
+ ],
1378
+ "member_policy": {
1379
+ "1.1": "saved released causal route pipeline",
1380
+ "1.2": "50 causal historical-input perturbations"
1381
+ },
1382
+ "case_and_truth_alignment": "Exact source-row order and truth-array equality verified",
1383
+ "v11_coordinate_correction": "Archived v11_local held absolute latitude/longitude from build_v11_routes; converted to issue-centred east/north km using the same projection as 1.2. Round-trip back to original coordinates verified. Original archives preserved.",
1384
+ "coordinate_bug_evidence": "benchmark_100_storms_3_days_gpu.py build_v11_routes returns local_to_absolute; benchmark_strict_causal_post2021.py stores and scores that output as local",
1385
+ "source_sha256": {
1386
+ "routes_and_truth.npz": "0eeca56da8ddf0be05ea7f24f6391fa97b44abc6067a7d20e3ed2199948402cb",
1387
+ "v173_e4_causal_ensemble50.npz": "4afc595af1c02096d2cb38563069a9b2fc37c8cff2b439b77eac2ed96e34223e"
1388
+ },
1389
+ "evaluation": "Previously inspected development cohort; not an untouched test",
1390
+ "pressure_comparison": "No verified same-270 1.1 central-pressure predictions in these route artifacts"
1391
+ }
evaluation/release_data/daily_storm_cohort.json ADDED
The diff for this file is too large to render. See raw diff
 
evaluation/release_data/map_boundaries.json ADDED
@@ -0,0 +1 @@
 
 
1
+ [[[130.64,42.395024],[130.64,42.395],[130.779992,42.22001],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304536],[127.073309,38.256115],[126.68372,37.804773],[126.237339,37.840378],[126.174759,37.749686],[125.689104,37.94001],[125.568439,37.752089],[125.27533,37.669071],[125.240087,37.857224],[124.981033,37.948821],[124.712161,38.108346],[124.985994,38.548474],[125.221949,38.665857],[125.132859,38.848559],[125.38659,39.387958],[125.321116,39.551385],[124.737482,39.660344],[124.265625,39.928493],[125.079942,40.569824],[126.182045,41.107336],[126.869083,41.816569],[127.343783,41.503152],[128.208433,41.466772],[128.052215,41.994285],[129.596669,42.424982],[129.994267,42.985387],[130.64,42.395024]],[[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.304536],[128.205746,38.370397],[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686]],[[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.27939,50.58292],[120.18208,51.64355],[120.7382,51.96411],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.57147,53.4588],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.6574,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.98726,47.79013],[132.50669,47.78896],[133.373596,48.183442],[135.026311,48.47823],[134.50081,47.57845],[134.11235,47.21248],[133.769644,46.116927],[133.09712,45.14409],[131.883454,45.321162],[131.02519,44.96796],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.64,42.395024],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999]],[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]],[[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496]],[[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045]],[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]],[[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883]],[[122.03837,11.415841],[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841]],[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]],[[141.884601,39.180865],[140.959489,38.174001],[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,34.6676],[137.217599,34.606286],[135.792983,33.464805],[135.120983,33.849071],[135.079435,34.596545],[133.340316,34.375938],[132.156771,33.904933],[130.986145,33.885761],[132.000036,33.149992],[131.33279,31.450355],[130.686318,31.029579],[130.20242,31.418238],[130.447676,32.319475],[129.814692,32.61031],[129.408463,33.296056],[130.353935,33.604151],[130.878451,34.232743],[131.884229,34.749714],[132.617673,35.433393],[134.608301,35.731618],[135.677538,35.527134],[136.723831,37.304984],[137.390612,36.827391],[138.857602,37.827485],[139.426405,38.215962],[140.05479,39.438807],[139.883379,40.563312],[140.305783,41.195005],[141.368973,41.37856],[141.914263,39.991616],[141.884601,39.180865]],[[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642]]]
paper/trackformer_1_2_interactive_pressure_preview.png → evaluation/release_data/routes_270.npz RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:59b0f5e4fd28079af4dfed7ff316b202a1fffe092615aa89eb838f4ef6f1742b
3
- size 221804
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1f40f85b2ef2de169bd2cee129d95c854b44f030fd2cc45808f517fc0cb7601f
3
+ size 191620
paper/release_data/bavi_video.npz → evaluation/release_data/surigae_pressure.npz RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:9251fb82ebde819eced999c3440aa9b0a24251c29a4c2f6a4670f4137b9c5aff
3
- size 781189
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c92c76dbc83374149532d73118b11761d3ffcecc32e33cf313bbeb18e0030905
3
+ size 126102
evaluation/release_data/surigae_provenance.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "storm_name": "Surigae",
3
+ "issue_time_utc": "2026-09-27T12:00:00Z",
4
+ "valid_times_utc": [
5
+ "2026-09-27T18:00:00Z",
6
+ "2026-09-28T12:00:00Z",
7
+ "2026-09-29T00:00:00Z"
8
+ ],
9
+ "members": 1,
10
+ "source_sha256": "18dee6e7df2cca969a73531430599f89d18b2ec4a2bddd8d4b5971cd28dcf7cc",
11
+ "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
12
+ "source_note": "TrackFormer 1.2.73 E4 (v173-moving-core-multiscale-attention), SHA-256 f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0; one deterministic checkpoint forecast; no ensemble mean. The issue-time JMA central pressure was supplied; issue-time wind and prior motion were unavailable and masked/zeroed. Native regional pressure history is unavailable, so detail_available=0. Nine causal GFS analyses through 2026092706 (6.0 h before the issue) were mapped to the trained NCEP/NCAR contract; geography elevation was normalized once as in training. Transfer is experimental and not operationally validated.",
13
+ "pressure_display": "Unmodified model regional field with 4 hPa contours"
14
+ }
paper/release_data/pressure_showcase_coastlines.json → evaluation/release_data/yagi_coastlines.json RENAMED
@@ -1 +1 @@
1
- [[[117.882035,4.137551],[117.313232,3.234428],[118.04833,2.28769],[117.875627,1.827641],[118.996747,0.902219],[117.811858,0.784242],[117.478339,0.102475],[117.521644,-0.803723],[116.560048,-1.487661],[116.533797,-2.483517],[116.148084,-4.012726],[116.000858,-3.657037],[114.864803,-4.106984],[114.468652,-3.495704],[113.755672,-3.43917],[113.256994,-3.118776],[112.068126,-3.478392],[111.703291,-2.994442],[111.04824,-3.049426],[110.223846,-2.934032],[110.070936,-1.592874],[109.571948,-1.314907],[109.091874,-0.459507],[108.952658,0.415375],[109.069136,1.341934],[109.66326,2.006467],[109.830227,1.338136],[110.514061,0.773131],[111.159138,0.976478],[111.797548,0.904441],[112.380252,1.410121],[112.859809,1.49779],[113.80585,1.217549],[114.621355,1.430688],[115.134037,2.821482],[115.519078,3.169238],[115.865517,4.306559],[117.015214,4.306094],[117.882035,4.137551]],[[127.932378,2.174596],[128.004156,1.628531],[128.594559,1.540811],[128.688249,1.132386],[128.635952,0.258486],[128.12017,0.356413],[127.968034,-0.252077],[128.379999,-0.780004],[128.100016,-0.899996],[127.696475,-0.266598],[127.39949,1.011722],[127.600512,1.810691],[127.932378,2.174596]],[[122.927567,0.875192],[124.077522,0.917102],[125.065989,1.643259],[125.240501,1.419836],[124.437035,0.427881],[123.685505,0.235593],[122.723083,0.431137],[121.056725,0.381217],[120.183083,0.237247],[120.04087,-0.519658],[120.935905,-1.408906],[121.475821,-0.955962],[123.340565,-0.615673],[123.258399,-1.076213],[122.822715,-0.930951],[122.38853,-1.516858],[121.508274,-1.904483],[122.454572,-3.186058],[122.271896,-3.5295],[123.170963,-4.683693],[123.162333,-5.340604],[122.628515,-5.634591],[122.236394,-5.282933],[122.719569,-4.464172],[121.738234,-4.851331],[121.489463,-4.574553],[121.619171,-4.188478],[120.898182,-3.602105],[120.972389,-2.627643],[120.305453,-2.931604],[120.390047,-4.097579],[120.430717,-5.528241],[119.796543,-5.6734],[119.366906,-5.379878],[119.653606,-4.459417],[119.498835,-3.494412],[119.078344,-3.487022],[118.767769,-2.801999],[119.180974,-2.147104],[119.323394,-1.353147],[119.825999,0.154254],[120.035702,0.566477],[120.885779,1.309223],[121.666817,1.013944],[122.927567,0.875192]],[[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595]],[[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212]],[[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441]],[[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544]],[[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395],[109.47521,18.197701]],[[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.27939,50.58292],[120.18208,51.64355],[120.7382,51.96411],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.57147,53.4588],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.6574,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.98726,47.79013],[132.50669,47.78896],[133.373596,48.183442],[135.026311,48.47823],[134.50081,47.57845],[134.11235,47.21248],[133.769644,46.116927],[133.09712,45.14409],[131.883454,45.321162],[131.02519,44.96796],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.64,42.395024],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999]],[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]],[[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496]],[[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045]],[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]],[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]],[[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883]],[[122.03837,11.415841],[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841]],[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]],[[100.085757,6.464489],[100.259596,6.642825],[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101.27354,3.270292],[100.695435,3.93914],[100.557408,4.76728],[100.196706,5.312493],[100.30626,6.040562],[100.085757,6.464489]],[[117.882035,4.137551],[117.015214,4.306094],[115.865517,4.306559],[115.519078,3.169238],[115.134037,2.821482],[114.621355,1.430688],[113.80585,1.217549],[112.859809,1.49779],[112.380252,1.410121],[111.797548,0.904441],[111.159138,0.976478],[110.514061,0.773131],[109.830227,1.338136],[109.66326,2.006467],[110.396135,1.663775],[111.168853,1.850637],[111.370081,2.697303],[111.796928,2.885897],[112.995615,3.102395],[113.712935,3.893509],[114.204017,4.525874],[114.659596,4.007637],[114.869557,4.348314],[115.347461,4.316636],[115.4057,4.955228],[115.45071,5.44773],[116.220741,6.143191],[116.725103,6.924771],[117.129626,6.928053],[117.643393,6.422166],[117.689075,5.98749],[118.347691,5.708696],[119.181904,5.407836],[119.110694,5.016128],[118.439727,4.966519],[118.618321,4.478202],[117.882035,4.137551]],[[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773]]]
 
1
+ [[[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595]],[[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212]],[[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441]],[[100.115988,20.41785],[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.675266],[98.764546,11.441292],[98.428339,12.032987],[98.509574,13.122378],[98.103604,13.64046],[97.777732,14.837286],[97.597072,16.100568],[97.16454,16.928734],[96.505769,16.427241],[95.369352,15.71439],[94.808405,15.803454],[94.188804,16.037936],[94.533486,17.27724],[94.324817,18.213514],[93.540988,19.366493],[93.663255,19.726962],[93.078278,19.855145],[92.368554,20.670883],[92.303234,21.475485],[92.652257,21.324048],[92.672721,22.041239],[93.166128,22.27846],[93.060294,22.703111],[93.286327,23.043658],[93.325188,24.078556],[94.106742,23.850741],[94.552658,24.675238],[94.603249,25.162495],[95.155153,26.001307],[95.124768,26.573572],[96.419366,27.264589],[97.133999,27.083774],[97.051989,27.699059],[97.402561,27.882536],[97.327114,28.261583],[97.911988,28.335945],[98.246231,27.747221],[98.68269,27.508812],[98.712094,26.743536],[98.671838,25.918703],[97.724609,25.083637],[97.60472,23.897405],[98.660262,24.063286],[98.898749,23.142722],[99.531992,22.949039],[99.240899,22.118314],[99.983489,21.742937],[100.416538,21.558839],[101.150033,21.849984],[101.180005,21.436573],[100.329101,20.786122],[100.115988,20.41785]],[[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544]],[[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395],[109.47521,18.197701]],[[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.27939,50.58292],[120.18208,51.64355],[120.7382,51.96411],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.57147,53.4588],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.6574,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.98726,47.79013],[132.50669,47.78896],[133.373596,48.183442],[135.026311,48.47823],[134.50081,47.57845],[134.11235,47.21248],[133.769644,46.116927],[133.09712,45.14409],[131.883454,45.321162],[131.02519,44.96796],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.64,42.395024],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999]],[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]],[[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496]],[[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883]],[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]]
evaluation/release_data/yagi_video.json ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "Trackformer 1.2",
3
+ "storm": "YAGI",
4
+ "storm_id": "2024244N09137",
5
+ "issue_time_utc": "2024-09-03T00:00:00Z",
6
+ "source_row": 187744,
7
+ "case_index": 178,
8
+ "members": 50,
9
+ "ensemble_policy": {
10
+ "member_count": 50,
11
+ "member_ids": [
12
+ 0,
13
+ 1,
14
+ 2,
15
+ 3,
16
+ 4,
17
+ 5,
18
+ 6,
19
+ 7,
20
+ 8,
21
+ 9,
22
+ 10,
23
+ 11,
24
+ 12,
25
+ 13,
26
+ 14,
27
+ 15,
28
+ 16,
29
+ 17,
30
+ 18,
31
+ 19,
32
+ 20,
33
+ 21,
34
+ 22,
35
+ 23,
36
+ 24,
37
+ 25,
38
+ 26,
39
+ 27,
40
+ 28,
41
+ 29,
42
+ 30,
43
+ 31,
44
+ 32,
45
+ 33,
46
+ 34,
47
+ 35,
48
+ 36,
49
+ 37,
50
+ 38,
51
+ 39,
52
+ 40,
53
+ 41,
54
+ 42,
55
+ 43,
56
+ 44,
57
+ 45,
58
+ 46,
59
+ 47,
60
+ 48,
61
+ 49
62
+ ],
63
+ "seed_base": 2043,
64
+ "member_seed": "seed_base + member_id",
65
+ "global_history_noise": {
66
+ "amplitude_normalized": 0.025,
67
+ "spatial_smoothing_kernel": 5,
68
+ "per_history_map_centered_and_unit_scaled": true
69
+ },
70
+ "regional_history_noise": {
71
+ "amplitude_normalized": 0.015,
72
+ "spatial_smoothing_kernel": 9,
73
+ "per_history_map_centered_and_unit_scaled": true
74
+ },
75
+ "perturbed_inputs": [
76
+ "global_history",
77
+ "regional_history"
78
+ ],
79
+ "future_weather_as_inputs": false,
80
+ "future_best_track_as_inputs": false,
81
+ "official_forecasts_as_inputs": false,
82
+ "clean_comparator": "same checkpoint, one unperturbed causal evaluation pass"
83
+ },
84
+ "leads_hours": [
85
+ 6,
86
+ 12,
87
+ 18,
88
+ 24,
89
+ 30,
90
+ 36,
91
+ 42,
92
+ 48,
93
+ 54,
94
+ 60,
95
+ 66,
96
+ 72,
97
+ 78,
98
+ 84,
99
+ 90,
100
+ 96,
101
+ 102,
102
+ 108,
103
+ 114,
104
+ 120
105
+ ],
106
+ "source_archive_sha256": "4afc595af1c02096d2cb38563069a9b2fc37c8cff2b439b77eac2ed96e34223e",
107
+ "source_report_sha256": "40ee814e067ac002b8930694ef01e3d9de3fb04c07b7f22b59dfec5fd6492ba7",
108
+ "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
109
+ "data_sha256": "9167bc89c1ea85dc2c133f901f0a084ba06c02762b257194f5354f9d6c3a532b",
110
+ "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
111
+ "observed_route_source": "Exact six-hour IBTrACS LAT/LON for the same storm and valid timestamps.",
112
+ "observed_pressure_source": "IBTrACS TOKYO_PRES (JMA best-track central pressure), not an official forecast.",
113
+ "route_projection": "Saved mean local east/north km converted using issue latitude; no fitting, translation, rotation or scaling to observed route.",
114
+ "field_source": "Unmodified saved ensemble50_native_mslp_hpa and ensemble50_mslp_hpa on their common fixed grids.",
115
+ "native_history_available": false,
116
+ "grid_note": "Regional reconstruction sampled at 0.25 degrees; native-detail history unavailable for this case. Outside regional coverage use only saved 2.5-degree basin field.",
117
+ "metrics": {
118
+ "mean_track_error_km": 114.07107153522307,
119
+ "track_error_120h_km": 57.24838501893502,
120
+ "maximum_track_error_km": 193.7140338557338,
121
+ "within_200km_leads": 20,
122
+ "central_pressure_mae_hpa": 42.011166381835935,
123
+ "pressure_valid_leads": 20
124
+ },
125
+ "selection": "User-selected Yagi issue after inspecting geographic track alignment among saved development cases. Selected good route example, not representative performance or an untouched holdout. Pressure skill is assessed separately.",
126
+ "video": {
127
+ "file": "docs/trackformer_1_2_yagi.mp4",
128
+ "duration_seconds": 23,
129
+ "forecast_states": 20,
130
+ "codec": "H.264",
131
+ "encoder": "h264_videotoolbox",
132
+ "sha256": "542172829ec361e55e3f8e7c04436c59e575ac70d756759d8bf5596bf4fffb1a",
133
+ "playback": "Each six-hour state held for 1 second; final frame held 3 seconds extra. No interpolated forecast states."
134
+ }
135
+ }
paper/release_data/pressure_showcase.npz → evaluation/release_data/yagi_video.npz RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:2e271cf728daf219662f3f2f2c519dccb9d63695cd97d2b5e5f2484f3d822648
3
- size 738620
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9167bc89c1ea85dc2c133f901f0a084ba06c02762b257194f5354f9d6c3a532b
3
+ size 804986
evaluation/trackformer_1_2_pressure_map_example.png ADDED
evaluation/trackformer_1_2_showcase_selection.json ADDED
The diff for this file is too large to render. See raw diff
 
paper/trackformer_1_2_bavi_video_poster.png → evaluation/trackformer_1_2_surigae_isobars.png RENAMED
File without changes
evaluation/trackformer_1_2_vs_1_1_270_bars.png ADDED

Git LFS Details

  • SHA256: 1e1094ade2098f1ccbaff135f9074675d447fdb9c2609f6401fb0dedaf783dce
  • Pointer size: 131 Bytes
  • Size of remote file: 200 kB
evaluation/trackformer_1_2_vs_1_1_270_metrics.json ADDED
@@ -0,0 +1,1506 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "case_count": 270,
3
+ "storm_count": 90,
4
+ "cases": [
5
+ {
6
+ "storm_id": "2022096N03150",
7
+ "issue_time_utc": "2022-04-08T06:00:00Z",
8
+ "source_row": 178540
9
+ },
10
+ {
11
+ "storm_id": "2022096N03150",
12
+ "issue_time_utc": "2022-04-11T00:00:00Z",
13
+ "source_row": 178562
14
+ },
15
+ {
16
+ "storm_id": "2022096N03150",
17
+ "issue_time_utc": "2022-04-13T00:00:00Z",
18
+ "source_row": 178578
19
+ },
20
+ {
21
+ "storm_id": "2022167N11269",
22
+ "issue_time_utc": "2022-06-18T00:00:00Z",
23
+ "source_row": 178867
24
+ },
25
+ {
26
+ "storm_id": "2022167N11269",
27
+ "issue_time_utc": "2022-06-22T00:00:00Z",
28
+ "source_row": 178899
29
+ },
30
+ {
31
+ "storm_id": "2022167N11269",
32
+ "issue_time_utc": "2022-06-25T00:00:00Z",
33
+ "source_row": 178923
34
+ },
35
+ {
36
+ "storm_id": "2022179N08310",
37
+ "issue_time_utc": "2022-06-29T18:00:00Z",
38
+ "source_row": 178960
39
+ },
40
+ {
41
+ "storm_id": "2022179N08310",
42
+ "issue_time_utc": "2022-07-03T00:00:00Z",
43
+ "source_row": 178986
44
+ },
45
+ {
46
+ "storm_id": "2022179N08310",
47
+ "issue_time_utc": "2022-07-06T00:00:00Z",
48
+ "source_row": 179010
49
+ },
50
+ {
51
+ "storm_id": "2022180N15117",
52
+ "issue_time_utc": "2022-06-30T18:00:00Z",
53
+ "source_row": 179043
54
+ },
55
+ {
56
+ "storm_id": "2022180N15117",
57
+ "issue_time_utc": "2022-07-01T00:00:00Z",
58
+ "source_row": 179045
59
+ },
60
+ {
61
+ "storm_id": "2022180N15117",
62
+ "issue_time_utc": "2022-07-02T00:00:00Z",
63
+ "source_row": 179055
64
+ },
65
+ {
66
+ "storm_id": "2022180N15130",
67
+ "issue_time_utc": "2022-07-01T00:00:00Z",
68
+ "source_row": 179096
69
+ },
70
+ {
71
+ "storm_id": "2022180N15130",
72
+ "issue_time_utc": "2022-07-04T00:00:00Z",
73
+ "source_row": 179121
74
+ },
75
+ {
76
+ "storm_id": "2022180N15130",
77
+ "issue_time_utc": "2022-07-06T00:00:00Z",
78
+ "source_row": 179138
79
+ },
80
+ {
81
+ "storm_id": "2022197N12260",
82
+ "issue_time_utc": "2022-07-17T12:00:00Z",
83
+ "source_row": 179208
84
+ },
85
+ {
86
+ "storm_id": "2022197N12260",
87
+ "issue_time_utc": "2022-07-18T00:00:00Z",
88
+ "source_row": 179212
89
+ },
90
+ {
91
+ "storm_id": "2022197N12260",
92
+ "issue_time_utc": "2022-07-19T00:00:00Z",
93
+ "source_row": 179220
94
+ },
95
+ {
96
+ "storm_id": "2022207N11262",
97
+ "issue_time_utc": "2022-07-27T12:00:00Z",
98
+ "source_row": 179253
99
+ },
100
+ {
101
+ "storm_id": "2022207N11262",
102
+ "issue_time_utc": "2022-07-29T00:00:00Z",
103
+ "source_row": 179265
104
+ },
105
+ {
106
+ "storm_id": "2022207N11262",
107
+ "issue_time_utc": "2022-07-30T00:00:00Z",
108
+ "source_row": 179273
109
+ },
110
+ {
111
+ "storm_id": "2022209N16246",
112
+ "issue_time_utc": "2022-07-29T12:00:00Z",
113
+ "source_row": 179354
114
+ },
115
+ {
116
+ "storm_id": "2022209N16246",
117
+ "issue_time_utc": "2022-07-30T00:00:00Z",
118
+ "source_row": 179358
119
+ },
120
+ {
121
+ "storm_id": "2022209N16246",
122
+ "issue_time_utc": "2022-07-31T00:00:00Z",
123
+ "source_row": 179366
124
+ },
125
+ {
126
+ "storm_id": "2022225N15253",
127
+ "issue_time_utc": "2022-08-14T12:00:00Z",
128
+ "source_row": 179481
129
+ },
130
+ {
131
+ "storm_id": "2022225N15253",
132
+ "issue_time_utc": "2022-08-16T00:00:00Z",
133
+ "source_row": 179493
134
+ },
135
+ {
136
+ "storm_id": "2022225N15253",
137
+ "issue_time_utc": "2022-08-17T00:00:00Z",
138
+ "source_row": 179501
139
+ },
140
+ {
141
+ "storm_id": "2022239N22150",
142
+ "issue_time_utc": "2022-08-29T00:00:00Z",
143
+ "source_row": 179613
144
+ },
145
+ {
146
+ "storm_id": "2022239N22150",
147
+ "issue_time_utc": "2022-09-01T00:00:00Z",
148
+ "source_row": 179637
149
+ },
150
+ {
151
+ "storm_id": "2022239N22150",
152
+ "issue_time_utc": "2022-09-04T00:00:00Z",
153
+ "source_row": 179661
154
+ },
155
+ {
156
+ "storm_id": "2022244N38313",
157
+ "issue_time_utc": "2022-09-02T12:00:00Z",
158
+ "source_row": 179723
159
+ },
160
+ {
161
+ "storm_id": "2022244N38313",
162
+ "issue_time_utc": "2022-09-06T00:00:00Z",
163
+ "source_row": 179751
164
+ },
165
+ {
166
+ "storm_id": "2022244N38313",
167
+ "issue_time_utc": "2022-09-10T00:00:00Z",
168
+ "source_row": 179783
169
+ },
170
+ {
171
+ "storm_id": "2022246N18301",
172
+ "issue_time_utc": "2022-09-04T18:00:00Z",
173
+ "source_row": 179822
174
+ },
175
+ {
176
+ "storm_id": "2022246N18301",
177
+ "issue_time_utc": "2022-09-07T00:00:00Z",
178
+ "source_row": 179840
179
+ },
180
+ {
181
+ "storm_id": "2022246N18301",
182
+ "issue_time_utc": "2022-09-10T00:00:00Z",
183
+ "source_row": 179864
184
+ },
185
+ {
186
+ "storm_id": "2022247N26147",
187
+ "issue_time_utc": "2022-09-05T18:00:00Z",
188
+ "source_row": 179901
189
+ },
190
+ {
191
+ "storm_id": "2022247N26147",
192
+ "issue_time_utc": "2022-09-09T00:00:00Z",
193
+ "source_row": 179927
194
+ },
195
+ {
196
+ "storm_id": "2022247N26147",
197
+ "issue_time_utc": "2022-09-12T00:00:00Z",
198
+ "source_row": 179951
199
+ },
200
+ {
201
+ "storm_id": "2022248N14259",
202
+ "issue_time_utc": "2022-09-06T12:00:00Z",
203
+ "source_row": 179984
204
+ },
205
+ {
206
+ "storm_id": "2022248N14259",
207
+ "issue_time_utc": "2022-09-07T00:00:00Z",
208
+ "source_row": 179988
209
+ },
210
+ {
211
+ "storm_id": "2022248N14259",
212
+ "issue_time_utc": "2022-09-08T00:00:00Z",
213
+ "source_row": 179996
214
+ },
215
+ {
216
+ "storm_id": "2022254N21158",
217
+ "issue_time_utc": "2022-09-12T12:00:00Z",
218
+ "source_row": 180030
219
+ },
220
+ {
221
+ "storm_id": "2022254N21158",
222
+ "issue_time_utc": "2022-09-13T00:00:00Z",
223
+ "source_row": 180034
224
+ },
225
+ {
226
+ "storm_id": "2022254N21158",
227
+ "issue_time_utc": "2022-09-14T00:00:00Z",
228
+ "source_row": 180042
229
+ },
230
+ {
231
+ "storm_id": "2022254N24143",
232
+ "issue_time_utc": "2022-09-13T06:00:00Z",
233
+ "source_row": 180081
234
+ },
235
+ {
236
+ "storm_id": "2022254N24143",
237
+ "issue_time_utc": "2022-09-14T00:00:00Z",
238
+ "source_row": 180087
239
+ },
240
+ {
241
+ "storm_id": "2022254N24143",
242
+ "issue_time_utc": "2022-09-15T00:00:00Z",
243
+ "source_row": 180095
244
+ },
245
+ {
246
+ "storm_id": "2022255N16256",
247
+ "issue_time_utc": "2022-09-13T12:00:00Z",
248
+ "source_row": 180133
249
+ },
250
+ {
251
+ "storm_id": "2022255N16256",
252
+ "issue_time_utc": "2022-09-17T00:00:00Z",
253
+ "source_row": 180161
254
+ },
255
+ {
256
+ "storm_id": "2022255N16256",
257
+ "issue_time_utc": "2022-09-20T00:00:00Z",
258
+ "source_row": 180185
259
+ },
260
+ {
261
+ "storm_id": "2022257N16312",
262
+ "issue_time_utc": "2022-09-16T06:00:00Z",
263
+ "source_row": 180218
264
+ },
265
+ {
266
+ "storm_id": "2022257N16312",
267
+ "issue_time_utc": "2022-09-19T00:00:00Z",
268
+ "source_row": 180242
269
+ },
270
+ {
271
+ "storm_id": "2022257N16312",
272
+ "issue_time_utc": "2022-09-22T00:00:00Z",
273
+ "source_row": 180268
274
+ },
275
+ {
276
+ "storm_id": "2022266N12294",
277
+ "issue_time_utc": "2022-09-24T18:00:00Z",
278
+ "source_row": 180471
279
+ },
280
+ {
281
+ "storm_id": "2022266N12294",
282
+ "issue_time_utc": "2022-09-25T00:00:00Z",
283
+ "source_row": 180473
284
+ },
285
+ {
286
+ "storm_id": "2022266N12294",
287
+ "issue_time_utc": "2022-09-26T00:00:00Z",
288
+ "source_row": 180481
289
+ },
290
+ {
291
+ "storm_id": "2022270N14136",
292
+ "issue_time_utc": "2022-09-28T12:00:00Z",
293
+ "source_row": 180574
294
+ },
295
+ {
296
+ "storm_id": "2022270N14136",
297
+ "issue_time_utc": "2022-09-29T00:00:00Z",
298
+ "source_row": 180578
299
+ },
300
+ {
301
+ "storm_id": "2022270N14136",
302
+ "issue_time_utc": "2022-09-30T00:00:00Z",
303
+ "source_row": 180586
304
+ },
305
+ {
306
+ "storm_id": "2022284N15152",
307
+ "issue_time_utc": "2022-10-13T06:00:00Z",
308
+ "source_row": 180720
309
+ },
310
+ {
311
+ "storm_id": "2022284N15152",
312
+ "issue_time_utc": "2022-10-14T00:00:00Z",
313
+ "source_row": 180726
314
+ },
315
+ {
316
+ "storm_id": "2022284N15152",
317
+ "issue_time_utc": "2022-10-15T00:00:00Z",
318
+ "source_row": 180734
319
+ },
320
+ {
321
+ "storm_id": "2023138N05151",
322
+ "issue_time_utc": "2023-05-20T00:00:00Z",
323
+ "source_row": 182572
324
+ },
325
+ {
326
+ "storm_id": "2023138N05151",
327
+ "issue_time_utc": "2023-05-25T00:00:00Z",
328
+ "source_row": 182612
329
+ },
330
+ {
331
+ "storm_id": "2023138N05151",
332
+ "issue_time_utc": "2023-05-29T00:00:00Z",
333
+ "source_row": 182644
334
+ },
335
+ {
336
+ "storm_id": "2023156N12135",
337
+ "issue_time_utc": "2023-06-06T18:00:00Z",
338
+ "source_row": 182775
339
+ },
340
+ {
341
+ "storm_id": "2023156N12135",
342
+ "issue_time_utc": "2023-06-09T00:00:00Z",
343
+ "source_row": 182793
344
+ },
345
+ {
346
+ "storm_id": "2023156N12135",
347
+ "issue_time_utc": "2023-06-12T00:00:00Z",
348
+ "source_row": 182817
349
+ },
350
+ {
351
+ "storm_id": "2023156N10067",
352
+ "issue_time_utc": "2023-06-07T00:00:00Z",
353
+ "source_row": 182686
354
+ },
355
+ {
356
+ "storm_id": "2023156N10067",
357
+ "issue_time_utc": "2023-06-11T00:00:00Z",
358
+ "source_row": 182718
359
+ },
360
+ {
361
+ "storm_id": "2023156N10067",
362
+ "issue_time_utc": "2023-06-14T00:00:00Z",
363
+ "source_row": 182742
364
+ },
365
+ {
366
+ "storm_id": "2023191N10262",
367
+ "issue_time_utc": "2023-07-12T06:00:00Z",
368
+ "source_row": 182916
369
+ },
370
+ {
371
+ "storm_id": "2023191N10262",
372
+ "issue_time_utc": "2023-07-13T00:00:00Z",
373
+ "source_row": 182922
374
+ },
375
+ {
376
+ "storm_id": "2023191N10262",
377
+ "issue_time_utc": "2023-07-14T00:00:00Z",
378
+ "source_row": 182930
379
+ },
380
+ {
381
+ "storm_id": "2023193N37305",
382
+ "issue_time_utc": "2023-07-13T12:00:00Z",
383
+ "source_row": 182969
384
+ },
385
+ {
386
+ "storm_id": "2023193N37305",
387
+ "issue_time_utc": "2023-07-17T00:00:00Z",
388
+ "source_row": 182997
389
+ },
390
+ {
391
+ "storm_id": "2023193N37305",
392
+ "issue_time_utc": "2023-07-20T00:00:00Z",
393
+ "source_row": 183021
394
+ },
395
+ {
396
+ "storm_id": "2023201N13134",
397
+ "issue_time_utc": "2023-07-22T06:00:00Z",
398
+ "source_row": 183101
399
+ },
400
+ {
401
+ "storm_id": "2023201N13134",
402
+ "issue_time_utc": "2023-07-24T00:00:00Z",
403
+ "source_row": 183115
404
+ },
405
+ {
406
+ "storm_id": "2023201N13134",
407
+ "issue_time_utc": "2023-07-26T00:00:00Z",
408
+ "source_row": 183131
409
+ },
410
+ {
411
+ "storm_id": "2023207N09141",
412
+ "issue_time_utc": "2023-07-28T06:00:00Z",
413
+ "source_row": 183164
414
+ },
415
+ {
416
+ "storm_id": "2023207N09141",
417
+ "issue_time_utc": "2023-08-02T00:00:00Z",
418
+ "source_row": 183202
419
+ },
420
+ {
421
+ "storm_id": "2023207N09141",
422
+ "issue_time_utc": "2023-08-06T00:00:00Z",
423
+ "source_row": 183234
424
+ },
425
+ {
426
+ "storm_id": "2023213N14257",
427
+ "issue_time_utc": "2023-08-02T12:00:00Z",
428
+ "source_row": 183280
429
+ },
430
+ {
431
+ "storm_id": "2023213N14257",
432
+ "issue_time_utc": "2023-08-10T00:00:00Z",
433
+ "source_row": 183340
434
+ },
435
+ {
436
+ "storm_id": "2023213N14257",
437
+ "issue_time_utc": "2023-08-17T00:00:00Z",
438
+ "source_row": 183396
439
+ },
440
+ {
441
+ "storm_id": "2023218N25145",
442
+ "issue_time_utc": "2023-08-08T00:00:00Z",
443
+ "source_row": 183452
444
+ },
445
+ {
446
+ "storm_id": "2023218N25145",
447
+ "issue_time_utc": "2023-08-11T00:00:00Z",
448
+ "source_row": 183476
449
+ },
450
+ {
451
+ "storm_id": "2023218N25145",
452
+ "issue_time_utc": "2023-08-13T00:00:00Z",
453
+ "source_row": 183492
454
+ },
455
+ {
456
+ "storm_id": "2023225N14248",
457
+ "issue_time_utc": "2023-08-14T12:00:00Z",
458
+ "source_row": 183531
459
+ },
460
+ {
461
+ "storm_id": "2023225N14248",
462
+ "issue_time_utc": "2023-08-17T00:00:00Z",
463
+ "source_row": 183551
464
+ },
465
+ {
466
+ "storm_id": "2023225N14248",
467
+ "issue_time_utc": "2023-08-19T00:00:00Z",
468
+ "source_row": 183567
469
+ },
470
+ {
471
+ "storm_id": "2023231N15313",
472
+ "issue_time_utc": "2023-08-21T00:00:00Z",
473
+ "source_row": 183633
474
+ },
475
+ {
476
+ "storm_id": "2023231N15313",
477
+ "issue_time_utc": "2023-08-26T00:00:00Z",
478
+ "source_row": 183673
479
+ },
480
+ {
481
+ "storm_id": "2023231N15313",
482
+ "issue_time_utc": "2023-08-30T00:00:00Z",
483
+ "source_row": 183705
484
+ },
485
+ {
486
+ "storm_id": "2023232N13300",
487
+ "issue_time_utc": "2023-08-21T18:00:00Z",
488
+ "source_row": 183773
489
+ },
490
+ {
491
+ "storm_id": "2023232N13300",
492
+ "issue_time_utc": "2023-08-28T00:00:00Z",
493
+ "source_row": 183824
494
+ },
495
+ {
496
+ "storm_id": "2023232N13300",
497
+ "issue_time_utc": "2023-09-04T00:00:00Z",
498
+ "source_row": 183880
499
+ },
500
+ {
501
+ "storm_id": "2023234N19154",
502
+ "issue_time_utc": "2023-08-23T12:00:00Z",
503
+ "source_row": 184026
504
+ },
505
+ {
506
+ "storm_id": "2023234N19154",
507
+ "issue_time_utc": "2023-08-24T00:00:00Z",
508
+ "source_row": 184030
509
+ },
510
+ {
511
+ "storm_id": "2023234N19154",
512
+ "issue_time_utc": "2023-08-25T00:00:00Z",
513
+ "source_row": 184038
514
+ },
515
+ {
516
+ "storm_id": "2023234N18128",
517
+ "issue_time_utc": "2023-08-24T00:00:00Z",
518
+ "source_row": 183919
519
+ },
520
+ {
521
+ "storm_id": "2023234N18128",
522
+ "issue_time_utc": "2023-08-27T00:00:00Z",
523
+ "source_row": 183943
524
+ },
525
+ {
526
+ "storm_id": "2023234N18128",
527
+ "issue_time_utc": "2023-08-30T00:00:00Z",
528
+ "source_row": 183967
529
+ },
530
+ {
531
+ "storm_id": "2023239N21274",
532
+ "issue_time_utc": "2023-08-28T12:00:00Z",
533
+ "source_row": 184203
534
+ },
535
+ {
536
+ "storm_id": "2023239N21274",
537
+ "issue_time_utc": "2023-08-31T00:00:00Z",
538
+ "source_row": 184224
539
+ },
540
+ {
541
+ "storm_id": "2023239N21274",
542
+ "issue_time_utc": "2023-09-03T00:00:00Z",
543
+ "source_row": 184248
544
+ },
545
+ {
546
+ "storm_id": "2023239N18144",
547
+ "issue_time_utc": "2023-08-29T00:00:00Z",
548
+ "source_row": 184110
549
+ },
550
+ {
551
+ "storm_id": "2023239N18144",
552
+ "issue_time_utc": "2023-09-02T00:00:00Z",
553
+ "source_row": 184142
554
+ },
555
+ {
556
+ "storm_id": "2023239N18144",
557
+ "issue_time_utc": "2023-09-05T00:00:00Z",
558
+ "source_row": 184166
559
+ },
560
+ {
561
+ "storm_id": "2023241N10158",
562
+ "issue_time_utc": "2023-08-31T00:00:00Z",
563
+ "source_row": 184283
564
+ },
565
+ {
566
+ "storm_id": "2023241N10158",
567
+ "issue_time_utc": "2023-09-01T00:00:00Z",
568
+ "source_row": 184291
569
+ },
570
+ {
571
+ "storm_id": "2023241N10158",
572
+ "issue_time_utc": "2023-09-02T00:00:00Z",
573
+ "source_row": 184299
574
+ },
575
+ {
576
+ "storm_id": "2023242N15339",
577
+ "issue_time_utc": "2023-09-01T00:00:00Z",
578
+ "source_row": 184343
579
+ },
580
+ {
581
+ "storm_id": "2023242N15339",
582
+ "issue_time_utc": "2023-09-06T00:00:00Z",
583
+ "source_row": 184383
584
+ },
585
+ {
586
+ "storm_id": "2023242N15339",
587
+ "issue_time_utc": "2023-09-10T00:00:00Z",
588
+ "source_row": 184415
589
+ },
590
+ {
591
+ "storm_id": "2023248N12257",
592
+ "issue_time_utc": "2023-09-06T12:00:00Z",
593
+ "source_row": 184471
594
+ },
595
+ {
596
+ "storm_id": "2023248N12257",
597
+ "issue_time_utc": "2023-09-08T00:00:00Z",
598
+ "source_row": 184483
599
+ },
600
+ {
601
+ "storm_id": "2023248N12257",
602
+ "issue_time_utc": "2023-09-09T00:00:00Z",
603
+ "source_row": 184491
604
+ },
605
+ {
606
+ "storm_id": "2023249N12320",
607
+ "issue_time_utc": "2023-09-07T12:00:00Z",
608
+ "source_row": 184524
609
+ },
610
+ {
611
+ "storm_id": "2023249N12320",
612
+ "issue_time_utc": "2023-09-10T00:00:00Z",
613
+ "source_row": 184544
614
+ },
615
+ {
616
+ "storm_id": "2023249N12320",
617
+ "issue_time_utc": "2023-09-13T00:00:00Z",
618
+ "source_row": 184568
619
+ },
620
+ {
621
+ "storm_id": "2023251N16334",
622
+ "issue_time_utc": "2023-09-09T12:00:00Z",
623
+ "source_row": 184608
624
+ },
625
+ {
626
+ "storm_id": "2023251N16334",
627
+ "issue_time_utc": "2023-09-11T00:00:00Z",
628
+ "source_row": 184620
629
+ },
630
+ {
631
+ "storm_id": "2023251N16334",
632
+ "issue_time_utc": "2023-09-13T00:00:00Z",
633
+ "source_row": 184636
634
+ },
635
+ {
636
+ "storm_id": "2023258N14318",
637
+ "issue_time_utc": "2023-09-17T06:00:00Z",
638
+ "source_row": 184675
639
+ },
640
+ {
641
+ "storm_id": "2023258N14318",
642
+ "issue_time_utc": "2023-09-19T00:00:00Z",
643
+ "source_row": 184689
644
+ },
645
+ {
646
+ "storm_id": "2023258N14318",
647
+ "issue_time_utc": "2023-09-21T00:00:00Z",
648
+ "source_row": 184705
649
+ },
650
+ {
651
+ "storm_id": "2023266N16323",
652
+ "issue_time_utc": "2023-09-25T06:00:00Z",
653
+ "source_row": 184784
654
+ },
655
+ {
656
+ "storm_id": "2023266N16323",
657
+ "issue_time_utc": "2023-09-28T00:00:00Z",
658
+ "source_row": 184806
659
+ },
660
+ {
661
+ "storm_id": "2023266N16323",
662
+ "issue_time_utc": "2023-10-01T00:00:00Z",
663
+ "source_row": 184830
664
+ },
665
+ {
666
+ "storm_id": "2023271N14144",
667
+ "issue_time_utc": "2023-09-29T12:00:00Z",
668
+ "source_row": 184875
669
+ },
670
+ {
671
+ "storm_id": "2023271N14144",
672
+ "issue_time_utc": "2023-10-02T00:00:00Z",
673
+ "source_row": 184895
674
+ },
675
+ {
676
+ "storm_id": "2023271N14144",
677
+ "issue_time_utc": "2023-10-05T00:00:00Z",
678
+ "source_row": 184919
679
+ },
680
+ {
681
+ "storm_id": "2023279N08157",
682
+ "issue_time_utc": "2023-10-08T00:00:00Z",
683
+ "source_row": 185020
684
+ },
685
+ {
686
+ "storm_id": "2023279N08157",
687
+ "issue_time_utc": "2023-10-10T00:00:00Z",
688
+ "source_row": 185036
689
+ },
690
+ {
691
+ "storm_id": "2023279N08157",
692
+ "issue_time_utc": "2023-10-11T00:00:00Z",
693
+ "source_row": 185044
694
+ },
695
+ {
696
+ "storm_id": "2023292N13309",
697
+ "issue_time_utc": "2023-10-20T18:00:00Z",
698
+ "source_row": 185172
699
+ },
700
+ {
701
+ "storm_id": "2023292N13309",
702
+ "issue_time_utc": "2023-10-23T00:00:00Z",
703
+ "source_row": 185191
704
+ },
705
+ {
706
+ "storm_id": "2023292N13309",
707
+ "issue_time_utc": "2023-10-26T00:00:00Z",
708
+ "source_row": 185215
709
+ },
710
+ {
711
+ "storm_id": "2023302N10267",
712
+ "issue_time_utc": "2023-10-30T12:00:00Z",
713
+ "source_row": 185325
714
+ },
715
+ {
716
+ "storm_id": "2023302N10267",
717
+ "issue_time_utc": "2023-11-01T00:00:00Z",
718
+ "source_row": 185337
719
+ },
720
+ {
721
+ "storm_id": "2023302N10267",
722
+ "issue_time_utc": "2023-11-02T00:00:00Z",
723
+ "source_row": 185345
724
+ },
725
+ {
726
+ "storm_id": "2024141N03142",
727
+ "issue_time_utc": "2024-05-22T00:00:00Z",
728
+ "source_row": 186747
729
+ },
730
+ {
731
+ "storm_id": "2024141N03142",
732
+ "issue_time_utc": "2024-05-25T00:00:00Z",
733
+ "source_row": 186771
734
+ },
735
+ {
736
+ "storm_id": "2024141N03142",
737
+ "issue_time_utc": "2024-05-28T00:00:00Z",
738
+ "source_row": 186795
739
+ },
740
+ {
741
+ "storm_id": "2024181N09320",
742
+ "issue_time_utc": "2024-06-30T12:00:00Z",
743
+ "source_row": 186875
744
+ },
745
+ {
746
+ "storm_id": "2024181N09320",
747
+ "issue_time_utc": "2024-07-03T00:00:00Z",
748
+ "source_row": 186897
749
+ },
750
+ {
751
+ "storm_id": "2024181N09320",
752
+ "issue_time_utc": "2024-07-06T00:00:00Z",
753
+ "source_row": 186922
754
+ },
755
+ {
756
+ "storm_id": "2024198N08130",
757
+ "issue_time_utc": "2024-07-17T12:00:00Z",
758
+ "source_row": 186961
759
+ },
760
+ {
761
+ "storm_id": "2024198N08130",
762
+ "issue_time_utc": "2024-07-19T00:00:00Z",
763
+ "source_row": 186973
764
+ },
765
+ {
766
+ "storm_id": "2024198N08130",
767
+ "issue_time_utc": "2024-07-20T00:00:00Z",
768
+ "source_row": 186981
769
+ },
770
+ {
771
+ "storm_id": "2024201N12133",
772
+ "issue_time_utc": "2024-07-21T00:00:00Z",
773
+ "source_row": 187016
774
+ },
775
+ {
776
+ "storm_id": "2024201N12133",
777
+ "issue_time_utc": "2024-07-22T00:00:00Z",
778
+ "source_row": 187024
779
+ },
780
+ {
781
+ "storm_id": "2024201N12133",
782
+ "issue_time_utc": "2024-07-23T00:00:00Z",
783
+ "source_row": 187032
784
+ },
785
+ {
786
+ "storm_id": "2024218N23143",
787
+ "issue_time_utc": "2024-08-07T00:00:00Z",
788
+ "source_row": 187195
789
+ },
790
+ {
791
+ "storm_id": "2024218N23143",
792
+ "issue_time_utc": "2024-08-08T00:00:00Z",
793
+ "source_row": 187203
794
+ },
795
+ {
796
+ "storm_id": "2024218N23143",
797
+ "issue_time_utc": "2024-08-09T00:00:00Z",
798
+ "source_row": 187211
799
+ },
800
+ {
801
+ "storm_id": "2024225N14313",
802
+ "issue_time_utc": "2024-08-13T18:00:00Z",
803
+ "source_row": 187290
804
+ },
805
+ {
806
+ "storm_id": "2024225N14313",
807
+ "issue_time_utc": "2024-08-14T00:00:00Z",
808
+ "source_row": 187293
809
+ },
810
+ {
811
+ "storm_id": "2024225N14313",
812
+ "issue_time_utc": "2024-08-15T00:00:00Z",
813
+ "source_row": 187301
814
+ },
815
+ {
816
+ "storm_id": "2024225N22135",
817
+ "issue_time_utc": "2024-08-13T12:00:00Z",
818
+ "source_row": 187341
819
+ },
820
+ {
821
+ "storm_id": "2024225N22135",
822
+ "issue_time_utc": "2024-08-15T00:00:00Z",
823
+ "source_row": 187353
824
+ },
825
+ {
826
+ "storm_id": "2024225N22135",
827
+ "issue_time_utc": "2024-08-16T00:00:00Z",
828
+ "source_row": 187361
829
+ },
830
+ {
831
+ "storm_id": "2024231N14251",
832
+ "issue_time_utc": "2024-08-20T06:00:00Z",
833
+ "source_row": 187435
834
+ },
835
+ {
836
+ "storm_id": "2024231N14251",
837
+ "issue_time_utc": "2024-08-22T00:00:00Z",
838
+ "source_row": 187449
839
+ },
840
+ {
841
+ "storm_id": "2024231N14251",
842
+ "issue_time_utc": "2024-08-24T00:00:00Z",
843
+ "source_row": 187465
844
+ },
845
+ {
846
+ "storm_id": "2024233N15148",
847
+ "issue_time_utc": "2024-08-22T06:00:00Z",
848
+ "source_row": 187517
849
+ },
850
+ {
851
+ "storm_id": "2024233N15148",
852
+ "issue_time_utc": "2024-08-25T00:00:00Z",
853
+ "source_row": 187539
854
+ },
855
+ {
856
+ "storm_id": "2024233N15148",
857
+ "issue_time_utc": "2024-08-27T00:00:00Z",
858
+ "source_row": 187555
859
+ },
860
+ {
861
+ "storm_id": "2024235N16223",
862
+ "issue_time_utc": "2024-08-24T00:00:00Z",
863
+ "source_row": 187595
864
+ },
865
+ {
866
+ "storm_id": "2024235N16223",
867
+ "issue_time_utc": "2024-08-26T00:00:00Z",
868
+ "source_row": 187611
869
+ },
870
+ {
871
+ "storm_id": "2024235N16223",
872
+ "issue_time_utc": "2024-08-27T00:00:00Z",
873
+ "source_row": 187619
874
+ },
875
+ {
876
+ "storm_id": "2024238N25077",
877
+ "issue_time_utc": "2024-08-27T00:00:00Z",
878
+ "source_row": 187681
879
+ },
880
+ {
881
+ "storm_id": "2024238N25077",
882
+ "issue_time_utc": "2024-08-28T00:00:00Z",
883
+ "source_row": 187689
884
+ },
885
+ {
886
+ "storm_id": "2024238N25077",
887
+ "issue_time_utc": "2024-08-29T00:00:00Z",
888
+ "source_row": 187697
889
+ },
890
+ {
891
+ "storm_id": "2024244N09137",
892
+ "issue_time_utc": "2024-09-01T12:00:00Z",
893
+ "source_row": 187732
894
+ },
895
+ {
896
+ "storm_id": "2024244N09137",
897
+ "issue_time_utc": "2024-09-03T00:00:00Z",
898
+ "source_row": 187744
899
+ },
900
+ {
901
+ "storm_id": "2024244N09137",
902
+ "issue_time_utc": "2024-09-04T00:00:00Z",
903
+ "source_row": 187752
904
+ },
905
+ {
906
+ "storm_id": "2024253N11148",
907
+ "issue_time_utc": "2024-09-10T18:00:00Z",
908
+ "source_row": 187826
909
+ },
910
+ {
911
+ "storm_id": "2024253N11148",
912
+ "issue_time_utc": "2024-09-12T00:00:00Z",
913
+ "source_row": 187836
914
+ },
915
+ {
916
+ "storm_id": "2024253N11148",
917
+ "issue_time_utc": "2024-09-13T00:00:00Z",
918
+ "source_row": 187844
919
+ },
920
+ {
921
+ "storm_id": "2024259N12145",
922
+ "issue_time_utc": "2024-09-17T00:00:00Z",
923
+ "source_row": 187954
924
+ },
925
+ {
926
+ "storm_id": "2024259N12145",
927
+ "issue_time_utc": "2024-09-18T00:00:00Z",
928
+ "source_row": 187962
929
+ },
930
+ {
931
+ "storm_id": "2024259N12145",
932
+ "issue_time_utc": "2024-09-19T00:00:00Z",
933
+ "source_row": 187970
934
+ },
935
+ {
936
+ "storm_id": "2024269N39302",
937
+ "issue_time_utc": "2024-09-26T12:00:00Z",
938
+ "source_row": 188145
939
+ },
940
+ {
941
+ "storm_id": "2024269N39302",
942
+ "issue_time_utc": "2024-09-27T00:00:00Z",
943
+ "source_row": 188149
944
+ },
945
+ {
946
+ "storm_id": "2024269N39302",
947
+ "issue_time_utc": "2024-09-28T00:00:00Z",
948
+ "source_row": 188157
949
+ },
950
+ {
951
+ "storm_id": "2024274N14328",
952
+ "issue_time_utc": "2024-10-01T18:00:00Z",
953
+ "source_row": 188234
954
+ },
955
+ {
956
+ "storm_id": "2024274N14328",
957
+ "issue_time_utc": "2024-10-03T00:00:00Z",
958
+ "source_row": 188244
959
+ },
960
+ {
961
+ "storm_id": "2024274N14328",
962
+ "issue_time_utc": "2024-10-05T00:00:00Z",
963
+ "source_row": 188260
964
+ },
965
+ {
966
+ "storm_id": "2024275N10336",
967
+ "issue_time_utc": "2024-10-03T00:00:00Z",
968
+ "source_row": 188330
969
+ },
970
+ {
971
+ "storm_id": "2024275N10336",
972
+ "issue_time_utc": "2024-10-05T00:00:00Z",
973
+ "source_row": 188346
974
+ },
975
+ {
976
+ "storm_id": "2024275N10336",
977
+ "issue_time_utc": "2024-10-07T00:00:00Z",
978
+ "source_row": 188362
979
+ },
980
+ {
981
+ "storm_id": "2024278N11150",
982
+ "issue_time_utc": "2024-10-06T06:00:00Z",
983
+ "source_row": 188397
984
+ },
985
+ {
986
+ "storm_id": "2024278N11150",
987
+ "issue_time_utc": "2024-10-08T00:00:00Z",
988
+ "source_row": 188411
989
+ },
990
+ {
991
+ "storm_id": "2024278N11150",
992
+ "issue_time_utc": "2024-10-10T00:00:00Z",
993
+ "source_row": 188427
994
+ },
995
+ {
996
+ "storm_id": "2024293N13141",
997
+ "issue_time_utc": "2024-10-20T12:00:00Z",
998
+ "source_row": 188502
999
+ },
1000
+ {
1001
+ "storm_id": "2024293N13141",
1002
+ "issue_time_utc": "2024-10-22T00:00:00Z",
1003
+ "source_row": 188514
1004
+ },
1005
+ {
1006
+ "storm_id": "2024293N13141",
1007
+ "issue_time_utc": "2024-10-24T00:00:00Z",
1008
+ "source_row": 188530
1009
+ },
1010
+ {
1011
+ "storm_id": "2024298N13150",
1012
+ "issue_time_utc": "2024-10-26T00:00:00Z",
1013
+ "source_row": 188624
1014
+ },
1015
+ {
1016
+ "storm_id": "2024298N13150",
1017
+ "issue_time_utc": "2024-10-27T00:00:00Z",
1018
+ "source_row": 188632
1019
+ },
1020
+ {
1021
+ "storm_id": "2024298N13150",
1022
+ "issue_time_utc": "2024-10-28T00:00:00Z",
1023
+ "source_row": 188640
1024
+ },
1025
+ {
1026
+ "storm_id": "2024307N06143",
1027
+ "issue_time_utc": "2024-11-04T06:00:00Z",
1028
+ "source_row": 188682
1029
+ },
1030
+ {
1031
+ "storm_id": "2024307N06143",
1032
+ "issue_time_utc": "2024-11-06T00:00:00Z",
1033
+ "source_row": 188696
1034
+ },
1035
+ {
1036
+ "storm_id": "2024307N06143",
1037
+ "issue_time_utc": "2024-11-08T00:00:00Z",
1038
+ "source_row": 188712
1039
+ },
1040
+ {
1041
+ "storm_id": "2024313N10169",
1042
+ "issue_time_utc": "2024-11-09T18:00:00Z",
1043
+ "source_row": 188862
1044
+ },
1045
+ {
1046
+ "storm_id": "2024313N10169",
1047
+ "issue_time_utc": "2024-11-12T00:00:00Z",
1048
+ "source_row": 188880
1049
+ },
1050
+ {
1051
+ "storm_id": "2024313N10169",
1052
+ "issue_time_utc": "2024-11-15T00:00:00Z",
1053
+ "source_row": 188904
1054
+ },
1055
+ {
1056
+ "storm_id": "2024329N04089",
1057
+ "issue_time_utc": "2024-11-25T18:00:00Z",
1058
+ "source_row": 189139
1059
+ },
1060
+ {
1061
+ "storm_id": "2024329N04089",
1062
+ "issue_time_utc": "2024-11-27T00:00:00Z",
1063
+ "source_row": 189149
1064
+ },
1065
+ {
1066
+ "storm_id": "2024329N04089",
1067
+ "issue_time_utc": "2024-11-29T00:00:00Z",
1068
+ "source_row": 189165
1069
+ },
1070
+ {
1071
+ "storm_id": "2025182N22149",
1072
+ "issue_time_utc": "2025-07-03T00:00:00Z",
1073
+ "source_row": 190688
1074
+ },
1075
+ {
1076
+ "storm_id": "2025182N22149",
1077
+ "issue_time_utc": "2025-07-05T00:00:00Z",
1078
+ "source_row": 190704
1079
+ },
1080
+ {
1081
+ "storm_id": "2025182N22149",
1082
+ "issue_time_utc": "2025-07-06T00:00:00Z",
1083
+ "source_row": 190712
1084
+ },
1085
+ {
1086
+ "storm_id": "2025203N20124",
1087
+ "issue_time_utc": "2025-07-24T00:00:00Z",
1088
+ "source_row": 190874
1089
+ },
1090
+ {
1091
+ "storm_id": "2025203N20124",
1092
+ "issue_time_utc": "2025-07-27T00:00:00Z",
1093
+ "source_row": 190898
1094
+ },
1095
+ {
1096
+ "storm_id": "2025203N20124",
1097
+ "issue_time_utc": "2025-07-29T00:00:00Z",
1098
+ "source_row": 190914
1099
+ },
1100
+ {
1101
+ "storm_id": "2025205N13145",
1102
+ "issue_time_utc": "2025-07-25T12:00:00Z",
1103
+ "source_row": 190949
1104
+ },
1105
+ {
1106
+ "storm_id": "2025205N13145",
1107
+ "issue_time_utc": "2025-07-28T00:00:00Z",
1108
+ "source_row": 190969
1109
+ },
1110
+ {
1111
+ "storm_id": "2025205N13145",
1112
+ "issue_time_utc": "2025-07-31T00:00:00Z",
1113
+ "source_row": 190993
1114
+ },
1115
+ {
1116
+ "storm_id": "2025215N33284",
1117
+ "issue_time_utc": "2025-08-04T18:00:00Z",
1118
+ "source_row": 191117
1119
+ },
1120
+ {
1121
+ "storm_id": "2025215N33284",
1122
+ "issue_time_utc": "2025-08-06T00:00:00Z",
1123
+ "source_row": 191127
1124
+ },
1125
+ {
1126
+ "storm_id": "2025215N33284",
1127
+ "issue_time_utc": "2025-08-08T00:00:00Z",
1128
+ "source_row": 191143
1129
+ },
1130
+ {
1131
+ "storm_id": "2025216N13243",
1132
+ "issue_time_utc": "2025-08-06T06:00:00Z",
1133
+ "source_row": 191178
1134
+ },
1135
+ {
1136
+ "storm_id": "2025216N13243",
1137
+ "issue_time_utc": "2025-08-08T00:00:00Z",
1138
+ "source_row": 191192
1139
+ },
1140
+ {
1141
+ "storm_id": "2025216N13243",
1142
+ "issue_time_utc": "2025-08-09T00:00:00Z",
1143
+ "source_row": 191200
1144
+ },
1145
+ {
1146
+ "storm_id": "2025218N19149",
1147
+ "issue_time_utc": "2025-08-07T18:00:00Z",
1148
+ "source_row": 191235
1149
+ },
1150
+ {
1151
+ "storm_id": "2025218N19149",
1152
+ "issue_time_utc": "2025-08-09T00:00:00Z",
1153
+ "source_row": 191245
1154
+ },
1155
+ {
1156
+ "storm_id": "2025218N19149",
1157
+ "issue_time_utc": "2025-08-10T00:00:00Z",
1158
+ "source_row": 191253
1159
+ },
1160
+ {
1161
+ "storm_id": "2025223N17337",
1162
+ "issue_time_utc": "2025-08-13T00:00:00Z",
1163
+ "source_row": 191307
1164
+ },
1165
+ {
1166
+ "storm_id": "2025223N17337",
1167
+ "issue_time_utc": "2025-08-18T00:00:00Z",
1168
+ "source_row": 191347
1169
+ },
1170
+ {
1171
+ "storm_id": "2025223N17337",
1172
+ "issue_time_utc": "2025-08-22T00:00:00Z",
1173
+ "source_row": 191379
1174
+ },
1175
+ {
1176
+ "storm_id": "2025243N14239",
1177
+ "issue_time_utc": "2025-09-02T00:00:00Z",
1178
+ "source_row": 191506
1179
+ },
1180
+ {
1181
+ "storm_id": "2025243N14239",
1182
+ "issue_time_utc": "2025-09-04T00:00:00Z",
1183
+ "source_row": 191522
1184
+ },
1185
+ {
1186
+ "storm_id": "2025243N14239",
1187
+ "issue_time_utc": "2025-09-06T00:00:00Z",
1188
+ "source_row": 191538
1189
+ },
1190
+ {
1191
+ "storm_id": "2025260N13138",
1192
+ "issue_time_utc": "2025-09-18T18:00:00Z",
1193
+ "source_row": 191710
1194
+ },
1195
+ {
1196
+ "storm_id": "2025260N13138",
1197
+ "issue_time_utc": "2025-09-19T00:00:00Z",
1198
+ "source_row": 191712
1199
+ },
1200
+ {
1201
+ "storm_id": "2025260N13138",
1202
+ "issue_time_utc": "2025-09-20T00:00:00Z",
1203
+ "source_row": 191720
1204
+ },
1205
+ {
1206
+ "storm_id": "2025261N19312",
1207
+ "issue_time_utc": "2025-09-19T18:00:00Z",
1208
+ "source_row": 191757
1209
+ },
1210
+ {
1211
+ "storm_id": "2025261N19312",
1212
+ "issue_time_utc": "2025-09-21T00:00:00Z",
1213
+ "source_row": 191767
1214
+ },
1215
+ {
1216
+ "storm_id": "2025261N19312",
1217
+ "issue_time_utc": "2025-09-23T00:00:00Z",
1218
+ "source_row": 191783
1219
+ },
1220
+ {
1221
+ "storm_id": "2025261N23166",
1222
+ "issue_time_utc": "2025-09-19T12:00:00Z",
1223
+ "source_row": 191822
1224
+ },
1225
+ {
1226
+ "storm_id": "2025261N23166",
1227
+ "issue_time_utc": "2025-09-23T00:00:00Z",
1228
+ "source_row": 191850
1229
+ },
1230
+ {
1231
+ "storm_id": "2025261N23166",
1232
+ "issue_time_utc": "2025-09-26T00:00:00Z",
1233
+ "source_row": 191874
1234
+ },
1235
+ {
1236
+ "storm_id": "2025265N14261",
1237
+ "issue_time_utc": "2025-09-23T18:00:00Z",
1238
+ "source_row": 191907
1239
+ },
1240
+ {
1241
+ "storm_id": "2025265N14261",
1242
+ "issue_time_utc": "2025-09-25T00:00:00Z",
1243
+ "source_row": 191917
1244
+ },
1245
+ {
1246
+ "storm_id": "2025265N14261",
1247
+ "issue_time_utc": "2025-09-26T00:00:00Z",
1248
+ "source_row": 191925
1249
+ },
1250
+ {
1251
+ "storm_id": "2025270N21285",
1252
+ "issue_time_utc": "2025-09-28T18:00:00Z",
1253
+ "source_row": 192030
1254
+ },
1255
+ {
1256
+ "storm_id": "2025270N21285",
1257
+ "issue_time_utc": "2025-09-30T00:00:00Z",
1258
+ "source_row": 192040
1259
+ },
1260
+ {
1261
+ "storm_id": "2025270N21285",
1262
+ "issue_time_utc": "2025-10-01T00:00:00Z",
1263
+ "source_row": 192048
1264
+ },
1265
+ {
1266
+ "storm_id": "2025273N09248",
1267
+ "issue_time_utc": "2025-10-01T18:00:00Z",
1268
+ "source_row": 192081
1269
+ },
1270
+ {
1271
+ "storm_id": "2025273N09248",
1272
+ "issue_time_utc": "2025-10-03T00:00:00Z",
1273
+ "source_row": 192091
1274
+ },
1275
+ {
1276
+ "storm_id": "2025273N09248",
1277
+ "issue_time_utc": "2025-10-04T00:00:00Z",
1278
+ "source_row": 192099
1279
+ },
1280
+ {
1281
+ "storm_id": "2025280N13147",
1282
+ "issue_time_utc": "2025-10-08T12:00:00Z",
1283
+ "source_row": 192259
1284
+ },
1285
+ {
1286
+ "storm_id": "2025280N13147",
1287
+ "issue_time_utc": "2025-10-10T00:00:00Z",
1288
+ "source_row": 192271
1289
+ },
1290
+ {
1291
+ "storm_id": "2025280N13147",
1292
+ "issue_time_utc": "2025-10-11T00:00:00Z",
1293
+ "source_row": 192279
1294
+ },
1295
+ {
1296
+ "storm_id": "2025294N14290",
1297
+ "issue_time_utc": "2025-10-23T06:00:00Z",
1298
+ "source_row": 192400
1299
+ },
1300
+ {
1301
+ "storm_id": "2025294N14290",
1302
+ "issue_time_utc": "2025-10-25T00:00:00Z",
1303
+ "source_row": 192414
1304
+ },
1305
+ {
1306
+ "storm_id": "2025294N14290",
1307
+ "issue_time_utc": "2025-10-27T00:00:00Z",
1308
+ "source_row": 192430
1309
+ },
1310
+ {
1311
+ "storm_id": "2025308N09144",
1312
+ "issue_time_utc": "2025-11-06T06:00:00Z",
1313
+ "source_row": 192525
1314
+ },
1315
+ {
1316
+ "storm_id": "2025308N09144",
1317
+ "issue_time_utc": "2025-11-07T00:00:00Z",
1318
+ "source_row": 192531
1319
+ },
1320
+ {
1321
+ "storm_id": "2025308N09144",
1322
+ "issue_time_utc": "2025-11-08T00:00:00Z",
1323
+ "source_row": 192539
1324
+ },
1325
+ {
1326
+ "storm_id": "2025328N07132",
1327
+ "issue_time_utc": "2025-11-25T12:00:00Z",
1328
+ "source_row": 192611
1329
+ },
1330
+ {
1331
+ "storm_id": "2025328N07132",
1332
+ "issue_time_utc": "2025-11-27T00:00:00Z",
1333
+ "source_row": 192623
1334
+ },
1335
+ {
1336
+ "storm_id": "2025328N07132",
1337
+ "issue_time_utc": "2025-11-28T00:00:00Z",
1338
+ "source_row": 192631
1339
+ },
1340
+ {
1341
+ "storm_id": "2026014N08133",
1342
+ "issue_time_utc": "2026-01-15T18:00:00Z",
1343
+ "source_row": 192940
1344
+ },
1345
+ {
1346
+ "storm_id": "2026014N08133",
1347
+ "issue_time_utc": "2026-01-16T00:00:00Z",
1348
+ "source_row": 192942
1349
+ },
1350
+ {
1351
+ "storm_id": "2026014N08133",
1352
+ "issue_time_utc": "2026-01-17T00:00:00Z",
1353
+ "source_row": 192950
1354
+ }
1355
+ ],
1356
+ "leads_hours": [
1357
+ 6,
1358
+ 12,
1359
+ 18,
1360
+ 24,
1361
+ 30,
1362
+ 36,
1363
+ 42,
1364
+ 48,
1365
+ 54,
1366
+ 60,
1367
+ 66,
1368
+ 72,
1369
+ 78,
1370
+ 84,
1371
+ 90,
1372
+ 96,
1373
+ 102,
1374
+ 108,
1375
+ 114,
1376
+ 120
1377
+ ],
1378
+ "member_policy": {
1379
+ "1.1": "saved released causal route pipeline",
1380
+ "1.2": "50 causal historical-input perturbations"
1381
+ },
1382
+ "case_and_truth_alignment": "Exact source-row order and truth-array equality verified",
1383
+ "v11_coordinate_correction": "Archived v11_local held absolute latitude/longitude from build_v11_routes; converted to issue-centred east/north km using the same projection as 1.2. Round-trip back to original coordinates verified. Original archives preserved.",
1384
+ "coordinate_bug_evidence": "benchmark_100_storms_3_days_gpu.py build_v11_routes returns local_to_absolute; benchmark_strict_causal_post2021.py stores and scores that output as local",
1385
+ "source_sha256": {
1386
+ "routes_and_truth.npz": "0eeca56da8ddf0be05ea7f24f6391fa97b44abc6067a7d20e3ed2199948402cb",
1387
+ "v173_e4_causal_ensemble50.npz": "4afc595af1c02096d2cb38563069a9b2fc37c8cff2b439b77eac2ed96e34223e"
1388
+ },
1389
+ "evaluation": "Previously inspected development cohort; not an untouched test",
1390
+ "pressure_comparison": "No verified same-270 1.1 central-pressure predictions in these route artifacts",
1391
+ "metrics": {
1392
+ "1.1": {
1393
+ "mean_direction_error_deg": 56.224109933853484,
1394
+ "direction_valid_case_leads": 5382,
1395
+ "direction_error_by_lead_deg": [
1396
+ 35.376735350376315,
1397
+ 39.04085642408663,
1398
+ 41.84661514271722,
1399
+ 45.83975846734542,
1400
+ 47.37377074215214,
1401
+ 49.327465606399024,
1402
+ 50.46348722733851,
1403
+ 54.86659740372887,
1404
+ 56.30089781182022,
1405
+ 57.23358486168399,
1406
+ 57.77341299262603,
1407
+ 58.61589950857845,
1408
+ 59.73200733004693,
1409
+ 63.0566298922528,
1410
+ 64.31807942714183,
1411
+ 65.15121387967757,
1412
+ 67.21211258755886,
1413
+ 68.75098804532918,
1414
+ 69.86318419006498,
1415
+ 72.4304439104859
1416
+ ],
1417
+ "shape_similarity": 0.7273390579011202,
1418
+ "path_similarity": 0.4982542158756425,
1419
+ "frechet_distance_km": 1846.0660724601532,
1420
+ "mean_track_error_km": 902.3001335283294,
1421
+ "track_error_120h_km": 1833.248050790743,
1422
+ "track_error_by_lead_km": [
1423
+ 72.83047798028892,
1424
+ 143.7031988997466,
1425
+ 218.81520405669625,
1426
+ 298.11070353987276,
1427
+ 383.2202648240788,
1428
+ 468.59663976099824,
1429
+ 556.5655286038506,
1430
+ 645.2980389540552,
1431
+ 737.135072129729,
1432
+ 829.6157685725765,
1433
+ 926.2267863717025,
1434
+ 1023.1843957126057,
1435
+ 1120.4391844884701,
1436
+ 1215.8258986190094,
1437
+ 1311.7024736815893,
1438
+ 1409.9824301670455,
1439
+ 1512.542524706109,
1440
+ 1615.4797405994266,
1441
+ 1723.4802881079943,
1442
+ 1833.248050790743
1443
+ ]
1444
+ },
1445
+ "1.2": {
1446
+ "mean_direction_error_deg": 44.82410582100325,
1447
+ "direction_valid_case_leads": 5382,
1448
+ "direction_error_by_lead_deg": [
1449
+ 36.25941228123098,
1450
+ 33.88013277907527,
1451
+ 34.643787847336824,
1452
+ 34.06597703664401,
1453
+ 35.423101821901085,
1454
+ 36.7642782901153,
1455
+ 37.12306177100245,
1456
+ 40.465840704159696,
1457
+ 41.667017709824904,
1458
+ 43.89901651916857,
1459
+ 44.237500130825865,
1460
+ 47.838901134083436,
1461
+ 50.20241821866026,
1462
+ 52.139426961020135,
1463
+ 53.0625456572982,
1464
+ 54.505926115819186,
1465
+ 51.702615067231996,
1466
+ 54.17702333067101,
1467
+ 56.35220917469586,
1468
+ 58.13561978499343
1469
+ ],
1470
+ "shape_similarity": 0.8248619534359414,
1471
+ "path_similarity": 0.572741072679436,
1472
+ "frechet_distance_km": 1448.9280510782903,
1473
+ "mean_track_error_km": 714.4443964636909,
1474
+ "track_error_120h_km": 1433.386298169391,
1475
+ "track_error_by_lead_km": [
1476
+ 74.23278291974508,
1477
+ 135.98613318519742,
1478
+ 200.51040487908233,
1479
+ 264.42285452265423,
1480
+ 331.912096438488,
1481
+ 398.2936844173551,
1482
+ 462.17975918622324,
1483
+ 527.1381891567528,
1484
+ 592.8904971261559,
1485
+ 656.8626751389817,
1486
+ 724.6075869478913,
1487
+ 794.7504655422908,
1488
+ 866.5308324070188,
1489
+ 939.3627081466329,
1490
+ 1015.0732933879962,
1491
+ 1092.8305420515087,
1492
+ 1173.491437623694,
1493
+ 1258.1433847435899,
1494
+ 1346.2823032831702,
1495
+ 1433.3862981693903
1496
+ ]
1497
+ }
1498
+ },
1499
+ "similarity_definitions": {
1500
+ "direction": "Mean absolute wrapped 6-hour heading difference, common mask: both models and truth move >1 km; issue origin included",
1501
+ "shape": "Mean (1 + cosine similarity)/2 of centered flattened 20-lead routes; translation and scalar scale removed, orientation preserved",
1502
+ "path": "Mean exp(-discrete Frechet distance / truth route length); same 20 forecast points and issue-origin-inclusive truth length",
1503
+ "position": "Euclidean displacement error in the existing benchmark local-km coordinate system"
1504
+ },
1505
+ "mean_track_error_reduction_percent": 20.81965081065129
1506
+ }
evaluation/trackformer_1_2_vs_1_1_route_examples.png ADDED

Git LFS Details

  • SHA256: 463df86fa2e6f31f0ac14a87b7110cbd437bf0298b6ba3e90a874f891c72c5fa
  • Pointer size: 131 Bytes
  • Size of remote file: 379 kB
evaluation/trackformer_1_2_vs_1_1_tip_bars.png ADDED
evaluation/trackformer_1_2_vs_1_1_tip_metrics.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "title": "Trackformer 1.2 versus 1.1 TIP ten-start development diagnostic",
3
+ "issue_times_utc": [
4
+ "1979-10-12T00:00:00", "1979-10-12T06:00:00",
5
+ "1979-10-12T12:00:00", "1979-10-12T18:00:00",
6
+ "1979-10-13T00:00:00", "1979-10-13T06:00:00",
7
+ "1979-10-13T12:00:00", "1979-10-13T18:00:00",
8
+ "1979-10-14T00:00:00", "1979-10-14T06:00:00"
9
+ ],
10
+ "lead_hours": [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96, 102, 108, 114, 120],
11
+ "trackformer_1_1": {
12
+ "mean_track_error_km": 383.851708984375,
13
+ "central_pressure_mae_hpa": 20.0993,
14
+ "member_policy": "released prediction pipeline"
15
+ },
16
+ "trackformer_1_2": {
17
+ "mean_track_error_km": 370.4600524902344,
18
+ "central_pressure_mae_hpa": 30.722952880859374,
19
+ "member_policy": "mean of 50 distinct causal historical-input perturbations",
20
+ "inference_weights_sha256": "db49f36e85a3766defc4c172746897a1f783705d1ce8e6f9dfb8e87ae1d902cb"
21
+ },
22
+ "limitations": [
23
+ "Ten overlapping starts of one storm, not ten independent storms",
24
+ "Repeatedly inspected development cohort, not untouched holdout",
25
+ "Different input and member pipelines; this is not a controlled architecture ablation",
26
+ "Trackformer 1.2 improves mean track error slightly but worsens central-pressure MAE"
27
+ ]
28
+ }
evaluation/trackformer_1_2_yagi_video_poster.png ADDED

Git LFS Details

  • SHA256: c821695a397b72fbe48d15ca6b458ba61e3ba8cc1e32b67223aee21a50ec112e
  • Pointer size: 131 Bytes
  • Size of remote file: 214 kB
paper/release_data/bavi_coastlines.json DELETED
@@ -1 +0,0 @@
1
- [[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]],[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]]
 
 
paper/release_data/bavi_video.json DELETED
@@ -1,55 +0,0 @@
1
- {
2
- "model": "Trackformer 1.2",
3
- "storm": "BAVI",
4
- "storm_id": "2026182N09163",
5
- "issue_time_utc": "2026-07-03T06:00:00Z",
6
- "members": 50,
7
- "leads_hours": [
8
- 6,
9
- 12,
10
- 18,
11
- 24,
12
- 30,
13
- 36,
14
- 42,
15
- 48,
16
- 54,
17
- 60,
18
- 66,
19
- 72,
20
- 78,
21
- 84,
22
- 90,
23
- 96,
24
- 102,
25
- 108,
26
- 114,
27
- 120
28
- ],
29
- "source_archive_sha256": "96392e7c44e2050b2b67803262ff470b093cf93c0bcd061b59312dc0502bb860",
30
- "inputs_sha256": "1ca0e8087e5efca02e0f72421fbe5f7aff747cd08172ab4d4c92f0acc8a0926e",
31
- "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
32
- "data_sha256": "9251fb82ebde819eced999c3440aa9b0a24251c29a4c2f6a4670f4137b9c5aff",
33
- "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
34
- "forecast_source": "Saved 50 smooth historical-input perturbation means from the released checkpoint; no new inference for this video.",
35
- "route_projection_correction": "Undo the archived predicted-latitude longitude conversion and restore the issue-latitude projection used by ensemble inference. Original route retained; round-trip verified.",
36
- "observed_route_source": "Exact six-hour LAT/LON from local IBTrACS WP archive, storm 2026182N09163.",
37
- "observed_pressure_source": "IBTrACS USA_PRES; not JMA/WMO pressure. Missing labels are masked.",
38
- "field_display": "Unchanged physical member-mean basin field, overlaid with the unchanged regional reconstruction only within its fixed coverage. No synthetic pressure extension or future observed pressure map.",
39
- "regional_bounds": [
40
- 139.25,
41
- 169.25,
42
- -2.0,
43
- 28.0
44
- ],
45
- "qualification": "Requested Bavi development showcase, not an untouched holdout or a claim of typical skill.",
46
- "video": {
47
- "frames": 20,
48
- "duration_seconds": 23,
49
- "codec": "H.264",
50
- "encoder": "h264_videotoolbox",
51
- "file": "docs/trackformer_1_2_bavi.mp4",
52
- "sha256": "33ecd068f1eee144b10301d6261dfad673557b2b38050e159e39935cccc3872c",
53
- "playback": "1 second per six-hour lead; final frame held for 3 seconds; no interpolated forecast states"
54
- }
55
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
paper/release_data/pressure_showcase.json DELETED
@@ -1,28 +0,0 @@
1
- {
2
- "public_model": "Trackformer 1.2",
3
- "storm_name": "PRAPIROON",
4
- "storm_id": "2024198N08130",
5
- "issue_time_utc": "2024-07-19T00:00:00Z",
6
- "case_index": 151,
7
- "source_row": 186973,
8
- "members": 50,
9
- "member_policy": "50 smooth historical-input perturbations, not latent samples",
10
- "selection_rule": "Among the saved 270 cases, require both routes within the fixed regional patch with 1-degree margin and valid basin coverage, shape >=0.90, heading error <=30 degrees, >=18 pressure labels and central-pressure MAE <=15 hPa; choose lowest mean track error. No field values altered.",
11
- "eligible_cases": 4,
12
- "selected_best_not_representative": true,
13
- "metrics": {
14
- "mean_track_error_km": 133.2238587752683,
15
- "track_error_120h_km": 305.1292398492091,
16
- "shape_similarity": 0.9809541562706234,
17
- "direction_error_deg": 29.459619452579773,
18
- "direction_valid_steps": 20
19
- },
20
- "central_pressure_mae_hpa": 2.908013343811035,
21
- "native_history_available": false,
22
- "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
23
- "archive_sha256": "4afc595af1c02096d2cb38563069a9b2fc37c8cff2b439b77eac2ed96e34223e",
24
- "data_sha256": "2e271cf728daf219662f3f2f2c519dccb9d63695cd97d2b5e5f2484f3d822648",
25
- "observed_route_source": "Exact six-hour issue-centre coordinates from the same storm in track_windows_v13, not a reconstruction from cumulative local steps. Retrospective best-track verification only.",
26
- "field_source": "Unmodified saved ensemble50_native_mslp_hpa: model basin-plus-moving-core reconstruction on the fixed issue-anchored geographic grid. 0.25-degree output sampling is not native forecast resolution.",
27
- "note": "Mean route and mean central pressure need not equal the minimum of the mean field."
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
release_tools/build_bavi_video.py DELETED
@@ -1,122 +0,0 @@
1
- """Render saved Trackformer 1.2 Bavi means as an MP4; no new inference.
2
-
3
- Requires numpy, matplotlib and ffmpeg. --source-root prepares the public subset.
4
- The active GPU benchmark is not stopped or modified.
5
- """
6
- import argparse,csv,hashlib,json,subprocess
7
- from datetime import datetime,timedelta,timezone
8
- from pathlib import Path
9
- import numpy as np
10
- import matplotlib
11
- matplotlib.use('Agg')
12
- import matplotlib.pyplot as plt
13
- from matplotlib.patches import Rectangle
14
-
15
- REPO=Path(__file__).resolve().parents[1]
16
- DATA=REPO/'paper/release_data'
17
-
18
- def sha(path):
19
- h=hashlib.sha256()
20
- with Path(path).open('rb') as f:
21
- for b in iter(lambda:f.read(8*1024**2),b''):h.update(b)
22
- return h.hexdigest()
23
-
24
- def prepare(root):
25
- source=root/'benchmark_ensemble50/v173_e4/showcase_four.npz'
26
- inputs=root/'runs/four_v166_maps/bavi/inputs.npz'
27
- with np.load(inputs) as z:
28
- lat,lon,center=z['latitude'],z['longitude'],z['center']
29
- times=z['time'];issue=int(z['observation_ns'])
30
- assert int(times[-1])<=issue and len(times)==9
31
- with np.load(source) as z:
32
- i=z['storms'].tolist().index('bavi');assert int(z['member_count'])==50
33
- raw=z['route'][i].astype('float64');p=z['pressure'][i];coarse=z['fields'][i];native=z['native'][i]
34
- # The old writer converted issue-centred local km back to longitude with
35
- # predicted latitude. Undo that projection and use the actual issue latitude,
36
- # recovering the member-mean geographic centres (to stored float precision).
37
- east=((raw[:,1]-center[1]+180)%360-180)*111.2*np.maximum(np.cos(np.deg2rad(raw[:,0])),.2)
38
- route=raw.copy();route[:,1]=center[1]+east/(111.2*max(np.cos(np.deg2rad(center[0])),.2))
39
- roundtrip=center[1]+(route[:,1]-center[1])*max(np.cos(np.deg2rad(center[0])),.2)/np.maximum(np.cos(np.deg2rad(raw[:,0])),.2)
40
- assert np.allclose(roundtrip,raw[:,1],atol=1e-6)
41
- rows={}
42
- csvpath=root/'data/ibtracs/ibtracs.WP.list.v04r01.csv'
43
- with csvpath.open() as f:
44
- for r in csv.DictReader(f):
45
- if r['SID']=='2026182N09163':rows[r['ISO_TIME']]=r
46
- t=datetime.fromtimestamp(issue/1e9,timezone.utc);obs=[];truthp=[]
47
- for k in range(21):
48
- r=rows[(t+timedelta(hours=6*k)).strftime('%Y-%m-%d %H:%M:%S')]
49
- obs.append([float(r['LAT']),float(r['LON'])]);value=r['USA_PRES'].strip()
50
- truthp.append(float(value) if value else np.nan)
51
- assert np.allclose(obs[0],center,atol=.001)
52
- path=DATA/'bavi_video.npz'
53
- np.savez_compressed(path,forecast_lat_lon=np.vstack([center,route]),original_archive_route=raw,observed_lat_lon=np.array(obs),central_pressure_hpa=p,observed_pressure_hpa=np.array(truthp)[1:],regional_pressure_hpa=native,basin_pressure_hpa=coarse,latitude=lat,longitude=lon)
54
- rings=json.loads((root/'trackformer-weatherlab-site/public/data/history/coastlines.json').read_text())
55
- rings=[r for r in rings if any(125<=x<=161 and 5<=y<=30 for x,y in r)]
56
- (DATA/'bavi_coastlines.json').write_text(json.dumps(rings,separators=(',',':'))+'\n')
57
- meta={'model':'Trackformer 1.2','storm':'BAVI','storm_id':'2026182N09163','issue_time_utc':t.isoformat().replace('+00:00','Z'),'members':50,'leads_hours':list(range(6,121,6)),
58
- 'source_archive_sha256':sha(source),'inputs_sha256':sha(inputs),'observed_csv_sha256':sha(csvpath),'data_sha256':sha(path),
59
- 'checkpoint_sha256':'f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0',
60
- 'forecast_source':'Saved 50 smooth historical-input perturbation means from the released checkpoint; no new inference for this video.',
61
- 'route_projection_correction':'Undo the archived predicted-latitude longitude conversion and restore the issue-latitude projection used by ensemble inference. Original route retained; round-trip verified.',
62
- 'observed_route_source':'Exact six-hour LAT/LON from local IBTrACS WP archive, storm 2026182N09163.',
63
- 'observed_pressure_source':'IBTrACS USA_PRES; not JMA/WMO pressure. Missing labels are masked.',
64
- 'field_display':'Unchanged physical member-mean basin field, overlaid with the unchanged regional reconstruction only within its fixed coverage. No synthetic pressure extension or future observed pressure map.',
65
- 'regional_bounds':[float(lon.min()),float(lon.max()),float(lat.min()),float(lat.max())],
66
- 'qualification':'Requested Bavi development showcase, not an untouched holdout or a claim of typical skill.'}
67
- (DATA/'bavi_video.json').write_text(json.dumps(meta,indent=2)+'\n')
68
-
69
- def build(work):
70
- work.mkdir(parents=True,exist_ok=True)
71
- meta=json.loads((DATA/'bavi_video.json').read_text());assert sha(DATA/'bavi_video.npz')==meta['data_sha256']
72
- with np.load(DATA/'bavi_video.npz') as z:a={k:z[k] for k in z.files}
73
- rings=json.loads((DATA/'bavi_coastlines.json').read_text())
74
- f,o=a['forecast_lat_lon'],a['observed_lat_lon'];lat,lon=a['latitude'],a['longitude']
75
- bounds=[127,159,6,27];levels=np.arange(932,1025,2);contours=np.arange(932,1025,4)
76
- glat=np.linspace(60,0,25);glon=np.linspace(100,180,33);lead=np.arange(6,121,6)
77
- start=datetime.fromisoformat(meta['issue_time_utc'].replace('Z','+00:00'))
78
- plt.rcParams.update({'font.size':12,'axes.titlesize':15})
79
- for k in range(20):
80
- fig=plt.figure(figsize=(16,10),dpi=100,facecolor='#f8fafb')
81
- gs=fig.add_gridspec(2,2,width_ratios=[3.9,1.25],height_ratios=[4.5,1.25],left=.055,right=.94,bottom=.10,top=.86,wspace=.25,hspace=.35)
82
- ax=fig.add_subplot(gs[0,:]);ax.set_facecolor('#f8fafb')
83
- ax.contourf(glon,glat,a['basin_pressure_hpa'][k],levels=levels,cmap='RdYlBu_r',extend='both')
84
- ax.contour(glon,glat,a['basin_pressure_hpa'][k],levels=contours,colors='#546971',linewidths=.45)
85
- im=ax.contourf(lon,lat,a['regional_pressure_hpa'][k],levels=levels,cmap='RdYlBu_r',extend='both')
86
- cs=ax.contour(lon,lat,a['regional_pressure_hpa'][k],levels=contours,colors='#354b58',linewidths=.65)
87
- ax.clabel(cs,levels=np.arange(936,1025,12),fmt='%d',fontsize=9)
88
- for ring in rings:
89
- xy=np.asarray(ring);ax.plot(xy[:,0],xy[:,1],c='#66716b',lw=.8)
90
- ax.add_patch(Rectangle((lon.min(),lat.min()),np.ptp(lon),np.ptp(lat),fill=False,edgecolor='#265b61',lw=1.2,ls=':'))
91
- for points,color,label,style in [(o,'#182f42','Observed best track','--'),(f,'#b31565','Trackformer 1.2 mean of 50','-')]:
92
- ax.plot(points[:,1],points[:,0],ls=style,c=color,alpha=.25,lw=1.6)
93
- ax.plot(points[:k+2,1],points[:k+2,0],ls=style,c=color,lw=2.8,label=label)
94
- ax.scatter(points[k+1,1],points[k+1,0],s=75,c=color,edgecolors='white',linewidths=1.8,zorder=6)
95
- ax.set(xlim=bounds[:2],ylim=bounds[2:],xlabel='Longitude °E',ylabel='Latitude °N');ax.grid(alpha=.13);ax.set_aspect(1/np.cos(np.deg2rad(16.5)))
96
- ax.legend(loc='lower left',fontsize=11,framealpha=.95)
97
- ax.text(.985,.03,'Dotted boundary: fixed regional reconstruction\nOutside: 2.5° basin pressure only',transform=ax.transAxes,ha='right',va='bottom',fontsize=10,bbox={'facecolor':'white','alpha':.9,'edgecolor':'none','pad':5})
98
- cax=fig.add_axes([.952,.35,.014,.45]);fig.colorbar(im,cax=cax,label='Model mean sea-level pressure (hPa)')
99
- curve=fig.add_subplot(gs[1,0]);curve.plot(lead,a['central_pressure_hpa'],c='#b31565',lw=2,label='Model central pressure');curve.plot(lead,a['observed_pressure_hpa'],'--',c='#182f42',lw=2,label='Observed pressure (IBTrACS USA)')
100
- curve.axvline(lead[k],c='#688e98',lw=1.5);curve.scatter([lead[k]],[a['central_pressure_hpa'][k]],c='#b31565',s=40,zorder=4)
101
- curve.set(xlim=(6,120),xlabel='Forecast lead (hours)',ylabel='Central pressure (hPa)',xticks=[6,24,48,72,96,120]);curve.grid(alpha=.2);curve.legend(loc='upper right',fontsize=10,ncol=2)
102
- info=fig.add_subplot(gs[1,1]);info.axis('off');p=a['central_pressure_hpa'][k];op=a['observed_pressure_hpa'][k]
103
- inside=lon.min()<=f[k+1,1]<=lon.max() and lat.min()<=f[k+1,0]<=lat.max()
104
- msg=f'Model centre: {p:.1f} hPa\nObserved: {op:.0f} hPa\n\n'+('Centre within regional field' if inside else 'Centre outside regional patch\nDetailed core is not shown here')
105
- info.text(0,1,msg,va='top',fontsize=13,color='#244754')
106
- valid=start+timedelta(hours=int(lead[k]));fig.suptitle(f'Trackformer 1.2 / BAVI / +{lead[k]:03d} h',x=.055,y=.97,ha='left',fontsize=24,fontweight='bold',color='#173947')
107
- fig.text(.055,.915,f'Issue: {start:%d %b %Y %H:%M} UTC | Valid: {valid:%d %b %Y %H:%M} UTC | 50-member mean',fontsize=14,color='#385865')
108
- fig.text(.055,.035,'Actual model pressure fields; observed route is verification only. Mean central pressure is not the minimum of the mean map.',fontsize=11,color='#47636d')
109
- fig.savefig(work/f'frame_{k:03d}.png',dpi=100);
110
- if k==9:fig.savefig(REPO/'paper/trackformer_1_2_bavi_video_poster.png',dpi=100)
111
- plt.close(fig)
112
- output=REPO/'docs/trackformer_1_2_bavi.mp4'
113
- cmd=['ffmpeg','-y','-hide_banner','-loglevel','warning','-framerate','1','-i',str(work/'frame_%03d.png'),'-vf','fps=30,tpad=stop_mode=clone:stop_duration=3','-c:v','h264_videotoolbox','-b:v','4M','-pix_fmt','yuv420p','-movflags','+faststart','-an',str(output)]
114
- subprocess.run(cmd,check=True)
115
- meta['video']={'frames':20,'duration_seconds':23,'codec':'H.264','encoder':'h264_videotoolbox','file':'docs/trackformer_1_2_bavi.mp4','sha256':sha(output),'playback':'1 second per six-hour lead; final frame held for 3 seconds; no interpolated forecast states'}
116
- (DATA/'bavi_video.json').write_text(json.dumps(meta,indent=2)+'\n')
117
- print('Saved',output,output.stat().st_size,'bytes')
118
-
119
- if __name__=='__main__':
120
- p=argparse.ArgumentParser();p.add_argument('--source-root',type=Path);p.add_argument('--work',type=Path,required=True);args=p.parse_args()
121
- if args.source_root:prepare(args.source_root)
122
- build(args.work)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
release_tools/build_pressure_showcase.py DELETED
@@ -1,112 +0,0 @@
1
- """Build an offline interactive map from saved physical 50-member fields.
2
-
3
- --source-root prepares the public data subset; otherwise use published subset.
4
- No model inference, GPU allocation, training, or weather retrieval is performed.
5
- """
6
- import argparse, base64, csv, hashlib, io, json
7
- from pathlib import Path
8
- import numpy as np
9
- import matplotlib
10
- matplotlib.use('Agg')
11
- import matplotlib.pyplot as plt
12
-
13
- REPO=Path(__file__).resolve().parents[1]
14
- DATA=REPO/'paper/release_data'
15
-
16
- def sha(path):
17
- h=hashlib.sha256()
18
- with Path(path).open('rb') as f:
19
- for b in iter(lambda:f.read(8*1024**2),b''):h.update(b)
20
- return h.hexdigest()
21
-
22
- def absolute(local,lat,lon):
23
- return np.stack([lat+local[...,1]/111.2,lon+local[...,0]/(111.2*max(np.cos(np.deg2rad(lat)),.2))],-1)
24
-
25
- def prepare(root):
26
- archive=root/'benchmark_ensemble50/v173_e4/v173_e4_causal_ensemble50.npz'
27
- cases=json.loads((REPO/'paper/trackformer_1_2_showcase_selection.json').read_text())['all_case_metrics']
28
- patches={r['track_archive_row']:r for r in json.loads((root/'data/v164_reuse/plan.json').read_text())['rows']}
29
- with np.load(root/'track_build/track_windows_v13.npz') as w:
30
- target,mask=w['target'],w['target_mask']
31
- times,ids=w['base_time'],w['storm_id'].astype(str)
32
- lats,lons=w['base_lat'],w['base_lon']%360
33
- with np.load(archive) as z:
34
- routes=z['ensemble50_local'];truth=z['truth_local'];pressure=z['ensemble50_pressure_hpa']
35
- eligible=[]
36
- for c in cases:
37
- i=c['case_index'];r=c['source_row'];lat,lon=c['base_lat'],c['base_lon']
38
- patch=patches.get(r)
39
- anchor=np.array([patch['center_lat'],patch['center_lon']]) if patch else np.round(np.array([lat,lon])*4)/4
40
- p,t=absolute(routes[i],lat,lon),absolute(truth[i],lat,lon)
41
- points=np.vstack([[lat,lon],p,t])
42
- fits=(np.abs(points-anchor)<14).all() and (points[:,0]>0).all() and (points[:,0]<60).all() and (points[:,1]>100).all() and (points[:,1]<180).all()
43
- pm=mask[r,:20,3].astype(bool)&np.isfinite(target[r,:20,3])&(target[r,:20,3]>800)&(target[r,:20,3]<1100)
44
- pe=float(np.abs(pressure[i]-target[r,:20,3])[pm].mean()) if pm.any() else None
45
- m=c['models']['1.2']
46
- if fits and pm.sum()>=18 and pe<=15 and m['shape_similarity']>=.9 and m['direction_error_deg'] is not None and m['direction_error_deg']<=30:
47
- eligible.append((m['mean_track_error_km'],i,anchor,pe))
48
- _,i,anchor,pe=min(eligible,key=lambda x:(x[0],x[1]));c=cases[i];r=c['source_row']
49
- lookup={int(times[j]):int(j) for j in np.flatnonzero(ids==c['storm_id'])}
50
- issue=int(times[r]);future=[lookup[issue+k*6*3600*10**9] for k in range(21)]
51
- observed=np.stack([lats[future],lons[future]],-1)
52
- forecast=np.vstack([[c['base_lat'],c['base_lon']],absolute(routes[i],c['base_lat'],c['base_lon'])])
53
- assert (np.abs(np.vstack([observed,forecast])-anchor)<15).all()
54
- field=z['ensemble50_native_mslp_hpa'][i].copy()
55
- assert field.shape==(20,121,121) and np.isfinite(field).all()
56
- pm=mask[r,:20,3].astype(bool)&(target[r,:20,3]>800)&(target[r,:20,3]<1100)
57
- np.savez_compressed(DATA/'pressure_showcase.npz',pressure_hpa=field,latitude=anchor[0]+np.linspace(15,-15,121),longitude=anchor[1]+np.linspace(-15,15,121),forecast_lat_lon=forecast,observed_lat_lon=observed,central_pressure_hpa=pressure[i],observed_pressure_hpa=target[r,:20,3],pressure_mask=pm)
58
- names={}
59
- with (root/'data/ibtracs/ibtracs.WP.list.v04r01.csv').open() as f:
60
- for row in csv.DictReader(f):names[row['SID']]=row['NAME']
61
- rule='Among the saved 270 cases, require both routes within the fixed regional patch with 1-degree margin and valid basin coverage, shape >=0.90, heading error <=30 degrees, >=18 pressure labels and central-pressure MAE <=15 hPa; choose lowest mean track error. No field values altered.'
62
- meta={'public_model':'Trackformer 1.2','storm_name':names[c['storm_id']],'storm_id':c['storm_id'],'issue_time_utc':c['issue_time_utc'],'case_index':i,'source_row':r,'members':50,'member_policy':'50 smooth historical-input perturbations, not latent samples','selection_rule':rule,'eligible_cases':len(eligible),'selected_best_not_representative':True,'metrics':c['models']['1.2'],'central_pressure_mae_hpa':pe,'native_history_available':r in patches,'checkpoint_sha256':'f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0','archive_sha256':sha(archive),'data_sha256':sha(DATA/'pressure_showcase.npz'),'observed_route_source':'Exact six-hour issue-centre coordinates from the same storm in track_windows_v13, not a reconstruction from cumulative local steps. Retrospective best-track verification only.','field_source':'Unmodified saved ensemble50_native_mslp_hpa: model basin-plus-moving-core reconstruction on the fixed issue-anchored geographic grid. 0.25-degree output sampling is not native forecast resolution.','note':'Mean route and mean central pressure need not equal the minimum of the mean field.'}
63
- rings=json.loads((root/'trackformer-weatherlab-site/public/data/history/coastlines.json').read_text())
64
- rings=[ring for ring in rings if any(anchor[1]-15<=x<=anchor[1]+15 and max(0,anchor[0]-15)<=y<=anchor[0]+15 for x,y in ring)]
65
- (DATA/'pressure_showcase_coastlines.json').write_text(json.dumps(rings,separators=(',',':'))+'\n')
66
- (DATA/'pressure_showcase.json').write_text(json.dumps(meta,indent=2)+'\n')
67
- print('Selected',meta['storm_name'],meta['issue_time_utc'],'case',i,'track',meta['metrics']['mean_track_error_km'],'pressure',pe)
68
-
69
- def build():
70
- meta=json.loads((DATA/'pressure_showcase.json').read_text())
71
- rings=json.loads((DATA/'pressure_showcase_coastlines.json').read_text())
72
- with np.load(DATA/'pressure_showcase.npz') as z: a={k:z[k] for k in z.files}
73
- assert sha(DATA/'pressure_showcase.npz')==meta['data_sha256']
74
- lat,lon=a['latitude'],a['longitude'];tracks=np.concatenate([a['forecast_lat_lon'],a['observed_lat_lon']])
75
- bounds=[max(100,float(lon.min()),float(tracks[:,1].min()-3)),min(180,float(lon.max()),float(tracks[:,1].max()+3)),max(0,float(lat.min()),float(tracks[:,0].min()-3)),min(60,float(lat.max()),float(tracks[:,0].max()+3))]
76
- ratio=(bounds[3]-bounds[2])/((bounds[1]-bounds[0])*np.cos(np.deg2rad((bounds[2]+bounds[3])/2)))
77
- fields=a['pressure_hpa'];valid=(lat[:,None]>=0)&(lat[:,None]<=60)&(lon[None,:]>=100)&(lon[None,:]<=180)
78
- lo=int(np.floor(fields[:,valid].min()/4)*4);hi=int(np.ceil(fields[:,valid].max()/4)*4)
79
- levels=np.arange(lo,hi+2,2);frames=[]
80
- for field in fields:
81
- fig=plt.figure(figsize=(9,9*ratio));ax=fig.add_axes([0,0,1,1])
82
- f=np.ma.masked_where(~valid,field)
83
- ax.contourf(lon,lat,f,levels=levels,cmap='RdYlBu_r',extend='both')
84
- contour=ax.contour(lon,lat,f,levels=np.arange(lo,hi+4,4),colors='#314656',linewidths=.65)
85
- ax.clabel(contour,levels=np.arange(lo,hi+4,8),fontsize=8,fmt='%d',inline_spacing=5)
86
- for ring in rings:
87
- xy=np.asarray(ring);ax.plot(xy[:,0],xy[:,1],c='#4f6164',lw=.8)
88
- ax.set(xlim=bounds[:2],ylim=bounds[2:]);ax.set_axis_off()
89
- buf=io.BytesIO();fig.savefig(buf,format='png',dpi=115);plt.close(fig)
90
- frames.append('data:image/png;base64,'+base64.b64encode(buf.getvalue()).decode())
91
- packet={'meta':meta,'bounds':bounds,'ratio':ratio,'range':[lo,hi],'frames':frames,'fields':fields.round(2).tolist(),'latitude':lat.tolist(),'longitude':lon.tolist(),'forecast':a['forecast_lat_lon'].tolist(),'observed':a['observed_lat_lon'].tolist(),'pressure':a['central_pressure_hpa'].tolist(),'observedPressure':[float(v) if ok else None for v,ok in zip(a['observed_pressure_hpa'],a['pressure_mask'])]}
92
- template=(REPO/'release_tools/pressure_showcase_template.html').read_text()
93
- html=template.replace('/*__DATA__*/',json.dumps(packet,separators=(',',':'),allow_nan=False))
94
- (REPO/'docs/trackformer_1_2_pressure.html').write_text(html)
95
- # A real, clickable README preview; it is not a fabricated map.
96
- fig,ax=plt.subplots(figsize=(10,8),layout='constrained');k=11
97
- im=ax.contourf(lon,lat,np.ma.masked_where(~valid,fields[k]),levels=levels,cmap='RdYlBu_r')
98
- cs=ax.contour(lon,lat,np.ma.masked_where(~valid,fields[k]),levels=np.arange(lo,hi+4,4),colors='#314656',linewidths=.6);ax.clabel(cs,levels=np.arange(lo,hi+4,8),fmt='%d',fontsize=8)
99
- for ring in rings:
100
- xy=np.asarray(ring);ax.plot(xy[:,0],xy[:,1],c='#4f6164',lw=.8)
101
- for key,color,label,style in [('observed_lat_lon','#162437','Observed route','--'),('forecast_lat_lon','#b01467','1.2 mean of 50','-')]:
102
- p=a[key];ax.plot(p[:,1],p[:,0],style,c=color,lw=2.3,label=label);ax.scatter(p[k+1,1],p[k+1,0],c=color,s=50,edgecolors='white',zorder=6)
103
- ax.set(xlim=bounds[:2],ylim=bounds[2:],xlabel='Longitude °E',ylabel='Latitude °N',title='Trackformer 1.2 · PRAPIROON · +72 h\nModel pressure + forecast and observed routes')
104
- ax.set_aspect(1/np.cos(np.deg2rad((bounds[2]+bounds[3])/2)));ax.legend();fig.colorbar(im,ax=ax,label='Model mean sea-level pressure (hPa)',shrink=.75)
105
- fig.text(.5,-.015,'Click to explore +6 to +120 h · Selected best-performing example, not typical skill',ha='center',fontsize=10)
106
- fig.savefig(REPO/'paper/trackformer_1_2_interactive_pressure_preview.png',dpi=150,bbox_inches='tight');plt.close(fig)
107
- print('Built offline interactive map and README preview:',len(html),'bytes')
108
-
109
- if __name__=='__main__':
110
- p=argparse.ArgumentParser();p.add_argument('--source-root',type=Path);args=p.parse_args()
111
- if args.source_root:prepare(args.source_root)
112
- build()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
release_tools/build_yagi_video.py ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Render the selected saved Yagi 50-member forecast, without model inference.
2
+
3
+ Requires NumPy, Matplotlib and ffmpeg; --source-root prepares the public subset.
4
+ Never shift the model field or route to improve alignment with observations.
5
+ """
6
+ import argparse
7
+ import csv
8
+ import hashlib
9
+ import json
10
+ import subprocess
11
+ from datetime import datetime, timedelta
12
+ from pathlib import Path
13
+
14
+ import numpy as np
15
+ import matplotlib
16
+ matplotlib.use('Agg')
17
+ import matplotlib.pyplot as plt
18
+ from matplotlib.patches import Rectangle
19
+
20
+ REPO = Path(__file__).resolve().parents[1]
21
+ DATA = REPO / 'evaluation/release_data'
22
+ CHECKPOINT = 'f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0'
23
+
24
+
25
+ def sha(path):
26
+ with Path(path).open('rb') as stream:
27
+ return hashlib.file_digest(stream, 'sha256').hexdigest()
28
+
29
+
30
+ def distances(a, b):
31
+ a, b = np.deg2rad(a), np.deg2rad(b)
32
+ d = b - a
33
+ h = np.sin(d[:, 0]/2)**2 + np.cos(a[:, 0])*np.cos(b[:, 0])*np.sin(d[:, 1]/2)**2
34
+ return 6371.0088 * 2 * np.arcsin(np.sqrt(np.clip(h, 0, 1)))
35
+
36
+
37
+ def prepare(root):
38
+ source = root / 'benchmark_ensemble50/v173_e4/v173_e4_causal_ensemble50.npz'
39
+ report_path = source.parent / 'report.json'
40
+ report = json.loads(report_path.read_text())
41
+ assert report['checkpoint_sha256'] == CHECKPOINT
42
+ assert report['ensemble_policy']['member_count'] == 50
43
+ assert len(set(report['ensemble_policy']['member_ids'])) == 50
44
+ case = json.loads((DATA/'cohort_270.json').read_text())['cases'][178]
45
+ assert case['storm_id'] == '2024244N09137' and case['issue_time_utc'] == '2024-09-03T00:00:00Z'
46
+ with np.load(source, allow_pickle=False) as z:
47
+ assert int(z['source_rows'][178]) == case['source_row']
48
+ center = np.array([z['base_lat'][178], z['base_lon'][178]], dtype=float)
49
+ local = z['ensemble50_local'][178].astype(float)
50
+ route = np.column_stack((center[0]+local[:, 1]/111.2,
51
+ center[1]+local[:, 0]/(111.2*max(np.cos(np.deg2rad(center[0])), .2))))
52
+ pressure = z['ensemble50_pressure_hpa'][178].copy()
53
+ native = z['ensemble50_native_mslp_hpa'][178].copy()
54
+ coarse = z['ensemble50_mslp_hpa'][178].copy()
55
+ plans = json.loads((root/'data/v164_reuse/plan.json').read_text())['rows']
56
+ assert not any(p['track_archive_row'] == case['source_row'] for p in plans)
57
+ # No stored native-detail history for this issue. Match the evaluator's
58
+ # quarter-degree issue anchor; output sampling is not native resolution.
59
+ anchor = np.round(center*4)/4
60
+ lat, lon = anchor[0]+np.linspace(15, -15, 121), anchor[1]+np.linspace(-15, 15, 121)
61
+ csvpath = root/'data/ibtracs/ibtracs.WP.list.v04r01.csv'
62
+ with csvpath.open() as stream:
63
+ rows = {r['ISO_TIME']: r for r in csv.DictReader(stream) if r['SID'] == case['storm_id']}
64
+ issue = datetime.fromisoformat(case['issue_time_utc'].replace('Z', '+00:00'))
65
+ obs, obs_pressure = [], []
66
+ for k in range(21):
67
+ row = rows[(issue+timedelta(hours=6*k)).strftime('%Y-%m-%d %H:%M:%S')]
68
+ obs.append([float(row['LAT']), float(row['LON'])])
69
+ value = row['TOKYO_PRES'].strip()
70
+ obs_pressure.append(float(value) if value else np.nan)
71
+ obs = np.asarray(obs)
72
+ assert np.allclose(obs[0], center, atol=.001)
73
+ truth_pressure = np.array(obs_pressure[1:])
74
+ errors = distances(route, obs[1:])
75
+ mask = np.isfinite(truth_pressure) & (truth_pressure > 800) & (truth_pressure < 1100)
76
+ path = DATA/'yagi_video.npz'
77
+ np.savez_compressed(path, forecast_lat_lon=np.vstack([center, route]), observed_lat_lon=obs,
78
+ central_pressure_hpa=pressure, observed_pressure_hpa=truth_pressure,
79
+ regional_pressure_hpa=native, basin_pressure_hpa=coarse, latitude=lat, longitude=lon,
80
+ track_error_km=errors, original_local_route_km=local)
81
+ rings = json.loads((root/'trackformer-weatherlab-site/public/data/history/coastlines.json').read_text())
82
+ rings = [r for r in rings if any(100 <= x <= 125 and 12 <= y <= 26 for x, y in r)]
83
+ (DATA/'yagi_coastlines.json').write_text(json.dumps(rings, separators=(',', ':'))+'\n')
84
+ meta = {'model': 'Trackformer 1.2', 'storm': 'YAGI', **case, 'case_index': 178,
85
+ 'members': 50, 'ensemble_policy': report['ensemble_policy'], 'leads_hours': list(range(6, 121, 6)),
86
+ 'source_archive_sha256': sha(source), 'source_report_sha256': sha(report_path),
87
+ 'observed_csv_sha256': sha(csvpath), 'data_sha256': sha(path), 'checkpoint_sha256': CHECKPOINT,
88
+ 'observed_route_source': 'Exact six-hour IBTrACS LAT/LON for the same storm and valid timestamps.',
89
+ 'observed_pressure_source': 'IBTrACS TOKYO_PRES (JMA best-track central pressure), not an official forecast.',
90
+ 'route_projection': 'Saved mean local east/north km converted using issue latitude; no fitting, translation, rotation or scaling to observed route.',
91
+ 'field_source': 'Unmodified saved ensemble50_native_mslp_hpa and ensemble50_mslp_hpa on their common fixed grids.',
92
+ 'native_history_available': False, 'grid_note': 'Regional reconstruction sampled at 0.25 degrees; native-detail history unavailable for this case. Outside regional coverage use only saved 2.5-degree basin field.',
93
+ 'metrics': {'mean_track_error_km': float(errors.mean()), 'track_error_120h_km': float(errors[-1]),
94
+ 'maximum_track_error_km': float(errors.max()), 'within_200km_leads': int((errors<200).sum()),
95
+ 'central_pressure_mae_hpa': float(np.abs(pressure[mask]-truth_pressure[mask]).mean()),
96
+ 'pressure_valid_leads': int(mask.sum())},
97
+ 'selection': 'User-selected Yagi issue after inspecting geographic track alignment among saved development cases. Selected good route example, not representative performance or an untouched holdout. Pressure skill is assessed separately.'}
98
+ (DATA/'yagi_video.json').write_text(json.dumps(meta, indent=2)+'\n')
99
+ print(json.dumps(meta['metrics'], indent=2), flush=True)
100
+
101
+
102
+ def build(work):
103
+ work.mkdir(parents=True, exist_ok=True)
104
+ meta = json.loads((DATA/'yagi_video.json').read_text())
105
+ assert sha(DATA/'yagi_video.npz') == meta['data_sha256']
106
+ with np.load(DATA/'yagi_video.npz', allow_pickle=False) as z:
107
+ a = {k: z[k] for k in z.files}
108
+ rings = json.loads((DATA/'yagi_coastlines.json').read_text())
109
+ f, o, lat, lon = (a[k] for k in ('forecast_lat_lon', 'observed_lat_lon', 'latitude', 'longitude'))
110
+ bounds = [102, 123, 14, 24]
111
+ levels, contours = np.arange(976, 1017, 2), np.arange(976, 1017, 4)
112
+ glat, glon, leads = np.linspace(60, 0, 25), np.linspace(100, 180, 33), np.arange(6, 121, 6)
113
+ start = datetime.fromisoformat(meta['issue_time_utc'].replace('Z', '+00:00'))
114
+ plt.rcParams.update({'font.size': 12, 'axes.titlesize': 15})
115
+ for k, lead in enumerate(leads):
116
+ fig = plt.figure(figsize=(16, 10), dpi=100, facecolor='#f8fafb')
117
+ gs = fig.add_gridspec(2, 2, width_ratios=[3.9, 1.25], height_ratios=[4.5, 1.4],
118
+ left=.055, right=.93, bottom=.155, top=.85, wspace=.25, hspace=.38)
119
+ ax = fig.add_subplot(gs[0, :])
120
+ ax.contourf(glon, glat, a['basin_pressure_hpa'][k], levels=levels, cmap='RdYlBu_r', extend='both')
121
+ ax.contour(glon, glat, a['basin_pressure_hpa'][k], levels=contours, colors='#546971', linewidths=.45)
122
+ im = ax.contourf(lon, lat, a['regional_pressure_hpa'][k], levels=levels, cmap='RdYlBu_r', extend='both')
123
+ cs = ax.contour(lon, lat, a['regional_pressure_hpa'][k], levels=contours, colors='#354b58', linewidths=.65)
124
+ ax.clabel(cs, levels=contours[::2], fmt='%d', fontsize=9)
125
+ for ring in rings:
126
+ xy = np.asarray(ring); ax.plot(xy[:, 0], xy[:, 1], c='#66716b', lw=.8)
127
+ ax.add_patch(Rectangle((lon.min(), lat.min()), np.ptp(lon), np.ptp(lat), fill=False, edgecolor='#265b61', lw=1.2, ls=':'))
128
+ for points, color, label, style in [(o, '#182f42', 'Observed best track', '--'), (f, '#b31565', 'Trackformer 1.2 mean of 50', '-')]:
129
+ ax.plot(points[:, 1], points[:, 0], ls=style, c=color, alpha=.2, lw=1.6)
130
+ ax.plot(points[:k+2, 1], points[:k+2, 0], ls=style, c=color, lw=2.8, label=label)
131
+ ax.scatter(points[k+1, 1], points[k+1, 0], s=75, c=color, edgecolors='white', linewidths=1.8, zorder=6)
132
+ ax.plot([f[k+1, 1], o[k+1, 1]], [f[k+1, 0], o[k+1, 0]], ':', c='#7a5a85', lw=1.4)
133
+ ax.set(xlim=bounds[:2], ylim=bounds[2:], xlabel='Longitude °E', ylabel='Latitude °N')
134
+ ax.set_aspect(1/np.cos(np.deg2rad(19))); ax.grid(alpha=.13)
135
+ ax.legend(loc='lower left', fontsize=11, framealpha=.95)
136
+ ax.text(.985, .035, 'Same map / same valid time\nNo route shifting or rescaling', transform=ax.transAxes,
137
+ ha='right', va='bottom', fontsize=10, bbox={'facecolor': 'white', 'alpha': .9, 'edgecolor': 'none', 'pad': 5})
138
+ fig.colorbar(im, cax=fig.add_axes([.952, .40, .014, .40]), label='Model mean sea-level pressure (hPa)')
139
+ curve = fig.add_subplot(gs[1, 0])
140
+ curve.plot(leads, a['central_pressure_hpa'], c='#b31565', lw=2, label='Model')
141
+ curve.plot(leads, a['observed_pressure_hpa'], '--', c='#182f42', lw=2, label='Observed (JMA best track)')
142
+ curve.axvline(lead, c='#688e98', lw=1.5)
143
+ curve.scatter([lead], [a['central_pressure_hpa'][k]], c='#b31565', s=40, zorder=4)
144
+ curve.set(xlim=(6, 120), xlabel='Forecast lead (hours)', ylabel='Central pressure (hPa)', xticks=[6, 24, 48, 72, 96, 120])
145
+ curve.grid(alpha=.2); curve.legend(loc='lower left', fontsize=10)
146
+ info = fig.add_subplot(gs[1, 1]); info.axis('off')
147
+ info.text(0, 1, f"Position error: {a['track_error_km'][k]:.0f} km\nModel: {a['central_pressure_hpa'][k]:.1f} hPa\nObserved: {a['observed_pressure_hpa'][k]:.0f} hPa\n\nSelected good-route example\nPressure intensity is too weak", va='top', fontsize=12, color='#244754')
148
+ valid = start+timedelta(hours=int(lead))
149
+ fig.suptitle(f'Trackformer 1.2 / YAGI / +{lead:03d} h', x=.055, y=.97, ha='left', fontsize=24, fontweight='bold', color='#173947')
150
+ fig.text(.055, .918, f'Issue: {start:%d %b %Y %H:%M} UTC | Valid: {valid:%d %b %Y %H:%M} UTC | 50-member mean', fontsize=14, color='#385865')
151
+ fig.text(.055, .067, 'Actual model pressure with 4 hPa isobars. Observations are verification only; selected example, not typical skill.', fontsize=11, color='#47636d')
152
+ fig.text(.055, .040, 'Dotted boundary: fixed regional reconstruction (no native-detail history). Outside: coarse basin field only.', fontsize=10, color='#47636d')
153
+ fig.savefig(work/f'frame_{k:03d}.png', dpi=100)
154
+ if k == 9: fig.savefig(REPO/'evaluation/trackformer_1_2_yagi_video_poster.png', dpi=100)
155
+ plt.close(fig)
156
+ output = REPO/'docs/trackformer_1_2_yagi.mp4'
157
+ subprocess.run(['ffmpeg', '-y', '-hide_banner', '-loglevel', 'warning', '-framerate', '1', '-i', str(work/'frame_%03d.png'),
158
+ '-vf', 'fps=30,tpad=stop_mode=clone:stop_duration=3', '-c:v', 'h264_videotoolbox', '-b:v', '4M', '-pix_fmt', 'yuv420p', '-movflags', '+faststart', '-an', str(output)], check=True)
159
+ meta['video'] = {'file': 'docs/trackformer_1_2_yagi.mp4', 'duration_seconds': 23, 'forecast_states': 20,
160
+ 'codec': 'H.264', 'encoder': 'h264_videotoolbox', 'sha256': sha(output),
161
+ 'playback': 'Each six-hour state held for 1 second; final frame held 3 seconds extra. No interpolated forecast states.'}
162
+ (DATA/'yagi_video.json').write_text(json.dumps(meta, indent=2)+'\n')
163
+ print('Saved', output, output.stat().st_size, 'bytes', flush=True)
164
+
165
+
166
+ if __name__ == '__main__':
167
+ p = argparse.ArgumentParser(description=__doc__)
168
+ p.add_argument('--source-root', type=Path)
169
+ p.add_argument('--work', type=Path, required=True)
170
+ args = p.parse_args()
171
+ if args.source_root: prepare(args.source_root)
172
+ build(args.work)
release_tools/export_field_1_2.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Export a verified training checkpoint as inference-only Trackformer 1.2 weights."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import hashlib
6
+ import json
7
+ from pathlib import Path
8
+
9
+ import torch
10
+
11
+
12
+ EXPECTED_SHA256 = "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0"
13
+ EXPECTED_ARCH = "v173-moving-core-multiscale-attention"
14
+
15
+
16
+ def sha256(path: Path) -> str:
17
+ digest = hashlib.sha256()
18
+ with path.open("rb") as stream:
19
+ for block in iter(lambda: stream.read(8 * 1024 * 1024), b""):
20
+ digest.update(block)
21
+ return digest.hexdigest()
22
+
23
+
24
+ def main() -> None:
25
+ parser = argparse.ArgumentParser(description=__doc__)
26
+ parser.add_argument("checkpoint", type=Path)
27
+ parser.add_argument("output_dir", type=Path)
28
+ args = parser.parse_args()
29
+ if sha256(args.checkpoint) != EXPECTED_SHA256:
30
+ raise ValueError("Checkpoint SHA-256 does not match the selected release source")
31
+ payload = torch.load(args.checkpoint, map_location="cpu", weights_only=False)
32
+ if (payload.get("version"), payload.get("architecture"), payload.get("epoch")) != (
33
+ "1.2.73", EXPECTED_ARCH, 4
34
+ ):
35
+ raise ValueError("Checkpoint identity does not match the selected release source")
36
+ if len(payload.get("history", [])) != 4:
37
+ raise ValueError("Expected four completed epochs in checkpoint history")
38
+ args.output_dir.mkdir(parents=True, exist_ok=True)
39
+ weights = args.output_dir / "weights.pt"
40
+ torch.save(payload["model"], weights)
41
+ source = args.output_dir
42
+ manifest = {
43
+ "public_version": "1.2",
44
+ "release_status": "research_candidate_not_operational",
45
+ "source_checkpoint_version": payload["version"],
46
+ "source_checkpoint_epoch": payload["epoch"],
47
+ "architecture": payload["architecture"],
48
+ "source_checkpoint_sha256": EXPECTED_SHA256,
49
+ "inference_weights_sha256": sha256(weights),
50
+ "dataset_sha256": payload["dataset_sha256"],
51
+ "source_module_sha256": {name: sha256(source / name) for name in (
52
+ "model.py", "baseline_model.py", "v165_base.py")},
53
+ "data_contract": payload["data_contract"],
54
+ }
55
+ (args.output_dir / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
56
+ print(json.dumps({key: manifest[key] for key in (
57
+ "public_version", "architecture", "inference_weights_sha256")}, indent=2))
58
+
59
+
60
+ if __name__ == "__main__":
61
+ main()
release_tools/plot_field_1_2.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Render saved TIP comparison bars and a real Trackformer 1.2 pressure map."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import json
6
+ from pathlib import Path
7
+
8
+ import matplotlib.pyplot as plt
9
+ import numpy as np
10
+
11
+
12
+ def main() -> None:
13
+ parser = argparse.ArgumentParser(description=__doc__)
14
+ parser.add_argument("v11_tip", type=Path)
15
+ parser.add_argument("v12_tip", type=Path)
16
+ parser.add_argument("showcase_four", type=Path)
17
+ parser.add_argument("output_dir", type=Path)
18
+ args = parser.parse_args()
19
+ old = json.loads(args.v11_tip.read_text())
20
+ new = json.loads(args.v12_tip.read_text())
21
+ assert old["case_count"] == new["case_count"] == 10
22
+ assert [c["issue"] for c in old["cases"]] == [c["issue"] for c in new["cases"]]
23
+ args.output_dir.mkdir(parents=True, exist_ok=True)
24
+
25
+ fig, axes = plt.subplots(1, 2, figsize=(11, 4.3), layout="constrained")
26
+ for ax, key, title, unit in (
27
+ (axes[0], "mean_track_error_km", "Mean track error", "km"),
28
+ (axes[1], "central_pressure_mae_hpa", "Central-pressure MAE", "hPa"),
29
+ ):
30
+ values = [old[key], new[key]]
31
+ bars = ax.barh(["1.1", "1.2 · 50 input members"], values,
32
+ color=["#708396", "#0d827b"], height=0.52)
33
+ ax.invert_yaxis()
34
+ ax.set_xlim(0, max(values) * 1.25)
35
+ ax.set_title(title, fontweight="bold")
36
+ ax.set_xlabel(f"{unit} · lower is better")
37
+ ax.spines[["top", "right"]].set_visible(False)
38
+ for bar, value in zip(bars, values):
39
+ ax.text(bar.get_width() + max(values) * .025, bar.get_y() + bar.get_height()/2,
40
+ f"{value:.1f}", va="center", fontweight="bold")
41
+ fig.suptitle("TIP: same ten overlapping issue times, +6 to +120 h", fontweight="bold")
42
+ fig.text(.5, -.07, "Development diagnostic, not ten independent storms or untouched validation.",
43
+ ha="center", fontsize=9)
44
+ fig.savefig(args.output_dir / "trackformer_1_2_vs_1_1_tip_bars.png", dpi=175, bbox_inches="tight")
45
+ plt.close(fig)
46
+
47
+ with np.load(args.showcase_four, allow_pickle=False) as z:
48
+ storm = str(z["storms"][0])
49
+ fields = z["fields"][0]
50
+ route = z["route"][0]
51
+ fig, axes = plt.subplots(1, 3, figsize=(12, 4.1), layout="constrained")
52
+ for ax, lead_index in zip(axes, (3, 11, 19)):
53
+ image = ax.imshow(fields[lead_index], origin="upper", extent=(100, 180, 0, 60),
54
+ cmap="viridis_r", vmin=960, vmax=1025, aspect="auto")
55
+ ax.plot(route[:lead_index+1, 1], route[:lead_index+1, 0],
56
+ color="#ffed9a", linewidth=1.8, marker="o", markersize=2)
57
+ ax.set_title(f"{storm.title()} · +{(lead_index+1)*6} h")
58
+ ax.set_xlabel("Longitude °E")
59
+ ax.set_ylabel("Latitude °N")
60
+ ax.set_xlim(100, 180)
61
+ ax.set_ylim(0, 60)
62
+ fig.colorbar(image, ax=axes, label="Forecast basin MSLP (hPa)", shrink=.76)
63
+ fig.suptitle("Trackformer 1.2 · model-generated pressure-field example", fontweight="bold")
64
+ fig.savefig(args.output_dir / "trackformer_1_2_pressure_map_example.png", dpi=175, bbox_inches="tight")
65
+ plt.close(fig)
66
+
67
+
68
+ if __name__ == "__main__":
69
+ main()
release_tools/plot_release_270.py CHANGED
@@ -1,7 +1,7 @@
1
  """Reproduce the public 270-case chart and recent isobar example.
2
 
3
  Use --source-root to prepare plot data from the local research archives. Without
4
- it, only the small published arrays under paper/release_data are required.
5
  """
6
  from __future__ import annotations
7
 
@@ -267,7 +267,7 @@ def plot_pressure(data, output):
267
  def main():
268
  parser = argparse.ArgumentParser(description=__doc__)
269
  parser.add_argument("--source-root", type=Path)
270
- parser.add_argument("--output-dir", type=Path, default=Path(__file__).resolve().parents[1] / "paper")
271
  args = parser.parse_args()
272
  data = args.output_dir / "release_data"
273
  data.mkdir(parents=True, exist_ok=True)
 
1
  """Reproduce the public 270-case chart and recent isobar example.
2
 
3
  Use --source-root to prepare plot data from the local research archives. Without
4
+ it, only the small published arrays under evaluation/release_data are required.
5
  """
6
  from __future__ import annotations
7
 
 
267
  def main():
268
  parser = argparse.ArgumentParser(description=__doc__)
269
  parser.add_argument("--source-root", type=Path)
270
+ parser.add_argument("--output-dir", type=Path, default=Path(__file__).resolve().parents[1] / "evaluation")
271
  args = parser.parse_args()
272
  data = args.output_dir / "release_data"
273
  data.mkdir(parents=True, exist_ok=True)
release_tools/pressure_showcase_template.html DELETED
@@ -1,42 +0,0 @@
1
- <!doctype html>
2
- <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Trackformer 1.2 · Interactive pressure forecast</title>
3
- <style>
4
- :root{color-scheme:light;--ink:#182f3b;--muted:#526c75;--line:#d4e1e5;--accent:#0c6870;--pink:#ac145f}*{box-sizing:border-box}body{margin:0;background:#f3f7f8;color:var(--ink);font:16px/1.5 system-ui,sans-serif}main{max-width:1200px;margin:auto;padding:30px 24px}header{display:flex;justify-content:space-between;align-items:start;gap:25px}h1{font-size:32px;line-height:1.15;margin:6px 0 14px;letter-spacing:-1px}p{margin:8px 0}.eyebrow{font-size:12px;letter-spacing:2px;text-transform:uppercase;color:var(--accent);font-weight:700}.sub{color:var(--muted);max-width:780px;font-size:14px}a{color:var(--accent)}.tag{border:1px solid var(--line);padding:5px 10px;border-radius:5px;white-space:nowrap;font-size:13px}.controls{display:flex;align-items:center;flex-wrap:wrap;gap:12px;margin:22px 0 14px;padding:16px;background:white;border:1px solid var(--line);border-radius:10px}button,select{font:inherit;color:var(--ink);border:1px solid #b6ced4;background:white;border-radius:6px;padding:8px 14px;cursor:pointer}button:focus-visible,input:focus-visible{outline:3px solid #158790;outline-offset:3px}#play{background:var(--accent);color:white;border-color:var(--accent);min-width:84px}input[type=range]{flex:1;min-width:140px;accent-color:var(--accent)}.date{min-width:195px;font-size:14px;font-variant-numeric:tabular-nums}.layout{display:grid;grid-template-columns:minmax(0,1fr) 265px;gap:20px}.mapcard,.aside{background:white;border:1px solid var(--line);border-radius:10px;overflow:hidden}#map{display:block;width:100%;height:auto;touch-action:pan-y}.legend{display:flex;gap:16px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--line);font-size:14px}.legend label{display:flex;align-items:center;gap:6px}.legend input{accent-color:var(--accent)}.key{display:inline-block;width:22px;border-top:3px solid var(--pink)}.key.obs{border-color:#162437;border-top-style:dashed}.bar{height:12px;background:linear-gradient(90deg,#313695,#74add1,#e0f3f8,#ffffbf,#fdae61,#d73027,#a50026)}.scale{padding:10px 16px 14px;font-size:12px;display:grid;gap:5px}.ticks{display:flex;justify-content:space-between}#hover{margin:0;padding:10px 16px;background:#f7fafb;color:#355762;font-size:13px;min-height:45px}.aside{padding:18px;height:max-content}h2{font-size:16px;margin:0 0 12px}.stat{padding:12px 0;border-bottom:1px solid #e8eff1;font-size:13px}.stat strong{display:block;font-size:23px;font-variant-numeric:tabular-nums;line-height:1.3}.stat span{color:var(--muted)}#curve{width:100%;margin:15px 0}details{margin-top:24px;font-size:14px}summary{cursor:pointer;font-weight:600}.note{background:#eaf2f4;border-left:3px solid #779daa;padding:12px 16px;margin:20px 0;font-size:13px;color:#35545c}footer{font-size:12px;color:var(--muted);margin:22px 0}.maptext{font-size:12px;fill:#294650}.touch{font-size:12px;color:var(--muted)}@media(max-width:800px){.layout{grid-template-columns:1fr}.aside{display:grid;grid-template-columns:1fr 1fr;gap:12px}.aside h2,.aside .touch,#curve{grid-column:1/-1}.stat{padding:3px 0}h1{font-size:25px}main{padding:20px 12px}header{display:block}.tag{display:inline-block;margin-top:10px}.date{min-width:0;width:100%}}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}}
5
- </style></head><body><main>
6
- <header><div><div class="eyebrow">Trackformer 1.2 / field forecast</div><h1 id="title">Pressure, motion and the observed route</h1><p class="sub" id="subtitle"></p></div><span class="tag">50-member mean · selected showcase</span></header>
7
- <div class="controls"><button id="back" aria-label="Previous six-hour forecast">−6 h</button><button id="play" aria-pressed="false">Play</button><button id="next" aria-label="Next six-hour forecast">+6 h</button><label for="lead" class="sr" style="font-size:13px">Lead</label><input id="lead" type="range" min="0" max="19" value="3" aria-label="Forecast lead time"><div class="date"><strong id="leadLabel"></strong><br><span id="valid"></span></div><label style="font-size:13px">Speed <select id="speed"><option value="1000">1×</option><option value="500">2×</option><option value="250">4×</option></select></label></div>
8
- <div class="layout"><section class="mapcard" aria-label="Interactive model pressure and routes"><div class="legend"><label><input id="showForecast" type="checkbox" checked><span class="key"></span>1.2 forecast</label><label><input id="showObserved" type="checkbox" checked><span class="key obs"></span>Observed route</label><label><input id="full" type="checkbox" checked>Full 120 h paths</label></div><svg id="map" role="img" aria-label="Forecast sea-level pressure with forecast and observed storm paths"></svg><p id="hover" role="status">Hover or tap the map to inspect model pressure, position and valid time.</p><div class="scale"><div>Model mean sea-level pressure · hPa · isobars every 4 hPa</div><div class="bar"></div><div class="ticks"><span id="low"></span><span id="mid"></span><span id="high"></span></div></div></section>
9
- <aside class="aside"><h2>At the selected lead</h2><div class="stat"><span>Forecast central pressure</span><strong id="pressure"></strong></div><div class="stat"><span>Observed central pressure</span><strong id="truthPressure"></strong></div><div class="stat"><span>Position error · great-circle</span><strong id="error"></strong></div><svg id="curve" viewBox="0 0 240 155" role="img" aria-label="Forecast and observed central pressure from 6 to 120 hours"></svg><p class="touch">Map markers and the chart cursor share the same valid time. Central pressure is the mean of member core samples, not the minimum of the mean map.</p></aside></div>
10
- <p class="note" id="selection"></p><details><summary>Data, selection rule and model-field provenance</summary><p id="rule"></p><p id="fieldNote"></p><p id="routeNote"></p><p id="sourceHash" style="overflow-wrap:anywhere"></p><p>Observed routes and pressures are retrospective verification labels. They are not inputs to future forecast steps. This is a selected development example, not an untouched test or an operational warning.</p></details>
11
- <footer>Research only. The colours and contours represent saved model-generated physical pressure; the field has not been moved to fit observations. <a href="https://github.com/yu314-coder/typhoon-predict">Source and paper</a> · <a href="https://huggingface.co/euler314/typhoon-predict">Model weights</a></footer>
12
- </main><script>
13
- const D=/*__DATA__*/;
14
- const $=id=>document.getElementById(id),NS='http://www.w3.org/2000/svg';let k=3,timer=null;
15
- function el(tag,attrs,parent){const e=document.createElementNS(NS,tag);for(const [a,v]of Object.entries(attrs))e.setAttribute(a,v);if(parent)parent.appendChild(e);return e}
16
- const W=900,L=54,T=24,PW=820,PH=PW*D.ratio,H=PH+72;const map=$('map');map.setAttribute('viewBox',`0 0 ${W} ${H}`);
17
- const [west,east,south,north]=D.bounds,x=lon=>L+(lon-west)/(east-west)*PW,y=lat=>T+(north-lat)/(north-south)*PH;
18
- const image=el('image',{x:L,y:T,width:PW,height:PH,preserveAspectRatio:'none'},map);
19
- const defs=el('defs',{},map),clip=el('clipPath',{id:'area'},defs);el('rect',{x:L,y:T,width:PW,height:PH},clip);
20
- const grid=el('g',{},map);for(let lon=Math.ceil(west/5)*5;lon<=east;lon+=5){el('line',{x1:x(lon),x2:x(lon),y1:T,y2:T+PH,stroke:'#456878','stroke-opacity':.16},grid);el('text',{x:x(lon),y:T+PH+23,'text-anchor':'middle',class:'maptext'},grid).textContent=lon+'°E'}
21
- for(let lat=Math.ceil(south/5)*5;lat<=north;lat+=5){el('line',{x1:L,x2:L+PW,y1:y(lat),y2:y(lat),stroke:'#456878','stroke-opacity':.16},grid);el('text',{x:L-9,y:y(lat)+4,'text-anchor':'end',class:'maptext'},grid).textContent=lat+'°N'}
22
- el('rect',{x:L,y:T,width:PW,height:PH,fill:'none',stroke:'#a7bec4'},map);
23
- const group=el('g',{'clip-path':'url(#area)'},map);
24
- function route(color,dash){const halo=el('path',{fill:'none',stroke:'white','stroke-width':6,'stroke-opacity':.85},group),p=el('path',{fill:'none',stroke:color,'stroke-width':3,'stroke-dasharray':dash},group),marker=el('circle',{r:7,fill:color,stroke:'white','stroke-width':2},group);return {halo,p,marker}}
25
- const truth=route('#162437','8 5'),pred=route('#ac145f','');
26
- const hit=el('rect',{x:L,y:T,width:PW,height:PH,fill:'transparent','pointer-events':'all'},map);
27
- const path=p=>p.map((v,i)=>(i?'L':'M')+x(v[1]).toFixed(2)+','+y(v[0]).toFixed(2)).join(' ');
28
- function date(n){return new Date(Date.parse(D.meta.issue_time_utc)+n*3600000).toISOString().slice(0,16).replace('T',' ')+' UTC'}
29
- function hav(a,b){const r=Math.PI/180,p=(b[0]-a[0])*r,q=(b[1]-a[1])*r,z=Math.sin(p/2)**2+Math.cos(a[0]*r)*Math.cos(b[0]*r)*Math.sin(q/2)**2;return 6371*2*Math.asin(Math.sqrt(Math.min(1,z)))}
30
- function drawCurve(){const svg=$('curve');svg.replaceChildren();const vals=[...D.pressure,...D.observedPressure.filter(v=>v!==null)],min=Math.floor(Math.min(...vals)/5)*5-5,max=Math.ceil(Math.max(...vals)/5)*5+5;const cx=i=>35+i/19*192,cy=v=>115-(v-min)/(max-min)*90;
31
- for(let v=min;v<=max;v+=10){el('line',{x1:35,x2:227,y1:cy(v),y2:cy(v),stroke:'#dde7ea'},svg);el('text',{x:31,y:cy(v)+3,'text-anchor':'end',fill:'#506873','font-size':10},svg).textContent=v}
32
- for(const [values,color,dash]of [[D.pressure,'#ac145f',''],[D.observedPressure,'#162437','4 3']]){let p='',gap=true;values.forEach((v,i)=>{if(v===null){gap=true;return}p+=(gap?'M':'L')+cx(i)+','+cy(v);gap=false});el('path',{d:p,fill:'none',stroke:color,'stroke-width':2,'stroke-dasharray':dash},svg)}
33
- el('line',{x1:cx(k),x2:cx(k),y1:20,y2:120,stroke:'#377782','stroke-width':1.5},svg);for(const i of [0,9,19])el('text',{x:cx(i),y:137,'text-anchor':'middle',fill:'#506873','font-size':11},svg).textContent='+'+(i+1)*6+'h';el('text',{x:35,y:12,fill:'#506873','font-size':11},svg).textContent='Central pressure · hPa'}
34
- function render(){const lead=(k+1)*6;image.setAttribute('href',D.frames[k]);$('lead').value=k;$('leadLabel').textContent='+'+lead+' hours';$('valid').textContent=date(lead);$('pressure').textContent=D.pressure[k].toFixed(1)+' hPa';$('truthPressure').textContent=D.observedPressure[k]===null?'Not available':D.observedPressure[k].toFixed(0)+' hPa';$('error').textContent=hav(D.forecast[k+1],D.observed[k+1]).toFixed(1)+' km';
35
- for(const [obj,coords,id]of [[pred,D.forecast,'showForecast'],[truth,D.observed,'showObserved']]){let d=path($('full').checked?coords:coords.slice(0,k+2));obj.p.setAttribute('d',d);obj.halo.setAttribute('d',d);obj.marker.setAttribute('cx',x(coords[k+1][1]));obj.marker.setAttribute('cy',y(coords[k+1][0]));for(const e of Object.values(obj))e.style.display=$(id).checked?'':'none'}drawCurve();$('back').disabled=k===0;$('next').disabled=k===19;$('hover').textContent='Hover or tap: model pressure on the fixed grid · '+date(lead)}
36
- function stop(){if(timer)clearInterval(timer);timer=null;$('play').textContent='Play';$('play').setAttribute('aria-pressed','false')}
37
- function play(){if(k===19)k=0;render();$('play').textContent='Pause';$('play').setAttribute('aria-pressed','true');timer=setInterval(()=>{if(k===19){stop();return}k++;render()},Number($('speed').value))}
38
- $('play').onclick=()=>timer?stop():play();$('speed').onchange=()=>{if(timer){stop();play()}};$('back').onclick=()=>{stop();k=Math.max(0,k-1);render()};$('next').onclick=()=>{stop();k=Math.min(19,k+1);render()};$('lead').oninput=e=>{stop();k=+e.target.value;render()};for(const id of ['showForecast','showObserved','full'])$(id).onchange=render;document.addEventListener('visibilitychange',()=>{if(document.hidden)stop()});
39
- function inspect(event){const pt=map.createSVGPoint();pt.x=event.clientX;pt.y=event.clientY;const p=pt.matrixTransform(map.getScreenCTM().inverse());const lon=west+(p.x-L)/PW*(east-west),lat=north-(p.y-T)/PH*(north-south);const ix=Math.max(0,Math.min(120,Math.round((lon-D.longitude[0])/.25))),iy=Math.max(0,Math.min(120,Math.round((D.latitude[0]-lat)/.25)));let text=lat.toFixed(2)+'°N, '+lon.toFixed(2)+'°E · model mean '+D.fields[k][iy][ix].toFixed(1)+' hPa';for(const [coords,label,id]of [[D.forecast,'1.2 forecast','showForecast'],[D.observed,'Observed route','showObserved']])if($(id).checked){const end=$('full').checked?21:k+2;for(let i=0;i<end;i++)if(Math.hypot(x(coords[i][1])-p.x,y(coords[i][0])-p.y)<14){text=label+' · +'+i*6+' h · '+coords[i][0].toFixed(2)+'°N, '+coords[i][1].toFixed(2)+'°E · '+date(i*6);break}}$('hover').textContent=text}
40
- hit.addEventListener('pointermove',inspect);hit.addEventListener('pointerdown',inspect);
41
- $('title').textContent='PRAPIROON · pressure and route';$('subtitle').textContent='Issue '+date(0)+' · Actual model pressure fields against the observed best-track route.';$('low').textContent=D.range[0];$('mid').textContent=(D.range[0]+D.range[1])/2;$('high').textContent=D.range[1];$('selection').textContent='Selected best-performing example from the saved 270-case development benchmark: '+D.meta.metrics.mean_track_error_km.toFixed(1)+' km mean local-coordinate track error and '+D.meta.central_pressure_mae_hpa.toFixed(2)+' hPa central-pressure MAE. This selection is not typical performance.';$('rule').textContent=D.meta.selection_rule;$('fieldNote').textContent=D.meta.field_source+' Native regional history available: '+D.meta.native_history_available+'.';$('routeNote').textContent=D.meta.observed_route_source;$('sourceHash').textContent='Checkpoint SHA-256: '+D.meta.checkpoint_sha256;render();
42
- </script></body></html>