|
Download agent_reports_bgkf/t4_seq.md from thibautforest/BatterySwapAI2026-Example: direct link, hf CLI and curl.
- Browser
- Download file 4.47 kB
-
https://huggingface.co/thibautforest/BatterySwapAI2026-Example/resolve/main/agent_reports_bgkf/t4_seq.md
- Command line
-
hf download hf://thibautforest/BatterySwapAI2026-Example/agent_reports_bgkf/t4_seq.md
-
curl -L -o t4_seq.md https://huggingface.co/thibautforest/BatterySwapAI2026-Example/resolve/main/agent_reports_bgkf/t4_seq.md
4.47 kB
| # T4 SEQUENCE lane: GRU temporal encoder on raw daily telemetry (NEGATIVE) | |
| Date 2026-08-23. Baseline: head 60d65da (order .50 logbag(vm7) + .30 wiener | |
| + .20 gapHGB; values logbag @ alpha 1.0; planner tw 2.0 / split 3), reference | |
| per-cell CSV /tmp/ref_head_1541.csv, CV 1541.3 on bgkf. All arms paired vs | |
| that reference on the 48 all-building scenario totals. | |
| ## Hypothesis | |
| The whole stack is snapshot features; degradation SHAPE (knees, dips, | |
| recovery, plateau texture) in the raw daily series is unexploited. A small | |
| recurrent encoder (CMAPSS / battery-SoH literature) on the last 60 days of | |
| daily telemetry as a new order source. | |
| ## Method | |
| - Sequences: per (device, origin) row of the feature table, the 60 calendar | |
| days ENDING at the origin (leak spot-checked). 4 channels: daily median | |
| v_corr (v - 0.005*(t-20), last-obs-carried-forward, fixed physical | |
| normalization - nothing fitted), observed mask, days-since-last-obs | |
| (GRU-D-style delta, /90), temp-gated in-band coverage mask. Built once for | |
| all 71,878 rows (no cross-device stats, so one cache serves every fold). | |
| Builder: /tmp/c22/build_seqs.py -> /tmp/c22/seqs.npz. | |
| - Encoder: GRU(4 -> hidden 48, 2 layers, dropout 0.1) -> linear logit on | |
| dies42. BCE, pos_weight = neg/pos, positives urgency-weighted (RankNet | |
| 'days' precedent). Adam lr 3e-3, wd 1e-3, 30 epochs, batch 1024. | |
| - Fold safety: exact replication of run_bgkf's split (cv.build_folds) and | |
| train subset (closed rows, fold-train buildings only). NO self-supervised | |
| pretraining, no test-fold telemetry in any fit (phase-51 lesson honored). | |
| Seed ensemble = 5 seeds, combined as mean of within-fleet pct ranks. | |
| Fitter: /tmp/c22/fit_seq.py -> /tmp/c22/seq_scores_f{0..4}.parquet. | |
| - Measurement: cv.run_bgkf(kind='logbag', variant='vm7', blend=(arm,1.0), | |
| p_star=1.0, split_days=3, timing_weight=2.0) - value-preserving order | |
| mapping, counts fixed. Driver /tmp/c22/run.py; per-cell CSVs | |
| /tmp/cv_bgkfcand_c22_*.csv. | |
| - Parity control: re-implemented champion order reproduces the reference | |
| EXACTLY (+0.0, 46/48 cells identical), so arm deltas are clean. | |
| ## Encoder quality (out-of-fold, test-building closed real-origin rows) | |
| | fold | seq AUC | -v_last AUC | pos | | |
| |------|---------|-------------|-----| | |
| | 0 | 0.951 | 0.944 | 123 | | |
| | 1 | 0.942 | 0.946 | 91 | | |
| | 2 | 0.939 | 0.964 | 80 | | |
| | 3 | 0.908 | 0.779 | 71 | | |
| | 4 | 0.956 | 0.954 | 61 | | |
| The encoder is real (it generalizes across buildings; fold 3 shows it beats | |
| the raw level where v_last fails) but overall only ~matches a single strong | |
| snapshot feature. | |
| ## Results (paired vs head 1541.3; 48 scenarios) | |
| | arm | order | SCORE | delta +/- SE | sig | W/L | wilcoxon | swaps | | |
| |-----|-------|-------|--------------|-----|-----|----------|-------| | |
| | champ (parity) | .50/.30/.20/- | 1541.3 | +0.0 +/- 0.0 | 0.4 | 1W/1L | nan | 2.27 | | |
| | (d) seq_alone | 0/0/0/1.0 | 1935.7 | +394.4 +/- 71.3 | 5.5 | 9W/39L | 0.000 | 2.26 | | |
| | (a) seq_g20 | .50/.30/0/.20 | 1654.3 | +113.0 +/- 36.5 | 3.1 | 14W/21L | 0.017 | 2.27 | | |
| | (c) seq_w30 | .50/0/.20/.30 | 1613.8 | +72.5 +/- 27.1 | 2.7 | 20W/22L | 0.089 | 2.25 | | |
| | (b) seq_4th | .45/.27/.18/.10 | 1584.1 | +42.8 +/- 20.4 | 2.1 | 9W/14L | 0.140 | 2.27 | | |
| | dose ctrl | .475/.285/.19/.05 | 1562.9 | +21.6 +/- 16.9 | 1.3 | 6W/7L | 0.508 | 2.27 | | |
| All arms count-flat (2.25-2.27 vs ref 2.27). Dose-response is MONOTONE | |
| against the source: 0 -> +0.0, .05 -> +21.6, .10 -> +42.8, .20 -> +113.0. | |
| Every insertion point (gap slot, wiener slot, 4th source, any weight) makes | |
| the order worse; the losses are significant in the wrong direction. | |
| ## Verdict | |
| REJECTED (new-mechanism tier needs >= 2 sigma IMPROVEMENT; we have 2-5 sigma | |
| degradation). The temporal-shape signal the GRU extracts is already captured | |
| by the snapshot stack (slopes, accel, drop_recent, wiener drift, gap | |
| features); at the margin the encoder adds noise, not recall. Standalone | |
| anchor (1935.7) confirms it is far from champion-grade on its own. | |
| Do NOT retest: GRU/temporal encoder on daily (v_corr, mask, delta, in-band) | |
| sequences as an order source at any slot/weight in the 3-way order. A | |
| materially different attempt would need a different signal (e.g. sub-daily | |
| texture), not different weights. | |
| ## Deployment cost (moot, for the record) | |
| Fit: ~7 s/epoch uncontended at 2 torch threads -> ~3.5 min/seed, ~17.5 min | |
| for the 5-seed ensemble (deployment fits once on full train); inference on | |
| the whole table <10 s. Inside the 30-min budget, but not shipped. | |