diff --git a/docs/figs/dyn_sub4.png b/docs/figs/dyn_sub4.png new file mode 120000 index 0000000..6d64c4d --- /dev/null +++ b/docs/figs/dyn_sub4.png @@ -0,0 +1 @@ +../../out/figs/dyn_sub4.png \ No newline at end of file diff --git a/docs/figs/dyn_sub4_hack_overlay.png b/docs/figs/dyn_sub4_hack_overlay.png new file mode 120000 index 0000000..beb4b08 --- /dev/null +++ b/docs/figs/dyn_sub4_hack_overlay.png @@ -0,0 +1 @@ +../../out/figs/dyn_sub4_hack_overlay.png \ No newline at end of file diff --git a/scripts/plot_dynamics.py b/scripts/plot_dynamics.py index 673b3d5..1dbab9e 100644 --- a/scripts/plot_dynamics.py +++ b/scripts/plot_dynamics.py @@ -128,12 +128,16 @@ def parse_log(path: Path) -> dict | None: # under the hack_s/gt_s keys -> all downstream (panels, onset, overlay) reads # it. Prefer the DENSE per-step proxy (hk_abl, every step) over the sparse # held-out eval (hk_dep, every eval_ablate_every steps); fall back to hk_dep - # for older runs that predate the proxy. + # when hk_abl carries no data. No-floor runs (rollout_ablate_frac=0) have the + # hk_abl COLUMN present but every cell is "0/0" -> all-nan, so test for finite + # values, not mere column presence, else the deploy panel comes up blank. + def _has_data(key): + return key in run and np.isfinite(run[key]).any() if arm in ("routing", "routing2"): - if "hk_abl" in run: + if _has_data("hk_abl"): run["hack_s"] = run["hk_abl"] run["gt_s"] = run["slv_abl"] - elif "hk_dep" in run: + elif _has_data("hk_dep"): run["hack_s"] = run["hk_dep"] run["gt_s"] = run["slv_dep"] return run