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
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.