You are an AI agent assisting the device engineer who must qualify a new
power-diode lot at a semiconductor supplier. The probe station covers only a safe
bias/temperature window — 290–325 K, reverse bias to −3.6 V — but the
qualification sign-off due this quarter must commit leakage and conduction
numbers at mission-profile extremes: 385–400 K and reverse bias to −26 V,
where measurement is destructive and the burn-in rig is booked for months.
Overstate the lot's capability and an automotive customer eats field
returns; understate it and the socket goes to a competitor. You inherit a
starting prediction method that extrapolates a fitted window trend; your
job is to build the method the lab will run on every future lot — it is
re-run, unchanged, on qualification devices whose extreme-regime behavior
you never see.
Hard Constraints
Submit a method: methods/main/solver.py defining exactly
predict(record) -> list of floats — the predicted log10 of the
absolute terminal current in amperes at each point of
record["extreme"], in order; a pure function of one device record.
record is a dict with the device's safe-window measurements
(window: 56 {T, V, I} points) and the target grid (extreme:
{T, V} points) — the same schema as the practice records, minus the
truth field.
Each call runs in a fresh process under a 180-second wall-clock
budget (measured outside your process). Anything that takes longer than
195 s (budget + 15 s grace) is scored as the worst case for that
device, and the process is hard-killed at 210 s regardless; crashed or
wrongly-shaped outputs are scored the same worst case. The grader records
a timeout and the child's exit status separately from "produced no
output", so both show up in the run log.
The whole grading stage is capped at 7200 s wall-clock, inside a
container declared at 4 CPUs / 1024 MiB —
the same shape as your own container, so a method that fits here fits
there. Devices are graded serially, one subprocess at a time: with 16
qualification devices the stage budget is the binding constraint only if
your average device takes more than ~7.5 minutes, which the 180 s
per-device budget already forbids.
A note on shared memory: this container's /dev/shm is 64 MiB and
cannot be enlarged. A multiprocessing.shared_memory / joblib memmap
segment larger than that is created successfully and then faults
(SIGBUS) on first write, killing your process with no output. Pass
large arrays to workers by fork inheritance or through ordinary files in
TMPDIR instead. The grader reports a SIGBUS kill as its own failure
reason, distinct from "produced no output".
The graded lot is 16 devices against your 24 practice devices —
about 0.67x the visible count, on the identical 12-point extreme grid.
Grading is therefore cheaper than one full selfcheck.py pass; sizing
your method against your own self-check wall-clock is safe here.
CPU only, no network. Runtime: Python 3 with numpy and scipy, plus the
DEVSIM TCAD device simulator (import devsim) — build physics models of
the lot if you choose to. BLAS/OpenMP threading is pinned to 4 in both
this image and the grader, so your local timings match the graded ones.
Only files under methods/ are collected and re-run: keep everything
predict() imports inside methods/main/. Do not modify data/,
examples/, selfcheck.py or run_solver.py.
What You Have
data/practice/instances.json — 24 practice devices with complete
extreme-regime truth (noise-free log10|I| on the full 12-point
extreme grid), documented field by field in data/practice/DATA_CARD.md.
This is your only labeled data; study it in full.
data/qualification/records.json — the 16 qualification devices your
method will actually be judged on: same window protocol, same extreme
grid, no truth. They are a fresh draw from the same production
population as the practice fleet, with part of the lot weighted toward
the harder corner of that same population.
examples/devsim_diode_demo.py — a working DEVSIM drift-diffusion model
of this device architecture (mesh, doping, equation assembly, bias
ramping with convergence back-off, temperature stepping, terminal
current readout). A starting point, not a prescription.
methods/main/solver.py — the inherited starting method: a log-space
window-trend fit extrapolated in temperature with the voltage law
clamped at the window edge. It carries a real trend signal but is far
from what the records support; its level is also the floor you must
clearly beat before the evaluation awards any credit.
python3 selfcheck.py — free and unlimited: scores your current
methods/main/solver.py on the practice fleet against its truth and
prints per-device errors and the mean.
The practice mean is not a point estimate of your qualification
score. The 24-device practice fleet separates a broken method from a
working one cleanly, but it is systematically optimistic about the
qualification lot: for a strong method we have measured, the practice mean
understates the qualification error by roughly a factor of 1.75. That
gap is not sampling noise and a better method does not make it go away —
the two fleets are different draws and the qualification lot leans toward
the harder corner of the population, so part of the gap is priced in by
construction. Use the practice mean for what it is good at: a floor check,
a debugging tool, a regression guard, and relative comparisons between
two of your own variants measured on the same 24 devices, where the
fleet-specific offset largely cancels. Do not read an absolute practice
number as the score you will get, and do not let a few percent of practice
advantage outweigh physics you can justify.
What You Submit
Leave your best methods/main/solver.py (plus any helper files it needs
inside methods/main/) in place. There is no submit step and no feedback
from the graded lot: whatever sits in methods/main/ at the end is what
the evaluation re-runs.
How It Is Judged
The evaluation re-runs your predict() once per qualification device, on
records byte-identical to data/qualification/records.json, and compares
your numbers to the sealed truth of that lot. Per device it computes the
mean of |log10 I_pred − log10 I_true| over the device's extreme grid
(LOWER is better; capped at 6.0, which is also the score for an invalid or
over-budget run) — selfcheck.py computes the identical per-device error
on practice. Device errors are averaged within each qualification
condition (the main lot draw and the harder-corner draw from the same
population), then across the two conditions. Your reward rises monotonically
as that sealed mean error falls; at or above the shipped starting method's
error it is zero.
Metric
mean absolute log10-current error on the sealed 16-device lot · lower is better
Per device: mean |log10 I_pred - log10 I_true| on 12 extreme points, capped at 6.0; averaged per condition, then both.
anchor
visible set
held-out
reward
B
shipped starting method
0.331251
0.398096
0.00
R
reference method
0.015526
0.027146
0.30
U
exact prediction
0
0
1.00
normalisation
m >= B
0
B > m > R
0.3 * (u(B) - u(m)) / (u(B) - u(R))
R >= m > U
0.3 + 0.7 * (u(R) - u(m)) / (u(R) - u(U))
m <= U
1
m = this run's held-out metric · B = shipped starting method · R = reference method · U = exact prediction
u(x) = log10(x + 5.2e-5), linear in u between landmarks, clamped to [0,1]. Mapped once on the aggregate metric, not per device.
Rollouts
34 minwall clock
-spend
-tokens
9versions, 9 kept
keptrevertedno scoreturning point
v0Inherited baseline: window log-trend fit, voltage clamped at 3.6 V0.3313
v1ni-scaled thermal law from median pairwise reverse activation, voltage power 0.60Fit a physical temperature and voltage law and set its scale from the deepest, hottest reverse point instead of clamping.0.0461
v2Soft-breakdown term added where the 0.45 V forward current is low and b under 1.02Window signatures proxy high doping, so the avalanche-prone corner gets a second branch gated on them.0.0327
v3Joint CV retune: voltage power 0.58, breakdown floor -5.550.0316
v4Activation b estimated only from reverse points at |V| >= 2 V0.0294
v5b nudged up when forward ideality n < 1.250.0276
v6Avalanche strength scaled as gap^1.6 on the 0.45 V current proxy, floor -5.50Give the breakdown term dynamic range across the forward-level gap; the 3-device hard slice went 0.0302 to 0.0193.0.0264
v7300 K deep-reverse points added to the scale median0.0258
v8Activation b floored at 0.980.0252
Picked on a locked 6-device holdout and a 3-device hard slice, not the plotted mean; reverted directions were never snapshotted, so all 9 stand.
v0Inherited baseline: window-trend fit, voltage law clamped at window edge0.33136 min · $0.68
v1RBF kernel ridge from 56 window log-currents to the 12 targets, alpha 1e-9Drop the physics and learn the window-to-extreme map off the 24 practice dies; sigma and alpha picked by leave-one-device-out.06 min · $0.66
Self-check reads 0.0000 at v1: alpha 1e-9 interpolates its own 24 dies. The agent's leave-one-out check, 0.024666, is the honest number.
v0Inherited baseline: log-space window-trend fit, voltage law clamped at window edge0.331329 min · $3.29
v1Shared-activation fit of the 3 deepest reverse biases; fleet-mean 12-point offsetSplit it into a per-device Arrhenius base measured on the deep reverse window plus one population offset to the extreme grid.0.041267 min · $7.27
v2Offset predicted per device by kernel ridge on two forward-ideality featuresThe offset stops being a fleet constant and becomes a function of window shape; LOO 0.0430 to 0.0187 as in-sample collapses.0.006381 min · $10.35
v3Ensemble of 6 kernel-ridge fits, heavier linear term, features and offset clippedSelection moved to a held-out corner-stress split; the linear term is what carries the trend outside the calibrated range.0.0064102 min · $14.93
v4Base fit widened from the 3 to the 4 deepest reverse biases0.0064104 min · $16.38
v5Float-tolerant bias matching; robustness checks on mutated records0.0061108 min · $18.66
Chosen on leave-one-device-out, not the plotted in-sample mean: LOO 0.0430 at v1, 0.0187 at v2, 0.0182 from v4 on.
v2Clamped term kept plus a physical depletion-width continuation in log voltageExtrapolate past the window with a depletion-width law instead of freezing the current at the clamp edge.0.07972 min · $0.28
v3Linear 1/T feature replaced by the silicon intrinsic-density law0.06925 min · $0.75
v4Edge anchor fit on a thermal coordinate, then a calibrated high-field continuation0.043814 min · $2.83
v5Ridge map from 32 forward-window log currents to the v3 residual, alpha 0.0178Learn the window-to-extreme residual from the fleet; fit-on-all 0.0164 against leave-one-device-out 0.0340.0.016420 min · $5.09
v6Convex ensemble, 65% learned v5 with 35% edge-anchor v40.02320 min · $5.22
v7Component-wise ensemble: 75% learned hot level, 60% learned voltage shape0.021923 min · $6.29
v8Five-device high-field family gated on forward signatures, own normalized curveDevices sort into mechanism families; calibrate one shared curve per family and infer its gain from forward level.0.01826 min · $7.31
v9Four-device high-voltage-knee family, gain from a linear curve manifold0.016527 min · $7.91
v10Moderate-saturation family gated on the safe reverse span and forward level0.01430 min · $8.57
v11Hard replacement law for the two-device strong-saturation family0.014630 min · $8.73
v12Half-strength shrinkage toward the strong-saturation family law0.014130 min · $8.88
v13High-field curve manifold extended to the low-temperature-coefficient phenotype0.01333 min · $10.18
v14Temperature-specific family de-biasing of the regularized -8 V hot-current anchor0.0140 min · $11.32
v15Edge anchor retuned to thermal prefactor 2.2 and field exponent 0.720.011142 min · $11.86
v16Anchor-preserving curve correction for the ten devices outside every family0.009155 min · $14.73
v17High-field gain proxy read off a fitted temperature/voltage forward surface0.00962 min · $17.06
v18Ordinary curve map inputs switched from raw endpoints to surface evaluations0.008968 min · $19.39
v19Full strong-saturation curve law restored, paired with its own anchor correction0.008869 min · $20.01
v20Common temperature-specific anchor de-bias for the ordinary population0.008472 min · $21.38
v21Raw family gates replaced by quadratic-surface signatures0.008476 min · $22.99
v22Ordinary anchor mean-only correction becomes a four-summary ridge map, half strength0.007693 min · $27.20
v23Family-centered anchor-only ridge correction for the high/late-field and knee groups0.0064104 min · $29.56
v24Knee family mean anchor de-bias raised from quarter to half strength0.0062106 min · $30.32
v25Ordinary anchor map feature term shrunk from 50% to 75% strength0.0059110 min · $31.26
v26Ordinary curve ensembled equally with a two-gain low-dimensional profile model0.0063121 min · $34.70
v27Ordinary hot-anchor blend moved from 75/25 learned/edge-physics to 50/500.0069124 min · $35.77
v28Ordinary latent residual map becomes a six-coefficient temperature/voltage surface0.0079136 min · $39.42
v29Ordinary auxiliary two-gain curve contribution cut from 50% to 25%0.0082138 min · $39.74
v30Ordinary residual maps clipped at one standard deviation instead of two0.0078152 min · $42.68
v31Clipped ordinary branch coherently refit at 60/40 level, 30/70 shape, ridge 1.00.00662157 min · $44.30
v1Untouched baseline: window-trend fit, voltage law clamped at window edge0.33131 min · $0.15
v2Additive Arrhenius + quadratic log|V| reverse law, noisy -0.4 V points droppedReplace the clamp with a fitted voltage law, so the extreme bias is extrapolated instead of frozen at the window edge.0.07372 min · $0.34
v3Ridge calibration of 22 window features to the 12 targets, blended 80/20 with physicsLearn the window-to-extreme map from the fleet and keep the physics fit as a 20% anchor. LOO 0.0252.0.01787 min · $1.33
v4Physics anchor cut from 20% to 15%0.014515 min · $3.26
v5Jackknife average of 24 leave-one-out ridge calibrations, collapsed to one affine mapAverage calibrations that each omit one die, so no single practice device sets the map; wins 78% of paired splits.0.016218 min · $3.95
v6Physics anchor becomes an equal average of three reverse extrapolators0.015125 min · $6.12
v7Cleanup: superseded coefficients removed, predictions byte-identical0.015126 min · $6.64
v4 had the best in-sample score of the run and was reverted for losing on LOO and on repeated train-20 splits.