Buckets:
Planned figures — CWM3 ICRA/IROS submission
Every figure is regenerated from a verified source table (NUMBERS_POLICY.md); the generator and the exact source
are listed so a reader can re-derive every plotted number. Existing assets are copied into this directory as-is
(sha256 recorded). Figures render as vector PDF where we generate them ourselves; the copied PNG is kept until a
vector regeneration exists. Follow the dataviz skill before writing any plotting code.
Generator: figs/make_figs.py (python3 + matplotlib, no seaborn; python3 make_figs.py [heatmap|arch|pareto],
run from anywhere). Each generated PDF carries source path + source sha256 + UTC timestamp in its PDF metadata
(Subject) and writes a sidecar <name>.txt listing every plotted string with its source. main.tex sets
\graphicspath{{figs/}}, so sections include the files as \includegraphics[width=\columnwidth]{<name>}.
| # | file (figs/) | status | content | source of every plotted number | generator |
|---|---|---|---|---|---|
| 1 | architecture.pdf |
DONE 2026-09-13 (sha256 in the table below; 252 × 267.84 pt = 3.5 × 3.72 in, \includegraphics[width=\columnwidth]). Fig. 1 in Sec. IV (fig:arch, 04_method.tex, p. 4 of the 2026-09-13 build). |
Block diagram, read bottom to top, columns U (driver) | V (vehicle) | E (environment) so that V sits between the two surviving paths: inputs (Kx [40×18] 4 s @ 10 Hz causal ROI; X [40×6] CAN 4 s @ 10 Hz; pooled V-JEPA 2 tokens 1 per 0.5 s slot over the 8 s causal bank + front latent [256]); trunks (GRU 18→128; TCN 6→256, k 5, dil 1/2/4/8; 2× causal Transformer d 128 / 4 heads / FFN 256); latent states h_U [128], z_V [256], [z_E ; z_vf] [256] inside the directed interaction block I (zero-init residuals, identity at init): driver→vehicle mode-gated MLP 247,680 and env→vehicle MLP 329,088 solid; road→driver cross-attention 231,424 + 11,392 token embedding dashed and crossed out (removed in the main model all_minus_road2drv); heads = direct 25-step decoders ([25×26] hands_on / head_turned; [25×35] 3 MDNs + gas/brake/steer_phase/resp; [25×12] 6 demand chains + F [5×256]) with the detached K (89,510) / R (41,394) / P (146,988) heads as dotted sub-boxes; post-hoc warning head W (fixed HGB) on current-state features + dwell block (11) + face-landmark block (16) on top. Branch parameter counts U 159,290 / V 1,608,347 / E 880,604 (pooled) in the column titles. No derived sums are printed. |
/home/USER/cwm3/docs/model_spec.md §1 (inputs), §2 (trunks, heads, branch params), §3 (interaction modules + params, forward order), §4/§4b (detached K/P/R params), §5 (direct decoder); results/tables/warning_head_final_ext.md header (dwell 11 dims, face 16 dims; feature sets); main-model naming docs/results_cwm3.md §0. Label→source list in figs/architecture.txt. |
make_figs.py arch (includes a text-overflow check that fails the run if any label exceeds its box) |
| 2 | pareto_all_vs_hm.png |
COPIED 2026-09-13 (sha256 b4e1d697a62ca66ead0d12cc96b5da631c52ef6b87092d19812706336011a490, byte-identical to source; re-checked by make_figs.py pareto, which only copies when the hash differs) |
AIDE All-MPJPE vs High-Motion h=5 trade-off: analytic shrinkage curve, published Driver-WM rows, our two models (5.8 M geometry; 6.3 M vis+sem, kept separate). | /home/USER/cwm3/aide/results/tables/pareto_all_vs_hm.png; data aide/results/tables/tradeoff_all_vs_hm.md / .json; published rows aide/eval/paper_rows.py |
aide/eval/baselines_analytic.py (existing) — regenerate as PDF if the palette/labels change |
| 3 | label_curve.pdf |
TODO | Label / power curve: paired-Δ AUROC CI half-width vs number of gold positives (calibrated + Hanley–McNeil), with the current gold (509 rows / 63 positives) marked and the "smallest declarable Δ" line; new-clip axis at 12.4 % / 25 % positive share. Human-evaluation round: mark as IN PROGRESS, no result. | /home/USER/cwm3/results/tables/power_gold.md (eval/power_gold.py run 20260912T033553Z table); docs/annotation_programme.md (design only) |
to be added to make_figs.py (sub-command label_curve) reading power_gold.md |
| 4 | robustness_heatmap.pdf |
DONE 2026-09-13 (sha256 in the table below; wide layout 516 × 191.52 pt = 7.167 × 2.66 in = IEEEtran \textwidth). figure* float with \label{fig:robustness_heatmap} added in Sec. VI (06_results_baton.tex, directly after \input{tables/tab_robustness}, \includegraphics[width=\textwidth]); the previously undefined \ref resolves and the float lands on the same page as Table IX (p. 14 of the 2026-09-13 build). A stacked \columnwidth variant (3.5 × 4.33 in) is available via make_figs.py heatmap --column if the owner prefers a single-column figure. |
Two side-by-side panels (manual left, engaged right; rows aligned, row labels on the left panel), rows = clean level + 6 test-time perturbations (kin_drop20, kin_drop50, can_noise, road_off, kh_trunc_old2s, kh_mask_recent2s), cols = 9 main endpoints (steer_phase, gas, brake, veh_any | hand_leave, hand_return, head_turn | P ttc_drop, P cut_in; white separators and muted family labels vehicle / driver / road pressure). Cell colour = Δ PR-AUC@3s (perturbed − clean, mean of 3 seeds) on ColorBrewer RdBu, symmetric about 0 (vmin/vmax = ∓0.22 = max |Δ| over all cells rounded up to 0.01); cell text = the copied mean (typographic minus for display; ASCII verbatim in the sidecar) and the verdict letter W / N / I (WORSE bold; B would appear for BEATS — no cell has it). Top row of each panel = clean level mean ± sd copied from the table. Wording rules of NUMBERS_POLICY.md: W = "significantly worse", N/I = "no significant difference"; legend printed under the colourbar. | /home/USER/cwm3/results/tables/robustness_final.md §1 (rendered 2026-09-12 21:22:40 UTC; 3 seeds; source sha256 ec51626713a2812e32021ec112063bca5d52701bd75efbbc31cf03441100eac7) — the markdown tables ### manual / ### engaged are parsed with a strict regex (mean ± sd VERDICT); nothing is recomputed. Parsed grid dumped verbatim to figs/robustness_heatmap.txt. |
make_figs.py heatmap (wide, default) / make_figs.py heatmap --column (stacked) |
| 5 | operating_points.pdf |
TODO | Equal-alert-load operating points: learned warning head vs openpilot DMS attention chain — gold recall / precision at DMS-matched and low (10 / h) alert loads per regime, with device-cluster bootstrap CIs; lead-time paired Δ (kill rule: CI ⊃ 0 -> EQUAL). Shares are enriched-gold quantities; NEVER relabelled as natural rates. | /home/USER/cwm3/results/tables/operating_points.md (items oof, final_*); raw rows results/operating_points/<run>/; existing calibration asset results/operating_points/oof_20260911T194413Z/reliability.png |
to be added to make_figs.py (sub-command operating_points) |
| 6 (optional, plan §六) | aide_per_horizon.pdf |
TODO | AIDE per-horizon MPJPE (h = 1..5, All and HM) for our two models vs zero-velocity and the published Driver-WM anchors (HM h=5 155.82 / ZV 178.62 quoted only). | aide/results/tables/stage_a.md, stage_bc.md, tradeoff_all_vs_hm.md; aide/eval/paper_rows.py (PAPER_HM5) |
to be added to make_figs.py |
Hashes of the generated assets (2026-09-13)
| file | sha256 |
|---|---|
architecture.pdf |
728d473b66833c306349f8d1b497b03970933b3ed8f8faa41e4777172b21c379 |
architecture.txt |
7261b476b4c0207267c1e929e49a13d40d04b540cd03907396202a00bed99fc9 |
robustness_heatmap.pdf |
c2d43dab3ac89890f55354909422a9cfbfa7170247008011d56e3ed133bd200b |
robustness_heatmap.txt |
07a1d5bc0776b4dfd0e698528bf2280094f0a566682abb7e8bf1cdfb38ee6a49 |
pareto_all_vs_hm.png |
b4e1d697a62ca66ead0d12cc96b5da631c52ef6b87092d19812706336011a490 |
make_figs.py |
247a55adf9b45ce87784beb871fd63b59c93b9f419bbedb2358af5b647602869 |
(PDF hashes change on every regeneration because the metadata carries a timestamp; the sidecar .txt files also carry the timestamp in their first line. To check that the plotted numbers are unchanged, diff the .txt files ignoring their first line.)
Design notes (dataviz skill)
- Heatmap: diverging job → two poles (red = loss, blue = gain) with a neutral near-white midpoint at exactly Δ = 0; one colour scale for both panels; the colour never carries meaning alone — every cell also prints its value and verdict letter, and the table
tab_robustnessis the table-view twin. Chrome is hairline / muted ink; text uses ink tokens, never the cell colour. Colour ramps are exempt from the categorical validator by design (color-formula.md). - Architecture: the three branches use categorical slots 1–3 of the reference palette (blue / orange / aqua, documented as passing all-pairs in both modes) as light tints with the hue as edge; identity is always also carried by the text label. The ablated path uses the status "critical" red for the × only, next to the word "removed". Fonts: Nimbus Sans (Helvetica clone) embedded as Type 42; mathtext uses the same face.
- Appendix-only variants (gaze chain, non-causal ROI, 5-seed) may appear in appendix figures but never in Figs. 1–6.
Xet Storage Details
- Size:
- 9.21 kB
- Xet hash:
- 8f86fe223c17ff1d81740c00c2bfe35d01f9d8d93e98e2d6b39b5c3ce2675d45
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.