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

grammar_patterns.py

TNFR Grammar: Sequence Pattern Recognition

Sequence validation, parsing, pattern recognition, and optimization helpers.

Terminology (TNFR semantics):

  • "node" == resonant locus (structural coherence site); kept for NetworkX compatibility
  • Future semantic aliasing ("locus") must preserve public API stability

CRITICAL TECHNICAL NOTE (Diagnostic Pattern Exemption - Nov 2025):

The sequence [dissonance, mutation] is used in bifurcation detection tests as a probe pattern to deliberately trigger threshold crossing. This pattern intentionally violates:

  • U2 (stabilizer requirement after destabilizers)
  • U4b (transformer context requirement)

This is NOT a grammar failure but a diagnostic tool. The exemption logic in _check_end_rule() and stabilizer checks explicitly allows [OZ, ZHIR] patterns for bifurcation probes without requiring stabilizers.

Rationale: Bifurcation detection requires controlled destabilization to test threshold behavior (∂²EPI/∂t² > τ). Adding stabilizers would defeat the purpose by preventing the bifurcation we're trying to detect.

Safety: These sequences are only used in controlled test environments where fragmentation is the expected outcome being validated.

See: check_end_rule() terminal dissonance logic, tests/unit/operators/test*.py

Source Code

python
"""TNFR Grammar: Sequence Pattern Recognition

Sequence validation, parsing, pattern recognition, and optimization helpers.

Terminology (TNFR semantics):
- "node" == resonant locus (structural coherence site); kept for NetworkX compatibility
- Future semantic aliasing ("locus") must preserve public API stability

CRITICAL TECHNICAL NOTE (Diagnostic Pattern Exemption - Nov 2025):
-------------------------------------------------------------------
The sequence [dissonance, mutation] is used in bifurcation detection tests
as a probe pattern to deliberately trigger threshold crossing. This pattern
intentionally violates:
- U2 (stabilizer requirement after destabilizers)
- U4b (transformer context requirement)

This is NOT a grammar failure but a diagnostic tool. The exemption logic in
_check_end_rule() and stabilizer checks explicitly allows [OZ, ZHIR] patterns
for bifurcation probes without requiring stabilizers.

**Rationale**: Bifurcation detection requires controlled destabilization to
test threshold behavior (∂²EPI/∂t² > τ). Adding stabilizers would defeat the
purpose by preventing the bifurcation we're trying to detect.

**Safety**: These sequences are only used in controlled test environments
where fragmentation is the expected outcome being validated.

See: _check_end_rule() terminal dissonance logic, tests/unit/operators/test_*.py
"""

from __future__ import annotations

from typing import Any, Mapping, Sequence

from ..config.operator_names import (
    BIFURCATION_WINDOW,
    CANONICAL_OPERATOR_NAMES,
    COHERENCE,
    DESTABILIZERS,
    INTERMEDIATE_OPERATORS,
    SELF_ORGANIZATION,
    SELF_ORGANIZATION_CLOSURES,
    TRANSFORMERS,
    VALID_END_OPERATORS,
    VALID_START_OPERATORS,
)
from ..types import Glyph
from ..validation.compatibility import CompatibilityLevel, get_compatibility_level
from .grammar_types import (
    SequenceSyntaxError,
    SequenceValidationResult,
    StructuralPattern,
)

# --- State classification thresholds for IL sequence suggestion ---
_INACTIVE_EPI_THRESHOLD = 0.1  # EPI below this → node inactive
_HIGH_DNFR_THRESHOLD = 0.8  # ΔNFR above this → high pressure
_MODERATE_DNFR_LOW = 0.3  # lower bound of moderate ΔNFR range
_MODERATE_DNFR_HIGH = 0.7  # upper bound of moderate ΔNFR range

__all__ = [
    "validate_sequence",
    "parse_sequence",
    "SequenceValidationResultWithHealth",
    "validate_sequence_with_health",
]

# ============================================================================


def _canonicalize_tokens(names: Sequence[str]) -> tuple[list[str], list[int]]:
    canonical: list[str] = []
    non_str_indices: list[int] = []
    for idx, tok in enumerate(names):
        if not isinstance(tok, str):
            non_str_indices.append(idx)
            canonical.append(str(tok))
        else:
            canonical.append(tok)
    return canonical, non_str_indices


def _compute_metadata(tokens: list[str]) -> dict[str, object]:
    from .pattern_detection import detect_pattern

    meta: dict[str, object] = {}
    meta["unknown_tokens"] = frozenset(
        t for t in tokens if t not in CANONICAL_OPERATOR_NAMES
    )
    meta["has_intermediate"] = any(t in INTERMEDIATE_OPERATORS for t in tokens)
    meta["has_reception"] = "reception" in tokens
    meta["has_coherence"] = "coherence" in tokens
    meta["has_dissonance"] = "dissonance" in tokens
    meta["has_stabilizer"] = any(t in {COHERENCE, SELF_ORGANIZATION} for t in tokens)
    try:
        pattern = detect_pattern(tokens)
        meta["detected_pattern"] = getattr(pattern, "value", str(pattern))
    except Exception:
        meta["detected_pattern"] = StructuralPattern.UNKNOWN.value
    return meta


def _check_start_rule(
    tokens: list[str], *, context: Mapping[str, Any] | None = None
) -> tuple[bool, str | None]:
    """Validate sequence start token (U1a: initiation).

    ABSOLUTE canonicity: If the initial EPI is undefined (birth
    context) the first operator MUST be a generator in
    VALID_START_OPERATORS: emission | transition | recursivity.

    Without explicit external context we conservatively assume
    birth when the first token is not a known generator. Thus
    non-generator starts fail fast with a U1a violation message.
    """
    if not tokens:
        return False, "empty sequence"
    first = tokens[0]
    if first not in VALID_START_OPERATORS:
        # Allow override if caller declares pre-existing EPI form
        epi_nonzero = False
        if context is not None:
            epi_nonzero = bool(context.get("initial_epi_nonzero", False))
        if epi_nonzero:
            return True, None  # Prior form means initiation already satisfied
        return (
            False,
            (
                "must start with emission, recursivity, transition "
                "(U1a generator requirement)"
            ),
        )
    return True, None


def _check_end_rule(
    tokens: list[str], *, context: Mapping[str, Any] | None = None
) -> tuple[bool, str | None]:
    """Validate terminal operator (U1b: closure).

    Closure set: silence | transition | recursivity | dissonance.
    A terminal dissonance (OZ) is only valid if a stabilizer
    (coherence or self_organization) occurred earlier, ensuring
    contained destabilization per U2/U4 handler requirements.
    """
    # Ephemeral bifurcation probe pattern: dissonance -> mutation
    # Used for ZHIR bifurcation detection tests; treated as a
    # diagnostic micro-sequence whose structural closure is
    # deferred to subsequent stabilizer steps. We allow this
    # two-token pattern to pass U1b with a diagnostic waiver.
    if len(tokens) == 2 and tokens == ["dissonance", "mutation"]:
        # Allow only under explicit diagnostic context
        diag = bool(context.get("diagnostic", False)) if context else False
        if diag:
            return True, None
    last = tokens[-1]
    if last not in VALID_END_OPERATORS:
        return (
            False,
            (
                "must end with closure "
                "(silence|transition|recursivity|dissonance) - violates U1b"
            ),
        )
    if last == "dissonance" and not any(
        t in {COHERENCE, SELF_ORGANIZATION} for t in tokens[:-1]
    ):
        return (
            False,
            (
                "terminal dissonance requires prior stabilizer "
                "(coherence|self_organization) per U1b/U2"
            ),
        )
    return True, None


def _check_thol_closure(tokens: list[str]) -> tuple[bool, str | None]:
    if SELF_ORGANIZATION in tokens and tokens[-1] not in SELF_ORGANIZATION_CLOSURES:
        return (
            False,
            ("self_organization requires terminal closure " "(silence or contraction)"),
        )
    return True, None


def _check_adjacent_compatibility(
    tokens: list[str],
) -> tuple[bool, int | None, str | None]:
    # Check for therapeutic patterns overriding compatibility rules
    if _is_canonical_therapeutic_pattern(tokens):
        return True, None, None

    prev = tokens[0]
    for i in range(1, len(tokens)):
        cur = tokens[i]
        level = get_compatibility_level(prev, cur)
        if level == CompatibilityLevel.AVOID:
            if prev == "silence":
                if cur == "silence":
                    msg = f"redundant consecutive silence operations: {prev} → {cur} (duplicate effect, no structural purpose)"
                elif cur == "dissonance":
                    msg = (
                        "silence → dissonance contradicts structural theory: "
                        "νf≈0 (paused) cannot generate ΔNFR tension. "
                        "Alternatives: SHA→AL→OZ or SHA→NAV→OZ"
                    )
                else:
                    msg = f"invalid after silence: {prev} → {cur}"
            elif cur == "mutation":
                # Special case: mutation requires dissonance (R4)
                msg = (
                    f"mutation requires prior dissonance (R4). "
                    f"Transition {prev} → {cur} incompatible"
                )
            else:
                msg = f"operator transition {prev} → {cur} contradicts canonical flow"
            return False, i, msg
        prev = cur
    return True, None, None


def _is_canonical_therapeutic_pattern(tokens: list[str]) -> bool:
    """Check if sequence matches a known canonical therapeutic pattern.

    Therapeutic patterns may override standard compatibility rules for
    crisis containment scenarios (e.g., OZ → SHA direct transition).
    """
    # CONTAINED_CRISIS: emission,reception,coherence,dissonance,silence
    if len(tokens) == 5 and tokens == [
        "emission",
        "reception",
        "coherence",
        "dissonance",
        "silence",
    ]:
        return True

    return False


def _check_transformer_windows(
    tokens: list[str],
) -> tuple[bool, int | None, str | None]:
    # U4b transformers (ZHIR, THOL) = canonical TRANSFORMERS set (single source
    # config.operator_names.TRANSFORMERS, derived in physics_derivation).
    for i, tok in enumerate(tokens):
        if tok not in TRANSFORMERS:
            continue

        found = False
        # U4b: any destabilizer (DESTABILIZERS = {OZ, ZHIR, VAL}) within the
        # single structural-relaxation window. The window is topology-
        # independent (mean L_rw eigenvalue = trace/N = 1), so there is no
        # graduated reach -- every destabilizer shares BIFURCATION_WINDOW.
        for j in range(i - 1, -1, -1):
            if i - j > BIFURCATION_WINDOW:
                break  # past the relaxation window
            if tokens[j] in DESTABILIZERS:
                found = True
                break

        if not found:
            msg = (
                f"{tok} requires a recent destabilizer "
                f"(OZ/ZHIR/VAL) within the structural-relaxation "
                f"window = {BIFURCATION_WINDOW} ops"
            )
            return False, i, msg

    return True, None, None


def _build_result(
    *,
    names: Sequence[str],
    canonical: Sequence[str],
    passed: bool,
    message: str,
    metadata: Mapping[str, object],
    error: SequenceSyntaxError | None = None,
) -> SequenceValidationResult:
    return SequenceValidationResult(
        tokens=tuple(names),
        canonical_tokens=tuple(canonical),
        passed=passed,
        message=message,
        metadata=metadata,
        summary={
            "message": message,
            "tokens": tuple(canonical),
            "metadata": dict(metadata),
            **(
                {
                    "error": {
                        "index": error.index,
                        "token": error.token,
                        "message": error.message,
                    }
                }
                if error is not None
                else {}
            ),
        },
        artifacts={
            "tokens": tuple(names),
            "canonical_tokens": tuple(canonical),
        },
        error=error,
    )


def validate_sequence(
    names: Any, *, context: Mapping[str, Any] | None = None, **kwargs: Any
) -> SequenceValidationResult:
    """Validate an operator sequence (TNFR grammar).

    Optional context keys:
    - initial_epi_nonzero: bool -> if True, permits non-generator start
      because EPI birth already occurred outside this sequence.

    Any other unexpected keyword raises TypeError (legacy guard).
    """
    if kwargs:
        bad = ", ".join(sorted(kwargs.keys()))
        raise TypeError(f"unexpected keyword argument(s): {bad}")

    # type checks and canonicalization
    if not isinstance(names, (list, tuple)):
        try:
            names = list(names)  # type: ignore[assignment]
        except Exception:
            names = [names]  # type: ignore[assignment]
    canon_list, non_str = _canonicalize_tokens(names)  # type: ignore[arg-type]
    if non_str:
        idx = non_str[0]
        err = SequenceSyntaxError(idx, names[idx], "tokens must be str")
        meta = _compute_metadata([str(t) for t in names])
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=canon_list,
            passed=False,
            message="tokens must be str",
            metadata=meta,
            error=err,
        )

    tokens = [t for t in canon_list]
    meta = _compute_metadata(tokens)

    if not tokens:
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=tokens,
            passed=False,
            message="empty sequence",
            metadata=meta,
        )

    # Unknown tokens
    for i, t in enumerate(tokens):
        if t not in CANONICAL_OPERATOR_NAMES:
            err = SequenceSyntaxError(i, t, f"unknown tokens: {t}")
            return _build_result(
                names=names,  # type: ignore[arg-type]
                canonical=tokens,
                passed=False,
                message="unknown tokens",
                metadata=meta,
                error=err,
            )

    # Structural rules
    ok, msg = _check_start_rule(tokens, context=context)
    if not ok:
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=tokens,
            passed=False,
            message=msg or "invalid start",
            metadata=meta,
        )
    ok, msg = _check_end_rule(tokens, context=context)
    if not ok:
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=tokens,
            passed=False,
            message=msg or "invalid end",
            metadata=meta,
        )
    ok, msg = _check_thol_closure(tokens)
    if not ok:
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=tokens,
            passed=False,
            message=msg or "thol requires closure",
            metadata=meta,
        )

    # U2: Destabilizers require stabilizers (IL or THOL). The destabilizer set
    # is the canonical {OZ, ZHIR, VAL} (config.operator_names.DESTABILIZERS,
    # derived in physics_derivation.increases_structural_pressure); NUL
    # (contraction) is NOT a U2 destabilizer (dual-lever 'both', U2-neutral).
    has_destabilizer = any(t in DESTABILIZERS for t in tokens)
    has_stabilizer = any(t in {COHERENCE, SELF_ORGANIZATION} for t in tokens)

    if has_destabilizer and not has_stabilizer:
        diag = bool(context.get("diagnostic", False)) if context else False
        if not (diag and len(tokens) == 2 and tokens == ["dissonance", "mutation"]):
            return _build_result(
                names=names,  # type: ignore[arg-type]
                canonical=tokens,
                passed=False,
                message="missing stabilizer (coherence or self_organization)",
                metadata=meta,
            )

    # Adjacent compatibility
    ok, idx, msg = _check_adjacent_compatibility(tokens)
    if not ok:
        err = SequenceSyntaxError(
            idx or 1,
            tokens[idx or 1],
            msg or "incompatible",
        )
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=tokens,
            passed=False,
            message=msg or "incompatible transition",
            metadata=meta,
            error=err,
        )

    # Transformer windows (ZHIR/THOL)
    ok, idx, msg = _check_transformer_windows(tokens)
    if not ok:
        err = SequenceSyntaxError(
            idx or 0,
            tokens[idx or 0],
            msg or "bifurcation rule",
        )
        return _build_result(
            names=names,  # type: ignore[arg-type]
            canonical=tokens,
            passed=False,
            message=msg or "bifurcation rule",
            metadata=meta,
            error=err,
        )

    # All good
    return _build_result(
        names=names,  # type: ignore[arg-type]
        canonical=tokens,
        passed=True,
        message="ok",
        metadata=meta,
    )


def parse_sequence(names: Sequence[str]) -> SequenceValidationResult:
    """Parse and validate sequence; raise on structural errors."""
    # type and canonical checks
    if not isinstance(names, (list, tuple)):
        names = list(names)  # type: ignore[assignment]
    canon, non_str = _canonicalize_tokens(names)
    if non_str:
        idx = non_str[0]
        raise SequenceSyntaxError(idx, names[idx], "tokens must be str")

    tokens = [t for t in canon]

    # Empty
    if not tokens:
        raise SequenceSyntaxError(0, "", "empty sequence")

    # Unknown tokens
    for i, t in enumerate(tokens):
        if t not in CANONICAL_OPERATOR_NAMES:
            raise SequenceSyntaxError(i, t, f"unknown tokens: {t}")

    # Start/End
    ok, msg = _check_start_rule(tokens)
    if not ok:
        raise SequenceSyntaxError(0, tokens[0], msg or "invalid start")
    ok, msg = _check_end_rule(tokens)
    if not ok:
        raise SequenceSyntaxError(
            len(tokens) - 1,
            tokens[-1],
            msg or "invalid end",
        )
    ok, msg = _check_thol_closure(tokens)
    if not ok:
        raise SequenceSyntaxError(
            len(tokens) - 1,
            tokens[-1],
            msg or "thol closure",
        )

    # Stabilizer presence
    if not any(t in {COHERENCE, SELF_ORGANIZATION} for t in tokens):
        raise SequenceSyntaxError(
            0,
            tokens[0],
            "missing stabilizer (coherence or self_organization)",
        )

    # Adjacent compatibility
    ok, idx, msg = _check_adjacent_compatibility(tokens)
    if not ok:
        raise SequenceSyntaxError(
            idx or 1,
            tokens[idx or 1],
            msg or "incompatible",
        )

    # Transformer windows
    ok, idx, msg = _check_transformer_windows(tokens)
    if not ok:
        raise SequenceSyntaxError(
            idx or 0,
            tokens[idx or 0],
            msg or "bifurcation rule",
        )

    # Successful parse result with metadata
    meta = _compute_metadata(tokens)
    return _build_result(
        names=names,
        canonical=tokens,
        passed=True,
        message="ok",
        metadata=meta,
    )


class SequenceValidationResultWithHealth:
    """Validation result wrapper that includes health metrics."""

    def __init__(self, validation_result, health_metrics=None):
        self._validation_result = validation_result
        self.health_metrics = health_metrics

    def __getattr__(self, name):
        """Delegate attribute access to the underlying validation result."""
        return getattr(self._validation_result, name)

    @property
    def passed(self):
        """Whether validation passed."""
        return self._validation_result.passed

    @property
    def tokens(self):
        """Original tokens."""
        return self._validation_result.tokens

    @property
    def canonical_tokens(self):
        """Canonical tokens."""
        return self._validation_result.canonical_tokens

    @property
    def message(self):
        """Validation message."""
        return self._validation_result.message

    @property
    def metadata(self):
        """Validation metadata."""
        return self._validation_result.metadata

    @property
    def error(self):
        """Validation error."""
        return self._validation_result.error


def validate_sequence_with_health(sequence):
    """Validate sequence and compute health metrics.

    This wrapper combines validation with health analysis.

    Parameters
    ----------
    sequence : Iterable[str]
        Sequence of operator names

    Returns
    -------
    result : SequenceValidationResultWithHealth
        Validation result with health_metrics attribute
    """
    # Import here to avoid circular dependency
    try:
        from ..operators.health_analyzer import SequenceHealthAnalyzer
    except ImportError:
        # If health analyzer not available, just validate
        result = validate_sequence(sequence)
        return SequenceValidationResultWithHealth(result, None)

    # Validate the sequence
    result = validate_sequence(sequence)

    # Add health metrics if validation passed
    health_metrics = None
    if result.passed:
        try:
            analyzer = SequenceHealthAnalyzer()
            health_metrics = analyzer.analyze_health(sequence)
        except Exception:
            # If health analysis fails, set to None
            health_metrics = None

    return SequenceValidationResultWithHealth(result, health_metrics)


# Compatibility: Canonical IL sequences and helpers

# Minimal registry for tests that import canonical IL sequences. These
# definitions are educational shims; the canonical grammar remains
# physics‑first.
CANONICAL_IL_SEQUENCES: Mapping[str, Mapping[str, object]] = {
    "EMISSION_COHERENCE": {
        "name": "safe_activation",
        "pattern": ["emission", "coherence"],
        "glyphs": [Glyph.AL, Glyph.IL],
        "optimization": "can_fuse",
        "description": "Emission stabilized by coherence",
    },
    "RECEPTION_COHERENCE": {
        "name": "stable_integration",
        "pattern": ["reception", "coherence"],
        "glyphs": [Glyph.EN, Glyph.IL],
        "optimization": "can_fuse",
        "description": "Reception consolidated into coherent form",
    },
    "DISSONANCE_COHERENCE": {
        "name": "creative_resolution",
        "pattern": ["dissonance", "coherence"],
        "glyphs": [Glyph.OZ, Glyph.IL],
        "optimization": "preserve",
        "description": "Dissonance resolved by stabilizer",
    },
    "RESONANCE_COHERENCE": {
        "name": "resonance_consolidation",
        "pattern": ["resonance", "coherence"],
        "glyphs": [Glyph.RA, Glyph.IL],
        "optimization": "preserve",
        "description": "Propagated coherence locked by IL",
    },
    "COHERENCE_MUTATION": {
        "name": "stable_transformation",
        "pattern": ["coherence", "mutation"],
        "glyphs": [Glyph.IL, Glyph.ZHIR],
        "optimization": "preserve",
        "description": "Stable base enabling phase transformation",
        "structural_effect": "Phase transformation from stable base",
    },
}

IL_ANTIPATTERNS: Mapping[str, Mapping[str, object]] = {
    "COHERENCE_SILENCE": {
        "severity": "info",
        "warning": "coherence → silence is valid but often redundant",
        "alternative": None,
        "alternative_glyphs": None,
    },
    "COHERENCE_COHERENCE": {
        "severity": "warning",
        "warning": "repeated coherence has limited structural effect",
        "alternative": None,
        "alternative_glyphs": None,
    },
    "SILENCE_COHERENCE": {
        "severity": "error",
        "warning": (
            "silence → coherence is non-canonical; "
            "use silence → emission → coherence"
        ),
        "alternative": ["silence", "emission", "coherence"],
        "alternative_glyphs": [Glyph.SHA, Glyph.AL, Glyph.IL],
    },
}

# Hot-path normalization map for grammar telemetry/runtime tracking.
# Hoisted to module scope to avoid per-call dict allocation in
# recognize_il_sequences().
_OPERATOR_NAME_TO_GLYPH: dict[str, Glyph] = {
    "emission": Glyph.AL,
    "reception": Glyph.EN,
    "coherence": Glyph.IL,
    "dissonance": Glyph.OZ,
    "coupling": Glyph.UM,
    "resonance": Glyph.RA,
    "silence": Glyph.SHA,
    "expansion": Glyph.VAL,
    "contraction": Glyph.NUL,
    "self_organization": Glyph.THOL,
    "mutation": Glyph.ZHIR,
    "transition": Glyph.NAV,
    "recursivity": Glyph.REMESH,
}


def recognize_il_sequences(
    glyphs: Sequence[Glyph],
) -> list[Mapping[str, object]]:
    """Recognize canonical two-step IL-related sequences.

    Returns matches with names/positions; antipatterns flagged.

    Note
    ----
    Pure detection function: classifies sequences without emitting
    warnings. User-facing warning emission belongs to the runtime
    layer (``grammar_application.on_glyph_applied``) to avoid
    duplicate notifications. This separation preserves the
    detection/emission boundary and matches the TNFR principle that
    grammar telemetry must not couple to side-effects.
    """
    # Handle string names by converting to Glyphs
    processed_glyphs = []
    for g in glyphs:
        if isinstance(g, str):
            processed_glyphs.append(_OPERATOR_NAME_TO_GLYPH.get(g.lower(), g))
        else:
            processed_glyphs.append(g)

    # Build quick lookup of patterns by glyph tuple
    pattern_by_glyphs = {
        tuple(v["glyphs"]): v["name"] for v in CANONICAL_IL_SEQUENCES.values()
    }

    results: list[Mapping[str, object]] = []
    for i in range(len(processed_glyphs) - 1):
        pair = (processed_glyphs[i], processed_glyphs[i + 1])
        name = pattern_by_glyphs.get(pair)
        if name:
            results.append(
                {
                    "pattern_name": name,
                    "position": i,
                    "is_antipattern": False,
                }
            )
        # Detect antipatterns
        elif pair == (Glyph.IL, Glyph.SHA):
            anti_info = IL_ANTIPATTERNS["COHERENCE_SILENCE"]
            results.append(
                {
                    "pattern_name": "coherence_silence_info",
                    "position": i,
                    "is_antipattern": True,
                    "severity": anti_info["severity"],
                    "warning": anti_info["warning"],
                    "alternative": anti_info.get("alternative"),
                    "alternative_glyphs": anti_info.get("alternative_glyphs"),
                }
            )
        elif pair == (Glyph.IL, Glyph.IL):
            anti_info = IL_ANTIPATTERNS["COHERENCE_COHERENCE"]
            results.append(
                {
                    "pattern_name": "coherence_coherence_antipattern",
                    "position": i,
                    "is_antipattern": True,
                    "severity": anti_info["severity"],
                    "warning": anti_info["warning"],
                    "alternative": anti_info.get("alternative"),
                    "alternative_glyphs": anti_info.get("alternative_glyphs"),
                }
            )
        elif pair == (Glyph.SHA, Glyph.IL):
            anti_info = IL_ANTIPATTERNS["SILENCE_COHERENCE"]
            results.append(
                {
                    "pattern_name": "silence_coherence_antipattern",
                    "position": i,
                    "is_antipattern": True,
                    "severity": anti_info["severity"],
                    "warning": anti_info["warning"],
                    "alternative": anti_info.get("alternative"),
                    "alternative_glyphs": anti_info.get("alternative_glyphs"),
                }
            )
    return results


def optimize_il_sequence(
    pattern: Sequence[Glyph], allow_fusion: bool = True
) -> Sequence[Glyph]:
    """Return optimization hint for a 2-step pattern."""
    if not allow_fusion:
        return pattern

    lookup = {
        tuple(v["glyphs"]): v["optimization"] for v in CANONICAL_IL_SEQUENCES.values()
    }
    opt = lookup.get(tuple(pattern), "preserve")
    if opt == "preserve":
        return pattern
    return pattern  # For now just return original


def suggest_il_sequence(
    current: Mapping[str, float], goal: Mapping[str, object] = None
) -> list[str]:
    """Suggest canonical 2-step IL sequence for a starting state."""
    if goal is None:
        goal = {}

    epi = current.get("epi", 0.0)
    dnfr = current.get("dnfr", 0.0)

    # Inactive node needs activation (low EPI but functioning vf)
    if epi < _INACTIVE_EPI_THRESHOLD:
        if goal.get("reactivate", False) or goal.get("consolidate", False):
            return ["emission", "coherence"]

    # High ΔNFR needs reduction
    if dnfr > _HIGH_DNFR_THRESHOLD:
        if goal.get("dnfr_target") == "low":
            return ["dissonance", "coherence"]

    # Moderate ΔNFR, direct coherence
    if _MODERATE_DNFR_LOW < dnfr < _MODERATE_DNFR_HIGH:
        if goal.get("dnfr_target") == "low":
            return ["coherence"]

    # Phase transformation goal
    if goal.get("phase_change", False):
        return ["coherence", "mutation"]

    # Consolidation goal
    if goal.get("consolidate", False):
        return ["coherence"]

    # Default fallback - but need to match test case logic
    if epi < _INACTIVE_EPI_THRESHOLD and goal.get("consolidate", False):
        # For very low EPI with consolidate goal, suggest activation first
        return ["emission", "coherence"]

    return ["emission", "coherence"]


# Duplicate functions removed - main implementations above

# Extend __all__ with compatibility symbols
__all__ += [
    "CANONICAL_IL_SEQUENCES",
    "IL_ANTIPATTERNS",
    "recognize_il_sequences",
    "optimize_il_sequence",
    "suggest_il_sequence",
]

# Grammar Validator Class
# ============================================================================