From a9060b3dccca72a977252d39492680bb8cbed180 Mon Sep 17 00:00:00 2001 From: Valeri Sitnikov Date: Sun, 20 Sep 2026 22:52:58 +0100 Subject: [PATCH] logarithmic space mode: pure_root gains space='x'|'log' (default reproduces the published grid bit-for-bit), u = sign(x-c)*log1p(|x-c|/xtol) with c = the end of smaller |f| and s = xtol fixed by derivation; gates G1/G2' pinned by tests/test_log_space.py (7 green); sweep writes the log grid to its OWN sweep_log.json so the verified sweep_full.json is untouched Co-Authored-By: Claude Opus 5 --- PREREG_logarithmic_2026-09-20.md | 33 ++++++++++ simroot/pure.py | 64 +++++++++++++++++- sweep_full.py | 35 ++++++++-- sweep_log_smoke.json | 1 + tests/test_log_space.py | 107 +++++++++++++++++++++++++++++++ 5 files changed, 231 insertions(+), 9 deletions(-) create mode 100644 sweep_log_smoke.json create mode 100644 tests/test_log_space.py diff --git a/PREREG_logarithmic_2026-09-20.md b/PREREG_logarithmic_2026-09-20.md index a61958a..37cf703 100644 --- a/PREREG_logarithmic_2026-09-20.md +++ b/PREREG_logarithmic_2026-09-20.md @@ -47,6 +47,39 @@ Не прошёл G2 → закрывается: широкие скобки куплены ценой канонического набора, а это трейд, на котором провалились все прежние попытки. +## 3a. ПОПРАВКА 1 (2026-09-20, решение Валерия: вариант B) + +**Что произошло:** строгий G2 («шаг в `u` совпадает со шагом в `x` до 1e-12») провален **выводом**, без +прогона, и не для одного кандидата, а для всех доступных беспараметрических единиц — марш требует +ОТНОШЕНИЯ расстояний, тождественность требует АБСОЛЮТНОЙ шкалы (разбор в `FINDINGS_logarithmic.md` §1). + +**Решение (Валерий, вариант B):** строгое чтение G2 заменяется его же **измеримым** чтением, которое +уже стоит в этой пред-регистрации как L2: + +> **G2′:** на APS-154 суммарная цена не растёт; ни одна задача канонического набора не становится +> дороже по вызовам `f`. + +Это **ослабление** пред-регистрированного критерия после его провала — записано как ослабление, а не +как «уточнение», и принято решением, а не молча. + +**Единица `s` фиксируется ВЫВОДОМ здесь и не выбирается по рейтингу:** + +> `c` = конец скобки с меньшим |f| (сторона, к которой корень ближе); +> **`s` = `xtol`**. + +Обоснование, а не удобство: задача преобразования — считать **декады, оставшиеся до различимости**. +Единственная длина в задаче, говорящая «ниже этого различий нет», — это `xtol`, и она приходит от +вызывающего наравне с `a`, `b`, `f`, то есть не является нашей константой. При таком выборе `u` +покрывает ровно `log(w/xtol)` единиц — ту самую величину, в которой сформулирована гарантия метода +`2⌈log₂(w/xtol)⌉+3`, так что марш становится линейным в мере собственной гарантии. Вырождения нет: +`xtol > 0` всегда, и `|x−c| = 0` даёт `u = 0`, а не деление на ноль. + +Отвергнутая альтернатива (для протокола): самомасштабируемая `s = |x−c|` вырождается на первом шаге, +потому что итерат стартует в конце с меньшим |f|, то есть ровно в `c`. + +**Режим требует выведенной шкалы:** `space="log"` допустим только при `scale ∈ {derived, derived3}` — +в log-пространстве нужен наклон; при прочих шкалах вызов обязан падать, а не считать молча. + ## 4. Цели (записаны в `NEXT_PAPER_logarithmic.md` заранее, не подгонялись) | величина | цель | где сейчас | diff --git a/simroot/pure.py b/simroot/pure.py index 04656f7..1a4e865 100644 --- a/simroot/pure.py +++ b/simroot/pure.py @@ -118,6 +118,50 @@ PURE_SIMS = { GUARDS = ("none", "bracket", "step", "both", "project", "safe", "credit") +SPACES = ("x", "log") + + +def _log_map(t, c, s): + """u = sign(t - c) * log1p(|t - c| / s). An ADDITIVE step in u is a + MULTIPLICATIVE step in x, which is what the wide-bracket families need: the + search there must cross up to twelve decades, and an absolute step sized by + the local slope knows nothing about how many decades remain.""" + d = t - c + return math.copysign(math.log1p(abs(d) / s), d) + + +def _log_unmap(u, c, s): + return c + math.copysign(s * (math.expm1(abs(u))), u) + + +def _log_space_step(S, x, fx, far, slope, c, s): + """The same similarity rule, the same derived scale, read in u rather than x. + + dx/du = s + |x - c|, so the slope in u is slope_x * (s + |x - c|); the scale + is that slope times the distance to the far end IN u, exactly as in x-space. + Returns the step in x (None when u-space cannot be read). + + `s` is NOT a free unit: PREREG amendment 1 fixes s = xtol by derivation - the + only length in the problem that says "below this nothing is distinguishable", + supplied by the caller like a, b and f. With it u spans log(w/xtol) units, + the very measure the method's own guarantee 2*ceil(log2(w/xtol)) + 3 is + stated in, so the march is linear in the measure of the guarantee. + """ + u_x = _log_map(x, c, s) + u_far = _log_map(far, c, s) + du = u_far - u_x + if du == 0.0 or not math.isfinite(du): + return None + slope_u = slope * (s + abs(x - c)) + sc_u = abs(slope_u) * abs(du) + if sc_u == 0.0 or not math.isfinite(sc_u): + return None + u_new = u_x + (1.0 - S(abs(fx) / sc_u)) * du + x_new = _log_unmap(u_new, c, s) + if not math.isfinite(x_new): + return None + return x_new - x + class _Safeguard: """Parameter-free worst-case protection. See the module docstring.""" @@ -369,7 +413,7 @@ def _local_order(x2, f2, x1, f1, x0, f0): def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived", guard="step", stats=None, budget_factor=2.0, - budget_extra=None, endowment=1.0): + budget_extra=None, endowment=1.0, space="x"): """The pure similarity root finder. similarity : key into PURE_SIMS @@ -421,6 +465,12 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived", if scale not in ("derived", "derived3", "derived_rho", "derived3_rho", "derived3_m", "start", "bracket"): raise ValueError(f"unknown scale {scale!r}") + if space not in SPACES: + raise ValueError(f"unknown space {space!r}") + if space == "log" and scale not in ("derived", "derived3"): + # u-space needs a slope; with a chosen or bracket scale there is none to + # transform, and computing something anyway would hide that (PREREG §3a). + raise ValueError("space='log' requires scale in {'derived', 'derived3'}") S = PURE_SIMS[similarity] g = Counter(f, maxfev) x = 0.5 * (a + b) @@ -541,7 +591,17 @@ def pure_root(f, a, b, xtol, maxfev, similarity="ratio", scale="derived", if sc == 0.0 or not math.isfinite(sc): x_new = 0.5 * (A + B) else: - step = (1.0 - S(abs(fx) / sc)) * (far - x) + step = None + if space == "log": + # c = the bracket end with the smaller |f| (the side the + # root is nearer); s = xtol, fixed by derivation in + # PREREG amendment 1, never chosen. Falls back to the + # x-space step when u cannot be read, so the mode can + # only differ where it is defined. + c_near = A if abs(FA) <= abs(FB) else B + step = _log_space_step(S, x, fx, far, slope, c_near, xtol) + if step is None: + step = (1.0 - S(abs(fx) / sc)) * (far - x) if sg.reject_step(step): x_new = 0.5 * (A + B) step = x_new - x diff --git a/sweep_full.py b/sweep_full.py index 62802fd..20c8187 100644 --- a/sweep_full.py +++ b/sweep_full.py @@ -101,20 +101,27 @@ BASELINES = { def make_method(spec): - """spec is ('base', name) or ('pure', similarity, scale, guard).""" + """spec is ('base', name) or ('pure', similarity, scale, guard[, space]). + + The optional 5th element is the SPACE the step is read in (PREREG + amendment 1, 2026-09-20): omitted or "x" reproduces the published grid + bit-for-bit, "log" is the logarithmic-march mode.""" if spec[0] == "base": return BASELINES[spec[1]] - _, sim, scale, guard = spec + sim, scale, guard = spec[1], spec[2], spec[3] + space = spec[4] if len(spec) > 4 else "x" def m(f, a, b, xtol, maxfev): return pure_root(f, a, b, xtol, maxfev, similarity=sim, - scale=scale, guard=guard) + scale=scale, guard=guard, space=space) return m def label(spec): if spec[0] == "base": return spec[1] + if len(spec) > 4 and spec[4] != "x": + return f"{spec[4]}.{spec[1]}.{spec[2]}.{spec[3]}" return f"pure.{spec[1]}.{spec[2]}.{spec[3]}" @@ -152,6 +159,16 @@ def evaluate(spec): return res +def build_grid_log(smoke): + """The logarithmic-space grid (PREREG 2026-09-20). Baselines are NOT recomputed: + their numbers are already in sweep_full.json and re-running known expensive + controls is waste. Only the derived scales are admissible in u-space.""" + sims = ["ratio", "cbrt"] if smoke else sorted(PURE_SIMS) + guards = ("credit", "project") if smoke else GUARD_MODES + return [("pure", sim, sc, gu, "log") + for sim in sims for sc in ("derived", "derived3") for gu in guards] + + def build_grid(smoke): specs = [("base", nm) for nm in BASELINES] sims = sorted(PURE_SIMS) @@ -171,10 +188,11 @@ def build_grid(smoke): def main(): smoke = "--smoke" in sys.argv - specs = build_grid(smoke) + logmode = "--log" in sys.argv # the u-space grid, written to its OWN file + specs = build_grid_log(smoke) if logmode else build_grid(smoke) t0 = time.time() print(f"sweep: {len(specs)} configurations x 199 problems " - f"({'SMOKE' if smoke else 'FULL'})", flush=True) + f"({'SMOKE' if smoke else 'FULL'}{', LOG-SPACE' if logmode else ''})", flush=True) workers = max(1, min(8, (os.cpu_count() or 2) - 1)) with Pool(workers) as pool: @@ -185,7 +203,10 @@ def main(): print(f" {i}/{len(specs)} done, " f"{time.time() - t0:.0f}s elapsed", flush=True) - out = "sweep_smoke.json" if smoke else "sweep_full.json" + # the published sweep_full.json is what verify_article.py checks the paper + # against, so the log grid never writes into it + out = ("sweep_log_smoke.json" if smoke else "sweep_log.json") if logmode else \ + ("sweep_smoke.json" if smoke else "sweep_full.json") with open(out, "w", encoding="utf8") as fh: json.dump(results, fh) print(f"\nwrote {out} ({time.time() - t0:.0f}s total)\n", flush=True) @@ -225,7 +246,7 @@ def report(results, top=20): for r in results: if r["spec"][0] != "pure": continue - _, sim, sc, gu = r["spec"] + sim, sc, gu = r["spec"][1], r["spec"][2], r["spec"][3] if sc != scale or gu != "step" or sim not in group: continue cnt += 1 diff --git a/sweep_log_smoke.json b/sweep_log_smoke.json new file mode 100644 index 0000000..3676d14 --- /dev/null +++ b/sweep_log_smoke.json @@ -0,0 +1 @@ +[{"label": "log.ratio.derived.credit", "spec": ["pure", "ratio", "derived", "credit", "log"], "APS": {"total": 7640, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [44, true], "aps.02.00": [45, true], "aps.02.01": [46, true], "aps.02.02": [46, true], "aps.02.03": [47, true], "aps.02.04": [47, true], "aps.02.05": [47, true], "aps.02.06": [47, true], "aps.02.07": [47, true], "aps.02.08": [48, true], "aps.02.09": [48, true], "aps.03.00": [49, true], "aps.03.01": [49, true], "aps.03.02": [49, true], "aps.04.00": [46, true], "aps.04.01": [46, true], "aps.04.02": [46, true], "aps.04.03": [46, true], "aps.04.04": [46, true], "aps.04.05": [46, true], "aps.04.06": [46, true], "aps.04.07": [46, true], "aps.04.08": [46, true], "aps.04.09": [46, true], "aps.04.10": [46, true], "aps.04.11": [46, true], "aps.04.12": [46, true], "aps.04.13": [46, true], "aps.05.00": [44, true], "aps.06.00": [43, true], "aps.06.01": [43, true], "aps.06.02": [43, true], "aps.06.03": [43, true], "aps.06.04": [43, true], "aps.06.05": [43, true], "aps.06.06": [43, true], "aps.06.07": [43, true], "aps.06.08": [41, true], "aps.06.09": [43, true], "aps.07.00": [43, true], "aps.07.01": [37, true], "aps.07.02": [40, true], "aps.08.00": [3, true], "aps.08.01": [43, true], "aps.08.02": [43, true], "aps.08.03": [43, true], "aps.08.04": [43, true], "aps.09.00": [43, true], "aps.09.01": [43, true], "aps.09.02": [43, true], "aps.09.03": [43, true], "aps.09.04": [41, true], "aps.09.05": [37, true], "aps.09.06": [36, true], "aps.10.00": [43, true], "aps.10.01": [37, true], "aps.10.02": [43, true], "aps.10.03": [43, true], "aps.10.04": [43, true], "aps.11.00": [43, true], "aps.11.01": [43, true], "aps.11.02": [43, true], "aps.11.03": [43, true], "aps.12.00": [50, true], "aps.12.01": [45, true], "aps.12.02": [45, true], "aps.12.03": [50, true], "aps.12.04": [50, true], "aps.12.05": [50, true], "aps.12.06": [50, true], "aps.12.07": [50, true], "aps.12.08": [50, true], "aps.12.09": [50, true], "aps.12.10": [50, true], "aps.12.11": [50, true], "aps.12.12": [50, true], "aps.12.13": [50, true], "aps.12.14": [50, true], "aps.12.15": [50, true], "aps.12.16": [50, true], "aps.12.17": [50, true], "aps.12.18": [50, true], "aps.13.00": [6, false], "aps.14.00": [53, true], "aps.14.01": [53, true], "aps.14.02": [53, true], "aps.14.03": [53, true], "aps.14.04": [53, true], "aps.14.05": [53, true], "aps.14.06": [53, true], "aps.14.07": [53, true], "aps.14.08": [53, true], "aps.14.09": [53, true], "aps.14.10": [53, true], "aps.14.11": [53, true], "aps.14.12": [53, true], "aps.14.13": [53, true], "aps.14.14": [53, true], "aps.14.15": [53, true], "aps.14.16": [53, true], "aps.14.17": [53, true], "aps.14.18": [53, true], "aps.14.19": [53, true], "aps.14.20": [53, true], "aps.14.21": [53, true], "aps.14.22": [53, true], "aps.14.23": [53, true], "aps.14.24": [53, true], "aps.14.25": [53, true], "aps.14.26": [53, true], "aps.14.27": [53, true], "aps.14.28": [53, true], "aps.14.29": [53, true], "aps.14.30": [53, true], "aps.14.31": [53, true], "aps.14.32": [53, true], "aps.14.33": [53, true], "aps.14.34": [53, true], "aps.14.35": [53, true], "aps.14.36": [53, true], "aps.14.37": [53, true], "aps.14.38": [53, true], "aps.14.39": [53, true], "aps.15.00": [53, true], "aps.15.01": [53, true], "aps.15.02": [53, true], "aps.15.03": [53, true], "aps.15.04": [53, true], "aps.15.05": [53, true], "aps.15.06": [53, true], "aps.15.07": [53, true], "aps.15.08": [53, true], "aps.15.09": [53, true], "aps.15.10": [53, true], "aps.15.11": [53, true], "aps.15.12": [53, true], "aps.15.13": [53, true], "aps.15.14": [53, true], "aps.15.15": [53, true], "aps.15.16": [53, true], "aps.15.17": [53, true], "aps.15.18": [53, true], "aps.15.19": [53, true], "aps.15.20": [53, true], "aps.15.21": [53, true], "aps.15.22": [53, true], "aps.15.23": [53, true], "aps.15.24": [53, true], "aps.15.25": [53, true], "aps.15.26": [53, true], "aps.15.27": [53, true], "aps.15.28": [53, true], "aps.15.29": [53, true], "aps.15.30": [53, true]}}, "CHA": {"total": 3126, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [43, true], "fun1.2": [47, true], "fun1.3": [50, true], "fun1.4": [58, true], "fun1.5": [78, true], "fun2.1": [43, true], "fun2.2": [57, true], "fun2.3": [63, true], "fun2.4": [77, true], "fun2.5": [83, true], "fun3.1": [46, true], "fun3.2": [48, true], "fun3.3": [58, true], "fun3.4": [64, true], "fun3.5": [78, true], "fun4.1": [46, true], "fun4.2": [48, true], "fun4.3": [58, true], "fun4.4": [64, true], "fun4.5": [78, true], "fun5.1": [46, true], "fun5.2": [46, true], "fun5.3": [47, true], "fun5.4": [49, true], "fun5.5": [50, true], "fun6.1": [46, true], "fun6.2": [46, true], "fun6.3": [47, true], "fun6.4": [49, true], "fun6.5": [50, true], "fun7.1": [6, false], "fun7.2": [8, false], "fun7.3": [8, false], "fun7.4": [13, false], "fun7.5": [13, false], "fun8.1": [44, true], "fun8.2": [45, true], "fun8.3": [47, true], "fun8.4": [48, true], "fun8.5": [50, true], "fun9.1": [43, true], "fun9.2": [41, true], "fun9.3": [47, true], "fun9.4": [48, true], "fun9.5": [50, true]}}}, {"label": "log.ratio.derived.project", "spec": ["pure", "ratio", "derived", "project", "log"], "APS": {"total": 7648, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [40, true], "aps.02.00": [44, true], "aps.02.01": [43, true], "aps.02.02": [45, true], "aps.02.03": [45, true], "aps.02.04": [48, true], "aps.02.05": [46, true], "aps.02.06": [46, true], "aps.02.07": [49, true], "aps.02.08": [49, true], "aps.02.09": [46, true], "aps.03.00": [62, true], "aps.03.01": [67, true], "aps.03.02": [68, true], "aps.04.00": [49, true], "aps.04.01": [42, true], "aps.04.02": [47, true], "aps.04.03": [46, true], "aps.04.04": [45, true], "aps.04.05": [49, true], "aps.04.06": [50, true], "aps.04.07": [49, true], "aps.04.08": [51, true], "aps.04.09": [52, true], "aps.04.10": [46, true], "aps.04.11": [44, true], "aps.04.12": [47, true], "aps.04.13": [47, true], "aps.05.00": [45, true], "aps.06.00": [46, true], "aps.06.01": [41, true], "aps.06.02": [42, true], "aps.06.03": [40, true], "aps.06.04": [44, true], "aps.06.05": [44, true], "aps.06.06": [43, true], "aps.06.07": [44, true], "aps.06.08": [41, true], "aps.06.09": [43, true], "aps.07.00": [42, true], "aps.07.01": [37, true], "aps.07.02": [40, true], "aps.08.00": [3, true], "aps.08.01": [43, true], "aps.08.02": [44, true], "aps.08.03": [44, true], "aps.08.04": [41, true], "aps.09.00": [37, true], "aps.09.01": [43, true], "aps.09.02": [43, true], "aps.09.03": [41, true], "aps.09.04": [41, true], "aps.09.05": [37, true], "aps.09.06": [36, true], "aps.10.00": [42, true], "aps.10.01": [37, true], "aps.10.02": [45, true], "aps.10.03": [42, true], "aps.10.04": [43, true], "aps.11.00": [43, true], "aps.11.01": [43, true], "aps.11.02": [46, true], "aps.11.03": [49, true], "aps.12.00": [50, true], "aps.12.01": [45, true], "aps.12.02": [45, true], "aps.12.03": [47, true], "aps.12.04": [49, true], "aps.12.05": [50, true], "aps.12.06": [49, true], "aps.12.07": [49, true], "aps.12.08": [48, true], "aps.12.09": [50, true], "aps.12.10": [51, true], "aps.12.11": [54, true], "aps.12.12": [52, true], "aps.12.13": [50, true], "aps.12.14": [49, true], "aps.12.15": [53, true], "aps.12.16": [46, true], "aps.12.17": [48, true], "aps.12.18": [49, true], "aps.13.00": [6, false], "aps.14.00": [51, true], "aps.14.01": [51, true], "aps.14.02": [51, true], "aps.14.03": [51, true], "aps.14.04": [51, true], "aps.14.05": [51, true], "aps.14.06": [51, true], "aps.14.07": [51, true], "aps.14.08": [51, true], "aps.14.09": [51, true], "aps.14.10": [51, true], "aps.14.11": [51, true], "aps.14.12": [51, true], "aps.14.13": [51, true], "aps.14.14": [51, true], "aps.14.15": [51, true], "aps.14.16": [51, true], "aps.14.17": [51, true], "aps.14.18": [51, true], "aps.14.19": [51, true], "aps.14.20": [51, true], "aps.14.21": [51, true], "aps.14.22": [51, true], "aps.14.23": [51, true], "aps.14.24": [51, true], "aps.14.25": [51, true], "aps.14.26": [51, true], "aps.14.27": [51, true], "aps.14.28": [51, true], "aps.14.29": [51, true], "aps.14.30": [51, true], "aps.14.31": [51, true], "aps.14.32": [51, true], "aps.14.33": [51, true], "aps.14.34": [51, true], "aps.14.35": [51, true], "aps.14.36": [51, true], "aps.14.37": [51, true], "aps.14.38": [51, true], "aps.14.39": [51, true], "aps.15.00": [53, true], "aps.15.01": [55, true], "aps.15.02": [56, true], "aps.15.03": [53, true], "aps.15.04": [56, true], "aps.15.05": [55, true], "aps.15.06": [53, true], "aps.15.07": [52, true], "aps.15.08": [54, true], "aps.15.09": [53, true], "aps.15.10": [53, true], "aps.15.11": [54, true], "aps.15.12": [54, true], "aps.15.13": [54, true], "aps.15.14": [56, true], "aps.15.15": [56, true], "aps.15.16": [51, true], "aps.15.17": [55, true], "aps.15.18": [55, true], "aps.15.19": [55, true], "aps.15.20": [55, true], "aps.15.21": [57, true], "aps.15.22": [48, true], "aps.15.23": [56, true], "aps.15.24": [55, true], "aps.15.25": [57, true], "aps.15.26": [50, true], "aps.15.27": [54, true], "aps.15.28": [51, true], "aps.15.29": [54, true], "aps.15.30": [57, true]}}, "CHA": {"total": 4195, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [43, true], "fun1.2": [45, true], "fun1.3": [55, true], "fun1.4": [64, true], "fun1.5": [127, true], "fun2.1": [40, true], "fun2.2": [64, true], "fun2.3": [76, true], "fun2.4": [104, true], "fun2.5": [103, true], "fun3.1": [70, true], "fun3.2": [76, true], "fun3.3": [83, true], "fun3.4": [123, true], "fun3.5": [149, true], "fun4.1": [88, true], "fun4.2": [92, true], "fun4.3": [112, true], "fun4.4": [125, true], "fun4.5": [152, true], "fun5.1": [88, true], "fun5.2": [88, true], "fun5.3": [90, true], "fun5.4": [94, true], "fun5.5": [96, true], "fun6.1": [88, true], "fun6.2": [88, true], "fun6.3": [90, true], "fun6.4": [94, true], "fun6.5": [96, true], "fun7.1": [6, false], "fun7.2": [8, false], "fun7.3": [9, false], "fun7.4": [10, false], "fun7.5": [13, false], "fun8.1": [43, true], "fun8.2": [44, true], "fun8.3": [47, true], "fun8.4": [49, true], "fun8.5": [53, true], "fun9.1": [44, true], "fun9.2": [41, true], "fun9.3": [50, true], "fun9.4": [52, true], "fun9.5": [69, true]}}}, {"label": "log.ratio.derived3.credit", "spec": ["pure", "ratio", "derived3", "credit", "log"], "APS": {"total": 7649, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [44, true], "aps.02.00": [45, true], "aps.02.01": [46, true], "aps.02.02": [46, true], "aps.02.03": [47, true], "aps.02.04": [47, true], "aps.02.05": [47, true], "aps.02.06": [47, true], "aps.02.07": [47, true], "aps.02.08": [48, true], "aps.02.09": [48, true], "aps.03.00": [49, true], "aps.03.01": [49, true], "aps.03.02": [49, true], "aps.04.00": [46, true], "aps.04.01": [46, true], "aps.04.02": [46, true], "aps.04.03": [46, true], "aps.04.04": [46, true], "aps.04.05": [46, true], "aps.04.06": [46, true], "aps.04.07": [46, true], "aps.04.08": [46, true], "aps.04.09": [46, true], "aps.04.10": [46, true], "aps.04.11": [46, true], "aps.04.12": [46, true], "aps.04.13": [46, true], "aps.05.00": [44, true], "aps.06.00": [43, true], "aps.06.01": [43, true], "aps.06.02": [43, true], "aps.06.03": [43, true], "aps.06.04": [43, true], "aps.06.05": [43, true], "aps.06.06": [43, true], "aps.06.07": [43, true], "aps.06.08": [43, true], "aps.06.09": [43, true], "aps.07.00": [43, true], "aps.07.01": [43, true], "aps.07.02": [39, true], "aps.08.00": [3, true], "aps.08.01": [43, true], "aps.08.02": [43, true], "aps.08.03": [43, true], "aps.08.04": [43, true], "aps.09.00": [43, true], "aps.09.01": [43, true], "aps.09.02": [41, true], "aps.09.03": [40, true], "aps.09.04": [43, true], "aps.09.05": [37, true], "aps.09.06": [35, true], "aps.10.00": [43, true], "aps.10.01": [43, true], "aps.10.02": [43, true], "aps.10.03": [43, true], "aps.10.04": [43, true], "aps.11.00": [43, true], "aps.11.01": [43, true], "aps.11.02": [43, true], "aps.11.03": [43, true], "aps.12.00": [41, true], "aps.12.01": [49, true], "aps.12.02": [50, true], "aps.12.03": [50, true], "aps.12.04": [50, true], "aps.12.05": [50, true], "aps.12.06": [50, true], "aps.12.07": [50, true], "aps.12.08": [50, true], "aps.12.09": [50, true], "aps.12.10": [50, true], "aps.12.11": [50, true], "aps.12.12": [50, true], "aps.12.13": [50, true], "aps.12.14": [50, true], "aps.12.15": [50, true], "aps.12.16": [50, true], "aps.12.17": [50, true], "aps.12.18": [50, true], "aps.13.00": [9, false], "aps.14.00": [53, true], "aps.14.01": [53, true], "aps.14.02": [53, true], "aps.14.03": [53, true], "aps.14.04": [53, true], "aps.14.05": [53, true], "aps.14.06": [53, true], "aps.14.07": [53, true], "aps.14.08": [53, true], "aps.14.09": [53, true], "aps.14.10": [53, true], "aps.14.11": [53, true], "aps.14.12": [53, true], "aps.14.13": [53, true], "aps.14.14": [53, true], "aps.14.15": [53, true], "aps.14.16": [53, true], "aps.14.17": [53, true], "aps.14.18": [53, true], "aps.14.19": [53, true], "aps.14.20": [53, true], "aps.14.21": [53, true], "aps.14.22": [53, true], "aps.14.23": [53, true], "aps.14.24": [53, true], "aps.14.25": [53, true], "aps.14.26": [53, true], "aps.14.27": [53, true], "aps.14.28": [53, true], "aps.14.29": [53, true], "aps.14.30": [53, true], "aps.14.31": [53, true], "aps.14.32": [53, true], "aps.14.33": [53, true], "aps.14.34": [53, true], "aps.14.35": [53, true], "aps.14.36": [53, true], "aps.14.37": [53, true], "aps.14.38": [53, true], "aps.14.39": [53, true], "aps.15.00": [53, true], "aps.15.01": [53, true], "aps.15.02": [53, true], "aps.15.03": [53, true], "aps.15.04": [53, true], "aps.15.05": [53, true], "aps.15.06": [53, true], "aps.15.07": [53, true], "aps.15.08": [53, true], "aps.15.09": [53, true], "aps.15.10": [53, true], "aps.15.11": [53, true], "aps.15.12": [53, true], "aps.15.13": [53, true], "aps.15.14": [53, true], "aps.15.15": [53, true], "aps.15.16": [53, true], "aps.15.17": [53, true], "aps.15.18": [53, true], "aps.15.19": [53, true], "aps.15.20": [53, true], "aps.15.21": [53, true], "aps.15.22": [53, true], "aps.15.23": [53, true], "aps.15.24": [53, true], "aps.15.25": [53, true], "aps.15.26": [53, true], "aps.15.27": [53, true], "aps.15.28": [53, true], "aps.15.29": [53, true], "aps.15.30": [53, true]}}, "CHA": {"total": 3125, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [43, true], "fun1.2": [47, true], "fun1.3": [50, true], "fun1.4": [58, true], "fun1.5": [78, true], "fun2.1": [43, true], "fun2.2": [57, true], "fun2.3": [63, true], "fun2.4": [77, true], "fun2.5": [83, true], "fun3.1": [46, true], "fun3.2": [48, true], "fun3.3": [58, true], "fun3.4": [64, true], "fun3.5": [78, true], "fun4.1": [46, true], "fun4.2": [48, true], "fun4.3": [58, true], "fun4.4": [64, true], "fun4.5": [78, true], "fun5.1": [46, true], "fun5.2": [46, true], "fun5.3": [47, true], "fun5.4": [49, true], "fun5.5": [50, true], "fun6.1": [46, true], "fun6.2": [46, true], "fun6.3": [47, true], "fun6.4": [49, true], "fun6.5": [50, true], "fun7.1": [9, false], "fun7.2": [8, false], "fun7.3": [8, false], "fun7.4": [13, false], "fun7.5": [13, false], "fun8.1": [39, true], "fun8.2": [45, true], "fun8.3": [47, true], "fun8.4": [48, true], "fun8.5": [50, true], "fun9.1": [43, true], "fun9.2": [45, true], "fun9.3": [47, true], "fun9.4": [48, true], "fun9.5": [50, true]}}}, {"label": "log.ratio.derived3.project", "spec": ["pure", "ratio", "derived3", "project", "log"], "APS": {"total": 7526, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [45, true], "aps.02.00": [43, true], "aps.02.01": [43, true], "aps.02.02": [43, true], "aps.02.03": [43, true], "aps.02.04": [50, true], "aps.02.05": [50, true], "aps.02.06": [43, true], "aps.02.07": [47, true], "aps.02.08": [44, true], "aps.02.09": [49, true], "aps.03.00": [60, true], "aps.03.01": [60, true], "aps.03.02": [51, true], "aps.04.00": [47, true], "aps.04.01": [45, true], "aps.04.02": [49, true], "aps.04.03": [47, true], "aps.04.04": [53, true], "aps.04.05": [45, true], "aps.04.06": [46, true], "aps.04.07": [51, true], "aps.04.08": [52, true], "aps.04.09": [53, true], "aps.04.10": [46, true], "aps.04.11": [49, true], "aps.04.12": [51, true], "aps.04.13": [48, true], "aps.05.00": [43, true], "aps.06.00": [44, true], "aps.06.01": [39, true], "aps.06.02": [40, true], "aps.06.03": [44, true], "aps.06.04": [43, true], "aps.06.05": [44, true], "aps.06.06": [44, true], "aps.06.07": [44, true], "aps.06.08": [43, true], "aps.06.09": [44, true], "aps.07.00": [46, true], "aps.07.01": [42, true], "aps.07.02": [39, true], "aps.08.00": [3, true], "aps.08.01": [47, true], "aps.08.02": [42, true], "aps.08.03": [44, true], "aps.08.04": [42, true], "aps.09.00": [42, true], "aps.09.01": [46, true], "aps.09.02": [41, true], "aps.09.03": [40, true], "aps.09.04": [41, true], "aps.09.05": [37, true], "aps.09.06": [35, true], "aps.10.00": [42, true], "aps.10.01": [42, true], "aps.10.02": [43, true], "aps.10.03": [42, true], "aps.10.04": [47, true], "aps.11.00": [51, true], "aps.11.01": [43, true], "aps.11.02": [38, true], "aps.11.03": [37, true], "aps.12.00": [41, true], "aps.12.01": [49, true], "aps.12.02": [50, true], "aps.12.03": [50, true], "aps.12.04": [51, true], "aps.12.05": [50, true], "aps.12.06": [53, true], "aps.12.07": [53, true], "aps.12.08": [51, true], "aps.12.09": [50, true], "aps.12.10": [52, true], "aps.12.11": [48, true], "aps.12.12": [50, true], "aps.12.13": [53, true], "aps.12.14": [55, true], "aps.12.15": [55, true], "aps.12.16": [51, true], "aps.12.17": [50, true], "aps.12.18": [52, true], "aps.13.00": [8, false], "aps.14.00": [48, true], "aps.14.01": [48, true], "aps.14.02": [50, true], "aps.14.03": [48, true], "aps.14.04": [46, true], "aps.14.05": [50, true], "aps.14.06": [48, true], "aps.14.07": [48, true], "aps.14.08": [40, true], "aps.14.09": [46, true], "aps.14.10": [43, true], "aps.14.11": [50, true], "aps.14.12": [46, true], "aps.14.13": [48, true], "aps.14.14": [46, true], "aps.14.15": [48, true], "aps.14.16": [49, true], "aps.14.17": [40, true], "aps.14.18": [45, true], "aps.14.19": [46, true], "aps.14.20": [43, true], "aps.14.21": [43, true], "aps.14.22": [46, true], "aps.14.23": [50, true], "aps.14.24": [46, true], "aps.14.25": [46, true], "aps.14.26": [45, true], "aps.14.27": [48, true], "aps.14.28": [47, true], "aps.14.29": [46, true], "aps.14.30": [46, true], "aps.14.31": [48, true], "aps.14.32": [48, true], "aps.14.33": [49, true], "aps.14.34": [44, true], "aps.14.35": [40, true], "aps.14.36": [44, true], "aps.14.37": [45, true], "aps.14.38": [44, true], "aps.14.39": [46, true], "aps.15.00": [55, true], "aps.15.01": [54, true], "aps.15.02": [52, true], "aps.15.03": [52, true], "aps.15.04": [53, true], "aps.15.05": [51, true], "aps.15.06": [56, true], "aps.15.07": [54, true], "aps.15.08": [53, true], "aps.15.09": [54, true], "aps.15.10": [53, true], "aps.15.11": [53, true], "aps.15.12": [54, true], "aps.15.13": [54, true], "aps.15.14": [56, true], "aps.15.15": [56, true], "aps.15.16": [55, true], "aps.15.17": [56, true], "aps.15.18": [55, true], "aps.15.19": [56, true], "aps.15.20": [54, true], "aps.15.21": [58, true], "aps.15.22": [56, true], "aps.15.23": [57, true], "aps.15.24": [59, true], "aps.15.25": [59, true], "aps.15.26": [57, true], "aps.15.27": [55, true], "aps.15.28": [59, true], "aps.15.29": [61, true], "aps.15.30": [61, true]}}, "CHA": {"total": 4226, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [38, true], "fun1.2": [45, true], "fun1.3": [53, true], "fun1.4": [76, true], "fun1.5": [94, true], "fun2.1": [41, true], "fun2.2": [72, true], "fun2.3": [69, true], "fun2.4": [109, true], "fun2.5": [100, true], "fun3.1": [82, true], "fun3.2": [84, true], "fun3.3": [101, true], "fun3.4": [105, true], "fun3.5": [153, true], "fun4.1": [87, true], "fun4.2": [90, true], "fun4.3": [112, true], "fun4.4": [125, true], "fun4.5": [145, true], "fun5.1": [88, true], "fun5.2": [88, true], "fun5.3": [90, true], "fun5.4": [94, true], "fun5.5": [96, true], "fun6.1": [88, true], "fun6.2": [88, true], "fun6.3": [90, true], "fun6.4": [94, true], "fun6.5": [96, true], "fun7.1": [8, false], "fun7.2": [17, false], "fun7.3": [40, false], "fun7.4": [19, false], "fun7.5": [60, false], "fun8.1": [39, true], "fun8.2": [38, true], "fun8.3": [52, true], "fun8.4": [58, true], "fun8.5": [56, true], "fun9.1": [70, true], "fun9.2": [47, true], "fun9.3": [56, true], "fun9.4": [55, true], "fun9.5": [62, true]}}}, {"label": "log.cbrt.derived.credit", "spec": ["pure", "cbrt", "derived", "credit", "log"], "APS": {"total": 7682, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [44, true], "aps.02.00": [45, true], "aps.02.01": [46, true], "aps.02.02": [46, true], "aps.02.03": [47, true], "aps.02.04": [47, true], "aps.02.05": [47, true], "aps.02.06": [47, true], "aps.02.07": [47, true], "aps.02.08": [48, true], "aps.02.09": [48, true], "aps.03.00": [49, true], "aps.03.01": [49, true], "aps.03.02": [49, true], "aps.04.00": [46, true], "aps.04.01": [46, true], "aps.04.02": [46, true], "aps.04.03": [46, true], "aps.04.04": [46, true], "aps.04.05": [46, true], "aps.04.06": [46, true], "aps.04.07": [46, true], "aps.04.08": [46, true], "aps.04.09": [46, true], "aps.04.10": [46, true], "aps.04.11": [46, true], "aps.04.12": [46, true], "aps.04.13": [46, true], "aps.05.00": [44, true], "aps.06.00": [43, true], "aps.06.01": [43, true], "aps.06.02": [43, true], "aps.06.03": [43, true], "aps.06.04": [43, true], "aps.06.05": [43, true], "aps.06.06": [43, true], "aps.06.07": [43, true], "aps.06.08": [43, true], "aps.06.09": [43, true], "aps.07.00": [43, true], "aps.07.01": [43, true], "aps.07.02": [43, true], "aps.08.00": [3, true], "aps.08.01": [43, true], "aps.08.02": [43, true], "aps.08.03": [43, true], "aps.08.04": [43, true], "aps.09.00": [43, true], "aps.09.01": [43, true], "aps.09.02": [43, true], "aps.09.03": [43, true], "aps.09.04": [43, true], "aps.09.05": [43, true], "aps.09.06": [43, true], "aps.10.00": [43, true], "aps.10.01": [43, true], "aps.10.02": [43, true], "aps.10.03": [43, true], "aps.10.04": [43, true], "aps.11.00": [43, true], "aps.11.01": [43, true], "aps.11.02": [43, true], "aps.11.03": [43, true], "aps.12.00": [50, true], "aps.12.01": [50, true], "aps.12.02": [50, true], "aps.12.03": [50, true], "aps.12.04": [50, true], "aps.12.05": [50, true], "aps.12.06": [50, true], "aps.12.07": [50, true], "aps.12.08": [50, true], "aps.12.09": [50, true], "aps.12.10": [50, true], "aps.12.11": [50, true], "aps.12.12": [50, true], "aps.12.13": [50, true], "aps.12.14": [50, true], "aps.12.15": [50, true], "aps.12.16": [50, true], "aps.12.17": [50, true], "aps.12.18": [50, true], "aps.13.00": [9, false], "aps.14.00": [53, true], "aps.14.01": [53, true], "aps.14.02": [53, true], "aps.14.03": [53, true], "aps.14.04": [53, true], "aps.14.05": [53, true], "aps.14.06": [53, true], "aps.14.07": [53, true], "aps.14.08": [53, true], "aps.14.09": [53, true], "aps.14.10": [53, true], "aps.14.11": [53, true], "aps.14.12": [53, true], "aps.14.13": [53, true], "aps.14.14": [53, true], "aps.14.15": [53, true], "aps.14.16": [53, true], "aps.14.17": [53, true], "aps.14.18": [53, true], "aps.14.19": [53, true], "aps.14.20": [53, true], "aps.14.21": [53, true], "aps.14.22": [53, true], "aps.14.23": [53, true], "aps.14.24": [53, true], "aps.14.25": [53, true], "aps.14.26": [53, true], "aps.14.27": [53, true], "aps.14.28": [53, true], "aps.14.29": [53, true], "aps.14.30": [53, true], "aps.14.31": [53, true], "aps.14.32": [53, true], "aps.14.33": [53, true], "aps.14.34": [53, true], "aps.14.35": [53, true], "aps.14.36": [53, true], "aps.14.37": [53, true], "aps.14.38": [53, true], "aps.14.39": [53, true], "aps.15.00": [53, true], "aps.15.01": [53, true], "aps.15.02": [53, true], "aps.15.03": [53, true], "aps.15.04": [53, true], "aps.15.05": [53, true], "aps.15.06": [53, true], "aps.15.07": [53, true], "aps.15.08": [53, true], "aps.15.09": [53, true], "aps.15.10": [53, true], "aps.15.11": [53, true], "aps.15.12": [53, true], "aps.15.13": [53, true], "aps.15.14": [53, true], "aps.15.15": [53, true], "aps.15.16": [53, true], "aps.15.17": [53, true], "aps.15.18": [53, true], "aps.15.19": [53, true], "aps.15.20": [53, true], "aps.15.21": [53, true], "aps.15.22": [53, true], "aps.15.23": [53, true], "aps.15.24": [53, true], "aps.15.25": [53, true], "aps.15.26": [53, true], "aps.15.27": [53, true], "aps.15.28": [53, true], "aps.15.29": [53, true], "aps.15.30": [53, true]}}, "CHA": {"total": 3130, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [43, true], "fun1.2": [47, true], "fun1.3": [50, true], "fun1.4": [58, true], "fun1.5": [78, true], "fun2.1": [43, true], "fun2.2": [57, true], "fun2.3": [63, true], "fun2.4": [77, true], "fun2.5": [83, true], "fun3.1": [46, true], "fun3.2": [48, true], "fun3.3": [58, true], "fun3.4": [64, true], "fun3.5": [78, true], "fun4.1": [46, true], "fun4.2": [48, true], "fun4.3": [58, true], "fun4.4": [64, true], "fun4.5": [78, true], "fun5.1": [46, true], "fun5.2": [46, true], "fun5.3": [47, true], "fun5.4": [49, true], "fun5.5": [50, true], "fun6.1": [46, true], "fun6.2": [46, true], "fun6.3": [47, true], "fun6.4": [49, true], "fun6.5": [50, true], "fun7.1": [9, false], "fun7.2": [8, false], "fun7.3": [8, false], "fun7.4": [13, false], "fun7.5": [13, false], "fun8.1": [44, true], "fun8.2": [45, true], "fun8.3": [47, true], "fun8.4": [48, true], "fun8.5": [50, true], "fun9.1": [43, true], "fun9.2": [45, true], "fun9.3": [47, true], "fun9.4": [48, true], "fun9.5": [50, true]}}}, {"label": "log.cbrt.derived3.credit", "spec": ["pure", "cbrt", "derived3", "credit", "log"], "APS": {"total": 7679, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [44, true], "aps.02.00": [45, true], "aps.02.01": [46, true], "aps.02.02": [46, true], "aps.02.03": [47, true], "aps.02.04": [47, true], "aps.02.05": [47, true], "aps.02.06": [47, true], "aps.02.07": [47, true], "aps.02.08": [48, true], "aps.02.09": [48, true], "aps.03.00": [49, true], "aps.03.01": [49, true], "aps.03.02": [49, true], "aps.04.00": [46, true], "aps.04.01": [46, true], "aps.04.02": [46, true], "aps.04.03": [46, true], "aps.04.04": [46, true], "aps.04.05": [46, true], "aps.04.06": [46, true], "aps.04.07": [46, true], "aps.04.08": [46, true], "aps.04.09": [46, true], "aps.04.10": [46, true], "aps.04.11": [46, true], "aps.04.12": [46, true], "aps.04.13": [46, true], "aps.05.00": [44, true], "aps.06.00": [43, true], "aps.06.01": [43, true], "aps.06.02": [43, true], "aps.06.03": [43, true], "aps.06.04": [43, true], "aps.06.05": [43, true], "aps.06.06": [43, true], "aps.06.07": [43, true], "aps.06.08": [43, true], "aps.06.09": [43, true], "aps.07.00": [43, true], "aps.07.01": [43, true], "aps.07.02": [43, true], "aps.08.00": [3, true], "aps.08.01": [43, true], "aps.08.02": [43, true], "aps.08.03": [43, true], "aps.08.04": [43, true], "aps.09.00": [43, true], "aps.09.01": [43, true], "aps.09.02": [43, true], "aps.09.03": [43, true], "aps.09.04": [43, true], "aps.09.05": [43, true], "aps.09.06": [40, true], "aps.10.00": [43, true], "aps.10.01": [43, true], "aps.10.02": [43, true], "aps.10.03": [43, true], "aps.10.04": [43, true], "aps.11.00": [43, true], "aps.11.01": [43, true], "aps.11.02": [43, true], "aps.11.03": [43, true], "aps.12.00": [50, true], "aps.12.01": [50, true], "aps.12.02": [50, true], "aps.12.03": [50, true], "aps.12.04": [50, true], "aps.12.05": [50, true], "aps.12.06": [50, true], "aps.12.07": [50, true], "aps.12.08": [50, true], "aps.12.09": [50, true], "aps.12.10": [50, true], "aps.12.11": [50, true], "aps.12.12": [50, true], "aps.12.13": [50, true], "aps.12.14": [50, true], "aps.12.15": [50, true], "aps.12.16": [50, true], "aps.12.17": [50, true], "aps.12.18": [50, true], "aps.13.00": [9, false], "aps.14.00": [53, true], "aps.14.01": [53, true], "aps.14.02": [53, true], "aps.14.03": [53, true], "aps.14.04": [53, true], "aps.14.05": [53, true], "aps.14.06": [53, true], "aps.14.07": [53, true], "aps.14.08": [53, true], "aps.14.09": [53, true], "aps.14.10": [53, true], "aps.14.11": [53, true], "aps.14.12": [53, true], "aps.14.13": [53, true], "aps.14.14": [53, true], "aps.14.15": [53, true], "aps.14.16": [53, true], "aps.14.17": [53, true], "aps.14.18": [53, true], "aps.14.19": [53, true], "aps.14.20": [53, true], "aps.14.21": [53, true], "aps.14.22": [53, true], "aps.14.23": [53, true], "aps.14.24": [53, true], "aps.14.25": [53, true], "aps.14.26": [53, true], "aps.14.27": [53, true], "aps.14.28": [53, true], "aps.14.29": [53, true], "aps.14.30": [53, true], "aps.14.31": [53, true], "aps.14.32": [53, true], "aps.14.33": [53, true], "aps.14.34": [53, true], "aps.14.35": [53, true], "aps.14.36": [53, true], "aps.14.37": [53, true], "aps.14.38": [53, true], "aps.14.39": [53, true], "aps.15.00": [53, true], "aps.15.01": [53, true], "aps.15.02": [53, true], "aps.15.03": [53, true], "aps.15.04": [53, true], "aps.15.05": [53, true], "aps.15.06": [53, true], "aps.15.07": [53, true], "aps.15.08": [53, true], "aps.15.09": [53, true], "aps.15.10": [53, true], "aps.15.11": [53, true], "aps.15.12": [53, true], "aps.15.13": [53, true], "aps.15.14": [53, true], "aps.15.15": [53, true], "aps.15.16": [53, true], "aps.15.17": [53, true], "aps.15.18": [53, true], "aps.15.19": [53, true], "aps.15.20": [53, true], "aps.15.21": [53, true], "aps.15.22": [53, true], "aps.15.23": [53, true], "aps.15.24": [53, true], "aps.15.25": [53, true], "aps.15.26": [53, true], "aps.15.27": [53, true], "aps.15.28": [53, true], "aps.15.29": [53, true], "aps.15.30": [53, true]}}, "CHA": {"total": 3121, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [43, true], "fun1.2": [47, true], "fun1.3": [50, true], "fun1.4": [58, true], "fun1.5": [78, true], "fun2.1": [43, true], "fun2.2": [57, true], "fun2.3": [63, true], "fun2.4": [77, true], "fun2.5": [83, true], "fun3.1": [46, true], "fun3.2": [48, true], "fun3.3": [58, true], "fun3.4": [55, true], "fun3.5": [78, true], "fun4.1": [46, true], "fun4.2": [48, true], "fun4.3": [58, true], "fun4.4": [64, true], "fun4.5": [78, true], "fun5.1": [46, true], "fun5.2": [46, true], "fun5.3": [47, true], "fun5.4": [49, true], "fun5.5": [50, true], "fun6.1": [46, true], "fun6.2": [46, true], "fun6.3": [47, true], "fun6.4": [49, true], "fun6.5": [50, true], "fun7.1": [9, false], "fun7.2": [8, false], "fun7.3": [8, false], "fun7.4": [13, false], "fun7.5": [13, false], "fun8.1": [44, true], "fun8.2": [45, true], "fun8.3": [47, true], "fun8.4": [48, true], "fun8.5": [50, true], "fun9.1": [43, true], "fun9.2": [45, true], "fun9.3": [47, true], "fun9.4": [48, true], "fun9.5": [50, true]}}}, {"label": "log.cbrt.derived.project", "spec": ["pure", "cbrt", "derived", "project", "log"], "APS": {"total": 11543, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [68, true], "aps.02.00": [60, true], "aps.02.01": [64, true], "aps.02.02": [64, true], "aps.02.03": [69, true], "aps.02.04": [64, true], "aps.02.05": [63, true], "aps.02.06": [73, true], "aps.02.07": [76, true], "aps.02.08": [56, true], "aps.02.09": [72, true], "aps.03.00": [94, true], "aps.03.01": [94, true], "aps.03.02": [94, true], "aps.04.00": [63, true], "aps.04.01": [88, true], "aps.04.02": [70, true], "aps.04.03": [55, true], "aps.04.04": [67, true], "aps.04.05": [68, true], "aps.04.06": [68, true], "aps.04.07": [69, true], "aps.04.08": [69, true], "aps.04.09": [72, true], "aps.04.10": [66, true], "aps.04.11": [69, true], "aps.04.12": [66, true], "aps.04.13": [74, true], "aps.05.00": [65, true], "aps.06.00": [57, true], "aps.06.01": [64, true], "aps.06.02": [68, true], "aps.06.03": [69, true], "aps.06.04": [58, true], "aps.06.05": [73, true], "aps.06.06": [74, true], "aps.06.07": [77, true], "aps.06.08": [74, true], "aps.06.09": [69, true], "aps.07.00": [80, true], "aps.07.01": [81, true], "aps.07.02": [82, true], "aps.08.00": [3, true], "aps.08.01": [56, true], "aps.08.02": [67, true], "aps.08.03": [74, true], "aps.08.04": [65, true], "aps.09.00": [57, true], "aps.09.01": [75, true], "aps.09.02": [64, true], "aps.09.03": [72, true], "aps.09.04": [82, true], "aps.09.05": [44, true], "aps.09.06": [47, true], "aps.10.00": [58, true], "aps.10.01": [64, true], "aps.10.02": [63, true], "aps.10.03": [60, true], "aps.10.04": [59, true], "aps.11.00": [78, true], "aps.11.01": [58, true], "aps.11.02": [74, true], "aps.11.03": [70, true], "aps.12.00": [96, true], "aps.12.01": [89, true], "aps.12.02": [80, true], "aps.12.03": [82, true], "aps.12.04": [77, true], "aps.12.05": [85, true], "aps.12.06": [70, true], "aps.12.07": [77, true], "aps.12.08": [90, true], "aps.12.09": [70, true], "aps.12.10": [74, true], "aps.12.11": [81, true], "aps.12.12": [78, true], "aps.12.13": [71, true], "aps.12.14": [76, true], "aps.12.15": [83, true], "aps.12.16": [74, true], "aps.12.17": [75, true], "aps.12.18": [67, true], "aps.13.00": [15, false], "aps.14.00": [82, true], "aps.14.01": [82, true], "aps.14.02": [82, true], "aps.14.03": [82, true], "aps.14.04": [82, true], "aps.14.05": [82, true], "aps.14.06": [82, true], "aps.14.07": [82, true], "aps.14.08": [82, true], "aps.14.09": [82, true], "aps.14.10": [82, true], "aps.14.11": [82, true], "aps.14.12": [82, true], "aps.14.13": [82, true], "aps.14.14": [82, true], "aps.14.15": [82, true], "aps.14.16": [82, true], "aps.14.17": [82, true], "aps.14.18": [82, true], "aps.14.19": [82, true], "aps.14.20": [82, true], "aps.14.21": [82, true], "aps.14.22": [82, true], "aps.14.23": [82, true], "aps.14.24": [82, true], "aps.14.25": [82, true], "aps.14.26": [82, true], "aps.14.27": [82, true], "aps.14.28": [82, true], "aps.14.29": [82, true], "aps.14.30": [82, true], "aps.14.31": [82, true], "aps.14.32": [82, true], "aps.14.33": [82, true], "aps.14.34": [82, true], "aps.14.35": [82, true], "aps.14.36": [82, true], "aps.14.37": [82, true], "aps.14.38": [82, true], "aps.14.39": [82, true], "aps.15.00": [64, true], "aps.15.01": [68, true], "aps.15.02": [70, true], "aps.15.03": [69, true], "aps.15.04": [73, true], "aps.15.05": [70, true], "aps.15.06": [67, true], "aps.15.07": [76, true], "aps.15.08": [67, true], "aps.15.09": [65, true], "aps.15.10": [78, true], "aps.15.11": [90, true], "aps.15.12": [83, true], "aps.15.13": [79, true], "aps.15.14": [70, true], "aps.15.15": [77, true], "aps.15.16": [71, true], "aps.15.17": [70, true], "aps.15.18": [82, true], "aps.15.19": [71, true], "aps.15.20": [77, true], "aps.15.21": [80, true], "aps.15.22": [77, true], "aps.15.23": [87, true], "aps.15.24": [81, true], "aps.15.25": [71, true], "aps.15.26": [77, true], "aps.15.27": [80, true], "aps.15.28": [71, true], "aps.15.29": [73, true], "aps.15.30": [78, true]}}, "CHA": {"total": 4659, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [59, true], "fun1.2": [81, true], "fun1.3": [97, true], "fun1.4": [113, true], "fun1.5": [75, true], "fun2.1": [68, true], "fun2.2": [110, true], "fun2.3": [122, true], "fun2.4": [150, true], "fun2.5": [162, true], "fun3.1": [57, true], "fun3.2": [68, true], "fun3.3": [99, true], "fun3.4": [108, true], "fun3.5": [152, true], "fun4.1": [71, true], "fun4.2": [80, true], "fun4.3": [113, true], "fun4.4": [86, true], "fun4.5": [152, true], "fun5.1": [88, true], "fun5.2": [88, true], "fun5.3": [90, true], "fun5.4": [94, true], "fun5.5": [96, true], "fun6.1": [88, true], "fun6.2": [88, true], "fun6.3": [90, true], "fun6.4": [94, true], "fun6.5": [96, true], "fun7.1": [15, false], "fun7.2": [12, false], "fun7.3": [19, false], "fun7.4": [28, false], "fun7.5": [47, false], "fun8.1": [57, true], "fun8.2": [63, true], "fun8.3": [80, true], "fun8.4": [65, true], "fun8.5": [70, true], "fun9.1": [77, true], "fun9.2": [72, true], "fun9.3": [83, true], "fun9.4": [71, true], "fun9.5": [86, true]}}}, {"label": "log.cbrt.derived3.project", "spec": ["pure", "cbrt", "derived3", "project", "log"], "APS": {"total": 11617, "solved": 153, "n": 154, "over": 0, "per": {"aps.01.00": [65, true], "aps.02.00": [53, true], "aps.02.01": [63, true], "aps.02.02": [61, true], "aps.02.03": [58, true], "aps.02.04": [69, true], "aps.02.05": [68, true], "aps.02.06": [65, true], "aps.02.07": [67, true], "aps.02.08": [69, true], "aps.02.09": [66, true], "aps.03.00": [94, true], "aps.03.01": [94, true], "aps.03.02": [94, true], "aps.04.00": [74, true], "aps.04.01": [68, true], "aps.04.02": [61, true], "aps.04.03": [62, true], "aps.04.04": [60, true], "aps.04.05": [74, true], "aps.04.06": [74, true], "aps.04.07": [70, true], "aps.04.08": [71, true], "aps.04.09": [66, true], "aps.04.10": [66, true], "aps.04.11": [69, true], "aps.04.12": [74, true], "aps.04.13": [71, true], "aps.05.00": [65, true], "aps.06.00": [63, true], "aps.06.01": [75, true], "aps.06.02": [67, true], "aps.06.03": [63, true], "aps.06.04": [74, true], "aps.06.05": [71, true], "aps.06.06": [79, true], "aps.06.07": [74, true], "aps.06.08": [58, true], "aps.06.09": [76, true], "aps.07.00": [76, true], "aps.07.01": [82, true], "aps.07.02": [82, true], "aps.08.00": [3, true], "aps.08.01": [64, true], "aps.08.02": [70, true], "aps.08.03": [71, true], "aps.08.04": [68, true], "aps.09.00": [67, true], "aps.09.01": [62, true], "aps.09.02": [78, true], "aps.09.03": [74, true], "aps.09.04": [82, true], "aps.09.05": [42, true], "aps.09.06": [40, true], "aps.10.00": [55, true], "aps.10.01": [60, true], "aps.10.02": [69, true], "aps.10.03": [63, true], "aps.10.04": [59, true], "aps.11.00": [57, true], "aps.11.01": [71, true], "aps.11.02": [69, true], "aps.11.03": [82, true], "aps.12.00": [84, true], "aps.12.01": [75, true], "aps.12.02": [86, true], "aps.12.03": [66, true], "aps.12.04": [79, true], "aps.12.05": [79, true], "aps.12.06": [88, true], "aps.12.07": [75, true], "aps.12.08": [82, true], "aps.12.09": [74, true], "aps.12.10": [83, true], "aps.12.11": [92, true], "aps.12.12": [88, true], "aps.12.13": [77, true], "aps.12.14": [76, true], "aps.12.15": [74, true], "aps.12.16": [75, true], "aps.12.17": [64, true], "aps.12.18": [80, true], "aps.13.00": [11, false], "aps.14.00": [78, true], "aps.14.01": [78, true], "aps.14.02": [79, true], "aps.14.03": [78, true], "aps.14.04": [74, true], "aps.14.05": [79, true], "aps.14.06": [96, true], "aps.14.07": [78, true], "aps.14.08": [88, true], "aps.14.09": [74, true], "aps.14.10": [93, true], "aps.14.11": [79, true], "aps.14.12": [76, true], "aps.14.13": [96, true], "aps.14.14": [79, true], "aps.14.15": [78, true], "aps.14.16": [102, true], "aps.14.17": [88, true], "aps.14.18": [82, true], "aps.14.19": [74, true], "aps.14.20": [57, true], "aps.14.21": [93, true], "aps.14.22": [82, true], "aps.14.23": [79, true], "aps.14.24": [80, true], "aps.14.25": [76, true], "aps.14.26": [77, true], "aps.14.27": [96, true], "aps.14.28": [87, true], "aps.14.29": [79, true], "aps.14.30": [75, true], "aps.14.31": [78, true], "aps.14.32": [91, true], "aps.14.33": [102, true], "aps.14.34": [93, true], "aps.14.35": [88, true], "aps.14.36": [80, true], "aps.14.37": [82, true], "aps.14.38": [82, true], "aps.14.39": [74, true], "aps.15.00": [68, true], "aps.15.01": [72, true], "aps.15.02": [69, true], "aps.15.03": [78, true], "aps.15.04": [76, true], "aps.15.05": [78, true], "aps.15.06": [76, true], "aps.15.07": [78, true], "aps.15.08": [80, true], "aps.15.09": [77, true], "aps.15.10": [77, true], "aps.15.11": [75, true], "aps.15.12": [78, true], "aps.15.13": [67, true], "aps.15.14": [70, true], "aps.15.15": [76, true], "aps.15.16": [79, true], "aps.15.17": [68, true], "aps.15.18": [76, true], "aps.15.19": [78, true], "aps.15.20": [75, true], "aps.15.21": [74, true], "aps.15.22": [78, true], "aps.15.23": [79, true], "aps.15.24": [64, true], "aps.15.25": [74, true], "aps.15.26": [81, true], "aps.15.27": [86, true], "aps.15.28": [84, true], "aps.15.29": [83, true], "aps.15.30": [89, true]}}, "CHA": {"total": 4356, "solved": 40, "n": 45, "over": 0, "per": {"fun1.1": [60, true], "fun1.2": [72, true], "fun1.3": [87, true], "fun1.4": [112, true], "fun1.5": [67, true], "fun2.1": [64, true], "fun2.2": [70, true], "fun2.3": [87, true], "fun2.4": [102, true], "fun2.5": [96, true], "fun3.1": [49, true], "fun3.2": [68, true], "fun3.3": [79, true], "fun3.4": [55, true], "fun3.5": [152, true], "fun4.1": [68, true], "fun4.2": [79, true], "fun4.3": [90, true], "fun4.4": [85, true], "fun4.5": [152, true], "fun5.1": [88, true], "fun5.2": [88, true], "fun5.3": [90, true], "fun5.4": [94, true], "fun5.5": [96, true], "fun6.1": [88, true], "fun6.2": [88, true], "fun6.3": [90, true], "fun6.4": [94, true], "fun6.5": [96, true], "fun7.1": [15, false], "fun7.2": [21, false], "fun7.3": [11, false], "fun7.4": [29, false], "fun7.5": [26, false], "fun8.1": [73, true], "fun8.2": [66, true], "fun8.3": [70, true], "fun8.4": [75, true], "fun8.5": [71, true], "fun9.1": [62, true], "fun9.2": [62, true], "fun9.3": [90, true], "fun9.4": [87, true], "fun9.5": [94, true]}}}] \ No newline at end of file diff --git a/tests/test_log_space.py b/tests/test_log_space.py new file mode 100644 index 0000000..0584549 --- /dev/null +++ b/tests/test_log_space.py @@ -0,0 +1,107 @@ +"""Gates for the logarithmic space mode — checked BEFORE the ranking is consulted. + +PREREG_logarithmic_2026-09-20.md, amendment 1: + G1 the transform is parameter-free: c and s come from the bracket and the caller + (c = the end with the smaller |f|, s = xtol), never from a chosen constant. + G2' on APS-154 the cost must not grow (measured by the sweep, not here); what IS + checkable here is that the deviation from the x-space step is of SECOND order + in the bracket width, i.e. it vanishes as the bracket collapses. + +Also pinned: the transform round-trips, u-space is rejected where it cannot be read +(no silent fallback to a different scale), and the mode still solves. +""" + +from __future__ import annotations + +import inspect +import math +import re + +import pytest + +from simroot import pure as P + + +def _steps(width, space, fun=None): + """The points probed on a NONLINEAR f from a bracket of the given width around 1. + + Nonlinear on purpose: on a linear f the two spaces coincide EXACTLY (deviation + 0.0, measured 2026-09-20), because the derived scale makes the step the Newton + step and that lands on the root in either space — so a linear probe cannot see + the deviation at all.""" + calls = [] + g = fun or (lambda t: t * t * t - 1.0) + + def f(x): + calls.append(x) + return g(x) + + P.pure_root(f, 1.0 - width, 1.0 + width, xtol=1e-14, maxfev=200, + similarity="ratio", scale="derived", guard="none", space=space) + return calls + + +def test_G1_the_transform_carries_no_chosen_constant(): + src = "".join(inspect.getsource(fn) for fn in (P._log_map, P._log_unmap, P._log_space_step)) + literals = set(re.findall(r"(? i and len(xs_log) > i + dev[width] = abs(xs_log[i] - xs_x[i]) / width + # exact zero is a STRONGER pass than a shrinking deviation, so it is allowed + assert dev[1e-3] <= dev[1e-2] / 3.0 or dev[1e-2] == 0.0, dev + assert dev[1e-4] <= dev[1e-3] / 3.0 or dev[1e-3] == 0.0, dev + + +def test_the_mode_is_rejected_where_it_cannot_be_read(): + with pytest.raises(ValueError): + P.pure_root(lambda x: x, -1.0, 1.0, 1e-10, 100, scale="bracket", space="log") + with pytest.raises(ValueError): + P.pure_root(lambda x: x, -1.0, 1.0, 1e-10, 100, space="nope") + + +def test_the_mode_still_solves_both_a_narrow_and_a_wide_bracket(): + for lo, hi in ((0.5, 1.5), (-1e12, 3.0)): + x, nfev, ok = P.pure_root(lambda t: t - 1.0, lo, hi, xtol=1e-10, maxfev=500, + similarity="ratio", scale="derived3", guard="credit", + space="log") + assert ok and abs(x - 1.0) < 1e-8, (lo, hi, x, nfev, ok) + + +def test_x_space_is_untouched_by_the_new_parameter(): + """The published configuration must be bit-identical with the default space.""" + for lo, hi in ((0.5, 1.5), (0.5, 1e6)): # both brackets must straddle sqrt(2) + a = P.pure_root(lambda t: t * t - 2.0, lo, hi, 1e-12, 300, + similarity="ratio", scale="derived3", guard="credit") + b = P.pure_root(lambda t: t * t - 2.0, lo, hi, 1e-12, 300, + similarity="ratio", scale="derived3", guard="credit", space="x") + assert a == b