"""Emit paper/tables/numbers.tex: every number quoted in the prose comes from this file (registry, configs, state store).""" import os, sys, csv, json, yaml sys.path.insert(0, os.path.dirname(__file__)); from common import * def m(name, val): return f"\\newcommand{{\\{name}}}{{{val}}}" def main(): reg = list(csv.DictReader(open(os.path.join(REPO, "tasks", "registry.csv")))) conf = [r for r in reg if r["split"] == "conf"]; dev = [r for r in reg if r["split"] == "dev"]; tr = [r for r in reg if r["split"] == "transfer"] b = yaml.safe_load(open(os.path.join(REPO, "configs", "budgets.yaml")))["budget"] out = [m("nConfTasks", len(conf)), m("nDevTasks", len(dev)), m("nTransferTasks", len(tr)), m("nConfRealData", sum(r["real_data"] == "yes" for r in conf)), m("nConfSourceDocs", sum(r["source_documents"] == "yes" for r in conf)), m("nConfNullTruth", sum(r["infeasible_or_null_truth"] == "yes" for r in conf)), m("nOracles", len([r for r in reg if r["split"] in ("conf", "dev")])), m("envUSD", f"{b['max_budget_usd']:.2f}"), m("envWall", f"{b['wall_seconds']:,}"), m("envTurns", b["max_turns_per_session"])] try: s = pd.read_csv(os.path.join(DATA, "sessions.csv")); r = pd.read_csv(os.path.join(DATA, "runs.csv")) sm = s[s.run_id.str.startswith("RD") & (s.kind == "initial")].merge(r[["run_id", "treatment"]], on="run_id") for a in ARMS: v = sm[sm.treatment == a].first_turn_input_tokens out.append(m(f"ctx{a}", f"{int(v.iloc[0]):,}" if len(v) else "--")) for split, tag in [("confirmatory", "Main"), ("pilot", "Pilot"), ("transfer", "Transfer"), ("recovery", "Recovery"), ("ablation", "Ablation")]: d = r[r.split == split] out += [m(f"n{tag}Runs", len(d)), m(f"n{tag}Evaluated", int((d.status == "evaluated").sum())), m(f"cost{tag}Total", f"{d.spent_usd.sum():.2f}")] rep = r[r.split == "confirmatory"].groupby(["task_id", "treatment"]).size() out.append(m("nRepeats", int(rep.max()) if len(rep) else 3)) out.append(m("costAllTotal", f"{r.spent_usd.sum():.2f}")); out.append(m("nAllRuns", len(r))) except Exception as e: out.append(f"% sessions/runs not available: {e}") os.makedirs(os.path.join(REPO, "paper", "tables"), exist_ok=True) open(os.path.join(REPO, "paper", "tables", "numbers.tex"), "w").write("\n".join(out) + "\n"); print("\n".join(out)) if __name__ == "__main__": main()