Files
sim-numerics/PREREG_logarithmic_2026-09-20.md

124 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PREREG — логарифмическая замена переменной для широких скобок
Составлено **до** любой правки метода. Основание — `NEXT_PAPER_logarithmic.md` (записан 2026-08-24),
где уже названы цель, четыре оплаченных замерами запрета и два условия допуска. Здесь это доводится
до пред-регистрации: что считаем успехом, что провалом, и в каком порядке.
**Протокол этого проекта, который здесь обязателен:** конфигурация фиксируется **выводом, ДО того как
смотрят в рейтинг**. Числа берутся только с **Linux** (libm расходится в последнем знаке: та же SciPy
даёт TOMS 748 = 2819 на Windows против 2820 на Linux). Метод правится **добавлением режима**, ничего
из опубликованного тракта не переписывается.
---
## 1. Задача
Аддитивный шаг `|f|/|f'|` задан локальным наклоном и ничего не знает о том, сколько декад осталось до
корня. На семействах Чандрупатлы `fun3/fun4/fun5` скобка шириной до 10¹² при корне |x| ≤ 3, то есть
надо пройти двенадцать порядков. Замерено: кубический корень бьёт наше правило на всех пяти членах
`fun4` в 2.6 раза (32/32/40/47/59 против 89/93/113/125/153) — не потому, что это «другая похожесть», а
потому что его шаг есть фиксированная **доля** скобки: он марширует геометрически.
## 2. Предложение
Работать в `u = sign(x−c)·log(1 + |x−c|/s)`. Аддитивный шаг в `u` — мультипликативный в `x`, поэтому
та же похожесть, та же выведенная шкала и та же проекция-сторож дают геометрический марш **без новой
константы**, а показатель марша (который `cbrt` случайно зафиксировал на 1/3) перестаёт быть свободной
величиной.
**Вывод `c` и `s` — часть работы, а не подбор.** Они обязаны читаться из того, что метод уже считает:
концов скобки, значений `f` на них и выведенной шкалы σ. Объявленный до прогона кандидат вывода:
- `c` = конец скобки с меньшим |f| (сторона, к которой корень ближе);
- `s` = ньютоновская длина в этой точке, `|f(c)|/|f'(c)|`, оценённая секущей по концам скобки.
Если вывод даст иные `c`, `s` — фиксируются те, что следуют из вывода, **до** прогона рейтинга; выбор
«какой из вариантов лучше на наборе» запрещён (это ровно тот фолт, который проект уже оплатил в п. 1
запретов ниже).
## 3. Два условия допуска (гейты, проверяются тестами ДО рейтинга)
| # | Условие | Как проверяется |
|---|---|---|
| **G1** | преобразование **беспараметрическое**: `c` и `s` вычисляются из скобки и значений `f`, ни одной выбранной константы | грепом по реализации и тестом, что при подмене любого «магического» числа тест падает |
| **G2** | на узких скобках преобразование **тождественно с точностью до округления** | тест: при `w/s → 0` шаг в `u` совпадает со шагом в `x` до 1e-12, и на APS-154 число вызовов не меняется ни на одной задаче |
Не прошёл G1 → линия закрывается (так же закрылся фазовый детектор).
Не прошёл G2 → закрывается: широкие скобки куплены ценой канонического набора, а это трейд, на котором
провалились все прежние попытки.
## 3a. ПОПРАВКА 1 (2026-09-20, решение Валерия: вариант B)
**Что произошло:** строгий G2 («шаг в `u` совпадает со шагом в `x` до 1e-12») провален **выводом**, без
прогона, и не для одного кандидата, а для всех доступных беспараметрических единиц — марш требует
ОТНОШЕНИЯ расстояний, тождественность требует АБСОЛЮТНОЙ шкалы (разбор в `FINDINGS_logarithmic.md` §1).
**Решение (Валерий, вариант B):** строгое чтение G2 заменяется его же **измеримым** чтением, которое
уже стоит в этой пред-регистрации как L2:
> **G2′:** на APS-154 суммарная цена не растёт; ни одна задача канонического набора не становится
> дороже по вызовам `f`.
Это **ослабление** пред-регистрированного критерия после его провала — записано как ослабление, а не
как «уточнение», и принято решением, а не молча.
**Единица `s` фиксируется ВЫВОДОМ здесь и не выбирается по рейтингу:**
> `c` = конец скобки с меньшим |f| (сторона, к которой корень ближе);
> **`s` = `xtol`**.
Обоснование, а не удобство: задача преобразования — считать **декады, оставшиеся до различимости**.
Единственная длина в задаче, говорящая «ниже этого различий нет», — это `xtol`, и она приходит от
вызывающего наравне с `a`, `b`, `f`, то есть не является нашей константой. При таком выборе `u`
покрывает ровно `log(w/xtol)` единиц — ту самую величину, в которой сформулирована гарантия метода
`2⌈log₂(w/xtol)⌉+3`, так что марш становится линейным в мере собственной гарантии. Вырождения нет:
`xtol > 0` всегда, и `|x−c| = 0` даёт `u = 0`, а не деление на ноль.
Отвергнутая альтернатива (для протокола): самомасштабируемая `s = |x−c|` вырождается на первом шаге,
потому что итерат стартует в конце с меньшим |f|, то есть ровно в `c`.
**Режим требует выведенной шкалы:** `space="log"` допустим только при `scale ∈ {derived, derived3}` —
в log-пространстве нужен наклон; при прочих шкалах вызов обязан падать, а не считать молча.
## 4. Цели (записаны в `NEXT_PAPER_logarithmic.md` заранее, не подгонялись)
| величина | цель | где сейчас |
|---|---|---|
| вызовов `f` на двух наборах (APS-154 + Chandrupatla-45) | **< 6026** | 6026 |
| решённых задач | **≥ 193 из 199** | 193/199 |
| гарантия `2⌈log₂(w/xtol)⌉+3` | **не нарушена ни на одном решённом прогоне** | не нарушена |
| Chandrupatla-45 отдельно | **≤ 2857** (уровень ITP) | 3220 |
## 5. Предсказания и фальсификаторы
| # | Предсказание | ФАЛЬСИФИКАТОР → вывод |
|---|---|---|
| **L1** | на `fun3/fun4/fun5` логарифмический режим сокращает вызовы не менее чем вдвое | <1.5× → механизм не в мультипликативности шага, гипотеза неверна |
| **L2** | на APS-154 суммарная цена **не растёт** (G2) | растёт → закрытие, трейд не принимается |
| **L3** | Chandrupatla-45 ≤ 2857 | >2857 → цель ITP не достигнута; результат публикуем как отрицательный |
| **L4** | гарантия не нарушена ни на одном решённом прогоне | нарушена → закрытие немедленно, без торга |
## 6. Запреты — уже оплачены замерами, не повторять
1. Переключаться на `cbrt` по набору: 6905 против 6026 — **хуже**; `cbrt` берёт семейства `fun` и
теряет остальную Чандрупатлу (4099 против 3220).
2. Детектировать режим по отношению значений `rho = 1 − |f_n|/|f_{n−1}|`: порядок 2.000 → 0.904, цена
на канонических задачах 84 → 161.
3. Детектировать по локальному порядку `f` (`p = L/(L−ln m)`, `m = 1/(1−θ)`): вывод верен, оценщик не
резок — 27.9 % ложных против 35.8 %, это не разделение, цена +273 вызова.
4. Разделять режимы по ширине скобки: победители полностью перекрываются (наша шкала выигрывает при
ширинах от 10⁰ до 10¹²).
## 7. Порядок исполнения
1. Воспроизвести артефакт: 490 тестов + `verify_article.py` (все 72 числа статьи) — **на Linux**.
Не сошлось → сначала это, метод не трогать.
2. Реализовать режим (новый файл/режим в `simroot/`, опубликованный тракт не переписывать), написать
тесты гейтов G1 и G2 **до** прогона рейтинга.
3. Прогнать `sweep_full.py` на сервере, затем `report_sweep.py`, затем `verify_article.py`.
4. Сверить с целями §4 и предсказаниями §5. Любой исход — в `FINDINGS`-запись проекта и в коммит.
**Дисциплина:** git заведён 2026-09-20 (базовый коммит `4a23aac`); аудит после каждой правки и до
запуска; смоук ×2; тяжёлое — на сервер `setsid nohup` с логом; загрузка общего сервера мерится до и
после; числа показываются немедленно, до аудита и коммита.