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/operators/metrics_structural.py

metrics_structural.py

Operator metrics: structural operators.

Source Code

python
"""Operator metrics: structural operators."""

from __future__ import annotations

from typing import Any

from ..config.operator_names import BIFURCATION_WINDOW
from .metrics_core import ALIAS_D2EPI, ALIAS_DNFR, ALIAS_EPI, ALIAS_THETA, ALIAS_VF
from .metrics_core import get_node_attr as _get_node_attr

# --- Regime classification thresholds ---
_VF_LATENT_THRESHOLD = 0.05  # νf below this → latent node
_EPI_RESONANT_THRESHOLD = 0.5  # EPI above this (+ high νf) → resonant
_VF_RESONANT_THRESHOLD = 0.8  # νf above this (+ high EPI) → resonant
_PHASE_COHERENCE_COUPLING = 0.5  # phase coherence above → network coupled
_NEIGHBOR_CHANGE_THRESHOLD = 0.05  # neighbor delta above → significant
_PHASE_SHIFT_THRESHOLD = 0.5  # |Δθ| above → phase change event
_SIGNIFICANT_PHASE_SHIFT = 0.3  # |Δθ| above → regime transition type


def _detect_regime_from_state(epi: float, vf: float, latent: bool) -> str:
    """Detect structural regime from node state.

    Helper function for transition_metrics to classify regime without
    accessing the Transition operator directly.

    Parameters
    ----------
    epi : float
        EPI value
    vf : float
        νf value
    latent : bool
        Latent flag

    Returns
    -------
    str
        Regime classification: "latent", "active", or "resonant"

    Notes
    -----
    Matches logic in Transition._detect_regime (definitions.py).
    """
    if latent or vf < _VF_LATENT_THRESHOLD:
        return "latent"
    elif epi > _EPI_RESONANT_THRESHOLD and vf > _VF_RESONANT_THRESHOLD:
        return "resonant"
    else:
        return "active"


def expansion_metrics(G, node, vf_before: float, epi_before: float) -> dict[str, Any]:
    """VAL - Enhanced expansion metrics with structural indicators (Issue #2724).

    Captures comprehensive metrics reflecting canonical VAL effects:
    - Basic growth metrics (Δνf, ΔEPI)
    - Bifurcation risk (∂²EPI/∂t²)
    - Coherence preservation (local C(t))
    - Fractality indicators (growth ratios)
    - Network impact (phase coherence with neighbors)
    - Structural stability (ΔNFR bounds)

    Parameters
    ----------
    G : TNFRGraph
        Graph containing the node
    node : NodeId
        Node to collect metrics from
    vf_before : float
        νf value before operator application
    epi_before : float
        EPI value before operator application

    Returns
    -------
    dict
        Comprehensive expansion metrics including:

        **Core Metrics (existing)**:
        - operator, glyph: Identification
        - vf_increase, vf_final: Frequency changes
        - delta_epi, epi_final: EPI changes
        - expansion_factor: Relative νf increase

        **Structural Stability (NEW)**:
        - dnfr_final: Final reorganization gradient
        - dnfr_positive: True if ΔNFR > 0 (required for expansion)
        - dnfr_stable: True if 0 < ΔNFR < 1.0 (bounded growth)

        **Bifurcation Risk (ENHANCED)**:
        - d2epi: EPI acceleration (∂²EPI/∂t²)
        - bifurcation_risk: True when |∂²EPI/∂t²| > threshold
        - bifurcation_magnitude: Ratio of d2epi to threshold
        - bifurcation_threshold: Configurable threshold value

        **Coherence Preservation (ENHANCED)**:
        - coherence_local: Local coherence measurement [0,1]
        - coherence_preserved: True when C_local > threshold

        **Fractality Indicators (ENHANCED)**:
        - epi_growth_rate: Relative EPI growth
        - vf_growth_rate: Relative νf growth
        - growth_ratio: vf_growth_rate / epi_growth_rate
        - fractal_preserved: True when ratio in valid range [0.5, 2.0]

        **Network Impact (NEW)**:
        - neighbor_count: Number of neighbors
        - phase_coherence_neighbors: Phase alignment with neighbors [0,1]
        - network_coupled: True if neighbors exist and phase_coherence > 0.5
        - theta_final: Final phase value

        **Overall Health (NEW)**:
        - expansion_healthy: Combined indicator of all health metrics

    Notes
    -----
    Key indicators:
    - bifurcation_risk: True when |∂²EPI/∂t²| > threshold
    - fractal_preserved: True when growth rates maintain scaling relationship
    - coherence_preserved: True when local C(t) remains above threshold
    - dnfr_positive: True when ΔNFR > 0 (required for expansion)

    Thresholds are configurable via graph metadata:
    - VAL_BIFURCATION_THRESHOLD (default: 0.3)
    - VAL_MIN_COHERENCE (default: 0.5)
    - VAL_FRACTAL_RATIO_MIN (default: 0.5)
    - VAL_FRACTAL_RATIO_MAX (default: 2.0)

    Examples
    --------
    >>> from tnfr.structural import create_nfr, run_sequence
    >>> from tnfr.operators.definitions import Expansion
    >>>
    >>> G, node = create_nfr("test", epi=0.4, vf=1.0)
    >>> G.graph["COLLECT_OPERATOR_METRICS"] = True
    >>> run_sequence(G, node, [Expansion()])
    >>>
    >>> metrics = G.graph["operator_metrics"][-1]
    >>> if metrics["bifurcation_risk"]:
    ...     print(f"WARNING: Bifurcation risk! d2epi={metrics['d2epi']:.3f}")
    >>> if not metrics["coherence_preserved"]:
    ...     print(f"WARNING: Coherence degraded! C={metrics['coherence_local']:.3f}")

    See Also
    --------
    Expansion : VAL operator that produces these metrics
    validate_expansion : Preconditions ensuring valid expansion
    """
    import math

    # Basic state
    vf_after = _get_node_attr(G, node, ALIAS_VF)
    epi_after = _get_node_attr(G, node, ALIAS_EPI)
    dnfr = _get_node_attr(G, node, ALIAS_DNFR)
    d2epi = _get_node_attr(G, node, ALIAS_D2EPI)
    theta = _get_node_attr(G, node, ALIAS_THETA)

    # Network context
    neighbors = list(G.neighbors(node))
    neighbor_count = len(neighbors)

    # Thresholds (configurable)
    bifurcation_threshold = float(G.graph.get("VAL_BIFURCATION_THRESHOLD", 0.3))
    coherence_threshold = float(G.graph.get("VAL_MIN_COHERENCE", 0.5))
    fractal_ratio_min = float(G.graph.get("VAL_FRACTAL_RATIO_MIN", 0.5))
    fractal_ratio_max = float(G.graph.get("VAL_FRACTAL_RATIO_MAX", 2.0))

    # Growth deltas
    delta_epi = epi_after - epi_before
    delta_vf = vf_after - vf_before

    # Growth rates (relative to initial values)
    epi_growth_rate = (delta_epi / epi_before) if epi_before > 1e-9 else 0.0
    vf_growth_rate = (delta_vf / vf_before) if vf_before > 1e-9 else 0.0
    growth_ratio = (
        vf_growth_rate / epi_growth_rate if abs(epi_growth_rate) > 1e-9 else 0.0
    )

    # Coherence preservation
    # Local coherence via extracted helper
    from ..metrics.local_coherence import compute_local_coherence_fallback

    c_local = compute_local_coherence_fallback(G, node)

    # Phase coherence with neighbors
    if neighbor_count > 0:
        neighbor_theta_sum = sum(_get_node_attr(G, n, ALIAS_THETA) for n in neighbors)
        mean_neighbor_theta = neighbor_theta_sum / neighbor_count
        phase_diff = abs(theta - mean_neighbor_theta)
        # Normalize to [0, 1], 1 = perfect alignment
        phase_coherence_neighbors = 1.0 - min(phase_diff, math.pi) / math.pi
    else:
        phase_coherence_neighbors = 0.0

    # Bifurcation magnitude (ratio to threshold)
    bifurcation_magnitude = (
        abs(d2epi) / bifurcation_threshold if bifurcation_threshold > 0 else 0.0
    )

    # Boolean indicators
    bifurcation_risk = abs(d2epi) > bifurcation_threshold
    coherence_preserved = c_local > coherence_threshold
    dnfr_positive = dnfr > 0
    dnfr_stable = 0 < dnfr < 1.0
    fractal_preserved = (
        fractal_ratio_min < growth_ratio < fractal_ratio_max
        if abs(epi_growth_rate) > 1e-9
        else True
    )
    network_coupled = (
        neighbor_count > 0 and phase_coherence_neighbors > _PHASE_COHERENCE_COUPLING
    )

    # Overall health indicator
    expansion_healthy = (
        dnfr_positive
        and not bifurcation_risk
        and coherence_preserved
        and fractal_preserved
    )

    return {
        # Core identification
        "operator": "Expansion",
        "glyph": "VAL",
        # Existing basic metrics
        "vf_increase": delta_vf,
        "vf_final": vf_after,
        "delta_epi": delta_epi,
        "epi_final": epi_after,
        "expansion_factor": vf_after / vf_before if vf_before > 1e-9 else 1.0,
        # NEW: Structural stability
        "dnfr_final": dnfr,
        "dnfr_positive": dnfr_positive,
        "dnfr_stable": dnfr_stable,
        # NEW: Bifurcation risk (enhanced)
        "d2epi": d2epi,
        "bifurcation_risk": bifurcation_risk,
        "bifurcation_magnitude": bifurcation_magnitude,
        "bifurcation_threshold": bifurcation_threshold,
        # NEW: Coherence preservation
        "coherence_local": c_local,
        "coherence_preserved": coherence_preserved,
        # NEW: Fractality indicators
        "epi_growth_rate": epi_growth_rate,
        "vf_growth_rate": vf_growth_rate,
        "growth_ratio": growth_ratio,
        "fractal_preserved": fractal_preserved,
        # NEW: Network impact
        "neighbor_count": neighbor_count,
        "phase_coherence_neighbors": max(0.0, phase_coherence_neighbors),
        "network_coupled": network_coupled,
        "theta_final": theta,
        # NEW: Overall health
        "expansion_healthy": expansion_healthy,
        # Metadata
        "metrics_version": "3.0_canonical",
    }


def contraction_metrics(G, node, vf_before, epi_before):
    """NUL - Contraction metrics: νf decrease, core concentration, ΔNFR densification.

    Collects comprehensive contraction metrics including structural density dynamics
    that validate canonical NUL behavior and enable early warning for over-compression.

    Parameters
    ----------
    G : TNFRGraph
        Graph containing the node
    node : NodeId
        Node to collect metrics from
    vf_before : float
        νf value before operator application
    epi_before : float
        EPI value before operator application

    Returns
    -------
    dict
        Contraction-specific metrics including:

        **Basic metrics:**

        - operator: "Contraction"
        - glyph: "NUL"
        - vf_decrease: Absolute reduction in νf
        - vf_final: Post-contraction νf
        - delta_epi: EPI change
        - epi_final: Post-contraction EPI
        - dnfr_final: Post-contraction ΔNFR
        - contraction_factor: Ratio of vf_after / vf_before

        **Densification metrics (if available):**

        - densification_factor: ΔNFR amplification factor (typically 1.35)
        - dnfr_densified: Boolean indicating densification occurred
        - dnfr_before: ΔNFR value before contraction
        - dnfr_increase: Absolute ΔNFR change (dnfr_after - dnfr_before)

        **Structural density metrics (NEW):**

        - density_before: |ΔNFR| / max(EPI, ε) before contraction
        - density_after: |ΔNFR| / max(EPI, ε) after contraction
        - densification_ratio: density_after / density_before
        - is_critical_density: Warning flag (density > threshold)

    Notes
    -----
    **Structural Density**: Defined as ρ = |ΔNFR| / max(EPI, ε) where ε = 1e-9.
    This captures the concentration of reorganization pressure per unit structure.

    **Critical Density**: When density exceeds CRITICAL_DENSITY_THRESHOLD (default: 5.0),
    it indicates over-compression risk where the node may become unstable.

    **Densification Ratio**: Quantifies how much density increased during contraction.
    Canonical NUL should produce densification_ratio ≈ densification_factor / contraction_factor.

    See Also
    --------
    Contraction : NUL operator implementation
    validate_contraction : Preconditions for safe contraction
    """
    # Small epsilon for numerical stability
    EPSILON = 1e-9

    vf_after = _get_node_attr(G, node, ALIAS_VF)
    epi_after = _get_node_attr(G, node, ALIAS_EPI)
    dnfr_after = _get_node_attr(G, node, ALIAS_DNFR)

    # Extract densification telemetry if available
    densification_log = G.graph.get("nul_densification_log", [])
    densification_factor = None
    dnfr_before = None
    if densification_log:
        # Get the most recent densification entry for this node
        last_entry = densification_log[-1]
        densification_factor = last_entry.get("densification_factor")
        dnfr_before = last_entry.get("dnfr_before")

    # Calculate structural density before and after
    # Density = |ΔNFR| / max(EPI, ε)
    density_before = (
        abs(dnfr_before) / max(abs(epi_before), EPSILON)
        if dnfr_before is not None
        else 0.0
    )
    density_after = abs(dnfr_after) / max(abs(epi_after), EPSILON)

    # Calculate densification ratio (how much density increased)
    densification_ratio = (
        density_after / density_before if density_before > EPSILON else float("inf")
    )

    # Get critical density threshold from graph config or use default
    critical_density_threshold = float(G.graph.get("CRITICAL_DENSITY_THRESHOLD", 5.0))
    is_critical_density = density_after > critical_density_threshold

    metrics = {
        "operator": "Contraction",
        "glyph": "NUL",
        "vf_decrease": vf_before - vf_after,
        "vf_final": vf_after,
        "delta_epi": epi_after - epi_before,
        "epi_final": epi_after,
        "dnfr_final": dnfr_after,
        "contraction_factor": vf_after / vf_before if vf_before > 0 else 1.0,
    }

    # Add densification metrics if available
    if densification_factor is not None:
        metrics["densification_factor"] = densification_factor
        metrics["dnfr_densified"] = True
    if dnfr_before is not None:
        metrics["dnfr_before"] = dnfr_before
        metrics["dnfr_increase"] = dnfr_after - dnfr_before if dnfr_before else 0.0

    # Add NEW structural density metrics
    metrics["density_before"] = density_before
    metrics["density_after"] = density_after
    metrics["densification_ratio"] = densification_ratio
    metrics["is_critical_density"] = is_critical_density

    return metrics


def self_organization_metrics(G, node, epi_before, vf_before):
    """THOL - Enhanced metrics with cascade dynamics and collective coherence.

    Collects comprehensive THOL metrics including bifurcation, cascade propagation,
    collective coherence of sub-EPIs, and metabolic activity indicators.

    Parameters
    ----------
    G : TNFRGraph
        Graph containing the node
    node : NodeId
        Node to collect metrics from
    epi_before : float
        EPI value before operator application
    vf_before : float
        νf value before operator application

    Returns
    -------
    dict
        Self-organization-specific metrics including:

        **Base operator metrics:**

        - operator: "Self-organization"
        - glyph: "THOL"
        - delta_epi: Change in EPI
        - delta_vf: Change in νf
        - epi_final: Final EPI value
        - vf_final: Final νf value
        - d2epi: Structural acceleration
        - dnfr_final: Final ΔNFR

        **Bifurcation metrics:**

        - bifurcation_occurred: Boolean indicator
        - nested_epi_count: Number of sub-EPIs created
        - d2epi_magnitude: Absolute acceleration

        **Cascade dynamics (NEW):**

        - cascade_depth: Maximum hierarchical bifurcation depth
        - propagation_radius: Total unique nodes affected
        - cascade_detected: Boolean cascade indicator
        - affected_node_count: Nodes reached by cascade
        - total_propagations: Total propagation events

        **Collective coherence (NEW):**

        - subepi_coherence: Coherence of sub-EPI ensemble [0,1]
        - metabolic_activity_index: Network context usage [0,1]

        **Network emergence indicator (NEW):**

        - network_emergence: Combined indicator (cascade + high coherence)

    Notes
    -----
    TNFR Principle: Complete traceability of self-organization dynamics.
    These metrics enable reconstruction of entire cascade evolution,
    validation of controlled emergence, and identification of collective
    network phenomena.

    See Also
    --------
    operators.metabolism.compute_cascade_depth : Cascade depth computation
    operators.metabolism.compute_subepi_collective_coherence : Coherence metric
    operators.metabolism.compute_metabolic_activity_index : Metabolic tracking
    operators.cascade.detect_cascade : Cascade detection
    """
    from .cascade import detect_cascade
    from .metabolism import (
        compute_cascade_depth,
        compute_metabolic_activity_index,
        compute_propagation_radius,
        compute_subepi_collective_coherence,
    )

    epi_after = _get_node_attr(G, node, ALIAS_EPI)
    vf_after = _get_node_attr(G, node, ALIAS_VF)
    d2epi = _get_node_attr(G, node, ALIAS_D2EPI)
    dnfr = _get_node_attr(G, node, ALIAS_DNFR)

    # Track nested EPI count from node attribute or graph (backward compatibility)
    nested_epi_count = len(G.nodes[node].get("sub_epis", []))
    if nested_epi_count == 0:
        # Fallback to old location for backward compatibility
        nested_epi_count = len(G.graph.get("sub_epi", []))

    # Cascade and propagation analysis
    cascade_analysis = detect_cascade(G)

    # NEW: Enhanced cascade and emergence metrics
    cascade_depth = compute_cascade_depth(G, node)
    propagation_radius = compute_propagation_radius(G)
    subepi_coherence = compute_subepi_collective_coherence(G, node)
    metabolic_activity = compute_metabolic_activity_index(G, node)

    return {
        # Base operator metrics
        "operator": "Self-organization",
        "glyph": "THOL",
        "delta_epi": epi_after - epi_before,
        "delta_vf": vf_after - vf_before,
        "epi_final": epi_after,
        "vf_final": vf_after,
        "d2epi": d2epi,
        "dnfr_final": dnfr,
        # Bifurcation metrics
        "bifurcation_occurred": nested_epi_count > 0,
        "nested_epi_count": nested_epi_count,
        "d2epi_magnitude": abs(d2epi),
        # NEW: Cascade dynamics
        "cascade_depth": cascade_depth,
        "propagation_radius": propagation_radius,
        "cascade_detected": cascade_analysis["is_cascade"],
        "affected_node_count": len(cascade_analysis["affected_nodes"]),
        "total_propagations": cascade_analysis["total_propagations"],
        # NEW: Collective coherence
        "subepi_coherence": subepi_coherence,
        "metabolic_activity_index": metabolic_activity,
        # NEW: Network emergence indicator
        "network_emergence": (
            cascade_analysis["is_cascade"]
            and subepi_coherence > _PHASE_COHERENCE_COUPLING
        ),
    }


def mutation_metrics(
    G,
    node,
    theta_before,
    epi_before,
    vf_before=None,
    dnfr_before=None,
):
    """ZHIR - Comprehensive mutation metrics with canonical structural indicators.

    Collects extended metrics reflecting canonical ZHIR effects:
    - Threshold verification (∂EPI/∂t > ξ)
    - Phase transformation quality (θ → θ')
    - Bifurcation potential (∂²EPI/∂t² > τ)
    - Structural identity preservation
    - Network impact and propagation
    - Destabilizer context (R4 Extended)
    - Grammar validation status

    Parameters
    ----------
    G : TNFRGraph
        Graph containing the node
    node : NodeId
        Node to collect metrics from
    theta_before : float
        Phase value before operator application
    epi_before : float
        EPI value before operator application
    vf_before : float, optional
        νf before mutation (for frequency shift tracking)
    dnfr_before : float, optional
        ΔNFR before mutation (for pressure tracking)

    Returns
    -------
    dict
        Comprehensive mutation metrics organized by category:

        **Core metrics (existing):**

        - operator, glyph: Identification
        - theta_shift, theta_final: Phase changes
        - delta_epi, epi_final: EPI changes
        - phase_change: Boolean indicator

        **Threshold verification (ENHANCED):**

        - depi_dt: Structural velocity (∂EPI/∂t)
        - threshold_xi: Configured threshold
        - threshold_met: Boolean (∂EPI/∂t > ξ)
        - threshold_ratio: depi_dt / ξ
        - threshold_exceeded_by: max(0, depi_dt - ξ)

        **Phase transformation (ENHANCED):**

        - theta_regime_before: Initial phase regime [0-3]
        - theta_regime_after: Final phase regime [0-3]
        - regime_changed: Boolean regime transition
        - theta_shift_direction: +1 (forward) or -1 (backward)
        - phase_transformation_magnitude: Normalized shift [0, 1]

        **Bifurcation analysis (NEW):**

        - d2epi: Structural acceleration
        - bifurcation_threshold_tau: Configured τ
        - bifurcation_potential: Boolean (∂²EPI/∂t² > τ)
        - bifurcation_score: Quantitative potential [0, 1]
        - bifurcation_triggered: Boolean (event recorded)
        - bifurcation_event_count: Number of bifurcation events

        **Structural preservation (NEW):**

        - epi_kind_before: Identity before mutation
        - epi_kind_after: Identity after mutation
        - identity_preserved: Boolean (must be True)
        - delta_vf: Change in structural frequency
        - vf_final: Final νf
        - delta_dnfr: Change in reorganization pressure
        - dnfr_final: Final ΔNFR

        **Network impact (NEW):**

        - neighbor_count: Number of neighbors
        - impacted_neighbors: Count with phase shift detected
        - network_impact_radius: Ratio of impacted neighbors
        - phase_coherence_neighbors: Phase alignment after mutation

        **Destabilizer context (NEW - R4 Extended):**

        - destabilizer_operator: Glyph that enabled mutation
        - destabilizer_distance: Operators since destabilizer
        - recent_history: Last N operators

        **Grammar validation (NEW):**

        - grammar_u4b_satisfied: Boolean (IL precedence + destabilizer)
        - il_precedence_found: Boolean (IL in history)
        - destabilizer_recent: Boolean (within window)

    Examples
    --------
    >>> from tnfr.structural import create_nfr, run_sequence
    >>> from tnfr.operators.definitions import Coherence, Dissonance, Mutation
    >>>
    >>> G, node = create_nfr("test", epi=0.5, vf=1.2)
    >>> G.graph["COLLECT_OPERATOR_METRICS"] = True
    >>>
    >>> # Apply canonical sequence (IL → OZ → ZHIR)
    >>> run_sequence(G, node, [Coherence(), Dissonance(), Mutation()])
    >>>
    >>> # Retrieve comprehensive metrics
    >>> metrics = G.graph["operator_metrics"][-1]
    >>> print(f"Threshold met: {metrics['threshold_met']}")
    >>> print(f"Bifurcation score: {metrics['bifurcation_score']:.2f}")
    >>> print(f"Identity preserved: {metrics['identity_preserved']}")
    >>> print(f"Grammar satisfied: {metrics['grammar_u4b_satisfied']}")

    See Also
    --------
    operators.definitions.Mutation : ZHIR operator implementation
    dynamics.bifurcation.compute_bifurcation_score : Bifurcation scoring
    operators.preconditions.validate_mutation : Precondition validation with context tracking
    """
    import math

    # === GET POST-MUTATION STATE ===
    theta_after = _get_node_attr(G, node, ALIAS_THETA)
    epi_after = _get_node_attr(G, node, ALIAS_EPI)
    vf_after = _get_node_attr(G, node, ALIAS_VF)
    dnfr_after = _get_node_attr(G, node, ALIAS_DNFR)
    d2epi = _get_node_attr(G, node, ALIAS_D2EPI, 0.0)

    # === THRESHOLD VERIFICATION ===
    # Compute ∂EPI/∂t from history
    epi_history = G.nodes[node].get("epi_history") or G.nodes[node].get(
        "_epi_history", []
    )
    if len(epi_history) >= 2:
        depi_dt = abs(epi_history[-1] - epi_history[-2])
    else:
        depi_dt = 0.0

    xi = float(G.graph.get("ZHIR_THRESHOLD_XI", 0.1))
    threshold_met = depi_dt >= xi
    threshold_ratio = depi_dt / xi if xi > 0 else 0.0

    # === PHASE TRANSFORMATION ===
    # Extract transformation telemetry from glyph storage
    theta_shift_stored = G.nodes[node].get("_zhir_theta_shift", None)
    regime_changed = G.nodes[node].get("_zhir_regime_changed", False)
    regime_before_stored = G.nodes[node].get("_zhir_regime_before", None)
    regime_after_stored = G.nodes[node].get("_zhir_regime_after", None)
    fixed_mode = G.nodes[node].get("_zhir_fixed_mode", False)

    # Compute theta shift
    theta_shift = theta_after - theta_before
    theta_shift_magnitude = abs(theta_shift)

    # Compute regimes if not stored
    regime_before = (
        regime_before_stored
        if regime_before_stored is not None
        else int(theta_before // (math.pi / 2))
    )
    regime_after = (
        regime_after_stored
        if regime_after_stored is not None
        else int(theta_after // (math.pi / 2))
    )

    # Normalized phase transformation magnitude [0, 1]
    phase_transformation_magnitude = min(theta_shift_magnitude / math.pi, 1.0)

    # === BIFURCATION ANALYSIS ===
    tau = float(
        G.graph.get(
            "BIFURCATION_THRESHOLD_TAU", G.graph.get("ZHIR_BIFURCATION_THRESHOLD", 0.5)
        )
    )
    bifurcation_potential = d2epi > tau

    # Compute bifurcation score using canonical formula
    from ..dynamics.bifurcation import compute_bifurcation_score

    bifurcation_score = compute_bifurcation_score(
        d2epi=d2epi, dnfr=dnfr_after, vf=vf_after, epi=epi_after, tau=tau
    )

    # Check if bifurcation was triggered (event recorded)
    bifurcation_events = G.graph.get("zhir_bifurcation_events", [])
    bifurcation_triggered = len(bifurcation_events) > 0
    bifurcation_event_count = len(bifurcation_events)

    # === STRUCTURAL PRESERVATION ===
    epi_kind_before = G.nodes[node].get("_epi_kind_before")
    epi_kind_after = G.nodes[node].get("epi_kind")
    identity_preserved = (
        epi_kind_before == epi_kind_after if epi_kind_before is not None else True
    )

    # Track frequency and pressure changes
    delta_vf = vf_after - vf_before if vf_before is not None else 0.0
    delta_dnfr = dnfr_after - dnfr_before if dnfr_before is not None else 0.0

    # === NETWORK IMPACT ===
    neighbors = list(G.neighbors(node))
    neighbor_count = len(neighbors)

    # Count neighbors that experienced phase shifts
    # This is a simplified heuristic - we check if neighbors have recent phase changes
    impacted_neighbors = 0
    phase_impact_threshold = 0.1

    if neighbor_count > 0:
        # Check neighbors for phase alignment/disruption
        for n in neighbors:
            neighbor_theta = _get_node_attr(G, n, ALIAS_THETA)
            # Simplified: check if neighbor is in similar phase regime after mutation
            phase_diff = abs(neighbor_theta - theta_after)
            # If phase diff is large, neighbor might be impacted
            if phase_diff > phase_impact_threshold:
                # Check if neighbor has changed recently (has history)
                neighbor_theta_history = G.nodes[n].get("theta_history", [])
                if len(neighbor_theta_history) >= 2:
                    neighbor_change = abs(
                        neighbor_theta_history[-1] - neighbor_theta_history[-2]
                    )
                    if (
                        neighbor_change > _NEIGHBOR_CHANGE_THRESHOLD
                    ):  # Neighbor experienced change
                        impacted_neighbors += 1

        # Phase coherence with neighbors after mutation
        from ..metrics.phase_coherence import compute_phase_alignment

        phase_coherence = compute_phase_alignment(G, node, radius=1)
    else:
        phase_coherence = 0.0

    # === DESTABILIZER CONTEXT (R4 Extended) ===
    mutation_context = G.nodes[node].get("_mutation_context", {})
    destabilizer_operator = mutation_context.get("destabilizer_operator")
    destabilizer_distance = mutation_context.get("destabilizer_distance")
    recent_history = mutation_context.get("recent_history", [])

    # === GRAMMAR VALIDATION (U4b) ===
    # Check if U4b satisfied (IL precedence + recent destabilizer)
    glyph_history = G.nodes[node].get("glyph_history", [])

    # Look for IL in history
    il_precedence_found = any("IL" in str(g) for g in glyph_history)

    # Check if destabilizer is recent (within the relaxation window)
    destabilizer_recent = (
        destabilizer_distance is not None
        and destabilizer_distance <= BIFURCATION_WINDOW
    )

    grammar_u4b_satisfied = il_precedence_found and destabilizer_recent

    # === RETURN COMPREHENSIVE METRICS ===
    return {
        # === CORE (existing) ===
        "operator": "Mutation",
        "glyph": "ZHIR",
        "theta_shift": theta_shift_magnitude,
        "theta_shift_signed": (
            theta_shift_stored if theta_shift_stored is not None else theta_shift
        ),
        "theta_before": theta_before,
        "theta_after": theta_after,
        "theta_final": theta_after,
        "phase_change": theta_shift_magnitude > _PHASE_SHIFT_THRESHOLD,
        "transformation_mode": "fixed" if fixed_mode else "canonical",
        # === THRESHOLD VERIFICATION (ENHANCED) ===
        "depi_dt": depi_dt,
        "threshold_xi": xi,
        "threshold_met": threshold_met,
        "threshold_ratio": threshold_ratio,
        "threshold_exceeded_by": max(0.0, depi_dt - xi),
        "threshold_warning": G.nodes[node].get("_zhir_threshold_warning", False),
        "threshold_validated": G.nodes[node].get("_zhir_threshold_met", False),
        "threshold_unknown": G.nodes[node].get("_zhir_threshold_unknown", False),
        # === PHASE TRANSFORMATION (ENHANCED) ===
        "theta_regime_before": regime_before,
        "theta_regime_after": regime_after,
        "regime_changed": regime_changed or (regime_before != regime_after),
        "theta_regime_change": regime_changed
        or (regime_before != regime_after),  # Backwards compat
        "regime_before": regime_before,  # Backwards compat
        "regime_after": regime_after,  # Backwards compat
        "theta_shift_direction": math.copysign(1.0, theta_shift),
        "phase_transformation_magnitude": phase_transformation_magnitude,
        # === BIFURCATION ANALYSIS (NEW) ===
        "d2epi": d2epi,
        "bifurcation_threshold_tau": tau,
        "bifurcation_potential": bifurcation_potential,
        "bifurcation_score": bifurcation_score,
        "bifurcation_triggered": bifurcation_triggered,
        "bifurcation_event_count": bifurcation_event_count,
        # === EPI METRICS ===
        "delta_epi": epi_after - epi_before,
        "epi_before": epi_before,
        "epi_after": epi_after,
        "epi_final": epi_after,
        # === STRUCTURAL PRESERVATION (NEW) ===
        "epi_kind_before": epi_kind_before,
        "epi_kind_after": epi_kind_after,
        "identity_preserved": identity_preserved,
        "delta_vf": delta_vf,
        "vf_before": vf_before if vf_before is not None else vf_after,
        "vf_final": vf_after,
        "delta_dnfr": delta_dnfr,
        "dnfr_before": dnfr_before if dnfr_before is not None else dnfr_after,
        "dnfr_final": dnfr_after,
        # === NETWORK IMPACT (NEW) ===
        "neighbor_count": neighbor_count,
        "impacted_neighbors": impacted_neighbors,
        "network_impact_radius": (
            impacted_neighbors / neighbor_count if neighbor_count > 0 else 0.0
        ),
        "phase_coherence_neighbors": phase_coherence,
        # === DESTABILIZER CONTEXT (NEW - R4 Extended) ===
        "destabilizer_operator": destabilizer_operator,
        "destabilizer_distance": destabilizer_distance,
        "recent_history": recent_history,
        # === GRAMMAR VALIDATION (NEW) ===
        "grammar_u4b_satisfied": grammar_u4b_satisfied,
        "il_precedence_found": il_precedence_found,
        "destabilizer_recent": destabilizer_recent,
        # === METADATA ===
        "metrics_version": "2.0_canonical",
    }


def transition_metrics(
    G,
    node,
    dnfr_before,
    vf_before,
    theta_before,
    epi_before=None,
):
    """NAV - Transition metrics: regime classification, phase shift, frequency scaling.

    Collects comprehensive transition metrics including regime origin/destination,
    phase shift magnitude (properly wrapped), transition type classification, and
    structural preservation ratios as specified in TNFR.pdf Table 2.3.

    Parameters
    ----------
    G : TNFRGraph
        Graph containing the node
    node : NodeId
        Node to collect metrics from
    dnfr_before : float
        ΔNFR value before operator application
    vf_before : float
        νf value before operator application
    theta_before : float
        Phase value before operator application
    epi_before : float, optional
        EPI value before operator application (for preservation tracking)

    Returns
    -------
    dict
        Transition-specific metrics including:

        **Core metrics (existing)**:

        - operator: "Transition"
        - glyph: "NAV"
        - delta_theta: Signed phase change
        - delta_vf: Change in νf
        - delta_dnfr: Change in ΔNFR
        - dnfr_final: Final ΔNFR value
        - vf_final: Final νf value
        - theta_final: Final phase value
        - transition_complete: Boolean (|ΔNFR| < |νf|)

        **Regime classification (NEW)**:

        - regime_origin: "latent" | "active" | "resonant"
        - regime_destination: "latent" | "active" | "resonant"
        - transition_type: "reactivation" | "phase_shift" | "regime_change"

        **Phase metrics (NEW)**:

        - phase_shift_magnitude: Absolute phase change (radians, 0-π)
        - phase_shift_signed: Signed phase change (radians, wrapped to [-π, π])

        **Structural scaling (NEW)**:

        - vf_scaling_factor: vf_after / vf_before
        - dnfr_damping_ratio: dnfr_after / dnfr_before
        - epi_preservation: epi_after / epi_before (if epi_before provided)

        **Latency tracking (NEW)**:

        - latency_duration: Time in silence (seconds) if transitioning from SHA

    Notes
    -----
    **Regime Classification**:

    - **Latent**: latent flag set OR νf < 0.05
    - **Active**: Default operational state
    - **Resonant**: EPI > 0.5 AND νf > 0.8

    **Transition type**:

    - **reactivation**: From latent state (SHA → NAV flow)
    - **phase_shift**: Significant phase change (|Δθ| > 0.3 rad)
    - **regime_change**: Regime switch without significant phase shift

    **Phase Shift Wrapping**:

    Phase shifts are properly wrapped to [-π, π] range to handle 0-2π boundary
    crossings correctly, ensuring accurate phase change measurement.

    Examples
    --------
    >>> from tnfr.structural import create_nfr, run_sequence
    >>> from tnfr.operators.definitions import Silence, Transition
    >>>
    >>> # Example: SHA → NAV reactivation
    >>> G, node = create_nfr("test", epi=0.5, vf=0.8)
    >>> G.graph["COLLECT_OPERATOR_METRICS"] = True
    >>> run_sequence(G, node, [Silence(), Transition()])
    >>>
    >>> metrics = G.graph["operator_metrics"][-1]
    >>> assert metrics["operator"] == "Transition"
    >>> assert metrics["transition_type"] == "reactivation"
    >>> assert metrics["regime_origin"] == "latent"
    >>> assert metrics["latency_duration"] is not None

    See Also
    --------
    operators.definitions.Transition : NAV operator implementation
    operators.definitions.Transition._detect_regime : Regime detection logic
    """
    import math

    # Get current state (after transformation)
    epi_after = _get_node_attr(G, node, ALIAS_EPI)
    dnfr_after = _get_node_attr(G, node, ALIAS_DNFR)
    vf_after = _get_node_attr(G, node, ALIAS_VF)
    theta_after = _get_node_attr(G, node, ALIAS_THETA)

    # === REGIME CLASSIFICATION ===
    # Get regime origin from node attribute (stored by Transition operator before super().__call__)
    regime_origin = G.nodes[node].get("_regime_before", None)
    if regime_origin is None:
        # Fallback: detect regime from before state
        regime_origin = _detect_regime_from_state(
            epi_before or epi_after,
            vf_before,
            False,  # Cannot access latent flag from before
        )

    # Detect destination regime
    regime_destination = _detect_regime_from_state(
        epi_after, vf_after, G.nodes[node].get("latent", False)
    )

    # === TRANSITION TYPE CLASSIFICATION ===
    # Calculate phase shift (properly wrapped)
    phase_shift_raw = theta_after - theta_before
    if phase_shift_raw > math.pi:
        phase_shift_raw -= 2 * math.pi
    elif phase_shift_raw < -math.pi:
        phase_shift_raw += 2 * math.pi

    # Classify transition type
    if regime_origin == "latent":
        transition_type = "reactivation"
    elif abs(phase_shift_raw) > _SIGNIFICANT_PHASE_SHIFT:
        transition_type = "phase_shift"
    else:
        transition_type = "regime_change"

    # === STRUCTURAL SCALING FACTORS ===
    vf_scaling = vf_after / vf_before if vf_before > 0 else 1.0
    dnfr_damping = dnfr_after / dnfr_before if abs(dnfr_before) > 1e-9 else 1.0

    # === EPI PRESERVATION ===
    epi_preservation = None
    if epi_before is not None and epi_before > 0:
        epi_preservation = epi_after / epi_before

    # === LATENCY DURATION ===
    # Get from node if transitioning from silence
    latency_duration = G.nodes[node].get("silence_duration", None)

    return {
        # === CORE (existing, preserved) ===
        "operator": "Transition",
        "glyph": "NAV",
        "delta_theta": phase_shift_raw,
        "delta_vf": vf_after - vf_before,
        "delta_dnfr": dnfr_after - dnfr_before,
        "dnfr_final": dnfr_after,
        "vf_final": vf_after,
        "theta_final": theta_after,
        "transition_complete": abs(dnfr_after) < abs(vf_after),
        # Legacy compatibility
        "dnfr_change": abs(dnfr_after - dnfr_before),
        "vf_change": abs(vf_after - vf_before),
        "theta_shift": abs(phase_shift_raw),
        # === REGIME CLASSIFICATION (NEW) ===
        "regime_origin": regime_origin,
        "regime_destination": regime_destination,
        "transition_type": transition_type,
        # === PHASE METRICS (NEW) ===
        "phase_shift_magnitude": abs(phase_shift_raw),
        "phase_shift_signed": phase_shift_raw,
        # === STRUCTURAL SCALING (NEW) ===
        "vf_scaling_factor": vf_scaling,
        "dnfr_damping_ratio": dnfr_damping,
        "epi_preservation": epi_preservation,
        # === LATENCY TRACKING (NEW) ===
        "latency_duration": latency_duration,
    }


def recursivity_metrics(G, node, epi_before, vf_before):
    """REMESH - Recursivity metrics: fractal propagation, multi-scale coherence.

    Parameters
    ----------
    G : TNFRGraph
        Graph containing the node
    node : NodeId
        Node to collect metrics from
    epi_before : float
        EPI value before operator application
    vf_before : float
        νf value before operator application

    Returns
    -------
    dict
        Recursivity-specific metrics including fractal pattern indicators
    """
    epi_after = _get_node_attr(G, node, ALIAS_EPI)
    vf_after = _get_node_attr(G, node, ALIAS_VF)

    # Track echo traces if graph maintains them
    echo_traces = G.graph.get("echo_trace", [])
    echo_count = len(echo_traces)

    return {
        "operator": "Recursivity",
        "glyph": "REMESH",
        "delta_epi": epi_after - epi_before,
        "delta_vf": vf_after - vf_before,
        "epi_final": epi_after,
        "vf_final": vf_after,
        "echo_count": echo_count,
        "fractal_depth": echo_count,
        "multi_scale_active": echo_count > 0,
    }