tnfr 4.5.2__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 (365) hide show
  1. tnfr/__init__.py +334 -50
  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 +214 -37
  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 +149 -556
  15. tnfr/cache.pyi +13 -0
  16. tnfr/cli/__init__.py +51 -16
  17. tnfr/cli/__init__.pyi +26 -0
  18. tnfr/cli/arguments.py +344 -32
  19. tnfr/cli/arguments.pyi +29 -0
  20. tnfr/cli/execution.py +676 -50
  21. tnfr/cli/execution.pyi +70 -0
  22. tnfr/cli/interactive_validator.py +614 -0
  23. tnfr/cli/utils.py +18 -3
  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/{constants_glyphs.py → config/constants.py} +26 -20
  34. tnfr/config/constants.pyi +12 -0
  35. tnfr/config/defaults.py +54 -0
  36. tnfr/{constants/core.py → config/defaults_core.py} +59 -6
  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 +51 -133
  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 +3 -1
  57. tnfr/constants/init.pyi +12 -0
  58. tnfr/constants/metric.py +9 -15
  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 +213 -633
  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 +2699 -398
  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 +496 -102
  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 +10 -5
  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 +77 -55
  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 +29 -50
  125. tnfr/flatten.pyi +21 -0
  126. tnfr/gamma.py +66 -53
  127. tnfr/gamma.pyi +36 -0
  128. tnfr/glyph_history.py +144 -57
  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 +70 -30
  133. tnfr/immutable.pyi +36 -0
  134. tnfr/initialization.py +22 -16
  135. tnfr/initialization.pyi +65 -0
  136. tnfr/io.py +5 -241
  137. tnfr/io.pyi +13 -0
  138. tnfr/locking.pyi +7 -0
  139. tnfr/mathematics/__init__.py +79 -0
  140. tnfr/mathematics/backend.py +453 -0
  141. tnfr/mathematics/backend.pyi +99 -0
  142. tnfr/mathematics/dynamics.py +408 -0
  143. tnfr/mathematics/dynamics.pyi +90 -0
  144. tnfr/mathematics/epi.py +391 -0
  145. tnfr/mathematics/epi.pyi +65 -0
  146. tnfr/mathematics/generators.py +242 -0
  147. tnfr/mathematics/generators.pyi +29 -0
  148. tnfr/mathematics/metrics.py +119 -0
  149. tnfr/mathematics/metrics.pyi +16 -0
  150. tnfr/mathematics/operators.py +239 -0
  151. tnfr/mathematics/operators.pyi +59 -0
  152. tnfr/mathematics/operators_factory.py +124 -0
  153. tnfr/mathematics/operators_factory.pyi +11 -0
  154. tnfr/mathematics/projection.py +87 -0
  155. tnfr/mathematics/projection.pyi +33 -0
  156. tnfr/mathematics/runtime.py +182 -0
  157. tnfr/mathematics/runtime.pyi +64 -0
  158. tnfr/mathematics/spaces.py +256 -0
  159. tnfr/mathematics/spaces.pyi +83 -0
  160. tnfr/mathematics/transforms.py +305 -0
  161. tnfr/mathematics/transforms.pyi +62 -0
  162. tnfr/metrics/__init__.py +47 -9
  163. tnfr/metrics/__init__.pyi +20 -0
  164. tnfr/metrics/buffer_cache.py +163 -0
  165. tnfr/metrics/buffer_cache.pyi +24 -0
  166. tnfr/metrics/cache_utils.py +214 -0
  167. tnfr/metrics/coherence.py +1510 -330
  168. tnfr/metrics/coherence.pyi +129 -0
  169. tnfr/metrics/common.py +23 -16
  170. tnfr/metrics/common.pyi +35 -0
  171. tnfr/metrics/core.py +251 -36
  172. tnfr/metrics/core.pyi +13 -0
  173. tnfr/metrics/diagnosis.py +709 -110
  174. tnfr/metrics/diagnosis.pyi +86 -0
  175. tnfr/metrics/emergence.py +245 -0
  176. tnfr/metrics/export.py +60 -18
  177. tnfr/metrics/export.pyi +7 -0
  178. tnfr/metrics/glyph_timing.py +233 -43
  179. tnfr/metrics/glyph_timing.pyi +81 -0
  180. tnfr/metrics/learning_metrics.py +280 -0
  181. tnfr/metrics/learning_metrics.pyi +21 -0
  182. tnfr/metrics/phase_coherence.py +351 -0
  183. tnfr/metrics/phase_compatibility.py +349 -0
  184. tnfr/metrics/reporting.py +63 -28
  185. tnfr/metrics/reporting.pyi +25 -0
  186. tnfr/metrics/sense_index.py +1126 -43
  187. tnfr/metrics/sense_index.pyi +9 -0
  188. tnfr/metrics/trig.py +215 -23
  189. tnfr/metrics/trig.pyi +13 -0
  190. tnfr/metrics/trig_cache.py +148 -24
  191. tnfr/metrics/trig_cache.pyi +10 -0
  192. tnfr/multiscale/__init__.py +32 -0
  193. tnfr/multiscale/hierarchical.py +517 -0
  194. tnfr/node.py +646 -140
  195. tnfr/node.pyi +139 -0
  196. tnfr/observers.py +160 -45
  197. tnfr/observers.pyi +31 -0
  198. tnfr/ontosim.py +23 -19
  199. tnfr/ontosim.pyi +28 -0
  200. tnfr/operators/__init__.py +1358 -106
  201. tnfr/operators/__init__.pyi +31 -0
  202. tnfr/operators/algebra.py +277 -0
  203. tnfr/operators/canonical_patterns.py +420 -0
  204. tnfr/operators/cascade.py +267 -0
  205. tnfr/operators/cycle_detection.py +358 -0
  206. tnfr/operators/definitions.py +4108 -0
  207. tnfr/operators/definitions.pyi +78 -0
  208. tnfr/operators/grammar.py +1164 -0
  209. tnfr/operators/grammar.pyi +140 -0
  210. tnfr/operators/hamiltonian.py +710 -0
  211. tnfr/operators/health_analyzer.py +809 -0
  212. tnfr/operators/jitter.py +107 -38
  213. tnfr/operators/jitter.pyi +11 -0
  214. tnfr/operators/lifecycle.py +314 -0
  215. tnfr/operators/metabolism.py +618 -0
  216. tnfr/operators/metrics.py +2138 -0
  217. tnfr/operators/network_analysis/__init__.py +27 -0
  218. tnfr/operators/network_analysis/source_detection.py +186 -0
  219. tnfr/operators/nodal_equation.py +395 -0
  220. tnfr/operators/pattern_detection.py +660 -0
  221. tnfr/operators/patterns.py +669 -0
  222. tnfr/operators/postconditions/__init__.py +38 -0
  223. tnfr/operators/postconditions/mutation.py +236 -0
  224. tnfr/operators/preconditions/__init__.py +1226 -0
  225. tnfr/operators/preconditions/coherence.py +305 -0
  226. tnfr/operators/preconditions/dissonance.py +236 -0
  227. tnfr/operators/preconditions/emission.py +128 -0
  228. tnfr/operators/preconditions/mutation.py +580 -0
  229. tnfr/operators/preconditions/reception.py +125 -0
  230. tnfr/operators/preconditions/resonance.py +364 -0
  231. tnfr/operators/registry.py +74 -0
  232. tnfr/operators/registry.pyi +9 -0
  233. tnfr/operators/remesh.py +1415 -91
  234. tnfr/operators/remesh.pyi +26 -0
  235. tnfr/operators/structural_units.py +268 -0
  236. tnfr/operators/unified_grammar.py +105 -0
  237. tnfr/parallel/__init__.py +54 -0
  238. tnfr/parallel/auto_scaler.py +234 -0
  239. tnfr/parallel/distributed.py +384 -0
  240. tnfr/parallel/engine.py +238 -0
  241. tnfr/parallel/gpu_engine.py +420 -0
  242. tnfr/parallel/monitoring.py +248 -0
  243. tnfr/parallel/partitioner.py +459 -0
  244. tnfr/py.typed +0 -0
  245. tnfr/recipes/__init__.py +22 -0
  246. tnfr/recipes/cookbook.py +743 -0
  247. tnfr/rng.py +75 -151
  248. tnfr/rng.pyi +26 -0
  249. tnfr/schemas/__init__.py +8 -0
  250. tnfr/schemas/grammar.json +94 -0
  251. tnfr/sdk/__init__.py +107 -0
  252. tnfr/sdk/__init__.pyi +19 -0
  253. tnfr/sdk/adaptive_system.py +173 -0
  254. tnfr/sdk/adaptive_system.pyi +21 -0
  255. tnfr/sdk/builders.py +370 -0
  256. tnfr/sdk/builders.pyi +51 -0
  257. tnfr/sdk/fluent.py +1121 -0
  258. tnfr/sdk/fluent.pyi +74 -0
  259. tnfr/sdk/templates.py +342 -0
  260. tnfr/sdk/templates.pyi +41 -0
  261. tnfr/sdk/utils.py +341 -0
  262. tnfr/secure_config.py +46 -0
  263. tnfr/security/__init__.py +70 -0
  264. tnfr/security/database.py +514 -0
  265. tnfr/security/subprocess.py +503 -0
  266. tnfr/security/validation.py +290 -0
  267. tnfr/selector.py +59 -22
  268. tnfr/selector.pyi +19 -0
  269. tnfr/sense.py +92 -67
  270. tnfr/sense.pyi +23 -0
  271. tnfr/services/__init__.py +17 -0
  272. tnfr/services/orchestrator.py +325 -0
  273. tnfr/sparse/__init__.py +39 -0
  274. tnfr/sparse/representations.py +492 -0
  275. tnfr/structural.py +639 -263
  276. tnfr/structural.pyi +83 -0
  277. tnfr/telemetry/__init__.py +35 -0
  278. tnfr/telemetry/cache_metrics.py +226 -0
  279. tnfr/telemetry/cache_metrics.pyi +64 -0
  280. tnfr/telemetry/nu_f.py +422 -0
  281. tnfr/telemetry/nu_f.pyi +108 -0
  282. tnfr/telemetry/verbosity.py +36 -0
  283. tnfr/telemetry/verbosity.pyi +15 -0
  284. tnfr/tokens.py +2 -4
  285. tnfr/tokens.pyi +36 -0
  286. tnfr/tools/__init__.py +20 -0
  287. tnfr/tools/domain_templates.py +478 -0
  288. tnfr/tools/sequence_generator.py +846 -0
  289. tnfr/topology/__init__.py +13 -0
  290. tnfr/topology/asymmetry.py +151 -0
  291. tnfr/trace.py +300 -126
  292. tnfr/trace.pyi +42 -0
  293. tnfr/tutorials/__init__.py +38 -0
  294. tnfr/tutorials/autonomous_evolution.py +285 -0
  295. tnfr/tutorials/interactive.py +1576 -0
  296. tnfr/tutorials/structural_metabolism.py +238 -0
  297. tnfr/types.py +743 -12
  298. tnfr/types.pyi +357 -0
  299. tnfr/units.py +68 -0
  300. tnfr/units.pyi +13 -0
  301. tnfr/utils/__init__.py +282 -0
  302. tnfr/utils/__init__.pyi +215 -0
  303. tnfr/utils/cache.py +4223 -0
  304. tnfr/utils/cache.pyi +470 -0
  305. tnfr/{callback_utils.py → utils/callbacks.py} +26 -39
  306. tnfr/utils/callbacks.pyi +49 -0
  307. tnfr/utils/chunks.py +108 -0
  308. tnfr/utils/chunks.pyi +22 -0
  309. tnfr/utils/data.py +428 -0
  310. tnfr/utils/data.pyi +74 -0
  311. tnfr/utils/graph.py +85 -0
  312. tnfr/utils/graph.pyi +10 -0
  313. tnfr/utils/init.py +821 -0
  314. tnfr/utils/init.pyi +80 -0
  315. tnfr/utils/io.py +559 -0
  316. tnfr/utils/io.pyi +66 -0
  317. tnfr/{helpers → utils}/numeric.py +51 -24
  318. tnfr/utils/numeric.pyi +21 -0
  319. tnfr/validation/__init__.py +257 -0
  320. tnfr/validation/__init__.pyi +85 -0
  321. tnfr/validation/compatibility.py +460 -0
  322. tnfr/validation/compatibility.pyi +6 -0
  323. tnfr/validation/config.py +73 -0
  324. tnfr/validation/graph.py +139 -0
  325. tnfr/validation/graph.pyi +18 -0
  326. tnfr/validation/input_validation.py +755 -0
  327. tnfr/validation/invariants.py +712 -0
  328. tnfr/validation/rules.py +253 -0
  329. tnfr/validation/rules.pyi +44 -0
  330. tnfr/validation/runtime.py +279 -0
  331. tnfr/validation/runtime.pyi +28 -0
  332. tnfr/validation/sequence_validator.py +162 -0
  333. tnfr/validation/soft_filters.py +170 -0
  334. tnfr/validation/soft_filters.pyi +32 -0
  335. tnfr/validation/spectral.py +164 -0
  336. tnfr/validation/spectral.pyi +42 -0
  337. tnfr/validation/validator.py +1266 -0
  338. tnfr/validation/window.py +39 -0
  339. tnfr/validation/window.pyi +1 -0
  340. tnfr/visualization/__init__.py +98 -0
  341. tnfr/visualization/cascade_viz.py +256 -0
  342. tnfr/visualization/hierarchy.py +284 -0
  343. tnfr/visualization/sequence_plotter.py +784 -0
  344. tnfr/viz/__init__.py +60 -0
  345. tnfr/viz/matplotlib.py +278 -0
  346. tnfr/viz/matplotlib.pyi +35 -0
  347. tnfr-8.5.0.dist-info/METADATA +573 -0
  348. tnfr-8.5.0.dist-info/RECORD +353 -0
  349. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/entry_points.txt +1 -0
  350. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/licenses/LICENSE.md +1 -1
  351. tnfr/collections_utils.py +0 -300
  352. tnfr/config.py +0 -32
  353. tnfr/grammar.py +0 -344
  354. tnfr/graph_utils.py +0 -84
  355. tnfr/helpers/__init__.py +0 -71
  356. tnfr/import_utils.py +0 -228
  357. tnfr/json_utils.py +0 -162
  358. tnfr/logging_utils.py +0 -116
  359. tnfr/presets.py +0 -60
  360. tnfr/validators.py +0 -84
  361. tnfr/value_utils.py +0 -59
  362. tnfr-4.5.2.dist-info/METADATA +0 -379
  363. tnfr-4.5.2.dist-info/RECORD +0 -67
  364. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
  365. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/top_level.txt +0 -0
@@ -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)
tnfr/config/presets.py ADDED
@@ -0,0 +1,83 @@
1
+ """Predefined TNFR configuration sequences.
2
+
3
+ Only the canonical English preset identifiers are recognised.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from ..execution import (
9
+ CANONICAL_PRESET_NAME,
10
+ CANONICAL_PROGRAM_TOKENS,
11
+ block,
12
+ seq,
13
+ wait,
14
+ )
15
+ from ..types import Glyph, PresetTokens
16
+
17
+ __all__ = (
18
+ "get_preset",
19
+ "PREFERRED_PRESET_NAMES",
20
+ "legacy_preset_guidance",
21
+ )
22
+
23
+ _PRIMARY_PRESETS: dict[str, PresetTokens] = {
24
+ "resonant_bootstrap": seq(
25
+ Glyph.AL,
26
+ Glyph.EN,
27
+ Glyph.IL,
28
+ Glyph.RA,
29
+ Glyph.VAL,
30
+ Glyph.UM,
31
+ wait(3),
32
+ Glyph.SHA,
33
+ ),
34
+ "contained_mutation": seq(
35
+ Glyph.AL,
36
+ Glyph.EN,
37
+ block(Glyph.OZ, Glyph.ZHIR, Glyph.IL, repeat=2),
38
+ Glyph.RA,
39
+ Glyph.SHA,
40
+ ),
41
+ "coupling_exploration": seq(
42
+ Glyph.AL,
43
+ Glyph.EN,
44
+ Glyph.IL,
45
+ Glyph.VAL,
46
+ Glyph.UM,
47
+ block(Glyph.OZ, Glyph.NAV, Glyph.IL, repeat=1),
48
+ Glyph.RA,
49
+ Glyph.SHA,
50
+ ),
51
+ "fractal_expand": seq(
52
+ block(Glyph.THOL, Glyph.VAL, Glyph.UM, repeat=2, close=Glyph.NUL),
53
+ Glyph.RA,
54
+ ),
55
+ "fractal_contract": seq(
56
+ block(Glyph.THOL, Glyph.NUL, Glyph.UM, repeat=2, close=Glyph.SHA),
57
+ Glyph.RA,
58
+ ),
59
+ CANONICAL_PRESET_NAME: list(CANONICAL_PROGRAM_TOKENS),
60
+ }
61
+
62
+ PREFERRED_PRESET_NAMES: tuple[str, ...] = tuple(_PRIMARY_PRESETS.keys())
63
+
64
+ _PRESETS: dict[str, PresetTokens] = {**_PRIMARY_PRESETS}
65
+
66
+
67
+ def legacy_preset_guidance(name: str) -> str | None:
68
+ """Return CLI guidance for preset lookups.
69
+
70
+ Legacy aliases were removed; the function now always returns ``None``.
71
+ ``name`` is accepted to preserve the public helper signature.
72
+ """
73
+
74
+ return None
75
+
76
+
77
+ def get_preset(name: str) -> PresetTokens:
78
+ """Return the preset token sequence identified by ``name``."""
79
+
80
+ try:
81
+ return _PRESETS[name]
82
+ except KeyError:
83
+ raise KeyError(f"Preset not found: {name}") from None
@@ -0,0 +1,7 @@
1
+ from typing import Any
2
+
3
+ __all__: Any
4
+
5
+ def __getattr__(name: str) -> Any: ...
6
+
7
+ get_preset: Any