diff options
| author | Yuren Hao <yurenh2@illinois.edu> | 2026-07-03 07:57:22 -0500 |
|---|---|---|
| committer | Yuren Hao <yurenh2@illinois.edu> | 2026-07-03 07:57:22 -0500 |
| commit | bcec9560cf5c9b113e9381a52d1a941daa8865f2 (patch) | |
| tree | bae3baf6d742b816d90e642d70b9744a86a4d189 /ep_run/lt_ep_train.py | |
| parent | c0b507fb1760be291e1e1ed33f33fb18f16d8c2d (diff) | |
omega/norm-family refuted as stability signal; fingerprint story retracted; eigreg v2 = true map-eigenvalue (spec_penalty)HEADmaster
- eig_control: fix plain-PI bug (shifted PI for lambda_max of indefinite Sym);
add lead_rho + spec_penalty (soft one-sided cap on |lam|(I+eps*J_F), 2-D
Rayleigh-Ritz, matvec-only) โ aep 'spectral' ported. eig_penalty demoted to
diagnostic.
- eig_recheck.py (Lanczos audit): omega=+5..+13 on ALL operators incl the
stablest (s2000 +12.8 while true alpha=-0.02); gap omega-alpha~10; old
'warm -10.14 vs scratch +1.11' numbers were PI-mixture artifacts. RETRACTED.
- eig_v2_smoke/depth: v2 mechanics validated vs ARPACK; z_T1 readings >1 are
unconverged-state contamination (150: 1.009 -> 400/800: 0.997-0.999,
mu=-0.02..-0.006 matching eig_probe); fixed-point top = BAND of slow modes.
- lt_ep_train: --eigreg now spec_penalty (--eig_margin 0.995 = rho target);
--fingerprint reports rho/Re_mu instead of num_abscissa.
- ONBOARDING ยง4-7 + FINDINGS 2026-07-03: retraction + verdict (fundamental
quantity = finite-horizon path LE / resreg axis; de-cliff via floss-ept;
spec_penalty = measure-mode scalpel for a detaching Hopf pair).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FAPDWQ49M5Ye3NpTndTpn
Diffstat (limited to 'ep_run/lt_ep_train.py')
| -rw-r--r-- | ep_run/lt_ep_train.py | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/ep_run/lt_ep_train.py b/ep_run/lt_ep_train.py index 9974bd8..4e7b8b1 100644 --- a/ep_run/lt_ep_train.py +++ b/ep_run/lt_ep_train.py @@ -229,9 +229,10 @@ def ep_step(blk, idx, y, T1, T2, eps, beta, jacreg=0.0, holo=0, hr=0.02, t1max=0 for p, g in zip(blk.block, grr): if g is not None: grads[id(p)] = g * lam if grads.get(id(p)) is None else grads[id(p)] + lam * g - if eigreg > 0: # #2: leading-abscissa control (surgical, one-sided; alt to jacreg) - from eig_control import eig_penalty - ge, _om = eig_penalty(blk, zs, eigreg, eig_margin, blk.__dict__.setdefault('_eigcache', {})) + if eigreg > 0: # #2 v2: TRUE leading map-eigenvalue control (aep 'spectral', soft one-sided) + from eig_control import spec_penalty # (omega/numerical-abscissa version refuted 2026-07-03, eig_recheck) + ge, _rho, _mu = spec_penalty(blk, zs, eps, blk.c, eigreg, eig_margin, + blk.__dict__.setdefault('_eigcache', {})) for pid, g in ge.items(): grads[pid] = g if grads.get(pid) is None else grads[pid] + g return grads, res @@ -375,8 +376,8 @@ def main(): ap.add_argument('--res_gate', type=float, default=0.0) # validity gate: skip task grads above this res ap.add_argument('--wsd', type=float, default=0.0) # WSD: hold peak lr, cosine-decay only the last wsd fraction ap.add_argument('--resreg', type=float, default=0.0) # T1-residual penalty: defend z_T1 (cap ratio vs task grad); run res_gate=0 - ap.add_argument('--eigreg', type=float, default=0.0) # #2: leading-abscissa (numerical-abscissa) control โ surgical alt to jacreg - ap.add_argument('--eig_margin', type=float, default=1.0) # penalize omega(J_nc) above this (free-phase Hopf boundary ~ 1+c) + ap.add_argument('--eigreg', type=float, default=0.0) # #2 v2: soft penalty on TRUE |lam|_lead(I+eps*J_F) โ aep 'spectral' at C512 + ap.add_argument('--eig_margin', type=float, default=0.995) # rho target: penalize |lam|_lead above this (<1 = contracting relaxation map) ap.add_argument('--diag_cos', type=int, default=0) # #1: every N steps, log cos(EP grad, exact BPTT grad) + res ap.add_argument('--fingerprint', action='store_true') # load --init_ckpt, print (res,cos,abscissa,val) fingerprint, exit ap.add_argument('--opt', choices=['adamw', 'lion', 'lionlars', 'sgdm', 'sgdsai'], default='adamw') @@ -522,7 +523,7 @@ def main(): from diag_cos import fingerprint fp = fingerprint(blk, cfg.T1, cfg.T2, cfg.eps, cfg.beta, cfg.holo, cfg.hr, cfg.t1max, cfg.res_est, cfg.t2sel) print(f"[fingerprint] ckpt={cfg.init_ckpt or 'scratch'} | res={fp['res']:.2e} cos(EP,BPTT)={fp['cos']:.4f} " - f"num_abscissa={fp['num_abscissa']:+.4f} val={fp['val']:.4f}", flush=True) + f"rho={fp['rho']:.5f} Re_mu={fp['mu_re']:+.4f} val={fp['val']:.4f}", flush=True) return for step in range(start_step, cfg.steps + 1): idx, y = get_batch('train', cfg.B, cfg.T) |
