From bfa23b223d8db68e64ef48bce3fff24d01ed2533 Mon Sep 17 00:00:00 2001 From: Valeri Sitnikov Date: Mon, 21 Sep 2026 21:27:06 +0100 Subject: [PATCH] PREREG before install and run: comparison with ModAB via the authors' own package pymodab 1.0.9 (native wrapper of their C code); the same stopping rule as every rival (aTol 1e-12, rTol 8.9e-16, no |f| stop - read in ModAB.c), evaluations counted by our wrapper, budget 200. A' and ModAB frozen. M1 on the fourth corpus (total and sign test), M2-M4 reported (six corpora, paper protocol, guarantee, ModAB's own Roots.jl benchmark). Priority note: ModAB's linearity check at the midpoint is a precursor of our exit judgment, named in 8.6 whatever the outcome. Co-Authored-By: Claude Opus 5 --- PREREG_modab_2026-09-21.md | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 PREREG_modab_2026-09-21.md diff --git a/PREREG_modab_2026-09-21.md b/PREREG_modab_2026-09-21.md new file mode 100644 index 0000000..7548830 --- /dev/null +++ b/PREREG_modab_2026-09-21.md @@ -0,0 +1,45 @@ +# PREREG — сравнение с ModAB (модифицированный Андерсон–Бьорк) + +Составлено до установки пакета и до прогона, ветка `signfix-and-gates`. Валерий: «пред-регистрируй и +проверяй сравнение с ModAB». + +## Соперник — библиотека авторов, не наш перенос + +ModAB [Ganchovski & Traykov 2023; Ganchovski, Smith, Rackauckas, Tomov, Traykov, *Algorithms* 19, 332, +2026] — берётся **официальный пакет авторов** `pymodab` 1.0.9 (PyPI; нативное расширение над их +C-кодом `C/src/ModAB.c`). Урок Чандрупатлы: своя реализация соперника несёт риск ошибки в его пользу +или против него; библиотеку читатель может проверить. + +**Остановка — та же, что у всех.** ModAB останавливается, когда `x2 − x1 ≤ aTol + rTol·|x3|`, или на +точном нуле f; по малости |f| он не останавливается (прочитано в C-коде). Ставим `aTol = 10⁻¹²`, +`rTol = 8.9·10⁻¹⁶` — ровно те допуски, что получает библиотечный Чандрупатла. Вызовы f считает наша +обёртка (как у всех соперников); сверяется с `get_evaluation_count()` пакета. Бюджет: `max_iter = 200`; +прогон, потративший больше 200 вызовов, считается неудачей и оплачивается 200 (как у всех). + +**A′ заморожен** (код `8027d7f` + исправление `_local_order`, которое A′ не затрагивает) и не меняется; +ModAB — тоже. Ничего не выбирается по результату. + +## Где сравниваем + +1. Протокол статьи (§4): APS 154, Chandrupatla 45, опубликованные корни. +2. Все шесть корпусов §9 с единым критерием (смена знака в пределах 10⁻⁶). +3. Отдельно — родной эталон ModAB: Roots.jl f01–f91 (из эталона авторов ModAB) — все 91 и 78 вне + выборки разработки. + +## Критерии + +| # | сообщается / ПРОЙДЕНО, если | +|---|---| +| **M1** | **корпус 4** (единственный, где A′ проверен один раз после заморозки): сумма A′ меньше, чем у ModAB, **и** по задачам побед больше, чем поражений, знаковый тест p < 0.05 | +| **M2** | каждый из шести корпусов и протокол статьи: суммы, по задачам (w/t/l, p) — сообщается | +| **M3** | гарантия: число нарушений границы 2⌈log₂(w/xtol)⌉ + 4 у ModAB — сообщается | +| **M4** | родной эталон ModAB (Roots.jl, 91 и 78): кто впереди — сообщается | + +**Вывод «A′ лучше ModAB»** — только при M1; на остальных корпусах — описательно, по корпусу. Если +ModAB где-то сильнее, это пишется в статье так же, как про Чандрупатлу. В статью ModAB входит строкой в +таблицы 8 и 10 при любом исходе. + +**Замечание, записано до прогона (приоритет).** Переключатель ModAB с деления на интерполяцию сравнивает +f в середине с прямой через концы, `|ym − y3| < k·(|y3| + |ym|)`, k = r² — та же идея, что наше +суждение выхода из режима (f в точке деления: ближе к прямой или к нулю). Это предшественник; в §8.6 +называется независимо от исхода сравнения.