Why the analogy entry is late on the flat families (diagnostics only, method unchanged). At flag moments before entry: unlike-past 118, no-memory 7, m<2 2 - the order is not the bottleneck. The period-4 cycle: the flag rises in the phases whose configuration does NOT recur (the undershoot whose relative step shrinks every cycle, and the crossing); the recurring phases have the flag down and read the true order (fun4 = 6(x-2)^5: m ~ 4.9). The entry demands both at the same state. Remembering the analogy until the next flag: flat entry state 12.9 -> 8.2; problems entered APS 3 -> 8, fun9 0 -> 1.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
"""The state-by-state picture behind diag_analogy_late.py, for a few flat problems.
|
||||
|
||||
Every state the gate sees (trace hook, flatanalog, projection), in order:
|
||||
n evaluations spent (the trace does not carry it; states are numbered instead)
|
||||
flag r = f/f_prev >= 1/4 (the promise failed, sign kept)
|
||||
xi, phi the configuration
|
||||
ratio d_past / d_line (< 1 means analogous to the nearest past configuration)
|
||||
lag how many states back that nearest past configuration is
|
||||
m the pair's similarity exponent
|
||||
Nothing in the method changes.
|
||||
|
||||
python -u diag_analogy_sequence.py fun6.3 fun4.1 fun3.4
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
import sys
|
||||
|
||||
from simroot.pure import _config3, pure_root
|
||||
from sweep_full import MAXFEV, XTOL, load_problems
|
||||
|
||||
|
||||
def show(pid, f, a, b):
|
||||
st = {"trace": []}
|
||||
pure_root(f, a, b, XTOL, MAXFEV, similarity="ratio", scale="derived3", guard="project",
|
||||
prestep="flatanalog", stats=st)
|
||||
print(f"\n== {pid} (state, flag, xi, phi, d_past/d_line, lag, m)")
|
||||
past = []
|
||||
for k, s in enumerate(st["trace"][:30]):
|
||||
cur = _config3(s["x"], s["fx"], s["xp"], s["fp"], s["xp2"], s["fp2"])
|
||||
flag = s["fp"] != 0.0 and s["fx"] / s["fp"] >= 0.25
|
||||
if cur is None:
|
||||
print(f" {k:3d} {'F' if flag else '.'} (no configuration)")
|
||||
continue
|
||||
line = abs(cur[1] - cur[0]) / math.sqrt(2.0)
|
||||
if past:
|
||||
j = min(range(len(past)), key=lambda i: math.hypot(cur[0] - past[i][0],
|
||||
cur[1] - past[i][1]))
|
||||
q = past[j]
|
||||
ratio = math.hypot(cur[0] - q[0], cur[1] - q[1]) / line if line > 0 else math.inf
|
||||
lx, lf = cur[2] / q[2], cur[3] / q[3]
|
||||
m = (math.log(lf) / math.log(lx)) if lx not in (0.0, 1.0) and lf > 0 else math.nan
|
||||
lag = len(past) - j
|
||||
print(f" {k:3d} {'F' if flag else '.'} xi {cur[0]:+9.4f} phi {cur[1]:+10.4f} "
|
||||
f"ratio {ratio:7.3f} lag {lag:2d} m {m:6.2f}")
|
||||
else:
|
||||
print(f" {k:3d} {'F' if flag else '.'} xi {cur[0]:+9.4f} phi {cur[1]:+10.4f} (no memory)")
|
||||
past.append(cur)
|
||||
|
||||
|
||||
def main(ids):
|
||||
for s, pid, f, a, b, _root in load_problems():
|
||||
if s == "CHA" and pid in ids:
|
||||
show(pid, f, a, b)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:] or ["fun6.3", "fun4.1"])
|
||||
Reference in New Issue
Block a user