Select Fung-wong MP4; keep interactive showcase removed
Browse files- .gitattributes +3 -0
- README.md +8 -6
- RELEASE_NOTES_TRACKFORMER_1_2.md +1 -1
- docs/trackformer_1_2_evaluation.md +3 -3
- docs/{trackformer_1_2_yagi.mp4 → trackformer_1_2_fung_wong.mp4} +2 -2
- evaluation/README.md +1 -1
- evaluation/release_data/fung_wong_coastlines.json +1 -0
- evaluation/release_data/{yagi_video.json → fung_wong_video.json} +20 -13
- evaluation/{trackformer_1_2_yagi_video_poster.png → release_data/fung_wong_video.npz} +2 -2
- evaluation/release_data/yagi_coastlines.json +0 -1
- evaluation/{release_data/yagi_video.npz → trackformer_1_2_fung_wong_video_poster.png} +2 -2
- release_tools/{build_yagi_video.py → build_fung_wong_video.py} +32 -28
.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 |
-
##
|
| 71 |
|
| 72 |
-
<video controls playsinline preload="metadata" width="100%" poster="https://huggingface.co/euler314/typhoon-predict/resolve/main/evaluation/
|
| 73 |
|
| 74 |
-
[ 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 |
+
[](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
|
| 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 |
-
###
|
| 35 |
|
| 36 |
-
The [
|
| 37 |
|
| 38 |
-
The pressure MAE is **
|
| 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:
|
| 3 |
-
size
|
|
|
|
| 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 [
|
|
|
|
| 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": "
|
| 4 |
-
"storm_id": "
|
| 5 |
-
"issue_time_utc": "
|
| 6 |
-
"source_row":
|
| 7 |
-
"case_index":
|
| 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": "
|
| 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":
|
| 119 |
-
"track_error_120h_km":
|
| 120 |
-
"maximum_track_error_km":
|
| 121 |
"within_200km_leads": 20,
|
| 122 |
-
"central_pressure_mae_hpa":
|
| 123 |
"pressure_valid_leads": 20
|
| 124 |
},
|
| 125 |
-
"selection": "User-selected
|
| 126 |
"video": {
|
| 127 |
-
"file": "docs/
|
| 128 |
"duration_seconds": 23,
|
| 129 |
"forecast_states": 20,
|
| 130 |
"codec": "H.264",
|
| 131 |
"encoder": "h264_videotoolbox",
|
| 132 |
-
"sha256": "
|
| 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:
|
| 3 |
-
size
|
|
|
|
| 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
|
| 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'][
|
| 45 |
-
assert case['storm_id'] == '
|
| 46 |
with np.load(source, allow_pickle=False) as z:
|
| 47 |
-
assert int(z['source_rows'][
|
| 48 |
-
center = np.array([z['base_lat'][
|
| 49 |
-
local = z['ensemble50_local'][
|
| 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'][
|
| 53 |
-
native = z['ensemble50_native_mslp_hpa'][
|
| 54 |
-
coarse = z['ensemble50_mslp_hpa'][
|
| 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/'
|
| 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(
|
| 83 |
-
(DATA/'
|
| 84 |
-
meta = {'model': 'Trackformer 1.2', 'storm': '
|
| 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
|
| 98 |
-
(DATA/'
|
| 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/'
|
| 105 |
-
assert sha(DATA/'
|
| 106 |
-
with np.load(DATA/'
|
| 107 |
a = {k: z[k] for k in z.files}
|
| 108 |
-
rings = json.loads((DATA/'
|
| 109 |
f, o, lat, lon = (a[k] for k in ('forecast_lat_lon', 'observed_lat_lon', 'latitude', 'longitude'))
|
| 110 |
-
bounds = [
|
| 111 |
-
levels, contours = np.arange(
|
| 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(
|
| 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 |
-
|
|
|
|
|
|
|
| 148 |
valid = start+timedelta(hours=int(lead))
|
| 149 |
-
fig.suptitle(f'Trackformer 1.2 /
|
| 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/
|
| 155 |
plt.close(fig)
|
| 156 |
-
output = REPO/'docs/
|
| 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/
|
| 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/'
|
| 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 |
|