PREREG_flat_exp_limit outcome: ACCEPTED (server numbers equal to the smoke in every projection cell; 0 violations in the guaranteed family).

Translation limit of the analogy (f shrank, x-scale did not -> m = inf):
  defect + remembered + point + exp        APS 2531  CHA 1972  both 4503
  G2 + defect + remembered + point + exp   APS 2588  CHA 1997  both 4585
  G2 + contra + remembered + point + exp   APS 2773  CHA 2073  both 4846
  Chandrupatla                             APS 2787  CHA 2441  both 5228
Per problem against Chandrupatla now SIGNIFICANT ON BOTH SETS: G2+contra+rem+pt+exp APS 98/18/37 p=1.5e-7, CHA 28/3/9 p=0.0026; defect+rem+pt+exp APS 86/20/47 p=9e-4, CHA 27/3/10 p=0.0076.
NOT where predicted: fun9 only -1..-3; the gain is on the flat families (x^9 177 -> 161, x^19 339 -> 167).
Server regression x2: 1179 passed, 1 failed = the paper-number check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
vvs
2026-09-21 18:44:23 +01:00
co-authored by Claude Opus 5
parent e887691d09
commit baa93963cf
8 changed files with 112 additions and 6 deletions
+14 -3
View File
@@ -607,7 +607,7 @@ def _config3(x, fx, xp, fp, xp2, fp2):
return xi, phi, abs(x - xp), abs(fx - fp)
def _analogy_order(cur, past):
def _analogy_order(cur, past, translation=False):
"""The order m of the analogous pair, or None when the configuration is not nearer to
its own past than to the line phi = xi (or the pair's scales are undefined). The judgment
is ordinal; m = ln(f ratio) / ln(x ratio) is read, not chosen.
@@ -623,6 +623,12 @@ def _analogy_order(cur, past):
if best[2] <= 0.0 or best[3] <= 0.0 or cur[2] <= 0.0 or cur[3] <= 0.0:
return None
lx, lf = cur[2] / best[2], cur[3] / best[3]
if translation and math.isfinite(lx) and math.isfinite(lf) and 0.0 < lf < 1.0 <= lx:
# PREREG_flat_exp_limit 2026-09-21. f shrank while the step in x did not: the pair
# is similar by TRANSLATION (exp(x - 1) = exp(x)/e), the limit of scaling as the
# order grows without bound - steeper than any power. m = inf, the boundary of the
# same definition, not a new constant.
return math.inf
if not (math.isfinite(lx) and math.isfinite(lf)) or lx == 1.0 or lf <= 0.0:
return None
return math.log(lf) / math.log(lx)
@@ -758,11 +764,15 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived",
# category variables below then carry the same string the old tests compared.
if "+" in prestep:
parts = prestep.split("+")
cats = ({"defect"}, {"contra"}, {"flatanalog", "flatanalogmem", "flatanalogpt",
cats = ({"defect"}, {"contra"}, {"exp"}, {"flatanalog", "flatanalogmem", "flatanalogpt",
"flatanalogmempt"})
if (len(parts) != len(set(parts)) or any(not any(p in c for c in cats) for p in parts)
or any(sum(p in c for p in parts) > 1 for c in cats)):
raise ValueError(f"unknown composite prestep {prestep!r}")
if "exp" in parts and not any(p.startswith("flatanalog") for p in parts):
# the translation limit changes how the analogy reads its order; without the
# flat regime there is no analogy to read (PREREG_flat_exp_limit)
raise ValueError("prestep component 'exp' needs a flatanalog* component")
elif prestep not in ("none", "progress", "slope", "band", "defect", "simpair", "flat",
"flat2", "flatcreep", "flatstick", "flatstickmid", "flatstickexit",
"flatjudge", "flatanalog", "flatanalogmem", "contra",
@@ -776,6 +786,7 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived",
flat_mem = pre_flat in ("flatanalogmem", "flatanalogmempt")
flat_pt = pre_flat in ("flatanalogpt", "flatanalogmempt")
pre_contra = "contra" in parts
pre_exp = "exp" in parts # PREREG_flat_exp_limit: translation similarity, m = inf
if pre_dec != "none" and scale not in (
"derived3", "derived3_cap", "derived3_m", "bracket", "far"):
# the decision reads a TRIPLE; under the two-point scale there is no third point
@@ -1065,7 +1076,7 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived",
cur = _config3(x, fx, x_prev, f_prev, x_prev2, f_prev2)
flag = (sticky_m is None and last_model and f_prev != 0.0
and fx / f_prev >= 0.25)
m_pair = _analogy_order(cur, configs)
m_pair = _analogy_order(cur, configs, translation=pre_exp)
steep = m_pair is not None and m_pair >= 2.0
if flat_mem:
if steep: