SCS-Lab commited on
Commit
63d77f8
·
verified ·
1 Parent(s): 43adfbe

publish: hmode_89, te_ped_89, ti_ped_89, t_rot_ped_89, edensfit89 (migrate flat root into edensfit89/)

Browse files
README.md CHANGED
@@ -1,3 +1,98 @@
1
- ---
2
- license: apache-2.0
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - fusion
5
+ - tokamak
6
+ - diii-d
7
+ - pedestal
8
+ - onnx
9
+ library_name: onnx
10
+ ---
11
+
12
+ # PedestalPredictor ONNX bundles
13
+
14
+ Five ONNX encapsulations of the same shared `PedestalModel`
15
+ architecture (MSE + FPE encoders) trained on DIII-D shot data.
16
+ Each subdirectory is a fully self-contained bundle: ONNX graphs
17
+ plus normalization, target, and provenance sidecars.
18
+
19
+ ## Quick start (recommended: `PedestalEnsemble` wrapper)
20
+
21
+ ```python
22
+ from inference.ensemble import PedestalEnsemble
23
+
24
+ ens = PedestalEnsemble.from_huggingface(
25
+ "SCS-Lab/pedestal-predictor-onnx"
26
+ )
27
+ out = ens.predict_one(
28
+ history_stats_v1=..., # (50, 446) float32
29
+ history_stats_v2=..., # (50, 458) float32
30
+ history_masks=..., # (50,)
31
+ aux_features=..., # (3,)
32
+ sequences_raw=..., # (T, 32) — raw physical units
33
+ signal_masks=..., # (32,)
34
+ )
35
+ print(out.te_ped, out.ti_ped, out.t_rot_ped,
36
+ out.edens_ped, out.is_h_mode, out.h_mode_prob)
37
+ ```
38
+
39
+ The wrapper ships in the
40
+ [PedestalPredictor GitHub repo](https://github.com/SCS-Lab/PedestalPredictor).
41
+ It loads all five bundles via `manifest.json` at this repo's root,
42
+ applies per-bundle FPE normalization from the raw physical-unit
43
+ inputs, runs the appropriate MSE-history width (446 vs 458) per
44
+ bundle, and returns a typed dataclass with all five predictions.
45
+
46
+ ## Quick start (advanced: raw per-bundle ONNX)
47
+
48
+ ```python
49
+ from huggingface_hub import snapshot_download
50
+ import onnxruntime as ort, json
51
+
52
+ local = snapshot_download(repo_id="SCS-Lab/pedestal-predictor-onnx",
53
+ allow_patterns=["te_ped_89/*"])
54
+ mse = ort.InferenceSession(f"{local}/te_ped_89/mse_encoder.onnx")
55
+ fpe = ort.InferenceSession(f"{local}/te_ped_89/fpe_encoder.onnx")
56
+ cfg = json.load(open(f"{local}/te_ped_89/model_config.json"))
57
+ # ... feed MSE history + FPE sequences; see te_ped_89/README.md
58
+ ```
59
+
60
+ ## Bundles
61
+
62
+ | Bundle | Task | Target | MSE history | FPE dim | Notes |
63
+ |---|---|---|---|---|---|
64
+ | [`hmode_89`](hmode_89/) | classification | `hmode` | 446 | 32 | threshold=0.5 |
65
+ | [`te_ped_89`](te_ped_89/) | regression | `te_ped (keV)` | 458 | 32 | μ=0.516, σ=0.410 |
66
+ | [`ti_ped_89`](ti_ped_89/) | regression | `ti_ped (keV)` | 458 | 32 | μ=0.902, σ=0.654 |
67
+ | [`t_rot_ped_89`](t_rot_ped_89/) | regression | `t_rot_ped (krad/s)` | 458 | 32 | μ=17.190, σ=14.376 |
68
+ | [`edensfit89`](edensfit89/) | regression | `edens_ped` | 446 | 32 | μ=2.580, σ=1.606 |
69
+
70
+ ## `manifest.json`
71
+
72
+ The root-level `manifest.json` lists every bundle's
73
+ `dataset_version`, `task`, `target`, default threshold, and
74
+ sidecar file list. The `PedestalEnsemble` wrapper reads this
75
+ manifest as its bootstrap contract; direct consumers of the
76
+ ONNX graphs can use it to auto-discover new bundles.
77
+
78
+ ## Provenance
79
+
80
+ Each bundle's `provenance.json` records:
81
+ - `bundle_name`, `task_type`, `target_name`, `dataset_version`
82
+ - `source_trial_dir` and `checkpoint` path on the training cluster
83
+ - `torch_version`, `onnx_version`, `opset_version`
84
+ - `git_sha` of the export-time commit in the GitHub repo
85
+ - `fpe_normalization_source` (+ sha256), `target_norm_source` (+ sha256)
86
+
87
+ ## Breaking path change
88
+
89
+ Pre-monorepo publishes put `mse_encoder.onnx` and `fpe_encoder.onnx`
90
+ at the repo root. They now live under `edensfit89/`. Update any
91
+ direct `hf_hub_download` calls accordingly; see the bottom of
92
+ [`edensfit89/README.md`](edensfit89/README.md) for the migration
93
+ snippet.
94
+
95
+ ## License
96
+
97
+ All bundles: APACHE 2.0.
98
+
edensfit89/README.md ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - fusion
5
+ - tokamak
6
+ - diii-d
7
+ - pedestal
8
+ - onnx
9
+ library_name: onnx
10
+ ---
11
+
12
+ # edensfit89
13
+
14
+ > **Consumer note.** Most users should not load this bundle's
15
+ > ONNX files directly. Use the `PedestalEnsemble` Python wrapper
16
+ > shipped in the [PedestalPredictor GitHub repo](https://github.com/SCS-Lab/PedestalPredictor),
17
+ > which loads all five bundles with one call and exposes a
18
+ > unified `predict_one(...)` API. Direct ONNX access documented
19
+ > below is for advanced users who want to integrate a single
20
+ > bundle into an existing ONNX-only pipeline.
21
+
22
+ ## Summary
23
+
24
+ - **Task:** regression
25
+ - **Target:** `edens_ped`
26
+ - **Dataset version:** `v1_446` (446-dim MSE history)
27
+ - **FPE signal dim:** 32
28
+ - **Exported at:** 2026-04-23T18:45:12.072496+00:00
29
+ - **torch / onnx:** 2.8.0 / 1.19.0 (opset 17)
30
+ - **Git SHA at export:** `5aceecf48dbf8696a4801a8d73bf5708c04d3b5b`
31
+
32
+ ## Output interpretation (regression)
33
+
34
+ The FPE graph emits a scalar prediction per time step in
35
+ z-scored `edens_ped` units. To recover physical units:
36
+
37
+ ```python
38
+ # target_mean=2.580092217753647, target_std=1.606271753311305
39
+ y_phys = pred * target_std + target_mean
40
+ ```
41
+
42
+ **Validation tolerance note:** RMS tolerance 1e-3 in normalized units ≈ 1.61e-03 (normalized units) for this target (target_std=1.6063).
43
+
44
+ ## Input contract- **MSE history:** `(batch, 50, 446)` — stats per shot.- **MSE mask:** `(batch, 50)` — 1.0 = valid, 0.0 = padding.- **MSE aux:** `(batch, 3)` — `bzn_seconds`, `disrupt_seconds`, `disrupt_coverage`- **FPE sequences:** `(batch, seq_len, 32)` — z-scored signals.- **FPE signal mask:** `(batch, 32)` — per-channel availability.- **FPE padding mask:** `(batch, seq_len)` — 1.0 = valid.See `normalization_params.json` for the exact z-score means andstds used at training time; the per-channel order matches the`fpe_signal_names` list below.<details><summary>FPE signal names (in channel order)</summary>
45
+
46
+ | idx | signal |
47
+ |---|---|
48
+ | 0 | `pohm` |
49
+ | 1 | `pinj` |
50
+ | 2 | `tinj` |
51
+ | 3 | `ech_total` |
52
+ | 4 | `f1a` |
53
+ | 5 | `f2a` |
54
+ | 6 | `f3a` |
55
+ | 7 | `f4a` |
56
+ | 8 | `f5a` |
57
+ | 9 | `f6a` |
58
+ | 10 | `f7a` |
59
+ | 11 | `f8a` |
60
+ | 12 | `f9a` |
61
+ | 13 | `f1b` |
62
+ | 14 | `f2b` |
63
+ | 15 | `f3b` |
64
+ | 16 | `f4b` |
65
+ | 17 | `f5b` |
66
+ | 18 | `f6b` |
67
+ | 19 | `f7b` |
68
+ | 20 | `f8b` |
69
+ | 21 | `f9b` |
70
+ | 22 | `ecoila` |
71
+ | 23 | `ecoilb` |
72
+ | 24 | `gasa_cal` |
73
+ | 25 | `gasb_cal` |
74
+ | 26 | `gasc_cal` |
75
+ | 27 | `gasd_cal` |
76
+ | 28 | `gase_cal` |
77
+ | 29 | `ip` |
78
+ | 30 | `ipspr15v` |
79
+ | 31 | `bt` |
80
+
81
+ </details>
82
+
83
+ ## Files
84
+
85
+ | File | Purpose |
86
+ |---|---|
87
+ | `mse_encoder.onnx` | Machine-state encoder graph (opset 17) |
88
+ | `fpe_encoder.onnx` | Fast-physics encoder graph |
89
+ | `model_config.json` | Architecture + task metadata (this card's authoritative source) |
90
+ | `provenance.json` | Export-time torch/onnx versions, git SHA, sidecar hashes |
91
+ | `normalization_params.json` | Per-channel z-score means + stds for FPE inputs |
92
+ | `target_norm.json` | `target_mean` / `target_std` (+ optional `clip_min`/`clip_max`) for de-normalizing regression outputs |
93
+
94
+ ## Validation
95
+
96
+ Each bundle ships with both random-tensor and real-sample
97
+ validation. On the PedestalPredictor GitHub repo, run:
98
+
99
+ ```bash
100
+ python -m inference.validate_onnx \
101
+ --model-dir <trial-dir> \
102
+ --onnx-dir onnx_models/edensfit89 \
103
+ --dataset-dir <dataset> \
104
+ --dataset-cls regression \
105
+ --num-samples 10
106
+ ```
107
+
108
+ (See [`docs/export_and_publish.md`](https://github.com/SCS-Lab/PedestalPredictor/blob/main/docs/export_and_publish.md) in the GitHub repo for exact per-bundle invocations.)
109
+
110
+ ## License
111
+
112
+ Licensed under APACHE 2.0 (see repo root).
113
+
fpe_encoder.onnx → edensfit89/fpe_encoder.onnx RENAMED
File without changes
edensfit89/model_config.json ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "signal_dim": 32,
3
+ "history_features": 446,
4
+ "history_length": 50,
5
+ "aux_input_dim": 3,
6
+ "mse_channels": 512,
7
+ "mse_blocks": 5,
8
+ "mse_embed_dim": 512,
9
+ "mse_kernel_size": 5,
10
+ "fpe_channels": 512,
11
+ "fpe_blocks": 14,
12
+ "fpe_kernel_size": 7,
13
+ "fpe_use_dilated": true,
14
+ "aux_embed_dim": 64,
15
+ "dropout": 0.26803639559450243,
16
+ "channel_mult": 0.75,
17
+ "use_gradient_checkpointing": false,
18
+ "use_mse": true,
19
+ "forecast_horizon": 0,
20
+ "task_type": "regression",
21
+ "target_name": "edens_ped",
22
+ "bundle_name": "edensfit89",
23
+ "dataset_version": "v1_446",
24
+ "input_contract": {
25
+ "fpe_signal_names": [
26
+ "pohm",
27
+ "pinj",
28
+ "tinj",
29
+ "ech_total",
30
+ "f1a",
31
+ "f2a",
32
+ "f3a",
33
+ "f4a",
34
+ "f5a",
35
+ "f6a",
36
+ "f7a",
37
+ "f8a",
38
+ "f9a",
39
+ "f1b",
40
+ "f2b",
41
+ "f3b",
42
+ "f4b",
43
+ "f5b",
44
+ "f6b",
45
+ "f7b",
46
+ "f8b",
47
+ "f9b",
48
+ "ecoila",
49
+ "ecoilb",
50
+ "gasa_cal",
51
+ "gasb_cal",
52
+ "gasc_cal",
53
+ "gasd_cal",
54
+ "gase_cal",
55
+ "ip",
56
+ "ipspr15v",
57
+ "bt"
58
+ ],
59
+ "fpe_signal_dim": 32,
60
+ "mse_history_width": 446,
61
+ "mse_history_length": 50,
62
+ "aux_feature_names": [
63
+ "bzn_seconds",
64
+ "disrupt_seconds",
65
+ "disrupt_coverage"
66
+ ]
67
+ },
68
+ "target_mean": 2.580092217753647,
69
+ "target_std": 1.606271753311305
70
+ }
mse_encoder.onnx → edensfit89/mse_encoder.onnx RENAMED
File without changes
edensfit89/normalization_params.json ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "means": [
3
+ 26507.25003675932,
4
+ 0.10491133000127097,
5
+ 0.04136727527690927,
6
+ 0.052206611478539236,
7
+ -55.41605806145344,
8
+ -51.03399154437292,
9
+ -23.643176733954856,
10
+ 46.52615428251581,
11
+ 44.74692321006923,
12
+ -100.39403005096887,
13
+ -94.01766294019251,
14
+ 29.923576489423933,
15
+ -21.012681753756432,
16
+ -56.029864619076015,
17
+ -55.002544722458474,
18
+ -40.77293744470453,
19
+ 46.24099342878102,
20
+ 61.26081739759195,
21
+ -101.82473882778888,
22
+ -122.12330546943289,
23
+ 60.4111991065362,
24
+ -2.995535993816526,
25
+ -175.01668517818288,
26
+ -167.13554262914562,
27
+ 0.885973359751426,
28
+ 0.11841111967031598,
29
+ 0.005288947231885697,
30
+ 0.010860898527613693,
31
+ 0.026004485349628896,
32
+ 34806.89527805803,
33
+ 0.06989404536391763,
34
+ -0.057366627691558786
35
+ ],
36
+ "stds": [
37
+ 207058.58850849333,
38
+ 1.2661850629414622,
39
+ 1.0465032640303291,
40
+ 1.3684045897120602,
41
+ 369.0326658318265,
42
+ 341.6838194630974,
43
+ 254.2092762419655,
44
+ 348.3925676072364,
45
+ 333.07475596428657,
46
+ 587.1117103568258,
47
+ 575.4105180953804,
48
+ 325.83810760783126,
49
+ 275.6435275106766,
50
+ 371.65464739734887,
51
+ 361.5751780037091,
52
+ 330.8551437833599,
53
+ 388.33727390157145,
54
+ 417.7677902076527,
55
+ 592.6213379046305,
56
+ 769.7839072711539,
57
+ 432.327991527322,
58
+ 302.2425140392462,
59
+ 4069.930751334016,
60
+ 4016.372443076925,
61
+ 7.8726546998896865,
62
+ 2.327789702279222,
63
+ 1.1669120854888493,
64
+ 1.270814965894171,
65
+ 1.5953199167615202,
66
+ 202451.265732129,
67
+ 1.0580009228915368,
68
+ 1.0573616137798103
69
+ ],
70
+ "counts": [
71
+ 7572914.0,
72
+ 6713607.0,
73
+ 6713607.0,
74
+ 7100251.0,
75
+ 7574643.0,
76
+ 7574643.0,
77
+ 7574643.0,
78
+ 7574643.0,
79
+ 7574643.0,
80
+ 7574643.0,
81
+ 7574643.0,
82
+ 7574643.0,
83
+ 7574643.0,
84
+ 7574643.0,
85
+ 7574643.0,
86
+ 7574643.0,
87
+ 7574643.0,
88
+ 7574643.0,
89
+ 7574643.0,
90
+ 7574643.0,
91
+ 7574643.0,
92
+ 7574643.0,
93
+ 7574643.0,
94
+ 7574643.0,
95
+ 7404400.0,
96
+ 4399528.0,
97
+ 4121010.0,
98
+ 4246154.0,
99
+ 2029433.0,
100
+ 7574643.0,
101
+ 7567634.0,
102
+ 7574643.0
103
+ ],
104
+ "signal_names": [
105
+ "pohm",
106
+ "pinj",
107
+ "tinj",
108
+ "ech_total",
109
+ "f1a",
110
+ "f2a",
111
+ "f3a",
112
+ "f4a",
113
+ "f5a",
114
+ "f6a",
115
+ "f7a",
116
+ "f8a",
117
+ "f9a",
118
+ "f1b",
119
+ "f2b",
120
+ "f3b",
121
+ "f4b",
122
+ "f5b",
123
+ "f6b",
124
+ "f7b",
125
+ "f8b",
126
+ "f9b",
127
+ "ecoila",
128
+ "ecoilb",
129
+ "gasa_cal",
130
+ "gasb_cal",
131
+ "gasc_cal",
132
+ "gasd_cal",
133
+ "gase_cal",
134
+ "ip",
135
+ "ipspr15v",
136
+ "bt"
137
+ ],
138
+ "n_channels": 32
139
+ }
edensfit89/provenance.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "exported_at": "2026-04-23T18:45:12.072496+00:00",
3
+ "bundle_name": "edensfit89",
4
+ "task_type": "regression",
5
+ "target_name": "edens_ped",
6
+ "dataset_version": "v1_446",
7
+ "source_trial_dir": "/lus/eagle/projects/fusiondl_aesp/jrodriguez/PedestalPredictor/hptune_runs/edensfit89_prod/trials/trial_20260315_044036_cb228193",
8
+ "checkpoint": "/lus/eagle/projects/fusiondl_aesp/jrodriguez/PedestalPredictor/hptune_runs/edensfit89_prod/trials/trial_20260315_044036_cb228193/logs/best_model.pt",
9
+ "opset_version": 17,
10
+ "torch_version": "2.8.0",
11
+ "onnx_version": "1.19.0",
12
+ "git_sha": "5aceecf48dbf8696a4801a8d73bf5708c04d3b5b",
13
+ "fpe_normalization_source": {
14
+ "path": "/lus/eagle/projects/fusiondl_aesp/d3d_edensfit89_dataset/normalization_params.json",
15
+ "sha256": "fdedc83f4c66633aa2b7f9d64747e5479c0bac9aee3253bf2b6bda62f22195d8",
16
+ "n_channels": 32
17
+ },
18
+ "target_norm_source": {
19
+ "path": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/onnx_models/edensfit89/target_norm.source.json",
20
+ "sha256": "f5a9245c95c368ea820df0ba41c5c4ca962304d8a49a7c16de2fcc392ed8978d"
21
+ }
22
+ }
edensfit89/target_norm.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "target_name": "edens_ped",
3
+ "target_mean": 2.580092217753647,
4
+ "target_std": 1.606271753311305,
5
+ "_source": "/eagle/fusiondl_aesp/jrodriguez/PedestalPredictor/hptune_runs/edensfit89_prod/trials/trial_20260315_044036_cb228193/normalization_stats.json",
6
+ "_notes": "Synthesized from edensfit89 trial normalization_stats.json by scripts/export_all_bundles.sh. The source file carries the full signal/history normalization stats used during training; this subset is only target-side."
7
+ }
hmode_89/README.md ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - fusion
5
+ - tokamak
6
+ - diii-d
7
+ - pedestal
8
+ - onnx
9
+ library_name: onnx
10
+ ---
11
+
12
+ # hmode_89
13
+
14
+ > **Consumer note.** Most users should not load this bundle's
15
+ > ONNX files directly. Use the `PedestalEnsemble` Python wrapper
16
+ > shipped in the [PedestalPredictor GitHub repo](https://github.com/SCS-Lab/PedestalPredictor),
17
+ > which loads all five bundles with one call and exposes a
18
+ > unified `predict_one(...)` API. Direct ONNX access documented
19
+ > below is for advanced users who want to integrate a single
20
+ > bundle into an existing ONNX-only pipeline.
21
+
22
+ ## Summary
23
+
24
+ - **Task:** classification
25
+ - **Target:** `hmode`
26
+ - **Dataset version:** `v1_446` (446-dim MSE history)
27
+ - **FPE signal dim:** 32
28
+ - **Exported at:** 2026-04-23T18:45:16.191683+00:00
29
+ - **torch / onnx:** 2.8.0 / 1.19.0 (opset 17)
30
+ - **Git SHA at export:** `5aceecf48dbf8696a4801a8d73bf5708c04d3b5b`
31
+
32
+ ## Output interpretation (classification)
33
+
34
+ The FPE graph emits a raw logit per time step. Apply
35
+ `sigmoid` for a probability and threshold at
36
+ `0.5` for a binary `is_h_mode` label:
37
+
38
+ ```python
39
+ import numpy as np
40
+ p = 1.0 / (1.0 + np.exp(-logit)) # sigmoid
41
+ is_h_mode = p >= 0.5
42
+ ```
43
+
44
+ Threshold 0.5 was adopted after inspection of the trial's
45
+ `metrics.json` (the training loop logged `val_threshold: 0.5`
46
+ every epoch) and unbiased evaluation results. Consumers with
47
+ asymmetric false-positive vs false-negative costs should
48
+ calibrate their own threshold on a held-out split.
49
+
50
+ ## Input contract- **MSE history:** `(batch, 50, 446)` — stats per shot.- **MSE mask:** `(batch, 50)` — 1.0 = valid, 0.0 = padding.- **MSE aux:** `(batch, 3)` — `bzn_seconds`, `disrupt_seconds`, `disrupt_coverage`- **FPE sequences:** `(batch, seq_len, 32)` — z-scored signals.- **FPE signal mask:** `(batch, 32)` — per-channel availability.- **FPE padding mask:** `(batch, seq_len)` — 1.0 = valid.See `normalization_params.json` for the exact z-score means andstds used at training time; the per-channel order matches the`fpe_signal_names` list below.<details><summary>FPE signal names (in channel order)</summary>
51
+
52
+ | idx | signal |
53
+ |---|---|
54
+ | 0 | `pohm` |
55
+ | 1 | `pinj` |
56
+ | 2 | `tinj` |
57
+ | 3 | `ech_total` |
58
+ | 4 | `f1a` |
59
+ | 5 | `f2a` |
60
+ | 6 | `f3a` |
61
+ | 7 | `f4a` |
62
+ | 8 | `f5a` |
63
+ | 9 | `f6a` |
64
+ | 10 | `f7a` |
65
+ | 11 | `f8a` |
66
+ | 12 | `f9a` |
67
+ | 13 | `f1b` |
68
+ | 14 | `f2b` |
69
+ | 15 | `f3b` |
70
+ | 16 | `f4b` |
71
+ | 17 | `f5b` |
72
+ | 18 | `f6b` |
73
+ | 19 | `f7b` |
74
+ | 20 | `f8b` |
75
+ | 21 | `f9b` |
76
+ | 22 | `ecoila` |
77
+ | 23 | `ecoilb` |
78
+ | 24 | `gasa_cal` |
79
+ | 25 | `gasb_cal` |
80
+ | 26 | `gasc_cal` |
81
+ | 27 | `gasd_cal` |
82
+ | 28 | `gase_cal` |
83
+ | 29 | `ip` |
84
+ | 30 | `ipspr15v` |
85
+ | 31 | `bt` |
86
+
87
+ </details>
88
+
89
+ ## Files
90
+
91
+ | File | Purpose |
92
+ |---|---|
93
+ | `mse_encoder.onnx` | Machine-state encoder graph (opset 17) |
94
+ | `fpe_encoder.onnx` | Fast-physics encoder graph |
95
+ | `model_config.json` | Architecture + task metadata (this card's authoritative source) |
96
+ | `provenance.json` | Export-time torch/onnx versions, git SHA, sidecar hashes |
97
+ | `normalization_params.json` | Per-channel z-score means + stds for FPE inputs |
98
+
99
+ ## Validation
100
+
101
+ Each bundle ships with both random-tensor and real-sample
102
+ validation. On the PedestalPredictor GitHub repo, run:
103
+
104
+ ```bash
105
+ python -m inference.validate_onnx \
106
+ --model-dir <trial-dir> \
107
+ --onnx-dir onnx_models/hmode_89 \
108
+ --dataset-dir <dataset> \
109
+ --dataset-cls classification \
110
+ --num-samples 10
111
+ ```
112
+
113
+ (See [`docs/export_and_publish.md`](https://github.com/SCS-Lab/PedestalPredictor/blob/main/docs/export_and_publish.md) in the GitHub repo for exact per-bundle invocations.)
114
+
115
+ ## License
116
+
117
+ Licensed under APACHE 2.0 (see repo root).
118
+
hmode_89/fpe_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ef41c98fc1a1e4033dfd1d83c27ced4d22ec530d551a8220be73d3672078c3bc
3
+ size 117025127
hmode_89/model_config.json ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "signal_dim": 32,
3
+ "history_features": 446,
4
+ "history_length": 50,
5
+ "aux_input_dim": 3,
6
+ "mse_channels": 512,
7
+ "mse_blocks": 5,
8
+ "mse_embed_dim": 512,
9
+ "mse_kernel_size": 5,
10
+ "fpe_channels": 512,
11
+ "fpe_blocks": 14,
12
+ "fpe_kernel_size": 7,
13
+ "fpe_use_dilated": true,
14
+ "aux_embed_dim": 64,
15
+ "dropout": 0.26803639559450243,
16
+ "channel_mult": 0.75,
17
+ "use_gradient_checkpointing": false,
18
+ "use_mse": true,
19
+ "forecast_horizon": 0,
20
+ "task_type": "classification",
21
+ "target_name": "hmode",
22
+ "bundle_name": "hmode_89",
23
+ "dataset_version": "v1_446",
24
+ "input_contract": {
25
+ "fpe_signal_names": [
26
+ "pohm",
27
+ "pinj",
28
+ "tinj",
29
+ "ech_total",
30
+ "f1a",
31
+ "f2a",
32
+ "f3a",
33
+ "f4a",
34
+ "f5a",
35
+ "f6a",
36
+ "f7a",
37
+ "f8a",
38
+ "f9a",
39
+ "f1b",
40
+ "f2b",
41
+ "f3b",
42
+ "f4b",
43
+ "f5b",
44
+ "f6b",
45
+ "f7b",
46
+ "f8b",
47
+ "f9b",
48
+ "ecoila",
49
+ "ecoilb",
50
+ "gasa_cal",
51
+ "gasb_cal",
52
+ "gasc_cal",
53
+ "gasd_cal",
54
+ "gase_cal",
55
+ "ip",
56
+ "ipspr15v",
57
+ "bt"
58
+ ],
59
+ "fpe_signal_dim": 32,
60
+ "mse_history_width": 446,
61
+ "mse_history_length": 50,
62
+ "aux_feature_names": [
63
+ "bzn_seconds",
64
+ "disrupt_seconds",
65
+ "disrupt_coverage"
66
+ ]
67
+ },
68
+ "default_threshold": 0.5
69
+ }
hmode_89/mse_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:dc32cd8095d47df720af826468ffb79be1132f6a94cc3120a1777d8d56a0821e
3
+ size 32176945
hmode_89/normalization_params.json ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "means": [
3
+ 26507.25003675932,
4
+ 0.10491133000127097,
5
+ 0.04136727527690927,
6
+ 0.052206611478539236,
7
+ -55.41605806145344,
8
+ -51.03399154437292,
9
+ -23.643176733954856,
10
+ 46.52615428251581,
11
+ 44.74692321006923,
12
+ -100.39403005096887,
13
+ -94.01766294019251,
14
+ 29.923576489423933,
15
+ -21.012681753756432,
16
+ -56.029864619076015,
17
+ -55.002544722458474,
18
+ -40.77293744470453,
19
+ 46.24099342878102,
20
+ 61.26081739759195,
21
+ -101.82473882778888,
22
+ -122.12330546943289,
23
+ 60.4111991065362,
24
+ -2.995535993816526,
25
+ -175.01668517818288,
26
+ -167.13554262914562,
27
+ 0.885973359751426,
28
+ 0.11841111967031598,
29
+ 0.005288947231885697,
30
+ 0.010860898527613693,
31
+ 0.026004485349628896,
32
+ 34806.89527805803,
33
+ 0.06989404536391763,
34
+ -0.057366627691558786
35
+ ],
36
+ "stds": [
37
+ 207058.58850849333,
38
+ 1.2661850629414622,
39
+ 1.0465032640303291,
40
+ 1.3684045897120602,
41
+ 369.0326658318265,
42
+ 341.6838194630974,
43
+ 254.2092762419655,
44
+ 348.3925676072364,
45
+ 333.07475596428657,
46
+ 587.1117103568258,
47
+ 575.4105180953804,
48
+ 325.83810760783126,
49
+ 275.6435275106766,
50
+ 371.65464739734887,
51
+ 361.5751780037091,
52
+ 330.8551437833599,
53
+ 388.33727390157145,
54
+ 417.7677902076527,
55
+ 592.6213379046305,
56
+ 769.7839072711539,
57
+ 432.327991527322,
58
+ 302.2425140392462,
59
+ 4069.930751334016,
60
+ 4016.372443076925,
61
+ 7.8726546998896865,
62
+ 2.327789702279222,
63
+ 1.1669120854888493,
64
+ 1.270814965894171,
65
+ 1.5953199167615202,
66
+ 202451.265732129,
67
+ 1.0580009228915368,
68
+ 1.0573616137798103
69
+ ],
70
+ "counts": [
71
+ 7572914.0,
72
+ 6713607.0,
73
+ 6713607.0,
74
+ 7100251.0,
75
+ 7574643.0,
76
+ 7574643.0,
77
+ 7574643.0,
78
+ 7574643.0,
79
+ 7574643.0,
80
+ 7574643.0,
81
+ 7574643.0,
82
+ 7574643.0,
83
+ 7574643.0,
84
+ 7574643.0,
85
+ 7574643.0,
86
+ 7574643.0,
87
+ 7574643.0,
88
+ 7574643.0,
89
+ 7574643.0,
90
+ 7574643.0,
91
+ 7574643.0,
92
+ 7574643.0,
93
+ 7574643.0,
94
+ 7574643.0,
95
+ 7404400.0,
96
+ 4399528.0,
97
+ 4121010.0,
98
+ 4246154.0,
99
+ 2029433.0,
100
+ 7574643.0,
101
+ 7567634.0,
102
+ 7574643.0
103
+ ],
104
+ "signal_names": [
105
+ "pohm",
106
+ "pinj",
107
+ "tinj",
108
+ "ech_total",
109
+ "f1a",
110
+ "f2a",
111
+ "f3a",
112
+ "f4a",
113
+ "f5a",
114
+ "f6a",
115
+ "f7a",
116
+ "f8a",
117
+ "f9a",
118
+ "f1b",
119
+ "f2b",
120
+ "f3b",
121
+ "f4b",
122
+ "f5b",
123
+ "f6b",
124
+ "f7b",
125
+ "f8b",
126
+ "f9b",
127
+ "ecoila",
128
+ "ecoilb",
129
+ "gasa_cal",
130
+ "gasb_cal",
131
+ "gasc_cal",
132
+ "gasd_cal",
133
+ "gase_cal",
134
+ "ip",
135
+ "ipspr15v",
136
+ "bt"
137
+ ],
138
+ "n_channels": 32
139
+ }
hmode_89/provenance.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "exported_at": "2026-04-23T18:45:16.191683+00:00",
3
+ "bundle_name": "hmode_89",
4
+ "task_type": "classification",
5
+ "target_name": "hmode",
6
+ "dataset_version": "v1_446",
7
+ "source_trial_dir": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/h_mode_classifier_89_prod/trials/trial_0001",
8
+ "checkpoint": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/h_mode_classifier_89_prod/trials/trial_0001/logs/best_model.pt",
9
+ "opset_version": 17,
10
+ "torch_version": "2.8.0",
11
+ "onnx_version": "1.19.0",
12
+ "git_sha": "5aceecf48dbf8696a4801a8d73bf5708c04d3b5b",
13
+ "fpe_normalization_source": {
14
+ "path": "/lus/eagle/projects/fusiondl_aesp/d3d_edensfit89_dataset/normalization_params.json",
15
+ "sha256": "fdedc83f4c66633aa2b7f9d64747e5479c0bac9aee3253bf2b6bda62f22195d8",
16
+ "n_channels": 32
17
+ }
18
+ }
manifest.json ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "generated_at": "2026-04-23T21:24:55.008784+00:00",
4
+ "license": "apache-2.0",
5
+ "bundles": {
6
+ "hmode_89": {
7
+ "task": "classification",
8
+ "target": "hmode",
9
+ "dataset_version": "v1_446",
10
+ "history_features": 446,
11
+ "signal_dim": 32,
12
+ "sidecars": [
13
+ "model_config.json",
14
+ "provenance.json",
15
+ "normalization_params.json"
16
+ ],
17
+ "default_threshold": 0.5
18
+ },
19
+ "te_ped_89": {
20
+ "task": "regression",
21
+ "target": "te_ped",
22
+ "dataset_version": "v2_458",
23
+ "history_features": 458,
24
+ "signal_dim": 32,
25
+ "sidecars": [
26
+ "model_config.json",
27
+ "provenance.json",
28
+ "normalization_params.json",
29
+ "target_norm.json"
30
+ ],
31
+ "target_units": "keV",
32
+ "target_mean": 0.5160982824407585,
33
+ "target_std": 0.4096386938561064
34
+ },
35
+ "ti_ped_89": {
36
+ "task": "regression",
37
+ "target": "ti_ped",
38
+ "dataset_version": "v2_458",
39
+ "history_features": 458,
40
+ "signal_dim": 32,
41
+ "sidecars": [
42
+ "model_config.json",
43
+ "provenance.json",
44
+ "normalization_params.json",
45
+ "target_norm.json"
46
+ ],
47
+ "target_units": "keV",
48
+ "target_mean": 0.9016129457842141,
49
+ "target_std": 0.6536277236278131
50
+ },
51
+ "t_rot_ped_89": {
52
+ "task": "regression",
53
+ "target": "t_rot_ped",
54
+ "dataset_version": "v2_458",
55
+ "history_features": 458,
56
+ "signal_dim": 32,
57
+ "sidecars": [
58
+ "model_config.json",
59
+ "provenance.json",
60
+ "normalization_params.json",
61
+ "target_norm.json"
62
+ ],
63
+ "target_units": "krad/s",
64
+ "target_mean": 17.189643666847786,
65
+ "target_std": 14.376258184246698
66
+ },
67
+ "edensfit89": {
68
+ "task": "regression",
69
+ "target": "edens_ped",
70
+ "dataset_version": "v1_446",
71
+ "history_features": 446,
72
+ "signal_dim": 32,
73
+ "sidecars": [
74
+ "model_config.json",
75
+ "provenance.json",
76
+ "normalization_params.json",
77
+ "target_norm.json"
78
+ ],
79
+ "target_units": null,
80
+ "target_mean": 2.580092217753647,
81
+ "target_std": 1.606271753311305
82
+ }
83
+ }
84
+ }
t_rot_ped_89/README.md ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - fusion
5
+ - tokamak
6
+ - diii-d
7
+ - pedestal
8
+ - onnx
9
+ library_name: onnx
10
+ ---
11
+
12
+ # t_rot_ped_89
13
+
14
+ > **Consumer note.** Most users should not load this bundle's
15
+ > ONNX files directly. Use the `PedestalEnsemble` Python wrapper
16
+ > shipped in the [PedestalPredictor GitHub repo](https://github.com/SCS-Lab/PedestalPredictor),
17
+ > which loads all five bundles with one call and exposes a
18
+ > unified `predict_one(...)` API. Direct ONNX access documented
19
+ > below is for advanced users who want to integrate a single
20
+ > bundle into an existing ONNX-only pipeline.
21
+
22
+ ## Summary
23
+
24
+ - **Task:** regression
25
+ - **Target:** `t_rot_ped` (krad/s)
26
+ - **Dataset version:** `v2_458` (458-dim MSE history)
27
+ - **FPE signal dim:** 32
28
+ - **Exported at:** 2026-04-23T18:45:29.337028+00:00
29
+ - **torch / onnx:** 2.8.0 / 1.19.0 (opset 17)
30
+ - **Git SHA at export:** `5aceecf48dbf8696a4801a8d73bf5708c04d3b5b`
31
+
32
+ ## Output interpretation (regression)
33
+
34
+ The FPE graph emits a scalar prediction per time step in
35
+ z-scored `t_rot_ped` units. To recover physical units:
36
+
37
+ ```python
38
+ # target_mean=17.189643666847786, target_std=14.376258184246698
39
+ y_phys = pred * target_std + target_mean
40
+ ```
41
+
42
+ Training-time clip range: `[-100.0, 400.0]` krad/s — predictions outside this range
43
+ reflect the training filter bounds and should be treated
44
+ with caution.
45
+
46
+ **Validation tolerance note:** RMS tolerance 1e-3 in normalized units ≈ 1.44e-02 krad/s for this target (target_std=14.3763).
47
+
48
+ ## Input contract- **MSE history:** `(batch, 50, 458)` — stats per shot.- **MSE mask:** `(batch, 50)` — 1.0 = valid, 0.0 = padding.- **MSE aux:** `(batch, 3)` — `bzn_seconds`, `disrupt_seconds`, `disrupt_coverage`- **FPE sequences:** `(batch, seq_len, 32)` — z-scored signals.- **FPE signal mask:** `(batch, 32)` — per-channel availability.- **FPE padding mask:** `(batch, seq_len)` — 1.0 = valid.See `normalization_params.json` for the exact z-score means andstds used at training time; the per-channel order matches the`fpe_signal_names` list below.<details><summary>FPE signal names (in channel order)</summary>
49
+
50
+ | idx | signal |
51
+ |---|---|
52
+ | 0 | `pohm` |
53
+ | 1 | `pinj` |
54
+ | 2 | `tinj` |
55
+ | 3 | `ech_total` |
56
+ | 4 | `f1a` |
57
+ | 5 | `f2a` |
58
+ | 6 | `f3a` |
59
+ | 7 | `f4a` |
60
+ | 8 | `f5a` |
61
+ | 9 | `f6a` |
62
+ | 10 | `f7a` |
63
+ | 11 | `f8a` |
64
+ | 12 | `f9a` |
65
+ | 13 | `f1b` |
66
+ | 14 | `f2b` |
67
+ | 15 | `f3b` |
68
+ | 16 | `f4b` |
69
+ | 17 | `f5b` |
70
+ | 18 | `f6b` |
71
+ | 19 | `f7b` |
72
+ | 20 | `f8b` |
73
+ | 21 | `f9b` |
74
+ | 22 | `ecoila` |
75
+ | 23 | `ecoilb` |
76
+ | 24 | `gasa_cal` |
77
+ | 25 | `gasb_cal` |
78
+ | 26 | `gasc_cal` |
79
+ | 27 | `gasd_cal` |
80
+ | 28 | `gase_cal` |
81
+ | 29 | `ip` |
82
+ | 30 | `ipspr15v` |
83
+ | 31 | `bt` |
84
+
85
+ </details>
86
+
87
+ ## Files
88
+
89
+ | File | Purpose |
90
+ |---|---|
91
+ | `mse_encoder.onnx` | Machine-state encoder graph (opset 17) |
92
+ | `fpe_encoder.onnx` | Fast-physics encoder graph |
93
+ | `model_config.json` | Architecture + task metadata (this card's authoritative source) |
94
+ | `provenance.json` | Export-time torch/onnx versions, git SHA, sidecar hashes |
95
+ | `normalization_params.json` | Per-channel z-score means + stds for FPE inputs |
96
+ | `target_norm.json` | `target_mean` / `target_std` (+ optional `clip_min`/`clip_max`) for de-normalizing regression outputs |
97
+
98
+ ## Validation
99
+
100
+ Each bundle ships with both random-tensor and real-sample
101
+ validation. On the PedestalPredictor GitHub repo, run:
102
+
103
+ ```bash
104
+ python -m inference.validate_onnx \
105
+ --model-dir <trial-dir> \
106
+ --onnx-dir onnx_models/t_rot_ped_89 \
107
+ --dataset-dir <dataset> \
108
+ --dataset-cls regression \
109
+ --num-samples 10
110
+ ```
111
+
112
+ (See [`docs/export_and_publish.md`](https://github.com/SCS-Lab/PedestalPredictor/blob/main/docs/export_and_publish.md) in the GitHub repo for exact per-bundle invocations.)
113
+
114
+ ## License
115
+
116
+ Licensed under APACHE 2.0 (see repo root).
117
+
t_rot_ped_89/fpe_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96663e4aced6c7ccfad0543cdc1f5013b3ba8197993df87693f2aed0e98558bb
3
+ size 117025127
t_rot_ped_89/model_config.json ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "signal_dim": 32,
3
+ "history_features": 458,
4
+ "history_length": 50,
5
+ "aux_input_dim": 3,
6
+ "mse_channels": 512,
7
+ "mse_blocks": 5,
8
+ "mse_embed_dim": 512,
9
+ "mse_kernel_size": 5,
10
+ "fpe_channels": 512,
11
+ "fpe_blocks": 14,
12
+ "fpe_kernel_size": 7,
13
+ "fpe_use_dilated": true,
14
+ "aux_embed_dim": 64,
15
+ "dropout": 0.26803639559450243,
16
+ "channel_mult": 0.75,
17
+ "use_gradient_checkpointing": false,
18
+ "use_mse": true,
19
+ "forecast_horizon": 0,
20
+ "task_type": "regression",
21
+ "target_name": "t_rot_ped",
22
+ "bundle_name": "t_rot_ped_89",
23
+ "dataset_version": "v2_458",
24
+ "input_contract": {
25
+ "fpe_signal_names": [
26
+ "pohm",
27
+ "pinj",
28
+ "tinj",
29
+ "ech_total",
30
+ "f1a",
31
+ "f2a",
32
+ "f3a",
33
+ "f4a",
34
+ "f5a",
35
+ "f6a",
36
+ "f7a",
37
+ "f8a",
38
+ "f9a",
39
+ "f1b",
40
+ "f2b",
41
+ "f3b",
42
+ "f4b",
43
+ "f5b",
44
+ "f6b",
45
+ "f7b",
46
+ "f8b",
47
+ "f9b",
48
+ "ecoila",
49
+ "ecoilb",
50
+ "gasa_cal",
51
+ "gasb_cal",
52
+ "gasc_cal",
53
+ "gasd_cal",
54
+ "gase_cal",
55
+ "ip",
56
+ "ipspr15v",
57
+ "bt"
58
+ ],
59
+ "fpe_signal_dim": 32,
60
+ "mse_history_width": 458,
61
+ "mse_history_length": 50,
62
+ "aux_feature_names": [
63
+ "bzn_seconds",
64
+ "disrupt_seconds",
65
+ "disrupt_coverage"
66
+ ]
67
+ },
68
+ "target_mean": 17.189643666847786,
69
+ "target_std": 14.376258184246698,
70
+ "clip_min": -100.0,
71
+ "clip_max": 400.0,
72
+ "target_units": "krad/s"
73
+ }
t_rot_ped_89/mse_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a74036acbe18110f9b1aac754734a5b67f804fe89300e8e167b579a47cdf136e
3
+ size 32197777
t_rot_ped_89/normalization_params.json ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "means": [
3
+ 26507.25003675932,
4
+ 0.10491133000127097,
5
+ 0.04136727527690927,
6
+ 0.052206611478539236,
7
+ -55.41605806145344,
8
+ -51.03399154437292,
9
+ -23.643176733954856,
10
+ 46.52615428251581,
11
+ 44.74692321006923,
12
+ -100.39403005096887,
13
+ -94.01766294019251,
14
+ 29.923576489423933,
15
+ -21.012681753756432,
16
+ -56.029864619076015,
17
+ -55.002544722458474,
18
+ -40.77293744470453,
19
+ 46.24099342878102,
20
+ 61.26081739759195,
21
+ -101.82473882778888,
22
+ -122.12330546943289,
23
+ 60.4111991065362,
24
+ -2.995535993816526,
25
+ -175.01668517818288,
26
+ -167.13554262914562,
27
+ 0.885973359751426,
28
+ 0.11841111967031598,
29
+ 0.005288947231885697,
30
+ 0.010860898527613693,
31
+ 0.026004485349628896,
32
+ 34806.89527805803,
33
+ 0.06989404536391763,
34
+ -0.057366627691558786
35
+ ],
36
+ "stds": [
37
+ 207058.58850849333,
38
+ 1.2661850629414622,
39
+ 1.0465032640303291,
40
+ 1.3684045897120602,
41
+ 369.0326658318265,
42
+ 341.6838194630974,
43
+ 254.2092762419655,
44
+ 348.3925676072364,
45
+ 333.07475596428657,
46
+ 587.1117103568258,
47
+ 575.4105180953804,
48
+ 325.83810760783126,
49
+ 275.6435275106766,
50
+ 371.65464739734887,
51
+ 361.5751780037091,
52
+ 330.8551437833599,
53
+ 388.33727390157145,
54
+ 417.7677902076527,
55
+ 592.6213379046305,
56
+ 769.7839072711539,
57
+ 432.327991527322,
58
+ 302.2425140392462,
59
+ 4069.930751334016,
60
+ 4016.372443076925,
61
+ 7.8726546998896865,
62
+ 2.327789702279222,
63
+ 1.1669120854888493,
64
+ 1.270814965894171,
65
+ 1.5953199167615202,
66
+ 202451.265732129,
67
+ 1.0580009228915368,
68
+ 1.0573616137798103
69
+ ],
70
+ "counts": [
71
+ 7572914.0,
72
+ 6713607.0,
73
+ 6713607.0,
74
+ 7100251.0,
75
+ 7574643.0,
76
+ 7574643.0,
77
+ 7574643.0,
78
+ 7574643.0,
79
+ 7574643.0,
80
+ 7574643.0,
81
+ 7574643.0,
82
+ 7574643.0,
83
+ 7574643.0,
84
+ 7574643.0,
85
+ 7574643.0,
86
+ 7574643.0,
87
+ 7574643.0,
88
+ 7574643.0,
89
+ 7574643.0,
90
+ 7574643.0,
91
+ 7574643.0,
92
+ 7574643.0,
93
+ 7574643.0,
94
+ 7574643.0,
95
+ 7404400.0,
96
+ 4399528.0,
97
+ 4121010.0,
98
+ 4246154.0,
99
+ 2029433.0,
100
+ 7574643.0,
101
+ 7567634.0,
102
+ 7574643.0
103
+ ],
104
+ "signal_names": [
105
+ "pohm",
106
+ "pinj",
107
+ "tinj",
108
+ "ech_total",
109
+ "f1a",
110
+ "f2a",
111
+ "f3a",
112
+ "f4a",
113
+ "f5a",
114
+ "f6a",
115
+ "f7a",
116
+ "f8a",
117
+ "f9a",
118
+ "f1b",
119
+ "f2b",
120
+ "f3b",
121
+ "f4b",
122
+ "f5b",
123
+ "f6b",
124
+ "f7b",
125
+ "f8b",
126
+ "f9b",
127
+ "ecoila",
128
+ "ecoilb",
129
+ "gasa_cal",
130
+ "gasb_cal",
131
+ "gasc_cal",
132
+ "gasd_cal",
133
+ "gase_cal",
134
+ "ip",
135
+ "ipspr15v",
136
+ "bt"
137
+ ],
138
+ "n_channels": 32
139
+ }
t_rot_ped_89/provenance.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "exported_at": "2026-04-23T18:45:29.337028+00:00",
3
+ "bundle_name": "t_rot_ped_89",
4
+ "task_type": "regression",
5
+ "target_name": "t_rot_ped",
6
+ "dataset_version": "v2_458",
7
+ "source_trial_dir": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/t_rot_ped__89_prod/trials/trial_0001",
8
+ "checkpoint": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/t_rot_ped__89_prod/trials/trial_0001/logs/best_model.pt",
9
+ "opset_version": 17,
10
+ "torch_version": "2.8.0",
11
+ "onnx_version": "1.19.0",
12
+ "git_sha": "5aceecf48dbf8696a4801a8d73bf5708c04d3b5b",
13
+ "fpe_normalization_source": {
14
+ "path": "/lus/eagle/projects/fusiondl_aesp/d3d_pedestal_newsignals_dataset/normalization_params.json",
15
+ "sha256": "fdedc83f4c66633aa2b7f9d64747e5479c0bac9aee3253bf2b6bda62f22195d8",
16
+ "n_channels": 32
17
+ },
18
+ "target_norm_source": {
19
+ "path": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/t_rot_ped__89_prod/trials/trial_0001/target_norm.json",
20
+ "sha256": "c82e0b285798318ca12911b0be5edc23fa3b6358121d3bc0ef51cde77a50fa83"
21
+ }
22
+ }
t_rot_ped_89/target_norm.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "target_name": "t_rot_ped",
3
+ "source": "trotfit[:, 89]",
4
+ "units": "krad/s",
5
+ "rho_index": 89,
6
+ "target_mean": 17.189643666847786,
7
+ "target_std": 14.376258184246698,
8
+ "clip_min": -100.0,
9
+ "clip_max": 400.0,
10
+ "staleness_ms_max": 500.0,
11
+ "n_train_samples_post_filter": 5686323,
12
+ "_notes": "Computed from d3d_edensfit89_dataset train split only. Values filtered by clip bounds (A1) and staleness<=500ms (A2) before mean/std. Decisions A1/A2 documented in ped_labels_trot_edensfit89/README.md and the fork README.md; adopted without advisor sign-off (A3)."
13
+ }
te_ped_89/README.md ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - fusion
5
+ - tokamak
6
+ - diii-d
7
+ - pedestal
8
+ - onnx
9
+ library_name: onnx
10
+ ---
11
+
12
+ # te_ped_89
13
+
14
+ > **Consumer note.** Most users should not load this bundle's
15
+ > ONNX files directly. Use the `PedestalEnsemble` Python wrapper
16
+ > shipped in the [PedestalPredictor GitHub repo](https://github.com/SCS-Lab/PedestalPredictor),
17
+ > which loads all five bundles with one call and exposes a
18
+ > unified `predict_one(...)` API. Direct ONNX access documented
19
+ > below is for advanced users who want to integrate a single
20
+ > bundle into an existing ONNX-only pipeline.
21
+
22
+ ## Summary
23
+
24
+ - **Task:** regression
25
+ - **Target:** `te_ped` (keV)
26
+ - **Dataset version:** `v2_458` (458-dim MSE history)
27
+ - **FPE signal dim:** 32
28
+ - **Exported at:** 2026-04-23T18:45:20.616252+00:00
29
+ - **torch / onnx:** 2.8.0 / 1.19.0 (opset 17)
30
+ - **Git SHA at export:** `5aceecf48dbf8696a4801a8d73bf5708c04d3b5b`
31
+
32
+ ## Output interpretation (regression)
33
+
34
+ The FPE graph emits a scalar prediction per time step in
35
+ z-scored `te_ped` units. To recover physical units:
36
+
37
+ ```python
38
+ # target_mean=0.5160982824407585, target_std=0.4096386938561064
39
+ y_phys = pred * target_std + target_mean
40
+ ```
41
+
42
+ Training-time clip range: `[-0.5, 30.0]` keV — predictions outside this range
43
+ reflect the training filter bounds and should be treated
44
+ with caution.
45
+
46
+ **Validation tolerance note:** RMS tolerance 1e-3 in normalized units ≈ 4.10e-04 keV for this target (target_std=0.4096).
47
+
48
+ ## Input contract- **MSE history:** `(batch, 50, 458)` — stats per shot.- **MSE mask:** `(batch, 50)` — 1.0 = valid, 0.0 = padding.- **MSE aux:** `(batch, 3)` — `bzn_seconds`, `disrupt_seconds`, `disrupt_coverage`- **FPE sequences:** `(batch, seq_len, 32)` — z-scored signals.- **FPE signal mask:** `(batch, 32)` — per-channel availability.- **FPE padding mask:** `(batch, seq_len)` — 1.0 = valid.See `normalization_params.json` for the exact z-score means andstds used at training time; the per-channel order matches the`fpe_signal_names` list below.<details><summary>FPE signal names (in channel order)</summary>
49
+
50
+ | idx | signal |
51
+ |---|---|
52
+ | 0 | `pohm` |
53
+ | 1 | `pinj` |
54
+ | 2 | `tinj` |
55
+ | 3 | `ech_total` |
56
+ | 4 | `f1a` |
57
+ | 5 | `f2a` |
58
+ | 6 | `f3a` |
59
+ | 7 | `f4a` |
60
+ | 8 | `f5a` |
61
+ | 9 | `f6a` |
62
+ | 10 | `f7a` |
63
+ | 11 | `f8a` |
64
+ | 12 | `f9a` |
65
+ | 13 | `f1b` |
66
+ | 14 | `f2b` |
67
+ | 15 | `f3b` |
68
+ | 16 | `f4b` |
69
+ | 17 | `f5b` |
70
+ | 18 | `f6b` |
71
+ | 19 | `f7b` |
72
+ | 20 | `f8b` |
73
+ | 21 | `f9b` |
74
+ | 22 | `ecoila` |
75
+ | 23 | `ecoilb` |
76
+ | 24 | `gasa_cal` |
77
+ | 25 | `gasb_cal` |
78
+ | 26 | `gasc_cal` |
79
+ | 27 | `gasd_cal` |
80
+ | 28 | `gase_cal` |
81
+ | 29 | `ip` |
82
+ | 30 | `ipspr15v` |
83
+ | 31 | `bt` |
84
+
85
+ </details>
86
+
87
+ ## Files
88
+
89
+ | File | Purpose |
90
+ |---|---|
91
+ | `mse_encoder.onnx` | Machine-state encoder graph (opset 17) |
92
+ | `fpe_encoder.onnx` | Fast-physics encoder graph |
93
+ | `model_config.json` | Architecture + task metadata (this card's authoritative source) |
94
+ | `provenance.json` | Export-time torch/onnx versions, git SHA, sidecar hashes |
95
+ | `normalization_params.json` | Per-channel z-score means + stds for FPE inputs |
96
+ | `target_norm.json` | `target_mean` / `target_std` (+ optional `clip_min`/`clip_max`) for de-normalizing regression outputs |
97
+
98
+ ## Validation
99
+
100
+ Each bundle ships with both random-tensor and real-sample
101
+ validation. On the PedestalPredictor GitHub repo, run:
102
+
103
+ ```bash
104
+ python -m inference.validate_onnx \
105
+ --model-dir <trial-dir> \
106
+ --onnx-dir onnx_models/te_ped_89 \
107
+ --dataset-dir <dataset> \
108
+ --dataset-cls regression \
109
+ --num-samples 10
110
+ ```
111
+
112
+ (See [`docs/export_and_publish.md`](https://github.com/SCS-Lab/PedestalPredictor/blob/main/docs/export_and_publish.md) in the GitHub repo for exact per-bundle invocations.)
113
+
114
+ ## License
115
+
116
+ Licensed under APACHE 2.0 (see repo root).
117
+
te_ped_89/fpe_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:74bd662e0340ee8816b65d1ee79cbd8014d8c07fa44f03a6410e1ae9e8121c62
3
+ size 117025127
te_ped_89/model_config.json ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "signal_dim": 32,
3
+ "history_features": 458,
4
+ "history_length": 50,
5
+ "aux_input_dim": 3,
6
+ "mse_channels": 512,
7
+ "mse_blocks": 5,
8
+ "mse_embed_dim": 512,
9
+ "mse_kernel_size": 5,
10
+ "fpe_channels": 512,
11
+ "fpe_blocks": 14,
12
+ "fpe_kernel_size": 7,
13
+ "fpe_use_dilated": true,
14
+ "aux_embed_dim": 64,
15
+ "dropout": 0.26803639559450243,
16
+ "channel_mult": 0.75,
17
+ "use_gradient_checkpointing": false,
18
+ "use_mse": true,
19
+ "forecast_horizon": 0,
20
+ "task_type": "regression",
21
+ "target_name": "te_ped",
22
+ "bundle_name": "te_ped_89",
23
+ "dataset_version": "v2_458",
24
+ "input_contract": {
25
+ "fpe_signal_names": [
26
+ "pohm",
27
+ "pinj",
28
+ "tinj",
29
+ "ech_total",
30
+ "f1a",
31
+ "f2a",
32
+ "f3a",
33
+ "f4a",
34
+ "f5a",
35
+ "f6a",
36
+ "f7a",
37
+ "f8a",
38
+ "f9a",
39
+ "f1b",
40
+ "f2b",
41
+ "f3b",
42
+ "f4b",
43
+ "f5b",
44
+ "f6b",
45
+ "f7b",
46
+ "f8b",
47
+ "f9b",
48
+ "ecoila",
49
+ "ecoilb",
50
+ "gasa_cal",
51
+ "gasb_cal",
52
+ "gasc_cal",
53
+ "gasd_cal",
54
+ "gase_cal",
55
+ "ip",
56
+ "ipspr15v",
57
+ "bt"
58
+ ],
59
+ "fpe_signal_dim": 32,
60
+ "mse_history_width": 458,
61
+ "mse_history_length": 50,
62
+ "aux_feature_names": [
63
+ "bzn_seconds",
64
+ "disrupt_seconds",
65
+ "disrupt_coverage"
66
+ ]
67
+ },
68
+ "target_mean": 0.5160982824407585,
69
+ "target_std": 0.4096386938561064,
70
+ "clip_min": -0.5,
71
+ "clip_max": 30.0,
72
+ "target_units": "keV"
73
+ }
te_ped_89/mse_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e7d0ef01e5995251e24729a06770cee72f64afe76cd8fbed1306caf77bea18ef
3
+ size 32197777
te_ped_89/normalization_params.json ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "means": [
3
+ 26507.25003675932,
4
+ 0.10491133000127097,
5
+ 0.04136727527690927,
6
+ 0.052206611478539236,
7
+ -55.41605806145344,
8
+ -51.03399154437292,
9
+ -23.643176733954856,
10
+ 46.52615428251581,
11
+ 44.74692321006923,
12
+ -100.39403005096887,
13
+ -94.01766294019251,
14
+ 29.923576489423933,
15
+ -21.012681753756432,
16
+ -56.029864619076015,
17
+ -55.002544722458474,
18
+ -40.77293744470453,
19
+ 46.24099342878102,
20
+ 61.26081739759195,
21
+ -101.82473882778888,
22
+ -122.12330546943289,
23
+ 60.4111991065362,
24
+ -2.995535993816526,
25
+ -175.01668517818288,
26
+ -167.13554262914562,
27
+ 0.885973359751426,
28
+ 0.11841111967031598,
29
+ 0.005288947231885697,
30
+ 0.010860898527613693,
31
+ 0.026004485349628896,
32
+ 34806.89527805803,
33
+ 0.06989404536391763,
34
+ -0.057366627691558786
35
+ ],
36
+ "stds": [
37
+ 207058.58850849333,
38
+ 1.2661850629414622,
39
+ 1.0465032640303291,
40
+ 1.3684045897120602,
41
+ 369.0326658318265,
42
+ 341.6838194630974,
43
+ 254.2092762419655,
44
+ 348.3925676072364,
45
+ 333.07475596428657,
46
+ 587.1117103568258,
47
+ 575.4105180953804,
48
+ 325.83810760783126,
49
+ 275.6435275106766,
50
+ 371.65464739734887,
51
+ 361.5751780037091,
52
+ 330.8551437833599,
53
+ 388.33727390157145,
54
+ 417.7677902076527,
55
+ 592.6213379046305,
56
+ 769.7839072711539,
57
+ 432.327991527322,
58
+ 302.2425140392462,
59
+ 4069.930751334016,
60
+ 4016.372443076925,
61
+ 7.8726546998896865,
62
+ 2.327789702279222,
63
+ 1.1669120854888493,
64
+ 1.270814965894171,
65
+ 1.5953199167615202,
66
+ 202451.265732129,
67
+ 1.0580009228915368,
68
+ 1.0573616137798103
69
+ ],
70
+ "counts": [
71
+ 7572914.0,
72
+ 6713607.0,
73
+ 6713607.0,
74
+ 7100251.0,
75
+ 7574643.0,
76
+ 7574643.0,
77
+ 7574643.0,
78
+ 7574643.0,
79
+ 7574643.0,
80
+ 7574643.0,
81
+ 7574643.0,
82
+ 7574643.0,
83
+ 7574643.0,
84
+ 7574643.0,
85
+ 7574643.0,
86
+ 7574643.0,
87
+ 7574643.0,
88
+ 7574643.0,
89
+ 7574643.0,
90
+ 7574643.0,
91
+ 7574643.0,
92
+ 7574643.0,
93
+ 7574643.0,
94
+ 7574643.0,
95
+ 7404400.0,
96
+ 4399528.0,
97
+ 4121010.0,
98
+ 4246154.0,
99
+ 2029433.0,
100
+ 7574643.0,
101
+ 7567634.0,
102
+ 7574643.0
103
+ ],
104
+ "signal_names": [
105
+ "pohm",
106
+ "pinj",
107
+ "tinj",
108
+ "ech_total",
109
+ "f1a",
110
+ "f2a",
111
+ "f3a",
112
+ "f4a",
113
+ "f5a",
114
+ "f6a",
115
+ "f7a",
116
+ "f8a",
117
+ "f9a",
118
+ "f1b",
119
+ "f2b",
120
+ "f3b",
121
+ "f4b",
122
+ "f5b",
123
+ "f6b",
124
+ "f7b",
125
+ "f8b",
126
+ "f9b",
127
+ "ecoila",
128
+ "ecoilb",
129
+ "gasa_cal",
130
+ "gasb_cal",
131
+ "gasc_cal",
132
+ "gasd_cal",
133
+ "gase_cal",
134
+ "ip",
135
+ "ipspr15v",
136
+ "bt"
137
+ ],
138
+ "n_channels": 32
139
+ }
te_ped_89/provenance.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "exported_at": "2026-04-23T18:45:20.616252+00:00",
3
+ "bundle_name": "te_ped_89",
4
+ "task_type": "regression",
5
+ "target_name": "te_ped",
6
+ "dataset_version": "v2_458",
7
+ "source_trial_dir": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/te_ped__89_prod/trials/trial_0001",
8
+ "checkpoint": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/te_ped__89_prod/trials/trial_0001/logs/best_model.pt",
9
+ "opset_version": 17,
10
+ "torch_version": "2.8.0",
11
+ "onnx_version": "1.19.0",
12
+ "git_sha": "5aceecf48dbf8696a4801a8d73bf5708c04d3b5b",
13
+ "fpe_normalization_source": {
14
+ "path": "/lus/eagle/projects/fusiondl_aesp/d3d_pedestal_newsignals_dataset/normalization_params.json",
15
+ "sha256": "fdedc83f4c66633aa2b7f9d64747e5479c0bac9aee3253bf2b6bda62f22195d8",
16
+ "n_channels": 32
17
+ },
18
+ "target_norm_source": {
19
+ "path": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/te_ped__89_prod/trials/trial_0001/target_norm.json",
20
+ "sha256": "083f2966f2f6c1d4b1201ef108c7bee5a183087799bb6e054eb76f5575cfab90"
21
+ }
22
+ }
te_ped_89/target_norm.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "target_name": "te_ped",
3
+ "source": "etempfit[:, 89]",
4
+ "units": "keV",
5
+ "rho_index": 89,
6
+ "target_mean": 0.5160982824407585,
7
+ "target_std": 0.4096386938561064,
8
+ "clip_min": -0.5,
9
+ "clip_max": 30.0,
10
+ "staleness_ms_max": 500.0,
11
+ "n_train_samples_post_filter": 7468451,
12
+ "_notes": "Computed from d3d_edensfit89_dataset train split only. Values filtered by clip bounds (A1) and staleness<=500ms (A2) before mean/std. Decisions A1/A2 documented in ped_labels_te_edensfit89/README.md and the fork README.md; adopted without advisor sign-off (A3)."
13
+ }
ti_ped_89/README.md ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - fusion
5
+ - tokamak
6
+ - diii-d
7
+ - pedestal
8
+ - onnx
9
+ library_name: onnx
10
+ ---
11
+
12
+ # ti_ped_89
13
+
14
+ > **Consumer note.** Most users should not load this bundle's
15
+ > ONNX files directly. Use the `PedestalEnsemble` Python wrapper
16
+ > shipped in the [PedestalPredictor GitHub repo](https://github.com/SCS-Lab/PedestalPredictor),
17
+ > which loads all five bundles with one call and exposes a
18
+ > unified `predict_one(...)` API. Direct ONNX access documented
19
+ > below is for advanced users who want to integrate a single
20
+ > bundle into an existing ONNX-only pipeline.
21
+
22
+ ## Summary
23
+
24
+ - **Task:** regression
25
+ - **Target:** `ti_ped` (keV)
26
+ - **Dataset version:** `v2_458` (458-dim MSE history)
27
+ - **FPE signal dim:** 32
28
+ - **Exported at:** 2026-04-23T18:45:25.189392+00:00
29
+ - **torch / onnx:** 2.8.0 / 1.19.0 (opset 17)
30
+ - **Git SHA at export:** `5aceecf48dbf8696a4801a8d73bf5708c04d3b5b`
31
+
32
+ ## Output interpretation (regression)
33
+
34
+ The FPE graph emits a scalar prediction per time step in
35
+ z-scored `ti_ped` units. To recover physical units:
36
+
37
+ ```python
38
+ # target_mean=0.9016129457842141, target_std=0.6536277236278131
39
+ y_phys = pred * target_std + target_mean
40
+ ```
41
+
42
+ Training-time clip range: `[-0.5, 40.0]` keV — predictions outside this range
43
+ reflect the training filter bounds and should be treated
44
+ with caution.
45
+
46
+ **Validation tolerance note:** RMS tolerance 1e-3 in normalized units ≈ 6.54e-04 keV for this target (target_std=0.6536).
47
+
48
+ ## Input contract- **MSE history:** `(batch, 50, 458)` — stats per shot.- **MSE mask:** `(batch, 50)` — 1.0 = valid, 0.0 = padding.- **MSE aux:** `(batch, 3)` — `bzn_seconds`, `disrupt_seconds`, `disrupt_coverage`- **FPE sequences:** `(batch, seq_len, 32)` — z-scored signals.- **FPE signal mask:** `(batch, 32)` — per-channel availability.- **FPE padding mask:** `(batch, seq_len)` — 1.0 = valid.See `normalization_params.json` for the exact z-score means andstds used at training time; the per-channel order matches the`fpe_signal_names` list below.<details><summary>FPE signal names (in channel order)</summary>
49
+
50
+ | idx | signal |
51
+ |---|---|
52
+ | 0 | `pohm` |
53
+ | 1 | `pinj` |
54
+ | 2 | `tinj` |
55
+ | 3 | `ech_total` |
56
+ | 4 | `f1a` |
57
+ | 5 | `f2a` |
58
+ | 6 | `f3a` |
59
+ | 7 | `f4a` |
60
+ | 8 | `f5a` |
61
+ | 9 | `f6a` |
62
+ | 10 | `f7a` |
63
+ | 11 | `f8a` |
64
+ | 12 | `f9a` |
65
+ | 13 | `f1b` |
66
+ | 14 | `f2b` |
67
+ | 15 | `f3b` |
68
+ | 16 | `f4b` |
69
+ | 17 | `f5b` |
70
+ | 18 | `f6b` |
71
+ | 19 | `f7b` |
72
+ | 20 | `f8b` |
73
+ | 21 | `f9b` |
74
+ | 22 | `ecoila` |
75
+ | 23 | `ecoilb` |
76
+ | 24 | `gasa_cal` |
77
+ | 25 | `gasb_cal` |
78
+ | 26 | `gasc_cal` |
79
+ | 27 | `gasd_cal` |
80
+ | 28 | `gase_cal` |
81
+ | 29 | `ip` |
82
+ | 30 | `ipspr15v` |
83
+ | 31 | `bt` |
84
+
85
+ </details>
86
+
87
+ ## Files
88
+
89
+ | File | Purpose |
90
+ |---|---|
91
+ | `mse_encoder.onnx` | Machine-state encoder graph (opset 17) |
92
+ | `fpe_encoder.onnx` | Fast-physics encoder graph |
93
+ | `model_config.json` | Architecture + task metadata (this card's authoritative source) |
94
+ | `provenance.json` | Export-time torch/onnx versions, git SHA, sidecar hashes |
95
+ | `normalization_params.json` | Per-channel z-score means + stds for FPE inputs |
96
+ | `target_norm.json` | `target_mean` / `target_std` (+ optional `clip_min`/`clip_max`) for de-normalizing regression outputs |
97
+
98
+ ## Validation
99
+
100
+ Each bundle ships with both random-tensor and real-sample
101
+ validation. On the PedestalPredictor GitHub repo, run:
102
+
103
+ ```bash
104
+ python -m inference.validate_onnx \
105
+ --model-dir <trial-dir> \
106
+ --onnx-dir onnx_models/ti_ped_89 \
107
+ --dataset-dir <dataset> \
108
+ --dataset-cls regression \
109
+ --num-samples 10
110
+ ```
111
+
112
+ (See [`docs/export_and_publish.md`](https://github.com/SCS-Lab/PedestalPredictor/blob/main/docs/export_and_publish.md) in the GitHub repo for exact per-bundle invocations.)
113
+
114
+ ## License
115
+
116
+ Licensed under APACHE 2.0 (see repo root).
117
+
ti_ped_89/fpe_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c55b7084ca5af828a19818b57ea84d932163d4d5c0d8ac4122af7e843895af9c
3
+ size 117025127
ti_ped_89/model_config.json ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "signal_dim": 32,
3
+ "history_features": 458,
4
+ "history_length": 50,
5
+ "aux_input_dim": 3,
6
+ "mse_channels": 512,
7
+ "mse_blocks": 5,
8
+ "mse_embed_dim": 512,
9
+ "mse_kernel_size": 5,
10
+ "fpe_channels": 512,
11
+ "fpe_blocks": 14,
12
+ "fpe_kernel_size": 7,
13
+ "fpe_use_dilated": true,
14
+ "aux_embed_dim": 64,
15
+ "dropout": 0.26803639559450243,
16
+ "channel_mult": 0.75,
17
+ "use_gradient_checkpointing": false,
18
+ "use_mse": true,
19
+ "forecast_horizon": 0,
20
+ "task_type": "regression",
21
+ "target_name": "ti_ped",
22
+ "bundle_name": "ti_ped_89",
23
+ "dataset_version": "v2_458",
24
+ "input_contract": {
25
+ "fpe_signal_names": [
26
+ "pohm",
27
+ "pinj",
28
+ "tinj",
29
+ "ech_total",
30
+ "f1a",
31
+ "f2a",
32
+ "f3a",
33
+ "f4a",
34
+ "f5a",
35
+ "f6a",
36
+ "f7a",
37
+ "f8a",
38
+ "f9a",
39
+ "f1b",
40
+ "f2b",
41
+ "f3b",
42
+ "f4b",
43
+ "f5b",
44
+ "f6b",
45
+ "f7b",
46
+ "f8b",
47
+ "f9b",
48
+ "ecoila",
49
+ "ecoilb",
50
+ "gasa_cal",
51
+ "gasb_cal",
52
+ "gasc_cal",
53
+ "gasd_cal",
54
+ "gase_cal",
55
+ "ip",
56
+ "ipspr15v",
57
+ "bt"
58
+ ],
59
+ "fpe_signal_dim": 32,
60
+ "mse_history_width": 458,
61
+ "mse_history_length": 50,
62
+ "aux_feature_names": [
63
+ "bzn_seconds",
64
+ "disrupt_seconds",
65
+ "disrupt_coverage"
66
+ ]
67
+ },
68
+ "target_mean": 0.9016129457842141,
69
+ "target_std": 0.6536277236278131,
70
+ "clip_min": -0.5,
71
+ "clip_max": 40.0,
72
+ "target_units": "keV"
73
+ }
ti_ped_89/mse_encoder.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ead111793584a00d227fc0d20bab121affab80a4f8dcd0afc80b2f31de738f07
3
+ size 32197777
ti_ped_89/normalization_params.json ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "means": [
3
+ 26507.25003675932,
4
+ 0.10491133000127097,
5
+ 0.04136727527690927,
6
+ 0.052206611478539236,
7
+ -55.41605806145344,
8
+ -51.03399154437292,
9
+ -23.643176733954856,
10
+ 46.52615428251581,
11
+ 44.74692321006923,
12
+ -100.39403005096887,
13
+ -94.01766294019251,
14
+ 29.923576489423933,
15
+ -21.012681753756432,
16
+ -56.029864619076015,
17
+ -55.002544722458474,
18
+ -40.77293744470453,
19
+ 46.24099342878102,
20
+ 61.26081739759195,
21
+ -101.82473882778888,
22
+ -122.12330546943289,
23
+ 60.4111991065362,
24
+ -2.995535993816526,
25
+ -175.01668517818288,
26
+ -167.13554262914562,
27
+ 0.885973359751426,
28
+ 0.11841111967031598,
29
+ 0.005288947231885697,
30
+ 0.010860898527613693,
31
+ 0.026004485349628896,
32
+ 34806.89527805803,
33
+ 0.06989404536391763,
34
+ -0.057366627691558786
35
+ ],
36
+ "stds": [
37
+ 207058.58850849333,
38
+ 1.2661850629414622,
39
+ 1.0465032640303291,
40
+ 1.3684045897120602,
41
+ 369.0326658318265,
42
+ 341.6838194630974,
43
+ 254.2092762419655,
44
+ 348.3925676072364,
45
+ 333.07475596428657,
46
+ 587.1117103568258,
47
+ 575.4105180953804,
48
+ 325.83810760783126,
49
+ 275.6435275106766,
50
+ 371.65464739734887,
51
+ 361.5751780037091,
52
+ 330.8551437833599,
53
+ 388.33727390157145,
54
+ 417.7677902076527,
55
+ 592.6213379046305,
56
+ 769.7839072711539,
57
+ 432.327991527322,
58
+ 302.2425140392462,
59
+ 4069.930751334016,
60
+ 4016.372443076925,
61
+ 7.8726546998896865,
62
+ 2.327789702279222,
63
+ 1.1669120854888493,
64
+ 1.270814965894171,
65
+ 1.5953199167615202,
66
+ 202451.265732129,
67
+ 1.0580009228915368,
68
+ 1.0573616137798103
69
+ ],
70
+ "counts": [
71
+ 7572914.0,
72
+ 6713607.0,
73
+ 6713607.0,
74
+ 7100251.0,
75
+ 7574643.0,
76
+ 7574643.0,
77
+ 7574643.0,
78
+ 7574643.0,
79
+ 7574643.0,
80
+ 7574643.0,
81
+ 7574643.0,
82
+ 7574643.0,
83
+ 7574643.0,
84
+ 7574643.0,
85
+ 7574643.0,
86
+ 7574643.0,
87
+ 7574643.0,
88
+ 7574643.0,
89
+ 7574643.0,
90
+ 7574643.0,
91
+ 7574643.0,
92
+ 7574643.0,
93
+ 7574643.0,
94
+ 7574643.0,
95
+ 7404400.0,
96
+ 4399528.0,
97
+ 4121010.0,
98
+ 4246154.0,
99
+ 2029433.0,
100
+ 7574643.0,
101
+ 7567634.0,
102
+ 7574643.0
103
+ ],
104
+ "signal_names": [
105
+ "pohm",
106
+ "pinj",
107
+ "tinj",
108
+ "ech_total",
109
+ "f1a",
110
+ "f2a",
111
+ "f3a",
112
+ "f4a",
113
+ "f5a",
114
+ "f6a",
115
+ "f7a",
116
+ "f8a",
117
+ "f9a",
118
+ "f1b",
119
+ "f2b",
120
+ "f3b",
121
+ "f4b",
122
+ "f5b",
123
+ "f6b",
124
+ "f7b",
125
+ "f8b",
126
+ "f9b",
127
+ "ecoila",
128
+ "ecoilb",
129
+ "gasa_cal",
130
+ "gasb_cal",
131
+ "gasc_cal",
132
+ "gasd_cal",
133
+ "gase_cal",
134
+ "ip",
135
+ "ipspr15v",
136
+ "bt"
137
+ ],
138
+ "n_channels": 32
139
+ }
ti_ped_89/provenance.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "exported_at": "2026-04-23T18:45:25.189392+00:00",
3
+ "bundle_name": "ti_ped_89",
4
+ "task_type": "regression",
5
+ "target_name": "ti_ped",
6
+ "dataset_version": "v2_458",
7
+ "source_trial_dir": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/ti_ped__89_prod/trials/trial_0001",
8
+ "checkpoint": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/ti_ped__89_prod/trials/trial_0001/logs/best_model.pt",
9
+ "opset_version": 17,
10
+ "torch_version": "2.8.0",
11
+ "onnx_version": "1.19.0",
12
+ "git_sha": "5aceecf48dbf8696a4801a8d73bf5708c04d3b5b",
13
+ "fpe_normalization_source": {
14
+ "path": "/lus/eagle/projects/fusiondl_aesp/d3d_pedestal_newsignals_dataset/normalization_params.json",
15
+ "sha256": "fdedc83f4c66633aa2b7f9d64747e5479c0bac9aee3253bf2b6bda62f22195d8",
16
+ "n_channels": 32
17
+ },
18
+ "target_norm_source": {
19
+ "path": "/lus/eagle/projects/fusiondl_aesp/harrisn/PedestalPredictor/hptune_runs/ti_ped__89_prod/trials/trial_0001/target_norm.json",
20
+ "sha256": "a8da075be1b6ae62f919aeb858b9e8efbd6c90ed6504e918302908174f6f144a"
21
+ }
22
+ }
ti_ped_89/target_norm.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "target_name": "ti_ped",
3
+ "source": "itempfit[:, 89]",
4
+ "units": "keV",
5
+ "rho_index": 89,
6
+ "target_mean": 0.9016129457842141,
7
+ "target_std": 0.6536277236278131,
8
+ "clip_min": -0.5,
9
+ "clip_max": 40.0,
10
+ "staleness_ms_max": 500.0,
11
+ "n_train_samples_post_filter": 5779927,
12
+ "_notes": "Computed from d3d_edensfit89_dataset train split only. Values filtered by clip bounds (A1) and staleness<=500ms (A2) before mean/std. Decisions A1/A2 documented in ped_labels_ti_edensfit89/README.md and the fork README.md; adopted without advisor sign-off (A3)."
13
+ }