Revision 3: exact-zero stop in section 4; Table 12 with the post hoc Lagouanelle variant (branch m>=2: corpus 4 5568, six corpora 18372, multiple/fractional 6540, APS 2960; A' 178/34/28), the controls' missing exit in its caption; the reading of Table 12 restated in 7.1, 6.6 and the conclusion - the analogy order transfers to the classical frame and works better there than in A's split (2809 vs 4042 on multiple roots), and A's layer as a whole (detector with exit) earns its place (+1233 vs -3934). Server: verify 548 OK / 0 BAD, regression x2 1239 passed, PDF 32 pages, 0 errors, 0 overfull.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
vvs
2026-09-22 09:31:40 +01:00
co-authored by Claude Opus 5
parent aa304cd262
commit 1eb2c1664f
9 changed files with 244 additions and 7 deletions
+84
View File
@@ -0,0 +1,84 @@
"""POSTHOC_lag_branch_2026-09-22: Chandrupatla on sign(f)|f|^(1/m_hat) with Lagouanelle's estimate
restricted to the branch m >= 2 (K3-L2), post hoc, with the harness of sweep_fourth.py. The
registered K3 run (sweep_estimated.py / .json) is not touched.
python -u sweep_estimated_posthoc.py run -> sweep_estimated_posthoc.json, report
python -u sweep_estimated_posthoc.py --report
"""
from __future__ import annotations
import functools
import json
import sys
from multiprocessing import Pool
import sweep_fourth
import sweep_full
from simroot.transformed import chandrupatla_transformed
from sweep_controls import nonsimple
from sweep_oos import sign_p
sweep_full.EXTRA_BASELINES["k3_lag2"] = functools.partial(chandrupatla_transformed, estimator="lag2")
sweep_fourth.CONFIGS["k3_lag2"] = ("base", "k3_lag2")
SETS = ("APS", "CHA", "NEW", "RJL", "APP", "D")
def job(which):
return sweep_fourth.evaluate(("k3_lag2", which))[1]
def cost(v):
return v[0] if v[1] else 200
def tot(r, keep=None):
return sum(cost(v) for p, v in r.items() if keep is None or keep(p))
def held_on_simple_roots():
"""How many APS runs end holding m_hat != 1 (fresh)."""
n = 0
for s, pid, f, a, b, _r in sweep_full.load_problems():
if s != "APS":
continue
st = {}
chandrupatla_transformed(f, a, b, 1e-12, 200, estimator="lag2", stats=st)
n += st.get("m_hat", 1.0) != 1.0
return n
def report(R):
seen = json.load(open("sweep_fourth_seen.json", encoding="utf8"))
four = json.load(open("sweep_fourth_fourth.json", encoding="utf8"))
ap = dict(seen["Aprime"])
ap.update(four["Aprime"])
K1 = json.load(open("sweep_controls.json", encoding="utf8"))["K1"]
grp = sum(tot(R[s], lambda p, _m=K1[s]["mstar"]: nonsimple(_m[p])) for s in ("CHA", "NEW", "D"))
ps = list(ap["D"])
w = sum(cost(ap["D"][p]) < cost(R["D"][p]) for p in ps)
l = sum(cost(ap["D"][p]) > cost(R["D"][p]) for p in ps)
print(f"K3-L2 (post hoc): corpus 4 {tot(R['D'])} six corpora {sum(tot(R[s]) for s in SETS)} "
f"multiple/fractional {grp} APS {tot(R['APS'])}")
print(f" A' on corpus 4 against it: {w}/{len(ps) - w - l}/{l} p={sign_p(w, l):.2g}")
print(f" per corpus: " + " ".join(f"{s} {tot(R[s])}" for s in SETS))
print(f" violations {sum(v[2] for s in SETS for v in R[s].values())}")
print(f" APS runs ending with m_hat != 1: {held_on_simple_roots()} of 154")
def main():
if "--report" not in sys.argv:
with Pool(2) as pool:
parts = pool.map(job, ("seen", "fourth"))
R = {}
for p in parts:
R.update(p)
with open("sweep_estimated_posthoc.json", "w", encoding="utf8") as fh:
json.dump(R, fh)
with open("sweep_estimated_posthoc.json", encoding="utf8") as fh:
R = json.load(fh)
report(R)
print("posthoc done")
if __name__ == "__main__":
main()