tnfr 3.0.3__py3-none-any.whl → 8.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of tnfr might be problematic. Click here for more details.
- tnfr/__init__.py +375 -56
- tnfr/__init__.pyi +33 -0
- tnfr/_compat.py +10 -0
- tnfr/_generated_version.py +34 -0
- tnfr/_version.py +49 -0
- tnfr/_version.pyi +7 -0
- tnfr/alias.py +723 -0
- tnfr/alias.pyi +108 -0
- tnfr/backends/__init__.py +354 -0
- tnfr/backends/jax_backend.py +173 -0
- tnfr/backends/numpy_backend.py +238 -0
- tnfr/backends/optimized_numpy.py +420 -0
- tnfr/backends/torch_backend.py +408 -0
- tnfr/cache.py +171 -0
- tnfr/cache.pyi +13 -0
- tnfr/cli/__init__.py +110 -0
- tnfr/cli/__init__.pyi +26 -0
- tnfr/cli/arguments.py +489 -0
- tnfr/cli/arguments.pyi +29 -0
- tnfr/cli/execution.py +914 -0
- tnfr/cli/execution.pyi +70 -0
- tnfr/cli/interactive_validator.py +614 -0
- tnfr/cli/utils.py +51 -0
- tnfr/cli/utils.pyi +7 -0
- tnfr/cli/validate.py +236 -0
- tnfr/compat/__init__.py +85 -0
- tnfr/compat/dataclass.py +136 -0
- tnfr/compat/jsonschema_stub.py +61 -0
- tnfr/compat/matplotlib_stub.py +73 -0
- tnfr/compat/numpy_stub.py +155 -0
- tnfr/config/__init__.py +224 -0
- tnfr/config/__init__.pyi +10 -0
- tnfr/config/constants.py +104 -0
- tnfr/config/constants.pyi +12 -0
- tnfr/config/defaults.py +54 -0
- tnfr/config/defaults_core.py +212 -0
- tnfr/config/defaults_init.py +33 -0
- tnfr/config/defaults_metric.py +104 -0
- tnfr/config/feature_flags.py +81 -0
- tnfr/config/feature_flags.pyi +16 -0
- tnfr/config/glyph_constants.py +31 -0
- tnfr/config/init.py +77 -0
- tnfr/config/init.pyi +8 -0
- tnfr/config/operator_names.py +254 -0
- tnfr/config/operator_names.pyi +36 -0
- tnfr/config/physics_derivation.py +354 -0
- tnfr/config/presets.py +83 -0
- tnfr/config/presets.pyi +7 -0
- tnfr/config/security.py +927 -0
- tnfr/config/thresholds.py +114 -0
- tnfr/config/tnfr_config.py +498 -0
- tnfr/constants/__init__.py +92 -0
- tnfr/constants/__init__.pyi +92 -0
- tnfr/constants/aliases.py +33 -0
- tnfr/constants/aliases.pyi +27 -0
- tnfr/constants/init.py +33 -0
- tnfr/constants/init.pyi +12 -0
- tnfr/constants/metric.py +104 -0
- tnfr/constants/metric.pyi +19 -0
- tnfr/core/__init__.py +33 -0
- tnfr/core/container.py +226 -0
- tnfr/core/default_implementations.py +329 -0
- tnfr/core/interfaces.py +279 -0
- tnfr/dynamics/__init__.py +238 -0
- tnfr/dynamics/__init__.pyi +83 -0
- tnfr/dynamics/adaptation.py +267 -0
- tnfr/dynamics/adaptation.pyi +7 -0
- tnfr/dynamics/adaptive_sequences.py +189 -0
- tnfr/dynamics/adaptive_sequences.pyi +14 -0
- tnfr/dynamics/aliases.py +23 -0
- tnfr/dynamics/aliases.pyi +19 -0
- tnfr/dynamics/bifurcation.py +232 -0
- tnfr/dynamics/canonical.py +229 -0
- tnfr/dynamics/canonical.pyi +48 -0
- tnfr/dynamics/coordination.py +385 -0
- tnfr/dynamics/coordination.pyi +25 -0
- tnfr/dynamics/dnfr.py +3034 -0
- tnfr/dynamics/dnfr.pyi +26 -0
- tnfr/dynamics/dynamic_limits.py +225 -0
- tnfr/dynamics/feedback.py +252 -0
- tnfr/dynamics/feedback.pyi +24 -0
- tnfr/dynamics/fused_dnfr.py +454 -0
- tnfr/dynamics/homeostasis.py +157 -0
- tnfr/dynamics/homeostasis.pyi +14 -0
- tnfr/dynamics/integrators.py +661 -0
- tnfr/dynamics/integrators.pyi +36 -0
- tnfr/dynamics/learning.py +310 -0
- tnfr/dynamics/learning.pyi +33 -0
- tnfr/dynamics/metabolism.py +254 -0
- tnfr/dynamics/nbody.py +796 -0
- tnfr/dynamics/nbody_tnfr.py +783 -0
- tnfr/dynamics/propagation.py +326 -0
- tnfr/dynamics/runtime.py +908 -0
- tnfr/dynamics/runtime.pyi +77 -0
- tnfr/dynamics/sampling.py +36 -0
- tnfr/dynamics/sampling.pyi +7 -0
- tnfr/dynamics/selectors.py +711 -0
- tnfr/dynamics/selectors.pyi +85 -0
- tnfr/dynamics/structural_clip.py +207 -0
- tnfr/errors/__init__.py +37 -0
- tnfr/errors/contextual.py +492 -0
- tnfr/execution.py +223 -0
- tnfr/execution.pyi +45 -0
- tnfr/extensions/__init__.py +205 -0
- tnfr/extensions/__init__.pyi +18 -0
- tnfr/extensions/base.py +173 -0
- tnfr/extensions/base.pyi +35 -0
- tnfr/extensions/business/__init__.py +71 -0
- tnfr/extensions/business/__init__.pyi +11 -0
- tnfr/extensions/business/cookbook.py +88 -0
- tnfr/extensions/business/cookbook.pyi +8 -0
- tnfr/extensions/business/health_analyzers.py +202 -0
- tnfr/extensions/business/health_analyzers.pyi +9 -0
- tnfr/extensions/business/patterns.py +183 -0
- tnfr/extensions/business/patterns.pyi +8 -0
- tnfr/extensions/medical/__init__.py +73 -0
- tnfr/extensions/medical/__init__.pyi +11 -0
- tnfr/extensions/medical/cookbook.py +88 -0
- tnfr/extensions/medical/cookbook.pyi +8 -0
- tnfr/extensions/medical/health_analyzers.py +181 -0
- tnfr/extensions/medical/health_analyzers.pyi +9 -0
- tnfr/extensions/medical/patterns.py +163 -0
- tnfr/extensions/medical/patterns.pyi +8 -0
- tnfr/flatten.py +262 -0
- tnfr/flatten.pyi +21 -0
- tnfr/gamma.py +354 -0
- tnfr/gamma.pyi +36 -0
- tnfr/glyph_history.py +377 -0
- tnfr/glyph_history.pyi +35 -0
- tnfr/glyph_runtime.py +19 -0
- tnfr/glyph_runtime.pyi +8 -0
- tnfr/immutable.py +218 -0
- tnfr/immutable.pyi +36 -0
- tnfr/initialization.py +203 -0
- tnfr/initialization.pyi +65 -0
- tnfr/io.py +10 -0
- tnfr/io.pyi +13 -0
- tnfr/locking.py +37 -0
- tnfr/locking.pyi +7 -0
- tnfr/mathematics/__init__.py +79 -0
- tnfr/mathematics/backend.py +453 -0
- tnfr/mathematics/backend.pyi +99 -0
- tnfr/mathematics/dynamics.py +408 -0
- tnfr/mathematics/dynamics.pyi +90 -0
- tnfr/mathematics/epi.py +391 -0
- tnfr/mathematics/epi.pyi +65 -0
- tnfr/mathematics/generators.py +242 -0
- tnfr/mathematics/generators.pyi +29 -0
- tnfr/mathematics/metrics.py +119 -0
- tnfr/mathematics/metrics.pyi +16 -0
- tnfr/mathematics/operators.py +239 -0
- tnfr/mathematics/operators.pyi +59 -0
- tnfr/mathematics/operators_factory.py +124 -0
- tnfr/mathematics/operators_factory.pyi +11 -0
- tnfr/mathematics/projection.py +87 -0
- tnfr/mathematics/projection.pyi +33 -0
- tnfr/mathematics/runtime.py +182 -0
- tnfr/mathematics/runtime.pyi +64 -0
- tnfr/mathematics/spaces.py +256 -0
- tnfr/mathematics/spaces.pyi +83 -0
- tnfr/mathematics/transforms.py +305 -0
- tnfr/mathematics/transforms.pyi +62 -0
- tnfr/metrics/__init__.py +79 -0
- tnfr/metrics/__init__.pyi +20 -0
- tnfr/metrics/buffer_cache.py +163 -0
- tnfr/metrics/buffer_cache.pyi +24 -0
- tnfr/metrics/cache_utils.py +214 -0
- tnfr/metrics/coherence.py +2009 -0
- tnfr/metrics/coherence.pyi +129 -0
- tnfr/metrics/common.py +158 -0
- tnfr/metrics/common.pyi +35 -0
- tnfr/metrics/core.py +316 -0
- tnfr/metrics/core.pyi +13 -0
- tnfr/metrics/diagnosis.py +833 -0
- tnfr/metrics/diagnosis.pyi +86 -0
- tnfr/metrics/emergence.py +245 -0
- tnfr/metrics/export.py +179 -0
- tnfr/metrics/export.pyi +7 -0
- tnfr/metrics/glyph_timing.py +379 -0
- tnfr/metrics/glyph_timing.pyi +81 -0
- tnfr/metrics/learning_metrics.py +280 -0
- tnfr/metrics/learning_metrics.pyi +21 -0
- tnfr/metrics/phase_coherence.py +351 -0
- tnfr/metrics/phase_compatibility.py +349 -0
- tnfr/metrics/reporting.py +183 -0
- tnfr/metrics/reporting.pyi +25 -0
- tnfr/metrics/sense_index.py +1203 -0
- tnfr/metrics/sense_index.pyi +9 -0
- tnfr/metrics/trig.py +373 -0
- tnfr/metrics/trig.pyi +13 -0
- tnfr/metrics/trig_cache.py +233 -0
- tnfr/metrics/trig_cache.pyi +10 -0
- tnfr/multiscale/__init__.py +32 -0
- tnfr/multiscale/hierarchical.py +517 -0
- tnfr/node.py +763 -0
- tnfr/node.pyi +139 -0
- tnfr/observers.py +255 -130
- tnfr/observers.pyi +31 -0
- tnfr/ontosim.py +144 -137
- tnfr/ontosim.pyi +28 -0
- tnfr/operators/__init__.py +1672 -0
- tnfr/operators/__init__.pyi +31 -0
- tnfr/operators/algebra.py +277 -0
- tnfr/operators/canonical_patterns.py +420 -0
- tnfr/operators/cascade.py +267 -0
- tnfr/operators/cycle_detection.py +358 -0
- tnfr/operators/definitions.py +4108 -0
- tnfr/operators/definitions.pyi +78 -0
- tnfr/operators/grammar.py +1164 -0
- tnfr/operators/grammar.pyi +140 -0
- tnfr/operators/hamiltonian.py +710 -0
- tnfr/operators/health_analyzer.py +809 -0
- tnfr/operators/jitter.py +272 -0
- tnfr/operators/jitter.pyi +11 -0
- tnfr/operators/lifecycle.py +314 -0
- tnfr/operators/metabolism.py +618 -0
- tnfr/operators/metrics.py +2138 -0
- tnfr/operators/network_analysis/__init__.py +27 -0
- tnfr/operators/network_analysis/source_detection.py +186 -0
- tnfr/operators/nodal_equation.py +395 -0
- tnfr/operators/pattern_detection.py +660 -0
- tnfr/operators/patterns.py +669 -0
- tnfr/operators/postconditions/__init__.py +38 -0
- tnfr/operators/postconditions/mutation.py +236 -0
- tnfr/operators/preconditions/__init__.py +1226 -0
- tnfr/operators/preconditions/coherence.py +305 -0
- tnfr/operators/preconditions/dissonance.py +236 -0
- tnfr/operators/preconditions/emission.py +128 -0
- tnfr/operators/preconditions/mutation.py +580 -0
- tnfr/operators/preconditions/reception.py +125 -0
- tnfr/operators/preconditions/resonance.py +364 -0
- tnfr/operators/registry.py +74 -0
- tnfr/operators/registry.pyi +9 -0
- tnfr/operators/remesh.py +1809 -0
- tnfr/operators/remesh.pyi +26 -0
- tnfr/operators/structural_units.py +268 -0
- tnfr/operators/unified_grammar.py +105 -0
- tnfr/parallel/__init__.py +54 -0
- tnfr/parallel/auto_scaler.py +234 -0
- tnfr/parallel/distributed.py +384 -0
- tnfr/parallel/engine.py +238 -0
- tnfr/parallel/gpu_engine.py +420 -0
- tnfr/parallel/monitoring.py +248 -0
- tnfr/parallel/partitioner.py +459 -0
- tnfr/py.typed +0 -0
- tnfr/recipes/__init__.py +22 -0
- tnfr/recipes/cookbook.py +743 -0
- tnfr/rng.py +178 -0
- tnfr/rng.pyi +26 -0
- tnfr/schemas/__init__.py +8 -0
- tnfr/schemas/grammar.json +94 -0
- tnfr/sdk/__init__.py +107 -0
- tnfr/sdk/__init__.pyi +19 -0
- tnfr/sdk/adaptive_system.py +173 -0
- tnfr/sdk/adaptive_system.pyi +21 -0
- tnfr/sdk/builders.py +370 -0
- tnfr/sdk/builders.pyi +51 -0
- tnfr/sdk/fluent.py +1121 -0
- tnfr/sdk/fluent.pyi +74 -0
- tnfr/sdk/templates.py +342 -0
- tnfr/sdk/templates.pyi +41 -0
- tnfr/sdk/utils.py +341 -0
- tnfr/secure_config.py +46 -0
- tnfr/security/__init__.py +70 -0
- tnfr/security/database.py +514 -0
- tnfr/security/subprocess.py +503 -0
- tnfr/security/validation.py +290 -0
- tnfr/selector.py +247 -0
- tnfr/selector.pyi +19 -0
- tnfr/sense.py +378 -0
- tnfr/sense.pyi +23 -0
- tnfr/services/__init__.py +17 -0
- tnfr/services/orchestrator.py +325 -0
- tnfr/sparse/__init__.py +39 -0
- tnfr/sparse/representations.py +492 -0
- tnfr/structural.py +705 -0
- tnfr/structural.pyi +83 -0
- tnfr/telemetry/__init__.py +35 -0
- tnfr/telemetry/cache_metrics.py +226 -0
- tnfr/telemetry/cache_metrics.pyi +64 -0
- tnfr/telemetry/nu_f.py +422 -0
- tnfr/telemetry/nu_f.pyi +108 -0
- tnfr/telemetry/verbosity.py +36 -0
- tnfr/telemetry/verbosity.pyi +15 -0
- tnfr/tokens.py +58 -0
- tnfr/tokens.pyi +36 -0
- tnfr/tools/__init__.py +20 -0
- tnfr/tools/domain_templates.py +478 -0
- tnfr/tools/sequence_generator.py +846 -0
- tnfr/topology/__init__.py +13 -0
- tnfr/topology/asymmetry.py +151 -0
- tnfr/trace.py +543 -0
- tnfr/trace.pyi +42 -0
- tnfr/tutorials/__init__.py +38 -0
- tnfr/tutorials/autonomous_evolution.py +285 -0
- tnfr/tutorials/interactive.py +1576 -0
- tnfr/tutorials/structural_metabolism.py +238 -0
- tnfr/types.py +775 -0
- tnfr/types.pyi +357 -0
- tnfr/units.py +68 -0
- tnfr/units.pyi +13 -0
- tnfr/utils/__init__.py +282 -0
- tnfr/utils/__init__.pyi +215 -0
- tnfr/utils/cache.py +4223 -0
- tnfr/utils/cache.pyi +470 -0
- tnfr/utils/callbacks.py +375 -0
- tnfr/utils/callbacks.pyi +49 -0
- tnfr/utils/chunks.py +108 -0
- tnfr/utils/chunks.pyi +22 -0
- tnfr/utils/data.py +428 -0
- tnfr/utils/data.pyi +74 -0
- tnfr/utils/graph.py +85 -0
- tnfr/utils/graph.pyi +10 -0
- tnfr/utils/init.py +821 -0
- tnfr/utils/init.pyi +80 -0
- tnfr/utils/io.py +559 -0
- tnfr/utils/io.pyi +66 -0
- tnfr/utils/numeric.py +114 -0
- tnfr/utils/numeric.pyi +21 -0
- tnfr/validation/__init__.py +257 -0
- tnfr/validation/__init__.pyi +85 -0
- tnfr/validation/compatibility.py +460 -0
- tnfr/validation/compatibility.pyi +6 -0
- tnfr/validation/config.py +73 -0
- tnfr/validation/graph.py +139 -0
- tnfr/validation/graph.pyi +18 -0
- tnfr/validation/input_validation.py +755 -0
- tnfr/validation/invariants.py +712 -0
- tnfr/validation/rules.py +253 -0
- tnfr/validation/rules.pyi +44 -0
- tnfr/validation/runtime.py +279 -0
- tnfr/validation/runtime.pyi +28 -0
- tnfr/validation/sequence_validator.py +162 -0
- tnfr/validation/soft_filters.py +170 -0
- tnfr/validation/soft_filters.pyi +32 -0
- tnfr/validation/spectral.py +164 -0
- tnfr/validation/spectral.pyi +42 -0
- tnfr/validation/validator.py +1266 -0
- tnfr/validation/window.py +39 -0
- tnfr/validation/window.pyi +1 -0
- tnfr/visualization/__init__.py +98 -0
- tnfr/visualization/cascade_viz.py +256 -0
- tnfr/visualization/hierarchy.py +284 -0
- tnfr/visualization/sequence_plotter.py +784 -0
- tnfr/viz/__init__.py +60 -0
- tnfr/viz/matplotlib.py +278 -0
- tnfr/viz/matplotlib.pyi +35 -0
- tnfr-8.5.0.dist-info/METADATA +573 -0
- tnfr-8.5.0.dist-info/RECORD +353 -0
- tnfr-8.5.0.dist-info/entry_points.txt +3 -0
- tnfr-3.0.3.dist-info/licenses/LICENSE.txt → tnfr-8.5.0.dist-info/licenses/LICENSE.md +1 -1
- tnfr/constants.py +0 -183
- tnfr/dynamics.py +0 -543
- tnfr/helpers.py +0 -198
- tnfr/main.py +0 -37
- tnfr/operators.py +0 -296
- tnfr-3.0.3.dist-info/METADATA +0 -35
- tnfr-3.0.3.dist-info/RECORD +0 -13
- {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
- {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Canonical thresholds for structural operator preconditions.
|
|
2
|
+
|
|
3
|
+
This module defines configurable thresholds that enforce TNFR canonical
|
|
4
|
+
preconditions for structural operators. These thresholds ensure structural
|
|
5
|
+
integrity and operational fidelity according to TNFR.pdf specifications.
|
|
6
|
+
|
|
7
|
+
All thresholds are exported as module-level constants with sensible defaults
|
|
8
|
+
that can be overridden via graph metadata or configuration presets.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"EPI_LATENT_MAX",
|
|
15
|
+
"VF_BASAL_THRESHOLD",
|
|
16
|
+
"EPSILON_MIN_EMISSION",
|
|
17
|
+
"MIN_NETWORK_DEGREE_COUPLING",
|
|
18
|
+
"EPI_SATURATION_MAX",
|
|
19
|
+
"DNFR_RECEPTION_MAX",
|
|
20
|
+
"EPI_IL_MIN",
|
|
21
|
+
"EPI_IL_MAX",
|
|
22
|
+
"VF_IL_MIN",
|
|
23
|
+
"DNFR_IL_CRITICAL",
|
|
24
|
+
"EPI_RA_MIN",
|
|
25
|
+
"DNFR_RA_MAX",
|
|
26
|
+
"VF_RA_MIN",
|
|
27
|
+
"PHASE_RA_MAX_DIFF",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
# -------------------------
|
|
31
|
+
# AL (Emission) Thresholds
|
|
32
|
+
# -------------------------
|
|
33
|
+
|
|
34
|
+
# Maximum EPI for latent state - AL requires nodes in latent/low-activation state
|
|
35
|
+
# According to TNFR.pdf §2.2.1, emission activates nascent structures
|
|
36
|
+
EPI_LATENT_MAX: float = 0.8
|
|
37
|
+
|
|
38
|
+
# Minimum structural frequency (νf) for emission - ensures sufficient
|
|
39
|
+
# reorganization capacity. Below this threshold, the node cannot sustain
|
|
40
|
+
# the structural frequency activation that AL initiates.
|
|
41
|
+
VF_BASAL_THRESHOLD: float = 0.5
|
|
42
|
+
|
|
43
|
+
# Minimum coherence gradient (epsilon) for meaningful emission
|
|
44
|
+
# This represents the minimum structural pressure needed to justify activation
|
|
45
|
+
EPSILON_MIN_EMISSION: float = 0.1
|
|
46
|
+
|
|
47
|
+
# Minimum network degree for effective phase coupling
|
|
48
|
+
# Nodes with degree below this threshold will trigger a warning (not error)
|
|
49
|
+
# as AL can still activate isolated nodes, but coupling will be limited
|
|
50
|
+
MIN_NETWORK_DEGREE_COUPLING: int = 1
|
|
51
|
+
|
|
52
|
+
# -------------------------
|
|
53
|
+
# EN (Reception) Thresholds
|
|
54
|
+
# -------------------------
|
|
55
|
+
|
|
56
|
+
# Maximum EPI for reception - EN requires nodes with receptive capacity
|
|
57
|
+
# According to TNFR.pdf §2.2.1, reception integrates external coherence
|
|
58
|
+
# into local structure. If EPI is saturated, node cannot receive more coherence.
|
|
59
|
+
EPI_SATURATION_MAX: float = 0.9
|
|
60
|
+
|
|
61
|
+
# Maximum DNFR for stable reception - EN requires low dissonance
|
|
62
|
+
# Excessive reorganization pressure prevents effective integration
|
|
63
|
+
# of external coherence. Consider IL (Coherence) first to stabilize.
|
|
64
|
+
DNFR_RECEPTION_MAX: float = 0.15
|
|
65
|
+
|
|
66
|
+
# -------------------------
|
|
67
|
+
# IL (Coherence) Thresholds
|
|
68
|
+
# -------------------------
|
|
69
|
+
|
|
70
|
+
# Minimum EPI for coherence - IL requires active structural form
|
|
71
|
+
# According to TNFR.pdf §2.2.1, coherence stabilizes existing structure
|
|
72
|
+
# Zero or negative EPI indicates no structure to stabilize
|
|
73
|
+
EPI_IL_MIN: float = 0.0
|
|
74
|
+
|
|
75
|
+
# Maximum EPI for coherence - IL may increment EPI during stabilization
|
|
76
|
+
# Leave room for stabilization increment to avoid saturation
|
|
77
|
+
# Values near 1.0 indicate node is already highly stable
|
|
78
|
+
EPI_IL_MAX: float = 1.0
|
|
79
|
+
|
|
80
|
+
# Minimum structural frequency for coherence - IL requires active νf
|
|
81
|
+
# IL reduces ΔNFR proportional to νf via nodal equation ∂EPI/∂t = νf · ΔNFR
|
|
82
|
+
# Zero νf prevents effective stabilization
|
|
83
|
+
VF_IL_MIN: float = 0.0
|
|
84
|
+
|
|
85
|
+
# Critical ΔNFR threshold - excessive reorganization pressure
|
|
86
|
+
# Above this threshold, node is highly unstable and may benefit from
|
|
87
|
+
# OZ (Dissonance) → IL sequence for controlled stabilization
|
|
88
|
+
# This is a warning threshold, not a hard failure
|
|
89
|
+
DNFR_IL_CRITICAL: float = 0.8
|
|
90
|
+
|
|
91
|
+
# -------------------------
|
|
92
|
+
# RA (Resonance) Thresholds
|
|
93
|
+
# -------------------------
|
|
94
|
+
|
|
95
|
+
# Minimum EPI for resonance source - RA requires coherent structural form
|
|
96
|
+
# According to TNFR theory, resonance propagates existing coherence through
|
|
97
|
+
# network connections. Source node must have sufficient EPI to propagate.
|
|
98
|
+
EPI_RA_MIN: float = 0.1
|
|
99
|
+
|
|
100
|
+
# Maximum ΔNFR for resonance - RA requires controlled dissonance
|
|
101
|
+
# Excessive reorganization pressure prevents stable resonance propagation.
|
|
102
|
+
# Consider IL (Coherence) first to stabilize before applying RA.
|
|
103
|
+
DNFR_RA_MAX: float = 0.5
|
|
104
|
+
|
|
105
|
+
# Minimum structural frequency for resonance - RA requires active νf
|
|
106
|
+
# Resonance amplifies νf across the network. Zero νf prevents propagation
|
|
107
|
+
# dynamics from occurring. Consider AL (Emission) or VAL (Expansion) first.
|
|
108
|
+
VF_RA_MIN: float = 0.01
|
|
109
|
+
|
|
110
|
+
# Maximum phase difference for optimal resonance - RA prefers phase alignment
|
|
111
|
+
# This is a soft threshold (warning only). Larger phase differences reduce
|
|
112
|
+
# resonance effectiveness but don't prevent propagation entirely.
|
|
113
|
+
# Measured in radians: π/3 ≈ 1.0 rad ≈ 60 degrees
|
|
114
|
+
PHASE_RA_MAX_DIFF: float = 1.0
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
"""Canonical TNFR configuration system with structural invariant validation.
|
|
2
|
+
|
|
3
|
+
This module provides the TNFRConfig class that consolidates all TNFR
|
|
4
|
+
configuration with explicit semantic mapping to TNFR invariants (νf, θ, ΔNFR).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import copy
|
|
10
|
+
from collections.abc import Mapping
|
|
11
|
+
from typing import Any, Callable, TypeVar, cast
|
|
12
|
+
|
|
13
|
+
from ..immutable import _is_immutable
|
|
14
|
+
from ..types import GraphLike, TNFRConfigValue
|
|
15
|
+
|
|
16
|
+
T = TypeVar("T")
|
|
17
|
+
|
|
18
|
+
# TNFR Canonical State Tokens
|
|
19
|
+
STATE_STABLE = "stable"
|
|
20
|
+
STATE_TRANSITION = "transition"
|
|
21
|
+
STATE_DISSONANT = "dissonant"
|
|
22
|
+
|
|
23
|
+
CANONICAL_STATE_TOKENS = frozenset({STATE_STABLE, STATE_TRANSITION, STATE_DISSONANT})
|
|
24
|
+
|
|
25
|
+
# Canonical TNFR keys with Unicode symbols
|
|
26
|
+
VF_KEY = "νf" # Structural frequency (Hz_str)
|
|
27
|
+
THETA_KEY = "theta" # Phase
|
|
28
|
+
DNFR_KEY = "ΔNFR" # Internal reorganization operator
|
|
29
|
+
|
|
30
|
+
# Node attribute aliases for canonical TNFR variables
|
|
31
|
+
ALIASES: dict[str, tuple[str, ...]] = {
|
|
32
|
+
"VF": (VF_KEY, "nu_f", "nu-f", "nu", "freq", "frequency"),
|
|
33
|
+
"THETA": (THETA_KEY, "phase"),
|
|
34
|
+
"DNFR": (DNFR_KEY, "delta_nfr", "dnfr"),
|
|
35
|
+
"EPI": ("EPI", "psi", "PSI", "value"),
|
|
36
|
+
"EPI_KIND": ("EPI_kind", "epi_kind", "source_glyph"),
|
|
37
|
+
"SI": ("Si", "sense_index", "S_i", "sense", "meaning_index"),
|
|
38
|
+
"DEPI": ("dEPI_dt", "dpsi_dt", "dEPI", "velocity"),
|
|
39
|
+
"D2EPI": ("d2EPI_dt2", "d2psi_dt2", "d2EPI", "accel"),
|
|
40
|
+
"DVF": ("dνf_dt", "dvf_dt", "dnu_dt", "dvf"),
|
|
41
|
+
"D2VF": ("d2νf_dt2", "d2vf_dt2", "d2nu_dt2", "B"),
|
|
42
|
+
"DSI": ("δSi", "delta_Si", "dSi"),
|
|
43
|
+
"EMISSION_TIMESTAMP": ("emission_timestamp", "emission_t", "t_al"),
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class TNFRConfigError(Exception):
|
|
48
|
+
"""Raised when TNFR configuration violates structural invariants."""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TNFRConfig:
|
|
52
|
+
"""Canonical TNFR configuration with structural invariant validation.
|
|
53
|
+
|
|
54
|
+
This class consolidates all TNFR configuration and provides validation
|
|
55
|
+
against the canonical TNFR invariants defined in AGENTS.md.
|
|
56
|
+
|
|
57
|
+
TNFR Structural Invariants Enforced:
|
|
58
|
+
-------------------------------------
|
|
59
|
+
1. νf (structural frequency) must be in Hz_str units, > 0
|
|
60
|
+
2. θ (phase) must be in [-π, π] if THETA_WRAP enabled
|
|
61
|
+
3. ΔNFR magnitude bounds define reorganization stability
|
|
62
|
+
4. EPI coherent form bounds define valid state space
|
|
63
|
+
5. Configuration parameters maintain operator closure
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
defaults : Mapping[str, TNFRConfigValue], optional
|
|
68
|
+
Base configuration defaults to use.
|
|
69
|
+
validate_invariants : bool, default=True
|
|
70
|
+
Whether to validate TNFR structural invariants.
|
|
71
|
+
|
|
72
|
+
Examples
|
|
73
|
+
--------
|
|
74
|
+
>>> config = TNFRConfig()
|
|
75
|
+
>>> config.validate_vf_bounds(vf_min=0.0, vf_max=10.0)
|
|
76
|
+
True
|
|
77
|
+
|
|
78
|
+
>>> config.get_param_with_fallback({}, "DT", default=1.0)
|
|
79
|
+
1.0
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
def __init__(
|
|
83
|
+
self,
|
|
84
|
+
defaults: Mapping[str, TNFRConfigValue] | None = None,
|
|
85
|
+
validate_invariants: bool = True,
|
|
86
|
+
) -> None:
|
|
87
|
+
"""Initialize TNFR configuration."""
|
|
88
|
+
self._defaults = defaults or {}
|
|
89
|
+
self._validate_invariants = validate_invariants
|
|
90
|
+
|
|
91
|
+
def validate_vf_bounds(
|
|
92
|
+
self,
|
|
93
|
+
vf_min: float | None = None,
|
|
94
|
+
vf_max: float | None = None,
|
|
95
|
+
vf: float | None = None,
|
|
96
|
+
) -> bool:
|
|
97
|
+
"""Validate νf (structural frequency) bounds.
|
|
98
|
+
|
|
99
|
+
TNFR Invariant: νf must be expressed in Hz_str (structural hertz)
|
|
100
|
+
and must be > 0 to maintain node existence.
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
vf_min : float, optional
|
|
105
|
+
Minimum structural frequency bound.
|
|
106
|
+
vf_max : float, optional
|
|
107
|
+
Maximum structural frequency bound.
|
|
108
|
+
vf : float, optional
|
|
109
|
+
Specific frequency value to validate.
|
|
110
|
+
|
|
111
|
+
Returns
|
|
112
|
+
-------
|
|
113
|
+
bool
|
|
114
|
+
True if bounds are valid.
|
|
115
|
+
|
|
116
|
+
Raises
|
|
117
|
+
------
|
|
118
|
+
TNFRConfigError
|
|
119
|
+
If bounds violate TNFR invariants.
|
|
120
|
+
"""
|
|
121
|
+
if not self._validate_invariants:
|
|
122
|
+
return True
|
|
123
|
+
|
|
124
|
+
# Invariant 2: Structural units - νf in Hz_str, must be positive
|
|
125
|
+
if vf_min is not None and vf_min < 0.0:
|
|
126
|
+
raise TNFRConfigError(f"VF_MIN must be >= 0 (Hz_str units), got {vf_min}")
|
|
127
|
+
|
|
128
|
+
if vf_max is not None and vf_min is not None and vf_max < vf_min:
|
|
129
|
+
raise TNFRConfigError(f"VF_MAX ({vf_max}) must be >= VF_MIN ({vf_min})")
|
|
130
|
+
|
|
131
|
+
if vf is not None:
|
|
132
|
+
if vf < 0.0:
|
|
133
|
+
raise TNFRConfigError(f"νf must be >= 0 (Hz_str units), got {vf}")
|
|
134
|
+
if vf_min is not None and vf < vf_min:
|
|
135
|
+
raise TNFRConfigError(f"νf ({vf}) below VF_MIN ({vf_min})")
|
|
136
|
+
if vf_max is not None and vf > vf_max:
|
|
137
|
+
raise TNFRConfigError(f"νf ({vf}) above VF_MAX ({vf_max})")
|
|
138
|
+
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
def validate_theta_bounds(
|
|
142
|
+
self,
|
|
143
|
+
theta: float | None = None,
|
|
144
|
+
theta_wrap: bool = True,
|
|
145
|
+
) -> bool:
|
|
146
|
+
"""Validate θ (phase) bounds.
|
|
147
|
+
|
|
148
|
+
TNFR Invariant: Phase must be properly bounded to ensure
|
|
149
|
+
valid network synchrony measurements.
|
|
150
|
+
|
|
151
|
+
Parameters
|
|
152
|
+
----------
|
|
153
|
+
theta : float, optional
|
|
154
|
+
Phase value to validate.
|
|
155
|
+
theta_wrap : bool, default=True
|
|
156
|
+
Whether phase wrapping is enabled.
|
|
157
|
+
|
|
158
|
+
Returns
|
|
159
|
+
-------
|
|
160
|
+
bool
|
|
161
|
+
True if phase is valid.
|
|
162
|
+
|
|
163
|
+
Raises
|
|
164
|
+
------
|
|
165
|
+
TNFRConfigError
|
|
166
|
+
If phase violates TNFR invariants.
|
|
167
|
+
"""
|
|
168
|
+
if not self._validate_invariants:
|
|
169
|
+
return True
|
|
170
|
+
|
|
171
|
+
import math
|
|
172
|
+
|
|
173
|
+
# Invariant 5: Phase check - valid synchrony requires bounded phase
|
|
174
|
+
if theta is not None and not theta_wrap:
|
|
175
|
+
if not (-math.pi <= theta <= math.pi):
|
|
176
|
+
raise TNFRConfigError(
|
|
177
|
+
f"θ (phase) must be in [-π, π] when THETA_WRAP=False, got {theta}"
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
return True
|
|
181
|
+
|
|
182
|
+
def validate_epi_bounds(
|
|
183
|
+
self,
|
|
184
|
+
epi_min: float | None = None,
|
|
185
|
+
epi_max: float | None = None,
|
|
186
|
+
epi: float | None = None,
|
|
187
|
+
) -> bool:
|
|
188
|
+
"""Validate EPI (Primary Information Structure) bounds.
|
|
189
|
+
|
|
190
|
+
TNFR Invariant: EPI as coherent form must remain within
|
|
191
|
+
valid bounds to maintain structural coherence.
|
|
192
|
+
|
|
193
|
+
Parameters
|
|
194
|
+
----------
|
|
195
|
+
epi_min : float, optional
|
|
196
|
+
Minimum EPI bound.
|
|
197
|
+
epi_max : float, optional
|
|
198
|
+
Maximum EPI bound.
|
|
199
|
+
epi : float, optional
|
|
200
|
+
Specific EPI value to validate.
|
|
201
|
+
|
|
202
|
+
Returns
|
|
203
|
+
-------
|
|
204
|
+
bool
|
|
205
|
+
True if bounds are valid.
|
|
206
|
+
|
|
207
|
+
Raises
|
|
208
|
+
------
|
|
209
|
+
TNFRConfigError
|
|
210
|
+
If bounds violate TNFR invariants.
|
|
211
|
+
"""
|
|
212
|
+
if not self._validate_invariants:
|
|
213
|
+
return True
|
|
214
|
+
|
|
215
|
+
# Invariant 1: EPI as coherent form - must have valid bounds
|
|
216
|
+
if epi_max is not None and epi_min is not None and epi_max < epi_min:
|
|
217
|
+
raise TNFRConfigError(f"EPI_MAX ({epi_max}) must be >= EPI_MIN ({epi_min})")
|
|
218
|
+
|
|
219
|
+
if epi is not None:
|
|
220
|
+
if epi_min is not None and epi < epi_min:
|
|
221
|
+
raise TNFRConfigError(f"EPI ({epi}) below EPI_MIN ({epi_min})")
|
|
222
|
+
if epi_max is not None and epi > epi_max:
|
|
223
|
+
raise TNFRConfigError(f"EPI ({epi}) above EPI_MAX ({epi_max})")
|
|
224
|
+
|
|
225
|
+
return True
|
|
226
|
+
|
|
227
|
+
def validate_dnfr_semantics(
|
|
228
|
+
self,
|
|
229
|
+
dnfr: float | None = None,
|
|
230
|
+
context: str = "",
|
|
231
|
+
) -> bool:
|
|
232
|
+
"""Validate ΔNFR (reorganization operator) semantics.
|
|
233
|
+
|
|
234
|
+
TNFR Invariant: ΔNFR semantics must not be reinterpreted as
|
|
235
|
+
classical ML "error" or "loss gradient". It modulates
|
|
236
|
+
reorganization rate.
|
|
237
|
+
|
|
238
|
+
Parameters
|
|
239
|
+
----------
|
|
240
|
+
dnfr : float, optional
|
|
241
|
+
ΔNFR value to validate.
|
|
242
|
+
context : str, optional
|
|
243
|
+
Context description for validation.
|
|
244
|
+
|
|
245
|
+
Returns
|
|
246
|
+
-------
|
|
247
|
+
bool
|
|
248
|
+
True if ΔNFR semantics are preserved.
|
|
249
|
+
|
|
250
|
+
Raises
|
|
251
|
+
------
|
|
252
|
+
TNFRConfigError
|
|
253
|
+
If ΔNFR semantics are violated.
|
|
254
|
+
"""
|
|
255
|
+
if not self._validate_invariants:
|
|
256
|
+
return True
|
|
257
|
+
|
|
258
|
+
# Invariant 3: ΔNFR semantics - modulates reorganization rate
|
|
259
|
+
# Sign and magnitude are semantically significant
|
|
260
|
+
# This validation ensures we don't reinterpret ΔNFR incorrectly
|
|
261
|
+
|
|
262
|
+
# No specific numeric bounds - ΔNFR can be any real value
|
|
263
|
+
# The semantic check is about usage context, not numeric range
|
|
264
|
+
|
|
265
|
+
return True
|
|
266
|
+
|
|
267
|
+
def validate_config(
|
|
268
|
+
self,
|
|
269
|
+
config: Mapping[str, Any],
|
|
270
|
+
) -> bool:
|
|
271
|
+
"""Validate complete configuration against TNFR invariants.
|
|
272
|
+
|
|
273
|
+
Parameters
|
|
274
|
+
----------
|
|
275
|
+
config : Mapping[str, Any]
|
|
276
|
+
Configuration to validate.
|
|
277
|
+
|
|
278
|
+
Returns
|
|
279
|
+
-------
|
|
280
|
+
bool
|
|
281
|
+
True if configuration is valid.
|
|
282
|
+
|
|
283
|
+
Raises
|
|
284
|
+
------
|
|
285
|
+
TNFRConfigError
|
|
286
|
+
If configuration violates TNFR invariants.
|
|
287
|
+
"""
|
|
288
|
+
if not self._validate_invariants:
|
|
289
|
+
return True
|
|
290
|
+
|
|
291
|
+
# Validate νf bounds
|
|
292
|
+
vf_min = config.get("VF_MIN")
|
|
293
|
+
vf_max = config.get("VF_MAX")
|
|
294
|
+
if vf_min is not None or vf_max is not None:
|
|
295
|
+
self.validate_vf_bounds(vf_min=vf_min, vf_max=vf_max)
|
|
296
|
+
|
|
297
|
+
# Validate θ bounds
|
|
298
|
+
theta_wrap = config.get("THETA_WRAP", True)
|
|
299
|
+
init_theta_min = config.get("INIT_THETA_MIN")
|
|
300
|
+
init_theta_max = config.get("INIT_THETA_MAX")
|
|
301
|
+
if init_theta_min is not None:
|
|
302
|
+
self.validate_theta_bounds(theta=init_theta_min, theta_wrap=theta_wrap)
|
|
303
|
+
if init_theta_max is not None:
|
|
304
|
+
self.validate_theta_bounds(theta=init_theta_max, theta_wrap=theta_wrap)
|
|
305
|
+
|
|
306
|
+
# Validate EPI bounds
|
|
307
|
+
epi_min = config.get("EPI_MIN")
|
|
308
|
+
epi_max = config.get("EPI_MAX")
|
|
309
|
+
if epi_min is not None or epi_max is not None:
|
|
310
|
+
self.validate_epi_bounds(epi_min=epi_min, epi_max=epi_max)
|
|
311
|
+
|
|
312
|
+
# Validate DT (time step) is positive for temporal coherence
|
|
313
|
+
dt = config.get("DT")
|
|
314
|
+
if dt is not None and dt <= 0:
|
|
315
|
+
raise TNFRConfigError(
|
|
316
|
+
f"DT (time step) must be > 0 for temporal coherence, got {dt}"
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
return True
|
|
320
|
+
|
|
321
|
+
def get_param_with_fallback(
|
|
322
|
+
self,
|
|
323
|
+
G_graph: Mapping[str, Any],
|
|
324
|
+
key: str,
|
|
325
|
+
default: TNFRConfigValue | None = None,
|
|
326
|
+
) -> TNFRConfigValue:
|
|
327
|
+
"""Retrieve parameter from graph or defaults with fallback.
|
|
328
|
+
|
|
329
|
+
Parameters
|
|
330
|
+
----------
|
|
331
|
+
G_graph : Mapping[str, Any]
|
|
332
|
+
Graph configuration dictionary.
|
|
333
|
+
key : str
|
|
334
|
+
Parameter key to retrieve.
|
|
335
|
+
default : TNFRConfigValue, optional
|
|
336
|
+
Fallback default value.
|
|
337
|
+
|
|
338
|
+
Returns
|
|
339
|
+
-------
|
|
340
|
+
TNFRConfigValue
|
|
341
|
+
Configuration value.
|
|
342
|
+
"""
|
|
343
|
+
if key in G_graph:
|
|
344
|
+
return G_graph[key]
|
|
345
|
+
if key in self._defaults:
|
|
346
|
+
value = self._defaults[key]
|
|
347
|
+
# Deep copy mutable values to avoid shared state
|
|
348
|
+
if not _is_immutable(value):
|
|
349
|
+
return cast(TNFRConfigValue, copy.deepcopy(value))
|
|
350
|
+
return value
|
|
351
|
+
if default is not None:
|
|
352
|
+
return default
|
|
353
|
+
raise KeyError(f"Parameter '{key}' not found in graph or defaults")
|
|
354
|
+
|
|
355
|
+
def inject_defaults(
|
|
356
|
+
self,
|
|
357
|
+
G: GraphLike,
|
|
358
|
+
defaults: Mapping[str, TNFRConfigValue] | None = None,
|
|
359
|
+
override: bool = False,
|
|
360
|
+
) -> None:
|
|
361
|
+
"""Inject defaults into graph with TNFR invariant validation.
|
|
362
|
+
|
|
363
|
+
Parameters
|
|
364
|
+
----------
|
|
365
|
+
G : GraphLike
|
|
366
|
+
Graph to inject configuration into.
|
|
367
|
+
defaults : Mapping[str, TNFRConfigValue], optional
|
|
368
|
+
Configuration to inject. Uses instance defaults if not provided.
|
|
369
|
+
override : bool, default=False
|
|
370
|
+
Whether to override existing values.
|
|
371
|
+
|
|
372
|
+
Raises
|
|
373
|
+
------
|
|
374
|
+
TNFRConfigError
|
|
375
|
+
If configuration violates TNFR invariants.
|
|
376
|
+
"""
|
|
377
|
+
config_to_inject = defaults or self._defaults
|
|
378
|
+
|
|
379
|
+
# Validate before injection
|
|
380
|
+
if self._validate_invariants:
|
|
381
|
+
self.validate_config(config_to_inject)
|
|
382
|
+
|
|
383
|
+
G.graph.setdefault("_tnfr_defaults_attached", False)
|
|
384
|
+
for k, v in config_to_inject.items():
|
|
385
|
+
if override or k not in G.graph:
|
|
386
|
+
G.graph[k] = (
|
|
387
|
+
v if _is_immutable(v) else cast(TNFRConfigValue, copy.deepcopy(v))
|
|
388
|
+
)
|
|
389
|
+
G.graph["_tnfr_defaults_attached"] = True
|
|
390
|
+
|
|
391
|
+
# Ensure node offset map if available
|
|
392
|
+
try:
|
|
393
|
+
from ..utils import ensure_node_offset_map
|
|
394
|
+
|
|
395
|
+
ensure_node_offset_map(G)
|
|
396
|
+
except ImportError:
|
|
397
|
+
pass
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def get_aliases(key: str) -> tuple[str, ...]:
|
|
401
|
+
"""Return alias tuple for canonical TNFR variable ``key``.
|
|
402
|
+
|
|
403
|
+
Parameters
|
|
404
|
+
----------
|
|
405
|
+
key : str
|
|
406
|
+
Canonical variable key (e.g., "VF", "THETA", "DNFR").
|
|
407
|
+
|
|
408
|
+
Returns
|
|
409
|
+
-------
|
|
410
|
+
tuple[str, ...]
|
|
411
|
+
Tuple of aliases for the variable.
|
|
412
|
+
|
|
413
|
+
Examples
|
|
414
|
+
--------
|
|
415
|
+
>>> get_aliases("VF")
|
|
416
|
+
('νf', 'nu_f', 'nu-f', 'nu', 'freq', 'frequency')
|
|
417
|
+
"""
|
|
418
|
+
return ALIASES[key]
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
# Primary aliases for common TNFR variables
|
|
422
|
+
VF_PRIMARY = get_aliases("VF")[0] # νf
|
|
423
|
+
THETA_PRIMARY = get_aliases("THETA")[0] # theta
|
|
424
|
+
DNFR_PRIMARY = get_aliases("DNFR")[0] # ΔNFR
|
|
425
|
+
EPI_PRIMARY = get_aliases("EPI")[0] # EPI
|
|
426
|
+
EPI_KIND_PRIMARY = get_aliases("EPI_KIND")[0] # EPI_kind
|
|
427
|
+
SI_PRIMARY = get_aliases("SI")[0] # Si
|
|
428
|
+
dEPI_PRIMARY = get_aliases("DEPI")[0] # dEPI_dt
|
|
429
|
+
D2EPI_PRIMARY = get_aliases("D2EPI")[0] # d2EPI_dt2
|
|
430
|
+
dVF_PRIMARY = get_aliases("DVF")[0] # dνf_dt
|
|
431
|
+
D2VF_PRIMARY = get_aliases("D2VF")[0] # d2νf_dt2
|
|
432
|
+
dSI_PRIMARY = get_aliases("DSI")[0] # δSi
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def normalise_state_token(token: str) -> str:
|
|
436
|
+
"""Return the canonical English token for node state.
|
|
437
|
+
|
|
438
|
+
TNFR defines three canonical states: stable, transition, dissonant.
|
|
439
|
+
|
|
440
|
+
Parameters
|
|
441
|
+
----------
|
|
442
|
+
token : str
|
|
443
|
+
State token to normalize.
|
|
444
|
+
|
|
445
|
+
Returns
|
|
446
|
+
-------
|
|
447
|
+
str
|
|
448
|
+
Canonical state token.
|
|
449
|
+
|
|
450
|
+
Raises
|
|
451
|
+
------
|
|
452
|
+
TypeError
|
|
453
|
+
If token is not a string.
|
|
454
|
+
ValueError
|
|
455
|
+
If token is not a valid TNFR state.
|
|
456
|
+
"""
|
|
457
|
+
if not isinstance(token, str):
|
|
458
|
+
raise TypeError("state token must be a string")
|
|
459
|
+
|
|
460
|
+
stripped = token.strip()
|
|
461
|
+
lowered = stripped.lower()
|
|
462
|
+
|
|
463
|
+
if stripped in CANONICAL_STATE_TOKENS:
|
|
464
|
+
return stripped
|
|
465
|
+
|
|
466
|
+
if lowered in CANONICAL_STATE_TOKENS:
|
|
467
|
+
return lowered
|
|
468
|
+
|
|
469
|
+
raise ValueError(
|
|
470
|
+
"state token must be one of 'stable', 'transition', or 'dissonant'"
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
__all__ = (
|
|
475
|
+
"TNFRConfig",
|
|
476
|
+
"TNFRConfigError",
|
|
477
|
+
"ALIASES",
|
|
478
|
+
"VF_KEY",
|
|
479
|
+
"THETA_KEY",
|
|
480
|
+
"DNFR_KEY",
|
|
481
|
+
"VF_PRIMARY",
|
|
482
|
+
"THETA_PRIMARY",
|
|
483
|
+
"DNFR_PRIMARY",
|
|
484
|
+
"EPI_PRIMARY",
|
|
485
|
+
"EPI_KIND_PRIMARY",
|
|
486
|
+
"SI_PRIMARY",
|
|
487
|
+
"dEPI_PRIMARY",
|
|
488
|
+
"D2EPI_PRIMARY",
|
|
489
|
+
"dVF_PRIMARY",
|
|
490
|
+
"D2VF_PRIMARY",
|
|
491
|
+
"dSI_PRIMARY",
|
|
492
|
+
"STATE_STABLE",
|
|
493
|
+
"STATE_TRANSITION",
|
|
494
|
+
"STATE_DISSONANT",
|
|
495
|
+
"CANONICAL_STATE_TOKENS",
|
|
496
|
+
"get_aliases",
|
|
497
|
+
"normalise_state_token",
|
|
498
|
+
)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Shared constants (backward compatibility layer).
|
|
2
|
+
|
|
3
|
+
This module re-exports configuration from tnfr.config for backward compatibility.
|
|
4
|
+
New code should import directly from tnfr.config.
|
|
5
|
+
|
|
6
|
+
Migration Path:
|
|
7
|
+
Old: from tnfr.constants import DEFAULTS, inject_defaults
|
|
8
|
+
New: from tnfr.config import DEFAULTS, inject_defaults
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
# Re-export all constants and utilities from tnfr.config
|
|
14
|
+
from ..config import (
|
|
15
|
+
ALIASES,
|
|
16
|
+
CANONICAL_STATE_TOKENS,
|
|
17
|
+
COHERENCE,
|
|
18
|
+
CORE_DEFAULTS,
|
|
19
|
+
D2EPI_PRIMARY,
|
|
20
|
+
D2VF_PRIMARY,
|
|
21
|
+
DEFAULT_SECTIONS,
|
|
22
|
+
DEFAULTS,
|
|
23
|
+
DIAGNOSIS,
|
|
24
|
+
DNFR_PRIMARY,
|
|
25
|
+
EPI_KIND_PRIMARY,
|
|
26
|
+
EPI_PRIMARY,
|
|
27
|
+
GRAMMAR_CANON,
|
|
28
|
+
INIT_DEFAULTS,
|
|
29
|
+
METRIC_DEFAULTS,
|
|
30
|
+
METRICS,
|
|
31
|
+
REMESH_DEFAULTS,
|
|
32
|
+
SI_PRIMARY,
|
|
33
|
+
SIGMA,
|
|
34
|
+
STATE_DISSONANT,
|
|
35
|
+
STATE_STABLE,
|
|
36
|
+
STATE_TRANSITION,
|
|
37
|
+
THETA_KEY,
|
|
38
|
+
THETA_PRIMARY,
|
|
39
|
+
TRACE,
|
|
40
|
+
VF_KEY,
|
|
41
|
+
VF_PRIMARY,
|
|
42
|
+
dEPI_PRIMARY,
|
|
43
|
+
dSI_PRIMARY,
|
|
44
|
+
dVF_PRIMARY,
|
|
45
|
+
ensure_node_offset_map,
|
|
46
|
+
get_aliases,
|
|
47
|
+
get_graph_param,
|
|
48
|
+
get_param,
|
|
49
|
+
inject_defaults,
|
|
50
|
+
merge_overrides,
|
|
51
|
+
normalise_state_token,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
__all__ = (
|
|
55
|
+
"CORE_DEFAULTS",
|
|
56
|
+
"INIT_DEFAULTS",
|
|
57
|
+
"REMESH_DEFAULTS",
|
|
58
|
+
"METRIC_DEFAULTS",
|
|
59
|
+
"SIGMA",
|
|
60
|
+
"TRACE",
|
|
61
|
+
"METRICS",
|
|
62
|
+
"GRAMMAR_CANON",
|
|
63
|
+
"COHERENCE",
|
|
64
|
+
"DIAGNOSIS",
|
|
65
|
+
"DEFAULTS",
|
|
66
|
+
"DEFAULT_SECTIONS",
|
|
67
|
+
"ALIASES",
|
|
68
|
+
"inject_defaults",
|
|
69
|
+
"merge_overrides",
|
|
70
|
+
"get_param",
|
|
71
|
+
"get_graph_param",
|
|
72
|
+
"get_aliases",
|
|
73
|
+
"VF_KEY",
|
|
74
|
+
"THETA_KEY",
|
|
75
|
+
"VF_PRIMARY",
|
|
76
|
+
"THETA_PRIMARY",
|
|
77
|
+
"DNFR_PRIMARY",
|
|
78
|
+
"EPI_PRIMARY",
|
|
79
|
+
"EPI_KIND_PRIMARY",
|
|
80
|
+
"SI_PRIMARY",
|
|
81
|
+
"dEPI_PRIMARY",
|
|
82
|
+
"D2EPI_PRIMARY",
|
|
83
|
+
"dVF_PRIMARY",
|
|
84
|
+
"D2VF_PRIMARY",
|
|
85
|
+
"dSI_PRIMARY",
|
|
86
|
+
"STATE_STABLE",
|
|
87
|
+
"STATE_TRANSITION",
|
|
88
|
+
"STATE_DISSONANT",
|
|
89
|
+
"CANONICAL_STATE_TOKENS",
|
|
90
|
+
"normalise_state_token",
|
|
91
|
+
"ensure_node_offset_map",
|
|
92
|
+
)
|