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,238 @@
1
+ """Tutorial: T'HOL Structural Metabolism and Bifurcation
2
+
3
+ This tutorial demonstrates the canonical implementation of T'HOL (Self-Organization)
4
+ as structural metabolism, including:
5
+
6
+ 1. Bifurcation dynamics (∂²EPI/∂t² > τ)
7
+ 2. Metabolic cycles (EN → THOL → IL)
8
+ 3. Adaptive metabolism
9
+ 4. Emergence metrics
10
+
11
+ Theory
12
+ ------
13
+ T'HOL is not just self-organization - it's **structural metabolism**:
14
+
15
+ > "T'HOL no reacciona: reorganiza. No adapta: reinventa. T'HOL es el corazón del
16
+ > metabolismo estructural: permite que una forma se reorganice sin romperse."
17
+
18
+ **Key Characteristics:**
19
+ - **Bifurcation nodal**: When acceleration exceeds threshold, spawns sub-EPIs
20
+ - **Autonomous reorganization**: No external instruction required
21
+ - **Vibrational metabolism**: Digests external experience into internal structure
22
+ - **Emergence engine**: Creates complexity and novelty
23
+
24
+ Examples
25
+ --------
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ from tnfr.constants import DNFR_PRIMARY, EPI_PRIMARY, VF_PRIMARY
31
+ from tnfr.dynamics.metabolism import (
32
+ StructuralMetabolism,
33
+ adaptive_metabolism,
34
+ cascading_reorganization,
35
+ digest_stimulus,
36
+ )
37
+ from tnfr.metrics.emergence import (
38
+ compute_bifurcation_rate,
39
+ compute_emergence_index,
40
+ compute_metabolic_efficiency,
41
+ compute_structural_complexity,
42
+ )
43
+ from tnfr.operators.definitions import SelfOrganization
44
+ from tnfr.structural import create_nfr
45
+
46
+
47
+ def example_1_basic_bifurcation():
48
+ """Example 1: Basic bifurcation when acceleration exceeds threshold."""
49
+ print("\n=== Example 1: Basic Bifurcation ===\n")
50
+
51
+ # Create a node with sufficient EPI
52
+ G, node = create_nfr("cell", epi=0.5, vf=1.0)
53
+
54
+ # Set positive ΔNFR (required for T'HOL)
55
+ G.nodes[node][DNFR_PRIMARY] = 0.2
56
+
57
+ # Provide EPI history showing strong acceleration
58
+ # d²EPI = abs(0.7 - 2*0.5 + 0.3) = 0.1
59
+ G.nodes[node]["epi_history"] = [0.3, 0.5, 0.7]
60
+
61
+ print("Initial state:")
62
+ print(f" EPI: {G.nodes[node][EPI_PRIMARY]:.3f}")
63
+ print(f" EPI history: {G.nodes[node]['epi_history']}")
64
+ print(f" Acceleration: 0.1")
65
+
66
+ # Apply T'HOL with low threshold to trigger bifurcation
67
+ SelfOrganization()(G, node, tau=0.08)
68
+
69
+ # Check for bifurcation
70
+ sub_epis = G.nodes[node].get("sub_epis", [])
71
+ print(f"\nAfter T'HOL:")
72
+ print(f" EPI: {G.nodes[node][EPI_PRIMARY]:.3f}")
73
+ print(f" Bifurcations: {len(sub_epis)}")
74
+
75
+ if sub_epis:
76
+ print(f" Sub-EPI details:")
77
+ for i, sub in enumerate(sub_epis):
78
+ print(f" [{i}] epi={sub['epi']:.3f}, d2_epi={sub['d2_epi']:.3f}")
79
+
80
+
81
+ def example_2_metabolic_cycle():
82
+ """Example 2: Complete metabolic cycle (EN → THOL → IL)."""
83
+ print("\n=== Example 2: Metabolic Cycle ===\n")
84
+
85
+ # Create a node with a neighbor (for Reception)
86
+ G, node = create_nfr("neuron", epi=0.4, vf=1.0)
87
+ G.add_node("neighbor", **{EPI_PRIMARY: 0.6, VF_PRIMARY: 1.0})
88
+ G.add_edge(node, "neighbor")
89
+
90
+ # Set positive ΔNFR and history for bifurcation
91
+ G.nodes[node][DNFR_PRIMARY] = 0.2
92
+ G.nodes[node]["epi_history"] = [0.2, 0.35, 0.5]
93
+
94
+ print("Initial state:")
95
+ print(f" EPI: {G.nodes[node][EPI_PRIMARY]:.3f}")
96
+ print(f" Neighbors: {list(G.neighbors(node))}")
97
+
98
+ # Use StructuralMetabolism for complete cycle
99
+ metabolism = StructuralMetabolism(G, node)
100
+ metabolism.digest(tau=0.08)
101
+
102
+ print(f"\nAfter metabolic cycle:")
103
+ # Get final EPI value safely using unified function
104
+ from tnfr.alias import get_attr
105
+ from tnfr.constants.aliases import ALIAS_EPI
106
+
107
+ final_epi = float(get_attr(G.nodes[node], ALIAS_EPI, 0.0))
108
+ print(f" EPI: {final_epi:.3f}")
109
+ # Get glyph history safely
110
+ glyph_hist = G.nodes[node].get("glyph_history", [])
111
+ if glyph_hist and isinstance(glyph_hist, list):
112
+ print(f" Glyph history: {glyph_hist[-5:]}") # Last 5 glyphs
113
+
114
+
115
+ def example_3_adaptive_metabolism():
116
+ """Example 3: Adaptive metabolism responds to stress levels."""
117
+ print("\n=== Example 3: Adaptive Metabolism ===\n")
118
+
119
+ # Import unified functions
120
+ from tnfr.alias import get_attr
121
+ from tnfr.constants.aliases import ALIAS_EPI
122
+
123
+ # High stress scenario
124
+ G_stress, node_stress = create_nfr("organism_stressed", epi=0.6, vf=1.0)
125
+ G_stress.nodes[node_stress][DNFR_PRIMARY] = 0.3
126
+ G_stress.nodes[node_stress]["epi_history"] = [0.4, 0.5, 0.7]
127
+
128
+ print("High stress (>= 0.5):")
129
+ initial_epi_stress = float(get_attr(G_stress.nodes[node_stress], ALIAS_EPI, 0.0))
130
+ print(f" Initial EPI: {initial_epi_stress:.3f}")
131
+
132
+ metabolism_stress = StructuralMetabolism(G_stress, node_stress)
133
+ metabolism_stress.adaptive_metabolism(stress_level=0.7)
134
+
135
+ final_epi_stress = float(get_attr(G_stress.nodes[node_stress], ALIAS_EPI, 0.0))
136
+ print(f" After adaptive metabolism: EPI={final_epi_stress:.3f}")
137
+
138
+ # Low stress scenario
139
+ G_calm, node_calm = create_nfr("organism_calm", epi=0.5, vf=1.0)
140
+ G_calm.nodes[node_calm][DNFR_PRIMARY] = 0.1
141
+ G_calm.nodes[node_calm]["epi_history"] = [0.45, 0.48, 0.52]
142
+
143
+ print("\nLow stress (< 0.5):")
144
+ initial_epi_calm = float(get_attr(G_calm.nodes[node_calm], ALIAS_EPI, 0.0))
145
+ print(f" Initial EPI: {initial_epi_calm:.3f}")
146
+
147
+ metabolism_calm = StructuralMetabolism(G_calm, node_calm)
148
+ metabolism_calm.adaptive_metabolism(stress_level=0.3)
149
+
150
+ final_epi_calm = float(get_attr(G_calm.nodes[node_calm], ALIAS_EPI, 0.0))
151
+ print(f" After adaptive metabolism: EPI={final_epi_calm:.3f}")
152
+
153
+
154
+ def example_4_cascading_reorganization():
155
+ """Example 4: Cascading T'HOL for multi-scale reorganization."""
156
+ print("\n=== Example 4: Cascading Reorganization ===\n")
157
+
158
+ # Import unified functions
159
+ from tnfr.alias import get_attr
160
+ from tnfr.constants.aliases import ALIAS_EPI
161
+
162
+ G, node = create_nfr("system", epi=0.7, vf=1.2)
163
+ G.nodes[node][DNFR_PRIMARY] = 0.25
164
+ G.nodes[node]["epi_history"] = [0.5, 0.6, 0.8]
165
+
166
+ print("Initial state:")
167
+ initial_epi = float(get_attr(G.nodes[node], ALIAS_EPI, 0.0))
168
+ print(f" EPI: {initial_epi:.3f}")
169
+
170
+ # Cascading reorganization with 3 levels
171
+ metabolism = StructuralMetabolism(G, node)
172
+ metabolism.cascading_reorganization(depth=3)
173
+
174
+ sub_epis = G.nodes[node].get("sub_epis", [])
175
+ final_epi = float(get_attr(G.nodes[node], ALIAS_EPI, 0.0))
176
+ print(f"\nAfter cascading reorganization (depth=3):")
177
+ print(f" EPI: {final_epi:.3f}")
178
+ print(f" Total bifurcations: {len(sub_epis)}")
179
+
180
+
181
+ def example_5_emergence_metrics():
182
+ """Example 5: Measuring structural complexity and metabolic efficiency."""
183
+ print("\n=== Example 5: Emergence Metrics ===\n")
184
+
185
+ # Import unified functions
186
+ from tnfr.alias import get_attr
187
+ from tnfr.constants.aliases import ALIAS_EPI
188
+
189
+ G, node = create_nfr("evolving_system", epi=0.6, vf=1.0)
190
+
191
+ # Record initial EPI for efficiency calculation
192
+ G.nodes[node]["epi_initial"] = 0.3
193
+
194
+ # Simulate several T'HOL applications with bifurcations
195
+ G.nodes[node][DNFR_PRIMARY] = 0.2
196
+ G.nodes[node]["glyph_history"] = []
197
+
198
+ for i in range(3):
199
+ # Update history to show acceleration
200
+ G.nodes[node]["epi_history"] = [0.3 + i * 0.1, 0.4 + i * 0.1, 0.6 + i * 0.1]
201
+ SelfOrganization()(G, node, tau=0.08)
202
+
203
+ print("After 3 T'HOL applications:")
204
+ final_epi = float(get_attr(G.nodes[node], ALIAS_EPI, 0.0))
205
+ print(f" Final EPI: {final_epi:.3f}")
206
+
207
+ # Compute emergence metrics
208
+ complexity = compute_structural_complexity(G, node)
209
+ rate = compute_bifurcation_rate(G, node, window=10)
210
+ efficiency = compute_metabolic_efficiency(G, node)
211
+ emergence = compute_emergence_index(G, node)
212
+
213
+ print(f"\nEmergence Metrics:")
214
+ print(f" Structural complexity: {complexity}")
215
+ print(f" Bifurcation rate: {rate:.3f} per step")
216
+ print(f" Metabolic efficiency: {efficiency:.3f} EPI/THOL")
217
+ print(f" Emergence index: {emergence:.3f}")
218
+
219
+
220
+ def main():
221
+ """Run all examples."""
222
+ print("\n" + "=" * 70)
223
+ print("T'HOL STRUCTURAL METABOLISM TUTORIAL")
224
+ print("=" * 70)
225
+
226
+ example_1_basic_bifurcation()
227
+ example_2_metabolic_cycle()
228
+ example_3_adaptive_metabolism()
229
+ example_4_cascading_reorganization()
230
+ example_5_emergence_metrics()
231
+
232
+ print("\n" + "=" * 70)
233
+ print("Tutorial complete!")
234
+ print("=" * 70 + "\n")
235
+
236
+
237
+ if __name__ == "__main__":
238
+ main()