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
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]: ...