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: benchmarks/external_phase_gate_validation.py

external_phase_gate_validation.py

External phase-gate validation battery.

Question

Does TNFR local phase telemetry add predictive information for edge-local coupling compatibility that topology-only and global phase-order baselines miss?

The task is intentionally narrow and falsifiable. Every sample uses the same graph topology, but different node phase assignments. The external target is the fraction of graph edges whose wrapped phase difference falls inside a fixed coupling window. This creates paired states with identical topology and nearly identical/global-identical phase histograms:

  • smooth travelling waves: locally compatible on a cycle graph;
  • scrambled waves: same phases, randomly assigned to nodes, locally broken.

Global order metrics and topology-only metrics cannot distinguish those paired states. TNFR's graph-local phase gradient should distinguish them because it measures phase differences along actual coupling edges.

This benchmark is not a proof of broad physical validity. It is a small, reproducible example showing where TNFR-style telemetry is operationally useful.

Source Code

python
#!/usr/bin/env python3
"""External phase-gate validation battery.

Question
--------
Does TNFR local phase telemetry add predictive information for edge-local
coupling compatibility that topology-only and global phase-order baselines
miss?

The task is intentionally narrow and falsifiable.  Every sample uses the same
graph topology, but different node phase assignments.  The external target is
the fraction of graph edges whose wrapped phase difference falls inside a fixed
coupling window.  This creates paired states with identical topology and nearly
identical/global-identical phase histograms:

* smooth travelling waves: locally compatible on a cycle graph;
* scrambled waves: same phases, randomly assigned to nodes, locally broken.

Global order metrics and topology-only metrics cannot distinguish those paired
states.  TNFR's graph-local phase gradient should distinguish them because it
measures phase differences along actual coupling edges.

This benchmark is not a proof of broad physical validity.  It is a small,
reproducible example showing where TNFR-style telemetry is operationally useful.
"""
from __future__ import annotations

import argparse
import html
import json
import math
import sys
from dataclasses import dataclass
from pathlib import Path
from typing import Any, Iterable, Sequence

REPO_ROOT = Path(__file__).resolve().parents[1]
SRC_DIR = REPO_ROOT / "src"
sys.path.insert(0, str(SRC_DIR))

loaded_tnfr = sys.modules.get("tnfr")
loaded_path = str(getattr(loaded_tnfr, "__file__", "")) if loaded_tnfr else ""
if loaded_tnfr is not None and not loaded_path.startswith(str(SRC_DIR)):
    for name in list(sys.modules):
        if name == "tnfr" or name.startswith("tnfr."):
            del sys.modules[name]

import networkx as nx  # noqa: E402

from tnfr.mathematics.unified_numerical import np  # noqa: E402
from tnfr.validation.phase_gate import (  # noqa: E402
    compare_against_global_baselines,
    edge_phase_differences,
    wrap_angle,
)

TAU = 2.0 * math.pi
DEFAULT_PATTERNS: tuple[str, ...] = (
    "coherent",
    "smooth_wave_q1",
    "smooth_wave_q2",
    "smooth_wave_q4",
    "two_domain",
    "scrambled_wave_q1",
    "scrambled_wave_q2",
    "scrambled_wave_q4",
    "random_uniform",
    "alternating_antiphase",
)


@dataclass(frozen=True)
class ScalarRule:
    """A one-feature threshold classifier fitted on training records."""

    model: str
    feature: str
    threshold: float
    positive_when: str
    train_balanced_accuracy: float


def build_cycle_graph(nodes: int) -> nx.Graph:
    """Build the fixed topology used by the validation battery."""
    if nodes < 8:
        raise ValueError("nodes must be >= 8 for the phase-gate battery")
    return nx.cycle_graph(nodes)


def travelling_wave_phases(
    nodes: int,
    q: int,
    rng: np.random.Generator,
    *,
    noise: float = 0.01,
) -> np.ndarray:
    """Create a smooth q-winding phase wave on the node order."""
    offset = float(rng.uniform(0.0, TAU))
    base = offset + TAU * q * np.arange(nodes, dtype=float) / float(nodes)
    phases = base + rng.normal(0.0, noise, size=nodes)
    return np.mod(phases, TAU)


def phases_for_pattern(
    pattern: str,
    nodes: int,
    rng: np.random.Generator,
) -> np.ndarray:
    """Generate phases for a named validation pattern."""
    if pattern == "coherent":
        center = float(rng.uniform(0.0, TAU))
        return np.mod(center + rng.normal(0.0, 0.04, size=nodes), TAU)

    if pattern.startswith("smooth_wave_q"):
        q = int(pattern.rsplit("q", 1)[1])
        return travelling_wave_phases(nodes, q, rng)

    if pattern.startswith("scrambled_wave_q"):
        q = int(pattern.rsplit("q", 1)[1])
        phases = travelling_wave_phases(nodes, q, rng)
        return rng.permutation(phases)

    if pattern == "two_domain":
        offset = float(rng.uniform(0.0, TAU))
        phases = np.empty(nodes, dtype=float)
        phases[: nodes // 2] = offset
        phases[nodes // 2 :] = offset + math.pi
        phases += rng.normal(0.0, 0.02, size=nodes)
        return np.mod(phases, TAU)

    if pattern == "random_uniform":
        return rng.uniform(0.0, TAU, size=nodes)

    if pattern == "alternating_antiphase":
        offset = float(rng.uniform(0.0, TAU))
        phases = np.asarray(
            [offset + (math.pi if i % 2 else 0.0) for i in range(nodes)],
            dtype=float,
        )
        phases += rng.normal(0.0, 0.02, size=nodes)
        return np.mod(phases, TAU)

    raise ValueError(f"unknown validation pattern: {pattern}")


def assign_phase_state(G: nx.Graph, phases: Sequence[float]) -> None:
    """Attach phase and local structural-pressure attributes to graph nodes."""
    nodes = sorted(G.nodes())
    if len(nodes) != len(phases):
        raise ValueError("phase count must match graph node count")

    for node, phase in zip(nodes, phases):
        value = float(phase)
        G.nodes[node]["phase"] = value
        G.nodes[node]["theta"] = value

    for node in nodes:
        diffs = [
            abs(wrap_angle(G.nodes[neighbor]["phase"] - G.nodes[node]["phase"]))
            for neighbor in G.neighbors(node)
        ]
        local_pressure = float(np.mean(diffs) / math.pi) if diffs else 0.0
        G.nodes[node]["delta_nfr"] = local_pressure
        G.nodes[node]["dnfr"] = local_pressure
        G.nodes[node]["coherence"] = 1.0 / (1.0 + local_pressure)


def feature_row(
    *,
    seed: int,
    pattern: str,
    nodes: int,
    gate: float,
    min_compliance: float,
) -> dict[str, Any]:
    """Generate one benchmark record."""
    rng = np.random.default_rng(seed)
    phases = phases_for_pattern(pattern, nodes, rng)
    return feature_row_from_phases(
        seed=seed,
        pattern=pattern,
        nodes=nodes,
        phases=phases,
        gate=gate,
        min_compliance=min_compliance,
    )


def feature_row_from_phases(
    *,
    seed: int,
    pattern: str,
    nodes: int,
    phases: Sequence[float],
    gate: float,
    min_compliance: float,
) -> dict[str, Any]:
    """Generate one benchmark record from a fixed phase assignment."""
    G = build_cycle_graph(nodes)
    assign_phase_state(G, phases)

    diffs = edge_phase_differences(G)
    features = compare_against_global_baselines(
        G,
        gate,
        min_compliance=min_compliance,
    )

    return {
        "seed": seed,
        "pattern": pattern,
        "nodes": nodes,
        "edges": G.number_of_edges(),
        "label": bool(features["label"]),
        "edge_gate_compliance": float(features["edge_gate_compliance"]),
        "edge_diff_mean": float(np.mean(diffs)),
        "edge_diff_max": float(np.max(diffs)),
        "tnfr_mean_phase_gradient": float(features["tnfr_mean_phase_gradient"]),
        "tnfr_max_phase_gradient": float(features["tnfr_max_phase_gradient"]),
        "tnfr_mean_abs_curvature": float(features["tnfr_mean_abs_curvature"]),
        "tnfr_phi_s_abs_mean": float(features["tnfr_phi_s_abs_mean"]),
        "global_order_r": float(features["global_order_r"]),
        "circular_variance": float(features["circular_variance"]),
        "phase_histogram_entropy": float(features["phase_histogram_entropy"]),
        "topology_avg_degree": float(features["topology_avg_degree"]),
        "topology_clustering": float(features["topology_clustering"]),
        "topology_diameter": float(features["topology_diameter"]),
    }


def generate_records(
    *,
    nodes: int,
    runs: int,
    gate: float,
    min_compliance: float,
    patterns: Sequence[str] = DEFAULT_PATTERNS,
) -> list[dict[str, Any]]:
    """Generate the full validation dataset."""
    records: list[dict[str, Any]] = []
    pattern_indices = {pattern: index for index, pattern in enumerate(patterns)}
    for run in range(runs):
        base_seed = 10_000 + run * 101
        paired_scrambled: set[str] = set()
        for pattern_offset, pattern in enumerate(patterns):
            seed = base_seed + pattern_offset
            if pattern in paired_scrambled:
                continue
            if pattern.startswith("smooth_wave_q"):
                q = int(pattern.rsplit("q", 1)[1])
                rng = np.random.default_rng(seed)
                phases = travelling_wave_phases(nodes, q, rng)
                records.append(
                    feature_row_from_phases(
                        seed=seed,
                        pattern=pattern,
                        nodes=nodes,
                        phases=phases,
                        gate=gate,
                        min_compliance=min_compliance,
                    )
                )
                scrambled = f"scrambled_wave_q{q}"
                if scrambled in pattern_indices:
                    scrambled_seed = base_seed + pattern_indices[scrambled]
                    scrambled_rng = np.random.default_rng(scrambled_seed)
                    records.append(
                        feature_row_from_phases(
                            seed=scrambled_seed,
                            pattern=scrambled,
                            nodes=nodes,
                            phases=scrambled_rng.permutation(phases),
                            gate=gate,
                            min_compliance=min_compliance,
                        )
                    )
                    paired_scrambled.add(scrambled)
                continue
            records.append(
                feature_row(
                    seed=seed,
                    pattern=pattern,
                    nodes=nodes,
                    gate=gate,
                    min_compliance=min_compliance,
                )
            )
    return records


def split_records(
    records: Sequence[dict[str, Any]],
) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
    """Deterministically split records by run seed parity."""
    train: list[dict[str, Any]] = []
    test: list[dict[str, Any]] = []
    for record in records:
        run_index = (int(record["seed"]) - 10_000) // 101
        if run_index % 2 == 0:
            train.append(record)
        else:
            test.append(record)
    return train, test


def confusion_counts(
    labels: Sequence[bool],
    predictions: Sequence[bool],
) -> dict[str, int]:
    """Compute binary confusion counts."""
    tp = sum(bool(y) and bool(p) for y, p in zip(labels, predictions))
    tn = sum((not bool(y)) and (not bool(p)) for y, p in zip(labels, predictions))
    fp = sum((not bool(y)) and bool(p) for y, p in zip(labels, predictions))
    fn = sum(bool(y) and (not bool(p)) for y, p in zip(labels, predictions))
    return {"tp": tp, "tn": tn, "fp": fp, "fn": fn}


def classification_metrics(
    labels: Sequence[bool],
    predictions: Sequence[bool],
) -> dict[str, float]:
    """Compute robust binary-classification metrics without external ML deps."""
    counts = confusion_counts(labels, predictions)
    tp = counts["tp"]
    tn = counts["tn"]
    fp = counts["fp"]
    fn = counts["fn"]
    total = tp + tn + fp + fn
    accuracy = (tp + tn) / total if total else 0.0
    recall = tp / (tp + fn) if (tp + fn) else 0.0
    specificity = tn / (tn + fp) if (tn + fp) else 0.0
    precision = tp / (tp + fp) if (tp + fp) else 0.0
    f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0.0
    balanced_accuracy = 0.5 * (recall + specificity)
    denom = math.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))
    mcc = ((tp * tn - fp * fn) / denom) if denom else 0.0
    return {
        **counts,
        "accuracy": accuracy,
        "balanced_accuracy": balanced_accuracy,
        "precision": precision,
        "recall": recall,
        "specificity": specificity,
        "f1": f1,
        "mcc": mcc,
    }


def threshold_candidates(values: Sequence[float]) -> list[float]:
    """Return stable threshold candidates from observed scalar values."""
    unique = sorted(set(float(v) for v in values if math.isfinite(float(v))))
    if not unique:
        return [0.0]
    candidates = [unique[0] - 1.0]
    candidates.extend((a + b) / 2.0 for a, b in zip(unique, unique[1:]))
    candidates.append(unique[-1] + 1.0)
    candidates.extend(unique)
    return sorted(set(candidates))


def predict_with_rule(
    rule: ScalarRule, records: Sequence[dict[str, Any]]
) -> list[bool]:
    """Apply a fitted scalar threshold rule."""
    predictions: list[bool] = []
    for record in records:
        value = float(record[rule.feature])
        if rule.positive_when == "<=":
            predictions.append(value <= rule.threshold)
        else:
            predictions.append(value >= rule.threshold)
    return predictions


def fit_scalar_rule(
    records: Sequence[dict[str, Any]],
    *,
    model: str,
    feature: str,
) -> ScalarRule:
    """Fit a one-dimensional threshold rule by balanced accuracy."""
    labels = [bool(record["label"]) for record in records]
    values = [float(record[feature]) for record in records]
    best: ScalarRule | None = None
    for threshold in threshold_candidates(values):
        for positive_when in ("<=", ">="):
            if positive_when == "<=":
                predictions = [value <= threshold for value in values]
            else:
                predictions = [value >= threshold for value in values]
            score = classification_metrics(labels, predictions)["balanced_accuracy"]
            candidate = ScalarRule(model, feature, threshold, positive_when, score)
            if best is None or score > best.train_balanced_accuracy:
                best = candidate
    if best is None:
        raise RuntimeError(f"could not fit scalar rule for {feature}")
    return best


def majority_baseline(records: Sequence[dict[str, Any]]) -> bool:
    """Return the majority class from training records."""
    positives = sum(bool(record["label"]) for record in records)
    return positives >= (len(records) - positives)


def evaluate_rule(
    rule: ScalarRule,
    train: Sequence[dict[str, Any]],
    test: Sequence[dict[str, Any]],
) -> dict[str, Any]:
    """Evaluate one scalar rule on train and test splits."""
    train_labels = [bool(record["label"]) for record in train]
    test_labels = [bool(record["label"]) for record in test]
    train_predictions = predict_with_rule(rule, train)
    test_predictions = predict_with_rule(rule, test)
    return {
        "model": rule.model,
        "feature": rule.feature,
        "threshold": rule.threshold,
        "positive_when": rule.positive_when,
        "train": classification_metrics(train_labels, train_predictions),
        "test": classification_metrics(test_labels, test_predictions),
    }


def evaluate_models(
    train: Sequence[dict[str, Any]],
    test: Sequence[dict[str, Any]],
) -> list[dict[str, Any]]:
    """Fit and evaluate all benchmark baselines."""
    feature_models = [
        ("TNFR mean grad_phi", "tnfr_mean_phase_gradient"),
        ("TNFR max grad_phi", "tnfr_max_phase_gradient"),
        ("TNFR mean abs K_phi", "tnfr_mean_abs_curvature"),
        ("TNFR abs Phi_s stress", "tnfr_phi_s_abs_mean"),
        ("Global order parameter R", "global_order_r"),
        ("Circular variance", "circular_variance"),
        ("Phase histogram entropy", "phase_histogram_entropy"),
        ("Topology average degree", "topology_avg_degree"),
        ("Topology clustering", "topology_clustering"),
        ("Topology diameter", "topology_diameter"),
    ]
    results = [
        evaluate_rule(fit_scalar_rule(train, model=model, feature=feature), train, test)
        for model, feature in feature_models
    ]

    majority = majority_baseline(train)
    train_labels = [bool(record["label"]) for record in train]
    test_labels = [bool(record["label"]) for record in test]
    results.append(
        {
            "model": "Majority class",
            "feature": "label frequency",
            "threshold": None,
            "positive_when": "constant",
            "train": classification_metrics(train_labels, [majority] * len(train)),
            "test": classification_metrics(test_labels, [majority] * len(test)),
        }
    )
    return sorted(
        results,
        key=lambda row: (row["test"]["balanced_accuracy"], row["test"]["mcc"]),
        reverse=True,
    )


def paired_wave_checks(records: Sequence[dict[str, Any]]) -> dict[str, Any]:
    """Compare smooth and scrambled wave pairs with matched phase histograms."""
    by_key = {(record["seed"], record["pattern"]): record for record in records}
    deltas: dict[str, list[float]] = {
        "global_order_r": [],
        "phase_histogram_entropy": [],
        "tnfr_mean_phase_gradient": [],
        "tnfr_mean_abs_curvature": [],
    }
    label_flips = 0
    pair_count = 0

    # Seeds differ by pattern index in DEFAULT_PATTERNS, so reconstruct by run.
    pattern_index = {pattern: index for index, pattern in enumerate(DEFAULT_PATTERNS)}
    for record in records:
        pattern = str(record["pattern"])
        if not pattern.startswith("smooth_wave_q"):
            continue
        q = pattern.rsplit("q", 1)[1]
        scrambled = f"scrambled_wave_q{q}"
        run_index = (int(record["seed"]) - 10_000) // 101
        smooth_seed = 10_000 + run_index * 101 + pattern_index[pattern]
        scrambled_seed = 10_000 + run_index * 101 + pattern_index[scrambled]
        smooth_record = by_key.get((smooth_seed, pattern))
        scrambled_record = by_key.get((scrambled_seed, scrambled))
        if smooth_record is None or scrambled_record is None:
            continue
        pair_count += 1
        if bool(smooth_record["label"]) != bool(scrambled_record["label"]):
            label_flips += 1
        for feature in deltas:
            deltas[feature].append(
                abs(float(smooth_record[feature]) - float(scrambled_record[feature]))
            )

    return {
        "pair_count": pair_count,
        "label_flips": label_flips,
        "median_abs_delta_global_order_r": median(deltas["global_order_r"]),
        "median_abs_delta_phase_histogram_entropy": median(
            deltas["phase_histogram_entropy"]
        ),
        "median_abs_delta_tnfr_mean_phase_gradient": median(
            deltas["tnfr_mean_phase_gradient"]
        ),
        "median_abs_delta_tnfr_mean_abs_curvature": median(
            deltas["tnfr_mean_abs_curvature"]
        ),
    }


def median(values: Sequence[float]) -> float:
    """Return a float median with a safe empty fallback."""
    if not values:
        return 0.0
    return float(np.median(np.asarray(values, dtype=float)))


def pattern_summary(records: Sequence[dict[str, Any]]) -> list[dict[str, Any]]:
    """Aggregate label and feature statistics by pattern."""
    rows: list[dict[str, Any]] = []
    for pattern in DEFAULT_PATTERNS:
        subset = [record for record in records if record["pattern"] == pattern]
        if not subset:
            continue
        rows.append(
            {
                "pattern": pattern,
                "n": len(subset),
                "positive_rate": float(np.mean([record["label"] for record in subset])),
                "edge_gate_compliance_mean": float(
                    np.mean([record["edge_gate_compliance"] for record in subset])
                ),
                "tnfr_mean_phase_gradient_mean": float(
                    np.mean([record["tnfr_mean_phase_gradient"] for record in subset])
                ),
                "global_order_r_mean": float(
                    np.mean([record["global_order_r"] for record in subset])
                ),
            }
        )
    return rows


def run_validation(
    *,
    nodes: int = 64,
    runs: int = 40,
    gate: float = math.pi / 4.0,
    min_compliance: float = 0.90,
    output_json: Path | None = None,
    output_markdown: Path | None = None,
    output_html: Path | None = None,
) -> dict[str, Any]:
    """Run the full validation battery and optionally write reports."""
    records = generate_records(
        nodes=nodes,
        runs=runs,
        gate=gate,
        min_compliance=min_compliance,
    )
    train, test = split_records(records)
    model_results = evaluate_models(train, test)
    summary = {
        "metadata": {
            "nodes": nodes,
            "runs": runs,
            "gate_radians": gate,
            "min_edge_compliance": min_compliance,
            "patterns": list(DEFAULT_PATTERNS),
            "train_records": len(train),
            "test_records": len(test),
            "target": "edge-local phase-gate compatibility",
            "scope_note": (
                "Narrow synthetic validation; evidence of operational value, "
                "not a broad physical proof."
            ),
        },
        "model_results": model_results,
        "paired_wave_checks": paired_wave_checks(records),
        "pattern_summary": pattern_summary(records),
        "records": records,
    }
    if output_json is not None:
        output_json.parent.mkdir(parents=True, exist_ok=True)
        output_json.write_text(json.dumps(summary, indent=2) + "\n", encoding="utf-8")
    if output_markdown is not None:
        output_markdown.parent.mkdir(parents=True, exist_ok=True)
        output_markdown.write_text(render_markdown(summary), encoding="utf-8")
    if output_html is not None:
        output_html.parent.mkdir(parents=True, exist_ok=True)
        output_html.write_text(render_html(summary), encoding="utf-8")
    return summary


def format_float(value: Any, digits: int = 4) -> str:
    """Format report floats compactly."""
    if value is None:
        return "-"
    if isinstance(value, float):
        return f"{value:.{digits}f}"
    return str(value)


def markdown_table(headers: Sequence[str], rows: Iterable[Sequence[Any]]) -> str:
    """Render a Markdown table."""
    header_line = "| " + " | ".join(headers) + " |"
    sep_line = "| " + " | ".join("---" for _ in headers) + " |"
    body = ["| " + " | ".join(str(cell) for cell in row) + " |" for row in rows]
    return "\n".join([header_line, sep_line, *body])


def render_markdown(summary: dict[str, Any]) -> str:
    """Render the validation report as Markdown."""
    meta = summary["metadata"]
    model_rows = [
        [
            row["model"],
            row["feature"],
            row["positive_when"],
            format_float(row["threshold"]),
            format_float(row["test"]["balanced_accuracy"]),
            format_float(row["test"]["accuracy"]),
            format_float(row["test"]["mcc"]),
        ]
        for row in summary["model_results"]
    ]
    pattern_rows = [
        [
            row["pattern"],
            row["n"],
            format_float(row["positive_rate"]),
            format_float(row["edge_gate_compliance_mean"]),
            format_float(row["tnfr_mean_phase_gradient_mean"]),
            format_float(row["global_order_r_mean"]),
        ]
        for row in summary["pattern_summary"]
    ]
    paired = summary["paired_wave_checks"]
    return (
        "\n\n".join(
            [
                "# TNFR External Phase-Gate Validation",
                (
                    "This report tests whether graph-local TNFR phase telemetry "
                    "adds predictive information for edge-local coupling "
                    "compatibility beyond topology-only and global phase-order "
                    "baselines."
                ),
                "## Scope",
                (
                    f"Nodes: {meta['nodes']}  \n"
                    f"Runs: {meta['runs']}  \n"
                    f"Gate: {meta['gate_radians']:.6f} rad  \n"
                    f"Minimum edge compliance for a positive label: "
                    f"{meta['min_edge_compliance']:.2f}  \n"
                    f"Train records: {meta['train_records']}  \n"
                    f"Test records: {meta['test_records']}"
                ),
                "## Model comparison",
                markdown_table(
                    [
                        "Model",
                        "Feature",
                        "Positive when",
                        "Threshold",
                        "Test balanced acc.",
                        "Test acc.",
                        "Test MCC",
                    ],
                    model_rows,
                ),
                "## Matched smooth/scrambled wave check",
                (
                    f"Pairs: {paired['pair_count']}  \n"
                    f"Label flips: {paired['label_flips']}  \n"
                    f"Median |Δ global R|: "
                    f"{paired['median_abs_delta_global_order_r']:.6e}  \n"
                    f"Median |Δ phase histogram entropy|: "
                    f"{paired['median_abs_delta_phase_histogram_entropy']:.6e}  \n"
                    f"Median |Δ TNFR mean |∇φ||: "
                    f"{paired['median_abs_delta_tnfr_mean_phase_gradient']:.6f}  \n"
                    f"Median |Δ TNFR mean |Kφ||: "
                    f"{paired['median_abs_delta_tnfr_mean_abs_curvature']:.6f}"
                ),
                "## Pattern summary",
                markdown_table(
                    [
                        "Pattern",
                        "N",
                        "Positive rate",
                        "Mean compliance",
                        "Mean TNFR grad_phi",
                        "Mean global R",
                    ],
                    pattern_rows,
                ),
                "## Honest interpretation",
                (
                    "A strong TNFR result here means that graph-local phase "
                    "telemetry distinguishes locally compatible phase states that "
                    "global phase-order and topology-only baselines cannot separate. "
                    "It does not establish broad TNFR validity; it demonstrates a "
                    "specific operational advantage on a controlled coupling task."
                ),
            ]
        )
        + "\n"
    )


def render_html(summary: dict[str, Any]) -> str:
    """Render the validation report as simple standalone HTML."""
    markdown = render_markdown(summary)
    lines = markdown.splitlines()
    body: list[str] = []
    in_table = False
    table_rows: list[str] = []

    def flush_table() -> None:
        nonlocal in_table, table_rows
        if not in_table:
            return
        body.append("<table>")
        for index, raw in enumerate(table_rows):
            if index == 1:
                continue
            cells = [cell.strip() for cell in raw.strip("|").split("|")]
            tag = "th" if index == 0 else "td"
            body.append(
                "<tr>"
                + "".join(f"<{tag}>{html.escape(cell)}</{tag}>" for cell in cells)
                + "</tr>"
            )
        body.append("</table>")
        in_table = False
        table_rows = []

    for line in lines:
        if line.startswith("| "):
            in_table = True
            table_rows.append(line)
            continue
        flush_table()
        if line.startswith("# "):
            body.append(f"<h1>{html.escape(line[2:])}</h1>")
        elif line.startswith("## "):
            body.append(f"<h2>{html.escape(line[3:])}</h2>")
        elif line.strip():
            body.append(f"<p>{html.escape(line)}</p>")
    flush_table()
    return """<!DOCTYPE html>
<html lang=\"en\">
<head>
<meta charset=\"utf-8\">
<title>TNFR External Phase-Gate Validation</title>
<style>
body {{ font-family: Arial, sans-serif; margin: 2rem; line-height: 1.45; }}
table {{ border-collapse: collapse; width: 100%; margin: 1rem 0; }}
th, td {{ border: 1px solid #ccc; padding: 0.35rem 0.5rem; text-align: left; }}
th {{ background: #f3f5f7; }}
</style>
</head>
<body>
{body}
</body>
</html>
""".format(
        body="\n".join(body)
    )


def print_console_summary(summary: dict[str, Any]) -> None:
    """Print a compact terminal summary."""
    print("External phase-gate validation")
    print("=" * 36)
    for row in summary["model_results"][:6]:
        test = row["test"]
        print(
            f"{row['model']:<28} "
            f"balanced_acc={test['balanced_accuracy']:.3f} "
            f"acc={test['accuracy']:.3f} mcc={test['mcc']:.3f}"
        )
    paired = summary["paired_wave_checks"]
    print()
    print(
        "Matched wave check: "
        f"pairs={paired['pair_count']}, label_flips={paired['label_flips']}, "
        f"median ΔR={paired['median_abs_delta_global_order_r']:.3e}, "
        f"median ΔTNFR-grad={paired['median_abs_delta_tnfr_mean_phase_gradient']:.3f}"
    )


def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace:
    """Parse CLI arguments."""
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--nodes", type=int, default=64)
    parser.add_argument("--runs", type=int, default=40)
    parser.add_argument("--gate", type=float, default=math.pi / 4.0)
    parser.add_argument("--min-compliance", type=float, default=0.90)
    parser.add_argument(
        "--output-json",
        type=Path,
        default=REPO_ROOT
        / "results"
        / "external_validation"
        / "phase_gate_validation.json",
    )
    parser.add_argument(
        "--output-markdown",
        type=Path,
        default=REPO_ROOT / "results" / "reports" / "external_phase_gate_validation.md",
    )
    parser.add_argument(
        "--output-html",
        type=Path,
        default=REPO_ROOT
        / "results"
        / "reports"
        / "external_phase_gate_validation.html",
    )
    parser.add_argument("--quiet", action="store_true")
    return parser.parse_args(argv)


def main(argv: Sequence[str] | None = None) -> int:
    """CLI entry point."""
    args = parse_args(argv)
    summary = run_validation(
        nodes=args.nodes,
        runs=args.runs,
        gate=args.gate,
        min_compliance=args.min_compliance,
        output_json=args.output_json,
        output_markdown=args.output_markdown,
        output_html=args.output_html,
    )
    if not args.quiet:
        print_console_summary(summary)
        print(f"\nJSON: {args.output_json}")
        print(f"Markdown: {args.output_markdown}")
        print(f"HTML: {args.output_html}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())