From e45bd974e679c9c0636ac4fb0a6c738d582428bc Mon Sep 17 00:00:00 2001 From: YurenHao0426 Date: Sat, 29 Aug 2026 18:50:01 -0500 Subject: exp: freeze nonlinear CLLN hardware confirmation --- HARDWARE_CONFIRMATION.md | 52 ++++++++++++++++++++++++++++++++++++ experiments/physical_grid_bias_p5.py | 7 ++++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 HARDWARE_CONFIRMATION.md diff --git a/HARDWARE_CONFIRMATION.md b/HARDWARE_CONFIRMATION.md new file mode 100644 index 0000000..1748d85 --- /dev/null +++ b/HARDWARE_CONFIRMATION.md @@ -0,0 +1,52 @@ +# Frozen nonlinear CLLN confirmation + +## Purpose + +Confirm the hardware-realistic result on new component draws after the +nonlinear model, local predictor, baselines, task set, and endpoints have been +fixed. This is an in-silico component confirmation, not a fabricated-chip +experiment. + +## Frozen protocol + +- Simulator: `sdil/physical_grid.py` and + `experiments/physical_grid_bias_p5.py`. +- Topology: released 4-by-4 periodic CLLN with 32 learnable edges. +- Tasks: all 40 released ring-classification tasks: five input diameters and + eight label rotations. +- New component seeds: `20260833,20260834,20260835`. +- Published-scale component model: differential gain standard deviation + `0.01`, twin input mismatch `0.001 V`, multiplier offset `2.3 V/s`. +- Methods: clean, raw imperfection, 16-observation constant calibration, + 16-observation degree-2 SDIL predictor, overclamping, and overclamping plus + the same SDIL predictor. +- Standard learning: 600 epochs and `0.001 s` learning exposure per active + update. +- Overclamping: at most 1,000 epochs, released nudging, `0.0025 s/V`, and the + existing three-perfect-checkpoint early stop. +- No BP, autograd, device constant, or oracle-neutral method is used. +- Pairing: all six methods receive the same task, initial gates, and component + draw. + +## Endpoints and statistics + +The primary endpoint is final classification error. Stable zero-error fraction, +wall time, clamp displacement, and held-out predictor RMSE are secondary. The +40 tasks are the bootstrap unit; the three component draws are averaged within +task before percentile 95% intervals are computed. + +The result supports confirmation only if: + +1. every method completes all 120 task/device cells with finite task metrics; +2. standard SDIL improves raw error in every task-averaged pair and closes at + least 95% of the raw-to-clean mean error gap; +3. standard SDIL has no more than one percentage point excess mean error over + clean; +4. overclamping plus SDIL closes at least 95% of the overclamp-to-clean- + overclamp mean error gap; +5. constant calibration and uncorrected overclamping remain in the result + regardless of outcome. + +The output is +`results/physical_bias/p11_nonlinear_hardware_confirmation.json`. Development +seeds `20260829` through `20260832` remain separate. diff --git a/experiments/physical_grid_bias_p5.py b/experiments/physical_grid_bias_p5.py index d7f781b..4b1e305 100644 --- a/experiments/physical_grid_bias_p5.py +++ b/experiments/physical_grid_bias_p5.py @@ -310,6 +310,11 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--overclamp-epochs", type=int, default=1000) parser.add_argument("--workers", type=int, default=8) parser.add_argument("--methods", default=",".join(METHODS)) + parser.add_argument( + "--confirmatory", + action="store_true", + help="mark a run whose protocol was frozen before endpoints were read", + ) return parser.parse_args() @@ -357,7 +362,7 @@ def main() -> None: record["task_index"], record["device_seed"])) report = { "analysis": "reconstructed_figure5_grid_hardware_bias_p5", - "confirmatory": False, + "confirmatory": args.confirmatory, "autodiff_used": False, "source_protocol": str(args.protocol), "protocol": { -- cgit v1.2.3