jev-tune decision head
A 168 KB ONNX model that reads a closed-loop step response and returns one bounded PID gain step in 0.19 ms on a single CPU thread.
It is the runtime policy of jev-tune. It emits the three Jev-style primitives rather than text:
| output | shape | meaning |
|---|---|---|
choice |
3 Γ 7 | multiplicative step for Kp, Ki, Kd (Γ0.50 β¦ Γ2.00) |
score |
5 | how good the current response is (used for early stopping) |
noul |
1 | calibrated P(the step keeps the loop healthy) |
Inputs
| name | shape | description |
|---|---|---|
feats |
(B, 20) |
hand-crafted response descriptors (overshoot, rise, settling, ess, log IAE/ITAE, oscillations, saturation, previous action and its effect, Ku/Kp, Tu/h β¦) |
curves |
(B, 2, 64) |
resampled and normalised y(t) and u(t) |
Usage
import numpy as np, onnxruntime as ort
sess = ort.InferenceSession("jev_head.onnx", providers=["CPUExecutionProvider"])
choice, score, noul = sess.run(None, {"feats": feats, "curves": curves})
The reference implementation, the feature extraction and the closed-loop
driver are in the repository
(v1.0.0).
models/jev_head_weights.mat is the same network exported for MATLAB, so the
tuner can run inside Simulink without Python. The source PyTorch checkpoint
(jev_head.pt) is included for specialist fine-tuning
(scripts/10_specialize.py);
the runtime itself only needs the ONNX file.
Calibration and safety layer
calibration.json (schema 2) carries one fitted temperature per gain axis and
split-conformal prediction sets fitted on two disjoint labelled samples
(Ξ± = 0.10, k_max = 3). The shell ships two modes: monitor records
would-hold evidence only, while hard_hold vetoes an axis before actuation
(the default in the core shell and the C port; the PID evaluator keeps
monitor β the measured trade-off is in
docs/TRADEOFFS.md
in the repository).
Use jev_head_weights.mat and calibration.json as the pair shipped with
v1.0.0 of the code.
Older copies of these two files still load β the MATLAB decoder falls back to
defaults β but silently drop the temperature scaling, the abstention
thresholds and the CP veto.
CP coverage is per-axis marginal teacher-label coverage on exchangeable states. It is not closed-loop stability, joint-action safety or a physical guarantee.
Measured behaviour
Historical measurements from the v0.2-era study; see the repository docs for the current numbers and their accounting.
| value | |
|---|---|
| decision latency (1 thread, batch 1) | 0.19 ms p50 / 0.24 ms p99 |
| calibration (ECE after temperature fit) | 0.038 β 0.056 per axis (0.049 / 0.038 / 0.056); agreement with the expert step label, not outcome calibration |
| held-out plants, median final cost | 0.468 (CMA-ES 1.813 at the same budget) |
| plants that ended worse than the start | 0 / 200 |
Limits
Trained on a synthetic zoo (six plant families, including actuator saturation).
It is not magic: dead bands, inverse response and open-loop unstable plants
need a specialist fine-tune (scripts/10_specialize.py, ~2 min of CPU), and
tracking/disturbance objectives need new metrics and a retrain. See
docs/APPLICABILITY.md
in the repository.
Licence
MIT Β© JIAWEI LI. Trained in this project on synthetic data; no third-party weights are involved.