13 KiB
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.