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,325 @@
1
+ """Service orchestration layer for TNFR engine.
2
+
3
+ This module provides the TNFROrchestrator service that coordinates execution
4
+ of operator sequences with clear separation of responsibilities:
5
+
6
+ 1. Validation (delegated to ValidationService)
7
+ 2. Execution (coordinated through OperatorRegistry)
8
+ 3. Dynamics (delegated to DynamicsEngine)
9
+ 4. Telemetry (delegated to TelemetryCollector)
10
+
11
+ The orchestrator maintains the nodal equation ∂EPI/∂t = νf · ΔNFR(t) while
12
+ ensuring that each layer operates independently and can be replaced without
13
+ affecting the others.
14
+
15
+ Examples
16
+ --------
17
+ Execute a sequence with default services:
18
+
19
+ >>> from tnfr.core.container import TNFRContainer
20
+ >>> from tnfr.services.orchestrator import TNFROrchestrator
21
+ >>> from tnfr.structural import create_nfr
22
+ >>>
23
+ >>> container = TNFRContainer.create_default()
24
+ >>> orchestrator = TNFROrchestrator.from_container(container)
25
+ >>> G, node = create_nfr("seed", epi=1.0, vf=2.0)
26
+ >>> orchestrator.execute_sequence(G, node, ["emission", "coherence"])
27
+
28
+ Execute with custom services:
29
+
30
+ >>> class CustomValidator:
31
+ ... def validate_sequence(self, seq):
32
+ ... print(f"Validating {seq}")
33
+ ... def validate_graph_state(self, graph):
34
+ ... pass
35
+ >>>
36
+ >>> container = TNFRContainer()
37
+ >>> container.register_singleton(ValidationService, CustomValidator())
38
+ >>> # ... register other services
39
+ >>> orchestrator = TNFROrchestrator.from_container(container)
40
+ """
41
+
42
+ from __future__ import annotations
43
+
44
+ from typing import TYPE_CHECKING, Iterable
45
+
46
+ if TYPE_CHECKING:
47
+ from ..core.interfaces import (
48
+ DynamicsEngine,
49
+ OperatorRegistry,
50
+ TelemetryCollector,
51
+ ValidationService,
52
+ )
53
+ from ..types import NodeId, TNFRGraph
54
+ from ..operators.definitions import Operator
55
+
56
+ __all__ = ("TNFROrchestrator",)
57
+
58
+
59
+ class TNFROrchestrator:
60
+ """Orchestrates TNFR sequence execution with separated responsibilities.
61
+
62
+ The orchestrator coordinates validation, execution, dynamics updates, and
63
+ telemetry collection without directly implementing any of these concerns.
64
+ Each responsibility is delegated to a specialized service, enabling
65
+ flexible composition and testing.
66
+
67
+ Attributes
68
+ ----------
69
+ _validator : ValidationService
70
+ Service for validating sequences and graph states.
71
+ _registry : OperatorRegistry
72
+ Service for retrieving operator implementations.
73
+ _dynamics : DynamicsEngine
74
+ Service for computing ΔNFR and integrating nodal equation.
75
+ _telemetry : TelemetryCollector
76
+ Service for collecting metrics and traces.
77
+
78
+ Examples
79
+ --------
80
+ Create orchestrator with dependency injection:
81
+
82
+ >>> from tnfr.core.container import TNFRContainer
83
+ >>> container = TNFRContainer.create_default()
84
+ >>> orch = TNFROrchestrator.from_container(container)
85
+
86
+ Execute a validated sequence:
87
+
88
+ >>> from tnfr.structural import create_nfr
89
+ >>> G, node = create_nfr("test", epi=1.0, vf=1.0)
90
+ >>> orch.execute_sequence(G, node, ["emission", "coherence"])
91
+ """
92
+
93
+ def __init__(
94
+ self,
95
+ validator: ValidationService,
96
+ registry: OperatorRegistry,
97
+ dynamics: DynamicsEngine,
98
+ telemetry: TelemetryCollector,
99
+ ):
100
+ """Initialize orchestrator with injected services.
101
+
102
+ Parameters
103
+ ----------
104
+ validator : ValidationService
105
+ Service for validation.
106
+ registry : OperatorRegistry
107
+ Service for operator lookup.
108
+ dynamics : DynamicsEngine
109
+ Service for dynamics computation.
110
+ telemetry : TelemetryCollector
111
+ Service for telemetry collection.
112
+ """
113
+ self._validator = validator
114
+ self._registry = registry
115
+ self._dynamics = dynamics
116
+ self._telemetry = telemetry
117
+
118
+ @classmethod
119
+ def from_container(cls, container) -> TNFROrchestrator:
120
+ """Create orchestrator from dependency injection container.
121
+
122
+ Parameters
123
+ ----------
124
+ container : TNFRContainer
125
+ Container with registered services.
126
+
127
+ Returns
128
+ -------
129
+ TNFROrchestrator
130
+ Configured orchestrator instance.
131
+
132
+ Examples
133
+ --------
134
+ >>> from tnfr.core.container import TNFRContainer
135
+ >>> container = TNFRContainer.create_default()
136
+ >>> orch = TNFROrchestrator.from_container(container)
137
+ """
138
+ from ..core.interfaces import (
139
+ DynamicsEngine,
140
+ OperatorRegistry,
141
+ TelemetryCollector,
142
+ ValidationService,
143
+ )
144
+
145
+ return cls(
146
+ validator=container.get(ValidationService),
147
+ registry=container.get(OperatorRegistry),
148
+ dynamics=container.get(DynamicsEngine),
149
+ telemetry=container.get(TelemetryCollector),
150
+ )
151
+
152
+ def execute_sequence(
153
+ self,
154
+ graph: TNFRGraph,
155
+ node: NodeId,
156
+ sequence: Iterable[str | Operator],
157
+ *,
158
+ enable_telemetry: bool = False,
159
+ ) -> None:
160
+ """Execute operator sequence with separated responsibilities.
161
+
162
+ This method coordinates the full execution pipeline:
163
+ 1. Validate sequence against TNFR grammar
164
+ 2. Convert tokens to operator instances
165
+ 3. Apply each operator with telemetry (optional)
166
+ 4. Update ΔNFR after each operator
167
+ 5. Integrate nodal equation
168
+
169
+ Parameters
170
+ ----------
171
+ graph : TNFRGraph
172
+ Graph containing the target node.
173
+ node : NodeId
174
+ Node identifier to receive operators.
175
+ sequence : iterable of str or Operator
176
+ Operator tokens or instances to apply.
177
+ enable_telemetry : bool, optional
178
+ Whether to capture detailed telemetry traces. Default is False.
179
+
180
+ Raises
181
+ ------
182
+ ValueError
183
+ When sequence validation fails or operators are unknown.
184
+
185
+ Examples
186
+ --------
187
+ Execute with string tokens:
188
+
189
+ >>> from tnfr.structural import create_nfr
190
+ >>> G, n = create_nfr("node1", epi=1.0)
191
+ >>> orch = TNFROrchestrator.from_container(container)
192
+ >>> orch.execute_sequence(G, n, ["emission", "coherence"])
193
+
194
+ Execute with telemetry enabled:
195
+
196
+ >>> orch.execute_sequence(G, n, ["emission"], enable_telemetry=True)
197
+ >>> # Check transitions in G.graph["_trace_transitions"]
198
+ """
199
+ # Convert sequence to list and extract operator tokens
200
+ ops_list = list(sequence)
201
+
202
+ # Separate tokens from Operator instances
203
+ tokens = []
204
+ operator_instances = []
205
+ for item in ops_list:
206
+ if isinstance(item, str):
207
+ tokens.append(item)
208
+ operator_instances.append(None) # Will resolve later
209
+ else:
210
+ # Assume it's an Operator instance
211
+ tokens.append(item.name)
212
+ operator_instances.append(item)
213
+
214
+ # Step 1: Validation (delegated to ValidationService)
215
+ if tokens: # Skip validation for empty sequences
216
+ self._validator.validate_sequence(tokens)
217
+
218
+ # Step 2: Execution with optional telemetry
219
+ if enable_telemetry:
220
+ with self._telemetry.trace_context(graph) as tracer:
221
+ self._execute_with_telemetry(
222
+ graph, node, tokens, operator_instances, tracer
223
+ )
224
+ else:
225
+ self._execute_without_telemetry(graph, node, tokens, operator_instances)
226
+
227
+ def _execute_with_telemetry(
228
+ self, graph, node, tokens, operator_instances, tracer
229
+ ) -> None:
230
+ """Execute sequence with telemetry capture."""
231
+ for token, op_instance in zip(tokens, operator_instances):
232
+ # Pre-execution: capture state
233
+ pre_state = tracer.capture_state(graph)
234
+
235
+ # Execution: apply operator
236
+ if op_instance is None:
237
+ operator_cls = self._registry.get_operator(token)
238
+ operator_cls()(graph, node) # Instantiate and call
239
+ else:
240
+ op_instance(graph, node)
241
+
242
+ # Post-execution: update dynamics
243
+ self._dynamics.update_delta_nfr(graph)
244
+
245
+ # Telemetry: record transition
246
+ post_state = tracer.capture_state(graph)
247
+ tracer.record_transition(token, pre_state, post_state)
248
+
249
+ def _execute_without_telemetry(
250
+ self, graph, node, tokens, operator_instances
251
+ ) -> None:
252
+ """Execute sequence without telemetry overhead."""
253
+ for token, op_instance in zip(tokens, operator_instances):
254
+ # Execution: apply operator
255
+ if op_instance is None:
256
+ operator_cls = self._registry.get_operator(token)
257
+ operator_cls()(graph, node) # Instantiate and call
258
+ else:
259
+ op_instance(graph, node)
260
+
261
+ # Post-execution: update dynamics
262
+ self._dynamics.update_delta_nfr(graph)
263
+
264
+ def validate_only(self, sequence: list[str]) -> None:
265
+ """Validate sequence without executing.
266
+
267
+ This method is useful for pre-flight checks before committing to
268
+ execution.
269
+
270
+ Parameters
271
+ ----------
272
+ sequence : list of str
273
+ Operator tokens to validate.
274
+
275
+ Raises
276
+ ------
277
+ ValueError
278
+ When sequence violates grammar rules.
279
+
280
+ Examples
281
+ --------
282
+ >>> orch.validate_only(["emission", "coherence"]) # OK
283
+ >>> orch.validate_only(["unknown_op"]) # Raises ValueError
284
+ """
285
+ self._validator.validate_sequence(sequence)
286
+
287
+ def get_coherence(self, graph: TNFRGraph) -> float:
288
+ """Get current coherence C(t) from telemetry service.
289
+
290
+ Parameters
291
+ ----------
292
+ graph : TNFRGraph
293
+ Graph to measure.
294
+
295
+ Returns
296
+ -------
297
+ float
298
+ Current coherence value.
299
+
300
+ Examples
301
+ --------
302
+ >>> coherence = orch.get_coherence(G)
303
+ >>> print(f"C(t) = {coherence:.3f}")
304
+ """
305
+ return self._telemetry.compute_coherence(graph)
306
+
307
+ def get_sense_index(self, graph: TNFRGraph) -> dict:
308
+ """Get sense index Si from telemetry service.
309
+
310
+ Parameters
311
+ ----------
312
+ graph : TNFRGraph
313
+ Graph to measure.
314
+
315
+ Returns
316
+ -------
317
+ dict
318
+ Sense index metrics.
319
+
320
+ Examples
321
+ --------
322
+ >>> si_metrics = orch.get_sense_index(G)
323
+ >>> print(f"Si = {si_metrics['Si']:.3f}")
324
+ """
325
+ return self._telemetry.compute_sense_index(graph)
@@ -0,0 +1,39 @@
1
+ """Sparse representations for memory-efficient TNFR networks.
2
+
3
+ This module provides memory-optimized graph representations that reduce
4
+ per-node memory footprint from ~8.5KB to <1KB while preserving all TNFR
5
+ canonical invariants.
6
+
7
+ Canonical Invariants Preserved
8
+ ------------------------------
9
+ 1. Nodal equation: ∂EPI/∂t = νf · ΔNFR(t)
10
+ 2. Sparse storage: only non-default values stored
11
+ 3. Cache coherence: intelligent caching for repeated computations
12
+ 4. Deterministic computation: same inputs yield same outputs
13
+
14
+ Examples
15
+ --------
16
+ Create a sparse graph with 10,000 nodes:
17
+
18
+ >>> from tnfr.sparse import SparseTNFRGraph
19
+ >>> graph = SparseTNFRGraph(node_count=10000, expected_density=0.1)
20
+ >>> footprint = graph.memory_footprint()
21
+ >>> print(f"Memory per node: {footprint.per_node_kb:.2f} KB") # doctest: +SKIP
22
+ Memory per node: 0.85 KB
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ from .representations import (
28
+ CompactAttributeStore,
29
+ MemoryReport,
30
+ SparseCache,
31
+ SparseTNFRGraph,
32
+ )
33
+
34
+ __all__ = [
35
+ "SparseTNFRGraph",
36
+ "CompactAttributeStore",
37
+ "MemoryReport",
38
+ "SparseCache",
39
+ ]