Valeri's objection measured: the principle is right (a similarity step should be large far away and small near), and our sigma = |f'|D defeats it — at x=1e4 on a 2e4 bracket the normalised residual is 0.167, so S=0.833 'similar' and the step is small five thousand step-lengths from the root. Selecting sigma = min(|f'|D, max|f| at the ends) — no new constant — improves 403 to 390 on eight hand-picked wide problems but is WORSE over the grid: APS 3288 vs 2726, CHA 3111 vs 2683, so the mode is rejected by its pre-registered rule. Its extra solves are two fun7 problems landing inside the flat zero region, i.e. the scoring artefact and not a capability. Written into Negative results as the answer to the natural objection

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
vvs
2026-09-21 00:19:03 +01:00
co-authored by Claude Opus 5
parent 08ffa42e98
commit cc2c499f63
8 changed files with 167 additions and 6 deletions
+53
View File
@@ -0,0 +1,53 @@
# PREREG — масштаб как ВЫБОР между двумя посчитанными (`derived3_cap`)
Составлено до полного прогона. Основание — возражение Валерия 2026-09-21: «если бы шаг формировала
похожесть, мы меняли бы шаг с очень большого на более мелкий по мере приближения к цели».
## 1. Почему возражение верно и что оно вскрыло
Шаг есть `(1 − S(z))·D` с `z = |f|/σ` и `σ = |slope|·D`. Проверка на `fun1.4` в точке `x = 10⁴`
(`f ≈ 10¹²`, `f′ ≈ 3·10⁸`, ньютоновская длина ≈ 3333, `D ≈ 2·10⁴`): `z = 0.167`, то есть
**`S = 0.833` — «похоже»** — и шаг мал, хотя до корня около 5000 его собственных длин.
Причина: деление остатка на `|slope|·D` **нормирует непохожесть самой скобкой**, поэтому похожесть
читает «какую долю скобки составляет ньютоновский шаг», а не «далеко ли я». Принцип «крупный шаг
далеко, мелкий близко» формулой не реализован — он требует `σ`, не зависящего от `D`.
## 2. Что проверяется
`σ = min(|slope|·D, max(|F_A|, |F_B|))` — **выбор между двумя уже посчитанными** масштабами:
значением на концах скобки и наклонным. Ни новой константы, ни порога: `min` по имеющемуся.
Ожидаемое поведение: далеко на широкой скобке минимум даёт значение на конце ⇒ `z ≈ 1` ⇒ шаг во всю
скобку; у корня минимум даёт наклонный ⇒ ньютоновское поведение и прежний порядок.
**Режим:** `scale="derived3_cap"`; прежние шкалы и поведение по умолчанию не тронуты.
## 3. Точка отсчёта и цели
Сравнение — против той же конфигурации без новой шкалы (`slope`-гейт + `dissimilar`):
APS **2726**, CHA **2785** (по-наборно 2683), два набора **5511**, 193/199, `over2x = 0`.
Лучшее на APS у нас — **2527** (`shape`-чтение).
| величина | цель |
|---|---|
| APS-154 | **≤ 2726** (не хуже точки отсчёта); идеально ≤ 2527 |
| CHA-45 | **< 2683** (улучшение против нашего лучшего) |
| два набора | **< 5511** |
| решено | ≥ 193/199 |
| гарантия | `over2x = 0` |
## 4. Предсказания и фальсификаторы
| # | Предсказание | ФАЛЬСИФИКАТОР → вывод |
|---|---|---|
| **K1** | CHA улучшается (<2683) | не улучшается → выбор масштаба не бьёт в измеренную причину (недолёт линейной модели) |
| **K2** | APS не ухудшается (≤2726) | ухудшается → тот же трейд «широкие за счёт узких», четвёртый раз; режим отвергается |
| **K3** | гарантия цела | нарушена → немедленное закрытие |
| **K4** | порядок сходимости у корня не падает: наблюдаемый порядок на узких задачах не ниже, чем у `derived3` | падает → выбор `min` мешает концовке, и это записывается |
🔴 **Оговорка о смещении:** предварительная проба на 8 **широких** задачах (403 → 390, 4 лучше / 3
хуже / 1 вровень) выбрана мной под механизм и **свидетельством не является**. Решает полный прогон по
всей сетке, где широкие задачи составляют меньшинство.
**Правило остановки:** K2 или K3 ложны ⇒ режим не принимается. K1 ложна ⇒ измеренная причина
(недолёт линейной модели) выбором масштаба не устраняется, и это пишется прямо.
Binary file not shown.
+16
View File
@@ -677,6 +677,22 @@ canonical set against $2527$ --- a difference of $1922$ evaluations for one
choice of criterion. A secant step routinely collapses the error while barely choice of criterion. A secant step routinely collapses the error while barely
moving the proven bracket, so bracket progress rejects steps that were moving the proven bracket, so bracket progress rejects steps that were
excellent; this is the same mechanism that makes the bracket guard cost $7260$. excellent; this is the same mechanism that makes the bracket guard cost $7260$.
\item \textbf{Making the scale independent of the bracket does not help either.}
The natural objection to the derived scale is that it defeats the very principle
of a similarity step: with $\sigma=|f'|D$ the normalised residual is
$|f|/(|f'|D)$, which on the $2\times10^4$-wide bracket of $x^3-2x-5$ at
$x=10^4$ equals $0.167$, so $S=0.833$ --- ``similar'' --- and the step is small
although the root is some five thousand step-lengths away. The similarity is
reading what fraction of the \emph{bracket} the Newton step is, not how far the
iterate is from the root. Selecting the scale between the two quantities already
computed, $\sigma=\min(|f'|D,\max(|f(A)|,|f(B)|))$ --- no new constant, a
\texttt{min} over what is in hand --- does give a full-bracket step far away and
Newton's step near the root, and on eight hand-picked wide problems it improves
$403$ evaluations to $390$. Over the whole grid it is worse on both sets:
$3288$ on the canonical set against $2726$, and $3111$ on the wide-bracket set
against $2683$. Its apparent extra solves ($194$ instead of $193$) are two
\texttt{fun7} problems where it lands inside the flat zero region close enough to
satisfy the harness --- the artefact of \S\ref{sec:fun7}, not a capability.
\item \textbf{A logarithmic change of variable does not buy the wide brackets.} \item \textbf{A logarithmic change of variable does not buy the wide brackets.}
Working in $u=\operatorname{sign}(x-c)\log(1+|x-c|/\varepsilon_x)$ makes the Working in $u=\operatorname{sign}(x-c)\log(1+|x-c|/\varepsilon_x)$ makes the
step multiplicative, which is the right diagnosis of the flat families --- CHA step multiplicative, which is the right diagnosis of the flat families --- CHA
+64
View File
@@ -0,0 +1,64 @@
sweep: 63 configurations x 199 problems (FULL)
10/63 done, 1s elapsed
20/63 done, 1s elapsed
30/63 done, 1s elapsed
40/63 done, 1s elapsed
50/63 done, 1s elapsed
60/63 done, 1s elapsed
63/63 done, 2s elapsed
wrote sweep_cap.json (2s total)
====================================================================================
APS: 154 problems (top 20 of 63)
====================================================================================
configuration solved total fev over 2x
------------------------------------------------------------------------------------
pure+dissim+slope.exp_abs.derived3_cap.none 153/154 3288 0
pure+dissim+slope.exp_abs.derived3_cap.project 153/154 3288 0
pure+dissim+slope.exp_abs.derived3_cap.step 153/154 3385 0
pure+dissim+slope.exp_abs.derived3_cap.safe 153/154 3385 0
pure+dissim+slope.rational.derived3_cap.step 153/154 3460 0
pure+dissim+slope.rational.derived3_cap.safe 153/154 3460 0
pure+dissim+slope.rational.derived3_cap.none 153/154 3497 0
pure+dissim+slope.rational.derived3_cap.project 153/154 3497 0
pure+dissim+slope.exp_abs.derived3_cap.bracket 153/154 3537 0
pure+dissim+slope.exp_abs.derived3_cap.both 153/154 3619 0
pure+dissim+slope.exp_abs.derived3_cap.credit 153/154 4125 0
pure+dissim+slope.ratio.derived3_cap.bracket 153/154 4333 0
pure+dissim+slope.ratio.derived3_cap.both 153/154 4903 0
pure+dissim+slope.rational.derived3_cap.credit 153/154 5001 0
pure+dissim+slope.ratio.derived3_cap.step 153/154 5044 0
pure+dissim+slope.ratio.derived3_cap.safe 153/154 5044 0
pure+dissim+slope.sqrt.derived3_cap.step 153/154 6184 0
pure+dissim+slope.sqrt.derived3_cap.safe 153/154 6184 0
pure+dissim+slope.sqrt.derived3_cap.both 153/154 6216 0
pure+dissim+slope.sqrt.derived3_cap.bracket 153/154 6580 0
====================================================================================
CHA: 45 problems (top 20 of 63)
====================================================================================
configuration solved total fev over 2x
------------------------------------------------------------------------------------
pure+dissim+slope.sqrt.derived3_cap.none 42/45 2969 0
pure+dissim+slope.sqrt.derived3_cap.project 41/45 3111 0
pure+dissim+slope.exp_abs.derived3_cap.step 40/45 2658 0
pure+dissim+slope.exp_abs.derived3_cap.safe 40/45 2658 0
pure+dissim+slope.exp_abs.derived3_cap.both 40/45 2689 0
pure+dissim+slope.rational.derived3_cap.step 40/45 2790 0
pure+dissim+slope.rational.derived3_cap.safe 40/45 2790 0
pure+dissim+slope.exp_abs.derived3_cap.bracket 40/45 2796 0
pure+dissim+slope.exp_abs.derived3_cap.none 40/45 2808 0
pure+dissim+slope.exp_abs.derived3_cap.project 40/45 2808 0
pure+dissim+slope.ratio.derived3_cap.both 40/45 2906 0
pure+dissim+slope.ratio.derived3_cap.step 40/45 2959 0
pure+dissim+slope.ratio.derived3_cap.safe 40/45 2959 0
pure+dissim+slope.rational.derived3_cap.none 40/45 2970 0
pure+dissim+slope.rational.derived3_cap.project 40/45 2970 0
pure+dissim+slope.ratio.derived3_cap.bracket 40/45 2978 0
pure+dissim+slope.rational.derived3_cap.credit 40/45 2982 0
pure+dissim+slope.exp_abs.derived3_cap.credit 40/45 2991 0
pure+dissim+slope.cbrt.derived3_cap.both 40/45 3041 0
pure+dissim+slope.sqrt.derived3_cap.step 40/45 3066 0
====================================================================================
THE STAGE-0C LAW ACROSS THE GRID
====================================================================================
+17 -3
View File
@@ -505,7 +505,7 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived",
if similarity not in PURE_SIMS: if similarity not in PURE_SIMS:
raise ValueError(f"unknown similarity {similarity!r}") raise ValueError(f"unknown similarity {similarity!r}")
if scale not in ("derived", "derived3", "derived_rho", "derived3_rho", if scale not in ("derived", "derived3", "derived_rho", "derived3_rho",
"derived3_m", "start", "bracket"): "derived3_m", "derived3_cap", "start", "bracket"):
raise ValueError(f"unknown scale {scale!r}") raise ValueError(f"unknown scale {scale!r}")
if space not in SPACES: if space not in SPACES:
raise ValueError(f"unknown space {space!r}") raise ValueError(f"unknown space {space!r}")
@@ -515,11 +515,12 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived",
raise ValueError(f"unknown points rule {points!r}") raise ValueError(f"unknown points rule {points!r}")
if direction not in DIRECTIONS: if direction not in DIRECTIONS:
raise ValueError(f"unknown direction {direction!r}") raise ValueError(f"unknown direction {direction!r}")
if points == "shape" and scale not in ("derived3", "derived3_rho", "derived3_m"): if points == "shape" and scale not in ("derived3", "derived3_rho", "derived3_m",
"derived3_cap"):
# the triple only exists for the three-point scale; selecting one under a # the triple only exists for the three-point scale; selecting one under a
# two-point scale would change nothing and hide that # two-point scale would change nothing and hide that
raise ValueError("points='shape' requires a three-point scale (derived3*)") raise ValueError("points='shape' requires a three-point scale (derived3*)")
if prestep == "slope" and scale not in ("derived", "derived3"): if prestep == "slope" and scale not in ("derived", "derived3", "derived3_cap"):
# there is no slope to judge under a chosen or bracket scale; judging something # there is no slope to judge under a chosen or bracket scale; judging something
# else would hide that, so the call fails instead # else would hide that, so the call fails instead
raise ValueError("prestep='slope' requires scale in {'derived', 'derived3'}") raise ValueError("prestep='slope' requires scale in {'derived', 'derived3'}")
@@ -603,6 +604,19 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived",
else: else:
slope = _slope3(x, fx, x_prev, f_prev, x_prev2, f_prev2) slope = _slope3(x, fx, x_prev, f_prev, x_prev2, f_prev2)
sc = abs(slope) * abs(far - x) sc = abs(slope) * abs(far - x)
elif scale == "derived3_cap":
# Valeri, 2026-09-21: "if the similarity formed the step, the step would be
# large far from the target and small near it". It does not, and the reason
# is the normalisation: with sigma = |slope| * D the similarity reads "what
# fraction of the BRACKET the Newton step is", not "how far am I". On a
# 2e4-wide bracket of x^3-2x-5 at x = 1e4 that fraction is 0.167, so S =
# 0.833 - "similar" - and the step is small exactly where it should be large.
# The scale is therefore SELECTED between the two already-computed ones:
# far away the value scale of the bracket ends is the smaller and the step
# opens up; near the root the slope scale is the smaller and Newton (and the
# order) returns. A min over what is in hand - no constant, no threshold.
slope = _slope3(x, fx, x_prev, f_prev, x_prev2, f_prev2)
sc = min(abs(slope) * abs(far - x), max(abs(FA), abs(FB)))
if scale == "derived3_m": if scale == "derived3_m":
# REFUTED as an improvement - kept for reproducibility. # REFUTED as an improvement - kept for reproducibility.
# The DERIVATION holds: dropping the linearity # The DERIVATION holds: dropping the linearity
+1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+15 -3
View File
@@ -198,6 +198,15 @@ def build_grid_log(smoke):
for sim in sims for sc in ("derived", "derived3") for gu in guards] for sim in sims for sc in ("derived", "derived3") for gu in guards]
def build_grid_cap(smoke):
"""Scale as a SELECTION between the two computed ones (PREREG 2026-09-21): identical to
the slope+dissimilar configuration except scale = derived3_cap, so one thing changes."""
sims = ["ratio", "sqrt"] if smoke else sorted(PURE_SIMS)
guards = ("credit", "safe") if smoke else GUARD_MODES
return [("pure", sim, "derived3_cap", gu, "x", "slope", "recent", "dissimilar")
for sim in sims for gu in guards]
def build_grid_combo(smoke): def build_grid_combo(smoke):
"""A+B together (PREREG 2026-09-21 §2: licensed only because each mode alone improved """A+B together (PREREG 2026-09-21 §2: licensed only because each mode alone improved
APS — A 2527 and B 2726 against the published 2806).""" APS — A 2527 and B 2726 against the published 2806)."""
@@ -264,10 +273,12 @@ def main():
logmode = "--log" in sys.argv # the u-space grid, written to its OWN file logmode = "--log" in sys.argv # the u-space grid, written to its OWN file
gatemode = "--gate" in sys.argv # the pre-step gate grid, likewise gatemode = "--gate" in sys.argv # the pre-step gate grid, likewise
slopemode = "--slope" in sys.argv # the slope-stability gate grid slopemode = "--slope" in sys.argv # the slope-stability gate grid
capmode = "--cap" in sys.argv # scale selected between the two computed ones
combomode = "--combo" in sys.argv # modes A and B together combomode = "--combo" in sys.argv # modes A and B together
pointsmode = "--points" in sys.argv # mode A: triple by shape pointsmode = "--points" in sys.argv # mode A: triple by shape
dirmode = "--direction" in sys.argv # mode B: far end by dissimilarity dirmode = "--direction" in sys.argv # mode B: far end by dissimilarity
specs = (build_grid_combo(smoke) if combomode else specs = (build_grid_cap(smoke) if capmode else
build_grid_combo(smoke) if combomode else
build_grid_points(smoke) if pointsmode else build_grid_points(smoke) if pointsmode else
build_grid_direction(smoke) if dirmode else build_grid_direction(smoke) if dirmode else
build_grid_slope(smoke) if slopemode else build_grid_slope(smoke) if slopemode else
@@ -288,8 +299,9 @@ def main():
# the published sweep_full.json is what verify_article.py checks the paper # the published sweep_full.json is what verify_article.py checks the paper
# against, so the log grid never writes into it # against, so the log grid never writes into it
if combomode or pointsmode or dirmode: if capmode or combomode or pointsmode or dirmode:
base = ("sweep_combo" if combomode else base = ("sweep_cap" if capmode else
"sweep_combo" if combomode else
"sweep_points" if pointsmode else "sweep_direction") "sweep_points" if pointsmode else "sweep_direction")
out = f"{base}_smoke.json" if smoke else f"{base}.json" out = f"{base}_smoke.json" if smoke else f"{base}.json"
with open(out, "w", encoding="utf8") as fh: with open(out, "w", encoding="utf8") as fh: