Files
2026-07-13 05:38:29 +08:00

46 lines
2.2 KiB
Python

# Claude: small-multiples dose-response for the 7-method demo, styled like
# word_steering's plot_sweep but read straight from the edge-find detail in
# steering_demo_results.json. y = P(YES), point colour = ans_mass (readout
# validity: bright = answer alive, dark = answer dying). red edge = readout
# invalid (ans_mass < 0.9*base). Single-seed edge-find, so no error bars.
import json
from pathlib import Path
import matplotlib.pyplot as plt
ROOT = Path(__file__).resolve().parents[2]
d = json.load(open(ROOT / "artifacts" / "steering_demo_results.json"))
detail, summary = d["detail"], {r["method"]: r for r in d["summary"]}
BASE_PYES = 0.107 # P(YES)@C=0, shared across methods (oracle brief)
methods = list(detail)
fig, axes = plt.subplots(2, 4, figsize=(15, 7), sharey=True, layout="constrained")
axes = axes.ravel()
for ax, m in zip(axes, methods):
pts = sorted(detail[m], key=lambda p: p["C"])
Cs = [p["C"] for p in pts]
pyes = [p["ans"] for p in pts]
am = [p["ans_mass"] for p in pts]
edges = ["red" if not p["readout_valid"] else "0.2" for p in pts]
ax.plot(Cs, pyes, "-", color="0.85", lw=1, zorder=1)
ax.axvline(0, color="0.85", lw=0.8, zorder=0)
ax.axhline(BASE_PYES, color="0.85", lw=0.8, ls="--", zorder=0)
sc = ax.scatter(Cs, pyes, c=am, cmap="viridis", vmin=0.0, vmax=1.0,
edgecolor=edges, linewidth=1.4, s=70, zorder=2)
s = summary[m]
ax.set_title(f"{m}\nscore={s['score']:+.3f} ok={s['readout_ok']}", fontsize=9)
ax.set_ylim(-0.03, 1.03)
ax.set_xlabel("steering coefficient C", fontsize=8)
axes[0].set_ylabel("P(YES = lie)")
axes[4].set_ylabel("P(YES = lie)")
for ax in axes[len(methods):]:
ax.set_visible(False)
cbar = fig.colorbar(sc, ax=axes.tolist(), label="ans_mass (readout validity)",
fraction=0.025, pad=0.01)
cbar.ax.axhline(0.90 * 0.56, color="red", lw=1) # ~0.9*base_am floor (base_am~0.56)
fig.suptitle("Dose-response per method: P(YES) vs C, coloured by answer-mass "
"(dark = answer dying). Dashed = baseline P(YES)=0.107. Single seed.",
fontsize=11)
out = ROOT / "artifacts" / "steering_demo_sweep.png"
fig.savefig(out, dpi=110)
print("wrote", out)