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/structural.py

structural.py

Maintain TNFR structural coherence for nodes and operator sequences.

This module exposes the canonical entry points used by the engine to instantiate coherent TNFR nodes and to orchestrate structural operator pipelines while keeping the nodal equation ∂EPI/∂t = νf · ΔNFR(t) balanced. Consumers are expected to provide graph instances honouring :class:tnfr.types.GraphLike: the structural helpers reach into nodes, neighbors, number_of_nodes and the .graph metadata mapping to propagate ΔNFR hooks and coherence metrics.

Public API

create_nfr Initialise a node with canonical EPI, νf and phase attributes plus a ΔNFR hook that propagates reorganisations through the graph. run_sequence Validate and execute operator trajectories so that ΔNFR hooks can update EPI, νf and phase coherently after each step. OPERATORS Registry of canonical structural operators ready to be composed into validated sequences. validate_sequence Grammar guard that ensures operator trajectories stay within TNFR closure rules before execution.

CRITICAL TECHNICAL NOTE (Context Override for Pre-existing EPI - Nov 2025):

run_sequence() automatically detects when a node has pre-existing EPI (EPI ≠ 0) and passes context={'initial_epi_nonzero': True} to validate_sequence().

This bypasses the U1a generator requirement, which states that sequences must start with a generator {AL, NAV, REMESH} when EPI=0.

Physics Rationale:

  • U1a exists because ∂EPI/∂t is undefined at EPI=0 (no structure to evolve)
  • When EPI already exists, the node has structure that CAN evolve
  • Applying operators like Coherence, Resonance, etc. is physically valid
  • Strict U1a enforcement would prevent legitimate operations on existing nodes

Implementation: check_epi_nonzero() examines node EPI attribute:

  • If EPI ≠ 0: auto-pass context override to grammar validator
  • If EPI = 0: strict U1a enforcement (must start with generator)

Canonicity Preserved: This does NOT weaken grammar. U1a's physical basis (undefined evolution at EPI=0) does not apply when structure exists. The override is a necessary operational flexibility, not a violation.

See: run_sequence() context detection, grammar_patterns._check_start_rule()

Source Code

python
"""Maintain TNFR structural coherence for nodes and operator sequences.

This module exposes the canonical entry points used by the engine to
instantiate coherent TNFR nodes and to orchestrate structural operator
pipelines while keeping the nodal equation
``∂EPI/∂t = νf · ΔNFR(t)`` balanced.  Consumers are expected to provide
graph instances honouring :class:`tnfr.types.GraphLike`: the structural
helpers reach into ``nodes``, ``neighbors``, ``number_of_nodes`` and the
``.graph`` metadata mapping to propagate ΔNFR hooks and coherence metrics.

Public API
----------
create_nfr
    Initialise a node with canonical EPI, νf and phase attributes plus a
    ΔNFR hook that propagates reorganisations through the graph.
run_sequence
    Validate and execute operator trajectories so that ΔNFR hooks can
    update EPI, νf and phase coherently after each step.
OPERATORS
    Registry of canonical structural operators ready to be composed into
    validated sequences.
validate_sequence
    Grammar guard that ensures operator trajectories stay within TNFR
    closure rules before execution.

CRITICAL TECHNICAL NOTE (Context Override for Pre-existing EPI - Nov 2025):
---------------------------------------------------------------------------
run_sequence() automatically detects when a node has pre-existing EPI (EPI ≠ 0)
and passes context={'initial_epi_nonzero': True} to validate_sequence().

This bypasses the U1a generator requirement, which states that sequences
must start with a generator {AL, NAV, REMESH} when EPI=0.

**Physics Rationale**:
- U1a exists because ∂EPI/∂t is undefined at EPI=0 (no structure to evolve)
- When EPI already exists, the node has structure that CAN evolve
- Applying operators like Coherence, Resonance, etc. is physically valid
- Strict U1a enforcement would prevent legitimate operations on existing nodes

**Implementation**: check_epi_nonzero() examines node EPI attribute:
  - If EPI ≠ 0: auto-pass context override to grammar validator
  - If EPI = 0: strict U1a enforcement (must start with generator)

**Canonicity Preserved**: This does NOT weaken grammar. U1a's physical
basis (undefined evolution at EPI=0) does not apply when structure exists.
The override is a necessary operational flexibility, not a violation.

See: run_sequence() context detection, grammar_patterns._check_start_rule()
"""

from __future__ import annotations

from copy import deepcopy
from typing import Any, Iterable, Mapping, Sequence, cast

import networkx as nx

from tnfr.config.operator_names import VALID_START_OPERATORS
from tnfr.validation import InvariantSeverity, NFRValidator, SequenceSemanticValidator
from tnfr.validation import TNFRValidator as InvariantValidator
from tnfr.validation import validate_sequence, validation_config

from .constants import EPI_PRIMARY, THETA_PRIMARY, VF_PRIMARY
from .dynamics import dnfr_epi_vf_mixed, set_delta_nfr_hook
from .errors import TNFRValueError
from .mathematics import (
    BasicStateProjector,
    CoherenceOperator,
    FrequencyOperator,
    HilbertSpace,
    MathematicalDynamicsEngine,
    make_coherence_operator,
    make_frequency_operator,
)
from .mathematics.unified_numerical import np
from .operators.definitions import (
    Coherence,
    Contraction,
    Coupling,
    Dissonance,
    Emission,
    Expansion,
    Mutation,
    Operator,
    Reception,
    Recursivity,
    Resonance,
    SelfOrganization,
    Silence,
    Transition,
)
from .operators.registry import OPERATORS
from .types import DeltaNFRHook, NodeId, TNFRGraph
from .utils import get_logger

logger = get_logger(__name__)

# ---------------------------------------------------------------------------
# 1) NFR factory
# ---------------------------------------------------------------------------


def create_nfr(
    name: str,
    *,
    epi: float = 0.0,
    vf: float = 1.0,
    theta: float = 0.0,
    graph: TNFRGraph | None = None,
    dnfr_hook: DeltaNFRHook = dnfr_epi_vf_mixed,
) -> tuple[TNFRGraph, str]:
    """Anchor a TNFR node by seeding EPI, νf, phase and ΔNFR coupling.

    The factory secures the structural state of a node: it stores canonical
    values for the Primary Information Structure (EPI), structural frequency
    (νf) and phase, then installs a ΔNFR hook so that later operator
    sequences can reorganise the node without breaking the nodal equation.

    Parameters
    ----------
    name : str
        Identifier for the new node. The identifier is stored as the node key
        and must remain hashable by :mod:`networkx`.
    epi : float, optional
        Initial Primary Information Structure (EPI) assigned to the node. The
        value provides the baseline form that subsequent ΔNFR hooks reorganise
        through the nodal equation.
    vf : float, optional
        Structural frequency (νf, expressed in Hz_str) used as the starting
        reorganisation rate for the node.
    theta : float, optional
        Initial phase of the node in radians, used to keep phase alignment with
        neighbouring coherence structures.
    graph : TNFRGraph, optional
        Existing graph where the node will be registered. When omitted a new
        :class:`networkx.Graph` instance is created.
    dnfr_hook : DeltaNFRHook, optional
        Callable responsible for computing ΔNFR and updating EPI/νf after each
        operator application. By default the canonical ``dnfr_epi_vf_mixed``
        hook is installed, which keeps the nodal equation coherent with TNFR
        invariants.

    Returns
    -------
    tuple[TNFRGraph, str]
        The graph that stores the node together with the node identifier. The
        tuple form allows immediate reuse with :func:`run_sequence`.

    Notes
    -----
    The factory does not introduce additional TNFR-specific errors. Any
    exceptions raised by :mod:`networkx` when adding nodes propagate unchanged.

    Examples
    --------
    Create a node, connect a ΔNFR hook and launch a coherent operator
    trajectory while tracking the evolving metrics.

    >>> from tnfr.constants import DNFR_PRIMARY, EPI_PRIMARY, THETA_PRIMARY, VF_PRIMARY
    >>> from tnfr.dynamics import set_delta_nfr_hook
    >>> from tnfr.structural import (
    ...     Coherence,
    ...     Emission,
    ...     Reception,
    ...     Resonance,
    ...     Silence,
    ...     create_nfr,
    ...     run_sequence,
    ... )
    >>> G, node = create_nfr("seed", epi=1.0, vf=2.0, theta=0.1)
    >>> def synchronise_delta(graph):
    ...     delta = graph.nodes[node][VF_PRIMARY] * 0.2
    ...     graph.nodes[node][DNFR_PRIMARY] = delta
    ...     graph.nodes[node][EPI_PRIMARY] += delta
    ...     graph.nodes[node][VF_PRIMARY] += delta * 0.05
    ...     graph.nodes[node][THETA_PRIMARY] += 0.01
    >>> set_delta_nfr_hook(G, synchronise_delta)
    >>> run_sequence(G, node, [Emission(), Reception(), Coherence(), Resonance(), Silence()])  # doctest: +SKIP
    >>> (
    ...     G.nodes[node][EPI_PRIMARY],
    ...     G.nodes[node][VF_PRIMARY],
    ...     G.nodes[node][THETA_PRIMARY],
    ...     G.nodes[node][DNFR_PRIMARY],
    ... )  # doctest: +SKIP
    (..., ..., ..., ...)
    """
    from .validation.input_validation import (
        ValidationError,
        validate_epi_value,
        validate_node_id,
        validate_theta_value,
        validate_tnfr_graph,
        validate_vf_value,
    )

    # Validate input parameters
    try:
        validate_node_id(name)
        epi = validate_epi_value(epi)
        vf = validate_vf_value(vf)
        theta = validate_theta_value(theta)
        if graph is not None:
            validate_tnfr_graph(graph)
    except ValidationError as e:
        raise TNFRValueError(
            f"Invalid parameters for create_nfr: {e}",
            context={"epi": epi, "vf": vf, "theta": theta, "error": str(e)},
        ) from e

    G = graph if graph is not None else nx.Graph()
    G.add_node(
        name,
        **{
            EPI_PRIMARY: float(epi),
            VF_PRIMARY: float(vf),
            THETA_PRIMARY: float(theta),
        },
    )
    set_delta_nfr_hook(G, dnfr_hook)
    return G, name


def _resolve_dimension(
    G: TNFRGraph,
    *,
    dimension: int | None,
    hilbert_space: HilbertSpace | None,
    existing_cfg: Mapping[str, object] | None,
) -> int:
    if hilbert_space is not None:
        resolved = int(getattr(hilbert_space, "dimension", 0) or 0)
        if resolved <= 0:
            raise TNFRValueError(
                "Hilbert space dimension must be positive.",
                context={"dimension": resolved},
            )
        return resolved

    if dimension is None and existing_cfg:
        candidate = existing_cfg.get("dimension")
        if isinstance(candidate, int) and candidate > 0:
            dimension = candidate

    if dimension is None:
        if hasattr(G, "number_of_nodes"):
            count = int(G.number_of_nodes())
        else:
            count = len(tuple(G.nodes))
        dimension = max(1, count)

    resolved = int(dimension)
    if resolved <= 0:
        raise TNFRValueError(
            "Hilbert space dimension must be positive.",
            context={"dimension": resolved},
        )
    return resolved


def _ensure_coherence_operator(
    *,
    operator: CoherenceOperator | None,
    dimension: int,
    spectrum: Sequence[float] | None,
    c_min: float | None,
) -> CoherenceOperator:
    if operator is not None:
        return operator

    kwargs: dict[str, object] = {}
    if spectrum is not None:
        spectrum_array = np.asarray(spectrum, dtype=np.complex128)
        if spectrum_array.ndim != 1:
            raise TNFRValueError(
                "Coherence spectrum must be one-dimensional.",
                context={"ndim": spectrum_array.ndim},
            )
        kwargs["spectrum"] = spectrum_array
    if c_min is not None:
        kwargs["c_min"] = float(c_min)
    return make_coherence_operator(dimension, **kwargs)


def _ensure_frequency_operator(
    *,
    operator: FrequencyOperator | None,
    dimension: int,
    diagonal: Sequence[float] | None,
) -> FrequencyOperator:
    if operator is not None:
        return operator

    if diagonal is None:
        matrix = np.eye(dimension, dtype=float)
    else:
        diag_array = np.asarray(diagonal, dtype=float)
        if diag_array.ndim != 1:
            raise TNFRValueError(
                "Frequency diagonal must be one-dimensional.",
                context={"ndim": diag_array.ndim},
            )
        if diag_array.shape[0] != int(dimension):
            raise TNFRValueError(
                "Frequency diagonal size must match Hilbert dimension.",
                context={"size": diag_array.shape[0], "dimension": dimension},
            )
        matrix = np.diag(diag_array)
    return make_frequency_operator(np.asarray(matrix, dtype=np.complex128))


def _ensure_generator_matrix(
    *,
    dimension: int,
    diagonal: Sequence[float] | None,
) -> "np.ndarray":
    if diagonal is None:
        return np.zeros((dimension, dimension), dtype=np.complex128)
    diag_array = np.asarray(diagonal, dtype=np.complex128)
    if diag_array.ndim != 1:
        raise TNFRValueError(
            "Generator diagonal must be one-dimensional.",
            context={"ndim": diag_array.ndim},
        )
    if diag_array.shape[0] != int(dimension):
        raise TNFRValueError(
            "Generator diagonal size must match Hilbert dimension.",
            context={"size": diag_array.shape[0], "dimension": dimension},
        )
    return np.diag(diag_array)


def create_math_nfr(
    name: str,
    *,
    epi: float = 0.0,
    vf: float = 1.0,
    theta: float = 0.0,
    graph: TNFRGraph | None = None,
    dnfr_hook: DeltaNFRHook = dnfr_epi_vf_mixed,
    dimension: int | None = None,
    hilbert_space: HilbertSpace | None = None,
    coherence_operator: CoherenceOperator | None = None,
    coherence_spectrum: Sequence[float] | None = None,
    coherence_c_min: float | None = None,
    coherence_threshold: float | None = None,
    frequency_operator: FrequencyOperator | None = None,
    frequency_diagonal: Sequence[float] | None = None,
    generator_diagonal: Sequence[float] | None = None,
    state_projector: BasicStateProjector | None = None,
    dynamics_engine: MathematicalDynamicsEngine | None = None,
    validator: NFRValidator | None = None,
) -> tuple[TNFRGraph, str]:
    """Create a TNFR node with canonical mathematical validation attached.

    The helper wraps :func:`create_nfr` while projecting the structural state
    into a Hilbert space so coherence, νf and norm invariants can be tracked via
    the mathematical runtime.  It installs operators and validation metadata on
    both the node and the hosting graph so that the
    :class:`~tnfr.mathematics.MathematicalDynamicsEngine` can consume them
    directly.

    Parameters
    ----------
    name : str
        Identifier for the new node.
    epi, vf, theta : float, optional
        Canonical TNFR scalars forwarded to :func:`create_nfr`.
    dimension : int, optional
        Hilbert space dimension. When omitted it is inferred from the graph size
        (at least one).
    hilbert_space : HilbertSpace, optional
        Pre-built Hilbert space to reuse. Its dimension supersedes ``dimension``.
    coherence_operator, frequency_operator : optional
        Custom operators to install. When omitted they are derived from
        ``coherence_spectrum``/``coherence_c_min`` and
        ``frequency_diagonal`` respectively.
    coherence_threshold : float, optional
        Validation floor. Defaults to ``coherence_operator.c_min``.
    generator_diagonal : sequence of float, optional
        Diagonal entries for the unitary generator used by the mathematical
        dynamics engine. Defaults to a null generator.
    state_projector : BasicStateProjector, optional
        Projector used to build the canonical spectral state for validation.

    Returns
    -------
    tuple[TNFRGraph, str]
        The graph and node identifier, mirroring :func:`create_nfr`.

    Examples
    --------
    >>> G, node = create_math_nfr("math-seed", epi=0.4, vf=1.2, theta=0.05, dimension=3)
    >>> metrics = G.nodes[node]["math_metrics"]
    >>> round(metrics["norm"], 6)
    1.0
    >>> metrics["coherence_passed"], metrics["frequency_passed"]
    (True, True)
    >>> metrics["coherence_value"] >= metrics["coherence_threshold"]
    True

    Notes
    -----
    The helper mutates/extends ``G.graph['MATH_ENGINE']`` so subsequent calls to
    :mod:`tnfr.dynamics.runtime` can advance the mathematical engine without
    further configuration.
    """

    if np is None:
        raise ImportError(
            "create_math_nfr requires NumPy; install the 'tnfr[math]' extras."
        )

    G, node = create_nfr(
        name,
        epi=epi,
        vf=vf,
        theta=theta,
        graph=graph,
        dnfr_hook=dnfr_hook,
    )

    existing_cfg = G.graph.get("MATH_ENGINE")
    mapping_cfg: Mapping[str, object] | None
    if isinstance(existing_cfg, Mapping):
        mapping_cfg = existing_cfg
    else:
        mapping_cfg = None

    resolved_dimension = _resolve_dimension(
        G,
        dimension=dimension,
        hilbert_space=hilbert_space,
        existing_cfg=mapping_cfg,
    )

    hilbert = hilbert_space or HilbertSpace(resolved_dimension)
    resolved_dimension = int(getattr(hilbert, "dimension", resolved_dimension))

    coherence = _ensure_coherence_operator(
        operator=coherence_operator,
        dimension=resolved_dimension,
        spectrum=coherence_spectrum,
        c_min=coherence_c_min,
    )
    threshold = float(
        coherence_threshold if coherence_threshold is not None else coherence.c_min
    )

    frequency = _ensure_frequency_operator(
        operator=frequency_operator,
        dimension=resolved_dimension,
        diagonal=frequency_diagonal,
    )

    projector = state_projector or BasicStateProjector()

    generator_matrix = _ensure_generator_matrix(
        dimension=resolved_dimension,
        diagonal=generator_diagonal,
    )
    engine = dynamics_engine or MathematicalDynamicsEngine(
        generator_matrix,
        hilbert_space=hilbert,
    )

    enforce_frequency = frequency is not None
    spectral_validator = validator or NFRValidator(
        hilbert,
        coherence,
        threshold,
        frequency_operator=frequency if enforce_frequency else None,
    )

    state = projector(
        epi=float(epi),
        nu_f=float(vf),
        theta=float(theta),
        dim=resolved_dimension,
    )
    norm_value = float(hilbert.norm(state))
    outcome = spectral_validator.validate(
        state,
        enforce_frequency_positivity=enforce_frequency,
    )
    summary_raw = outcome.summary
    summary = {key: deepcopy(value) for key, value in summary_raw.items()}

    coherence_summary = summary.get("coherence")
    frequency_summary = summary.get("frequency")

    math_metrics = {
        "norm": norm_value,
        "normalized": bool(summary.get("normalized", False)),
        "coherence_value": (
            float(coherence_summary.get("value", 0.0))
            if isinstance(coherence_summary, Mapping)
            else 0.0
        ),
        "coherence_threshold": (
            float(coherence_summary.get("threshold", threshold))
            if isinstance(coherence_summary, Mapping)
            else threshold
        ),
        "coherence_passed": (
            bool(coherence_summary.get("passed", False))
            if isinstance(coherence_summary, Mapping)
            else False
        ),
        "frequency_value": (
            float(frequency_summary.get("value", 0.0))
            if isinstance(frequency_summary, Mapping)
            else 0.0
        ),
        "frequency_passed": (
            bool(frequency_summary.get("passed", False))
            if isinstance(frequency_summary, Mapping)
            else True
        ),
        "frequency_spectrum_min": (
            float(frequency_summary.get("spectrum_min", 0.0))
            if isinstance(frequency_summary, Mapping)
            and "spectrum_min" in frequency_summary
            else None
        ),
        "unitary_passed": bool(
            summary.get("unitary_stability", {}).get("passed", False)
        ),
    }

    node_context = {
        "hilbert_space": hilbert,
        "coherence_operator": coherence,
        "frequency_operator": frequency,
        "coherence_threshold": threshold,
        "dimension": resolved_dimension,
    }

    node_data = G.nodes[node]
    node_data["math_metrics"] = math_metrics
    node_data["math_summary"] = summary
    node_data["math_context"] = node_context

    cfg = dict(mapping_cfg) if mapping_cfg is not None else {}
    cfg.update(
        {
            "enabled": True,
            "dimension": resolved_dimension,
            "hilbert_space": hilbert,
            "coherence_operator": coherence,
            "coherence_threshold": threshold,
            "frequency_operator": frequency,
            "state_projector": projector,
            "validator": spectral_validator,
            "generator_matrix": generator_matrix,
            "dynamics_engine": engine,
        }
    )
    G.graph["MATH_ENGINE"] = cfg

    return G, node


__all__ = (
    "create_nfr",
    "create_math_nfr",
    "Operator",
    "Emission",
    "Reception",
    "Coherence",
    "Dissonance",
    "Coupling",
    "Resonance",
    "Silence",
    "Expansion",
    "Contraction",
    "SelfOrganization",
    "Mutation",
    "Transition",
    "Recursivity",
    "OPERATORS",
    "validate_sequence",
    "run_sequence",
)


def run_sequence(
    G: TNFRGraph,
    node: NodeId,
    ops: Iterable[Operator],
    context: dict[str, Any] | None = None,
) -> None:
    """Drive structural sequences that rebalance EPI, νf, phase and ΔNFR.

    The function enforces the canonical operator grammar, then executes each
    operator so that the configured ΔNFR hook can update the nodal equation in
    place. Each step is expected to express the structural effect of the
    operator, while the hook keeps EPI, νf and phase consistent with the
    resulting ΔNFR variations.

    Parameters
    ----------
    G : TNFRGraph
        Graph that stores the node and its ΔNFR orchestration hook. The hook is
        read from ``G.graph['compute_delta_nfr']`` and is responsible for
        keeping the nodal equation up to date after each operator.
    node : NodeId
        Identifier of the node that will receive the operators. The node must
        already contain the canonical attributes ``EPI``, ``νf`` and ``θ``.
    ops : Iterable[Operator]
        Iterable of canonical structural operators to apply. Their
        concatenation must respect the validated TNFR grammar.
    context : dict, optional
        Additional context for sequence validation (e.g. 'initial_epi_nonzero').

    Returns
    -------
    None
        The function mutates ``G`` in-place by updating the node attributes.

    Raises
    ------
    ValueError
        Raised when the provided operator names do not satisfy the canonical
        sequence validation rules.

    Examples
    --------
    Run a validated trajectory that highlights the ΔNFR-driven evolution of the
    node metrics.

    >>> from tnfr.constants import DNFR_PRIMARY, EPI_PRIMARY, THETA_PRIMARY, VF_PRIMARY
    >>> from tnfr.dynamics import set_delta_nfr_hook
    >>> from tnfr.structural import (
    ...     Coherence,
    ...     Emission,
    ...     Reception,
    ...     Resonance,
    ...     Silence,
    ...     create_nfr,
    ...     run_sequence,
    ... )
    >>> G, node = create_nfr("seed", epi=0.8, vf=1.5, theta=0.0)
    >>> def amplify_delta(graph):
    ...     delta = graph.nodes[node][VF_PRIMARY] * 0.15
    ...     graph.nodes[node][DNFR_PRIMARY] = delta
    ...     graph.nodes[node][EPI_PRIMARY] += delta * 0.8
    ...     graph.nodes[node][VF_PRIMARY] += delta * 0.1
    ...     graph.nodes[node][THETA_PRIMARY] += 0.02
    >>> set_delta_nfr_hook(G, amplify_delta)
    >>> run_sequence(G, node, [Emission(), Reception(), Coherence(), Resonance(), Silence()])  # doctest: +SKIP
    >>> (
    ...     G.nodes[node][EPI_PRIMARY],
    ...     G.nodes[node][VF_PRIMARY],
    ...     G.nodes[node][THETA_PRIMARY],
    ...     G.nodes[node][DNFR_PRIMARY],
    ... )  # doctest: +SKIP
    (..., ..., ..., ...)
    """

    compute = G.graph.get("compute_delta_nfr")
    ops_list = list(ops)
    names = [op.name for op in ops_list]

    # Initialize validators (reuse global instances for performance)
    if not hasattr(run_sequence, "_invariant_validator"):
        run_sequence._invariant_validator = InvariantValidator()  # type: ignore[attr-defined]
    if not hasattr(run_sequence, "_semantic_validator"):
        run_sequence._semantic_validator = SequenceSemanticValidator()  # type: ignore[attr-defined]

    # Skip validation for empty sequences (TNFR: empty sequence is structural identity)
    if names:
        # Birth context detection: if node already has non-zero EPI and
        # sequence begins with a non-generator we allow context override.
        epi_val = G.nodes[node].get(EPI_PRIMARY, 0.0)

        validation_context = context.copy() if context else {}

        if names[0] not in VALID_START_OPERATORS and epi_val:
            logger.info(
                "U1a override (EPI≠0) node=%s; start=%s",
                node,
                names[0],
            )
            validation_context["initial_epi_nonzero"] = True

        outcome = validate_sequence(names, context=validation_context)
        if not outcome.passed:
            summary_message = outcome.summary.get("message", "validation failed")
            raise TNFRValueError(
                f"Invalid sequence: {summary_message}",
                context={"sequence": names, "outcome": outcome.summary},
            )

        # Semantic validation of sequence (if enabled)
        if validation_config.enable_semantic_validation:
            semantic_violations = run_sequence._semantic_validator.validate_semantic_sequence(names)  # type: ignore[attr-defined]
            if semantic_violations:
                # Filter by configured settings
                error_violations = [
                    v
                    for v in semantic_violations
                    if v.severity == InvariantSeverity.ERROR
                    or v.severity == InvariantSeverity.CRITICAL
                ]
                warning_violations = [
                    v
                    for v in semantic_violations
                    if v.severity == InvariantSeverity.WARNING
                ]

                # Always raise on errors
                if error_violations:
                    report = run_sequence._invariant_validator.generate_report(error_violations)  # type: ignore[attr-defined]
                    raise TNFRValueError(
                        f"Semantic sequence violations:\n{report}",
                        context={"violations": [v.to_dict() for v in error_violations]},
                    )

                # Show warnings if allowed
                if warning_violations and validation_config.allow_semantic_warnings:
                    invariant_validator = cast(
                        InvariantValidator,
                        run_sequence._invariant_validator,
                    )
                    report = invariant_validator.generate_report(warning_violations)
                    logger.warning(
                        "⚠️  Semantic sequence warnings:\n%s",
                        report,
                    )

    # Pre-execution invariant validation (if enabled)
    if validation_config.validate_invariants:
        try:
            run_sequence._invariant_validator.validate_and_raise(  # type: ignore[attr-defined]
                G, validation_config.min_severity
            )
        except Exception:
            # If validation fails, provide context but don't block if it's just warnings
            if validation_config.min_severity != InvariantSeverity.WARNING:
                raise

    for op in ops_list:
        # Mark last operator for tracking (for Invariant 1)
        if not hasattr(G, "_last_operator_applied"):
            G._last_operator_applied = None  # type: ignore[attr-defined]
        G._last_operator_applied = op.name  # type: ignore[attr-defined]

        op(G, node)
        if callable(compute):
            compute(G)

        # Per-step validation (expensive, only if configured)
        if (
            validation_config.validate_each_step
            and validation_config.validate_invariants
        ):
            violations = run_sequence._invariant_validator.validate_graph(  # type: ignore[attr-defined]
                G, InvariantSeverity.ERROR
            )
            if violations:
                report = run_sequence._invariant_validator.generate_report(violations)  # type: ignore[attr-defined]
                raise TNFRValueError(
                    f"Invariant violations after {op.name}:\n{report}",
                    context={
                        "operator": op.name,
                        "violations": [v.to_dict() for v in violations],
                    },
                )

        # ``update_epi_via_nodal_equation`` was previously invoked here to
        # recalculate the EPI value after each operator. The responsibility for
        # updating EPI now lies with the dynamics hook configured in
        # ``compute_delta_nfr`` or with external callers.

    # Post-execution invariant validation (if enabled)
    if validation_config.validate_invariants:
        try:
            run_sequence._invariant_validator.validate_and_raise(  # type: ignore[attr-defined]
                G, validation_config.min_severity
            )
        except Exception:
            # If validation fails, provide context but don't block if it's just warnings
            if validation_config.min_severity != InvariantSeverity.WARNING:
                raise