Files
sim-numerics/FINDINGS_logarithmic.md
T

91 lines
8.8 KiB
Markdown
Raw 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.
# 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`), а не новая шкала шага.