Files
sim-numerics/report_uniform.py
vvsandClaude Opus 5 862feaff86 Revision 1, step 1: one scoring criterion, the correct order, and the internal inconsistencies.
Point 1. The base step's order is Muller's 1.839, not 2: the derivative of the parabola through
the last three points errs by f'''/6 (x_n - x_{n-1})(x_n - x_{n-2}) = O(e_{n-1} e_{n-2}).
order_high_precision.py (3000 digits, to 1e-2900): 1.840 on cos x - x, e^x - 2, x^3 - x - 2,
sin x - 1/2; 2.000 only on x^2 - 2; two-point 1.618. The double-precision medians (2.000, 1.94)
are removed from the text.

Point 3. Every protocol number is re-scored under the criterion of section 9 - a sign change
within 1e-6 or f(x) == 0. rescore_uniform.py re-runs all 2779 distinct configurations of the 25
protocol sweeps on APS and CHA (the runs did not keep x) -> sweep_uniform.json, same row format;
it reproduces the APS/CHA lines of Table 10 exactly (built-in check). verify_article.py,
audit_similarity_places.py and the gap diagnostics read the re-scored data; the multiplier and
endowment measurements score by the same criterion. Table 7 (two criteria side by side) is gone;
7.3 now explains why the criterion is a sign change. Consequences stated in the text: the base
rule 2634 / 2357 against Chandrupatla 2595 / 1505 (1.5% behind on APS, no longer "level"); A'
2259 / 1074 (12.9% and 28.6% below Chandrupatla); the defect reading 2351 is second to the
shape reading 2337, not the record; the remembered analogy is level with no regime (2633 vs
2634) under this criterion; Table 9a's range is 19% to 425%.

Point 8. report_sweep.head_to_head counts every problem, failures charged (it counted only the
problems both methods solved, which is why Table 8 rows summed to 153 and 40). Family-level
comparisons added (A' vs Chandrupatla 8/1/6 of 15 and 7/0/2 of 9 families, not significant), and
an independence paragraph in section 9.

Point 11. sweep_itp.py: ITP (recommended constants and per-problem oracle) on all six corpora ->
Table 10; behind A' on every corpus, 0 bound violations.

Points 7, 9, 10 and the internals: the 2x bound is ours, not the rivals' promise; the law
predicts the group order only; "outside the proven bracket" explained (narrowest bracket of all
observed signs); 7.4's fun1 paragraph corrected (five costs under safe; the unguarded numbers
belong to fun1.4, fun1.5 and to fun3.1, fun5.1 separately); Table 1's last cell; the corpus-4
composition and odd multiplicities stated, also in the abstract.

build_tex.py: pdflatex output decoded with errors="replace" (a UTF-8 character cut by TeX's log
wrap crashed the build). Table 10 column widths rebalanced.

Checks: verify_article on the server 500 OK / 0 BAD (467 existing with the new values, 33 new);
regression x2 on the server 1232 passed, 0 failed; PDF 28 pages, 0 errors, 0 undefined, 0 overfull.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 07:01:36 +01:00

85 lines
3.5 KiB
Python

"""The protocol tables under the single criterion of sweep_uniform.json (revision point 3), next
to the numbers the paper printed under the published-root criterion.
python -u report_uniform.py
"""
from __future__ import annotations
import json
from rescore_uniform import load_uniform
APRIME = "pure+extP+contra+flatanalogmempt+exp+half+close+sub.ratio.derived3"
def rows(path):
return {r["label"]: r for r in load_uniform(path)}
def old(path):
with open(path, encoding="utf8") as fh:
return {r["label"]: r for r in json.load(fh)}
def cost(v):
return v[0] if v[1] else 200
def wtl(a, b, s):
ps = list(a[s]["per"])
w = sum(cost(a[s]["per"][p]) < cost(b[s]["per"][p]) for p in ps)
l = sum(cost(a[s]["per"][p]) > cost(b[s]["per"][p]) for p in ps)
return w, len(ps) - w - l, l
def rank(R, s):
return sorted(R.values(), key=lambda r: (r[s]["n"] - r[s]["solved"], r[s]["total"]))
def main():
U, O = rows("sweep_full.json"), old("sweep_full.json")
for s in ("APS", "CHA"):
print(f"\n== {s}: top 12 of {len(U)} under the single criterion (old total in brackets)")
for i, r in enumerate(rank(U, s)[:12], 1):
lb = r["label"]
print(f" {i:2d}. {lb:<34} solved {r[s]['solved']:3d}/{r[s]['n']} total {r[s]['total']:5d}"
f" ({O[lb][s]['total']}) over {r[s]['over']}")
pos = {r["label"]: i for i, r in enumerate(rank(U, s), 1)}
for lb in ("pure.ratio.derived3.project", "chandrupatla", "toms748", "brent",
"itp_oracle", "itp", "bisection"):
print(f" place {pos[lb]:3d}: {lb:<30} {U[lb][s]['total']:5d} ({O[lb][s]['total']})"
f" solved {U[lb][s]['solved']}")
base, ch = U["pure.ratio.derived3.project"], U["chandrupatla"]
print("\nbase rule vs Chandrupatla, failures charged:",
{s: wtl(base, ch, s) for s in ("APS", "CHA")})
A = rows("sweep_aprime.json")
ap = A[f"{APRIME}.project"]
print(f"\nTable 8 under the single criterion: A' {ap['APS']['total']} / {ap['CHA']['total']}"
f" earned {A[APRIME + '.credit']['APS']['total']} / {A[APRIME + '.credit']['CHA']['total']}")
for opp in ("chandrupatla", "toms748", "brent", "itp_oracle", "itp", "bisection"):
o = U[opp]
print(f" {opp:<14} {o['APS']['total']:5d} {o['CHA']['total']:5d} "
f"A' vs: APS {wtl(ap, o, 'APS')} CHA {wtl(ap, o, 'CHA')}")
print("\nTable 5 cells (single criterion / old):")
for path, lb in (("sweep_full.json", "pure.ratio.derived3.credit"),
("sweep_slope.json", "slope.ratio.derived3.project"),
("sweep_points.json", "pure+shape+slope.ratio.derived3.safe"),
("sweep_direction.json", "pure+dissim+slope.ratio.derived3.project"),
("sweep_combo.json", "pure+shape+dissim+slope.ratio.derived3.safe")):
try:
r, o = rows(path)[lb], old(path)[lb]
print(f" {lb:<46} {r['APS']['total']:5d} {r['CHA']['total']:5d} "
f"({o['APS']['total']} {o['CHA']['total']}) over {r['APS']['over'] + r['CHA']['over']}")
except KeyError:
print(f" {lb}: label not in {path}")
S = rows("sweep_aprime_s.json")
print("\nTable 9a protocol column (single criterion / old):")
So = old("sweep_aprime_s.json")
for lb, r in S.items():
print(f" {r['spec'][1]:<11} {r['APS']['total'] + r['CHA']['total']:6d} "
f"({So[lb]['APS']['total'] + So[lb]['CHA']['total']})")
if __name__ == "__main__":
main()