TNFR Logo
TheoryLearnSoftwareResearch

On this page

TNFR

Resonant Fractal Nature Theory — a mathematical framework for coherent patterns on graph-coupled networks.

About
  • Project history
  • Editorial policy
  • Contact
Resources
  • GitHub
  • PyPI
  • DOI · Zenodo
Legal
  • MIT License
  • Citation
© 2026 TNFR project — MIT licensed.DOI 10.5281/zenodo.17602860
docs
grammar
PHYSICS_VERIFICATION.md
API_CONTRACTS.mdCANONICAL_OZ_SEQUENCES.mdEMPIRICAL_CONFRONTATION_EEG.mdREADME.mdSTRUCTURAL_FIELDS_TETRAD.mdSTRUCTURAL_INTERFACE_THEORY.md
theory
APPLIED_STRUCTURAL_ANALYSIS.mdCATALOG_TYPE_HYGIENE_PROGRAMME.mdDISSIPATIVE_AND_OPEN_SYSTEMS.mdEMERGENT_ONTOLOGY.mdEXTENDED_FIELDS_AND_DERIVED_QUANTITIES.mdFUNDAMENTAL_THEORY.mdGAUGE_SYMMETRY_AND_UNIFICATION.mdGLOSSARY.mdMATHEMATICAL_DYNAMICS_BASIS.mdMINIMAL_STRUCTURAL_DEGREES.mdNUCLEUS_A_PRIME_LADDER_ATLAS.mdNUCLEUS_B_EQUIVARIANCE_OBSTRUCTIONS.mdPHYSICAL_REGIME_CORRESPONDENCES.mdREADME.mdREMESH_INFINITY_DERIVATION.mdSTRUCTURAL_CONSERVATION_THEOREM.mdSTRUCTURAL_OPERATORS.mdSTRUCTURAL_STABILITY_AND_DYNAMICS.mdTNFR_BSD_RESEARCH_NOTES.mdTNFR_HODGE_RESEARCH_NOTES.mdTNFR_NAVIER_STOKES_RESEARCH_NOTES.mdTNFR_NUMBER_THEORY.mdTNFR_P_VS_NP_RESEARCH_NOTES.mdTNFR_RIEMANN_RESEARCH_NOTES.mdTNFR_VARIATIONAL_PRINCIPLE.mdTNFR_YANG_MILLS_RESEARCH_NOTES.mdTNFR.pdfUNIFIED_GRAMMAR_RULES.md
factorization-lab
analysis
analyze_patterns.pycertificate_manifest.py
benchmarks
benchmark_analysis.pybenchmark_expansion_suite.pyfull_spectrum_factorization.pypaley_gap_extended.pypaley_gap_smoke.pytest_benchmark_suite.py
demos
experiment_contexts
exp_0b1663cd19b7.jsonexp_0bf0054b7474.jsonexp_75a4c8ca616a.jsonexp_848ee0fd1857.jsonexp_f6fe00562193.jsonexp_fdf3da424e1e.json
failure_telemetry_batch.pyfeedback_integration_demo.pyintegration_demo_snapshots.dbseed_management_integration_demo.pysnapshot_integration_demo.pytrajectory_143.jsontrajectory_77.jsontrajectory_89.jsontrajectory_91.jsontrajectory_97.json
docs
FACTORING_PLAYBOOK.mdFALSE_POSITIVE_TEST_SUITE.mdOPERATOR_CERTIFICATES.mdROADMAP.mdSPECTRAL_ROUTE.md
experiment_contexts
exp_cebe1d9e7d8e.json
notebooks
spectral_history.ipynb
scripts
run_false_positive_tests.py
tests
run_false_positive_test_suite.pytest_cli.pytest_false_positive_methodology.pytest_false_positive_verifier.pytest_feedback_integration.pytest_partitioning.pytest_seed_management.pytest_self_opt_support.pytest_snapshot_system.pytest_spectral_paley.pytest_verification_robustness.py
tnfr_factorization
__init__.pyapi.pycli.pyfailure_telemetry.pyfeedback_adapter.pyfeedback_integration.pypartitioning.pyself_opt_support.pyspectral_paley.py
demo_snapshots.dbLICENSE_SNAPSHOT.mdPACKAGE_SUMMARY.mdREADME.mdseed_management.pysnapshot_system.pytest_certificate_hashing.pytest_installation.pyverification_trajectory_77.json
benchmarks
analyze_tetrad_universality.pyb0star_alpha_canonical_product_graphs.pybenchmark_optimization_tracks.pybenchmark_utils.pyboundary_vibration.pybridge_primes_riemann.pychiral_involution.pycli_utils.pycoherence_projector_sense_index.pycommutant_bridge.pycomposition_arithmetic.pyconfinement_zones_test.pyconservation_law_validation.pydirected_paley_bridge.pyemergent_arithmetic_pulse.pyemergent_atom_dynamics.pyemergent_atomic_shells.pyemergent_base_dimension.pyemergent_dimension_dynamics.pyemergent_fractal_pulse.pyemergent_fractal_simplex_dimension.pyemergent_integers_symmetry.pyemergent_musical_nfr.pyemergent_nfr_geometry.pyemergent_nfr_where.pyemergent_rationals.pyemergent_rhythm.pyemergent_screening.pyemergent_shell_cardinals.pyemergent_shell_ordering.pyemergent_simplex_dimension.pyemergent_substrate_symmetry.pyequivariance_wall.pyexternal_phase_gate_validation.pyfield_methods_battery.pygolden_residue_remesh_bridge.pyintegrated_force_regime_study.pyinverse_spectrum_to_symmetry.pyk_phi_safety_demo.pykuramoto_farey_bridge.pymissing_piece_bridge.pymultichannel_interface_benchmark.pynavier_stokes_recipe_bridge.pynodal_propagator_residue_bridge.pyns_moment_hierarchy_cascade.pyoperational_irreducibility.pypaley_bridge.pyphase_curvature_investigation.pyphase_wall.pyphi_s_confinement_investigation.pyprimes_as_consequence.pypulse_phase_coherence_budget.pyREADME.mdremesh_infinity_riemann_baseline.pyremesh_infinity_riemann_composed.pyremesh_infinity_riemann_modified_graph.pyremesh_infinity_riemann_operator.pyremesh_infinity_riemann_spectral_basis.pyremesh_infinity_riemann_spectral_robustness.pyremesh_infinity_riemann_spectral.pyresidue_phase_vs_riemann.pystructural_interface_benchmark.pytemporal_interface_benchmark.pytetrad_results_aggregate.pyu2_destabilization_irreversibility.pyuniversality_clusters.pyxi_c_fast_experiment.py
primality-test
benchmarks
comprehensive_benchmark.py
docs
ADVANCED_INTEGRATION.mdmathematical_foundation.mdperformance_analysis.md
examples
advanced_examples.pybasic_usage.py
tnfr_primality
__init__.py__main__.pyadvanced_cli.pyadvanced_core.pycli.pyconstants.pycore.pyoptimized.py
MANIFEST.inPACKAGE_SUMMARY.mdREADME.mdRELEASE_NOTES_v1.0.mdsetup.pytest_installation.py
tests
core_physics
__init__.pytest_conservation_laws.pytest_delta_nfr_computation_paths.pytest_delta_nfr.pytest_dispersion_coherence_sign_invariance.pytest_emergent_constants_guard.pytest_lyapunov_operators.pytest_nodal_equation.pytest_structural_triad.py
data
replay_manifests
sample_run
_manifest_summary.json_manifest.json_partition_files.txt.gz
self_opt_validation
seed_alpha
paley.json
seed_beta
integration.json
seed_gamma
unknown.json
self_optimization
test_run
partitioned
test_run
test_run_p0.jsontest_run_p1.json
_manifest_summary.json_manifest.json
engines
test_pattern_discovery_manifest.pytest_self_optimization_engine.py
mathematics
__init__.pytest_autodiff.pytest_backends.pytest_dissipative_dynamics.pytest_epi.pytest_factory_patterns.pytest_metrics.pytest_navier_stokes_refounded.pytest_number_theory_canonical.pytest_operators.pytest_residue_networks.pytest_riemann_nodal_pulse.pytest_riemann_pulse_coherence.pytest_spaces.pytest_transforms.pytest_validator.py
operators
test_canonical_operators_modern.pytest_grammar_canon.pytest_grammar_canonical_consistency.pytest_grammar_dynamics.pytest_operator_contracts.pytest_operator_strategies.py
parallel
test_fractal_partition_manifest.py
physics
test_conservation_gauge_unification.pytest_dissipative_conservation.pytest_emergent_chemistry.pytest_field_cache_invalidation.pytest_gauge.pytest_phase_transition.pytest_signatures.pytest_spectral_conservation.pytest_structural_diffusion.pytest_structural_integrity.pytest_symplectic_substrate.pytest_tetrad_bounds.pytest_variational.pytest_yang_mills_closure.pytest_yang_mills_derivability.pytest_yang_mills_scaling.pytest_yang_mills_structural_gap.pytest_yang_mills_u6_sweep.py
scripts
test_run_self_opt_validation.pytest_run_self_optimization.py
sdk
__init__.pytest_simple_advanced.py
__init__.pyconftest.pyREADME.mdtest_breast_cancer_phase_gate_demo.pytest_classical_mechanics.pytest_distributed_fft.pytest_external_phase_gate_validation.pytest_factorization_entrypoint.pytest_multichannel_interface.pytest_nodal_optimizer.pytest_phase_gate_api.pytest_replay_register_manifest.pytest_signal_confrontation.pytest_structural_interface_api.pytest_structural_interface_baselines.pytest_structural_interface_benchmark.pytest_temporal_interface.pytest_vectorized_coherence_length_regression.pytest_wine_quality_phase_gate_demo.pyutils.py
examples
01_foundations
01_hello_world.py02_musical_resonance.py03_network_formation.py04_operator_sequences.py05_coherence_evolution.py06_network_topologies.py07_phase_transitions.py08_emergent_phenomena.py09_visualization_suite.py10_simplified_sdk_showcase.py
02_physics_regimes
11_classical_limit_comparison.py115_operator_contract_audit.py12_classical_mechanics_demo.py13_quantum_mechanics_demo.py14_uncertainty_and_interference.py15_train_crossing_demo.py17_conservation_law_demo.py26_gauge_structure_demo.py27_variational_principle_demo.py28_dissipative_systems_demo.py29_lyapunov_stability_demo.py30_self_optimization_demo.py31_mathematical_constants_basis.py33_complex_field_unification.py34_conservation_protocol_suite.py35_tetrad_irreducibility.py36_grammar_violation_detector.py37_operator_tetrad_synergy.py38_grammar_energy_landscape.py39_nodal_equation_decomposition.py
03_riemann_zeta
157_nodal_pulse_phase_attack.py41_von_mangoldt_zeta_demo.py42_riemann_zeros_as_resonances.py43_prime_ladder_hamiltonian_demo.py44_weil_explicit_formula_demo.py45_li_keiper_demo.py46_weil_tnfr_positivity_demo.py47_alpha_sweep_demo.py48_admissible_family_sweep_demo.py49_nodeaware_gauge_sweep_demo.py50_uniform_coercivity_demo.py51_adaptive_coercivity_demo.py52_paley_gap_coercivity_demo.py53_lyapunov_spectral_positivity_demo.py54_hilbert_polya_demo.py55_structural_zero_density_demo.py56_spectral_emergence_demo.py57_admissible_rescaling_demo.py58_oscillatory_correction_demo.py
04_riemann_L_twisted
59_dirichlet_l_function_demo.py60_dirichlet_l_continuation_demo.py61_dirichlet_l_hamiltonian_demo.py62_dirichlet_weil_explicit_formula_demo.py63_dirichlet_li_keiper_demo.py64_twisted_weil_positivity_demo.py65_twisted_alpha_sweep_demo.py66_twisted_admissible_family_sweep_demo.py67_twisted_nodeaware_gauge_sweep_demo.py68_twisted_hermite_family_demo.py69_twisted_coercivity_uniform_demo.py70_twisted_paley_gap_coercivity_demo.py71_twisted_lyapunov_spectral_demo.py72_twisted_hilbert_polya_demo.py73_twisted_structural_zero_density_demo.py74_twisted_spectral_emergence_demo.py75_twisted_admissible_rescaling_demo.py76_twisted_oscillatory_correction_demo.py
05_type_hygiene
77_remesh_infinity_residue_split_demo.py78_nuf_type_signature_demo.py79_epi_type_signature_demo.py80_phi_type_signature_demo.py81_dnfr_type_signature_demo.py82_remesh_window_type_signature_demo.py83_delta_phi_max_type_signature_demo.py84_coupling_weights_type_signature_demo.py85_tetrad_closure_signature_demo.py86_currents_closure_signature_demo.py87_aggregates_closure_signature_demo.py88_urules_consistency_signature_demo.py89_operator_catalog_discipline_signature_demo.py
06_navier_stokes
158_navier_stokes_two_face_refounded.py
07_number_theory
100_prime_families_orbits.py101_numbers_as_coupled_network.py102_nodal_flow_primes_equilibria.py116_nuf_emergent_prime_visibility.py146_primality_grammatical_inertness.py147_numbers_as_free_monoid_words.py148_capacity_arm_carries_von_mangoldt.py149_p14_is_the_capacity_arm_operator.py153_structural_frequency_rank_cyclotomy.py40_arithmetic_number_theory.py94_generative_number_construction.py95_primes_from_spectral_waves.py96_spectral_vibration_of_coherence.py97_goldbach_additive_multiplicative.pyemergent_chemistry_particles_demo.py
08_emergent_geometry
103_emergent_substrate_meets_riemann.py106_per_node_polarization_geometry.py107_orthogonal_structure_emergent_geometry.py108_emergent_field_generating_structure.py112_structure_predicts_coherence_flow.py113_overdamped_projection_bridge.py114_substrate_conserved_quantities.py117_emergent_geometry_residue_graph.py118_emergent_vs_classical_operator.py119_phase_sector_directed_residue.py120_symmetry_wall_substrate_vs_spectrum.py121_canonical_symmetry_break_negative.py122_factorization_phase_sector.py123_symmetry_sector_decomposition.py124_emergent_metric_fractal_consistency.py125_node_is_the_emergent_substrate.py126_two_layers_base_fiber.py127_base_is_emergent_not_imposed.py128_base_substrate_coemergence.py129_spectral_gap_base_fiber_clock.py130_operators_break_substrate_charges.py131_coemergent_loop_convergence.py132_geometric_phase_holonomy.py133_psi_topological_defects.py134_spectral_dimension_heat_kernel.py135_arrow_of_time_h_theorem.py136_heat_kernel_coefficients.py137_synchronization_transition.py138_structure_frequency_synchronization.py139_grammar_formal_language.py140_grammar_automaton.py141_grammar_rule_decomposition.py142_grammar_operator_quotient.py143_glyphic_function_sublanguage.py144_branching_combinator.py145_syntactic_monoid_starfree.py150_emergent_grammatical_pattern_parry.py151_grammar_in_emergent_geometry.py152_operator_contract_tetrahedron.py154_conductor_annotated_qr_spectrum.py155_ontological_position_of_numbers.py156_emergence_directness_law.py98_emergent_symplectic_substrate.py99_structural_diffusion.pyunified_fields_showcase.py
09_millennium
109_p_vs_np_coherence_synthesis.py110_bsd_rank_structural_pressure.py111_hodge_discrete_and_honest_gap.py
10_applications
159_empirical_confrontation_pipeline.py90_phase_gate_monitor_demo.py91_breast_cancer_phase_gate_demo.py92_wine_quality_phase_gate_demo.py93_structural_interface_demo.pypytorch_cuda_demo.py
README.md
scripts
replay
__init__.pyregister_manifest.py
__init__.pyREADME.mdrebuild_failure_manifest.pyrun_reproducible_benchmarks.pyrun_self_opt_validation.pyrun_self_optimization.pytnfr_is_prime.pyvalidate_conservation_law.pyverify_internal_references.py
src
core
__init__.pyevaluation.py
tnfr
backends
__init__.pyjax_backend.pynumpy_backend.pyoptimized_numpy.pyREADME.mdtorch_backend.py
cli
__init__.py__init__.pyiarguments.pyarguments.pyiexecution.pyexecution.pyiinteractive_validator.pyREADME.mdutils.pyutils.pyi
compat
__init__.pydataclass.pyjsonschema_stub.pymatplotlib_stub.pynumpy_stub.pyREADME.md
config
__init__.py__init__.pyiconstants.pyconstants.pyidefaults_core.pydefaults_init.pydefaults_metric.pydefaults.pyfeature_flags.pyfeature_flags.pyiglyph_constants.pyoperator_names.pyoperator_names.pyiphysics_derivation.pyprecision_modes.pypresets.pypresets.pyiREADME.mdsecurity.pythresholds.pytnfr_config.py
constants
__init__.py__init__.pyialiases.pyaliases.pyicanonical.pymetric.pymetric.pyioperational.py
core
__init__.pycontainer.pydefault_implementations.pyexceptions.pyinterfaces.pyREADME.md
dynamics
__init__.py__init__.pyiadaptation.pyadaptation.pyiadaptive_sequences.pyadaptive_sequences.pyiadelic.pyadvanced_cache_optimizer.pyadvanced_fft_arithmetic.pyaliases.pyaliases.pyibifurcation.pycache_aware_fft_engine.pycanonical.pycanonical.pyicomputational_hub.pycoordination.pycoordination.pyidistributed_fft.pydnfr.pydnfr.pyidynamic_limits.pyemergent_centralization.pyemergent_integration_engine.pyfeedback.pyfeedback.pyifft_backend.pyfft_cache_coordinator.pyfft_dispatchers.pyfft_engine.pyfft_workers.pyfused_dnfr.pyhomeostasis.pyhomeostasis.pyiintegrators.pyintegrators.pyilearning.pylearning.pyimetabolism.pymulti_modal_cache.pynbody_tnfr.pynbody.pynodal_optimizer.pyoptimization_orchestrator.pypropagation.pyREADME.mdruntime.pyruntime.pyisampling.pysampling.pyiselectors.pyselectors.pyiself_optimizing_engine.pyspectral_structural_fusion.pystructural_cache.pystructural_clip.pysymplectic.pyunified_backend.pyunified_mathematical_cache_orchestrator.py
engines
computation
__init__.pyfft_engine.pyunified_fft_engine.pyunified_gpu_system.py
constants
__init__.pycanonical.pyoperational.py
integration
__init__.pyemergent_integration.py
pattern_discovery
__init__.pymathematical_patterns.pymulti_modal_cache.py
self_optimization
__init__.pyengine.py
__init__.pyREADME.md
errors
__init__.pycontextual.py
factorization
__init__.py
flatten
README.md
gamma
README.md
glyph_history
README.md
glyph_runtime
README.md
immutable
README.md
initialization
README.md
io
README.md
math
__init__.pyfields_symbolic.pygrammar_validators.pyoptimizer.pyREADME.mdsymbolic.py
mathematics
__init__.pybackend.pybackend.pyidynamics.pydynamics.pyiepi.pyepi.pyigenerators.pygenerators.pyiliouville.pymetrics.pymetrics.pyinumber_theory.pyoperators_factory.pyoperators_factory.pyioperators.pyoperators.pyioptimized_primality.pyprojection.pyprojection.pyiREADME.mdruntime.pyruntime.pyispaces.pyspaces.pyispectral.pytransforms.pytransforms.pyiunified_cache.pyunified_numerical.pyzeta.py
metrics
__init__.py__init__.pyibuffer_cache.pybuffer_cache.pyicache_utils.pycoherence.pycoherence.pyicommon.pycommon.pyicore.pycore.pyidiagnosis.pydiagnosis.pyiemergence.pyexport.pyexport.pyiglyph_timing.pyglyph_timing.pyilearning_metrics.pylearning_metrics.pyilocal_coherence.pyphase_coherence.pyphase_compatibility.pyREADME.mdreporting.pyreporting.pyisense_index.pysense_index.pyitelemetry.pytetrad.pytrig_cache.pytrig_cache.pyitrig.pytrig.pyi
multiscale
__init__.pyhierarchical.pyREADME.md
navier_stokes
__init__.pyconservative_face.pyoperator.py
node
README.md
observers
README.md
operators
network_analysis
__init__.pysource_detection.py
postconditions
__init__.pymutation.py
preconditions
__init__.pycoherence.pydissonance.pyemission.pymutation.pyreception.pyresonance.py
strategies
__init__.pydefaults.pygpu_strategies.pystrategy.py
__init__.py__init__.pyialgebra.pycanonical_patterns.pycascade.pycoherence.pycontraction.pycoupling.pycycle_detection.pydefinitions_base.pydefinitions.pydefinitions.pyidissonance.pyemission.pyexpansion.pygrammar_application.pygrammar_canon.pygrammar_context.pygrammar_core.pygrammar_dynamics.pygrammar_error_factory.pygrammar_memoization.pygrammar_patterns.pygrammar_telemetry.pygrammar_types.pygrammar_u6.pygrammar_validate.pygrammar.pygrammar.pyihamiltonian.pyhealth_analyzer.pyintrospection.pyjitter.pyjitter.pyilifecycle.pymetabolism.pymetrics_basic.pymetrics_core.pymetrics_network.pymetrics_structural.pymetrics_u6.pymetrics.pymutation.pynodal_equation.pyoperator_contracts.pypattern_detection.pypatterns.pyREADME.mdreception.pyrecursivity.pyregistry.pyregistry.pyiremesh.pyremesh.pyiresonance.pyself_organization.pysilence.pystructural_units.pytransition.py
parallel
__init__.pyauto_scaler.pydistributed.pyengine.pymonitoring.pypartitioner.pyREADME.md
performance
guardrails.py
physics
__init__.py_helpers.pycalibration.pycanonical.pycell.pyclassical_mechanics.pyconservation_gauge_unification.pyconservation.pydissipative_conservation.pyemergent_chemistry.pyemergent_particles.pyextended.pyfields.pygauge.pyintegrity.pyinteractions.pylife.pylyapunov.pypatterns.pyphase_transition.pyquantum_mechanics.pyREADME.mdsignatures.pyspectral_conservation.pyspectral_metrics.pystructural_diffusion.pysymplectic_substrate.pytelemetry.pyunified.pyvariational.pyvectorized_ops.py
primality
__init__.py
recipes
__init__.pycookbook.pyREADME.md
riemann
__init__.pyadmissible_family_sweep.pyadmissible_rescaling.pyaggregates_closure_signature.pyalpha_sweep.pyanalytic_continuation_dirichlet.pyanalytic_continuation.pycoercivity_uniform.pycoupling_weights_type_signature.pycurrents_closure_signature.pydelta_phi_max_type_signature.pydirichlet_l.pydnfr_type_signature.pyepi_type_signature.pyhilbert_polya.pyli_keiper.pylyapunov_spectral_positivity.pynodal_pulse.pynodeaware_gauge_sweep.pynuf_type_signature.pyoperator_catalog_discipline_signature.pyoperator.pyoscillatory_correction.pypaley_gap_coercivity.pyphi_type_signature.pyprime_ladder_hamiltonian.pypulse_coherence.pyremesh_infinity_residue_split.pyremesh_window_type_signature.pyspectral_emergence.pystructural_zero_density.pytelemetry.pytetrad_closure_signature.pytwisted_admissible_family_sweep.pytwisted_admissible_rescaling.pytwisted_alpha_sweep.pytwisted_coercivity_uniform.pytwisted_hermite_family.pytwisted_hilbert_polya.pytwisted_li_keiper.pytwisted_lyapunov_spectral_positivity.pytwisted_nodeaware_gauge_sweep.pytwisted_oscillatory_correction.pytwisted_paley_gap_coercivity.pytwisted_prime_ladder_hamiltonian.pytwisted_spectral_emergence.pytwisted_structural_zero_density.pytwisted_weil_explicit_formula.pytwisted_weil_positivity.pyurules_consistency_signature.pyvon_mangoldt.pyweil_explicit_formula.pyweil_positivity.py
schemas
__init__.pygrammar.jsonREADME.md
sdk
__init__.py__init__.pyiadaptive_system.pyadaptive_system.pyibuilders.pybuilders.pyifluent.pyfluent.pyiREADME.mdself_opt.pysimple.pytemplates.pytemplates.pyiutils.py
security
__init__.pycrypto.pydatabase.pyREADME.mdsubprocess.pyvalidation.py
sequencing
__init__.pypatterns.pyREADME.md
services
__init__.pyorchestrator.pyREADME.md
sparse
__init__.pyREADME.mdrepresentations.py
structural
README.md
telemetry
__init__.pycache_metrics.pycache_metrics.pyiconstants.pynu_f.pynu_f.pyiREADME.mdunified_telemetry_system.pyverbosity.pyverbosity.pyi
tools
__init__.pydomain_templates.pyREADME.mdsequence_generator.pytnfr_is_prime_cli_optimized.pytnfr_is_prime_cli.py
topology
__init__.pyasymmetry.pyREADME.md
utils
cache_layers.pycache.pycache.pyicallbacks.pycallbacks.pyichunks.pychunks.pyidata.pydata.pyifast_diameter.pygraph.pygraph.pyiinit.pyinit.pyiio.pyio.pyinumeric.pynumeric.pyiREADME.mdtopology.pyunified_cache.py
validation
__init__.py__init__.pyiaggregator.pybase.pycompatibility.pycompatibility.pyiconfig.pygraph.pygraph.pyihealth.pyinput_validation.pyinterface_baselines.pyinvariants.pymultichannel_interface.pyphase_gate.pyREADME.mdrules.pyrules.pyiruntime.pyruntime.pyisequence_validator.pysignal_confrontation.pysoft_filters.pysoft_filters.pyispectral.pyspectral.pyistructural_interface.pytemporal_interface.pyunified_validation_system.pyvalidator.pywindow.pywindow.pyi
visualization
__init__.pycascade_viz.pyhierarchy.pyREADME.mdsequence_plotter.py
yang_mills
__init__.pyclosure.pyderivability.pyscaling.pystructural_gap.pyu6_sweep.py
__init__.py__init__.pyi_compat.py_version.py_version.pyialias.pyalias.pyibackend_config.pycache.pycache.pyiexecution.pyexecution.pyiflatten.pyflatten.pyigamma.pygamma.pyiglyph_history.pyglyph_history.pyiglyph_runtime.pyglyph_runtime.pyiimmutable.pyimmutable.pyiinitialization.pyinitialization.pyiio.pyio.pyilocking.pylocking.pyinode.pynode.pyiobservers.pyobservers.pyiontosim.pyontosim.pyipy.typedrng.pyrng.pyisecure_config.pyselector.pyselector.pyisense.pysense.pyistructural.pystructural.pyitokens.pytokens.pyitrace.pytrace.pyitypes.pytypes.pyiunits.pyunits.pyi
tetrad_evaluator.py
.pre-commit-config.yaml.semgrep.yaml.zenodo.jsonARCHITECTURE.mdbandit.yamlCHANGELOG.mdCITATION.cffCONTRIBUTING.mdEMERGENT_CANON_AUDIT.mdEMERGENT_DERIVATION_PLAN.mdLICENSE.mdMakefileMANIFEST.inpyproject.tomlpyrightconfig.jsonPYTORCH_CUDA_INTEGRATION.mdREADME.mdSECURITY.mdTESTING.mdTNFR_Website_Content_Brief.md
FILE: src/tnfr/physics/spectral_conservation.py

spectral_conservation.py

Source Code

python
r"""TNFR Spectral Conservation Laws — Conservation in the Eigenvalue Domain.

Lifts the structural conservation theorem to the spectral (frequency) domain
by expanding conservation fields in the graph Laplacian eigenbasis via the
Graph Fourier Transform (GFT).

MAIN RESULT (Spectral Continuity Theorem):
==========================================
Given the discrete structural continuity equation:

    Δρ(i)/Δt + div J(i) = S_grammar(i)

Apply the GFT (projection onto Laplacian eigenvectors ψ_k):

    dρ̂_k/dt + λ_k · Ĵ_k = Ŝ_k

where:
    ρ̂_k = ⟨ψ_k | ρ⟩     (charge density in mode k)
    Ĵ_k = ⟨ψ_k | div J⟩  (current divergence in mode k)
    Ŝ_k = ⟨ψ_k | S⟩      (source term in mode k)
    λ_k                    (Laplacian eigenvalue = mode frequency)

PHYSICAL INTERPRETATION:
========================
- **Low-frequency modes** (small λ_k): Global coherence — near-exact
  conservation (Ŝ_k ≈ 0).  These modes correspond to U5 multi-scale
  structure and persist under grammar-compliant evolution.

- **High-frequency modes** (large λ_k): Local fluctuations — rapid
  equilibration via λ_k · Ĵ_k dissipation.  Grammar violations
  (S_grammar ≠ 0) manifest primarily in these modes.

- **Parseval conservation**: Energy in the spatial domain equals energy
  in the spectral domain:  ‖ρ‖² = Σ_k |ρ̂_k|².  Drift in this identity
  signals numerical or structural inconsistency.

SPECTRAL ENERGY CONSERVATION:
=============================
The Lyapunov energy E = ½Σ_i [Φ_s² + |∇φ|² + K_φ² + J_φ² + J_ΔNFR²]
decomposes mode-by-mode:

    E_k = ½(|Φ̂_s_k|² + |∇̂φ_k|² + |K̂_φ_k|² + |Ĵ_φ_k|² + |Ĵ_ΔNFR_k|²)

Under grammar compliance (U2): dE_k/dt ≤ 0 for stabilizer-dominated modes.

DERIVATION:
===========
This module is derived via GFT of conservation.py equations.  The Laplacian
eigenbasis diagonalizes the diffusion operator, making mode-by-mode analysis
natural.  All results follow from the nodal equation ∂EPI/∂t = νf · ΔNFR(t)
and the structural continuity theorem (theory/STRUCTURAL_CONSERVATION_THEOREM.md §9).

STATUS: CANONICAL — Derived from spectral decomposition of proven conservation laws.

References
----------
- Structural conservation: src/tnfr/physics/conservation.py
- Spectral math: src/tnfr/mathematics/spectral.py (GFT, Laplacian)
- Theory: theory/STRUCTURAL_CONSERVATION_THEOREM.md §9.2
- Nodal equation: ∂EPI/∂t = νf · ΔNFR(t) [TNFR.pdf §2.1]
"""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any, Sequence

from ..mathematics.spectral import get_laplacian_spectrum, gft
from ..mathematics.unified_numerical import np
from .conservation import ConservationSnapshot, capture_conservation_snapshot

# ---------------------------------------------------------------------------
# Data structures
# ---------------------------------------------------------------------------


@dataclass(frozen=True)
class SpectralConservationBalance:
    r"""Two-snapshot spectral conservation verification.

    Verifies the mode-by-mode continuity equation:

        Δρ̂_k/Δt + λ_k · Ĵ_k ≈ 0

    for each Laplacian eigenmode k.

    Attributes
    ----------
    eigenvalues : np.ndarray
        Laplacian eigenvalues λ_k sorted ascending.  Shape (N,).
    eigenvectors : np.ndarray
        Laplacian eigenvectors ψ_k as columns.  Shape (N, N).
    rho_spectrum_before : np.ndarray
        Charge density spectrum ρ̂_k at t_0.  Shape (N,).
    rho_spectrum_after : np.ndarray
        Charge density spectrum ρ̂_k at t_1.  Shape (N,).
    div_spectrum_mean : np.ndarray
        Mean current divergence spectrum (Ĵ_k_before + Ĵ_k_after)/2.
    mode_residuals : np.ndarray
        Per-mode unsigned residual |Δρ̂_k/Δt + λ_k · Ĵ_k|.  Shape (N,).
    mode_sources : np.ndarray
        Per-mode signed source Ŝ_k = Δρ̂_k/Δt + λ_k · Ĵ_k.  Shape (N,).
    parseval_before : float
        Spectral energy Σ|ρ̂_k|² at t_0.
    parseval_after : float
        Spectral energy Σ|ρ̂_k|² at t_1.
    parseval_drift : float
        Relative Parseval drift |(E_after - E_before)| / max(E_before, ε).
    spectral_gap : float
        λ_1 — first non-trivial eigenvalue.
    n_conserved_modes : int
        Number of modes with residual below tolerance.
    conservation_quality_by_band : dict[str, float]
        Mean conservation quality per frequency band ('low', 'mid', 'high').
        Quality = 1 / (1 + mean_residual) ∈ [0, 1].
    overall_spectral_quality : float
        Global spectral conservation quality ∈ [0, 1].
    """

    eigenvalues: Any  # np.ndarray
    eigenvectors: Any  # np.ndarray
    rho_spectrum_before: Any  # np.ndarray
    rho_spectrum_after: Any  # np.ndarray
    div_spectrum_mean: Any  # np.ndarray
    mode_residuals: Any  # np.ndarray
    mode_sources: Any  # np.ndarray
    parseval_before: float
    parseval_after: float
    parseval_drift: float
    spectral_gap: float
    n_conserved_modes: int
    conservation_quality_by_band: dict[str, float]
    overall_spectral_quality: float


@dataclass(frozen=True)
class SpectralWardIdentity:
    r"""Per-operator spectral conservation signature.

    Characterizes how a canonical operator redistributes charge across
    spectral modes:  Δρ̂_k = ρ̂_k(after) - ρ̂_k(before).

    Attributes
    ----------
    operator_name : str
        Name of the canonical operator.
    delta_rho_spectrum : np.ndarray
        Change in charge spectrum per mode.
    mode_energy_change : np.ndarray
        Change in per-mode energy |ρ̂_k|².
    total_spectral_energy_change : float
        Σ Δ(|ρ̂_k|²).
    affected_band : str
        Dominant affected frequency band: 'low', 'mid', or 'high'.
    spectral_character : str
        'conservative' (total energy preserved),
        'dissipative' (energy decreasing),
        'injective' (energy increasing).
    """

    operator_name: str
    delta_rho_spectrum: Any  # np.ndarray
    mode_energy_change: Any  # np.ndarray
    total_spectral_energy_change: float
    affected_band: str
    spectral_character: str


@dataclass(frozen=True)
class SpectralLyapunovResult:
    r"""Spectral Lyapunov stability — mode-by-mode energy analysis.

    Decomposes the Lyapunov energy E = ½Σ_i[Φ_s² + |∇φ|² + K_φ² + J_φ² + J_ΔNFR²]
    into per-mode contributions via GFT.

    Attributes
    ----------
    mode_energies_before : np.ndarray
        Per-mode energy at t_0.
    mode_energies_after : np.ndarray
        Per-mode energy at t_1.
    mode_derivatives : np.ndarray
        dE_k/dt ≈ (E_k(t_1) - E_k(t_0)) / dt per mode.
    total_derivative : float
        Σ dE_k/dt — total spectral energy derivative.
    n_unstable_modes : int
        Number of modes where dE_k/dt > stability_threshold.
    stable_fraction : float
        Fraction of modes with dE_k/dt ≤ stability_threshold.
    is_spectrally_stable : bool
        True if total_derivative ≤ 0 (Lyapunov condition in spectral domain).
    """

    mode_energies_before: Any  # np.ndarray
    mode_energies_after: Any  # np.ndarray
    mode_derivatives: Any  # np.ndarray
    total_derivative: float
    n_unstable_modes: int
    stable_fraction: float
    is_spectrally_stable: bool


@dataclass(frozen=True)
class SpectralSectorDecomposition:
    r"""Two-sector (potential/geometric) spectral analysis.

    Decomposes ρ = Φ_s + K_φ into its two sectors in the Laplacian eigenbasis,
    revealing how global potential and local curvature distribute across
    structural frequencies.

    Attributes
    ----------
    phi_s_spectrum : np.ndarray
        GFT of structural potential Φ_s. Shape (N,).
    k_phi_spectrum : np.ndarray
        GFT of phase curvature K_φ. Shape (N,).
    potential_sector_energy : float
        Σ |Φ̂_s_k|²  (total energy in potential sector).
    geometric_sector_energy : float
        Σ |K̂_φ_k|²  (total energy in geometric sector).
    cross_sector_correlation : float
        Pearson correlation between Φ̂_s and K̂_φ spectra.
    sector_coupling_by_mode : np.ndarray
        Per-mode coupling strength: |Φ̂_s_k · K̂_φ_k|.
    dominant_sector : str
        'potential' or 'geometric' based on total energy.
    sector_ratio : float
        potential_energy / geometric_energy (or inf/0 edge cases).
    """

    phi_s_spectrum: Any  # np.ndarray
    k_phi_spectrum: Any  # np.ndarray
    potential_sector_energy: float
    geometric_sector_energy: float
    cross_sector_correlation: float
    sector_coupling_by_mode: Any  # np.ndarray
    dominant_sector: str
    sector_ratio: float


# ---------------------------------------------------------------------------
# Internal helpers
# ---------------------------------------------------------------------------

# Canonical 5 conservation fields used for Lyapunov energy computation
_LYAPUNOV_FIELDS: list[str] = ["phi_s", "grad_phi", "k_phi", "j_phi", "j_dnfr"]


def _snapshot_to_vectors(
    snapshot: ConservationSnapshot,
    nodes: Sequence[Any],
) -> dict[str, np.ndarray]:
    """Extract ordered arrays from a conservation snapshot."""
    return {
        "rho": np.array([snapshot.charge_density[n] for n in nodes]),
        "div": np.array([snapshot.divergence[n] for n in nodes]),
        "phi_s": np.array([snapshot.phi_s[n] for n in nodes]),
        "k_phi": np.array([snapshot.k_phi[n] for n in nodes]),
        "j_phi": np.array([snapshot.j_phi[n] for n in nodes]),
        "j_dnfr": np.array([snapshot.j_dnfr[n] for n in nodes]),
        "grad_phi": np.array([snapshot.grad_phi[n] for n in nodes]),
    }


def _gft_fields(
    eigvecs: np.ndarray,
    fields: dict[str, np.ndarray],
) -> dict[str, np.ndarray]:
    """Project multiple spatial signals onto the Laplacian eigenbasis via GFT.

    Uses the canonical ``gft()`` from ``mathematics.spectral`` which supports
    GPU acceleration for large matrices.
    """
    return {name: gft(signal, eigvecs) for name, signal in fields.items()}


def _compute_spectral_field_energies(
    vecs_before: dict[str, np.ndarray],
    vecs_after: dict[str, np.ndarray],
    eigvecs: np.ndarray,
    fields: list[str] = _LYAPUNOV_FIELDS,
) -> tuple[np.ndarray, np.ndarray, dict[str, tuple[float, float]]]:
    r"""Per-mode Lyapunov energy from GFT of conservation fields.

    Computes E_k = ½ Σ_f |f̂_k|² for each mode k across the specified fields.

    Returns
    -------
    energy_before, energy_after : np.ndarray
        Per-mode energy arrays of shape (N,).
    per_field : dict[str, tuple[float, float]]
        Total spectral energy (before, after) for each field.
    """
    n = eigvecs.shape[0]
    energy_before = np.zeros(n)
    energy_after = np.zeros(n)
    per_field: dict[str, tuple[float, float]] = {}

    for field in fields:
        hat_0 = gft(vecs_before[field], eigvecs)
        hat_1 = gft(vecs_after[field], eigvecs)
        e0_sq = hat_0**2
        e1_sq = hat_1**2
        energy_before += e0_sq
        energy_after += e1_sq
        per_field[field] = (float(np.sum(e0_sq)), float(np.sum(e1_sq)))

    energy_before *= 0.5
    energy_after *= 0.5
    return energy_before, energy_after, per_field


def _classify_band(k: int, n: int) -> str:
    """Classify eigenmode index into frequency band."""
    if n <= 3:
        return "low"
    third = n / 3.0
    if k < third:
        return "low"
    elif k < 2 * third:
        return "mid"
    else:
        return "high"


def _band_quality(residuals: np.ndarray, n: int) -> dict[str, float]:
    """Compute conservation quality per frequency band.

    Quality = 1/(1 + mean_residual) ∈ [0, 1].
    """
    bands: dict[str, list] = {"low": [], "mid": [], "high": []}
    for k in range(n):
        bands[_classify_band(k, n)].append(float(residuals[k]))

    result: dict[str, float] = {}
    for name, vals in bands.items():
        if vals:
            mean_r = sum(vals) / len(vals)
            result[name] = 1.0 / (1.0 + mean_r)
        else:
            result[name] = 1.0
    return result


# ---------------------------------------------------------------------------
# Core: Spectral conservation balance (two-snapshot)
# ---------------------------------------------------------------------------


def verify_spectral_conservation_balance(
    before: ConservationSnapshot,
    after: ConservationSnapshot,
    G: Any,
    dt: float = 1.0,
    tolerance: float = 1e-6,
) -> SpectralConservationBalance:
    r"""Verify the spectral continuity equation across two snapshots.

    For each Laplacian eigenmode k, computes:

        Ŝ_k = Δρ̂_k/Δt + λ_k · Ĵ_k

    where Ŝ_k is the spectral source term (should be ≈ 0 under grammar
    compliance).  This is the GFT of the spatial continuity equation
    ∂ρ/∂t + div(J) = S_grammar.

    Physics
    -------
    Low-frequency modes (global coherence) exhibit near-exact conservation.
    High-frequency modes (local fluctuations) show larger residuals due to
    rapid equilibration.  The spectral gap λ_1 determines the rate at which
    global modes relax.

    Parameters
    ----------
    before : ConservationSnapshot
        State at time t_0.
    after : ConservationSnapshot
        State at time t_1 = t_0 + dt.
    G : TNFRGraph
        The graph (needed for Laplacian eigenbasis).
    dt : float
        Time step Δt > 0.
    tolerance : float
        Residual threshold for classifying a mode as "conserved".

    Returns
    -------
    SpectralConservationBalance
    """
    nodes = sorted(before.charge_density.keys())
    n = len(nodes)

    eigvals, eigvecs = get_laplacian_spectrum(G)

    vecs_before = _snapshot_to_vectors(before, nodes)
    vecs_after = _snapshot_to_vectors(after, nodes)

    # GFT: project into eigenbasis
    rho_hat_0 = gft(vecs_before["rho"], eigvecs)
    rho_hat_1 = gft(vecs_after["rho"], eigvecs)
    div_hat_0 = gft(vecs_before["div"], eigvecs)
    div_hat_1 = gft(vecs_after["div"], eigvecs)

    # Mean divergence spectrum (trapezoidal-like average)
    div_hat_mean = 0.5 * (div_hat_0 + div_hat_1)

    # Mode-by-mode continuity residual
    drho_dt = (rho_hat_1 - rho_hat_0) / dt
    mode_sources = drho_dt + eigvals * div_hat_mean
    mode_residuals = np.abs(mode_sources)

    # Parseval identity: ‖ρ‖² = Σ|ρ̂_k|²
    parseval_0 = float(np.sum(rho_hat_0**2))
    parseval_1 = float(np.sum(rho_hat_1**2))
    denom = max(parseval_0, 1e-15)
    parseval_drift = abs(parseval_1 - parseval_0) / denom

    # Spectral gap
    spectral_gap = float(eigvals[1]) if n > 1 else 0.0

    # Conserved mode count
    n_conserved = int(np.sum(mode_residuals <= tolerance))

    # Band-resolved quality
    band_quality = _band_quality(mode_residuals, n)

    # Overall quality: 1/(1 + RMS residual)
    rms = float(np.sqrt(np.mean(mode_residuals**2))) if n > 0 else 0.0
    overall_quality = 1.0 / (1.0 + rms)

    return SpectralConservationBalance(
        eigenvalues=eigvals,
        eigenvectors=eigvecs,
        rho_spectrum_before=rho_hat_0,
        rho_spectrum_after=rho_hat_1,
        div_spectrum_mean=div_hat_mean,
        mode_residuals=mode_residuals,
        mode_sources=mode_sources,
        parseval_before=parseval_0,
        parseval_after=parseval_1,
        parseval_drift=parseval_drift,
        spectral_gap=spectral_gap,
        n_conserved_modes=n_conserved,
        conservation_quality_by_band=band_quality,
        overall_spectral_quality=overall_quality,
    )


# ---------------------------------------------------------------------------
# Spectral Ward identity (per-operator)
# ---------------------------------------------------------------------------


def compute_spectral_ward_identity(
    before: ConservationSnapshot,
    after: ConservationSnapshot,
    operator_name: str,
    G: Any,
) -> SpectralWardIdentity:
    r"""Compute per-operator spectral conservation signature.

    Characterizes how a canonical operator redistributes structural charge
    across spectral modes.  Complements the spatial Ward identity in
    conservation.py by revealing *which frequency scales* the operator
    affects.

    Physics
    -------
    - Stabilizers (IL, THOL): Should primarily affect high-frequency modes
      (local smoothing), preserving low-frequency global structure.
    - Destabilizers (OZ, VAL): Inject energy into mid/high-frequency modes.
    - Generators (AL, NAV): Affect all bands (new structure creation).
    - Coupling (UM, RA): Redistribute energy across modes via phase sync.

    Parameters
    ----------
    before : ConservationSnapshot
        State before operator application.
    after : ConservationSnapshot
        State after operator application.
    operator_name : str
        Canonical operator name (e.g. 'IL', 'OZ', 'AL').
    G : TNFRGraph
        The graph.

    Returns
    -------
    SpectralWardIdentity
    """
    nodes = sorted(before.charge_density.keys())
    n = len(nodes)

    _, eigvecs = get_laplacian_spectrum(G)

    vecs_before = _snapshot_to_vectors(before, nodes)
    vecs_after = _snapshot_to_vectors(after, nodes)

    rho_hat_0 = gft(vecs_before["rho"], eigvecs)
    rho_hat_1 = gft(vecs_after["rho"], eigvecs)

    delta_rho = rho_hat_1 - rho_hat_0

    # Per-mode energy change: Δ(|ρ̂_k|²) = |ρ̂_k_after|² - |ρ̂_k_before|²
    energy_before = rho_hat_0**2
    energy_after = rho_hat_1**2
    mode_energy_change = energy_after - energy_before

    total_change = float(np.sum(mode_energy_change))

    # Determine which band is most affected (by absolute energy change)
    band_energy: dict[str, float] = {"low": 0.0, "mid": 0.0, "high": 0.0}
    for k in range(n):
        band = _classify_band(k, n)
        band_energy[band] += abs(float(mode_energy_change[k]))

    affected_band = max(band_energy, key=band_energy.get)  # type: ignore[arg-type]

    # Classify spectral character
    eps = 1e-12
    if abs(total_change) < eps:
        spectral_character = "conservative"
    elif total_change < -eps:
        spectral_character = "dissipative"
    else:
        spectral_character = "injective"

    return SpectralWardIdentity(
        operator_name=operator_name,
        delta_rho_spectrum=delta_rho,
        mode_energy_change=mode_energy_change,
        total_spectral_energy_change=total_change,
        affected_band=affected_band,
        spectral_character=spectral_character,
    )


# ---------------------------------------------------------------------------
# Spectral Lyapunov stability
# ---------------------------------------------------------------------------


def compute_spectral_lyapunov(
    before: ConservationSnapshot,
    after: ConservationSnapshot,
    G: Any,
    dt: float = 1.0,
    stability_threshold: float = 1e-6,
) -> SpectralLyapunovResult:
    r"""Spectral decomposition of Lyapunov energy stability.

    Decomposes the structural energy functional E = ½Σ_i[Φ_s² + |∇φ|² + K_φ²
    + J_φ² + J_ΔNFR²] into per-mode contributions, then checks:

        dE_k/dt ≤ 0  (mode-stable)

    Under grammar compliance (U2: convergence), the total spectral energy
    derivative should be non-positive: Σ dE_k/dt ≤ 0.

    Parameters
    ----------
    before, after : ConservationSnapshot
        Two successive states.
    G : TNFRGraph
    dt : float
        Time step.
    stability_threshold : float
        Modes with dE_k/dt > threshold are classified as unstable.

    Returns
    -------
    SpectralLyapunovResult
    """
    nodes = sorted(before.charge_density.keys())
    n = len(nodes)

    _, eigvecs = get_laplacian_spectrum(G)

    vecs_before = _snapshot_to_vectors(before, nodes)
    vecs_after = _snapshot_to_vectors(after, nodes)

    # Per-mode Lyapunov energy via unified helper
    energy_before, energy_after, _ = _compute_spectral_field_energies(
        vecs_before,
        vecs_after,
        eigvecs,
        _LYAPUNOV_FIELDS,
    )

    derivatives = (energy_after - energy_before) / dt
    total_derivative = float(np.sum(derivatives))

    n_unstable = int(np.sum(derivatives > stability_threshold))
    stable_frac = 1.0 - n_unstable / max(n, 1)

    return SpectralLyapunovResult(
        mode_energies_before=energy_before,
        mode_energies_after=energy_after,
        mode_derivatives=derivatives,
        total_derivative=total_derivative,
        n_unstable_modes=n_unstable,
        stable_fraction=stable_frac,
        is_spectrally_stable=total_derivative <= stability_threshold,
    )


# ---------------------------------------------------------------------------
# Spectral sector decomposition
# ---------------------------------------------------------------------------


def decompose_spectral_sectors(
    G: Any,
    snapshot: ConservationSnapshot | None = None,
) -> SpectralSectorDecomposition:
    r"""Decompose the two conservation sectors in spectral domain.

    The structural charge ρ = Φ_s + K_φ consists of:
    - **Potential sector** (Φ_s): Global ΔNFR-driven dynamics
    - **Geometric sector** (K_φ): Local phase-driven dynamics

    This function computes their GFT spectra and measures how the two sectors
    couple across frequency modes.  Strong coupling indicates the complex field
    Ψ = K_φ + i·J_φ is active.

    Parameters
    ----------
    G : TNFRGraph
    snapshot : ConservationSnapshot, optional
        If None, captured from G.

    Returns
    -------
    SpectralSectorDecomposition
    """
    if snapshot is None:
        snapshot = capture_conservation_snapshot(G)

    nodes = sorted(snapshot.charge_density.keys())
    n = len(nodes)

    _, eigvecs = get_laplacian_spectrum(G)

    vecs = _snapshot_to_vectors(snapshot, nodes)
    phi_s_hat = gft(vecs["phi_s"], eigvecs)
    k_phi_hat = gft(vecs["k_phi"], eigvecs)

    pot_energy = float(np.sum(phi_s_hat**2))
    geo_energy = float(np.sum(k_phi_hat**2))

    # Pearson correlation between spectra
    if n > 1:
        std_phi = float(np.std(phi_s_hat))
        std_kphi = float(np.std(k_phi_hat))
        if std_phi > 1e-15 and std_kphi > 1e-15:
            corr = float(np.corrcoef(phi_s_hat, k_phi_hat)[0, 1])
        else:
            corr = 0.0
    else:
        corr = 0.0

    coupling = np.abs(phi_s_hat * k_phi_hat)

    if geo_energy > 1e-15:
        ratio = pot_energy / geo_energy
    else:
        ratio = float("inf") if pot_energy > 1e-15 else 1.0

    dominant = "potential" if pot_energy >= geo_energy else "geometric"

    return SpectralSectorDecomposition(
        phi_s_spectrum=phi_s_hat,
        k_phi_spectrum=k_phi_hat,
        potential_sector_energy=pot_energy,
        geometric_sector_energy=geo_energy,
        cross_sector_correlation=corr,
        sector_coupling_by_mode=coupling,
        dominant_sector=dominant,
        sector_ratio=ratio,
    )


# ---------------------------------------------------------------------------
# Spectral energy conservation (Parseval-based)
# ---------------------------------------------------------------------------


def compute_spectral_energy_conservation(
    before: ConservationSnapshot,
    after: ConservationSnapshot,
    G: Any,
) -> dict[str, float]:
    r"""Measure Parseval energy conservation across all five canonical fields.

    For each field f ∈ {Φ_s, |∇φ|, K_φ, J_φ, J_ΔNFR}, the Parseval identity
    guarantees ‖f‖² = Σ_k |f̂_k|².  This function measures the drift in
    total spectral energy between two snapshots:

        ΔE_f = |Σ|f̂_k(t1)|² - Σ|f̂_k(t0)|²| / max(Σ|f̂_k(t0)|², ε)

    Small ΔE_f indicates structural stability in the spectral domain.

    Parameters
    ----------
    before, after : ConservationSnapshot
    G : TNFRGraph

    Returns
    -------
    dict[str, float]
        Keys: 'phi_s_drift', 'grad_phi_drift', 'k_phi_drift',
        'j_phi_drift', 'j_dnfr_drift', 'total_energy_before',
        'total_energy_after', 'total_drift'.
    """
    nodes = sorted(before.charge_density.keys())

    _, eigvecs = get_laplacian_spectrum(G)

    vecs_before = _snapshot_to_vectors(before, nodes)
    vecs_after = _snapshot_to_vectors(after, nodes)

    # Unified energy computation for all five canonical fields
    _, _, per_field = _compute_spectral_field_energies(
        vecs_before,
        vecs_after,
        eigvecs,
        _LYAPUNOV_FIELDS,
    )

    result: dict[str, float] = {}
    total_e0 = 0.0
    total_e1 = 0.0

    for field in _LYAPUNOV_FIELDS:
        e0, e1 = per_field[field]
        denom = max(e0, 1e-15)
        result[f"{field}_drift"] = abs(e1 - e0) / denom
        total_e0 += e0
        total_e1 += e1

    result["total_energy_before"] = total_e0
    result["total_energy_after"] = total_e1
    denom = max(total_e0, 1e-15)
    result["total_drift"] = abs(total_e1 - total_e0) / denom

    return result


# ---------------------------------------------------------------------------
# Mode classification
# ---------------------------------------------------------------------------


def classify_spectral_modes(
    G: Any,
    snapshot: ConservationSnapshot | None = None,
    threshold: float | None = None,
) -> dict[str, Any]:
    r"""Classify spectral modes by their conservation behavior.

    Each mode k is classified as:
    - 'conserved': |λ_k · Ĵ_k| < threshold (low transport rate)
    - 'dissipative': λ_k · Ĵ_k > 0 and above threshold
    - 'accumulative': λ_k · Ĵ_k < 0 and above threshold

    This mirrors the spatial conservation analysis but in the frequency
    domain, where the classification is mode-wise rather than node-wise.

    Parameters
    ----------
    G : TNFRGraph
    snapshot : ConservationSnapshot, optional
    threshold : float, optional
        Classification threshold.  Defaults to median |λ_k · Ĵ_k|.

    Returns
    -------
    dict with keys:
        'mode_labels': list of str per mode
        'n_conserved': int
        'n_dissipative': int
        'n_accumulative': int
        'mode_transport_rates': np.ndarray (λ_k · Ĵ_k signed)
    """
    if snapshot is None:
        snapshot = capture_conservation_snapshot(G)

    nodes = sorted(snapshot.charge_density.keys())
    n = len(nodes)

    eigvals, eigvecs = get_laplacian_spectrum(G)

    vecs = _snapshot_to_vectors(snapshot, nodes)
    div_hat = gft(vecs["div"], eigvecs)

    transport_rates = eigvals * div_hat

    if threshold is None:
        threshold = float(np.median(np.abs(transport_rates))) if n > 0 else 0.0

    labels = []
    n_cons = n_diss = n_acc = 0
    for k in range(n):
        rate = float(transport_rates[k])
        if abs(rate) < threshold:
            labels.append("conserved")
            n_cons += 1
        elif rate > 0:
            labels.append("dissipative")
            n_diss += 1
        else:
            labels.append("accumulative")
            n_acc += 1

    return {
        "mode_labels": labels,
        "n_conserved": n_cons,
        "n_dissipative": n_diss,
        "n_accumulative": n_acc,
        "mode_transport_rates": transport_rates,
    }


# ---------------------------------------------------------------------------
# Public API
# ---------------------------------------------------------------------------

__all__ = [
    # Data structures
    "SpectralConservationBalance",
    "SpectralWardIdentity",
    "SpectralLyapunovResult",
    "SpectralSectorDecomposition",
    # Core analysis
    "verify_spectral_conservation_balance",
    "compute_spectral_ward_identity",
    "compute_spectral_lyapunov",
    "decompose_spectral_sectors",
    "compute_spectral_energy_conservation",
    "classify_spectral_modes",
]