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.

Files changed (360) hide show
  1. tnfr/__init__.py +375 -56
  2. tnfr/__init__.pyi +33 -0
  3. tnfr/_compat.py +10 -0
  4. tnfr/_generated_version.py +34 -0
  5. tnfr/_version.py +49 -0
  6. tnfr/_version.pyi +7 -0
  7. tnfr/alias.py +723 -0
  8. tnfr/alias.pyi +108 -0
  9. tnfr/backends/__init__.py +354 -0
  10. tnfr/backends/jax_backend.py +173 -0
  11. tnfr/backends/numpy_backend.py +238 -0
  12. tnfr/backends/optimized_numpy.py +420 -0
  13. tnfr/backends/torch_backend.py +408 -0
  14. tnfr/cache.py +171 -0
  15. tnfr/cache.pyi +13 -0
  16. tnfr/cli/__init__.py +110 -0
  17. tnfr/cli/__init__.pyi +26 -0
  18. tnfr/cli/arguments.py +489 -0
  19. tnfr/cli/arguments.pyi +29 -0
  20. tnfr/cli/execution.py +914 -0
  21. tnfr/cli/execution.pyi +70 -0
  22. tnfr/cli/interactive_validator.py +614 -0
  23. tnfr/cli/utils.py +51 -0
  24. tnfr/cli/utils.pyi +7 -0
  25. tnfr/cli/validate.py +236 -0
  26. tnfr/compat/__init__.py +85 -0
  27. tnfr/compat/dataclass.py +136 -0
  28. tnfr/compat/jsonschema_stub.py +61 -0
  29. tnfr/compat/matplotlib_stub.py +73 -0
  30. tnfr/compat/numpy_stub.py +155 -0
  31. tnfr/config/__init__.py +224 -0
  32. tnfr/config/__init__.pyi +10 -0
  33. tnfr/config/constants.py +104 -0
  34. tnfr/config/constants.pyi +12 -0
  35. tnfr/config/defaults.py +54 -0
  36. tnfr/config/defaults_core.py +212 -0
  37. tnfr/config/defaults_init.py +33 -0
  38. tnfr/config/defaults_metric.py +104 -0
  39. tnfr/config/feature_flags.py +81 -0
  40. tnfr/config/feature_flags.pyi +16 -0
  41. tnfr/config/glyph_constants.py +31 -0
  42. tnfr/config/init.py +77 -0
  43. tnfr/config/init.pyi +8 -0
  44. tnfr/config/operator_names.py +254 -0
  45. tnfr/config/operator_names.pyi +36 -0
  46. tnfr/config/physics_derivation.py +354 -0
  47. tnfr/config/presets.py +83 -0
  48. tnfr/config/presets.pyi +7 -0
  49. tnfr/config/security.py +927 -0
  50. tnfr/config/thresholds.py +114 -0
  51. tnfr/config/tnfr_config.py +498 -0
  52. tnfr/constants/__init__.py +92 -0
  53. tnfr/constants/__init__.pyi +92 -0
  54. tnfr/constants/aliases.py +33 -0
  55. tnfr/constants/aliases.pyi +27 -0
  56. tnfr/constants/init.py +33 -0
  57. tnfr/constants/init.pyi +12 -0
  58. tnfr/constants/metric.py +104 -0
  59. tnfr/constants/metric.pyi +19 -0
  60. tnfr/core/__init__.py +33 -0
  61. tnfr/core/container.py +226 -0
  62. tnfr/core/default_implementations.py +329 -0
  63. tnfr/core/interfaces.py +279 -0
  64. tnfr/dynamics/__init__.py +238 -0
  65. tnfr/dynamics/__init__.pyi +83 -0
  66. tnfr/dynamics/adaptation.py +267 -0
  67. tnfr/dynamics/adaptation.pyi +7 -0
  68. tnfr/dynamics/adaptive_sequences.py +189 -0
  69. tnfr/dynamics/adaptive_sequences.pyi +14 -0
  70. tnfr/dynamics/aliases.py +23 -0
  71. tnfr/dynamics/aliases.pyi +19 -0
  72. tnfr/dynamics/bifurcation.py +232 -0
  73. tnfr/dynamics/canonical.py +229 -0
  74. tnfr/dynamics/canonical.pyi +48 -0
  75. tnfr/dynamics/coordination.py +385 -0
  76. tnfr/dynamics/coordination.pyi +25 -0
  77. tnfr/dynamics/dnfr.py +3034 -0
  78. tnfr/dynamics/dnfr.pyi +26 -0
  79. tnfr/dynamics/dynamic_limits.py +225 -0
  80. tnfr/dynamics/feedback.py +252 -0
  81. tnfr/dynamics/feedback.pyi +24 -0
  82. tnfr/dynamics/fused_dnfr.py +454 -0
  83. tnfr/dynamics/homeostasis.py +157 -0
  84. tnfr/dynamics/homeostasis.pyi +14 -0
  85. tnfr/dynamics/integrators.py +661 -0
  86. tnfr/dynamics/integrators.pyi +36 -0
  87. tnfr/dynamics/learning.py +310 -0
  88. tnfr/dynamics/learning.pyi +33 -0
  89. tnfr/dynamics/metabolism.py +254 -0
  90. tnfr/dynamics/nbody.py +796 -0
  91. tnfr/dynamics/nbody_tnfr.py +783 -0
  92. tnfr/dynamics/propagation.py +326 -0
  93. tnfr/dynamics/runtime.py +908 -0
  94. tnfr/dynamics/runtime.pyi +77 -0
  95. tnfr/dynamics/sampling.py +36 -0
  96. tnfr/dynamics/sampling.pyi +7 -0
  97. tnfr/dynamics/selectors.py +711 -0
  98. tnfr/dynamics/selectors.pyi +85 -0
  99. tnfr/dynamics/structural_clip.py +207 -0
  100. tnfr/errors/__init__.py +37 -0
  101. tnfr/errors/contextual.py +492 -0
  102. tnfr/execution.py +223 -0
  103. tnfr/execution.pyi +45 -0
  104. tnfr/extensions/__init__.py +205 -0
  105. tnfr/extensions/__init__.pyi +18 -0
  106. tnfr/extensions/base.py +173 -0
  107. tnfr/extensions/base.pyi +35 -0
  108. tnfr/extensions/business/__init__.py +71 -0
  109. tnfr/extensions/business/__init__.pyi +11 -0
  110. tnfr/extensions/business/cookbook.py +88 -0
  111. tnfr/extensions/business/cookbook.pyi +8 -0
  112. tnfr/extensions/business/health_analyzers.py +202 -0
  113. tnfr/extensions/business/health_analyzers.pyi +9 -0
  114. tnfr/extensions/business/patterns.py +183 -0
  115. tnfr/extensions/business/patterns.pyi +8 -0
  116. tnfr/extensions/medical/__init__.py +73 -0
  117. tnfr/extensions/medical/__init__.pyi +11 -0
  118. tnfr/extensions/medical/cookbook.py +88 -0
  119. tnfr/extensions/medical/cookbook.pyi +8 -0
  120. tnfr/extensions/medical/health_analyzers.py +181 -0
  121. tnfr/extensions/medical/health_analyzers.pyi +9 -0
  122. tnfr/extensions/medical/patterns.py +163 -0
  123. tnfr/extensions/medical/patterns.pyi +8 -0
  124. tnfr/flatten.py +262 -0
  125. tnfr/flatten.pyi +21 -0
  126. tnfr/gamma.py +354 -0
  127. tnfr/gamma.pyi +36 -0
  128. tnfr/glyph_history.py +377 -0
  129. tnfr/glyph_history.pyi +35 -0
  130. tnfr/glyph_runtime.py +19 -0
  131. tnfr/glyph_runtime.pyi +8 -0
  132. tnfr/immutable.py +218 -0
  133. tnfr/immutable.pyi +36 -0
  134. tnfr/initialization.py +203 -0
  135. tnfr/initialization.pyi +65 -0
  136. tnfr/io.py +10 -0
  137. tnfr/io.pyi +13 -0
  138. tnfr/locking.py +37 -0
  139. tnfr/locking.pyi +7 -0
  140. tnfr/mathematics/__init__.py +79 -0
  141. tnfr/mathematics/backend.py +453 -0
  142. tnfr/mathematics/backend.pyi +99 -0
  143. tnfr/mathematics/dynamics.py +408 -0
  144. tnfr/mathematics/dynamics.pyi +90 -0
  145. tnfr/mathematics/epi.py +391 -0
  146. tnfr/mathematics/epi.pyi +65 -0
  147. tnfr/mathematics/generators.py +242 -0
  148. tnfr/mathematics/generators.pyi +29 -0
  149. tnfr/mathematics/metrics.py +119 -0
  150. tnfr/mathematics/metrics.pyi +16 -0
  151. tnfr/mathematics/operators.py +239 -0
  152. tnfr/mathematics/operators.pyi +59 -0
  153. tnfr/mathematics/operators_factory.py +124 -0
  154. tnfr/mathematics/operators_factory.pyi +11 -0
  155. tnfr/mathematics/projection.py +87 -0
  156. tnfr/mathematics/projection.pyi +33 -0
  157. tnfr/mathematics/runtime.py +182 -0
  158. tnfr/mathematics/runtime.pyi +64 -0
  159. tnfr/mathematics/spaces.py +256 -0
  160. tnfr/mathematics/spaces.pyi +83 -0
  161. tnfr/mathematics/transforms.py +305 -0
  162. tnfr/mathematics/transforms.pyi +62 -0
  163. tnfr/metrics/__init__.py +79 -0
  164. tnfr/metrics/__init__.pyi +20 -0
  165. tnfr/metrics/buffer_cache.py +163 -0
  166. tnfr/metrics/buffer_cache.pyi +24 -0
  167. tnfr/metrics/cache_utils.py +214 -0
  168. tnfr/metrics/coherence.py +2009 -0
  169. tnfr/metrics/coherence.pyi +129 -0
  170. tnfr/metrics/common.py +158 -0
  171. tnfr/metrics/common.pyi +35 -0
  172. tnfr/metrics/core.py +316 -0
  173. tnfr/metrics/core.pyi +13 -0
  174. tnfr/metrics/diagnosis.py +833 -0
  175. tnfr/metrics/diagnosis.pyi +86 -0
  176. tnfr/metrics/emergence.py +245 -0
  177. tnfr/metrics/export.py +179 -0
  178. tnfr/metrics/export.pyi +7 -0
  179. tnfr/metrics/glyph_timing.py +379 -0
  180. tnfr/metrics/glyph_timing.pyi +81 -0
  181. tnfr/metrics/learning_metrics.py +280 -0
  182. tnfr/metrics/learning_metrics.pyi +21 -0
  183. tnfr/metrics/phase_coherence.py +351 -0
  184. tnfr/metrics/phase_compatibility.py +349 -0
  185. tnfr/metrics/reporting.py +183 -0
  186. tnfr/metrics/reporting.pyi +25 -0
  187. tnfr/metrics/sense_index.py +1203 -0
  188. tnfr/metrics/sense_index.pyi +9 -0
  189. tnfr/metrics/trig.py +373 -0
  190. tnfr/metrics/trig.pyi +13 -0
  191. tnfr/metrics/trig_cache.py +233 -0
  192. tnfr/metrics/trig_cache.pyi +10 -0
  193. tnfr/multiscale/__init__.py +32 -0
  194. tnfr/multiscale/hierarchical.py +517 -0
  195. tnfr/node.py +763 -0
  196. tnfr/node.pyi +139 -0
  197. tnfr/observers.py +255 -130
  198. tnfr/observers.pyi +31 -0
  199. tnfr/ontosim.py +144 -137
  200. tnfr/ontosim.pyi +28 -0
  201. tnfr/operators/__init__.py +1672 -0
  202. tnfr/operators/__init__.pyi +31 -0
  203. tnfr/operators/algebra.py +277 -0
  204. tnfr/operators/canonical_patterns.py +420 -0
  205. tnfr/operators/cascade.py +267 -0
  206. tnfr/operators/cycle_detection.py +358 -0
  207. tnfr/operators/definitions.py +4108 -0
  208. tnfr/operators/definitions.pyi +78 -0
  209. tnfr/operators/grammar.py +1164 -0
  210. tnfr/operators/grammar.pyi +140 -0
  211. tnfr/operators/hamiltonian.py +710 -0
  212. tnfr/operators/health_analyzer.py +809 -0
  213. tnfr/operators/jitter.py +272 -0
  214. tnfr/operators/jitter.pyi +11 -0
  215. tnfr/operators/lifecycle.py +314 -0
  216. tnfr/operators/metabolism.py +618 -0
  217. tnfr/operators/metrics.py +2138 -0
  218. tnfr/operators/network_analysis/__init__.py +27 -0
  219. tnfr/operators/network_analysis/source_detection.py +186 -0
  220. tnfr/operators/nodal_equation.py +395 -0
  221. tnfr/operators/pattern_detection.py +660 -0
  222. tnfr/operators/patterns.py +669 -0
  223. tnfr/operators/postconditions/__init__.py +38 -0
  224. tnfr/operators/postconditions/mutation.py +236 -0
  225. tnfr/operators/preconditions/__init__.py +1226 -0
  226. tnfr/operators/preconditions/coherence.py +305 -0
  227. tnfr/operators/preconditions/dissonance.py +236 -0
  228. tnfr/operators/preconditions/emission.py +128 -0
  229. tnfr/operators/preconditions/mutation.py +580 -0
  230. tnfr/operators/preconditions/reception.py +125 -0
  231. tnfr/operators/preconditions/resonance.py +364 -0
  232. tnfr/operators/registry.py +74 -0
  233. tnfr/operators/registry.pyi +9 -0
  234. tnfr/operators/remesh.py +1809 -0
  235. tnfr/operators/remesh.pyi +26 -0
  236. tnfr/operators/structural_units.py +268 -0
  237. tnfr/operators/unified_grammar.py +105 -0
  238. tnfr/parallel/__init__.py +54 -0
  239. tnfr/parallel/auto_scaler.py +234 -0
  240. tnfr/parallel/distributed.py +384 -0
  241. tnfr/parallel/engine.py +238 -0
  242. tnfr/parallel/gpu_engine.py +420 -0
  243. tnfr/parallel/monitoring.py +248 -0
  244. tnfr/parallel/partitioner.py +459 -0
  245. tnfr/py.typed +0 -0
  246. tnfr/recipes/__init__.py +22 -0
  247. tnfr/recipes/cookbook.py +743 -0
  248. tnfr/rng.py +178 -0
  249. tnfr/rng.pyi +26 -0
  250. tnfr/schemas/__init__.py +8 -0
  251. tnfr/schemas/grammar.json +94 -0
  252. tnfr/sdk/__init__.py +107 -0
  253. tnfr/sdk/__init__.pyi +19 -0
  254. tnfr/sdk/adaptive_system.py +173 -0
  255. tnfr/sdk/adaptive_system.pyi +21 -0
  256. tnfr/sdk/builders.py +370 -0
  257. tnfr/sdk/builders.pyi +51 -0
  258. tnfr/sdk/fluent.py +1121 -0
  259. tnfr/sdk/fluent.pyi +74 -0
  260. tnfr/sdk/templates.py +342 -0
  261. tnfr/sdk/templates.pyi +41 -0
  262. tnfr/sdk/utils.py +341 -0
  263. tnfr/secure_config.py +46 -0
  264. tnfr/security/__init__.py +70 -0
  265. tnfr/security/database.py +514 -0
  266. tnfr/security/subprocess.py +503 -0
  267. tnfr/security/validation.py +290 -0
  268. tnfr/selector.py +247 -0
  269. tnfr/selector.pyi +19 -0
  270. tnfr/sense.py +378 -0
  271. tnfr/sense.pyi +23 -0
  272. tnfr/services/__init__.py +17 -0
  273. tnfr/services/orchestrator.py +325 -0
  274. tnfr/sparse/__init__.py +39 -0
  275. tnfr/sparse/representations.py +492 -0
  276. tnfr/structural.py +705 -0
  277. tnfr/structural.pyi +83 -0
  278. tnfr/telemetry/__init__.py +35 -0
  279. tnfr/telemetry/cache_metrics.py +226 -0
  280. tnfr/telemetry/cache_metrics.pyi +64 -0
  281. tnfr/telemetry/nu_f.py +422 -0
  282. tnfr/telemetry/nu_f.pyi +108 -0
  283. tnfr/telemetry/verbosity.py +36 -0
  284. tnfr/telemetry/verbosity.pyi +15 -0
  285. tnfr/tokens.py +58 -0
  286. tnfr/tokens.pyi +36 -0
  287. tnfr/tools/__init__.py +20 -0
  288. tnfr/tools/domain_templates.py +478 -0
  289. tnfr/tools/sequence_generator.py +846 -0
  290. tnfr/topology/__init__.py +13 -0
  291. tnfr/topology/asymmetry.py +151 -0
  292. tnfr/trace.py +543 -0
  293. tnfr/trace.pyi +42 -0
  294. tnfr/tutorials/__init__.py +38 -0
  295. tnfr/tutorials/autonomous_evolution.py +285 -0
  296. tnfr/tutorials/interactive.py +1576 -0
  297. tnfr/tutorials/structural_metabolism.py +238 -0
  298. tnfr/types.py +775 -0
  299. tnfr/types.pyi +357 -0
  300. tnfr/units.py +68 -0
  301. tnfr/units.pyi +13 -0
  302. tnfr/utils/__init__.py +282 -0
  303. tnfr/utils/__init__.pyi +215 -0
  304. tnfr/utils/cache.py +4223 -0
  305. tnfr/utils/cache.pyi +470 -0
  306. tnfr/utils/callbacks.py +375 -0
  307. tnfr/utils/callbacks.pyi +49 -0
  308. tnfr/utils/chunks.py +108 -0
  309. tnfr/utils/chunks.pyi +22 -0
  310. tnfr/utils/data.py +428 -0
  311. tnfr/utils/data.pyi +74 -0
  312. tnfr/utils/graph.py +85 -0
  313. tnfr/utils/graph.pyi +10 -0
  314. tnfr/utils/init.py +821 -0
  315. tnfr/utils/init.pyi +80 -0
  316. tnfr/utils/io.py +559 -0
  317. tnfr/utils/io.pyi +66 -0
  318. tnfr/utils/numeric.py +114 -0
  319. tnfr/utils/numeric.pyi +21 -0
  320. tnfr/validation/__init__.py +257 -0
  321. tnfr/validation/__init__.pyi +85 -0
  322. tnfr/validation/compatibility.py +460 -0
  323. tnfr/validation/compatibility.pyi +6 -0
  324. tnfr/validation/config.py +73 -0
  325. tnfr/validation/graph.py +139 -0
  326. tnfr/validation/graph.pyi +18 -0
  327. tnfr/validation/input_validation.py +755 -0
  328. tnfr/validation/invariants.py +712 -0
  329. tnfr/validation/rules.py +253 -0
  330. tnfr/validation/rules.pyi +44 -0
  331. tnfr/validation/runtime.py +279 -0
  332. tnfr/validation/runtime.pyi +28 -0
  333. tnfr/validation/sequence_validator.py +162 -0
  334. tnfr/validation/soft_filters.py +170 -0
  335. tnfr/validation/soft_filters.pyi +32 -0
  336. tnfr/validation/spectral.py +164 -0
  337. tnfr/validation/spectral.pyi +42 -0
  338. tnfr/validation/validator.py +1266 -0
  339. tnfr/validation/window.py +39 -0
  340. tnfr/validation/window.pyi +1 -0
  341. tnfr/visualization/__init__.py +98 -0
  342. tnfr/visualization/cascade_viz.py +256 -0
  343. tnfr/visualization/hierarchy.py +284 -0
  344. tnfr/visualization/sequence_plotter.py +784 -0
  345. tnfr/viz/__init__.py +60 -0
  346. tnfr/viz/matplotlib.py +278 -0
  347. tnfr/viz/matplotlib.pyi +35 -0
  348. tnfr-8.5.0.dist-info/METADATA +573 -0
  349. tnfr-8.5.0.dist-info/RECORD +353 -0
  350. tnfr-8.5.0.dist-info/entry_points.txt +3 -0
  351. tnfr-3.0.3.dist-info/licenses/LICENSE.txt → tnfr-8.5.0.dist-info/licenses/LICENSE.md +1 -1
  352. tnfr/constants.py +0 -183
  353. tnfr/dynamics.py +0 -543
  354. tnfr/helpers.py +0 -198
  355. tnfr/main.py +0 -37
  356. tnfr/operators.py +0 -296
  357. tnfr-3.0.3.dist-info/METADATA +0 -35
  358. tnfr-3.0.3.dist-info/RECORD +0 -13
  359. {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
  360. {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
+ )