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

12 KiB
Raw Blame History

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 с логом; загрузка общего сервера мерится до и после; числа показываются немедленно, до аудита и коммита.