Files
vvsandClaude Opus 5 1b6c626f67 Valeri's decisions (1) competitors from the library, (2) variant a. (1) Chandrupatla is scipy.optimize.elementwise.find_root, Brent is brentq, no more per-problem best_of. Our Chandrupatla stopped on a bracket twice as wide as every other method (the factor the protocol corrects for ITP); fixed (+0.5*xtol) in baselines.py and in the two copies found by grep (stage16_blend, stage19_modern) and the traced mirror, and pinned: ours == library on every problem. Regenerating sweep_full.json changed exactly three rows - chandrupatla APS 2785->2787, CHA 2423->2441, brent CHA 4099->4115 - and nothing else (diff_sweeps.py: 0 unexpected).
(2) The proposed method is again the scheduled projection (2806/3220/6026), its budget multiplier DECLARED as the one free constant: the canonical total is the same for every multiplier 1.25-4, the wide-bracket one is not. The earned projection is the constant-free variant (3568/3020/6588). What the old tables hid: problem by problem the proposed rule beats Chandrupatla on the canonical set 87/24/42, exact sign test p = 9e-5, while trailing him by 0.7% in total; on the wide-bracket set he is genuinely stronger (26 to 9, p = 0.006). Gap decomposition recomputed with the library: 244 (was 262), 160 of it on the flat families (two thirds), fun1 58 (a quarter, not a third as the abstract said).

Also corrected on the way: the 'subsumed by Chandrupatla' pin claimed he is better on the worst single problem - true only with the looser tolerance (84 against the credit rule's 83 once fixed); §8.3 still called zero slack degenerate, which Table 1a refutes; §5.2's Brent figure is our pure-Python implementation and now says so. verify_article.py 286/286, 802 tests pass twice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 10:53:00 +01:00

57 lines
2.3 KiB
Python

"""What is fun7, and is it a method wall or a budget wall?
fun7.1/7.3/7.5 are solved by NO configuration in any sweep — baselines included. Either the
family is genuinely hard for every method, or MAXFEV = 200 is simply too small for it, and
those are very different facts. This asks with a larger budget.
python -u diag_fun7.py
"""
from __future__ import annotations
import math
from scipy.optimize._tstutils import _CHANDRUPATLA_TESTS_DICTS
from simroot.baselines import CHANDRUPATLA_BASELINE
from simroot.baselines import best_of, chandrupatla, chandrupatla_scipy, toms748
from simroot.pure import pure_root
from sweep_full import ACC, XTOL
CHA = CHANDRUPATLA_BASELINE # the library alone (2026-09-21)
def main():
print(f"{'problem':<10} {'bracket':>28} {'root':>14} {'decades':>8}")
probs = []
for d in _CHANDRUPATLA_TESTS_DICTS:
if not str(d["ID"]).startswith("fun7"):
continue
a, b = (float(v) for v in d["bracket"])
root = float(d["root"])
f = d["f"]
probs.append((d["ID"], f, a, b, root))
print(f"{d['ID']:<10} [{a:11.4g}, {b:11.4g}] {root:14.6g} "
f"{math.log2(abs(b - a) / XTOL):8.1f}")
for nm, val in (("f(a)", f(a)), ("f(b)", f(b)), ("f(root)", f(root)),
("f(root+1e-9)", f(root + 1e-9))):
print(f" {nm:<14} = {val:+.6e}")
for budget in (200, 2000, 20000):
print(f"\nbudget {budget}:")
for pid, f, a, b, root in probs:
x_o, n_o, ok_o = pure_root(f, a, b, XTOL, budget, similarity="ratio",
scale="derived3", guard="safe", prestep="slope",
direction="dissimilar")
x_c, n_c, ok_c = CHA(f, a, b, XTOL, budget)
x_t, n_t, ok_t = toms748(f, a, b, XTOL, budget)
good = lambda x, ok: bool(ok and math.isfinite(float(x)) # noqa: E731
and abs(float(x) - root) <= ACC)
print(f" {pid:<8} ours n={n_o:5d} {'OK' if good(x_o, ok_o) else 'fail':<4} "
f"(x={x_o:+.8g}) | CH n={n_c:5d} {'OK' if good(x_c, ok_c) else 'fail':<4} "
f"| TOMS n={n_t:5d} {'OK' if good(x_t, ok_t) else 'fail':<4}")
if __name__ == "__main__":
main()