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

Select Fung-wong MP4; keep interactive showcase removed

Browse files
.gitattributes CHANGED
@@ -23,3 +23,6 @@ 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
 
 
 
 
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
26
+ docs/trackformer_1_2_fung_wong.mp4 filter=lfs diff=lfs merge=lfs -text
27
+ evaluation/trackformer_1_2_fung_wong_video_poster.png filter=lfs diff=lfs merge=lfs -text
28
+ evaluation/release_data/fung_wong_video.npz filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -67,17 +67,19 @@ The 1.2 mean has better aggregate direction, shape and position scores on this p
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
 
 
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
+ ## Fung-wong 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_fung_wong_video_poster.png" src="https://huggingface.co/euler314/typhoon-predict/resolve/main/docs/trackformer_1_2_fung_wong.mp4"></video>
73
 
74
+ [![Play the Trackformer 1.2 Fung-wong pressure forecast MP4](evaluation/trackformer_1_2_fung_wong_video_poster.png)](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_fung_wong.mp4)
75
 
76
+ **[Play or download the Fung-wong MP4](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_fung_wong.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 **7 November 2025 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 is the user-selected **Fung-wong route-and-pressure example**, not a claim of typical or untouched-test performance. The curves follow a similar broad path but do not perfectly overlap; timing and position differences remain. Central-pressure MAE is **7.36 hPa** across 20 valid labels, with an imperfect intensification and weakening cycle. For context, mean geographic position error is 130.9 km and +120 h error is 142.3 km; those distances alone do not establish route overlap. These scores use exact observed coordinates and great-circle distances, separately from the saved local-coordinate benchmark scores above.
81
+
82
+ Native-detail input history was unavailable; the regional pressure reconstruction uses 0.25° output sampling, not native resolution. **From +66 h the forecast centre is outside the fixed regional patch**, so only the saved coarse basin field is displayed there. The video labels this coverage limit; it does not invent an extended detailed core. Member-mean central pressure still comes from each model member's moving-core readout, not the minimum of the displayed mean map. [Data, source hashes and video provenance](evaluation/release_data/fung_wong_video.json).
83
 
84
  ### Architecture-only paper
85
 
RELEASE_NOTES_TRACKFORMER_1_2.md CHANGED
@@ -8,7 +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 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
 
 
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 the user-selected **Fung-wong MP4** in place of Yagi; the interactive PRAPIROON showcase remains removed. The forecast starts 7 November 2025 at 00 UTC and uses actual saved 50-member mean pressure fields and routes through +120 h. Central-pressure MAE is 7.36 hPa against JMA best track from IBTrACS. The broad route is similar but not perfectly overlapping: mean geographic error is 130.9 km and +120 h error is 142.3 km. This is a selected development example, not typical skill. From +66 h the forecast centre leaves the regional patch; the video explicitly labels that only the saved coarse basin field is shown there. No detailed core is invented outside coverage. The published paper and model weights are unchanged in this showcase update.
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/trackformer_1_2_evaluation.md CHANGED
@@ -31,11 +31,11 @@ No same-270 1.1 central-pressure prediction array was verified in the route arti
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
 
 
31
 
32
  ## Recent pressure-line example
33
 
34
+ ### Fung-wong MP4: selected route-and-pressure example
35
 
36
+ The [Fung-wong video](https://yu314-coder.github.io/typhoon-predict/trackformer_1_2_fung_wong.mp4) uses the unchanged saved 50-member pressure fields and mean route for case 262, issued 2025-11-07 00 UTC. It is a user-selected development example after inspection of full routes and pressure curves, not an untouched test or a representative sample. The geographic mean error is 130.9 km, the +120 h error is 142.3 km, and maximum error is 198.3 km over 20 leads. These are great-circle distances to exact observed coordinates, separate from the main benchmark's saved local-coordinate scores. The route follows the broad observed curve but is not perfectly overlapping.
37
 
38
+ The pressure MAE is **7.36 hPa** against IBTrACS TOKYO_PRES (JMA best track), with 20 valid labels. Intensification and weakening still differ from observations. Fields are physical model means on fixed common grids, without shifting them onto the observed track. Native-detail history was unavailable; 0.25° regional output sampling is not native resolution. From +66 h the forecast centre leaves the regional patch: only saved coarse basin pressure is shown there, while member-mean central pressure remains the moving-core readout. No display-only core is added. Observed future routes and pressures are verification overlays only. [Data and provenance](../evaluation/release_data/fung_wong_video.json) record hashes and member policy. Reproduce with `python release_tools/build_fung_wong_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
 
docs/{trackformer_1_2_yagi.mp4 → trackformer_1_2_fung_wong.mp4} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:542172829ec361e55e3f8e7c04436c59e575ac70d756759d8bf5596bf4fffb1a
3
- size 7933310
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:df5b04c0bdff6a0f126a3328dafd6fb7f986788e2622d4ea9667084db5c075b5
3
+ size 7257323
evaluation/README.md CHANGED
@@ -9,4 +9,4 @@ This directory holds the current published comparison figures, metrics, selected
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.
 
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 [Fung-wong video builder](../release_tools/build_fung_wong_video.py) likewise uses saved model fields, not synthetic illustrations. Its [provenance](release_data/fung_wong_video.json) reports geographic route alignment separately from pressure error.
evaluation/release_data/fung_wong_coastlines.json ADDED
@@ -0,0 +1 @@
 
 
1
+ [[[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]]]
evaluation/release_data/{yagi_video.json → fung_wong_video.json} RENAMED
@@ -1,10 +1,10 @@
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,
@@ -106,30 +106,37 @@
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
  }
 
1
  {
2
  "model": "Trackformer 1.2",
3
+ "storm": "FUNG-WONG",
4
+ "storm_id": "2025308N09144",
5
+ "issue_time_utc": "2025-11-07T00:00:00Z",
6
+ "source_row": 192531,
7
+ "case_index": 262,
8
  "members": 50,
9
  "ensemble_policy": {
10
  "member_count": 50,
 
106
  "source_archive_sha256": "4afc595af1c02096d2cb38563069a9b2fc37c8cff2b439b77eac2ed96e34223e",
107
  "source_report_sha256": "40ee814e067ac002b8930694ef01e3d9de3fb04c07b7f22b59dfec5fd6492ba7",
108
  "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
109
+ "data_sha256": "b842406daaf88d428b688899372a607ff72547746656e380f05932cf8ef4aeda",
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
+ "regional_bounds": [
116
+ 123.0,
117
+ 153.0,
118
+ -3.5,
119
+ 26.5
120
+ ],
121
+ "first_forecast_lead_outside_regional_hours": 66,
122
  "native_history_available": false,
123
  "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.",
124
  "metrics": {
125
+ "mean_track_error_km": 130.91699028278657,
126
+ "track_error_120h_km": 142.28101364728983,
127
+ "maximum_track_error_km": 198.2675782191361,
128
  "within_200km_leads": 20,
129
+ "central_pressure_mae_hpa": 7.359976196289063,
130
  "pressure_valid_leads": 20
131
  },
132
+ "selection": "User-selected Fung-wong issue after inspecting geographic track alignment among saved development cases. Selected route-and-pressure example, not representative performance or an untouched holdout. Pressure skill is assessed separately.",
133
  "video": {
134
+ "file": "docs/trackformer_1_2_fung_wong.mp4",
135
  "duration_seconds": 23,
136
  "forecast_states": 20,
137
  "codec": "H.264",
138
  "encoder": "h264_videotoolbox",
139
+ "sha256": "df5b04c0bdff6a0f126a3328dafd6fb7f986788e2622d4ea9667084db5c075b5",
140
  "playback": "Each six-hour state held for 1 second; final frame held 3 seconds extra. No interpolated forecast states."
141
  }
142
  }
evaluation/{trackformer_1_2_yagi_video_poster.png → release_data/fung_wong_video.npz} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:c821695a397b72fbe48d15ca6b458ba61e3ba8cc1e32b67223aee21a50ec112e
3
- size 213861
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b842406daaf88d428b688899372a607ff72547746656e380f05932cf8ef4aeda
3
+ size 735703
evaluation/release_data/yagi_coastlines.json DELETED
@@ -1 +0,0 @@
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.npz → trackformer_1_2_fung_wong_video_poster.png} RENAMED
File without changes
release_tools/{build_yagi_video.py → build_fung_wong_video.py} RENAMED
@@ -1,4 +1,4 @@
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.
@@ -41,17 +41,17 @@ def prepare(root):
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
@@ -73,15 +73,15 @@ def prepare(root):
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,
@@ -89,26 +89,28 @@ def prepare(root):
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})
@@ -131,7 +133,7 @@ def build(work):
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})
@@ -144,22 +146,24 @@ def build(work):
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
 
 
1
+ """Render the selected saved Fung-wong 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.
 
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'][262]
45
+ assert case['storm_id'] == '2025308N09144' and case['issue_time_utc'] == '2025-11-07T00:00:00Z'
46
  with np.load(source, allow_pickle=False) as z:
47
+ assert int(z['source_rows'][262]) == case['source_row']
48
+ center = np.array([z['base_lat'][262], z['base_lon'][262]], dtype=float)
49
+ local = z['ensemble50_local'][262].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'][262].copy()
53
+ native = z['ensemble50_native_mslp_hpa'][262].copy()
54
+ coarse = z['ensemble50_mslp_hpa'][262].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
 
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/'fung_wong_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(114 <= x <= 142 and 7 <= y <= 27 for x, y in r)]
83
+ (DATA/'fung_wong_coastlines.json').write_text(json.dumps(rings, separators=(',', ':'))+'\n')
84
+ meta = {'model': 'Trackformer 1.2', 'storm': 'FUNG-WONG', **case, 'case_index': 262,
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,
 
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
+ 'regional_bounds': [float(lon.min()), float(lon.max()), float(lat.min()), float(lat.max())],
93
+ 'first_forecast_lead_outside_regional_hours': next((6*(k+1) for k, point in enumerate(route) if not (lon.min() <= point[1] <= lon.max() and lat.min() <= point[0] <= lat.max())), None),
94
  '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.',
95
  'metrics': {'mean_track_error_km': float(errors.mean()), 'track_error_120h_km': float(errors[-1]),
96
  'maximum_track_error_km': float(errors.max()), 'within_200km_leads': int((errors<200).sum()),
97
  'central_pressure_mae_hpa': float(np.abs(pressure[mask]-truth_pressure[mask]).mean()),
98
  'pressure_valid_leads': int(mask.sum())},
99
+ 'selection': 'User-selected Fung-wong issue after inspecting geographic track alignment among saved development cases. Selected route-and-pressure example, not representative performance or an untouched holdout. Pressure skill is assessed separately.'}
100
+ (DATA/'fung_wong_video.json').write_text(json.dumps(meta, indent=2)+'\n')
101
  print(json.dumps(meta['metrics'], indent=2), flush=True)
102
 
103
 
104
  def build(work):
105
  work.mkdir(parents=True, exist_ok=True)
106
+ meta = json.loads((DATA/'fung_wong_video.json').read_text())
107
+ assert sha(DATA/'fung_wong_video.npz') == meta['data_sha256']
108
+ with np.load(DATA/'fung_wong_video.npz', allow_pickle=False) as z:
109
  a = {k: z[k] for k in z.files}
110
+ rings = json.loads((DATA/'fung_wong_coastlines.json').read_text())
111
  f, o, lat, lon = (a[k] for k in ('forecast_lat_lon', 'observed_lat_lon', 'latitude', 'longitude'))
112
+ bounds = [115, 141, 8, 25]
113
+ levels, contours = np.arange(936, 1017, 2), np.arange(936, 1017, 4)
114
  glat, glon, leads = np.linspace(60, 0, 25), np.linspace(100, 180, 33), np.arange(6, 121, 6)
115
  start = datetime.fromisoformat(meta['issue_time_utc'].replace('Z', '+00:00'))
116
  plt.rcParams.update({'font.size': 12, 'axes.titlesize': 15})
 
133
  ax.scatter(points[k+1, 1], points[k+1, 0], s=75, c=color, edgecolors='white', linewidths=1.8, zorder=6)
134
  ax.plot([f[k+1, 1], o[k+1, 1]], [f[k+1, 0], o[k+1, 0]], ':', c='#7a5a85', lw=1.4)
135
  ax.set(xlim=bounds[:2], ylim=bounds[2:], xlabel='Longitude °E', ylabel='Latitude °N')
136
+ ax.set_aspect(1/np.cos(np.deg2rad(16.5))); ax.grid(alpha=.13)
137
  ax.legend(loc='lower left', fontsize=11, framealpha=.95)
138
  ax.text(.985, .035, 'Same map / same valid time\nNo route shifting or rescaling', transform=ax.transAxes,
139
  ha='right', va='bottom', fontsize=10, bbox={'facecolor': 'white', 'alpha': .9, 'edgecolor': 'none', 'pad': 5})
 
146
  curve.set(xlim=(6, 120), xlabel='Forecast lead (hours)', ylabel='Central pressure (hPa)', xticks=[6, 24, 48, 72, 96, 120])
147
  curve.grid(alpha=.2); curve.legend(loc='lower left', fontsize=10)
148
  info = fig.add_subplot(gs[1, 1]); info.axis('off')
149
+ inside = lon.min() <= f[k+1, 1] <= lon.max() and lat.min() <= f[k+1, 0] <= lat.max()
150
+ coverage = 'Centre within regional field' if inside else 'Centre outside regional field\nCoarse pressure only here'
151
+ 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\n{coverage}", va='top', fontsize=12, color='#244754')
152
  valid = start+timedelta(hours=int(lead))
153
+ fig.suptitle(f'Trackformer 1.2 / FUNG-WONG / +{lead:03d} h', x=.055, y=.97, ha='left', fontsize=24, fontweight='bold', color='#173947')
154
  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')
155
  fig.text(.055, .067, 'Actual model pressure with 4 hPa isobars. Observations are verification only; selected example, not typical skill.', fontsize=11, color='#47636d')
156
  fig.text(.055, .040, 'Dotted boundary: fixed regional reconstruction (no native-detail history). Outside: coarse basin field only.', fontsize=10, color='#47636d')
157
  fig.savefig(work/f'frame_{k:03d}.png', dpi=100)
158
+ if k == 9: fig.savefig(REPO/'evaluation/trackformer_1_2_fung_wong_video_poster.png', dpi=100)
159
  plt.close(fig)
160
+ output = REPO/'docs/trackformer_1_2_fung_wong.mp4'
161
  subprocess.run(['ffmpeg', '-y', '-hide_banner', '-loglevel', 'warning', '-framerate', '1', '-i', str(work/'frame_%03d.png'),
162
  '-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)
163
+ meta['video'] = {'file': 'docs/trackformer_1_2_fung_wong.mp4', 'duration_seconds': 23, 'forecast_states': 20,
164
  'codec': 'H.264', 'encoder': 'h264_videotoolbox', 'sha256': sha(output),
165
  'playback': 'Each six-hour state held for 1 second; final frame held 3 seconds extra. No interpolated forecast states.'}
166
+ (DATA/'fung_wong_video.json').write_text(json.dumps(meta, indent=2)+'\n')
167
  print('Saved', output, output.stat().st_size, 'bytes', flush=True)
168
 
169