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,173 @@
1
+ """Unified adaptive system integrating all TNFR dynamic components.
2
+
3
+ This module provides a high-level interface that combines feedback loops,
4
+ adaptive sequence selection, homeostasis, learning, and metabolism into a
5
+ single coherent adaptive system. It represents the complete implementation
6
+ of TNFR autonomous evolution.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import TYPE_CHECKING
12
+
13
+ if TYPE_CHECKING:
14
+ from ..types import TNFRGraph, NodeId
15
+
16
+ from ..alias import get_attr
17
+ from ..constants.aliases import ALIAS_DNFR
18
+ from ..dynamics.feedback import StructuralFeedbackLoop
19
+ from ..dynamics.adaptive_sequences import AdaptiveSequenceSelector
20
+ from ..dynamics.homeostasis import StructuralHomeostasis
21
+ from ..dynamics.learning import AdaptiveLearningSystem
22
+ from ..dynamics.metabolism import StructuralMetabolism
23
+
24
+ __all__ = ["TNFRAdaptiveSystem"]
25
+
26
+
27
+ class TNFRAdaptiveSystem:
28
+ """Complete adaptive system integrating all TNFR dynamic components.
29
+
30
+ This class orchestrates feedback loops, sequence selection, homeostasis,
31
+ learning, and metabolism into autonomous evolution cycles. It provides
32
+ a single entry point for complex adaptive behaviors.
33
+
34
+ **Integrated Components:**
35
+
36
+ - **Feedback Loop**: Regulates coherence via operator selection
37
+ - **Sequence Selector**: Learns optimal operator trajectories
38
+ - **Homeostasis**: Maintains parameter equilibrium
39
+ - **Learning System**: Implements AL + T'HOL learning cycles
40
+ - **Metabolism**: Digests stimuli into structure
41
+
42
+ Parameters
43
+ ----------
44
+ graph : TNFRGraph
45
+ Graph containing the evolving node
46
+ node : NodeId
47
+ Identifier of the adaptive node
48
+ stress_normalization : float, default=0.2
49
+ ΔNFR value that corresponds to maximum stress (1.0)
50
+
51
+ Attributes
52
+ ----------
53
+ G : TNFRGraph
54
+ Graph reference
55
+ node : NodeId
56
+ Node identifier
57
+ feedback : StructuralFeedbackLoop
58
+ Feedback regulation component
59
+ sequence_selector : AdaptiveSequenceSelector
60
+ Adaptive sequence selection component
61
+ homeostasis : StructuralHomeostasis
62
+ Homeostatic regulation component
63
+ learning : AdaptiveLearningSystem
64
+ Adaptive learning component
65
+ metabolism : StructuralMetabolism
66
+ Structural metabolism component
67
+ STRESS_NORM : float
68
+ Normalization factor for stress measurement
69
+
70
+ Examples
71
+ --------
72
+ >>> from tnfr.structural import create_nfr
73
+ >>> from tnfr.sdk.adaptive_system import TNFRAdaptiveSystem
74
+ >>> G, node = create_nfr("adaptive_node")
75
+ >>> system = TNFRAdaptiveSystem(G, node)
76
+ >>> system.autonomous_evolution(num_cycles=20)
77
+
78
+ Notes
79
+ -----
80
+ The adaptive system implements complete TNFR autonomous evolution as
81
+ specified in the operational manual. Each cycle integrates:
82
+
83
+ 1. Homeostatic regulation
84
+ 2. Feedback-driven operator selection
85
+ 3. Metabolic stress response
86
+ 4. Learning consolidation
87
+
88
+ This creates self-regulating, adaptive structural dynamics.
89
+ """
90
+
91
+ STRESS_NORM = 0.2 # ΔNFR value corresponding to maximum stress
92
+
93
+ def __init__(
94
+ self,
95
+ graph: TNFRGraph,
96
+ node: NodeId,
97
+ stress_normalization: float = STRESS_NORM,
98
+ ) -> None:
99
+ self.G = graph
100
+ self.node = node
101
+ self.STRESS_NORM = float(stress_normalization)
102
+
103
+ # Initialize all components
104
+ self.feedback = StructuralFeedbackLoop(graph, node)
105
+ self.sequence_selector = AdaptiveSequenceSelector(graph, node)
106
+ self.homeostasis = StructuralHomeostasis(graph, node)
107
+ self.learning = AdaptiveLearningSystem(graph, node)
108
+ self.metabolism = StructuralMetabolism(graph, node)
109
+
110
+ def autonomous_evolution(self, num_cycles: int = 20) -> None:
111
+ """Execute complete autonomous evolution cycles.
112
+
113
+ Each cycle integrates adaptive components:
114
+
115
+ 1. **Homeostasis**: Correct out-of-range parameters
116
+ 2. **Feedback**: Regulate coherence via operator selection
117
+
118
+ Parameters
119
+ ----------
120
+ num_cycles : int, default=20
121
+ Number of evolution cycles to execute
122
+
123
+ Notes
124
+ -----
125
+ The integration follows TNFR principles:
126
+
127
+ - **Homeostasis first**: Ensure safe operating parameters
128
+ - **Feedback loops**: Maintain target coherence
129
+
130
+ This creates robust, adaptive, self-regulating dynamics.
131
+
132
+ **Advanced Usage:**
133
+
134
+ For full metabolic and learning cycles, use the component systems
135
+ directly:
136
+
137
+ - ``system.metabolism.adaptive_metabolism(stress)``
138
+ - ``system.learning.consolidate_memory()``
139
+
140
+ These require careful sequence design to comply with TNFR grammar.
141
+ """
142
+ for cycle in range(num_cycles):
143
+ # 1. Homeostatic regulation: maintain parameter equilibrium
144
+ self.homeostasis.maintain_equilibrium()
145
+
146
+ # 2. Feedback loop: regulate coherence
147
+ self.feedback.homeostatic_cycle(num_steps=3)
148
+
149
+ def _measure_stress(self) -> float:
150
+ """Measure structural stress level from ΔNFR.
151
+
152
+ Stress is proportional to reorganization pressure. High ΔNFR
153
+ indicates high stress requiring metabolic response.
154
+
155
+ Returns
156
+ -------
157
+ float
158
+ Stress level normalized to [0, 1]
159
+
160
+ Notes
161
+ -----
162
+ Stress mapping:
163
+
164
+ - ΔNFR = 0.0 → stress = 0.0 (no pressure)
165
+ - ΔNFR = 0.2 → stress = 1.0 (maximum pressure)
166
+ - Linear interpolation between
167
+
168
+ This normalization allows consistent stress response across
169
+ different system scales.
170
+ """
171
+ dnfr = get_attr(self.G.nodes[self.node], ALIAS_DNFR, 0.0)
172
+ # Normalize ΔNFR to [0, 1] stress level
173
+ return min(1.0, abs(dnfr) / self.STRESS_NORM)
@@ -0,0 +1,21 @@
1
+ """Type stubs for tnfr.sdk.adaptive_system module."""
2
+
3
+ from ..types import TNFRGraph, NodeId
4
+ from ..dynamics.feedback import StructuralFeedbackLoop
5
+ from ..dynamics.adaptive_sequences import AdaptiveSequenceSelector
6
+ from ..dynamics.homeostasis import StructuralHomeostasis
7
+ from ..dynamics.learning import AdaptiveLearningSystem
8
+ from ..dynamics.metabolism import StructuralMetabolism
9
+
10
+ class TNFRAdaptiveSystem:
11
+ G: TNFRGraph
12
+ node: NodeId
13
+ feedback: StructuralFeedbackLoop
14
+ sequence_selector: AdaptiveSequenceSelector
15
+ homeostasis: StructuralHomeostasis
16
+ learning: AdaptiveLearningSystem
17
+ metabolism: StructuralMetabolism
18
+
19
+ def __init__(self, graph: TNFRGraph, node: NodeId) -> None: ...
20
+ def autonomous_evolution(self, num_cycles: int = ...) -> None: ...
21
+ def _measure_stress(self) -> float: ...
tnfr/sdk/builders.py ADDED
@@ -0,0 +1,370 @@
1
+ """Builder patterns for common TNFR experiment workflows.
2
+
3
+ This module provides builder pattern implementations for standard TNFR
4
+ experiments. Builders offer more control than templates while still
5
+ simplifying common research patterns.
6
+
7
+ Examples
8
+ --------
9
+ Run a small-world network study:
10
+
11
+ >>> from tnfr.sdk import TNFRExperimentBuilder
12
+ >>> results = TNFRExperimentBuilder.small_world_study(
13
+ ... nodes=50, rewiring_prob=0.1, steps=10
14
+ ... )
15
+
16
+ Compare different network topologies:
17
+
18
+ >>> comparison = TNFRExperimentBuilder.compare_topologies(
19
+ ... node_count=40, steps=10
20
+ ... )
21
+ >>> for topology, results in comparison.items():
22
+ ... print(f"{topology}: coherence={results.coherence:.3f}")
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ from typing import Dict, Optional
28
+
29
+ from .fluent import TNFRNetwork, NetworkResults
30
+
31
+ __all__ = ["TNFRExperimentBuilder"]
32
+
33
+
34
+ class TNFRExperimentBuilder:
35
+ """Builder pattern for standard TNFR experiments.
36
+
37
+ This class provides static methods that implement common experimental
38
+ patterns in TNFR research. Each method configures and runs a complete
39
+ experiment, returning structured results for analysis.
40
+
41
+ Builders are more flexible than templates, allowing researchers to
42
+ control specific parameters while handling boilerplate setup.
43
+ """
44
+
45
+ @staticmethod
46
+ def small_world_study(
47
+ nodes: int = 50,
48
+ rewiring_prob: float = 0.1,
49
+ steps: int = 10,
50
+ random_seed: Optional[int] = None,
51
+ ) -> NetworkResults:
52
+ """Study small-world network properties with TNFR dynamics.
53
+
54
+ Creates a Watts-Strogatz small-world network and evolves it through
55
+ TNFR operator sequences to study how small-world topology affects
56
+ coherence and synchronization.
57
+
58
+ Parameters
59
+ ----------
60
+ nodes : int, default=50
61
+ Number of nodes in the network.
62
+ rewiring_prob : float, default=0.1
63
+ Rewiring probability for small-world construction.
64
+ steps : int, default=10
65
+ Number of activation steps to apply.
66
+ random_seed : int, optional
67
+ Random seed for reproducibility.
68
+
69
+ Returns
70
+ -------
71
+ NetworkResults
72
+ Complete results including coherence and sense indices.
73
+
74
+ Examples
75
+ --------
76
+ >>> results = TNFRExperimentBuilder.small_world_study(
77
+ ... nodes=100, rewiring_prob=0.2
78
+ ... )
79
+ >>> print(f"Network coherence: {results.coherence:.3f}")
80
+ """
81
+ network = TNFRNetwork("small_world_study")
82
+ if random_seed is not None:
83
+ network._config.random_seed = random_seed
84
+
85
+ return (
86
+ network.add_nodes(nodes)
87
+ .connect_nodes(rewiring_prob, "small_world")
88
+ .apply_sequence("basic_activation", repeat=steps)
89
+ .measure()
90
+ )
91
+
92
+ @staticmethod
93
+ def synchronization_study(
94
+ nodes: int = 30,
95
+ coupling_strength: float = 0.5,
96
+ steps: int = 20,
97
+ random_seed: Optional[int] = None,
98
+ ) -> NetworkResults:
99
+ """Study synchronization in densely coupled TNFR networks.
100
+
101
+ Creates a network with similar structural frequencies (within TNFR
102
+ bounds) and dense coupling, then applies synchronization sequences
103
+ to study phase locking and coherence emergence.
104
+
105
+ Parameters
106
+ ----------
107
+ nodes : int, default=30
108
+ Number of nodes in the network.
109
+ coupling_strength : float, default=0.5
110
+ Connection probability (controls coupling density).
111
+ steps : int, default=20
112
+ Number of synchronization steps.
113
+ random_seed : int, optional
114
+ Random seed for reproducibility.
115
+
116
+ Returns
117
+ -------
118
+ NetworkResults
119
+ Results showing synchronization metrics.
120
+
121
+ Examples
122
+ --------
123
+ >>> results = TNFRExperimentBuilder.synchronization_study(
124
+ ... nodes=50, coupling_strength=0.7
125
+ ... )
126
+ >>> avg_si = sum(results.sense_indices.values()) / len(results.sense_indices)
127
+ >>> print(f"Synchronization (avg Si): {avg_si:.3f}")
128
+ """
129
+ network = TNFRNetwork("sync_study")
130
+ if random_seed is not None:
131
+ network._config.random_seed = random_seed
132
+
133
+ # Similar frequencies promote synchronization (within bounds: 0.6-0.9)
134
+ network.add_nodes(nodes, vf_range=(0.6, 0.9))
135
+ network.connect_nodes(coupling_strength, "random")
136
+
137
+ # Multi-phase synchronization protocol
138
+ for step in range(steps):
139
+ if step < 5:
140
+ # Initial activation
141
+ network.apply_sequence("basic_activation")
142
+ elif step < 15:
143
+ # Synchronization phase
144
+ network.apply_sequence("network_sync")
145
+ else:
146
+ # Consolidation
147
+ network.apply_sequence("consolidation")
148
+
149
+ return network.measure()
150
+
151
+ @staticmethod
152
+ def creativity_emergence(
153
+ nodes: int = 20,
154
+ mutation_intensity: float = 0.3,
155
+ steps: int = 15,
156
+ random_seed: Optional[int] = None,
157
+ ) -> NetworkResults:
158
+ """Study creative emergence through controlled mutation.
159
+
160
+ Models creative processes by starting with diverse frequencies
161
+ and applying mutation operators to study how new coherent forms
162
+ emerge from structural reorganization.
163
+
164
+ Parameters
165
+ ----------
166
+ nodes : int, default=20
167
+ Number of nodes (ideas/concepts).
168
+ mutation_intensity : float, default=0.3
169
+ Not currently used, reserved for future mutation parameters.
170
+ steps : int, default=15
171
+ Number of creative mutation cycles.
172
+ random_seed : int, optional
173
+ Random seed for reproducibility.
174
+
175
+ Returns
176
+ -------
177
+ NetworkResults
178
+ Results showing creative coherence emergence.
179
+
180
+ Examples
181
+ --------
182
+ >>> results = TNFRExperimentBuilder.creativity_emergence(nodes=25)
183
+ >>> print(f"Creative coherence: {results.coherence:.3f}")
184
+ """
185
+ network = TNFRNetwork("creativity_study")
186
+ if random_seed is not None:
187
+ network._config.random_seed = random_seed
188
+
189
+ return (
190
+ network.add_nodes(nodes, vf_range=(0.2, 0.8)) # High diversity
191
+ .connect_nodes(0.2, "ring") # Conservative connectivity
192
+ .apply_sequence("creative_mutation", repeat=steps)
193
+ .measure()
194
+ )
195
+
196
+ @staticmethod
197
+ def compare_topologies(
198
+ node_count: int = 40,
199
+ steps: int = 10,
200
+ topologies: Optional[list[str]] = None,
201
+ random_seed: Optional[int] = None,
202
+ ) -> Dict[str, NetworkResults]:
203
+ """Compare TNFR dynamics across different network topologies.
204
+
205
+ Creates multiple networks with identical node properties but
206
+ different topological structures, then compares their evolution
207
+ under the same operator sequences.
208
+
209
+ Parameters
210
+ ----------
211
+ node_count : int, default=40
212
+ Number of nodes in each network.
213
+ steps : int, default=10
214
+ Number of activation steps to apply.
215
+ topologies : list[str], optional
216
+ List of topologies to compare. If None, uses
217
+ ["random", "ring", "small_world"].
218
+ random_seed : int, optional
219
+ Random seed for reproducibility across all networks.
220
+
221
+ Returns
222
+ -------
223
+ Dict[str, NetworkResults]
224
+ Dictionary mapping topology names to their results.
225
+
226
+ Examples
227
+ --------
228
+ >>> comparison = TNFRExperimentBuilder.compare_topologies(
229
+ ... node_count=50, steps=15
230
+ ... )
231
+ >>> for topo, res in comparison.items():
232
+ ... print(f"{topo}: C(t)={res.coherence:.3f}")
233
+ """
234
+ if topologies is None:
235
+ topologies = ["random", "ring", "small_world"]
236
+
237
+ results = {}
238
+
239
+ for topology in topologies:
240
+ network = TNFRNetwork(f"topology_study_{topology}")
241
+ if random_seed is not None:
242
+ network._config.random_seed = random_seed
243
+
244
+ network.add_nodes(node_count)
245
+ network.connect_nodes(0.3, topology)
246
+ network.apply_sequence("basic_activation", repeat=steps)
247
+
248
+ results[topology] = network.measure()
249
+
250
+ return results
251
+
252
+ @staticmethod
253
+ def phase_transition_study(
254
+ nodes: int = 50,
255
+ initial_coupling: float = 0.1,
256
+ final_coupling: float = 0.9,
257
+ steps_per_level: int = 5,
258
+ coupling_levels: int = 5,
259
+ random_seed: Optional[int] = None,
260
+ ) -> Dict[float, NetworkResults]:
261
+ """Study phase transitions by varying coupling strength.
262
+
263
+ Investigates how network coherence changes as coupling strength
264
+ increases, potentially revealing critical phase transitions in
265
+ TNFR network dynamics.
266
+
267
+ Parameters
268
+ ----------
269
+ nodes : int, default=50
270
+ Number of nodes in the network.
271
+ initial_coupling : float, default=0.1
272
+ Starting coupling strength.
273
+ final_coupling : float, default=0.9
274
+ Final coupling strength.
275
+ steps_per_level : int, default=5
276
+ Number of evolution steps at each coupling level.
277
+ coupling_levels : int, default=5
278
+ Number of coupling levels to test.
279
+ random_seed : int, optional
280
+ Random seed for reproducibility.
281
+
282
+ Returns
283
+ -------
284
+ Dict[float, NetworkResults]
285
+ Mapping from coupling strength to network results.
286
+
287
+ Examples
288
+ --------
289
+ >>> transition = TNFRExperimentBuilder.phase_transition_study(nodes=60)
290
+ >>> for coupling, res in sorted(transition.items()):
291
+ ... print(f"Coupling {coupling:.2f}: C(t)={res.coherence:.3f}")
292
+ """
293
+ import numpy as np
294
+
295
+ coupling_values = np.linspace(initial_coupling, final_coupling, coupling_levels)
296
+ results = {}
297
+
298
+ for coupling in coupling_values:
299
+ network = TNFRNetwork(f"phase_study_{coupling:.2f}")
300
+ if random_seed is not None:
301
+ network._config.random_seed = random_seed
302
+
303
+ network.add_nodes(nodes)
304
+ network.connect_nodes(float(coupling), "random")
305
+ network.apply_sequence("network_sync", repeat=steps_per_level)
306
+
307
+ results[float(coupling)] = network.measure()
308
+
309
+ return results
310
+
311
+ @staticmethod
312
+ def resilience_study(
313
+ nodes: int = 40,
314
+ initial_steps: int = 10,
315
+ perturbation_steps: int = 5,
316
+ recovery_steps: int = 10,
317
+ random_seed: Optional[int] = None,
318
+ ) -> Dict[str, NetworkResults]:
319
+ """Study network resilience to perturbations.
320
+
321
+ Establishes a stable network, applies dissonance perturbations,
322
+ then measures recovery through stabilization sequences. Reveals
323
+ network resilience properties.
324
+
325
+ Parameters
326
+ ----------
327
+ nodes : int, default=40
328
+ Number of nodes in the network.
329
+ initial_steps : int, default=10
330
+ Steps to establish initial stable state.
331
+ perturbation_steps : int, default=5
332
+ Steps of dissonance perturbation.
333
+ recovery_steps : int, default=10
334
+ Steps to observe recovery.
335
+ random_seed : int, optional
336
+ Random seed for reproducibility.
337
+
338
+ Returns
339
+ -------
340
+ Dict[str, NetworkResults]
341
+ Results at 'initial', 'perturbed', and 'recovered' states.
342
+
343
+ Examples
344
+ --------
345
+ >>> resilience = TNFRExperimentBuilder.resilience_study(nodes=50)
346
+ >>> initial_c = resilience['initial'].coherence
347
+ >>> recovered_c = resilience['recovered'].coherence
348
+ >>> print(f"Recovery: {recovered_c / initial_c:.1%}")
349
+ """
350
+ network = TNFRNetwork("resilience_study")
351
+ if random_seed is not None:
352
+ network._config.random_seed = random_seed
353
+
354
+ results = {}
355
+
356
+ # Phase 1: Establish stable network
357
+ network.add_nodes(nodes)
358
+ network.connect_nodes(0.3, "small_world")
359
+ network.apply_sequence("stabilization", repeat=initial_steps)
360
+ results["initial"] = network.measure()
361
+
362
+ # Phase 2: Apply perturbation
363
+ network.apply_sequence("creative_mutation", repeat=perturbation_steps)
364
+ results["perturbed"] = network.measure()
365
+
366
+ # Phase 3: Recovery
367
+ network.apply_sequence("stabilization", repeat=recovery_steps)
368
+ results["recovered"] = network.measure()
369
+
370
+ return results
tnfr/sdk/builders.pyi ADDED
@@ -0,0 +1,51 @@
1
+ """Type stubs for TNFR SDK builders."""
2
+
3
+ from typing import Dict, List, Optional
4
+ from .fluent import NetworkResults
5
+
6
+ class TNFRExperimentBuilder:
7
+ @staticmethod
8
+ def small_world_study(
9
+ nodes: int = 50,
10
+ rewiring_prob: float = 0.1,
11
+ steps: int = 10,
12
+ random_seed: Optional[int] = None,
13
+ ) -> NetworkResults: ...
14
+ @staticmethod
15
+ def synchronization_study(
16
+ nodes: int = 30,
17
+ coupling_strength: float = 0.5,
18
+ steps: int = 20,
19
+ random_seed: Optional[int] = None,
20
+ ) -> NetworkResults: ...
21
+ @staticmethod
22
+ def creativity_emergence(
23
+ nodes: int = 20,
24
+ mutation_intensity: float = 0.3,
25
+ steps: int = 15,
26
+ random_seed: Optional[int] = None,
27
+ ) -> NetworkResults: ...
28
+ @staticmethod
29
+ def compare_topologies(
30
+ node_count: int = 40,
31
+ steps: int = 10,
32
+ topologies: Optional[List[str]] = None,
33
+ random_seed: Optional[int] = None,
34
+ ) -> Dict[str, NetworkResults]: ...
35
+ @staticmethod
36
+ def phase_transition_study(
37
+ nodes: int = 50,
38
+ initial_coupling: float = 0.1,
39
+ final_coupling: float = 0.9,
40
+ steps_per_level: int = 5,
41
+ coupling_levels: int = 5,
42
+ random_seed: Optional[int] = None,
43
+ ) -> Dict[float, NetworkResults]: ...
44
+ @staticmethod
45
+ def resilience_study(
46
+ nodes: int = 40,
47
+ initial_steps: int = 10,
48
+ perturbation_steps: int = 5,
49
+ recovery_steps: int = 10,
50
+ random_seed: Optional[int] = None,
51
+ ) -> Dict[str, NetworkResults]: ...