Files
sim-numerics/FINDINGS_logarithmic.md
T

139 lines
13 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`), а не новая шкала шага.
---
## 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.