139 lines
13 KiB
Markdown
139 lines
13 KiB
Markdown
# 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.
|