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/visualization/sequence_plotter.py

sequence_plotter.py

Advanced sequence visualizer for TNFR operator sequences.

This module implements comprehensive visualization tools for structural operator sequences, including flow diagrams, health dashboards, pattern analysis, and frequency timelines.

Source Code

python
"""Advanced sequence visualizer for TNFR operator sequences.

This module implements comprehensive visualization tools for structural operator sequences,
including flow diagrams, health dashboards, pattern analysis, and frequency timelines.
"""

from __future__ import annotations

import math as _math
from typing import TYPE_CHECKING

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
from matplotlib.axes import Axes
from matplotlib.figure import Figure

from ..constants.canonical import CRITICAL_EXPONENT as _CRIT_EXP
from ..constants.canonical import FRAGMENTATION_THRESHOLD as _COH_LO
from ..constants.canonical import HIGH_COHERENCE_THRESHOLD as _COH_HI
from ..constants.operational import EMERGENT_STABILITY_THRESHOLD_CANONICAL as _STAB_THRESH
from ..constants.canonical import FEEDBACK_LEARNING_RATE as _FEEDBACK_LR
from ..constants.operational import NODAL_OPT_COUPLING_CANONICAL as _NODAL_COUPLING
from ..constants.canonical import UM_COMPAT_THRESHOLD as _UM_COMPAT
from ..mathematics.unified_numerical import np

# Cosmetic dashboard layout values (matplotlib rendering only — NOT TNFR
# physics; no structural meaning). Plain display literals.
_LAYOUT_LEVEL = 0.6  # mid layout level (alpha / y-centre / reference line)
_LAYOUT_BASE = 0.18  # vertical-position base
_BORDER_WIDTH = 1.5  # annotation border width
_LINE_WIDTH = 2.5  # default line width
_BAR_WIDTH = 0.35  # default bar / annotation-padding width

if TYPE_CHECKING:
    from ..operators.health_analyzer import SequenceHealthMetrics

from ..config.operator_names import (
    COHERENCE,
    COUPLING,
    DISSONANCE,
    EMISSION,
    MUTATION,
    RECURSIVITY,
    RESONANCE,
    SELF_ORGANIZATION,
    SILENCE,
    TRANSITION,
    canonical_operator_name,
    operator_display_name,
)
from ..validation.compatibility import CompatibilityLevel, get_compatibility_level

__all__ = ["SequenceVisualizer"]

# Color mapping for compatibility levels
COMPATIBILITY_COLORS = {
    CompatibilityLevel.EXCELLENT: "#2ecc71",  # Green
    CompatibilityLevel.GOOD: "#3498db",  # Blue
    CompatibilityLevel.CAUTION: "#f39c12",  # Orange
    CompatibilityLevel.AVOID: "#e74c3c",  # Red
}

# Color mapping for frequency levels
FREQUENCY_COLORS = {
    "high": "#e74c3c",  # Red - high energy
    "medium": "#3498db",  # Blue - moderate
    "zero": "#95a5a6",  # Gray - paused
}

# Operator category colors for pattern analysis
OPERATOR_CATEGORY_COLORS = {
    "initiator": "#9b59b6",  # Purple
    "stabilizer": "#2ecc71",  # Green
    "transformer": "#e67e22",  # Orange
    "amplifier": "#e74c3c",  # Red
    "organizer": "#1abc9c",  # Teal
}


def _get_operator_category(operator: str) -> str:
    """Determine the structural category of an operator."""
    if operator == EMISSION:
        return "initiator"
    elif operator in {COHERENCE, SILENCE}:
        return "stabilizer"
    elif operator in {DISSONANCE, MUTATION, TRANSITION}:
        return "transformer"
    elif operator in {RESONANCE, COUPLING}:
        return "amplifier"
    elif operator in {SELF_ORGANIZATION, RECURSIVITY}:
        return "organizer"
    else:
        return "stabilizer"  # Default for other operators


class SequenceVisualizer:
    """Advanced visualizer for TNFR operator sequences.

    Provides multiple visualization types:
    - Sequence flow diagrams with transition compatibility coloring
    - Health metrics dashboards with radar charts
    - Pattern analysis with component highlighting
    - Frequency timelines showing structural evolution

    Examples
    --------
    >>> from tnfr.visualization import SequenceVisualizer
    >>> from tnfr.operators.grammar import validate_sequence_with_health
    >>>
    >>> sequence = ["emission", "reception", "coherence", "silence"]
    >>> result = validate_sequence_with_health(sequence)
    >>>
    >>> visualizer = SequenceVisualizer()
    >>> fig, ax = visualizer.plot_sequence_flow(sequence, result.health_metrics)
    """

    def __init__(self, figsize: tuple[float, float] = (12, 8), dpi: int = 100):
        """Initialize the sequence visualizer.

        Parameters
        ----------
        figsize : tuple[float, float], optional
            Default figure size for plots, by default (12, 8)
        dpi : int, optional
            Default DPI for plots, by default 100
        """
        self.figsize = figsize
        self.dpi = dpi

    def plot_sequence_flow(
        self,
        sequence: list[str],
        health_metrics: SequenceHealthMetrics | None = None,
        save_path: str | None = None,
    ) -> tuple[Figure, Axes]:
        """Plot sequence flow diagram with compatibility-colored transitions.

        Creates a flow diagram showing operators as nodes with arrows representing
        transitions. Arrow colors indicate compatibility level (green=excellent,
        blue=good, orange=caution, red=avoid).

        Parameters
        ----------
        sequence : list[str]
            Sequence of operator names (canonical form)
        health_metrics : SequenceHealthMetrics, optional
            Health metrics to display alongside the flow
        save_path : str, optional
            Path to save the figure

        Returns
        -------
        tuple[Figure, Axes]
            The matplotlib figure and axes objects

        Examples
        --------
        >>> visualizer = SequenceVisualizer()
        >>> sequence = ["emission", "coherence", "resonance", "silence"]
        >>> fig, ax = visualizer.plot_sequence_flow(sequence)
        >>> fig.savefig("flow.png")
        """
        fig, ax = plt.subplots(figsize=self.figsize, dpi=self.dpi)

        if not sequence:
            ax.text(0.5, 0.5, "Empty sequence", ha="center", va="center", fontsize=14)
            ax.set_xlim(0, 1)
            ax.set_ylim(0, 1)
            ax.axis("off")
            return fig, ax

        # Normalize operator names
        normalized = [canonical_operator_name(op) or op for op in sequence]

        # Calculate positions for operators
        n_ops = len(normalized)
        positions = {}

        if n_ops == 1:
            positions[0] = (0.5, 0.5)
        else:
            # Arrange in a flowing pattern
            for i, op in enumerate(normalized):
                x = (
                    _LAYOUT_BASE + (i / (n_ops - 1)) * _UM_COMPAT
                )  # base + range (operational)
                # Add slight vertical variation for visual interest
                y = _LAYOUT_LEVEL + _NODAL_COUPLING * np.sin(
                    i * np.pi / 3
                )  # center + amplitude (operational)
                positions[i] = (x, y)

        # Draw transitions with compatibility coloring
        for i in range(len(normalized) - 1):
            curr_op = normalized[i]
            next_op = normalized[i + 1]

            # Get compatibility level
            compat = get_compatibility_level(curr_op, next_op)
            color = COMPATIBILITY_COLORS.get(compat, "#95a5a6")

            # Draw arrow
            start = positions[i]
            end = positions[i + 1]

            ax.annotate(
                "",
                xy=end,
                xytext=start,
                arrowprops=dict(
                    arrowstyle="->",
                    color=color,
                    lw=_LINE_WIDTH,  # default line width
                    connectionstyle=f"arc3,rad={_NODAL_COUPLING}",  # arc radius
                ),
            )

        # Draw operator nodes
        for i, op in enumerate(normalized):
            pos = positions[i]

            # Get operator category for coloring
            category = _get_operator_category(op)
            node_color = OPERATOR_CATEGORY_COLORS.get(category, "#95a5a6")

            # Note: Frequency-based styling removed (R5 constraint eliminated)
            # All operators now use standard border width
            border_width = 2

            # Draw node
            circle = plt.Circle(
                pos, 0.04, color=node_color, ec="black", lw=border_width, zorder=10
            )
            ax.add_patch(circle)

            # Add operator label
            display_name = operator_display_name(op) or op
            ax.text(
                pos[0],
                pos[1] - 0.08,
                display_name,
                ha="center",
                va="top",
                fontsize=10,
                weight="bold",
            )

        # Add title
        title = "TNFR Sequence Flow Diagram"
        if health_metrics:
            title += f"\nOverall Health: {health_metrics.overall_health:.2f}"
        ax.set_title(title, fontsize=14, weight="bold", pad=20)

        # Add legend
        legend_elements = [
            mpatches.Patch(
                color=COMPATIBILITY_COLORS[CompatibilityLevel.EXCELLENT],
                label="Excellent transition",
            ),
            mpatches.Patch(
                color=COMPATIBILITY_COLORS[CompatibilityLevel.GOOD],
                label="Good transition",
            ),
            mpatches.Patch(
                color=COMPATIBILITY_COLORS[CompatibilityLevel.CAUTION],
                label="Caution transition",
            ),
            mpatches.Patch(
                color=COMPATIBILITY_COLORS[CompatibilityLevel.AVOID],
                label="Avoid transition",
            ),
        ]
        ax.legend(handles=legend_elements, loc="upper right", fontsize=9)

        # Add health metrics sidebar if provided
        if health_metrics:
            metrics_text = (
                f"Coherence: {health_metrics.coherence_index:.2f}\n"
                f"Balance: {health_metrics.balance_score:.2f}\n"
                f"Sustainability: {health_metrics.sustainability_index:.2f}\n"
                f"Pattern: {health_metrics.dominant_pattern}"
            )
            ax.text(
                _FEEDBACK_LR,  # margin offset (operational)
                _math.cos(_math.pi / 12),  # cos(π/12) - top alignment
                metrics_text,
                transform=ax.transAxes,
                fontsize=9,
                va="top",
                ha="left",
                bbox=dict(
                    boxstyle="round", facecolor="wheat", alpha=_LAYOUT_LEVEL
                ),  # transparency
            )

        ax.set_xlim(0, 1)
        ax.set_ylim(0, 1)
        ax.set_aspect("equal")
        ax.axis("off")

        plt.tight_layout()

        if save_path:
            fig.savefig(save_path, dpi=self.dpi, bbox_inches="tight")

        return fig, ax

    def plot_health_dashboard(
        self,
        health_metrics: SequenceHealthMetrics,
        save_path: str | None = None,
    ) -> tuple[Figure, np.ndarray]:
        """Plot comprehensive health metrics dashboard with radar chart.

        Creates a multi-panel dashboard showing:
        - Radar chart with all health metrics
        - Bar chart comparing metrics to benchmarks
        - Overall health gauge

        Parameters
        ----------
        health_metrics : SequenceHealthMetrics
            Health metrics to visualize
        save_path : str, optional
            Path to save the figure

        Returns
        -------
        tuple[Figure, np.ndarray]
            The matplotlib figure and array of axes objects

        Examples
        --------
        >>> from tnfr.operators.grammar import validate_sequence_with_health
        >>> result = validate_sequence_with_health(["emission", "coherence"])
        >>> visualizer = SequenceVisualizer()
        >>> fig, axes = visualizer.plot_health_dashboard(result.health_metrics)
        """
        fig = plt.figure(figsize=(14, 10), dpi=self.dpi)
        gs = fig.add_gridspec(
            2, 2, hspace=_CRIT_EXP, wspace=_CRIT_EXP
        )  # grid spacing

        # Create subplots
        ax_radar = fig.add_subplot(gs[0, 0], projection="polar")
        ax_bars = fig.add_subplot(gs[0, 1])
        ax_gauge = fig.add_subplot(gs[1, :])

        # --- Radar Chart ---
        metrics_labels = [
            "Coherence",
            "Balance",
            "Sustainability",
            "Efficiency",
            "Frequency",
            "Completeness",
            "Smoothness",
        ]
        metrics_values = [
            health_metrics.coherence_index,
            health_metrics.balance_score,
            health_metrics.sustainability_index,
            health_metrics.complexity_efficiency,
            health_metrics.frequency_harmony,
            health_metrics.pattern_completeness,
            health_metrics.transition_smoothness,
        ]

        # Number of variables
        num_vars = len(metrics_labels)

        # Compute angle for each axis
        angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
        metrics_values_plot = metrics_values + [metrics_values[0]]
        angles += angles[:1]

        # Plot radar chart
        ax_radar.plot(angles, metrics_values_plot, "o-", linewidth=2, color="#3498db")
        ax_radar.fill(
            angles, metrics_values_plot, alpha=_CRIT_EXP, color="#3498db"
        )  # radar transparency
        ax_radar.set_xticks(angles[:-1])
        ax_radar.set_xticklabels(metrics_labels, size=9)
        ax_radar.set_ylim(0, 1)
        ax_radar.set_yticks([0.2, 0.4, 0.6, 0.8, 1.0])
        ax_radar.set_title("Health Metrics Radar", size=12, weight="bold", pad=20)
        ax_radar.grid(True)

        # --- Bar Chart ---
        # Define benchmark values for ideal sequences
        # These represent canonical TNFR targets for well-formed sequences
        BENCHMARK_COHERENCE = _UM_COMPAT  # canonical coherence target
        BENCHMARK_BALANCE = _LAYOUT_LEVEL  # reference balance level
        BENCHMARK_SUSTAINABILITY = _UM_COMPAT  # sustainability target
        BENCHMARK_EFFICIENCY = _LAYOUT_LEVEL  # reference efficiency level
        BENCHMARK_FREQUENCY = _STAB_THRESH  # frequency threshold
        BENCHMARK_COMPLETENESS = _UM_COMPAT  # completeness standard
        BENCHMARK_SMOOTHNESS = _math.sqrt(3) / 2  # √3/2 - harmonic smoothness

        benchmarks = [
            BENCHMARK_COHERENCE,
            BENCHMARK_BALANCE,
            BENCHMARK_SUSTAINABILITY,
            BENCHMARK_EFFICIENCY,
            BENCHMARK_FREQUENCY,
            BENCHMARK_COMPLETENESS,
            BENCHMARK_SMOOTHNESS,
        ]
        x_pos = np.arange(num_vars)
        width = _BAR_WIDTH  # default bar width

        bars1 = ax_bars.bar(
            x_pos - width / 2, metrics_values, width, label="Current", color="#3498db"
        )
        bars2 = ax_bars.bar(
            x_pos + width / 2,
            benchmarks,
            width,
            label="Benchmark",
            color="#95a5a6",
            alpha=_LAYOUT_LEVEL,  # benchmark transparency
        )

        ax_bars.set_ylabel("Score", fontsize=10)
        ax_bars.set_title("Metrics vs Benchmarks", fontsize=12, weight="bold")
        ax_bars.set_xticks(x_pos)
        ax_bars.set_xticklabels(
            [label[:4] for label in metrics_labels], rotation=45, ha="right", fontsize=8
        )
        ax_bars.legend(fontsize=9)
        ax_bars.set_ylim(0, 1.1)
        ax_bars.grid(axis="y", alpha=_CRIT_EXP)  # grid transparency

        # Add value labels on bars
        for bars in [bars1, bars2]:
            for bar in bars:
                height = bar.get_height()
                ax_bars.text(
                    bar.get_x() + bar.get_width() / 2.0,
                    height,
                    f"{height:.2f}",
                    ha="center",
                    va="bottom",
                    fontsize=7,
                )

        # --- Overall Health Gauge ---
        overall = health_metrics.overall_health

        # Determine color based on health
        if overall >= _COH_HI:  # high-coherence gate (excellent)
            gauge_color = "#2ecc71"  # Excellent
            status = "EXCELLENT"
        elif overall >= _STAB_THRESH:  # stability threshold (good)
            gauge_color = "#3498db"  # Good
            status = "GOOD"
        elif overall >= _COH_LO:  # fragmentation gate (fair)
            gauge_color = "#f39c12"  # Fair
            status = "FAIR"
        else:
            gauge_color = "#e74c3c"  # Poor
            status = "NEEDS IMPROVEMENT"

        # Draw gauge background
        ax_gauge.barh(
            0, 1, height=_CRIT_EXP, color="#ecf0f1", left=0
        )  # gauge height
        # Draw gauge fill
        ax_gauge.barh(
            0, overall, height=_CRIT_EXP, color=gauge_color, left=0
        )  # gauge height

        # Add markers
        for i in range(0, 11):
            val = i / 10
            ax_gauge.axvline(
                val,
                color="gray",
                linestyle="--",
                alpha=_CRIT_EXP,
                linewidth=_LAYOUT_LEVEL,
            )  # alpha, width (operational)

        ax_gauge.set_xlim(0, 1)
        ax_gauge.set_ylim(-0.5, 0.5)
        ax_gauge.set_yticks([])
        ax_gauge.set_xticks([0, 0.2, 0.4, 0.6, 0.8, 1.0])
        ax_gauge.set_xticklabels(["0.0", "0.2", "0.4", "0.6", "0.8", "1.0"])

        # Add overall health value and status
        ax_gauge.text(
            0.5,
            0.7,
            f"Overall Health: {overall:.3f}",
            ha="center",
            va="center",
            fontsize=16,
            weight="bold",
            transform=ax_gauge.transAxes,
        )
        ax_gauge.text(
            0.5,
            0.3,
            status,
            ha="center",
            va="center",
            fontsize=14,
            weight="bold",
            color=gauge_color,
            transform=ax_gauge.transAxes,
        )

        # Add metadata
        metadata_text = (
            f"Sequence Length: {health_metrics.sequence_length}\n"
            f"Dominant Pattern: {health_metrics.dominant_pattern}\n"
            f"Recommendations: {len(health_metrics.recommendations)}"
        )
        ax_gauge.text(
            0.02,
            -0.4,
            metadata_text,
            ha="left",
            va="top",
            fontsize=9,
            bbox=dict(
                boxstyle="round", facecolor="wheat", alpha=_LAYOUT_LEVEL
            ),  # metadata transparency
        )

        ax_gauge.set_title(
            "Overall Structural Health", fontsize=14, weight="bold", pad=20
        )
        ax_gauge.spines["top"].set_visible(False)
        ax_gauge.spines["right"].set_visible(False)
        ax_gauge.spines["left"].set_visible(False)

        fig.suptitle(
            "TNFR Sequence Health Dashboard", fontsize=16, weight="bold", y=0.98
        )

        plt.tight_layout(rect=[0, 0, 1, 0.96])

        if save_path:
            fig.savefig(save_path, dpi=self.dpi, bbox_inches="tight")

        return fig, np.array([ax_radar, ax_bars, ax_gauge])

    def plot_pattern_analysis(
        self,
        sequence: list[str],
        pattern: str,
        save_path: str | None = None,
    ) -> tuple[Figure, Axes]:
        """Plot pattern analysis with component highlighting.

        Visualizes the detected pattern within the sequence, highlighting
        key components and their structural roles.

        Parameters
        ----------
        sequence : list[str]
            Sequence of operator names
        pattern : str
            Detected pattern name (e.g., "activation", "therapeutic")
        save_path : str, optional
            Path to save the figure

        Returns
        -------
        tuple[Figure, Axes]
            The matplotlib figure and axes objects
        """
        fig, ax = plt.subplots(figsize=(14, 6), dpi=self.dpi)

        if not sequence:
            ax.text(0.5, 0.5, "Empty sequence", ha="center", va="center", fontsize=14)
            ax.set_xlim(0, 1)
            ax.set_ylim(0, 1)
            ax.axis("off")
            return fig, ax

        normalized = [canonical_operator_name(op) or op for op in sequence]
        n_ops = len(normalized)

        # Create horizontal layout
        x_positions = np.linspace(0.1, 0.9, n_ops)
        y_base = _LAYOUT_LEVEL  # vertical center

        # Draw operators with category-based coloring
        for i, op in enumerate(normalized):
            category = _get_operator_category(op)
            color = OPERATOR_CATEGORY_COLORS.get(category, "#95a5a6")

            # Draw operator box
            box = mpatches.FancyBboxPatch(
                (x_positions[i] - 0.03, y_base - 0.08),
                0.06,
                0.16,
                boxstyle=f"round,pad={_EXP_NEG_PI}",  # box padding (operational)
                facecolor=color,
                edgecolor="black",
                linewidth=2,
                alpha=_UM_COMPAT,  # box transparency
            )
            ax.add_patch(box)

            # Add operator name
            display_name = operator_display_name(op) or op
            ax.text(
                x_positions[i],
                y_base,
                display_name,
                ha="center",
                va="center",
                fontsize=9,
                weight="bold",
                color="white",
            )

            # Add category label below
            ax.text(
                x_positions[i],
                y_base - 0.15,
                category,
                ha="center",
                va="top",
                fontsize=7,
                style="italic",
            )

        # Draw connecting arrows
        for i in range(n_ops - 1):
            ax.annotate(
                "",
                xy=(x_positions[i + 1] - 0.03, y_base),
                xytext=(x_positions[i] + 0.03, y_base),
                arrowprops=dict(arrowstyle="->", lw=2, color="#34495e"),
            )

        # Add pattern name and description
        ax.text(
            0.5,
            0.85,
            f"Detected Pattern: {pattern.upper()}",
            ha="center",
            va="center",
            fontsize=14,
            weight="bold",
            transform=ax.transAxes,
        )

        # Add legend for categories
        legend_elements = [
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["initiator"], label="Initiator"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["stabilizer"], label="Stabilizer"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["transformer"], label="Transformer"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["amplifier"], label="Amplifier"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["organizer"], label="Organizer"
            ),
        ]
        ax.legend(handles=legend_elements, loc="lower right", fontsize=9, ncol=5)

        ax.set_xlim(0, 1)
        ax.set_ylim(0, 1)
        ax.set_aspect("equal")
        ax.axis("off")
        ax.set_title(
            "TNFR Pattern Component Analysis", fontsize=14, weight="bold", pad=20
        )

        plt.tight_layout()

        if save_path:
            fig.savefig(save_path, dpi=self.dpi, bbox_inches="tight")

        return fig, ax

    def plot_operator_sequence(
        self,
        sequence: list[str],
        save_path: str | None = None,
    ) -> tuple[Figure, Axes]:
        """Plot simple timeline of operators through the sequence.

        Shows operator progression through the sequence with category-based coloring.
        Note: Frequency validation (R5) has been removed from TNFR grammar as it
        was not a fundamental physical constraint.

        Parameters
        ----------
        sequence : list[str]
            Sequence of operator names
        save_path : str, optional
            Path to save the figure

        Returns
        -------
        tuple[Figure, Axes]
            The matplotlib figure and axes objects
        """
        fig, ax = plt.subplots(figsize=(14, 6), dpi=self.dpi)

        if not sequence:
            ax.text(0.5, 0.5, "Empty sequence", ha="center", va="center", fontsize=14)
            return fig, ax

        normalized = [canonical_operator_name(op) or op for op in sequence]

        # Map operators to categories for consistent visual grouping
        categories = [_get_operator_category(op) for op in normalized]
        category_values = {
            "generator": 3,
            "stabilizer": 2,
            "transformer": 3,
            "connector": 2,
            "closure": 1,
        }
        y_values = [category_values.get(cat, 2) for cat in categories]

        # Plot operator line
        x_pos = np.arange(len(normalized))
        ax.plot(
            x_pos,
            y_values,
            marker="o",
            markersize=12,
            linewidth=_LINE_WIDTH,  # default line width
            color="#3498db",
            label="Operator flow",
            zorder=2,
        )

        # Annotate operators with category colors
        for i, (op, cat) in enumerate(zip(normalized, categories)):
            display_name = operator_display_name(op) or op
            y_offset = (
                _CRIT_EXP if i % 2 == 0 else -_CRIT_EXP
            )  # annotation offset (operational)

            cat_color = OPERATOR_CATEGORY_COLORS.get(cat, "#95a5a6")
            ax.annotate(
                display_name,
                xy=(x_pos[i], y_values[i]),
                xytext=(x_pos[i], y_values[i] + y_offset),
                ha="center",
                va="center",
                fontsize=10,
                weight="bold",
                bbox=dict(
                    boxstyle=f"round,pad={_BAR_WIDTH}",  # annotation padding
                    facecolor=cat_color,
                    alpha=_STAB_THRESH,  # annotation alpha
                    edgecolor="black",
                    linewidth=_BORDER_WIDTH,  # annotation border
                ),
                zorder=3,
            )

        # Styling
        ax.set_yticks([1, 2, 3])
        ax.set_yticklabels(["Closure", "Moderate", "Intensive"], fontsize=11)
        ax.set_xticks(x_pos)
        ax.set_xticklabels([f"Step {i+1}" for i in range(len(normalized))], fontsize=9)
        ax.set_ylabel("Operator Intensity", fontsize=12, weight="bold")
        ax.set_xlabel("Sequence Position", fontsize=12, weight="bold")
        ax.set_title(
            "TNFR Operator Sequence Timeline", fontsize=14, weight="bold", pad=20
        )
        ax.grid(axis="y", alpha=_CRIT_EXP, linestyle="--")  # timeline grid alpha
        ax.set_ylim(0.5, 3.5)

        # Add category legend
        legend_elements = [
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["generator"], label="Generator"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["stabilizer"], label="Stabilizer"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["transformer"], label="Transformer"
            ),
            mpatches.Patch(
                color=OPERATOR_CATEGORY_COLORS["connector"], label="Connector"
            ),
            mpatches.Patch(color=OPERATOR_CATEGORY_COLORS["closure"], label="Closure"),
        ]
        ax.legend(handles=legend_elements, loc="upper right", fontsize=9, ncol=2)

        plt.tight_layout()

        if save_path:
            fig.savefig(save_path, dpi=self.dpi, bbox_inches="tight")

        return fig, ax