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
moving the proven bracket, so bracket progress rejects steps that were
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.}
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
+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:
raise ValueError(f"unknown similarity {similarity!r}")
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}")
if space not in SPACES:
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}")
if direction not in DIRECTIONS:
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
# two-point scale would change nothing and hide that
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
# else would hide that, so the call fails instead
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:
slope = _slope3(x, fx, x_prev, f_prev, x_prev2, f_prev2)
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":
# REFUTED as an improvement - kept for reproducibility.
# 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]
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):
"""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)."""
@@ -264,10 +273,12 @@ def main():
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
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
pointsmode = "--points" in sys.argv # mode A: triple by shape
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_direction(smoke) if dirmode 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
# against, so the log grid never writes into it
if combomode or pointsmode or dirmode:
base = ("sweep_combo" if combomode else
if capmode or combomode or pointsmode or dirmode:
base = ("sweep_cap" if capmode else
"sweep_combo" if combomode else
"sweep_points" if pointsmode else "sweep_direction")
out = f"{base}_smoke.json" if smoke else f"{base}.json"
with open(out, "w", encoding="utf8") as fh: