From 3c92d610d6b89ab4c7b5375708c0d9ae19e47efe Mon Sep 17 00:00:00 2001 From: Valeri Sitnikov Date: Mon, 21 Sep 2026 15:45:03 +0100 Subject: [PATCH] PREREG before code and run: both directions. (1) defect decision combined with the flat regime (analogy / remembered analogy) for canonical headroom; (2) contra: halve when the local secant's sign contradicts the bracket's - the fun9 cause (a near-cancelling left end, |f| doubling 17 steps in a row); traces: 3/5 fun9, 7/154 canonical, 0 flat. Composite prestep 'a+b+c', one per category; factorial grid on the proposed rule +/- G2; decided on the smoke; goal = below Chandrupatla on both; ablation of every component of the best cell. Co-Authored-By: Claude Opus 5 --- PREREG_defect_contra_flat_2026-09-21.md | 51 +++++++++++++++++++++++ diag_fun9_slope_sign.py | 55 +++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 PREREG_defect_contra_flat_2026-09-21.md create mode 100644 diag_fun9_slope_sign.py diff --git a/PREREG_defect_contra_flat_2026-09-21.md b/PREREG_defect_contra_flat_2026-09-21.md new file mode 100644 index 0000000..8d69bc1 --- /dev/null +++ b/PREREG_defect_contra_flat_2026-09-21.md @@ -0,0 +1,51 @@ +# PREREG — оба направления: «дефект» с плоским режимом и противоречие знака на fun9 + +Составлено до кода и до прогона, ветка `signfix-and-gates`. Валерий: «проверь оба направления». + +## Основание + +**Направление 1 — запас на канонических.** Лучший принятый вход по аналогии (с Г2) — канонические +2780, широкие 2625; с запомненной аналогией широкие 2548, но канонические 2787 (не принят: +7 от +пяти лишних ложных входов). Решение в месте «дефект» (|φ − ξ| > min(ξ, 1 − ξ) → делить) одно даёт +канонические **2523** (широкие 3210). Если выигрыши складываются, запас в 264 покрывает лишние входы. + +**Направление 2 — fun9** (`diag_fun9_slope_sign.py`): у левого конца [2·10⁻⁴, …] два члена почти +гасятся, f(a) ≈ −1 против 5·10¹¹ справа; метод читает корень у левого конца, а f ныряет до −3.7·10⁴. +17 шагов подряд |f| удваивается: **локальный наклон по знаку противоречит скобке** (f должна расти +от отрицательного конца к положительному). По трассам: противоречие в 3 из 5 задач fun9 (19 +состояний), в 7 из 154 канонических (29 из 1608 состояний), в 1 задаче fun1, **ни разу** на +плоских и остальных. + +## Правила (новых констант нет) + +- `defect` — как есть (`_decide_refuse`). +- `contra` (новое): если знак локальной секанты (f_x − f_prev)/(x − x_prev) противоположен знаку + секанты скобки (F_B − F_A)/(B − A), этот шаг — середина. Сравниваются два знака; порога нет. + Одношаговое решение (не режим). +- `flatanalog`, `flatanalogmem` — как приняты/проверены. +- Составной `prestep` через «+»: по одному из категорий {решение: defect}, {противоречие: contra}, + {плоский режим: flatanalog | flatanalogmem}. Порядок: решение → память и режим плоских (память + пополняется в **каждом** состоянии, даже если шаг уже отдан середине) → противоречие. + Одиночные режимы ведут себя в точности как раньше (тесты-пины). + +## Проверка + +Решение по **смоуку** (все 199 задач), сервер — подтвердить, если цель достигнута. Ячейки: +предложенный метод (проекция) и он же с Г2, для `prestep` ∈ + + none, defect, contra, flatanalog, flatanalogmem, + defect+contra, defect+flatanalog, defect+flatanalogmem, contra+flatanalog, contra+flatanalogmem, + defect+contra+flatanalog, defect+contra+flatanalogmem + +| # | ПРОЙДЕНО, если | +|---|---| +| **C1** | ячейка: широкие ниже, чем без решений (3220; с Г2 — 3169) | +| **C2** | ячейка: канонические не выше, чем без решений (2806; с Г2 — 2782) | +| **C3** | гарантия: 0 нарушений, решено ≥ 193 | +| **ЦЕЛЬ** | канонические < **2787** и широкие < **2441** (Чандрупатла) | +| **C4 (абляция)** | для ячейки, достигшей цели (или лучшей по сумме): снятие каждой составляющей по одной — её вклад Δ сообщается; составляющая с Δ ≥ 0 на обоих наборах **не заслужена** и из предложения убирается | + +**Правило остановки:** ячейка принимается при C1, C2, C3. Цель сообщается отдельно; если ни одна +ячейка её не достигла — сообщается, на сколько и на каком наборе не хватило. +По каждому направлению отдельно: принят ли `contra` (есть ли ячейка с ним, лучше той же без него на +широких и не хуже на канонических) и складывается ли `defect` с плоским режимом. diff --git a/diag_fun9_slope_sign.py b/diag_fun9_slope_sign.py new file mode 100644 index 0000000..68045a7 --- /dev/null +++ b/diag_fun9_slope_sign.py @@ -0,0 +1,55 @@ +"""Why the proposed rule loses on fun9 (exp(x) - 2 - 0.01/x^2 + 2e-6/x^3, brackets from +[2e-4, 1] to [2e-4, 81]) - and whether the cause is a distinguishing sign. + +On fun9.4 the two negative powers nearly cancel at the left end: f(2e-4) = -1 against +5e11 at the right end, so the rule reads the root as near the left end, while f dives to +-3.7e4 before it turns up to the root at 0.703. 17 model steps in a row DOUBLE |f|: the +local slope has the sign opposite to the one the bracket demands (f must rise from its +negative end to its positive end). + +The sign considered: the local secant of the last two points, (fx - fp)/(x - xp), against +the bracket's, (FB - FA)/(B - A). Opposite signs = the local picture contradicts the +bracket. Per state (trace hook, proposed rule, no regime) and per problem, per group. +Nothing in the method changes. + + python -u diag_fun9_slope_sign.py +""" +from __future__ import annotations + +from collections import defaultdict + +from simroot.pure import pure_root +from sweep_full import MAXFEV, XTOL, load_problems + +FLAT = ("fun3", "fun4", "fun5", "fun6") + + +def main(): + per = defaultdict(lambda: [0, 0, 0, 0]) # problems, with any contradiction, states, contradicting + for s, pid, f, a, b, _root in load_problems(): + st = {"trace": []} + pure_root(f, a, b, XTOL, MAXFEV, similarity="ratio", scale="derived3", + guard="project", stats=st) + fam = pid.split(".")[0] + g = "APS" if s == "APS" else ("CHA-flat" if fam in FLAT else f"CHA-{fam}") + bad = 0 + for t in st["trace"]: + if t["x"] == t["xp"]: + continue + loc = (t["fx"] - t["fp"]) / (t["x"] - t["xp"]) + brk = (t["FB"] - t["FA"]) / (t["B"] - t["A"]) + per[g][2] += 1 + if loc != 0.0 and (loc > 0.0) != (brk > 0.0): + bad += 1 + per[g][0] += 1 + per[g][1] += bad > 0 + per[g][3] += bad + print(f"{'group':<10} {'problems':>8} {'any contradiction':>18} {'states':>7} {'contradicting':>14}") + for g in sorted(per): + n, anyc, sts, c = per[g] + print(f"{g:<10} {n:8d} {anyc:18d} {sts:7d} {c:14d}") + print("diag done") + + +if __name__ == "__main__": + main()