"""results/*.jsonl を集計する。Wilson 95%信頼区間つき。"""
import json, math, glob, os
def wilson(k, n, z=1.96):
    if n == 0: return (0, 0)
    p = k/n; d = 1 + z*z/n; c = p + z*z/(2*n); a = z*math.sqrt(p*(1-p)/n + z*z/(4*n*n))
    return ((c-a)/d, (c+a)/d)
def load(name):
    p = os.path.join(os.path.dirname(os.path.abspath(__file__)), "results", f"{name}.jsonl")
    return [json.loads(l) for l in open(p)] if os.path.exists(p) else []
def fmt(k, n):
    lo, hi = wilson(k, n); return f"{k}/{n} = {100*k/n:.0f}% [{100*lo:.0f}-{100*hi:.0f}]"
if __name__ == "__main__":
    for name in ["B_haiku_8","B_haiku_3","B_sonnet_8","B_haiku_8_v3"]:
        rows = load(name)
        if not rows: continue
        print(f"== {name} (N={len(rows)}) cost/chain ${sum(r['cost'] for r in rows)/len(rows):.3f} wall {sum(r['wall'] for r in rows)/len(rows):.0f}s models={set(m for r in rows for m in r['models'])}")
        for k in (1,3,6,10):
            ok = sum(r["steps"][k-1]["cum_ok"] for r in rows); print(f"  {k:2d}段:", fmt(ok, len(rows)))
        loc = [(s["local_ok"], r["steps"][i-1]["cum_ok"] if i else True) for r in rows for i, s in enumerate(r["steps"])]
        for lab, cond in (("直前までが正しい", True), ("直前までに誤りがある", False)):
            sub = [a for a, b in loc if b == cond]
            if sub: print(f"  局所正答 | {lab}:", fmt(sum(sub), len(sub)))
        p = sum(s["local_ok"] for r in rows for s in r["steps"][:1])/len(rows); print(f"  1段目の正答率p={p:.3f} -> p^3={p**3:.2f} p^6={p**6:.2f} p^10={p**10:.2f}")
    print()
    for name in ["A_haiku_1","A_haiku_3","A_haiku_6","A_haiku_10"]:
        rows = load(name)
        if not rows: continue
        ok = sum(r["steps"][-1]["cum_ok"] for r in rows)
        print(f"{name}: 最終", fmt(ok, len(rows)), f"cost ${sum(r['cost'] for r in rows)/len(rows):.3f} wall {sum(r['wall'] for r in rows)/len(rows):.0f}s calls {rows[0]['calls']}")
