Skip to content

g-potential equilibrium map - #5

Open
MalachiteWind wants to merge 2 commits into
masterfrom
g-potential
Open

g-potential equilibrium map#5
MalachiteWind wants to merge 2 commits into
masterfrom
g-potential

Conversation

@MalachiteWind

Copy link
Copy Markdown
Contributor

No description provided.

…_full arm

Adds a new equilibrium map, g = grad_z Phi. Phi is a scalar potential with capped
spectral norms. This makes J_g = grad^2 Phi symmetric by construction.

Changes:

- ftnode/latent/equilibrium.py: add GradPotentialG. It bounds ||g||_2 with an l2
  ball, not an l-infinity box. It applies unequal spectral caps per layer. It
  provides project_() to hold the caps after each optimizer step. It provides
  curvature_headroom() as a diagnostic.
- ftnode/latent/nets.py: add the ACTIVATION_LIPSCHITZ table and lipschitz_bound().
  These certify ||grad Phi||_2 through the spectral caps.
- ftnode/latent/feasibility.py: add fit_potential() and FeasibilityResult. This
  checks if a frozen field already has a symmetric-J_g representation. The check
  runs in minutes. A full training arm takes much longer.
- ftnode/train.py: add a project_() hook after each optimizer step. The hook finds
  modules with a project_() method by duck typing. It does nothing for models that
  do not define one.
- ftnode/diagnostics.py: add jg_stats(). It reports the skew fraction and
  lambda_max(sym J_g) of an equilibrium map.
- tests/test_grad_potential.py: add tests for the new map's structural properties.
- tests/test_recovery.py: update the bound test. It now checks the bound each map
  declares, instead of assuming one shape for all maps.
- experiments/duffing/sym_jg_full.yaml, sym_jg_quick.yaml: add the new experiment.
  It compares svd_clamp+grad_potential against the l-ft-k-svd-clamp control. Both
  arms use the same operator, budget, and data.
- scripts/run_g_potential.sh, scripts/analyze_sym_jg.py, scripts/execute_notebooks.py:
  add scripts to run the experiment and report its diagnostics.
- examples/duffing/pkg_kappa_analysis.ipynb: re-run against runs/sym_jg_full.

Results:

- J_g is symmetric to float32 round-off.
- The ||g||_2 <= 3.0 cap never binds during training.
- No saddle point forms. The model stays monostable.
- Rollout RMSE is about 9 times worse than the incumbent map.

The mechanism works as designed. This arm does not match the incumbent's (svd_clamp) fit
quality.
dde27b9 (the _proto_*.py scratch and duffing_learned_splitting_control.ipynb)
was dropped from history. Rewrite the docstrings and comments that named those
files so the surviving provenance and rationale no longer points at absent
paths. Meaning and behavior are unchanged; the stale citations become
'the earlier prototype' / 'the control study', and the checkpoint-freeze
rationale is restated as 'frozen committed artifact' rather than 'the frozen
notebook loads it'.
Base automatically changed from cli-training to master August 20, 2026 03:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant