FUSE-PED / era /single /model_config.json
SCS-Lab's picture
FUSE-EFIT in-era model, single and averaged forms (replaces the earlier model)
3dc632e verified
Raw History Blame Contribute Delete
15.4 kB
{
"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"
}