{ "schema_version": 1, "model": "FUSE-EFIT", "protocol": "in era (random split of shots 125500-205774; DECISIONS D50, D55)", "form": "single", "form_meaning": "single: replicate 0 of the in-era finals, the frozen delivered network", "members": [ { "run": "runs/FULLextfinal_era_r0", "replicate": 0, "seed": 100, "checkpoint_sha256": "28390d5950ec18477394a85dc73498afa0f847502514251b7c96c97569632d96", "config_sha256": "ddec260834c0f5fdaa5303382140e9c0bca1e3028ccd478c2c2a65f62d6f2398", "trained_code_sha256": "1095cd5859ce819840f3e35ead3243d28aae832dbd3f54b04b90d98330493290" } ], "cadence": { "period_ms": 50.0, "hz": 20, "rule": "one step-graph call per 50 ms of simulated time; each tick describes the trailing interval (t - 50 ms, t]; reset the state to zeros at the start of every shot" }, "inputs": { "inputs": { "shape": [ "batch", 25 ], "dtype": "float32", "names": [ "pinj", "tinj", "ech_mw", "gasa_cal", "gasb_cal", "gasc_cal", "gasd_cal", "gase_cal", "bt", "ip", "aminor", "rsurf", "zsurf", "kappa", "tritop", "tribot", "drsep", "rvsout", "gapin", "rvsou", "rvsiu", "shafranov", "zeta_ou", "zeta_ol", "vloop" ], "units": { "pinj": "MW", "tinj": "N m", "ech_mw": "MW", "gasa_cal": "Torr L/s", "gasb_cal": "Torr L/s", "gasc_cal": "Torr L/s", "gasd_cal": "Torr L/s", "gase_cal": "Torr L/s", "bt": "T", "ip": "MA", "aminor": "m", "rsurf": "m", "zsurf": "m", "kappa": "dimensionless", "tritop": "dimensionless", "tribot": "dimensionless", "drsep": "m", "rvsout": "m", "gapin": "m", "rvsou": "m", "rvsiu": "m", "shafranov": "m", "zeta_ou": "dimensionless", "zeta_ol": "dimensionless", "vloop": "V" }, "sources": { "pinj": "PtData bmspinj: neutral-beam injected power, all sources", "tinj": "PtData bmstinj: neutral-beam injected torque", "ech_mw": "MDSplus \\RF::ECHPWRC: calibrated total ECH power injected", "gasa_cal": "MDSplus NEUTRALS GASFLOW.GASA:FLOW: calibrated gas flow, valve A", "gasb_cal": "MDSplus NEUTRALS GASFLOW.GASB:FLOW: calibrated gas flow, valve B", "gasc_cal": "MDSplus NEUTRALS GASFLOW.GASC:FLOW: calibrated gas flow, valve C", "gasd_cal": "MDSplus NEUTRALS GASFLOW.GASD:FLOW: calibrated gas flow, valve D", "gase_cal": "MDSplus NEUTRALS GASFLOW.GASE:FLOW: calibrated gas flow, valve E", "bt": "PtData bt: vacuum toroidal field, signed", "ip": "PtData ip: measured plasma current (amperes / 1e6)", "aminor": "EFIT01 AMINOR: minor radius", "rsurf": "EFIT01 RSURF: major radius of the boundary's geometric centre", "zsurf": "EFIT01 ZSURF: height of the boundary's geometric centre", "kappa": "EFIT01 KAPPA: elongation", "tritop": "EFIT01 TRITOP: upper triangularity", "tribot": "EFIT01 TRIBOT: lower triangularity", "drsep": "EFIT01 DRSEP: separatrix separation at the outer midplane, clipped to +-0.1 m per slice", "rvsout": "EFIT01 RVSOUT: major radius of the outer (lower) strike point", "gapin": "EFIT01 GAPIN: inner gap", "rvsou": "EFIT01 RVSOU: major radius of the upper outer strike point", "rvsiu": "EFIT01 RVSIU: major radius of the upper inner strike point", "shafranov": "EFIT01 R0 - RSURF: Shafranov shift", "zeta_ou": "Luce squareness, outer-upper quadrant, from the EFIT01 boundary vertices", "zeta_ol": "Luce squareness, outer-lower quadrant, from the EFIT01 boundary vertices", "vloop": "PtData VLOOP: loop voltage" }, "grid_rule": { "pinj": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "tinj": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "ech_mw": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "gasa_cal": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "gasb_cal": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "gasc_cal": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "gasd_cal": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "gase_cal": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "bt": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "ip": "plain mean of the three newest 20 ms samples at or before the tick, after a causal low-pass and hold onto 20 ms (INPUT_CONTRACT 3.1)", "aminor": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "rsurf": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "zsurf": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "kappa": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "tritop": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "tribot": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "drsep": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "rvsout": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "gapin": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "rvsou": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "rvsiu": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "shafranov": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "zeta_ou": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "zeta_ol": "mean of the per-slice values of the EFIT01 slices in (t - 50 ms, t] (INPUT_CONTRACT 3.2)", "vloop": "mean of the native samples in (t - 50 ms, t] (INPUT_CONTRACT 3.3)" }, "zeroed_when_indicator_is_0": { "pinj": [], "tinj": [], "ech_mw": [], "gasa_cal": [], "gasb_cal": [], "gasc_cal": [], "gasd_cal": [], "gase_cal": [], "bt": [], "ip": [], "aminor": [ "efit_valid" ], "rsurf": [ "efit_valid" ], "zsurf": [ "efit_valid" ], "kappa": [ "efit_valid" ], "tritop": [ "efit_valid" ], "tribot": [ "efit_valid" ], "drsep": [ "efit_valid" ], "rvsout": [ "efit_valid", "rvsout_present" ], "gapin": [ "efit_valid" ], "rvsou": [ "efit_valid", "rvsou_present" ], "rvsiu": [ "efit_valid", "rvsiu_present" ], "shafranov": [ "efit_valid" ], "zeta_ou": [ "efit_valid" ], "zeta_ol": [ "efit_valid" ], "vloop": [ "vloop_valid" ] }, "note": "Physical units, contract order (docs/INPUT_CONTRACT.md \u00a72). Where a governing indicator is 0 the value is ignored (any number, or NaN). NaN anywhere is read as the training mean, so never pass NaN for a value you have." }, "indicators": { "shape": [ "batch", 5 ], "dtype": "float32", "values": "0 or 1, per tick", "names": [ "efit_valid", "vloop_valid", "rvsout_present", "rvsou_present", "rvsiu_present" ], "meaning": { "efit_valid": "1 when at least one usable EFIT slice lies in (t - 50 ms, t]; 0 otherwise", "vloop_valid": "1 when at least one loop-voltage sample lies in (t - 50 ms, t]; 0 otherwise", "rvsout_present": "1 when at least one slice in the window has a real outer strike point; 0 otherwise", "rvsou_present": "1 when at least one slice in the window has a real upper outer strike point; 0 otherwise", "rvsiu_present": "1 when at least one slice in the window has a real upper inner strike point; 0 otherwise" } }, "available": { "shape": [ "batch", 25 ], "dtype": "float32", "values": "0 or 1, per shot", "names": [ "pinj", "tinj", "ech_mw", "gasa_cal", "gasb_cal", "gasc_cal", "gasd_cal", "gase_cal", "bt", "ip", "aminor", "rsurf", "zsurf", "kappa", "tritop", "tribot", "drsep", "rvsout", "gapin", "rvsou", "rvsiu", "shafranov", "zeta_ou", "zeta_ol", "vloop" ], "default": 1, "note": "1 = a usable record of this channel exists for the shot (the normal case). 0 = no record for the whole shot: the value is ignored and the model receives the flag, as it did in training for missing records. Keep it constant within a shot." } }, "outputs": { "predictions": { "shape": [ "batch", 9 ], "dtype": "float32", "names": [ "ne", "te_ped", "ti_ped", "t_rot_ped", "ne_knee", "te_knee", "rho_sym", "ne_top_loc", "hmode" ], "units": { "ne": "1e19 m^-3", "te_ped": "keV", "ti_ped": "keV", "t_rot_ped": "krad/s", "ne_knee": "1e19 m^-3", "te_knee": "keV", "rho_sym": "rho (normalised radius)", "ne_top_loc": "rho (normalised radius)", "hmode": "probability in [0, 1]" }, "meaning": { "ne": "electron density at rho = 0.85", "te_ped": "electron temperature at rho = 0.85", "ti_ped": "ion temperature at rho = 0.85", "t_rot_ped": "toroidal rotation at rho = 0.85", "ne_knee": "electron density on the pedestal fit at its knee (H-mode only)", "te_knee": "electron temperature on its pedestal fit at its knee (H-mode only)", "rho_sym": "symmetry point of the density pedestal fit (H-mode only)", "ne_top_loc": "knee (pedestal top) of the density pedestal fit (H-mode only)", "hmode": "the plasma is in H-mode (sigmoid of the averaged or single logit)" } }, "hmode_gated_heads": [ "ne_knee", "te_knee", "rho_sym", "ne_top_loc" ], "hmode_gated_note": "Trained on H-mode ticks only and undefined in L-mode; the graph emits a number anyway. Report them only where predictions[hmode] >= threshold; otherwise treat them as undefined, never as 0.", "hmode_thresholds": { "frozen": { "balanced": 0.54, "conservative": 0.5 }, "definitions": { "balanced": "maximum Youden's J on validation (the best trade between missed H-mode and admitted L-mode ticks)", "conservative": "the lowest threshold keeping L-mode ticks at or below 5 % of admitted validation ticks" }, "set_on": "replicate 0, in-era validation split", "source": "receipts/G5_freeze.md section 3; receipts/G5_freeze.json gate_thresholds.era", "freeze_record_sha256": "1fbd776750736a6995a5de48b74b16bc13e0a2a1539972e46be23e8dbb49316e", "note": "Gate the four H-mode-only heads on predictions[hmode] >= threshold; MODEL_CARD.md \u00a76." } }, "graphs": { "step": { "file": "fuse_efit_single_step.onnx", "purpose": "one 50 ms tick per call; unbounded shot length", "inputs": { "inputs": [ "batch", 25 ], "indicators": [ "batch", 5 ], "available": [ "batch", 25 ], "conv_state": [ 6, "batch", 1792, 3 ], "ssm_state": [ 6, "batch", 12, 128, 64 ] }, "outputs": { "predictions": [ "batch", 9 ], "conv_state_out": [ 6, "batch", 1792, 3 ], "ssm_state_out": [ 6, "batch", 12, 128, 64 ] } }, "sequence": { "file": "fuse_efit_single_sequence.onnx", "seq_len": 256, "purpose": "a whole window of exactly seq_len ticks; right-pad a shorter shot (any finite values, indicators 1) and keep the first K outputs, which is exact because the model is causal; use the step graph for longer shots", "inputs": { "inputs": [ "batch", 256, 25 ], "indicators": [ "batch", 256, 5 ], "available": [ "batch", 25 ] }, "outputs": { "predictions": [ "batch", 256, 9 ] } } }, "state": { "conv_state": [ "n_members x n_layers", "batch", 1792, 3 ], "ssm_state": [ "n_members x n_layers", "batch", 12, 128, 64 ], "leading_axis": 6, "n_members": 1, "n_layers": 6, "initial": "all zeros at the start of every shot", "bytes_per_shot": 2488320, "note": "Opaque: store what the step graph returns and pass it back on the next call. The two forms differ only in the leading axis of these two tensors." }, "architecture": { "family": "Mamba-2 state-space sequence model", "d_model": 768, "n_layers": 6, "d_state": 64, "d_conv": 4, "expand": 2, "headdim": 128, "nheads": 12, "ngroups": 2, "d_inner": 1536, "conv_dim": 1792, "chunk_size": 100, "n_inputs_trunk": 30, "n_params_per_member": 22882785, "n_members": 1 }, "input_transform": { "clip_sigma": 20.0, "std_floor": 1e-06, "file": "norms.json", "applied": "inside the graphs" }, "dtype": "float32", "onnx_opset": 17, "documentation": "docs/EXPORT.md, docs/INPUT_CONTRACT.md, MODEL_CARD.md" }