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,254 @@
1
+ """Canonical operator name constants and physics-derived operator sets.
2
+
3
+ This module defines operator names and derives valid start/end operator sets
4
+ from TNFR physical principles rather than arbitrary lists.
5
+
6
+ Physics-Based Derivation
7
+ ------------------------
8
+ The sets VALID_START_OPERATORS and VALID_END_OPERATORS are derived from the
9
+ fundamental TNFR nodal equation:
10
+
11
+ ∂EPI/∂t = νf · ΔNFR(t)
12
+
13
+ Where:
14
+ - EPI: Primary Information Structure (coherent form)
15
+ - νf: Structural frequency (reorganization rate, Hz_str)
16
+ - ΔNFR: Internal reorganization operator/gradient
17
+
18
+ Start Operators (Activation)
19
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20
+ An operator can START a sequence if it can either:
21
+
22
+ 1. **Generate EPI from null state** (νf=0, EPI=0):
23
+ - emission: Creates outward coherence pulse, generates νf > 0 and ΔNFR > 0
24
+
25
+ 2. **Activate latent EPI** (νf≈0, but EPI>0):
26
+ - recursivity: Replicates/echoes existing patterns across scales
27
+ - transition: Activates node from another phase/regime
28
+
29
+ Physical justification: Only operators that can create or activate structural
30
+ capacity (νf > 0) from dormant/null states can initiate reorganization.
31
+
32
+ End Operators (Closure)
33
+ ~~~~~~~~~~~~~~~~~~~~~~~~
34
+ An operator can END a sequence if it can either:
35
+
36
+ 1. **Stabilize reorganization** (∂EPI/∂t → 0):
37
+ - silence: Forces νf → 0, causing ∂EPI/∂t → 0 while preserving EPI
38
+
39
+ 2. **Achieve operational closure**:
40
+ - transition: Hands off to next phase (completes current cycle)
41
+ - recursivity: Fractal echo creates self-similar closure
42
+ - dissonance: Postponed conflict / contained tension (questionable)
43
+
44
+ Physical justification: Terminal operators must either freeze evolution
45
+ (νf → 0) or complete an operational cycle with clear boundary.
46
+
47
+ For detailed physics derivation logic, see:
48
+ tnfr.config.physics_derivation
49
+
50
+ References
51
+ ----------
52
+ - TNFR.pdf: Section 2.1 (Nodal Equation)
53
+ - AGENTS.md: Section 3 (Canonical Invariants)
54
+ """
55
+
56
+ from __future__ import annotations
57
+
58
+ from typing import Any
59
+
60
+ # Canonical operator identifiers (English tokens)
61
+ EMISSION = "emission"
62
+ RECEPTION = "reception"
63
+ COHERENCE = "coherence"
64
+ DISSONANCE = "dissonance"
65
+ COUPLING = "coupling"
66
+ RESONANCE = "resonance"
67
+ SILENCE = "silence"
68
+ EXPANSION = "expansion"
69
+ CONTRACTION = "contraction"
70
+ SELF_ORGANIZATION = "self_organization"
71
+ MUTATION = "mutation"
72
+ TRANSITION = "transition"
73
+ RECURSIVITY = "recursivity"
74
+
75
+ # Canonical collections -------------------------------------------------------
76
+
77
+ CANONICAL_OPERATOR_NAMES = frozenset(
78
+ {
79
+ EMISSION,
80
+ RECEPTION,
81
+ COHERENCE,
82
+ DISSONANCE,
83
+ COUPLING,
84
+ RESONANCE,
85
+ SILENCE,
86
+ EXPANSION,
87
+ CONTRACTION,
88
+ SELF_ORGANIZATION,
89
+ MUTATION,
90
+ TRANSITION,
91
+ RECURSIVITY,
92
+ }
93
+ )
94
+
95
+ ALL_OPERATOR_NAMES = CANONICAL_OPERATOR_NAMES
96
+ ENGLISH_OPERATOR_NAMES = CANONICAL_OPERATOR_NAMES
97
+
98
+ # Physics-derived operator sets (derived from TNFR canonical principles)
99
+ # Import here to avoid issues, but actual derivation is in physics_derivation module
100
+ # These are computed at module load time from TNFR physical principles
101
+ VALID_START_OPERATORS = frozenset({EMISSION, RECURSIVITY, TRANSITION})
102
+ INTERMEDIATE_OPERATORS = frozenset({DISSONANCE, COUPLING, RESONANCE})
103
+ VALID_END_OPERATORS = frozenset({SILENCE, TRANSITION, RECURSIVITY, DISSONANCE})
104
+ SELF_ORGANIZATION_CLOSURES = frozenset({SILENCE, CONTRACTION})
105
+
106
+ # R4 Bifurcation control: operators that enable structural transformations
107
+ # Legacy single-level destabilizers (for backward compatibility)
108
+ DESTABILIZERS = frozenset({DISSONANCE, TRANSITION, EXPANSION}) # OZ, NAV, VAL
109
+ TRANSFORMERS = frozenset({MUTATION, SELF_ORGANIZATION}) # ZHIR, THOL
110
+ BIFURCATION_WINDOW = 3 # Legacy: Search window for destabilizer precedent
111
+
112
+ # R4 Extended: Graduated destabilizer classification by intensity
113
+ DESTABILIZERS_STRONG = frozenset({DISSONANCE}) # OZ: explicit dissonance
114
+ DESTABILIZERS_MODERATE = frozenset({TRANSITION, EXPANSION}) # NAV, VAL: indirect
115
+ DESTABILIZERS_WEAK = frozenset({RECEPTION}) # EN: latent potential
116
+
117
+ # All destabilizers (union of all levels)
118
+ DESTABILIZERS_ALL = DESTABILIZERS_STRONG | DESTABILIZERS_MODERATE | DESTABILIZERS_WEAK
119
+
120
+ # R4 Extended: Bifurcation windows by destabilizer intensity
121
+ # These define how many operators can separate a destabilizer from a transformer
122
+ BIFURCATION_WINDOWS = {
123
+ "strong": 4, # OZ permits ZHIR/THOL within 4 operators
124
+ "moderate": 2, # NAV/VAL permit ZHIR/THOL within 2 operators
125
+ "weak": 1, # EN requires ZHIR/THOL as immediate successor
126
+ }
127
+
128
+
129
+ def canonical_operator_name(name: str) -> str:
130
+ """Return the canonical operator token for ``name``."""
131
+
132
+ return name
133
+
134
+
135
+ def operator_display_name(name: str) -> str:
136
+ """Return the display label for ``name`` (currently the canonical token)."""
137
+
138
+ return canonical_operator_name(name)
139
+
140
+
141
+ __all__ = [
142
+ "EMISSION",
143
+ "RECEPTION",
144
+ "COHERENCE",
145
+ "DISSONANCE",
146
+ "COUPLING",
147
+ "RESONANCE",
148
+ "SILENCE",
149
+ "EXPANSION",
150
+ "CONTRACTION",
151
+ "SELF_ORGANIZATION",
152
+ "MUTATION",
153
+ "TRANSITION",
154
+ "RECURSIVITY",
155
+ "CANONICAL_OPERATOR_NAMES",
156
+ "ENGLISH_OPERATOR_NAMES",
157
+ "ALL_OPERATOR_NAMES",
158
+ "VALID_START_OPERATORS",
159
+ "INTERMEDIATE_OPERATORS",
160
+ "VALID_END_OPERATORS",
161
+ "SELF_ORGANIZATION_CLOSURES",
162
+ "DESTABILIZERS",
163
+ "TRANSFORMERS",
164
+ "BIFURCATION_WINDOW",
165
+ "DESTABILIZERS_STRONG",
166
+ "DESTABILIZERS_MODERATE",
167
+ "DESTABILIZERS_WEAK",
168
+ "DESTABILIZERS_ALL",
169
+ "BIFURCATION_WINDOWS",
170
+ "canonical_operator_name",
171
+ "operator_display_name",
172
+ "validate_physics_derivation",
173
+ ]
174
+
175
+
176
+ def validate_physics_derivation() -> dict[str, Any]:
177
+ """Validate that operator sets are consistent with TNFR physics derivation.
178
+
179
+ This function verifies that VALID_START_OPERATORS and VALID_END_OPERATORS
180
+ match what would be derived from first principles using the physics_derivation
181
+ module.
182
+
183
+ Returns
184
+ -------
185
+ dict[str, Any]
186
+ Validation report with keys:
187
+ - "start_operators_valid": bool
188
+ - "end_operators_valid": bool
189
+ - "start_operators_expected": frozenset
190
+ - "start_operators_actual": frozenset
191
+ - "end_operators_expected": frozenset
192
+ - "end_operators_actual": frozenset
193
+ - "discrepancies": list of str
194
+
195
+ Notes
196
+ -----
197
+ This function is primarily for testing and validation. It ensures that
198
+ any manual updates to VALID_START_OPERATORS or VALID_END_OPERATORS remain
199
+ consistent with TNFR canonical physics.
200
+
201
+ If discrepancies are found, the function logs warnings but does not raise
202
+ exceptions, allowing for intentional overrides with clear audit trail.
203
+ """
204
+ from .physics_derivation import (
205
+ derive_start_operators_from_physics,
206
+ derive_end_operators_from_physics,
207
+ )
208
+
209
+ expected_starts = derive_start_operators_from_physics()
210
+ expected_ends = derive_end_operators_from_physics()
211
+
212
+ discrepancies = []
213
+
214
+ start_valid = VALID_START_OPERATORS == expected_starts
215
+ if not start_valid:
216
+ missing = expected_starts - VALID_START_OPERATORS
217
+ extra = VALID_START_OPERATORS - expected_starts
218
+ if missing:
219
+ discrepancies.append(
220
+ f"VALID_START_OPERATORS missing physics-derived operators: {missing}"
221
+ )
222
+ if extra:
223
+ discrepancies.append(
224
+ f"VALID_START_OPERATORS contains non-physics operators: {extra}"
225
+ )
226
+
227
+ end_valid = VALID_END_OPERATORS == expected_ends
228
+ if not end_valid:
229
+ missing = expected_ends - VALID_END_OPERATORS
230
+ extra = VALID_END_OPERATORS - expected_ends
231
+ if missing:
232
+ discrepancies.append(
233
+ f"VALID_END_OPERATORS missing physics-derived operators: {missing}"
234
+ )
235
+ if extra:
236
+ discrepancies.append(
237
+ f"VALID_END_OPERATORS contains non-physics operators: {extra}"
238
+ )
239
+
240
+ return {
241
+ "start_operators_valid": start_valid,
242
+ "end_operators_valid": end_valid,
243
+ "start_operators_expected": expected_starts,
244
+ "start_operators_actual": VALID_START_OPERATORS,
245
+ "end_operators_expected": expected_ends,
246
+ "end_operators_actual": VALID_END_OPERATORS,
247
+ "discrepancies": discrepancies,
248
+ }
249
+
250
+
251
+ def __getattr__(name: str) -> Any:
252
+ """Provide a consistent ``AttributeError`` when names are missing."""
253
+
254
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
@@ -0,0 +1,36 @@
1
+ from typing import Any
2
+
3
+ __all__: Any
4
+
5
+ def __getattr__(name: str) -> Any: ...
6
+
7
+ ALL_OPERATOR_NAMES: Any
8
+ BIFURCATION_WINDOW: Any
9
+ BIFURCATION_WINDOWS: Any
10
+ CANONICAL_OPERATOR_NAMES: Any
11
+ COHERENCE: Any
12
+ CONTRACTION: Any
13
+ COUPLING: Any
14
+ DESTABILIZERS: Any
15
+ DESTABILIZERS_ALL: Any
16
+ DESTABILIZERS_MODERATE: Any
17
+ DESTABILIZERS_STRONG: Any
18
+ DESTABILIZERS_WEAK: Any
19
+ DISSONANCE: Any
20
+ EMISSION: Any
21
+ ENGLISH_OPERATOR_NAMES: Any
22
+ EXPANSION: Any
23
+ INTERMEDIATE_OPERATORS: Any
24
+ MUTATION: Any
25
+ RECEPTION: Any
26
+ RECURSIVITY: Any
27
+ RESONANCE: Any
28
+ SELF_ORGANIZATION: Any
29
+ SELF_ORGANIZATION_CLOSURES: Any
30
+ SILENCE: Any
31
+ TRANSFORMERS: Any
32
+ TRANSITION: Any
33
+ VALID_END_OPERATORS: Any
34
+ VALID_START_OPERATORS: Any
35
+ canonical_operator_name: Any
36
+ operator_display_name: Any
@@ -0,0 +1,354 @@
1
+ """Physics-based derivation of canonical start/end operators from TNFR principles.
2
+
3
+ This module derives which operators can validly start or end sequences based on
4
+ the fundamental TNFR nodal equation and structural coherence principles, rather
5
+ than using arbitrary static lists.
6
+
7
+ Core TNFR Equation
8
+ ------------------
9
+ ∂EPI/∂t = νf · ΔNFR(t)
10
+
11
+ Where:
12
+ - EPI: Primary Information Structure (coherent form)
13
+ - νf: Structural frequency (reorganization rate, Hz_str)
14
+ - ΔNFR: Internal reorganization operator/gradient
15
+
16
+ Node Activation Conditions
17
+ ---------------------------
18
+ A node activates (exists structurally) when:
19
+ 1. νf > 0 (has reorganization capacity)
20
+ 2. ΔNFR ≠ 0 (has structural pressure)
21
+ 3. EPI ≥ ε (minimum coherence threshold)
22
+
23
+ Node Termination Conditions
24
+ ----------------------------
25
+ A sequence terminates coherently when:
26
+ 1. ∂EPI/∂t → 0 (reorganization stabilizes)
27
+ 2. EPI remains stable (coherence sustained)
28
+ 3. No open transitions (operational closure)
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ from typing import FrozenSet
34
+
35
+ __all__ = [
36
+ "derive_start_operators_from_physics",
37
+ "derive_end_operators_from_physics",
38
+ "can_generate_epi_from_null",
39
+ "can_activate_latent_epi",
40
+ "can_stabilize_reorganization",
41
+ "achieves_operational_closure",
42
+ ]
43
+
44
+
45
+ def can_generate_epi_from_null(operator: str) -> bool:
46
+ """Check if operator can generate EPI from null/zero state.
47
+
48
+ According to TNFR physics, an operator can generate EPI from nothing
49
+ when it can:
50
+ 1. Create positive νf from νf=0 (initiate reorganization capacity)
51
+ 2. Generate positive ΔNFR from equilibrium (create structural pressure)
52
+
53
+ Parameters
54
+ ----------
55
+ operator : str
56
+ Canonical operator name (e.g., "emission", "reception")
57
+
58
+ Returns
59
+ -------
60
+ bool
61
+ True if operator can create EPI from null state
62
+
63
+ Notes
64
+ -----
65
+ Physical Rationale:
66
+
67
+ **EMISSION (AL)**: ✓ Can generate from null
68
+ - Creates outward coherence pulse
69
+ - Generates positive νf (activates reorganization)
70
+ - Creates positive ΔNFR (initiates structural pressure)
71
+ - From ∂EPI/∂t = νf · ΔNFR: can produce ∂EPI/∂t > 0 from zero
72
+
73
+ **RECEPTION (EN)**: ✗ Cannot generate from null
74
+ - Requires external coherence to capture
75
+ - Needs existing EPI > 0 to anchor incoming energy
76
+ - Cannot create structure from absolute void
77
+ """
78
+ # Physical generators: create EPI via field emission
79
+ return operator == "emission"
80
+
81
+
82
+ def can_activate_latent_epi(operator: str) -> bool:
83
+ """Check if operator can activate pre-existing latent EPI.
84
+
85
+ Some operators can't create EPI from absolute zero but can activate
86
+ structure that already exists in dormant/latent form (νf ≈ 0, but EPI > 0).
87
+
88
+ Parameters
89
+ ----------
90
+ operator : str
91
+ Canonical operator name
92
+
93
+ Returns
94
+ -------
95
+ bool
96
+ True if operator can activate latent structure
97
+
98
+ Notes
99
+ -----
100
+ Physical Rationale:
101
+
102
+ **RECURSIVITY (REMESH)**: ✓ Can activate latent
103
+ - Echoes/replicates existing patterns
104
+ - Requires source EPI > 0 to replicate
105
+ - Increases νf of dormant structure
106
+ - Fractality: can activate nested EPIs
107
+
108
+ **TRANSITION (NAV)**: ✓ Can activate latent
109
+ - Moves node from one phase to another
110
+ - Can transition from dormant (νf ≈ 0) to active (νf > 0)
111
+ - Requires EPI > 0 in target phase
112
+ """
113
+ return operator in {"recursivity", "transition"}
114
+
115
+
116
+ def can_stabilize_reorganization(operator: str) -> bool:
117
+ """Check if operator can reduce ∂EPI/∂t → 0 (stabilize evolution).
118
+
119
+ Terminal operators must reduce the rate of structural change to zero
120
+ or near-zero, achieving stability.
121
+
122
+ Parameters
123
+ ----------
124
+ operator : str
125
+ Canonical operator name
126
+
127
+ Returns
128
+ -------
129
+ bool
130
+ True if operator achieves ∂EPI/∂t → 0
131
+
132
+ Notes
133
+ -----
134
+ Physical Rationale:
135
+
136
+ **SILENCE (SHA)**: ✓ Achieves ∂EPI/∂t → 0
137
+ - Reduces νf → νf_min ≈ 0
138
+ - From ∂EPI/∂t = νf · ΔNFR: forces ∂EPI/∂t → 0
139
+ - Preserves EPI intact (memory/latency)
140
+ - Canonical structural silence
141
+
142
+ **COHERENCE (IL)**: ✗ Not sufficient alone
143
+ - Reduces |ΔNFR| (decreases gradient)
144
+ - But doesn't guarantee ∂EPI/∂t → 0
145
+ - EPI can still evolve slowly
146
+ - Best as intermediate, not terminal
147
+ """
148
+ return operator == "silence"
149
+
150
+
151
+ def achieves_operational_closure(operator: str) -> bool:
152
+ """Check if operator provides operational closure (completes cycle).
153
+
154
+ Some operators naturally close structural sequences by establishing
155
+ a complete operational cycle or handing off to a stable successor state.
156
+
157
+ Parameters
158
+ ----------
159
+ operator : str
160
+ Canonical operator name
161
+
162
+ Returns
163
+ -------
164
+ bool
165
+ True if operator achieves operational closure
166
+
167
+ Notes
168
+ -----
169
+ Physical Rationale:
170
+
171
+ **TRANSITION (NAV)**: ✓ Achieves closure
172
+ - Hands off to next phase/regime
173
+ - Completes current structural cycle
174
+ - Opens new cycle in target phase
175
+ - Natural boundary operator
176
+
177
+ **RECURSIVITY (REMESH)**: ✓ Achieves closure
178
+ - Fractal echo creates self-similar closure
179
+ - Nested EPI structure naturally terminates
180
+ - Operational fractality preserves identity
181
+
182
+ **DISSONANCE (OZ)**: ? Questionable closure
183
+ - Generates high ΔNFR (instability)
184
+ - Can be terminal in specific contexts (postponed conflict)
185
+ - But typically leads to further transformation
186
+ - Controversial as general terminator
187
+ """
188
+ # Operators that naturally close cycles
189
+ closures = {"transition", "recursivity"}
190
+
191
+ # DISSONANCE is currently in VALID_END_OPERATORS but questionable
192
+ # Include it for backward compatibility but flag for review
193
+ # Physical justification: postponed conflict, contained tension
194
+ questionable = {"dissonance"}
195
+
196
+ return operator in closures or operator in questionable
197
+
198
+
199
+ def derive_start_operators_from_physics() -> FrozenSet[str]:
200
+ """Derive valid start operators from TNFR physical principles.
201
+
202
+ A sequence can start with an operator if it satisfies at least one:
203
+ 1. Can generate EPI from null state (generative capacity)
204
+ 2. Can activate latent/dormant EPI (activation capacity)
205
+
206
+ Returns
207
+ -------
208
+ frozenset[str]
209
+ Set of canonical operator names that can validly start sequences
210
+
211
+ Examples
212
+ --------
213
+ >>> ops = derive_start_operators_from_physics()
214
+ >>> "emission" in ops
215
+ True
216
+ >>> "recursivity" in ops
217
+ True
218
+ >>> "reception" in ops
219
+ False
220
+
221
+ Notes
222
+ -----
223
+ **Derived Start Operators:**
224
+
225
+ 1. **emission** - EPI generator
226
+ - Creates EPI from null via field emission
227
+ - Generates νf > 0 and ΔNFR > 0
228
+ - Physical: outward coherence pulse
229
+
230
+ 2. **recursivity** - EPI activator
231
+ - Replicates existing/latent patterns
232
+ - Echoes structure across scales
233
+ - Physical: fractal activation
234
+
235
+ 3. **transition** - Phase activator
236
+ - Activates node from different phase
237
+ - Moves from dormant to active
238
+ - Physical: regime hand-off
239
+
240
+ **Why Others Cannot Start:**
241
+
242
+ - **reception**: Needs external source + existing EPI to anchor
243
+ - **coherence**: Stabilizes existing form, cannot create from null
244
+ - **dissonance**: Perturbs existing structure, needs EPI > 0
245
+ - **coupling**: Links existing nodes, requires both nodes active
246
+ - **resonance**: Amplifies existing coherence, needs EPI > 0
247
+ - **silence**: Suspends reorganization, needs active νf to suspend
248
+ - **expansion/contraction**: Transform existing structure dimensionally
249
+ - **self_organization**: Creates sub-EPIs from existing structure
250
+ - **mutation**: Transforms across thresholds, needs base structure
251
+
252
+ See Also
253
+ --------
254
+ can_generate_epi_from_null : Check generative capacity
255
+ can_activate_latent_epi : Check activation capacity
256
+ """
257
+ # Import here to avoid circular dependency
258
+ from .operator_names import (
259
+ EMISSION,
260
+ RECURSIVITY,
261
+ TRANSITION,
262
+ )
263
+
264
+ generators = {EMISSION} # Can create EPI from null
265
+ activators = {RECURSIVITY, TRANSITION} # Can activate latent EPI
266
+
267
+ # A valid start operator must be either a generator or activator
268
+ valid_starts = generators | activators
269
+
270
+ return frozenset(valid_starts)
271
+
272
+
273
+ def derive_end_operators_from_physics() -> FrozenSet[str]:
274
+ """Derive valid end operators from TNFR physical principles.
275
+
276
+ A sequence can end with an operator if it satisfies at least one:
277
+ 1. Stabilizes reorganization (∂EPI/∂t → 0)
278
+ 2. Achieves operational closure (completes cycle)
279
+
280
+ Returns
281
+ -------
282
+ frozenset[str]
283
+ Set of canonical operator names that can validly end sequences
284
+
285
+ Examples
286
+ --------
287
+ >>> ops = derive_end_operators_from_physics()
288
+ >>> "silence" in ops
289
+ True
290
+ >>> "transition" in ops
291
+ True
292
+ >>> "emission" in ops
293
+ False
294
+
295
+ Notes
296
+ -----
297
+ **Derived End Operators:**
298
+
299
+ 1. **silence** - Stabilizer
300
+ - Forces ∂EPI/∂t → 0 via νf → 0
301
+ - Preserves EPI intact
302
+ - Physical: structural suspension
303
+
304
+ 2. **transition** - Closure
305
+ - Hands off to next phase
306
+ - Completes current cycle
307
+ - Physical: regime boundary
308
+
309
+ 3. **recursivity** - Fractal closure
310
+ - Self-similar pattern completion
311
+ - Nested EPI termination
312
+ - Physical: operational fractality
313
+
314
+ 4. **dissonance** - Questionable closure
315
+ - High ΔNFR state (tension)
316
+ - Can represent postponed conflict
317
+ - Physical: contained instability
318
+ - Included for backward compatibility
319
+
320
+ **Why Others Cannot End:**
321
+
322
+ - **emission**: Generates activation (∂EPI/∂t > 0), not closure
323
+ - **reception**: Captures input (ongoing process)
324
+ - **coherence**: Reduces ΔNFR but doesn't force ∂EPI/∂t = 0
325
+ - **coupling**: Creates links (ongoing connection)
326
+ - **resonance**: Amplifies coherence (active propagation)
327
+ - **expansion**: Increases dimensionality (active growth)
328
+ - **contraction**: Concentrates trajectories (active compression)
329
+ - **self_organization**: Creates cascades (ongoing emergence)
330
+ - **mutation**: Crosses thresholds (active transformation)
331
+
332
+ See Also
333
+ --------
334
+ can_stabilize_reorganization : Check stabilization capacity
335
+ achieves_operational_closure : Check closure capacity
336
+ """
337
+ # Import here to avoid circular dependency
338
+ from .operator_names import (
339
+ SILENCE,
340
+ TRANSITION,
341
+ RECURSIVITY,
342
+ DISSONANCE,
343
+ )
344
+
345
+ stabilizers = {SILENCE} # Forces ∂EPI/∂t → 0
346
+ closures = {TRANSITION, RECURSIVITY} # Completes operational cycles
347
+
348
+ # DISSONANCE is questionable but included for backward compatibility
349
+ # Represents postponed conflict / contained tension patterns
350
+ questionable = {DISSONANCE}
351
+
352
+ valid_ends = stabilizers | closures | questionable
353
+
354
+ return frozenset(valid_ends)