PREREG before code and run: one similarity judgment at entry and exit of the flat regime. At every new point, before the bracket moves: flat if |f| < |f - L(x)| (L = the line through the bracket ends), linear if the reverse. Entry = unkept promise AND flat; exit at a midpoint = linear. Goal: below Chandrupatla on BOTH sets (J1 CHA < 2441, J2 APS < 2787); decided on the smoke (all 199 problems), server only to confirm. Basis (where_we_lose.py, saved results): with the exit the flat families are at par with Chandrupatla; the rest of the loss is false entries on simple roots.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
vvs
2026-09-21 14:40:12 +01:00
co-authored by Claude Opus 5
parent f8dd8d9931
commit 1dbda21182
2 changed files with 112 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
# PREREG — плоский режим: одно суждение похожести на входе и на выходе
Составлено до кода и до прогона, ветка `signfix-and-gates`. Валерий: «нужно решать задачу так, чтобы
и на канонических, и на широких скобках был выигрыш».
## Основание (`sweep_flatexit.json`, разбор `where_we_lose.py`, без нового прогона)
| | канонические | широкие | fun1 | fun2 | fun3–6 | fun8 | fun9 |
|---|---|---|---|---|---|---|---|
| Чандрупатла | 2787 | 2441 | 103 | 152 | 1068 | 63 | 55 |
| предложенный метод | 2806 | 3220 | 99 | 141 | 1823 | 52 | 105 |
| + залипание с выходом | 3125 | 2503 | 147 | 158 | 1057 | 72 | 69 |
- Плоские семейства после выхода — **на уровне Чандрупатлы** (−11 в сумме).
- Весь остаток проигрыша — ложные входы на простых корнях: канонические +319, fun1 +48, fun2 +17,
fun8 +20. Флаг «несбывшееся обещание» входит в 134 из 154 канонических задач.
- Потолок при безошибочном входе: широкие ≈ 1057 + (99 + 141 + 1000 + 52 + 55…105) = 2404…2454
против 2441 — **запас тонкий, записан заранее**.
## Правило (новых констант нет)
Режим `prestep="flatjudge"`. После **каждого** вычисления f в новой точке x, до сдвига скобки,
суждение похожести по двум предсказаниям:
- линейное: L(x) = FA + (FB − FA)(x − A)/(B − A) — прямая через концы скобки;
- плоское: 0.
`плоско` — если |f(x)| < |f(x) − L(x)|; `линейно` — если |f(x) − L(x)| < |f(x)|; равенство — ни то,
ни другое. На середине L = (FA + FB)/2 — это ровно суждение выхода из `flatstickexit`.
- **Вход:** последний шаг был шагом модели, знак не сменился, r ≥ ¼ (флаг) **и** в этой точке
суждение — `плоско`.
- **В режиме:** каждый шаг — середина.
- **Выход:** на середине суждение — `линейно`.
Предохранитель применяется к шагу как всегда.
## Проверка
Решение принимается **по смоуку** (он считает предложенный метод на всех 199 задачах); сервер —
только для подтверждения числа, если прошло. Ячейки: предложенный метод и он же с Г2 (повтор рисунка
шагов), `none / flatjudge / flatstickexit`.
| # | ПРОЙДЕНО, если |
|---|---|
| **J1** | широкие скобки **ниже Чандрупатлы** (2441) |
| **J2** | канонические **ниже Чандрупатлы** (2787) |
| **J3** | гарантия: 0 нарушений, решено ≥ 193 |
| **J4** | сообщается: число входов на канонических и неплоских широких против `flatstickexit` |
**Цель задачи (Валерий): J1 и J2 одновременно** — выигрыш на обоих наборах. Принимается вариант,
выполнивший J1, J2, J3; без Г2 или с Г2 — сообщаются оба.
Если не выполнено: сообщается, какой набор и на сколько не дотянул, и в каких семействах.
+60
View File
@@ -0,0 +1,60 @@
"""Where the proposed rule still loses to Chandrupatla, per family, from results already
on disk (no new run). Cells: the proposed rule, + sticky/exit, and the decision-place
records, if the files hold them.
python -u where_we_lose.py
"""
from __future__ import annotations
import json
import os
from collections import defaultdict
MAXFEV = 200
def load(p):
with open(p, encoding="utf8") as fh:
return {r["label"]: r for r in json.load(fh)}
def fam(pid):
return pid.split(".")[0] if not pid.startswith("aps") else "aps"
def per_family(r, s):
out = defaultdict(int)
for pid, (n, ok) in r[s]["per"].items():
out[fam(pid)] += n if ok else MAXFEV
return out
def main():
full = load("sweep_full.json")
cells = {"chandrupatla": full["chandrupatla"],
"proposed": full["pure.ratio.derived3.project"]}
if os.path.exists("sweep_flatexit.json"):
cells["+exit"] = load("sweep_flatexit.json")["flatstickexit.ratio.derived3.project"]
for path in ("sweep_decision.json", "sweep_order.json", "sweep_points.json",
"sweep_combo.json", "sweep_slope.json"):
if not os.path.exists(path):
continue
for lab, r in load(path).items():
if lab.endswith("ratio.derived3.project") and lab not in cells and (
"defect" in lab or "shape" in lab or "slope" in lab):
cells[lab] = r
print(f"{'cell':<45} {'APS':>6} {'CHA':>6} {'both':>6}")
for k, r in cells.items():
print(f"{k:<45} {r['APS']['total']:6d} {r['CHA']['total']:6d} "
f"{r['APS']['total'] + r['CHA']['total']:6d}")
ch = per_family(cells["chandrupatla"], "CHA")
print("\nCHA per family (Chandrupatla | proposed | +exit):")
pr = per_family(cells["proposed"], "CHA")
ex = per_family(cells["+exit"], "CHA") if "+exit" in cells else {}
for f in sorted(ch):
print(f" {f:<6} {ch[f]:5d} | {pr[f]:5d} | {ex.get(f, 0):5d} "
f"(+exit - Chandrupatla {ex.get(f, 0) - ch[f]:+d})")
if __name__ == "__main__":
main()