Files
sim-numerics/FINDINGS_logarithmic.md

13 KiB
Raw Permalink Blame History

Findings — логарифмическая замена переменной (линия NEXT_PAPER_logarithmic.md)

Пред-регистрация: PREREG_logarithmic_2026-09-20.md. Здесь — то, что установлено, в порядке установления. Числа только с Linux (libm).


0. Базовое состояние воспроизведено (2026-09-20, сервер)

  • pytest tests/ -q → 665 passed, 9 skipped, 364.91 s.
  • verify_article.py → «every number stated in the paper matches the sweep data» (все 72 числа).
  • 🟡 Несоответствие документации: README обещает «490 tests», фактически 674. README не правлю — он описывает опубликованный артефакт; расхождение зафиксировано здесь.
  • 🟡 На сервере не было ни одного *.json: sweep_full.json (1 349 222 байта) залит с ноутбука, иначе проверки, сверяющие статью с данными, молча пропускаются (те самые 9 skipped).

1. 🔴 Два гейта допуска НЕСОВМЕСТИМЫ в строгой формулировке — установлено ВЫВОДОМ, без прогона

Шаг метода: step = (1 − S(|f|/sc))·(far − x), sc = |slope|·|far − x|. Гейт G1 — c, s выводятся из скобки; гейт G2 — на узких скобках преобразование тождественно до округления, то есть требует |x − c| / s → 0 при сжатии скобки.

выбор единицы s (все беспараметрические) узкая скобка широкая скобка
s = |f(c)|/|f'(c)| — ньютоновская длина (пред-регистрированный кандидат) у простого корня |x−c| ~ |f|/|f'| ~ s, отношение → O(1), тождественности НЕТ марш есть
s = w₀ — исходная ширина скобки (датум задачи) |x−c|/w₀ → 0, тождественность есть |x−c|/w₀ ≤ 1 ⇒ снова почти тождественность, марша НЕТ
u = log|x−c| — без единицы вовсе режима тождественности нет и x = c не определено марш есть
s = |x−c| — самомасштабируемая мультипликативный шаг отличается от аддитивного во втором порядке O((Δ/(x−c))²) ⇒ строгой тождественности НЕТ марш есть

Вывод: ни одна доступная беспараметрическая единица не удовлетворяет G1 и строгому G2 одновременно. Это свойство постановки, а не деталь реализации.

Что из этого следует содержательно: марш требует отношения расстояний, а тождественность — абсолютной шкалы; одно преобразование не может быть одновременно масштабно-свободным и масштабно-привязанным. Заодно это объясняет, почему cbrt «работал случайно»: он берёт фиксированную долю скобки, то есть отношение, и потому марширует — но фиксирует показатель 1/3 как константу, чего метод себе позволить не может.

Развилка, вынесенная Валерию (решение не моё):

  • A — оставить G2 строгим ⇒ линия закрывается сейчас, по выводу; отрицательный результат постановки, сам вывод сохранён.
  • B — заменить G2 на его же измеримое чтение из пред-регистрации (L2: «на APS-154 суммарная цена не растёт»), реализовать самомасштабируемый режим и мерить; строгая тождественность была лишним обещанием, а не требованием протокола статьи.

Ослабление пред-регистрированного гейта после его провала — приём, которым легко обмануть себя, поэтому он делается только по явному решению, и оба варианта записаны здесь заранее.

Решение Валерия: вариант B — G2 заменён измеримым G2′, единица s = xtol зафиксирована выводом (поправка 1 пред-регистрации).


2. 🔴 Измерено: логарифмический марш НЕ платит. Линия закрывается

Режим реализован как space="log" в pure_root (по умолчанию "x", опубликованный тракт побитово не тронут — пиннится тестом); свип 126 конфигураций × 199 задач по тому же протоколу (sweep_full.evaluate, тот же XTOL/MAXFEV/ACC, провал = полный бюджет, проверка границы 2× на каждом прогоне), результат в своём файле sweep_log.json. Сравнение — по-наборно, правилом статьи, и внутри семейства сторожей, несущих гарантию.

проверка цель измерено вердикт
G2′ цена на APS-154 не растёт ≤ 2806 6940 🔴 FAIL — в 2.5 раза дороже
L3 Chandrupatla-45 ≤ 2857 2857 3115 🔴 FAIL
два набора вместе < 6026 10 414 🔴 FAIL
L1 широкие скобки дешевле ≥2× ≥2× 4516 → 3115 = 1.45× 🔴 FAIL
решено ≥193/199 193/199 🟢 PASS
гарантия 2⌈log₂(w/xtol)⌉+3 не нарушена over2x = 0 во всех конфигурациях 🟢 PASS

Лучшие конфигурации: APS — log.ratio_soft.derived.step/safe 6940 (153/154); CHA — log.ratio_soft.derived.credit 3115 (40/45). Опубликованное x-пространство: APS pure.ratio.derived3.none 2806, CHA pure.sqrt.bracket.project 4516.

Содержательный итог. Механизм сработал в предсказанную сторону: на широких скобках марш действительно дешевле (4516 → 3115), то есть мультипликативное движение — правильный диагноз регима. Но цена на каноническом наборе выросла в 2.5 раза, а это ровно тот трейд, на котором закончились все четыре прежние попытки (NEXT_PAPER_logarithmic.md §«что уже пробовали»). Теперь он измерен и для логарифмической замены: пятая попытка провалилась тем же способом, и это, а не числа, — главный вывод линии.

Что теперь ЗАПРЕЩЕНО повторять (пятый пункт к прежним четырём): глобальная замена переменной с единицей xtol — APS 6940 против 2806, CHA 3115 против цели 2857. Локальное переключение между пространствами по наблюдаемому признаку закрыто отдельно: это пункт 2-4 прежних запретов (детекторы режима), все провалены.

Открытым остаётся только одно направление, и оно не про похожесть: разрыв на CHA закрывает Chandrupatla-1997 (2423 против наших 4516) при нуле настроечных констант, то есть существующий алгоритм уже делает то, чего мы добиваемся, и объяснение его преимущества — отдельная задача (качество пробы, stage4_why.py), а не новая шкала шага.


3. 🟢 ЧЕМ Chandrupatla выигрывает пробу — измерено, и это переводится на язык похожести

Инструмент: explain_chandrupatla.py (лог results_explain_chandrupatla.txt). Трассируемая копия опубликованной процедуры; её верность проверена — совпадение с оригиналом по числу вызовов и исходу на всех 45 задачах. Метрика пробы беспараметрическая: половинок скобки на вызов = log₂(w₀/xtol)/nfev, деление пополам = 1.0.

величина (45 задач CHA) Chandrupatla наш ratio.derived3.credit
вызовов всего (провал = 200) 1488 2073
половинок на вызов 2.310 1.422
модель принята 28.0 % шагов —
сторож ремонтировал — 77.5 % вызовов

Семейства fun8/fun9: у них 8–15 вызовов при 3–5 половинках, у нас 44–50 вызовов при 0.92 — то есть хуже деления пополам, при 93 % ремонтов.

Ответ

Он выигрывает не тем, что больше доверяет модели, а тем, что дешевле от неё отказывается. Интерполяция принимается лишь в 28 % шагов; в остальных 72 % он делит пополам. Гейт считается из уже имеющихся x1,x2,x3,f1,f2,f3 — ноль новых вызовов, а ветвь отказа сама снимает половину скобки. Наш отказ платный: шаг сделан, лёг плохо, сторож ремонтирует, ремонт — это вызов.

Перевод

где читается похожесть на чём цена отказа
Chandrupatla до шага, как ГЕЙТ на форме конфигурации: ξ = (x1−x2)/(x3−x2), φ = (f1−f2)/(f3−f2) — два отношения, инвариантные к масштабу по x и по f; полоса 1−√(1−ξ) < φ < √ξ есть окрестность линейной конфигурации (для линейной f точно φ = ξ, и она внутри полосы) 0 вызовов
наш метод внутри шага, как МАСШТАБ на величине остатка |f|/σ 1 вызов

Следствие, которое дороже самого объяснения: решает не форма функции похожести, а её место в алгоритме. Похожесть, прочитанная ДО шага на отношениях, стоит ноль и отсекает недостоверную модель; похожесть, прочитанная ВНУТРИ шага на величине, требует сторожа, и сторож платит. Это дополняет закон корпуса «рассуждение платит тем больше, чем хуже похожесть»: здесь расположение чтения важнее его формы.

Что из этого следует как проверяемый шаг (пред-регистрировать до реализации)

Добавить в наш метод предшаговый гейт на отношениях — читать похожесть конфигурации к хорошо обусловленной ДО того, как шаг сделан, и при отказе сразу делить пополам, вместо масштабированного шага с последующим ремонтом. Новой константы это не вводит: границы полосы у Чандрупатлы выведены из требования «проба модели не должна выйти за скобку» — того же требования, которое наш проекционный сторож выполняет, но после факта. Цель замера: довести долю ремонтов с 77.5 % к уровню их 72 % отказов без роста цены на APS-154.