SCS-Lab commited on
Commit
39d7e43
·
verified ·
1 Parent(s): 2b87804

fuse29: 8 seeds, opset 17, physical-unit graphs

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
README.md CHANGED
@@ -1,3 +1,171 @@
1
  ---
2
  license: mit
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - state-space-model
11
+ - mamba
12
+ - time-series
13
+ - real-time
14
  ---
15
+
16
+ # fuse29 — Mamba-2 pedestal predictor for DIII-D
17
+
18
+ A 29-input, 6-layer Mamba-2 state-space model that predicts nine pedestal
19
+ quantities at ρ_tor = 0.85 from DIII-D actuator settings, at 20 Hz, with a
20
+ strictly causal O(1)-per-tick inference path suitable for real-time control.
21
+
22
+ Packaged as two ONNX graphs with normalisation baked in: **raw physical units
23
+ in, physical units out.**
24
+
25
+ | | |
26
+ |---|---|
27
+ | Parameters | 11,254,425 |
28
+ | Architecture | Mamba-2 (SSD), 6 layers, d_model 512, d_state 128 |
29
+ | Inputs | 29 actuator channels, physical units |
30
+ | Outputs | 9 heads, physical units |
31
+ | Cadence | 20 Hz (50 ms) |
32
+ | Precision | float32 |
33
+ | ONNX opset | 17 |
34
+ | Step latency | ~2.9 ms/tick, CPU, batch 1 |
35
+ | License | MIT |
36
+
37
+ ## Intended use
38
+
39
+ Predicting pedestal density, temperature, rotation, heights and locations from
40
+ the actuator request, inside FUSE or an equivalent DIII-D control or analysis
41
+ pipeline. The step graph is designed for the 50 ms control cycle; the sequence
42
+ graph is for offline scoring and replay.
43
+
44
+ **Not** intended for other machines, other radial locations, or as a
45
+ safety-critical interlock. It has no uncertainty estimate and no
46
+ out-of-distribution detector.
47
+
48
+ ## Quickstart
49
+
50
+ ```bash
51
+ pip install numpy onnxruntime
52
+ ```
53
+
54
+ ```python
55
+ from fuse29.runtime import Fuse29Predictor
56
+
57
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model") # loads seed 0
58
+ state = predictor.init_state()
59
+
60
+ for actuators in shot: # (29,) float32, raw physical units
61
+ out, state = predictor.step(actuators, state)
62
+ if out.is_hmode:
63
+ print(out.ne, out.te_ped, out.neped_prmtan)
64
+ ```
65
+
66
+ Or straight from onnxruntime, with no Python package — the full contract is
67
+ about fifteen lines and is written out in `docs/ONNX.md`.
68
+
69
+ ## Files
70
+
71
+ Per seed (`s0/` … `s7/`):
72
+
73
+ | File | |
74
+ |---|---|
75
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
76
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
77
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
78
+ | `norms.json` | the statistics baked into the graphs |
79
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
80
+ | `provenance.json` | source checkpoint SHA-256, library versions, artefact hashes |
81
+
82
+ Plus `manifest.json` at the root. **Seed 0 is the champion and the default.**
83
+
84
+ ## Inputs
85
+
86
+ 29 DIII-D actuator channels in raw physical units: beam power (MW) and torque,
87
+ ECH power, the eighteen shaping F-coil currents (A), both E-coil currents (A),
88
+ five gas valve flows (Torr·L/s), and the toroidal field (T). Order is
89
+ load-bearing; see `docs/IO_CONTRACT.md`.
90
+
91
+ `pohm`, `ip` and `ipspr15v` are deliberately excluded — they are plasma
92
+ responses, not commands, and a model predicting the response must not be
93
+ handed it.
94
+
95
+ ## Outputs
96
+
97
+ | # | Head | Units |
98
+ |--:|---|---|
99
+ | 0 | `ne` | 10¹⁹ m⁻³ |
100
+ | 1 | `te_ped` | keV |
101
+ | 2 | `ti_ped` | keV |
102
+ | 3 | `t_rot_ped` | krad/s |
103
+ | 4 | `neped_prmtan` * | 10¹⁹ m⁻³ |
104
+ | 5 | `teped_prmtan` * | keV |
105
+ | 6 | `rho_sym` * | ρ_tor |
106
+ | 7 | `ne_top_loc` * | ρ_tor |
107
+ | 8 | `hmode` | probability |
108
+
109
+ \* **H-mode only.** See the limitations below.
110
+
111
+ ## Performance
112
+
113
+ Seed 0, scored with the exported ONNX graph on 4087 held-out shots. Median of
114
+ per-shot RMSE:
115
+
116
+ | Head | Median per-shot RMSE | Units |
117
+ |---|---:|---|
118
+ | `ne` | 0.3057 | 10¹⁹ m⁻³ |
119
+ | `te_ped` | 0.0605 | keV |
120
+ | `ti_ped` | 0.1065 | keV |
121
+ | `t_rot_ped` | 4.1497 | krad/s |
122
+ | `neped_prmtan` * | 0.3950 | 10¹⁹ m⁻³ |
123
+ | `teped_prmtan` * | 0.0783 | keV |
124
+ | `rho_sym` * | 0.0113 | ρ_tor |
125
+ | `ne_top_loc` * | 0.0134 | ρ_tor |
126
+ | `hmode` | 0.9443 accuracy, 0.9476 F1 | — |
127
+
128
+ ONNX-vs-PyTorch parity is within 2.5e-05 of a head's training standard
129
+ deviation across all eight seeds and both graphs. Full protocol:
130
+ `docs/VALIDATION.md`.
131
+
132
+ ## Training
133
+
134
+ ~40 900 DIII-D shots, 20 Hz, labels as trailing-bin means with empty bins
135
+ masked rather than filled. Stratified random 80/10/10 split (seed 20260829).
136
+ AdamW, lr 2e-4, cosine schedule, 25 epochs, batch 128. Checkpoint selected on
137
+ lowest total validation loss across all nine heads.
138
+
139
+ Eight seeds are published; they differ only in weight initialisation and data
140
+ ordering. Full recipe in `docs/TRAINING.md`.
141
+
142
+ ## Limitations
143
+
144
+ - **Four heads are undefined in L-mode.** `neped_prmtan`, `teped_prmtan`,
145
+ `rho_sym` and `ne_top_loc` were trained only on H-mode ticks. The graph
146
+ emits them unconditionally anyway. You must gate on the model's own `hmode`
147
+ output, which is ~94% accurate with errors concentrated at L–H transitions.
148
+ See `docs/GATING.md`.
149
+ - **Beam power is a live input in this package.** The predecessor (`fuse29_s*`)
150
+ could not see `pinj` because a corrupted shot set the divisor to 194 MW.
151
+ These weights were retrained against winsorised actuator statistics; a
152
+ half-range `pinj` swing now moves `ne` by 0.79. Isolated sweeps are not a
153
+ real power scan — other actuators stay at recorded values. See
154
+ `docs/LIMITATIONS.md`.
155
+ - **Accuracy measures interpolation.** The split is random, so validation
156
+ shots come from the same campaigns as training shots. A chronological split
157
+ scores roughly 1.5–2× worse. Expect degradation outside the training
158
+ distribution, with no built-in warning.
159
+ - **No uncertainty.** Seed spread measures optimisation variance, not
160
+ predictive uncertainty, and says nothing about errors all eight seeds share.
161
+ - **Units have no guard rail.** `pinj` is MW, not W. A unit error produces
162
+ confident nonsense rather than an exception; run
163
+ `predictor.check_units(shot)` once during integration.
164
+ - **Fixed 50 ms cadence**, all 29 channels required every tick, no
165
+ missing-channel handling, no dropped-tick recovery.
166
+ - **Sequence graph is fixed at 256 ticks.** Use the step graph for anything
167
+ longer.
168
+ - **float32 only**; no quantised variants are published or validated.
169
+ - DIII-D only, ρ_tor = 0.85 only.
170
+
171
+ Full discussion in `docs/LIMITATIONS.md`.
manifest.json ADDED
@@ -0,0 +1,323 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "model": "fuse29",
4
+ "repo_id": "SCS-Lab/FUSE29-Pedestal-model",
5
+ "default_seed": 0,
6
+ "onnx_opset": 17,
7
+ "actuator_space": "physical",
8
+ "heads": [
9
+ "ne",
10
+ "te_ped",
11
+ "ti_ped",
12
+ "t_rot_ped",
13
+ "neped_prmtan",
14
+ "teped_prmtan",
15
+ "rho_sym",
16
+ "ne_top_loc",
17
+ "hmode"
18
+ ],
19
+ "actuators": [
20
+ "pinj",
21
+ "tinj",
22
+ "ech_total",
23
+ "f1a",
24
+ "f2a",
25
+ "f3a",
26
+ "f4a",
27
+ "f5a",
28
+ "f6a",
29
+ "f7a",
30
+ "f8a",
31
+ "f9a",
32
+ "f1b",
33
+ "f2b",
34
+ "f3b",
35
+ "f4b",
36
+ "f5b",
37
+ "f6b",
38
+ "f7b",
39
+ "f8b",
40
+ "f9b",
41
+ "ecoila",
42
+ "ecoilb",
43
+ "gasa_cal",
44
+ "gasb_cal",
45
+ "gasc_cal",
46
+ "gasd_cal",
47
+ "gase_cal",
48
+ "bt"
49
+ ],
50
+ "hmode_gated_heads": [
51
+ "neped_prmtan",
52
+ "teped_prmtan",
53
+ "rho_sym",
54
+ "ne_top_loc"
55
+ ],
56
+ "note": "Eight independently trained seeds, differing only in weight initialisation and data ordering. s0 is the locked champion and the default. The others exist so a consumer can measure spread across training runs; they are not a jointly trained ensemble, and averaging them is a choice rather than the intended use.",
57
+ "bundles": [
58
+ {
59
+ "seed": 0,
60
+ "path": "s0",
61
+ "default": true,
62
+ "val_loss": 1.1169083155691624,
63
+ "seq_len": 256,
64
+ "files": {
65
+ "fuse29_step.onnx": {
66
+ "bytes": 45081271,
67
+ "sha256": "9150698ab06af368eec857ea429191bf8a0593e9fd9d7e571bb7ce5bcbcf853a"
68
+ },
69
+ "fuse29_seq.onnx": {
70
+ "bytes": 45464382,
71
+ "sha256": "0274ad98cc51ee938422f3c9febd3c3cf3141a35d39ff2a62efeb75f9ce43577"
72
+ },
73
+ "model_config.json": {
74
+ "bytes": 7112,
75
+ "sha256": "10779e134e2f65f92ef6955833c7b2af73119e069e2e31c2cfb0be563bc0bf3b"
76
+ },
77
+ "norms.json": {
78
+ "bytes": 7840,
79
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
80
+ },
81
+ "actuator_ranges.json": {
82
+ "bytes": 17917,
83
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
84
+ },
85
+ "provenance.json": {
86
+ "bytes": 1198,
87
+ "sha256": "e948d64c89bf320d0b747624e69ce86e6f645c2a9d7a9096bdb8efa149e47b36"
88
+ }
89
+ }
90
+ },
91
+ {
92
+ "seed": 1,
93
+ "path": "s1",
94
+ "default": false,
95
+ "val_loss": 1.1129196528345346,
96
+ "seq_len": 256,
97
+ "files": {
98
+ "fuse29_step.onnx": {
99
+ "bytes": 45081271,
100
+ "sha256": "8780126cca821664426bafdd896a1313846da69ad120b9c591d90dc0cc21249e"
101
+ },
102
+ "fuse29_seq.onnx": {
103
+ "bytes": 45464382,
104
+ "sha256": "3469221c38b1006a017506969d2ffd5f9b84a9a34d22b4429184a299c2438f4a"
105
+ },
106
+ "model_config.json": {
107
+ "bytes": 7112,
108
+ "sha256": "337fb9444a95c26d458a48cb8bbf83d16fa62436b509a8e9ad5fd9c424b1a55a"
109
+ },
110
+ "norms.json": {
111
+ "bytes": 7840,
112
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
113
+ },
114
+ "actuator_ranges.json": {
115
+ "bytes": 17917,
116
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
117
+ },
118
+ "provenance.json": {
119
+ "bytes": 1198,
120
+ "sha256": "7e4895c944d4423e4fee54a887652ead81d158684a996a05cdebb5ba7aa21962"
121
+ }
122
+ }
123
+ },
124
+ {
125
+ "seed": 2,
126
+ "path": "s2",
127
+ "default": false,
128
+ "val_loss": 1.119664316996932,
129
+ "seq_len": 256,
130
+ "files": {
131
+ "fuse29_step.onnx": {
132
+ "bytes": 45081271,
133
+ "sha256": "b696b9c645441cde3881ff796aaec6e1927335daba4539095f6b6dee8a5768f4"
134
+ },
135
+ "fuse29_seq.onnx": {
136
+ "bytes": 45464382,
137
+ "sha256": "1fc339449427dfe47ee425eb7ff500887e6a10ae1ef32d90207f2d1e3a828cf3"
138
+ },
139
+ "model_config.json": {
140
+ "bytes": 7111,
141
+ "sha256": "3f4859e8942bedcedb8860a50d6150f6189860868a2236094079c58fae273f2d"
142
+ },
143
+ "norms.json": {
144
+ "bytes": 7840,
145
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
146
+ },
147
+ "actuator_ranges.json": {
148
+ "bytes": 17917,
149
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
150
+ },
151
+ "provenance.json": {
152
+ "bytes": 1198,
153
+ "sha256": "86a2e05a5af2851c400d6f5d5847832e5cee0f079bc4f8223f380c953dff336c"
154
+ }
155
+ }
156
+ },
157
+ {
158
+ "seed": 3,
159
+ "path": "s3",
160
+ "default": false,
161
+ "val_loss": 1.1190400626510382,
162
+ "seq_len": 256,
163
+ "files": {
164
+ "fuse29_step.onnx": {
165
+ "bytes": 45081271,
166
+ "sha256": "f2b80d7f732cef7a21eb21e606cf4a3e63aa4a91a9ff6dde789d88e07fcd5418"
167
+ },
168
+ "fuse29_seq.onnx": {
169
+ "bytes": 45464382,
170
+ "sha256": "ab580c091de0471edc8454085dcda9c88650e4995be5c2ec6bd7f8b1c87d7786"
171
+ },
172
+ "model_config.json": {
173
+ "bytes": 7112,
174
+ "sha256": "cea93ee7706b95023550a1085349bb581679c05695ab7aba421f157c51d19c93"
175
+ },
176
+ "norms.json": {
177
+ "bytes": 7840,
178
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
179
+ },
180
+ "actuator_ranges.json": {
181
+ "bytes": 17917,
182
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
183
+ },
184
+ "provenance.json": {
185
+ "bytes": 1198,
186
+ "sha256": "0cdcf038de7a1a94fe1f763dd5f69d5f6aff58abf74d168a9864caaa1827331c"
187
+ }
188
+ }
189
+ },
190
+ {
191
+ "seed": 4,
192
+ "path": "s4",
193
+ "default": false,
194
+ "val_loss": 1.1320768278092146,
195
+ "seq_len": 256,
196
+ "files": {
197
+ "fuse29_step.onnx": {
198
+ "bytes": 45081271,
199
+ "sha256": "7c74bffd61e2c69cae1b8b182fbde8897ce971901d83beded7f6a2e0c919fedc"
200
+ },
201
+ "fuse29_seq.onnx": {
202
+ "bytes": 45464382,
203
+ "sha256": "2348d2e1930835363dfade74cfc47d46c88e0691693f60e85cffc2d459ecf774"
204
+ },
205
+ "model_config.json": {
206
+ "bytes": 7112,
207
+ "sha256": "a7539aaf67b322d787944dfd191feedc2b9373fb5958f763b171869578e41258"
208
+ },
209
+ "norms.json": {
210
+ "bytes": 7840,
211
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
212
+ },
213
+ "actuator_ranges.json": {
214
+ "bytes": 17917,
215
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
216
+ },
217
+ "provenance.json": {
218
+ "bytes": 1198,
219
+ "sha256": "47883a9d25d4a0ee5fb8e6d31464442420afbb59ecde6a4e7206f505848aec6d"
220
+ }
221
+ }
222
+ },
223
+ {
224
+ "seed": 5,
225
+ "path": "s5",
226
+ "default": false,
227
+ "val_loss": 1.1122196558862925,
228
+ "seq_len": 256,
229
+ "files": {
230
+ "fuse29_step.onnx": {
231
+ "bytes": 45081271,
232
+ "sha256": "1e10c13fc85dd992fafbaddc8b3dd01d11aabaf757e3e125329a699d298a6a11"
233
+ },
234
+ "fuse29_seq.onnx": {
235
+ "bytes": 45464382,
236
+ "sha256": "bee461499d85d1cf7ce5b4f5f56ab1bf13b55066737c08147e860211b0091ff3"
237
+ },
238
+ "model_config.json": {
239
+ "bytes": 7112,
240
+ "sha256": "77e00af4f5099967eb06c910400cb2ae892d097a9944b4e7e19751066bc0a2ca"
241
+ },
242
+ "norms.json": {
243
+ "bytes": 7840,
244
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
245
+ },
246
+ "actuator_ranges.json": {
247
+ "bytes": 17917,
248
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
249
+ },
250
+ "provenance.json": {
251
+ "bytes": 1198,
252
+ "sha256": "13204b19314a50bcb0e7228e79a9c64de4237bae6d6da4bd483a3ca4bdb3ebf4"
253
+ }
254
+ }
255
+ },
256
+ {
257
+ "seed": 6,
258
+ "path": "s6",
259
+ "default": false,
260
+ "val_loss": 1.1161801163107157,
261
+ "seq_len": 256,
262
+ "files": {
263
+ "fuse29_step.onnx": {
264
+ "bytes": 45081271,
265
+ "sha256": "36b55e194e705e0a1d1087c1164e4f72f2507784b1210a0ce2f94fa151db04fa"
266
+ },
267
+ "fuse29_seq.onnx": {
268
+ "bytes": 45464382,
269
+ "sha256": "ca3570ae8e579c638d9195f6f7e3c4634bc61425cc51c7998a53818cb8c18ddb"
270
+ },
271
+ "model_config.json": {
272
+ "bytes": 7112,
273
+ "sha256": "6107c3d463829d896ae229483595fe421f406925361774ff2b6e63bc9cf3ca40"
274
+ },
275
+ "norms.json": {
276
+ "bytes": 7840,
277
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
278
+ },
279
+ "actuator_ranges.json": {
280
+ "bytes": 17917,
281
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
282
+ },
283
+ "provenance.json": {
284
+ "bytes": 1198,
285
+ "sha256": "7cb93660689bffca0315d1bf5c1b1ffb2247b7c2e512cc0fdd9dc30037955140"
286
+ }
287
+ }
288
+ },
289
+ {
290
+ "seed": 7,
291
+ "path": "s7",
292
+ "default": false,
293
+ "val_loss": 1.112956801429391,
294
+ "seq_len": 256,
295
+ "files": {
296
+ "fuse29_step.onnx": {
297
+ "bytes": 45081271,
298
+ "sha256": "abf72130ad644f7bf2883c39f336536ad839ae7f609cc88d28a5366459e1693c"
299
+ },
300
+ "fuse29_seq.onnx": {
301
+ "bytes": 45464382,
302
+ "sha256": "db040b029538d47b404e9864538fb0c550285081ecce7348ad6fd231fdd7bbcf"
303
+ },
304
+ "model_config.json": {
305
+ "bytes": 7111,
306
+ "sha256": "7cfbcd1b3b9e50836dc7de9f312db9c70931afcc105dca1dd184d17c65f99d75"
307
+ },
308
+ "norms.json": {
309
+ "bytes": 7840,
310
+ "sha256": "f39e579358c10911e79f2bfca2f38f76549e86462a4952ff68f009da0aca8118"
311
+ },
312
+ "actuator_ranges.json": {
313
+ "bytes": 17917,
314
+ "sha256": "ccc717f12f66944e120b4a01dbf4ddd090c444ceff50a2613d0992a765b92a44"
315
+ },
316
+ "provenance.json": {
317
+ "bytes": 1198,
318
+ "sha256": "687b3a1f6adfb5d4b2834bf1b5fc62f909dfdbb5812e81b82bef6784cef865f7"
319
+ }
320
+ }
321
+ }
322
+ ]
323
+ }
s0/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 0
14
+
15
+ **This is the champion seed and the default.** `Fuse29Predictor.from_pretrained()` with no seed argument loads it, and every number in the root model card refers to it.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 0 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1169 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:21.979021+00:00 |
29
+ | Source checkpoint SHA-256 | `875ff7248c0bfde3…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=0)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s0/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s0/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0274ad98cc51ee938422f3c9febd3c3cf3141a35d39ff2a62efeb75f9ce43577
3
+ size 45464382
s0/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9150698ab06af368eec857ea429191bf8a0593e9fd9d7e571bb7ce5bcbcf853a
3
+ size 45081271
s0/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 0,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 19,
265
+ "val_loss": 1.1169083155691624,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s0/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }
s0/provenance.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "exported_utc": "2026-09-03T00:46:21.979021+00:00",
4
+ "seed": 0,
5
+ "source_checkpoint": "/flare/fusiondl_aesp/fuse_bd_model/fuse20/runs/fuse29r_s0/best_model.pt",
6
+ "source_checkpoint_sha256": "875ff7248c0bfde39c54e75d4638bd563f8f78b52dc26e294cdd308b116d13c7",
7
+ "norms_source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json",
8
+ "norms_actuator_space": "physical",
9
+ "norms_composed_from": [
10
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
11
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
12
+ ],
13
+ "onnx_opset": 17,
14
+ "exporter": "torch.onnx.export (TorchScript, dynamo=False)",
15
+ "versions": {
16
+ "torch": "2.10.0a0+git449b176",
17
+ "python": "3.12.12",
18
+ "platform": "Linux-5.14.21-150400.24.235-default-x86_64-with-glibc2.31",
19
+ "onnx": "1.22.0",
20
+ "onnxruntime": "1.29.0"
21
+ },
22
+ "artifacts": {
23
+ "fuse29_step.onnx": {
24
+ "bytes": 45081271,
25
+ "sha256": "9150698ab06af368eec857ea429191bf8a0593e9fd9d7e571bb7ce5bcbcf853a"
26
+ },
27
+ "fuse29_seq.onnx": {
28
+ "bytes": 45464382,
29
+ "sha256": "0274ad98cc51ee938422f3c9febd3c3cf3141a35d39ff2a62efeb75f9ce43577"
30
+ }
31
+ }
32
+ }
s1/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 1
14
+
15
+ This is seed 1, one of eight independently trained runs. Seed 0 is the champion and the default; this one exists so you can measure spread across training runs. Unless you are doing that, you want seed 0.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 1 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1129 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:24.670692+00:00 |
29
+ | Source checkpoint SHA-256 | `a77e8a7359c47e1f…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=1)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s1/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s1/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3469221c38b1006a017506969d2ffd5f9b84a9a34d22b4429184a299c2438f4a
3
+ size 45464382
s1/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8780126cca821664426bafdd896a1313846da69ad120b9c591d90dc0cc21249e
3
+ size 45081271
s1/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 1,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 22,
265
+ "val_loss": 1.1129196528345346,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s1/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }
s1/provenance.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "exported_utc": "2026-09-03T00:46:24.670692+00:00",
4
+ "seed": 1,
5
+ "source_checkpoint": "/flare/fusiondl_aesp/fuse_bd_model/fuse20/runs/fuse29r_s1/best_model.pt",
6
+ "source_checkpoint_sha256": "a77e8a7359c47e1f6d9a2406fe29fea9214e6110e3a4f5f26371afbaba236394",
7
+ "norms_source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json",
8
+ "norms_actuator_space": "physical",
9
+ "norms_composed_from": [
10
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
11
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
12
+ ],
13
+ "onnx_opset": 17,
14
+ "exporter": "torch.onnx.export (TorchScript, dynamo=False)",
15
+ "versions": {
16
+ "torch": "2.10.0a0+git449b176",
17
+ "python": "3.12.12",
18
+ "platform": "Linux-5.14.21-150400.24.235-default-x86_64-with-glibc2.31",
19
+ "onnx": "1.22.0",
20
+ "onnxruntime": "1.29.0"
21
+ },
22
+ "artifacts": {
23
+ "fuse29_step.onnx": {
24
+ "bytes": 45081271,
25
+ "sha256": "8780126cca821664426bafdd896a1313846da69ad120b9c591d90dc0cc21249e"
26
+ },
27
+ "fuse29_seq.onnx": {
28
+ "bytes": 45464382,
29
+ "sha256": "3469221c38b1006a017506969d2ffd5f9b84a9a34d22b4429184a299c2438f4a"
30
+ }
31
+ }
32
+ }
s2/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 2
14
+
15
+ This is seed 2, one of eight independently trained runs. Seed 0 is the champion and the default; this one exists so you can measure spread across training runs. Unless you are doing that, you want seed 0.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 2 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1197 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:27.308435+00:00 |
29
+ | Source checkpoint SHA-256 | `d113f84516d9e749…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=2)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s2/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s2/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1fc339449427dfe47ee425eb7ff500887e6a10ae1ef32d90207f2d1e3a828cf3
3
+ size 45464382
s2/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b696b9c645441cde3881ff796aaec6e1927335daba4539095f6b6dee8a5768f4
3
+ size 45081271
s2/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 2,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 20,
265
+ "val_loss": 1.119664316996932,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s2/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }
s2/provenance.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "exported_utc": "2026-09-03T00:46:27.308435+00:00",
4
+ "seed": 2,
5
+ "source_checkpoint": "/flare/fusiondl_aesp/fuse_bd_model/fuse20/runs/fuse29r_s2/best_model.pt",
6
+ "source_checkpoint_sha256": "d113f84516d9e749eea611ebc53086e170a251ba50ec4f60ec69bfc5d82d92bf",
7
+ "norms_source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json",
8
+ "norms_actuator_space": "physical",
9
+ "norms_composed_from": [
10
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
11
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
12
+ ],
13
+ "onnx_opset": 17,
14
+ "exporter": "torch.onnx.export (TorchScript, dynamo=False)",
15
+ "versions": {
16
+ "torch": "2.10.0a0+git449b176",
17
+ "python": "3.12.12",
18
+ "platform": "Linux-5.14.21-150400.24.235-default-x86_64-with-glibc2.31",
19
+ "onnx": "1.22.0",
20
+ "onnxruntime": "1.29.0"
21
+ },
22
+ "artifacts": {
23
+ "fuse29_step.onnx": {
24
+ "bytes": 45081271,
25
+ "sha256": "b696b9c645441cde3881ff796aaec6e1927335daba4539095f6b6dee8a5768f4"
26
+ },
27
+ "fuse29_seq.onnx": {
28
+ "bytes": 45464382,
29
+ "sha256": "1fc339449427dfe47ee425eb7ff500887e6a10ae1ef32d90207f2d1e3a828cf3"
30
+ }
31
+ }
32
+ }
s3/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 3
14
+
15
+ This is seed 3, one of eight independently trained runs. Seed 0 is the champion and the default; this one exists so you can measure spread across training runs. Unless you are doing that, you want seed 0.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 3 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1190 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:29.898835+00:00 |
29
+ | Source checkpoint SHA-256 | `ec8986c56b48bf90…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=3)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s3/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s3/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ab580c091de0471edc8454085dcda9c88650e4995be5c2ec6bd7f8b1c87d7786
3
+ size 45464382
s3/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f2b80d7f732cef7a21eb21e606cf4a3e63aa4a91a9ff6dde789d88e07fcd5418
3
+ size 45081271
s3/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 3,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 20,
265
+ "val_loss": 1.1190400626510382,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s3/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }
s3/provenance.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "exported_utc": "2026-09-03T00:46:29.898835+00:00",
4
+ "seed": 3,
5
+ "source_checkpoint": "/flare/fusiondl_aesp/fuse_bd_model/fuse20/runs/fuse29r_s3/best_model.pt",
6
+ "source_checkpoint_sha256": "ec8986c56b48bf90ca14a2312d6024ad1541bb04baa64889e54d104ae914b914",
7
+ "norms_source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json",
8
+ "norms_actuator_space": "physical",
9
+ "norms_composed_from": [
10
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
11
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
12
+ ],
13
+ "onnx_opset": 17,
14
+ "exporter": "torch.onnx.export (TorchScript, dynamo=False)",
15
+ "versions": {
16
+ "torch": "2.10.0a0+git449b176",
17
+ "python": "3.12.12",
18
+ "platform": "Linux-5.14.21-150400.24.235-default-x86_64-with-glibc2.31",
19
+ "onnx": "1.22.0",
20
+ "onnxruntime": "1.29.0"
21
+ },
22
+ "artifacts": {
23
+ "fuse29_step.onnx": {
24
+ "bytes": 45081271,
25
+ "sha256": "f2b80d7f732cef7a21eb21e606cf4a3e63aa4a91a9ff6dde789d88e07fcd5418"
26
+ },
27
+ "fuse29_seq.onnx": {
28
+ "bytes": 45464382,
29
+ "sha256": "ab580c091de0471edc8454085dcda9c88650e4995be5c2ec6bd7f8b1c87d7786"
30
+ }
31
+ }
32
+ }
s4/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 4
14
+
15
+ This is seed 4, one of eight independently trained runs. Seed 0 is the champion and the default; this one exists so you can measure spread across training runs. Unless you are doing that, you want seed 0.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 4 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1321 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:32.537210+00:00 |
29
+ | Source checkpoint SHA-256 | `d36f1364948aded5…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=4)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s4/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s4/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2348d2e1930835363dfade74cfc47d46c88e0691693f60e85cffc2d459ecf774
3
+ size 45464382
s4/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7c74bffd61e2c69cae1b8b182fbde8897ce971901d83beded7f6a2e0c919fedc
3
+ size 45081271
s4/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 4,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 22,
265
+ "val_loss": 1.1320768278092146,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s4/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }
s4/provenance.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "exported_utc": "2026-09-03T00:46:32.537210+00:00",
4
+ "seed": 4,
5
+ "source_checkpoint": "/flare/fusiondl_aesp/fuse_bd_model/fuse20/runs/fuse29r_s4/best_model.pt",
6
+ "source_checkpoint_sha256": "d36f1364948aded5be459beb9a7670d59366272471c4f8ef36338135d8242104",
7
+ "norms_source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json",
8
+ "norms_actuator_space": "physical",
9
+ "norms_composed_from": [
10
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
11
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
12
+ ],
13
+ "onnx_opset": 17,
14
+ "exporter": "torch.onnx.export (TorchScript, dynamo=False)",
15
+ "versions": {
16
+ "torch": "2.10.0a0+git449b176",
17
+ "python": "3.12.12",
18
+ "platform": "Linux-5.14.21-150400.24.235-default-x86_64-with-glibc2.31",
19
+ "onnx": "1.22.0",
20
+ "onnxruntime": "1.29.0"
21
+ },
22
+ "artifacts": {
23
+ "fuse29_step.onnx": {
24
+ "bytes": 45081271,
25
+ "sha256": "7c74bffd61e2c69cae1b8b182fbde8897ce971901d83beded7f6a2e0c919fedc"
26
+ },
27
+ "fuse29_seq.onnx": {
28
+ "bytes": 45464382,
29
+ "sha256": "2348d2e1930835363dfade74cfc47d46c88e0691693f60e85cffc2d459ecf774"
30
+ }
31
+ }
32
+ }
s5/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 5
14
+
15
+ This is seed 5, one of eight independently trained runs. Seed 0 is the champion and the default; this one exists so you can measure spread across training runs. Unless you are doing that, you want seed 0.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 5 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1122 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:35.316400+00:00 |
29
+ | Source checkpoint SHA-256 | `d01cae015ed05e7e…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=5)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s5/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s5/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bee461499d85d1cf7ce5b4f5f56ab1bf13b55066737c08147e860211b0091ff3
3
+ size 45464382
s5/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1e10c13fc85dd992fafbaddc8b3dd01d11aabaf757e3e125329a699d298a6a11
3
+ size 45081271
s5/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 5,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 21,
265
+ "val_loss": 1.1122196558862925,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s5/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }
s5/provenance.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "exported_utc": "2026-09-03T00:46:35.316400+00:00",
4
+ "seed": 5,
5
+ "source_checkpoint": "/flare/fusiondl_aesp/fuse_bd_model/fuse20/runs/fuse29r_s5/best_model.pt",
6
+ "source_checkpoint_sha256": "d01cae015ed05e7e2b97df02796afb8c5aaf4ee36573ed534a2ed9dd9a16c275",
7
+ "norms_source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json",
8
+ "norms_actuator_space": "physical",
9
+ "norms_composed_from": [
10
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
11
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
12
+ ],
13
+ "onnx_opset": 17,
14
+ "exporter": "torch.onnx.export (TorchScript, dynamo=False)",
15
+ "versions": {
16
+ "torch": "2.10.0a0+git449b176",
17
+ "python": "3.12.12",
18
+ "platform": "Linux-5.14.21-150400.24.235-default-x86_64-with-glibc2.31",
19
+ "onnx": "1.22.0",
20
+ "onnxruntime": "1.29.0"
21
+ },
22
+ "artifacts": {
23
+ "fuse29_step.onnx": {
24
+ "bytes": 45081271,
25
+ "sha256": "1e10c13fc85dd992fafbaddc8b3dd01d11aabaf757e3e125329a699d298a6a11"
26
+ },
27
+ "fuse29_seq.onnx": {
28
+ "bytes": 45464382,
29
+ "sha256": "bee461499d85d1cf7ce5b4f5f56ab1bf13b55066737c08147e860211b0091ff3"
30
+ }
31
+ }
32
+ }
s6/README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnx
4
+ tags:
5
+ - onnx
6
+ - fusion
7
+ - plasma-physics
8
+ - tokamak
9
+ - diii-d
10
+ - mamba
11
+ ---
12
+
13
+ # fuse29 — seed 6
14
+
15
+ This is seed 6, one of eight independently trained runs. Seed 0 is the champion and the default; this one exists so you can measure spread across training runs. Unless you are doing that, you want seed 0.
16
+
17
+ 29-input Mamba-2 pedestal predictor for DIII-D. Raw physical units in,
18
+ physical units out. See the [root model card](https://huggingface.co/SCS-Lab/FUSE29-Pedestal-model)
19
+ for the full description, I/O contract, accuracy and limitations.
20
+
21
+ | | |
22
+ |---|---|
23
+ | Seed | 6 |
24
+ | Parameters | 11,254,425 |
25
+ | Best validation loss | 1.1162 |
26
+ | Sequence graph length | 256 ticks |
27
+ | ONNX opset | 17 |
28
+ | Exported | 2026-09-03T00:46:38.050137+00:00 |
29
+ | Source checkpoint SHA-256 | `97dfda0fd4b66942…` |
30
+
31
+ ## Load
32
+
33
+ ```python
34
+ from fuse29.runtime import Fuse29Predictor
35
+
36
+ predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model", seed=6)
37
+ ```
38
+
39
+ ## Files
40
+
41
+ | File | |
42
+ |---|---|
43
+ | `fuse29_step.onnx` | one 50 ms tick, carries state, no length limit |
44
+ | `fuse29_seq.onnx` | whole shot at a fixed 256 ticks |
45
+ | `model_config.json` | I/O contract: names, order, units, sources, shapes |
46
+ | `norms.json` | the statistics baked into the graphs |
47
+ | `actuator_ranges.json` | training-split distribution, for checking your units |
48
+ | `provenance.json` | source checkpoint hash, library versions, artefact hashes |
49
+
50
+ ## Before you use it
51
+
52
+ - Four heads (`neped_prmtan`, `teped_prmtan`, `rho_sym`, `ne_top_loc`) are
53
+ **only valid in H-mode** and the graph does not gate them. Gate on the
54
+ model's own `hmode` output.
55
+ - `pinj` is in **MW**, not W. Run `predictor.check_units(shot)` once.
56
+ - Output column order is not alphabetical. See `model_config.json`.
s6/actuator_ranges.json ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Physical-units distribution of each actuator over the training split. Use it to check that your signals are in the units the graph expects; a unit error is the one preprocessing mistake that produces confident nonsense rather than an exception.",
4
+ "split": "train",
5
+ "n_shots": 32731,
6
+ "n_ticks": 3020926,
7
+ "percentiles": [
8
+ 0.1,
9
+ 1,
10
+ 5,
11
+ 25,
12
+ 50,
13
+ 75,
14
+ 95,
15
+ 99,
16
+ 99.9
17
+ ],
18
+ "channels": {
19
+ "pinj": {
20
+ "units": "MW",
21
+ "source": "ptdata:bmspinj",
22
+ "description": "Neutral beam injected power, all sources.",
23
+ "min": -46005.02701919088,
24
+ "max": 17.512712760455507,
25
+ "mean": 3.838883638381958,
26
+ "std": 3.0613932609558105,
27
+ "pct": {
28
+ "0.1": -0.004132416388869853,
29
+ "1": 4.112187479421436e-09,
30
+ "5": 4.112187479421436e-09,
31
+ "25": 1.311169336894574,
32
+ "50": 3.18466408866965,
33
+ "75": 5.748764762873332,
34
+ "95": 9.841882532311711,
35
+ "99": 12.212702351352696,
36
+ "99.9": 14.791924355083399
37
+ }
38
+ },
39
+ "tinj": {
40
+ "units": "N*m",
41
+ "source": "ptdata:bmstinj",
42
+ "description": "Neutral beam injected torque, all sources.",
43
+ "min": -56.644382966354534,
44
+ "max": 129.9833380295058,
45
+ "mean": 2.2043209075927734,
46
+ "std": 2.11222505569458,
47
+ "pct": {
48
+ "0.1": -2.0636791725994676,
49
+ "1": -0.5384317586520496,
50
+ "5": -1.6338495756329507e-07,
51
+ "25": 0.4319133403840452,
52
+ "50": 1.963846077087278,
53
+ "75": 3.1821234334199193,
54
+ "95": 6.641525317445799,
55
+ "99": 8.941231792062355,
56
+ "99.9": 11.156712776956862
57
+ }
58
+ },
59
+ "ech_total": {
60
+ "units": "MW",
61
+ "source": "ptdata:ECHPWR",
62
+ "description": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
63
+ "min": -19.31181996542309,
64
+ "max": 40.286455582885246,
65
+ "mean": 2.6981112957000732,
66
+ "std": 6.685519218444824,
67
+ "pct": {
68
+ "0.1": -1.0663586061709935,
69
+ "1": -0.09982622583332723,
70
+ "5": -0.020836448436920674,
71
+ "25": -3.2566890961760464e-08,
72
+ "50": -3.2566890961760464e-08,
73
+ "75": 1.1717011943616973,
74
+ "95": 21.558252060431304,
75
+ "99": 30.476182922859127,
76
+ "99.9": 37.09168917133024
77
+ }
78
+ },
79
+ "f1a": {
80
+ "units": "A",
81
+ "source": "ptdata:F1A",
82
+ "description": "Shaping F-coil F1A current (bank A).",
83
+ "min": -5776.925892871883,
84
+ "max": 5794.3504737288395,
85
+ "mean": -1382.3704833984375,
86
+ "std": 1349.629638671875,
87
+ "pct": {
88
+ "0.1": -4852.691808601986,
89
+ "1": -4131.456225748339,
90
+ "5": -3401.8604035239678,
91
+ "25": -2236.4754469921672,
92
+ "50": -1501.5458201268116,
93
+ "75": -660.4245966463927,
94
+ "95": 1294.4315819071094,
95
+ "99": 3103.250955923345,
96
+ "99.9": 4467.289606367005
97
+ }
98
+ },
99
+ "f2a": {
100
+ "units": "A",
101
+ "source": "ptdata:F2A",
102
+ "description": "Shaping F-coil F2A current (bank A).",
103
+ "min": -5716.347659616551,
104
+ "max": 5702.840977614059,
105
+ "mean": -1229.876708984375,
106
+ "std": 1248.3497314453125,
107
+ "pct": {
108
+ "0.1": -4093.397230708888,
109
+ "1": -3297.8668360449756,
110
+ "5": -2712.522533155646,
111
+ "25": -2004.455454331444,
112
+ "50": -1443.842241803098,
113
+ "75": -854.5004209979342,
114
+ "95": 1825.579117167513,
115
+ "99": 3097.0902901803724,
116
+ "99.9": 3899.548655232026
117
+ }
118
+ },
119
+ "f3a": {
120
+ "units": "A",
121
+ "source": "ptdata:F3A",
122
+ "description": "Shaping F-coil F3A current (bank A).",
123
+ "min": -5498.272347966228,
124
+ "max": 5321.719922394657,
125
+ "mean": -592.7352294921875,
126
+ "std": 1185.706298828125,
127
+ "pct": {
128
+ "0.1": -4140.690909683277,
129
+ "1": -3539.2136012211317,
130
+ "5": -2813.2888996278725,
131
+ "25": -1377.7435033975407,
132
+ "50": -152.16189816331342,
133
+ "75": 2.4453898354848604,
134
+ "95": 1203.107532773337,
135
+ "99": 2898.3184344684487,
136
+ "99.9": 3780.0556837479485
137
+ }
138
+ },
139
+ "f4a": {
140
+ "units": "A",
141
+ "source": "ptdata:F4A",
142
+ "description": "Shaping F-coil F4A current (bank A).",
143
+ "min": -5876.373800845117,
144
+ "max": 5855.700219305917,
145
+ "mean": 1098.1622314453125,
146
+ "std": 1368.95458984375,
147
+ "pct": {
148
+ "0.1": -4331.218505807293,
149
+ "1": -3344.4526378786877,
150
+ "5": -1858.4157962413597,
151
+ "25": 395.84891116184133,
152
+ "50": 1143.436262581068,
153
+ "75": 1990.2677717095535,
154
+ "95": 3141.5448401142426,
155
+ "99": 3756.430079500399,
156
+ "99.9": 4525.754910416766
157
+ }
158
+ },
159
+ "f5a": {
160
+ "units": "A",
161
+ "source": "ptdata:F5A",
162
+ "description": "Shaping F-coil F5A current (bank A).",
163
+ "min": -5178.8539079385355,
164
+ "max": 5353.141466672798,
165
+ "mean": 1173.57958984375,
166
+ "std": 1352.103759765625,
167
+ "pct": {
168
+ "0.1": -4592.7059148331355,
169
+ "1": -3597.7201189044818,
170
+ "5": -1551.4942446467403,
171
+ "25": 543.836095032849,
172
+ "50": 1273.969119983141,
173
+ "75": 2051.0443148459794,
174
+ "95": 3019.669622905384,
175
+ "99": 3875.454685744494,
176
+ "99.9": 4738.506855960392
177
+ }
178
+ },
179
+ "f6a": {
180
+ "units": "A",
181
+ "source": "ptdata:F6A",
182
+ "description": "Shaping F-coil F6A current (bank A).",
183
+ "min": -7929.903731492232,
184
+ "max": 5741.056818467809,
185
+ "mean": -2493.411865234375,
186
+ "std": 1867.8076171875,
187
+ "pct": {
188
+ "0.1": -6125.90268588119,
189
+ "1": -4963.398523516425,
190
+ "5": -4319.477588996284,
191
+ "25": -3574.8234234024885,
192
+ "50": -2898.635802832382,
193
+ "75": -2143.0930801744807,
194
+ "95": 2999.75903843203,
195
+ "99": 4137.6543157735705,
196
+ "99.9": 4783.375582166487
197
+ }
198
+ },
199
+ "f7a": {
200
+ "units": "A",
201
+ "source": "ptdata:F7A",
202
+ "description": "Shaping F-coil F7A current (bank A).",
203
+ "min": -9825.736080045011,
204
+ "max": 8678.484606762057,
205
+ "mean": -2367.570556640625,
206
+ "std": 1999.19970703125,
207
+ "pct": {
208
+ "0.1": -7676.219824168618,
209
+ "1": -6127.379912259545,
210
+ "5": -4909.893927511103,
211
+ "25": -3430.1309476786882,
212
+ "50": -2697.460342263373,
213
+ "75": -1913.0579478721388,
214
+ "95": 2723.164038733837,
215
+ "99": 3948.221013655396,
216
+ "99.9": 5316.086800760559
217
+ }
218
+ },
219
+ "f8a": {
220
+ "units": "A",
221
+ "source": "ptdata:F8A",
222
+ "description": "Shaping F-coil F8A current (bank A).",
223
+ "min": -5378.835169240788,
224
+ "max": 5880.767402237174,
225
+ "mean": 996.0214233398438,
226
+ "std": 1498.948974609375,
227
+ "pct": {
228
+ "0.1": -4229.744640827867,
229
+ "1": -3363.368412210415,
230
+ "5": -1922.2114690963926,
231
+ "25": 60.761390529545906,
232
+ "50": 1153.9241798399726,
233
+ "75": 1951.1572686642544,
234
+ "95": 3318.078493605748,
235
+ "99": 3973.7764489149104,
236
+ "99.9": 4670.296725684707
237
+ }
238
+ },
239
+ "f9a": {
240
+ "units": "A",
241
+ "source": "ptdata:F9A",
242
+ "description": "Shaping F-coil F9A current (bank A).",
243
+ "min": -7206.032812499594,
244
+ "max": 8700.684616308497,
245
+ "mean": -535.8018798828125,
246
+ "std": 1258.01171875,
247
+ "pct": {
248
+ "0.1": -4739.927394914494,
249
+ "1": -3344.557163847978,
250
+ "5": -2567.420669960383,
251
+ "25": -1538.6304412830955,
252
+ "50": -578.9736547563273,
253
+ "75": 353.08467764596537,
254
+ "95": 1558.2607279613098,
255
+ "99": 2657.691791383836,
256
+ "99.9": 4334.930796170508
257
+ }
258
+ },
259
+ "f1b": {
260
+ "units": "A",
261
+ "source": "ptdata:F1B",
262
+ "description": "Shaping F-coil F1B current (bank B).",
263
+ "min": -5921.943154546981,
264
+ "max": 5407.326196618229,
265
+ "mean": -1373.1888427734375,
266
+ "std": 1367.82275390625,
267
+ "pct": {
268
+ "0.1": -5179.567735964654,
269
+ "1": -4339.478258925401,
270
+ "5": -3463.431883510691,
271
+ "25": -2205.922070942479,
272
+ "50": -1459.5306304510002,
273
+ "75": -750.1948036110768,
274
+ "95": 1428.796834935177,
275
+ "99": 3233.0438718527407,
276
+ "99.9": 4240.724502122051
277
+ }
278
+ },
279
+ "f2b": {
280
+ "units": "A",
281
+ "source": "ptdata:F2B",
282
+ "description": "Shaping F-coil F2B current (bank B).",
283
+ "min": -5788.286812358208,
284
+ "max": 5428.562849130928,
285
+ "mean": -1218.50048828125,
286
+ "std": 1316.67724609375,
287
+ "pct": {
288
+ "0.1": -4785.998935671587,
289
+ "1": -3520.521383204173,
290
+ "5": -2855.1671089762676,
291
+ "25": -1969.483606794242,
292
+ "50": -1447.1879016413761,
293
+ "75": -866.6265611311096,
294
+ "95": 2049.217650390811,
295
+ "99": 3312.4349928765846,
296
+ "99.9": 4011.5142868858347
297
+ }
298
+ },
299
+ "f3b": {
300
+ "units": "A",
301
+ "source": "ptdata:F3B",
302
+ "description": "Shaping F-coil F3B current (bank B).",
303
+ "min": -5503.943071765381,
304
+ "max": 4849.177948074737,
305
+ "mean": -1005.3848266601562,
306
+ "std": 1308.8258056640625,
307
+ "pct": {
308
+ "0.1": -4452.6277480541985,
309
+ "1": -3641.634707712471,
310
+ "5": -2937.4861003450947,
311
+ "25": -1881.7475544966392,
312
+ "50": -1170.6945714968547,
313
+ "75": -124.13671681902403,
314
+ "95": 1683.5400540223286,
315
+ "99": 3015.8060365193123,
316
+ "99.9": 3797.6599244161957
317
+ }
318
+ },
319
+ "f4b": {
320
+ "units": "A",
321
+ "source": "ptdata:F4B",
322
+ "description": "Shaping F-coil F4B current (bank B).",
323
+ "min": -5829.242194941551,
324
+ "max": 5787.149431930685,
325
+ "mean": 1124.2967529296875,
326
+ "std": 1519.5994873046875,
327
+ "pct": {
328
+ "0.1": -4083.976449898858,
329
+ "1": -3247.08251902718,
330
+ "5": -2270.942268479742,
331
+ "25": 376.8608226937906,
332
+ "50": 1392.450441038166,
333
+ "75": 2146.7001303629104,
334
+ "95": 3145.5476189867913,
335
+ "99": 3926.614817946318,
336
+ "99.9": 4582.551950710075
337
+ }
338
+ },
339
+ "f5b": {
340
+ "units": "A",
341
+ "source": "ptdata:F5B",
342
+ "description": "Shaping F-coil F5B current (bank B).",
343
+ "min": -5213.110339059254,
344
+ "max": 5388.213772287713,
345
+ "mean": 1443.536865234375,
346
+ "std": 1408.3306884765625,
347
+ "pct": {
348
+ "0.1": -4134.61747806435,
349
+ "1": -3056.873937432705,
350
+ "5": -1361.0988601293998,
351
+ "25": 675.1515533174199,
352
+ "50": 1572.802070225599,
353
+ "75": 2367.5452263604984,
354
+ "95": 3528.863240540377,
355
+ "99": 4411.454242162536,
356
+ "99.9": 4967.30642206674
357
+ }
358
+ },
359
+ "f6b": {
360
+ "units": "A",
361
+ "source": "ptdata:F6B",
362
+ "description": "Shaping F-coil F6B current (bank B).",
363
+ "min": -7604.653108484432,
364
+ "max": 7763.1261416792295,
365
+ "mean": -2463.248046875,
366
+ "std": 1836.4208984375,
367
+ "pct": {
368
+ "0.1": -6372.627428710043,
369
+ "1": -5251.4106280007745,
370
+ "5": -4318.157196234368,
371
+ "25": -3524.5849152058445,
372
+ "50": -2837.2759930056304,
373
+ "75": -2089.94465303326,
374
+ "95": 2871.6849973390945,
375
+ "99": 3948.010461650111,
376
+ "99.9": 4803.251616324593
377
+ }
378
+ },
379
+ "f7b": {
380
+ "units": "A",
381
+ "source": "ptdata:F7B",
382
+ "description": "Shaping F-coil F7B current (bank B).",
383
+ "min": -11380.254539563213,
384
+ "max": 9414.242772782009,
385
+ "mean": -2941.56005859375,
386
+ "std": 2510.1083984375,
387
+ "pct": {
388
+ "0.1": -9236.286164628174,
389
+ "1": -7962.01372128499,
390
+ "5": -6618.689743738845,
391
+ "25": -4397.68407591947,
392
+ "50": -3041.7944101983817,
393
+ "75": -2113.0768216001165,
394
+ "95": 2850.240503964187,
395
+ "99": 5238.131223534479,
396
+ "99.9": 6771.41582857779
397
+ }
398
+ },
399
+ "f8b": {
400
+ "units": "A",
401
+ "source": "ptdata:F8B",
402
+ "description": "Shaping F-coil F8B current (bank B).",
403
+ "min": -5834.457886045129,
404
+ "max": 5952.292180058913,
405
+ "mean": 1431.05615234375,
406
+ "std": 1718.2965087890625,
407
+ "pct": {
408
+ "0.1": -4377.886849186064,
409
+ "1": -3547.8568327724756,
410
+ "5": -2536.325388000092,
411
+ "25": 592.1441487378677,
412
+ "50": 1743.1741236182588,
413
+ "75": 2613.9050347435855,
414
+ "95": 3655.019608301406,
415
+ "99": 4295.252919476556,
416
+ "99.9": 5183.621783504976
417
+ }
418
+ },
419
+ "f9b": {
420
+ "units": "A",
421
+ "source": "ptdata:F9B",
422
+ "description": "Shaping F-coil F9B current (bank B).",
423
+ "min": -7298.33418485197,
424
+ "max": 8673.475372842513,
425
+ "mean": -214.02586364746094,
426
+ "std": 1388.83447265625,
427
+ "pct": {
428
+ "0.1": -4443.002941036773,
429
+ "1": -3335.961239603393,
430
+ "5": -2530.3434455144015,
431
+ "25": -1111.6205754278508,
432
+ "50": -212.41719832099042,
433
+ "75": 564.1401009862525,
434
+ "95": 2296.158459733251,
435
+ "99": 3401.023805016151,
436
+ "99.9": 4981.695296538042
437
+ }
438
+ },
439
+ "ecoila": {
440
+ "units": "A",
441
+ "source": "ptdata:ECOILA",
442
+ "description": "Ohmic E-coil bank A current.",
443
+ "min": -68526.67779690563,
444
+ "max": 65669.33446503483,
445
+ "mean": -6965.32666015625,
446
+ "std": 18940.9453125,
447
+ "pct": {
448
+ "0.1": -62521.0592220894,
449
+ "1": -53449.0677376177,
450
+ "5": -39610.65329064206,
451
+ "25": -19599.348704727538,
452
+ "50": -6887.604056684089,
453
+ "75": 6065.040591650557,
454
+ "95": 23926.96154448237,
455
+ "99": 33650.27142286909,
456
+ "99.9": 48164.54971213867
457
+ }
458
+ },
459
+ "ecoilb": {
460
+ "units": "A",
461
+ "source": "ptdata:ECOILB",
462
+ "description": "Ohmic E-coil bank B current.",
463
+ "min": -67880.78461590248,
464
+ "max": 67380.80764904841,
465
+ "mean": -6876.16455078125,
466
+ "std": 18723.662109375,
467
+ "pct": {
468
+ "0.1": -61839.528701402356,
469
+ "1": -52787.079189397904,
470
+ "5": -39153.2527665565,
471
+ "25": -19383.82435886666,
472
+ "50": -6768.996463787789,
473
+ "75": 6013.297288247475,
474
+ "95": 23686.641557508636,
475
+ "99": 33187.653018934754,
476
+ "99.9": 47362.43837391052
477
+ }
478
+ },
479
+ "gasa_cal": {
480
+ "units": "Torr*L/s",
481
+ "source": "tree:NEUTRALS GASFLOW.GASA:FLOW",
482
+ "description": "Calibrated gas injection flow, valve A.",
483
+ "min": -0.9805486760911233,
484
+ "max": 348.1779045740827,
485
+ "mean": 15.054444313049316,
486
+ "std": 26.369497299194336,
487
+ "pct": {
488
+ "0.1": -0.0181447514768128,
489
+ "1": 0.0006228885411054819,
490
+ "5": 0.0014589414841879034,
491
+ "25": 0.00852798057103854,
492
+ "50": 0.09974314587981326,
493
+ "75": 19.645558552678416,
494
+ "95": 71.02669389337856,
495
+ "99": 137.36341388263276,
496
+ "99.9": 211.79616738152396
497
+ }
498
+ },
499
+ "gasb_cal": {
500
+ "units": "Torr*L/s",
501
+ "source": "tree:NEUTRALS GASFLOW.GASB:FLOW",
502
+ "description": "Calibrated gas injection flow, valve B.",
503
+ "min": -0.5231055139632899,
504
+ "max": 317.69717326145866,
505
+ "mean": 1.386172890663147,
506
+ "std": 3.4090511798858643,
507
+ "pct": {
508
+ "0.1": 9.14047308575583e-06,
509
+ "1": 0.0007714573310613204,
510
+ "5": 0.002068321612864521,
511
+ "25": 0.009055124211873267,
512
+ "50": 0.07339015461169385,
513
+ "75": 1.9421402622606716,
514
+ "95": 1.9421402622606716,
515
+ "99": 23.663863921838843,
516
+ "99.9": 149.40068998150738
517
+ }
518
+ },
519
+ "gasc_cal": {
520
+ "units": "Torr*L/s",
521
+ "source": "tree:NEUTRALS GASFLOW.GASC:FLOW",
522
+ "description": "Calibrated gas injection flow, valve C.",
523
+ "min": -0.3965804467767108,
524
+ "max": 306.0269668007428,
525
+ "mean": 0.35034820437431335,
526
+ "std": 0.4470684826374054,
527
+ "pct": {
528
+ "0.1": 7.428448363699935e-05,
529
+ "1": 0.00026770734685732656,
530
+ "5": 0.0006667805693404416,
531
+ "25": 0.002788385500787083,
532
+ "50": 0.023577950502740697,
533
+ "75": 0.7508911827356307,
534
+ "95": 0.7508911827356307,
535
+ "99": 2.733332630282,
536
+ "99.9": 108.67323889612304
537
+ }
538
+ },
539
+ "gasd_cal": {
540
+ "units": "Torr*L/s",
541
+ "source": "tree:NEUTRALS GASFLOW.GASD:FLOW",
542
+ "description": "Calibrated gas injection flow, valve D.",
543
+ "min": -0.5287260135880842,
544
+ "max": 771.5043798529183,
545
+ "mean": 0.528103232383728,
546
+ "std": 0.654624342918396,
547
+ "pct": {
548
+ "0.1": 5.497087182604332e-05,
549
+ "1": 0.000175335120693898,
550
+ "5": 0.0005482846440516553,
551
+ "25": 0.003719433481388368,
552
+ "50": 0.08385269566973214,
553
+ "75": 1.0383906373403984,
554
+ "95": 1.0383906373403984,
555
+ "99": 4.359676988215197,
556
+ "99.9": 127.54440071212512
557
+ }
558
+ },
559
+ "gase_cal": {
560
+ "units": "Torr*L/s",
561
+ "source": "tree:NEUTRALS GASFLOW.GASE:FLOW",
562
+ "description": "Calibrated gas injection flow, valve E.",
563
+ "min": -0.2211384331710633,
564
+ "max": 672.8582070151267,
565
+ "mean": 0.27696067094802856,
566
+ "std": 0.17616958916187286,
567
+ "pct": {
568
+ "0.1": 0.00010156410138473793,
569
+ "1": 0.000223585566083373,
570
+ "5": 0.0005190716405260032,
571
+ "25": 0.011627604901727706,
572
+ "50": 0.3920832239686922,
573
+ "75": 0.3920832239686922,
574
+ "95": 0.3920832239686922,
575
+ "99": 0.3920832239686922,
576
+ "99.9": 29.75536079519976
577
+ }
578
+ },
579
+ "bt": {
580
+ "units": "T",
581
+ "source": "ptdata:bt",
582
+ "description": "Vacuum toroidal magnetic field (signed).",
583
+ "min": -2.2353815075115375,
584
+ "max": 2.25186423641397,
585
+ "mean": -0.971906840801239,
586
+ "std": 1.6484158039093018,
587
+ "pct": {
588
+ "0.1": -2.2151064134142304,
589
+ "1": -2.1819873443702726,
590
+ "5": -2.136304350652244,
591
+ "25": -2.0446028795017246,
592
+ "50": -1.8984274308309796,
593
+ "75": -1.0260122281948352,
594
+ "95": 2.053318112027725,
595
+ "99": 2.10945640328767,
596
+ "99.9": 2.1819705410137904
597
+ }
598
+ }
599
+ }
600
+ }
s6/fuse29_seq.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ca3570ae8e579c638d9195f6f7e3c4634bc61425cc51c7998a53818cb8c18ddb
3
+ size 45464382
s6/fuse29_step.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:36b55e194e705e0a1d1087c1164e4f72f2507784b1210a0ce2f94fa151db04fa
3
+ size 45081271
s6/model_config.json ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "model": "fuse29",
4
+ "seed": 6,
5
+ "description": "29-input Mamba-2 pedestal predictor for DIII-D. Strictly causal, 20 Hz, nine heads at rho_tor = 0.85.",
6
+ "architecture": {
7
+ "family": "Mamba-2 (structured state-space duality)",
8
+ "d_model": 512,
9
+ "n_layers": 6,
10
+ "d_state": 128,
11
+ "d_conv": 4,
12
+ "expand": 2,
13
+ "headdim": 128,
14
+ "nheads": 8,
15
+ "ngroups": 2,
16
+ "chunk_size": 100,
17
+ "d_inner": 1024,
18
+ "conv_dim": 1536,
19
+ "n_params": 11254425
20
+ },
21
+ "cadence": {
22
+ "hz": 20,
23
+ "period_ms": 50.0,
24
+ "rho_tor": 0.85
25
+ },
26
+ "inputs": {
27
+ "names": [
28
+ "pinj",
29
+ "tinj",
30
+ "ech_total",
31
+ "f1a",
32
+ "f2a",
33
+ "f3a",
34
+ "f4a",
35
+ "f5a",
36
+ "f6a",
37
+ "f7a",
38
+ "f8a",
39
+ "f9a",
40
+ "f1b",
41
+ "f2b",
42
+ "f3b",
43
+ "f4b",
44
+ "f5b",
45
+ "f6b",
46
+ "f7b",
47
+ "f8b",
48
+ "f9b",
49
+ "ecoila",
50
+ "ecoilb",
51
+ "gasa_cal",
52
+ "gasb_cal",
53
+ "gasc_cal",
54
+ "gasd_cal",
55
+ "gase_cal",
56
+ "bt"
57
+ ],
58
+ "n": 29,
59
+ "units": {
60
+ "pinj": "MW",
61
+ "tinj": "N*m",
62
+ "ech_total": "MW",
63
+ "f1a": "A",
64
+ "f2a": "A",
65
+ "f3a": "A",
66
+ "f4a": "A",
67
+ "f5a": "A",
68
+ "f6a": "A",
69
+ "f7a": "A",
70
+ "f8a": "A",
71
+ "f9a": "A",
72
+ "f1b": "A",
73
+ "f2b": "A",
74
+ "f3b": "A",
75
+ "f4b": "A",
76
+ "f5b": "A",
77
+ "f6b": "A",
78
+ "f7b": "A",
79
+ "f8b": "A",
80
+ "f9b": "A",
81
+ "ecoila": "A",
82
+ "ecoilb": "A",
83
+ "gasa_cal": "Torr*L/s",
84
+ "gasb_cal": "Torr*L/s",
85
+ "gasc_cal": "Torr*L/s",
86
+ "gasd_cal": "Torr*L/s",
87
+ "gase_cal": "Torr*L/s",
88
+ "bt": "T"
89
+ },
90
+ "sources": {
91
+ "pinj": "ptdata:bmspinj",
92
+ "tinj": "ptdata:bmstinj",
93
+ "ech_total": "ptdata:ECHPWR",
94
+ "f1a": "ptdata:F1A",
95
+ "f2a": "ptdata:F2A",
96
+ "f3a": "ptdata:F3A",
97
+ "f4a": "ptdata:F4A",
98
+ "f5a": "ptdata:F5A",
99
+ "f6a": "ptdata:F6A",
100
+ "f7a": "ptdata:F7A",
101
+ "f8a": "ptdata:F8A",
102
+ "f9a": "ptdata:F9A",
103
+ "f1b": "ptdata:F1B",
104
+ "f2b": "ptdata:F2B",
105
+ "f3b": "ptdata:F3B",
106
+ "f4b": "ptdata:F4B",
107
+ "f5b": "ptdata:F5B",
108
+ "f6b": "ptdata:F6B",
109
+ "f7b": "ptdata:F7B",
110
+ "f8b": "ptdata:F8B",
111
+ "f9b": "ptdata:F9B",
112
+ "ecoila": "ptdata:ECOILA",
113
+ "ecoilb": "ptdata:ECOILB",
114
+ "gasa_cal": "tree:NEUTRALS GASFLOW.GASA:FLOW",
115
+ "gasb_cal": "tree:NEUTRALS GASFLOW.GASB:FLOW",
116
+ "gasc_cal": "tree:NEUTRALS GASFLOW.GASC:FLOW",
117
+ "gasd_cal": "tree:NEUTRALS GASFLOW.GASD:FLOW",
118
+ "gase_cal": "tree:NEUTRALS GASFLOW.GASE:FLOW",
119
+ "bt": "ptdata:bt"
120
+ },
121
+ "descriptions": {
122
+ "pinj": "Neutral beam injected power, all sources.",
123
+ "tinj": "Neutral beam injected torque, all sources.",
124
+ "ech_total": "Total electron cyclotron heating power (see note in docs/PREPROCESSING.md on this channel's scaling).",
125
+ "f1a": "Shaping F-coil F1A current (bank A).",
126
+ "f2a": "Shaping F-coil F2A current (bank A).",
127
+ "f3a": "Shaping F-coil F3A current (bank A).",
128
+ "f4a": "Shaping F-coil F4A current (bank A).",
129
+ "f5a": "Shaping F-coil F5A current (bank A).",
130
+ "f6a": "Shaping F-coil F6A current (bank A).",
131
+ "f7a": "Shaping F-coil F7A current (bank A).",
132
+ "f8a": "Shaping F-coil F8A current (bank A).",
133
+ "f9a": "Shaping F-coil F9A current (bank A).",
134
+ "f1b": "Shaping F-coil F1B current (bank B).",
135
+ "f2b": "Shaping F-coil F2B current (bank B).",
136
+ "f3b": "Shaping F-coil F3B current (bank B).",
137
+ "f4b": "Shaping F-coil F4B current (bank B).",
138
+ "f5b": "Shaping F-coil F5B current (bank B).",
139
+ "f6b": "Shaping F-coil F6B current (bank B).",
140
+ "f7b": "Shaping F-coil F7B current (bank B).",
141
+ "f8b": "Shaping F-coil F8B current (bank B).",
142
+ "f9b": "Shaping F-coil F9B current (bank B).",
143
+ "ecoila": "Ohmic E-coil bank A current.",
144
+ "ecoilb": "Ohmic E-coil bank B current.",
145
+ "gasa_cal": "Calibrated gas injection flow, valve A.",
146
+ "gasb_cal": "Calibrated gas injection flow, valve B.",
147
+ "gasc_cal": "Calibrated gas injection flow, valve C.",
148
+ "gasd_cal": "Calibrated gas injection flow, valve D.",
149
+ "gase_cal": "Calibrated gas injection flow, valve E.",
150
+ "bt": "Vacuum toroidal magnetic field (signed)."
151
+ },
152
+ "space": "raw physical units; the graph applies the z-score",
153
+ "note": "Check your units against actuator_ranges.json before trusting any output. A unit error produces confident nonsense rather than an exception."
154
+ },
155
+ "outputs": {
156
+ "names": [
157
+ "ne",
158
+ "te_ped",
159
+ "ti_ped",
160
+ "t_rot_ped",
161
+ "neped_prmtan",
162
+ "teped_prmtan",
163
+ "rho_sym",
164
+ "ne_top_loc",
165
+ "hmode"
166
+ ],
167
+ "n": 9,
168
+ "units": {
169
+ "ne": "1e19 m^-3",
170
+ "te_ped": "keV",
171
+ "ti_ped": "keV",
172
+ "t_rot_ped": "krad/s",
173
+ "neped_prmtan": "1e19 m^-3",
174
+ "teped_prmtan": "keV",
175
+ "rho_sym": "rho_tor (dimensionless)",
176
+ "ne_top_loc": "rho_tor (dimensionless)",
177
+ "hmode": "probability in [0, 1]"
178
+ },
179
+ "note": "Physical units. hmode is a probability in [0, 1]; the graph applies the sigmoid.",
180
+ "hmode_gated": {
181
+ "heads": [
182
+ "neped_prmtan",
183
+ "teped_prmtan",
184
+ "rho_sym",
185
+ "ne_top_loc"
186
+ ],
187
+ "indices": [
188
+ 4,
189
+ 5,
190
+ 6,
191
+ 7
192
+ ],
193
+ "threshold": 0.5,
194
+ "note": "These four heads were trained only on H-mode rows and are undefined otherwise. The graph does NOT gate them; the consumer must, using the model's own hmode output. See docs/GATING.md."
195
+ }
196
+ },
197
+ "graphs": {
198
+ "fuse29_step.onnx": {
199
+ "purpose": "real-time, one 50 ms tick per call",
200
+ "inputs": {
201
+ "actuators": [
202
+ "batch",
203
+ 29
204
+ ],
205
+ "conv_state": [
206
+ 6,
207
+ "batch",
208
+ 1536,
209
+ 3
210
+ ],
211
+ "ssm_state": [
212
+ 6,
213
+ "batch",
214
+ 8,
215
+ 128,
216
+ 128
217
+ ]
218
+ },
219
+ "outputs": {
220
+ "predictions": [
221
+ "batch",
222
+ 9
223
+ ],
224
+ "conv_state_out": [
225
+ 6,
226
+ "batch",
227
+ 1536,
228
+ 3
229
+ ],
230
+ "ssm_state_out": [
231
+ 6,
232
+ "batch",
233
+ 8,
234
+ 128,
235
+ 128
236
+ ]
237
+ },
238
+ "initial_state": "all zeros at the start of a shot",
239
+ "max_shot_length": "unbounded"
240
+ },
241
+ "fuse29_seq.onnx": {
242
+ "purpose": "offline scoring of a whole shot",
243
+ "inputs": {
244
+ "actuators": [
245
+ "batch",
246
+ 256,
247
+ 29
248
+ ]
249
+ },
250
+ "outputs": {
251
+ "predictions": [
252
+ "batch",
253
+ 256,
254
+ 9
255
+ ]
256
+ },
257
+ "seq_len": 256,
258
+ "note": "Sequence length is FIXED. Right-pad shorter shots with zeros and read the first T outputs; the model is strictly causal so this is exact. For longer shots use the step graph or re-export with --seq-len."
259
+ }
260
+ },
261
+ "dtype": "float32",
262
+ "onnx_opset": 17,
263
+ "training": {
264
+ "epoch": 22,
265
+ "val_loss": 1.1161801163107157,
266
+ "note": "See docs/TRAINING.md for the full recipe."
267
+ }
268
+ }
s6/norms.json ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 2,
3
+ "note": "Statistics are baked into the shipped ONNX graphs. This file is for inspection and for reproducing the transform outside the graph; it is not required at inference time.",
4
+ "actuator_space": "physical",
5
+ "std_floor": 1e-06,
6
+ "clip_sigma": 20.0,
7
+ "provenance": {
8
+ "split": "train",
9
+ "n_shots": 32731,
10
+ "rho_index": 85,
11
+ "source": "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85, random stratified split (split_index.json)",
12
+ "note": "Recomputed on the NEW random train split. The source shards carried z-scores from the OLD chronological train split, whose shots overlap our test set. Actuator statistics are winsorised so a corrupted sample cannot set a channel's divisor.",
13
+ "inflated_channels": [
14
+ "pinj",
15
+ "gasc_cal",
16
+ "gasd_cal",
17
+ "gase_cal"
18
+ ],
19
+ "actuator_estimator": "winsorised to p1..p99",
20
+ "actuator_space": "physical",
21
+ "composed_from": [
22
+ "/lus/flare/projects/fusiondl_aesp/d3d_pedestal_fpe_harrisn85/normalization_params.json",
23
+ "/lus/flare/projects/fusiondl_aesp/d3d_fuse20_rho85/norms.json"
24
+ ],
25
+ "composition": "z = (x_phys - (m1 + s1*m2)) / (s1*s2), where (m1, s1) is the upstream FPE z-score and (m2, s2) is this model's re-scale onto its own training split"
26
+ },
27
+ "actuators": {
28
+ "names": [
29
+ "pinj",
30
+ "tinj",
31
+ "ech_total",
32
+ "f1a",
33
+ "f2a",
34
+ "f3a",
35
+ "f4a",
36
+ "f5a",
37
+ "f6a",
38
+ "f7a",
39
+ "f8a",
40
+ "f9a",
41
+ "f1b",
42
+ "f2b",
43
+ "f3b",
44
+ "f4b",
45
+ "f5b",
46
+ "f6b",
47
+ "f7b",
48
+ "f8b",
49
+ "f9b",
50
+ "ecoila",
51
+ "ecoilb",
52
+ "gasa_cal",
53
+ "gasb_cal",
54
+ "gasc_cal",
55
+ "gasd_cal",
56
+ "gase_cal",
57
+ "bt"
58
+ ],
59
+ "mean": [
60
+ 3.838883638381958,
61
+ 2.2043209075927734,
62
+ 2.6981112957000732,
63
+ -1382.3704833984375,
64
+ -1229.876708984375,
65
+ -592.7352294921875,
66
+ 1098.1622314453125,
67
+ 1173.57958984375,
68
+ -2493.411865234375,
69
+ -2367.570556640625,
70
+ 996.0214233398438,
71
+ -535.8018798828125,
72
+ -1373.1888427734375,
73
+ -1218.50048828125,
74
+ -1005.3848266601562,
75
+ 1124.2967529296875,
76
+ 1443.536865234375,
77
+ -2463.248046875,
78
+ -2941.56005859375,
79
+ 1431.05615234375,
80
+ -214.02586364746094,
81
+ -6965.32666015625,
82
+ -6876.16455078125,
83
+ 15.054444313049316,
84
+ 1.386172890663147,
85
+ 0.35034820437431335,
86
+ 0.528103232383728,
87
+ 0.27696067094802856,
88
+ -0.971906840801239
89
+ ],
90
+ "std": [
91
+ 3.0613932609558105,
92
+ 2.11222505569458,
93
+ 6.685519218444824,
94
+ 1349.629638671875,
95
+ 1248.3497314453125,
96
+ 1185.706298828125,
97
+ 1368.95458984375,
98
+ 1352.103759765625,
99
+ 1867.8076171875,
100
+ 1999.19970703125,
101
+ 1498.948974609375,
102
+ 1258.01171875,
103
+ 1367.82275390625,
104
+ 1316.67724609375,
105
+ 1308.8258056640625,
106
+ 1519.5994873046875,
107
+ 1408.3306884765625,
108
+ 1836.4208984375,
109
+ 2510.1083984375,
110
+ 1718.2965087890625,
111
+ 1388.83447265625,
112
+ 18940.9453125,
113
+ 18723.662109375,
114
+ 26.369497299194336,
115
+ 3.4090511798858643,
116
+ 0.4470684826374054,
117
+ 0.654624342918396,
118
+ 0.17616958916187286,
119
+ 1.6484158039093018
120
+ ],
121
+ "transform": "z = clip((x - mean) / std, -clip_sigma, +clip_sigma), applied inside the graph"
122
+ },
123
+ "targets": {
124
+ "ne": {
125
+ "mean": 2.7511744499206543,
126
+ "std": 1.654153823852539
127
+ },
128
+ "te_ped": {
129
+ "mean": 0.5915626287460327,
130
+ "std": 0.43467429280281067
131
+ },
132
+ "ti_ped": {
133
+ "mean": 1.016850233078003,
134
+ "std": 0.681096076965332
135
+ },
136
+ "t_rot_ped": {
137
+ "mean": 21.244613647460938,
138
+ "std": 16.59148406982422
139
+ },
140
+ "neped_prmtan": {
141
+ "mean": 2.7231285572052,
142
+ "std": 1.7005536556243896
143
+ },
144
+ "teped_prmtan": {
145
+ "mean": 0.46375223994255066,
146
+ "std": 0.36919456720352173
147
+ },
148
+ "rho_sym": {
149
+ "mean": 0.9757616519927979,
150
+ "std": 0.04329206794500351
151
+ },
152
+ "ne_top_loc": {
153
+ "mean": 0.9261865019798279,
154
+ "std": 0.049897171556949615
155
+ }
156
+ },
157
+ "hmode": {
158
+ "transform": "sigmoid",
159
+ "note": "hmode is a logit in the trunk; the graph applies the sigmoid."
160
+ },
161
+ "stages": {
162
+ "note": "The composed actuator statistics above are the product of these two. Shown for traceability; use the composed values.",
163
+ "stage1_physical_to_fpe_zscore": {
164
+ "mean": [
165
+ 2.8111997039100878,
166
+ 2.154143940948575,
167
+ 2.159654935239209,
168
+ -1444.0438445123289,
169
+ -1315.1185221229061,
170
+ -639.741760304047,
171
+ 1172.4978680515835,
172
+ 1222.4970107268077,
173
+ -2488.8410961768263,
174
+ -2491.3739557685253,
175
+ 1050.107386405324,
176
+ -578.9736547563273,
177
+ -1421.0817159358041,
178
+ -1285.3967398730092,
179
+ -1061.0290851406676,
180
+ 1186.4795970820587,
181
+ 1460.6822372728345,
182
+ -2452.093120847959,
183
+ -3071.3132492215186,
184
+ 1531.3304960724108,
185
+ -262.6728625067526,
186
+ -6887.604056684089,
187
+ -6768.996463787789,
188
+ 14.89178144369171,
189
+ 1.9421402622606716,
190
+ 0.7508911827356307,
191
+ 1.0383906373403984,
192
+ 0.3920832239686922,
193
+ -1.0310375752078498
194
+ ],
195
+ "std": [
196
+ 194.08418888726106,
197
+ 2.3684465859740262,
198
+ 5.948083564785035,
199
+ 1267.4907621702682,
200
+ 1217.4478106828162,
201
+ 1249.3915272640536,
202
+ 1345.3871181128568,
203
+ 1359.1934832307923,
204
+ 1887.1891497052302,
205
+ 1888.1014577442652,
206
+ 1559.9875106371376,
207
+ 1287.2118470203372,
208
+ 1271.813282654729,
209
+ 1259.8644805335082,
210
+ 1361.9306367877398,
211
+ 1521.172083160852,
212
+ 1393.2120473032558,
213
+ 1856.723912629122,
214
+ 2432.8530409799628,
215
+ 1705.6959050005082,
216
+ 1421.8036451037203,
217
+ 19092.148992270486,
218
+ 18858.28389193975,
219
+ 27.289184462156058,
220
+ 11.092415079529571,
221
+ 9.017289768908354,
222
+ 12.055982101097918,
223
+ 6.498888909025979,
224
+ 1.599000778986496
225
+ ]
226
+ },
227
+ "stage2_fpe_zscore_to_model": {
228
+ "mean": [
229
+ 0.0052950419485569,
230
+ 0.02118559367954731,
231
+ 0.0905260294675827,
232
+ 0.04865782707929611,
233
+ 0.0700167864561081,
234
+ 0.03762352466583252,
235
+ -0.05525219440460205,
236
+ -0.03599006310105324,
237
+ -0.002421961398795247,
238
+ 0.06557027250528336,
239
+ -0.03467077016830444,
240
+ 0.03353898227214813,
241
+ 0.03765711933374405,
242
+ 0.05309795215725899,
243
+ 0.040856875479221344,
244
+ -0.04087827727198601,
245
+ -0.012306398712098598,
246
+ -0.006007813848555088,
247
+ 0.05333370715379715,
248
+ -0.05878793075680733,
249
+ 0.03421499580144882,
250
+ -0.004070908762514591,
251
+ -0.00568280229344964,
252
+ 0.005960696842521429,
253
+ -0.050121404230594635,
254
+ -0.04441944137215614,
255
+ -0.042326491326093674,
256
+ -0.017714189365506172,
257
+ 0.036979787051677704
258
+ ],
259
+ "std": [
260
+ 0.015773532912135124,
261
+ 0.8918187022209167,
262
+ 1.1239787340164185,
263
+ 1.0648043155670166,
264
+ 1.0253825187683105,
265
+ 0.9490270018577576,
266
+ 1.0175172090530396,
267
+ 0.994783878326416,
268
+ 0.9897299408912659,
269
+ 1.0588412284851074,
270
+ 0.9608724117279053,
271
+ 0.9773152470588684,
272
+ 1.0754902362823486,
273
+ 1.04509437084198,
274
+ 0.9610077142715454,
275
+ 0.9989661574363708,
276
+ 1.0108516216278076,
277
+ 0.9890651702880859,
278
+ 1.0317550897598267,
279
+ 1.007387399673462,
280
+ 0.9768117070198059,
281
+ 0.9920803308486938,
282
+ 0.9928614497184753,
283
+ 0.9662984609603882,
284
+ 0.30733174085617065,
285
+ 0.04957903176546097,
286
+ 0.05429871752858162,
287
+ 0.02710764855146408,
288
+ 1.030903697013855
289
+ ]
290
+ }
291
+ }
292
+ }