tnfr 3.0.3__py3-none-any.whl → 8.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of tnfr might be problematic. Click here for more details.

Files changed (360) hide show
  1. tnfr/__init__.py +375 -56
  2. tnfr/__init__.pyi +33 -0
  3. tnfr/_compat.py +10 -0
  4. tnfr/_generated_version.py +34 -0
  5. tnfr/_version.py +49 -0
  6. tnfr/_version.pyi +7 -0
  7. tnfr/alias.py +723 -0
  8. tnfr/alias.pyi +108 -0
  9. tnfr/backends/__init__.py +354 -0
  10. tnfr/backends/jax_backend.py +173 -0
  11. tnfr/backends/numpy_backend.py +238 -0
  12. tnfr/backends/optimized_numpy.py +420 -0
  13. tnfr/backends/torch_backend.py +408 -0
  14. tnfr/cache.py +171 -0
  15. tnfr/cache.pyi +13 -0
  16. tnfr/cli/__init__.py +110 -0
  17. tnfr/cli/__init__.pyi +26 -0
  18. tnfr/cli/arguments.py +489 -0
  19. tnfr/cli/arguments.pyi +29 -0
  20. tnfr/cli/execution.py +914 -0
  21. tnfr/cli/execution.pyi +70 -0
  22. tnfr/cli/interactive_validator.py +614 -0
  23. tnfr/cli/utils.py +51 -0
  24. tnfr/cli/utils.pyi +7 -0
  25. tnfr/cli/validate.py +236 -0
  26. tnfr/compat/__init__.py +85 -0
  27. tnfr/compat/dataclass.py +136 -0
  28. tnfr/compat/jsonschema_stub.py +61 -0
  29. tnfr/compat/matplotlib_stub.py +73 -0
  30. tnfr/compat/numpy_stub.py +155 -0
  31. tnfr/config/__init__.py +224 -0
  32. tnfr/config/__init__.pyi +10 -0
  33. tnfr/config/constants.py +104 -0
  34. tnfr/config/constants.pyi +12 -0
  35. tnfr/config/defaults.py +54 -0
  36. tnfr/config/defaults_core.py +212 -0
  37. tnfr/config/defaults_init.py +33 -0
  38. tnfr/config/defaults_metric.py +104 -0
  39. tnfr/config/feature_flags.py +81 -0
  40. tnfr/config/feature_flags.pyi +16 -0
  41. tnfr/config/glyph_constants.py +31 -0
  42. tnfr/config/init.py +77 -0
  43. tnfr/config/init.pyi +8 -0
  44. tnfr/config/operator_names.py +254 -0
  45. tnfr/config/operator_names.pyi +36 -0
  46. tnfr/config/physics_derivation.py +354 -0
  47. tnfr/config/presets.py +83 -0
  48. tnfr/config/presets.pyi +7 -0
  49. tnfr/config/security.py +927 -0
  50. tnfr/config/thresholds.py +114 -0
  51. tnfr/config/tnfr_config.py +498 -0
  52. tnfr/constants/__init__.py +92 -0
  53. tnfr/constants/__init__.pyi +92 -0
  54. tnfr/constants/aliases.py +33 -0
  55. tnfr/constants/aliases.pyi +27 -0
  56. tnfr/constants/init.py +33 -0
  57. tnfr/constants/init.pyi +12 -0
  58. tnfr/constants/metric.py +104 -0
  59. tnfr/constants/metric.pyi +19 -0
  60. tnfr/core/__init__.py +33 -0
  61. tnfr/core/container.py +226 -0
  62. tnfr/core/default_implementations.py +329 -0
  63. tnfr/core/interfaces.py +279 -0
  64. tnfr/dynamics/__init__.py +238 -0
  65. tnfr/dynamics/__init__.pyi +83 -0
  66. tnfr/dynamics/adaptation.py +267 -0
  67. tnfr/dynamics/adaptation.pyi +7 -0
  68. tnfr/dynamics/adaptive_sequences.py +189 -0
  69. tnfr/dynamics/adaptive_sequences.pyi +14 -0
  70. tnfr/dynamics/aliases.py +23 -0
  71. tnfr/dynamics/aliases.pyi +19 -0
  72. tnfr/dynamics/bifurcation.py +232 -0
  73. tnfr/dynamics/canonical.py +229 -0
  74. tnfr/dynamics/canonical.pyi +48 -0
  75. tnfr/dynamics/coordination.py +385 -0
  76. tnfr/dynamics/coordination.pyi +25 -0
  77. tnfr/dynamics/dnfr.py +3034 -0
  78. tnfr/dynamics/dnfr.pyi +26 -0
  79. tnfr/dynamics/dynamic_limits.py +225 -0
  80. tnfr/dynamics/feedback.py +252 -0
  81. tnfr/dynamics/feedback.pyi +24 -0
  82. tnfr/dynamics/fused_dnfr.py +454 -0
  83. tnfr/dynamics/homeostasis.py +157 -0
  84. tnfr/dynamics/homeostasis.pyi +14 -0
  85. tnfr/dynamics/integrators.py +661 -0
  86. tnfr/dynamics/integrators.pyi +36 -0
  87. tnfr/dynamics/learning.py +310 -0
  88. tnfr/dynamics/learning.pyi +33 -0
  89. tnfr/dynamics/metabolism.py +254 -0
  90. tnfr/dynamics/nbody.py +796 -0
  91. tnfr/dynamics/nbody_tnfr.py +783 -0
  92. tnfr/dynamics/propagation.py +326 -0
  93. tnfr/dynamics/runtime.py +908 -0
  94. tnfr/dynamics/runtime.pyi +77 -0
  95. tnfr/dynamics/sampling.py +36 -0
  96. tnfr/dynamics/sampling.pyi +7 -0
  97. tnfr/dynamics/selectors.py +711 -0
  98. tnfr/dynamics/selectors.pyi +85 -0
  99. tnfr/dynamics/structural_clip.py +207 -0
  100. tnfr/errors/__init__.py +37 -0
  101. tnfr/errors/contextual.py +492 -0
  102. tnfr/execution.py +223 -0
  103. tnfr/execution.pyi +45 -0
  104. tnfr/extensions/__init__.py +205 -0
  105. tnfr/extensions/__init__.pyi +18 -0
  106. tnfr/extensions/base.py +173 -0
  107. tnfr/extensions/base.pyi +35 -0
  108. tnfr/extensions/business/__init__.py +71 -0
  109. tnfr/extensions/business/__init__.pyi +11 -0
  110. tnfr/extensions/business/cookbook.py +88 -0
  111. tnfr/extensions/business/cookbook.pyi +8 -0
  112. tnfr/extensions/business/health_analyzers.py +202 -0
  113. tnfr/extensions/business/health_analyzers.pyi +9 -0
  114. tnfr/extensions/business/patterns.py +183 -0
  115. tnfr/extensions/business/patterns.pyi +8 -0
  116. tnfr/extensions/medical/__init__.py +73 -0
  117. tnfr/extensions/medical/__init__.pyi +11 -0
  118. tnfr/extensions/medical/cookbook.py +88 -0
  119. tnfr/extensions/medical/cookbook.pyi +8 -0
  120. tnfr/extensions/medical/health_analyzers.py +181 -0
  121. tnfr/extensions/medical/health_analyzers.pyi +9 -0
  122. tnfr/extensions/medical/patterns.py +163 -0
  123. tnfr/extensions/medical/patterns.pyi +8 -0
  124. tnfr/flatten.py +262 -0
  125. tnfr/flatten.pyi +21 -0
  126. tnfr/gamma.py +354 -0
  127. tnfr/gamma.pyi +36 -0
  128. tnfr/glyph_history.py +377 -0
  129. tnfr/glyph_history.pyi +35 -0
  130. tnfr/glyph_runtime.py +19 -0
  131. tnfr/glyph_runtime.pyi +8 -0
  132. tnfr/immutable.py +218 -0
  133. tnfr/immutable.pyi +36 -0
  134. tnfr/initialization.py +203 -0
  135. tnfr/initialization.pyi +65 -0
  136. tnfr/io.py +10 -0
  137. tnfr/io.pyi +13 -0
  138. tnfr/locking.py +37 -0
  139. tnfr/locking.pyi +7 -0
  140. tnfr/mathematics/__init__.py +79 -0
  141. tnfr/mathematics/backend.py +453 -0
  142. tnfr/mathematics/backend.pyi +99 -0
  143. tnfr/mathematics/dynamics.py +408 -0
  144. tnfr/mathematics/dynamics.pyi +90 -0
  145. tnfr/mathematics/epi.py +391 -0
  146. tnfr/mathematics/epi.pyi +65 -0
  147. tnfr/mathematics/generators.py +242 -0
  148. tnfr/mathematics/generators.pyi +29 -0
  149. tnfr/mathematics/metrics.py +119 -0
  150. tnfr/mathematics/metrics.pyi +16 -0
  151. tnfr/mathematics/operators.py +239 -0
  152. tnfr/mathematics/operators.pyi +59 -0
  153. tnfr/mathematics/operators_factory.py +124 -0
  154. tnfr/mathematics/operators_factory.pyi +11 -0
  155. tnfr/mathematics/projection.py +87 -0
  156. tnfr/mathematics/projection.pyi +33 -0
  157. tnfr/mathematics/runtime.py +182 -0
  158. tnfr/mathematics/runtime.pyi +64 -0
  159. tnfr/mathematics/spaces.py +256 -0
  160. tnfr/mathematics/spaces.pyi +83 -0
  161. tnfr/mathematics/transforms.py +305 -0
  162. tnfr/mathematics/transforms.pyi +62 -0
  163. tnfr/metrics/__init__.py +79 -0
  164. tnfr/metrics/__init__.pyi +20 -0
  165. tnfr/metrics/buffer_cache.py +163 -0
  166. tnfr/metrics/buffer_cache.pyi +24 -0
  167. tnfr/metrics/cache_utils.py +214 -0
  168. tnfr/metrics/coherence.py +2009 -0
  169. tnfr/metrics/coherence.pyi +129 -0
  170. tnfr/metrics/common.py +158 -0
  171. tnfr/metrics/common.pyi +35 -0
  172. tnfr/metrics/core.py +316 -0
  173. tnfr/metrics/core.pyi +13 -0
  174. tnfr/metrics/diagnosis.py +833 -0
  175. tnfr/metrics/diagnosis.pyi +86 -0
  176. tnfr/metrics/emergence.py +245 -0
  177. tnfr/metrics/export.py +179 -0
  178. tnfr/metrics/export.pyi +7 -0
  179. tnfr/metrics/glyph_timing.py +379 -0
  180. tnfr/metrics/glyph_timing.pyi +81 -0
  181. tnfr/metrics/learning_metrics.py +280 -0
  182. tnfr/metrics/learning_metrics.pyi +21 -0
  183. tnfr/metrics/phase_coherence.py +351 -0
  184. tnfr/metrics/phase_compatibility.py +349 -0
  185. tnfr/metrics/reporting.py +183 -0
  186. tnfr/metrics/reporting.pyi +25 -0
  187. tnfr/metrics/sense_index.py +1203 -0
  188. tnfr/metrics/sense_index.pyi +9 -0
  189. tnfr/metrics/trig.py +373 -0
  190. tnfr/metrics/trig.pyi +13 -0
  191. tnfr/metrics/trig_cache.py +233 -0
  192. tnfr/metrics/trig_cache.pyi +10 -0
  193. tnfr/multiscale/__init__.py +32 -0
  194. tnfr/multiscale/hierarchical.py +517 -0
  195. tnfr/node.py +763 -0
  196. tnfr/node.pyi +139 -0
  197. tnfr/observers.py +255 -130
  198. tnfr/observers.pyi +31 -0
  199. tnfr/ontosim.py +144 -137
  200. tnfr/ontosim.pyi +28 -0
  201. tnfr/operators/__init__.py +1672 -0
  202. tnfr/operators/__init__.pyi +31 -0
  203. tnfr/operators/algebra.py +277 -0
  204. tnfr/operators/canonical_patterns.py +420 -0
  205. tnfr/operators/cascade.py +267 -0
  206. tnfr/operators/cycle_detection.py +358 -0
  207. tnfr/operators/definitions.py +4108 -0
  208. tnfr/operators/definitions.pyi +78 -0
  209. tnfr/operators/grammar.py +1164 -0
  210. tnfr/operators/grammar.pyi +140 -0
  211. tnfr/operators/hamiltonian.py +710 -0
  212. tnfr/operators/health_analyzer.py +809 -0
  213. tnfr/operators/jitter.py +272 -0
  214. tnfr/operators/jitter.pyi +11 -0
  215. tnfr/operators/lifecycle.py +314 -0
  216. tnfr/operators/metabolism.py +618 -0
  217. tnfr/operators/metrics.py +2138 -0
  218. tnfr/operators/network_analysis/__init__.py +27 -0
  219. tnfr/operators/network_analysis/source_detection.py +186 -0
  220. tnfr/operators/nodal_equation.py +395 -0
  221. tnfr/operators/pattern_detection.py +660 -0
  222. tnfr/operators/patterns.py +669 -0
  223. tnfr/operators/postconditions/__init__.py +38 -0
  224. tnfr/operators/postconditions/mutation.py +236 -0
  225. tnfr/operators/preconditions/__init__.py +1226 -0
  226. tnfr/operators/preconditions/coherence.py +305 -0
  227. tnfr/operators/preconditions/dissonance.py +236 -0
  228. tnfr/operators/preconditions/emission.py +128 -0
  229. tnfr/operators/preconditions/mutation.py +580 -0
  230. tnfr/operators/preconditions/reception.py +125 -0
  231. tnfr/operators/preconditions/resonance.py +364 -0
  232. tnfr/operators/registry.py +74 -0
  233. tnfr/operators/registry.pyi +9 -0
  234. tnfr/operators/remesh.py +1809 -0
  235. tnfr/operators/remesh.pyi +26 -0
  236. tnfr/operators/structural_units.py +268 -0
  237. tnfr/operators/unified_grammar.py +105 -0
  238. tnfr/parallel/__init__.py +54 -0
  239. tnfr/parallel/auto_scaler.py +234 -0
  240. tnfr/parallel/distributed.py +384 -0
  241. tnfr/parallel/engine.py +238 -0
  242. tnfr/parallel/gpu_engine.py +420 -0
  243. tnfr/parallel/monitoring.py +248 -0
  244. tnfr/parallel/partitioner.py +459 -0
  245. tnfr/py.typed +0 -0
  246. tnfr/recipes/__init__.py +22 -0
  247. tnfr/recipes/cookbook.py +743 -0
  248. tnfr/rng.py +178 -0
  249. tnfr/rng.pyi +26 -0
  250. tnfr/schemas/__init__.py +8 -0
  251. tnfr/schemas/grammar.json +94 -0
  252. tnfr/sdk/__init__.py +107 -0
  253. tnfr/sdk/__init__.pyi +19 -0
  254. tnfr/sdk/adaptive_system.py +173 -0
  255. tnfr/sdk/adaptive_system.pyi +21 -0
  256. tnfr/sdk/builders.py +370 -0
  257. tnfr/sdk/builders.pyi +51 -0
  258. tnfr/sdk/fluent.py +1121 -0
  259. tnfr/sdk/fluent.pyi +74 -0
  260. tnfr/sdk/templates.py +342 -0
  261. tnfr/sdk/templates.pyi +41 -0
  262. tnfr/sdk/utils.py +341 -0
  263. tnfr/secure_config.py +46 -0
  264. tnfr/security/__init__.py +70 -0
  265. tnfr/security/database.py +514 -0
  266. tnfr/security/subprocess.py +503 -0
  267. tnfr/security/validation.py +290 -0
  268. tnfr/selector.py +247 -0
  269. tnfr/selector.pyi +19 -0
  270. tnfr/sense.py +378 -0
  271. tnfr/sense.pyi +23 -0
  272. tnfr/services/__init__.py +17 -0
  273. tnfr/services/orchestrator.py +325 -0
  274. tnfr/sparse/__init__.py +39 -0
  275. tnfr/sparse/representations.py +492 -0
  276. tnfr/structural.py +705 -0
  277. tnfr/structural.pyi +83 -0
  278. tnfr/telemetry/__init__.py +35 -0
  279. tnfr/telemetry/cache_metrics.py +226 -0
  280. tnfr/telemetry/cache_metrics.pyi +64 -0
  281. tnfr/telemetry/nu_f.py +422 -0
  282. tnfr/telemetry/nu_f.pyi +108 -0
  283. tnfr/telemetry/verbosity.py +36 -0
  284. tnfr/telemetry/verbosity.pyi +15 -0
  285. tnfr/tokens.py +58 -0
  286. tnfr/tokens.pyi +36 -0
  287. tnfr/tools/__init__.py +20 -0
  288. tnfr/tools/domain_templates.py +478 -0
  289. tnfr/tools/sequence_generator.py +846 -0
  290. tnfr/topology/__init__.py +13 -0
  291. tnfr/topology/asymmetry.py +151 -0
  292. tnfr/trace.py +543 -0
  293. tnfr/trace.pyi +42 -0
  294. tnfr/tutorials/__init__.py +38 -0
  295. tnfr/tutorials/autonomous_evolution.py +285 -0
  296. tnfr/tutorials/interactive.py +1576 -0
  297. tnfr/tutorials/structural_metabolism.py +238 -0
  298. tnfr/types.py +775 -0
  299. tnfr/types.pyi +357 -0
  300. tnfr/units.py +68 -0
  301. tnfr/units.pyi +13 -0
  302. tnfr/utils/__init__.py +282 -0
  303. tnfr/utils/__init__.pyi +215 -0
  304. tnfr/utils/cache.py +4223 -0
  305. tnfr/utils/cache.pyi +470 -0
  306. tnfr/utils/callbacks.py +375 -0
  307. tnfr/utils/callbacks.pyi +49 -0
  308. tnfr/utils/chunks.py +108 -0
  309. tnfr/utils/chunks.pyi +22 -0
  310. tnfr/utils/data.py +428 -0
  311. tnfr/utils/data.pyi +74 -0
  312. tnfr/utils/graph.py +85 -0
  313. tnfr/utils/graph.pyi +10 -0
  314. tnfr/utils/init.py +821 -0
  315. tnfr/utils/init.pyi +80 -0
  316. tnfr/utils/io.py +559 -0
  317. tnfr/utils/io.pyi +66 -0
  318. tnfr/utils/numeric.py +114 -0
  319. tnfr/utils/numeric.pyi +21 -0
  320. tnfr/validation/__init__.py +257 -0
  321. tnfr/validation/__init__.pyi +85 -0
  322. tnfr/validation/compatibility.py +460 -0
  323. tnfr/validation/compatibility.pyi +6 -0
  324. tnfr/validation/config.py +73 -0
  325. tnfr/validation/graph.py +139 -0
  326. tnfr/validation/graph.pyi +18 -0
  327. tnfr/validation/input_validation.py +755 -0
  328. tnfr/validation/invariants.py +712 -0
  329. tnfr/validation/rules.py +253 -0
  330. tnfr/validation/rules.pyi +44 -0
  331. tnfr/validation/runtime.py +279 -0
  332. tnfr/validation/runtime.pyi +28 -0
  333. tnfr/validation/sequence_validator.py +162 -0
  334. tnfr/validation/soft_filters.py +170 -0
  335. tnfr/validation/soft_filters.pyi +32 -0
  336. tnfr/validation/spectral.py +164 -0
  337. tnfr/validation/spectral.pyi +42 -0
  338. tnfr/validation/validator.py +1266 -0
  339. tnfr/validation/window.py +39 -0
  340. tnfr/validation/window.pyi +1 -0
  341. tnfr/visualization/__init__.py +98 -0
  342. tnfr/visualization/cascade_viz.py +256 -0
  343. tnfr/visualization/hierarchy.py +284 -0
  344. tnfr/visualization/sequence_plotter.py +784 -0
  345. tnfr/viz/__init__.py +60 -0
  346. tnfr/viz/matplotlib.py +278 -0
  347. tnfr/viz/matplotlib.pyi +35 -0
  348. tnfr-8.5.0.dist-info/METADATA +573 -0
  349. tnfr-8.5.0.dist-info/RECORD +353 -0
  350. tnfr-8.5.0.dist-info/entry_points.txt +3 -0
  351. tnfr-3.0.3.dist-info/licenses/LICENSE.txt → tnfr-8.5.0.dist-info/licenses/LICENSE.md +1 -1
  352. tnfr/constants.py +0 -183
  353. tnfr/dynamics.py +0 -543
  354. tnfr/helpers.py +0 -198
  355. tnfr/main.py +0 -37
  356. tnfr/operators.py +0 -296
  357. tnfr-3.0.3.dist-info/METADATA +0 -35
  358. tnfr-3.0.3.dist-info/RECORD +0 -13
  359. {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
  360. {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,92 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Callable, TypeVar
5
+
6
+ from ..types import GraphLike, TNFRConfigValue
7
+ from .core import CORE_DEFAULTS as CORE_DEFAULTS
8
+ from .core import REMESH_DEFAULTS as REMESH_DEFAULTS
9
+ from .init import INIT_DEFAULTS as INIT_DEFAULTS
10
+ from .metric import COHERENCE as COHERENCE
11
+ from .metric import DIAGNOSIS as DIAGNOSIS
12
+ from .metric import GRAMMAR_CANON as GRAMMAR_CANON
13
+ from .metric import METRIC_DEFAULTS as METRIC_DEFAULTS
14
+ from .metric import METRICS as METRICS
15
+ from .metric import SIGMA as SIGMA
16
+ from .metric import TRACE as TRACE
17
+
18
+ T = TypeVar("T")
19
+
20
+ __all__ = (
21
+ "CORE_DEFAULTS",
22
+ "INIT_DEFAULTS",
23
+ "REMESH_DEFAULTS",
24
+ "METRIC_DEFAULTS",
25
+ "SIGMA",
26
+ "TRACE",
27
+ "METRICS",
28
+ "GRAMMAR_CANON",
29
+ "COHERENCE",
30
+ "DIAGNOSIS",
31
+ "DEFAULTS",
32
+ "DEFAULT_SECTIONS",
33
+ "ALIASES",
34
+ "inject_defaults",
35
+ "merge_overrides",
36
+ "get_param",
37
+ "get_graph_param",
38
+ "get_aliases",
39
+ "VF_KEY",
40
+ "THETA_KEY",
41
+ "VF_PRIMARY",
42
+ "THETA_PRIMARY",
43
+ "DNFR_PRIMARY",
44
+ "EPI_PRIMARY",
45
+ "EPI_KIND_PRIMARY",
46
+ "SI_PRIMARY",
47
+ "dEPI_PRIMARY",
48
+ "D2EPI_PRIMARY",
49
+ "dVF_PRIMARY",
50
+ "D2VF_PRIMARY",
51
+ "dSI_PRIMARY",
52
+ "STATE_STABLE",
53
+ "STATE_TRANSITION",
54
+ "STATE_DISSONANT",
55
+ "CANONICAL_STATE_TOKENS",
56
+ "normalise_state_token",
57
+ )
58
+
59
+ ensure_node_offset_map: Callable[[GraphLike], None] | None
60
+ DEFAULT_SECTIONS: Mapping[str, Mapping[str, TNFRConfigValue]]
61
+ DEFAULTS: Mapping[str, TNFRConfigValue]
62
+ ALIASES: dict[str, tuple[str, ...]]
63
+ VF_KEY: str
64
+ THETA_KEY: str
65
+ VF_PRIMARY: str
66
+ THETA_PRIMARY: str
67
+ DNFR_PRIMARY: str
68
+ EPI_PRIMARY: str
69
+ EPI_KIND_PRIMARY: str
70
+ SI_PRIMARY: str
71
+ dEPI_PRIMARY: str
72
+ D2EPI_PRIMARY: str
73
+ dVF_PRIMARY: str
74
+ D2VF_PRIMARY: str
75
+ dSI_PRIMARY: str
76
+ STATE_STABLE: str
77
+ STATE_TRANSITION: str
78
+ STATE_DISSONANT: str
79
+ CANONICAL_STATE_TOKENS: frozenset[str]
80
+
81
+ def inject_defaults(
82
+ G: GraphLike,
83
+ defaults: Mapping[str, TNFRConfigValue] = ...,
84
+ override: bool = ...,
85
+ ) -> None: ...
86
+ def merge_overrides(G: GraphLike, **overrides: TNFRConfigValue) -> None: ...
87
+ def get_param(G: GraphLike, key: str) -> TNFRConfigValue: ...
88
+ def get_graph_param(
89
+ G: GraphLike, key: str, cast: Callable[[object], T] = ...
90
+ ) -> T | None: ...
91
+ def get_aliases(key: str) -> tuple[str, ...]: ...
92
+ def normalise_state_token(token: str) -> str: ...
@@ -0,0 +1,33 @@
1
+ """Shared alias constants for TNFR attributes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from . import get_aliases
6
+
7
+ ALIAS_VF = get_aliases("VF")
8
+ ALIAS_THETA = get_aliases("THETA")
9
+ ALIAS_DNFR = get_aliases("DNFR")
10
+ ALIAS_EPI = get_aliases("EPI")
11
+ ALIAS_EPI_KIND = get_aliases("EPI_KIND")
12
+ ALIAS_SI = get_aliases("SI")
13
+ ALIAS_DEPI = get_aliases("DEPI")
14
+ ALIAS_D2EPI = get_aliases("D2EPI")
15
+ ALIAS_DVF = get_aliases("DVF")
16
+ ALIAS_D2VF = get_aliases("D2VF")
17
+ ALIAS_DSI = get_aliases("DSI")
18
+ ALIAS_EMISSION_TIMESTAMP = get_aliases("EMISSION_TIMESTAMP")
19
+
20
+ __all__ = [
21
+ "ALIAS_VF",
22
+ "ALIAS_THETA",
23
+ "ALIAS_DNFR",
24
+ "ALIAS_EPI",
25
+ "ALIAS_EPI_KIND",
26
+ "ALIAS_SI",
27
+ "ALIAS_DEPI",
28
+ "ALIAS_D2EPI",
29
+ "ALIAS_DVF",
30
+ "ALIAS_D2VF",
31
+ "ALIAS_DSI",
32
+ "ALIAS_EMISSION_TIMESTAMP",
33
+ ]
@@ -0,0 +1,27 @@
1
+ from _typeshed import Incomplete
2
+
3
+ __all__ = [
4
+ "ALIAS_VF",
5
+ "ALIAS_THETA",
6
+ "ALIAS_DNFR",
7
+ "ALIAS_EPI",
8
+ "ALIAS_EPI_KIND",
9
+ "ALIAS_SI",
10
+ "ALIAS_DEPI",
11
+ "ALIAS_D2EPI",
12
+ "ALIAS_DVF",
13
+ "ALIAS_D2VF",
14
+ "ALIAS_DSI",
15
+ ]
16
+
17
+ ALIAS_VF: Incomplete
18
+ ALIAS_THETA: Incomplete
19
+ ALIAS_DNFR: Incomplete
20
+ ALIAS_EPI: Incomplete
21
+ ALIAS_EPI_KIND: Incomplete
22
+ ALIAS_SI: Incomplete
23
+ ALIAS_DEPI: Incomplete
24
+ ALIAS_D2EPI: Incomplete
25
+ ALIAS_DVF: Incomplete
26
+ ALIAS_D2VF: Incomplete
27
+ ALIAS_DSI: Incomplete
tnfr/constants/init.py ADDED
@@ -0,0 +1,33 @@
1
+ """Initialization constants."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from dataclasses import asdict
7
+
8
+ from ..compat.dataclass import dataclass
9
+
10
+
11
+ @dataclass(frozen=True, slots=True)
12
+ class InitDefaults:
13
+ """Default parameters for node initialisation.
14
+
15
+ The fields are collected into :data:`INIT_DEFAULTS` and may therefore
16
+ appear unused to tools like Vulture.
17
+ """
18
+
19
+ INIT_RANDOM_PHASE: bool = True
20
+ INIT_THETA_MIN: float = -math.pi
21
+ INIT_THETA_MAX: float = math.pi
22
+ INIT_VF_MODE: str = "uniform"
23
+ INIT_VF_MIN: float | None = None
24
+ INIT_VF_MAX: float | None = None
25
+ INIT_VF_MEAN: float = 0.5
26
+ INIT_VF_STD: float = 0.15
27
+ INIT_VF_CLAMP_TO_LIMITS: bool = True
28
+ INIT_SI_MIN: float = 0.4
29
+ INIT_SI_MAX: float = 0.7
30
+ INIT_EPI_VALUE: float = 0.0
31
+
32
+
33
+ INIT_DEFAULTS = asdict(InitDefaults())
@@ -0,0 +1,12 @@
1
+ from typing import Any
2
+
3
+ __all__: Any
4
+
5
+ def __getattr__(name: str) -> Any: ...
6
+
7
+ INIT_DEFAULTS: Any
8
+ InitDefaults: Any
9
+ annotations: Any
10
+ asdict: Any
11
+ dataclass: Any
12
+ math: Any
@@ -0,0 +1,104 @@
1
+ """Metric constants."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import asdict, field
6
+ from types import MappingProxyType
7
+ from typing import Any
8
+
9
+ from ..compat.dataclass import dataclass
10
+
11
+
12
+ @dataclass(frozen=True, slots=True)
13
+ class MetricDefaults:
14
+ """Default parameters for metric computation.
15
+
16
+ The fields are gathered into :data:`METRIC_DEFAULTS` and exposed through
17
+ read-only views below, so they may appear unused to static analysis tools.
18
+ """
19
+
20
+ PHASE_HISTORY_MAXLEN: int = 50
21
+ STOP_EARLY: dict[str, Any] = field(
22
+ default_factory=lambda: {
23
+ "enabled": False,
24
+ "window": 25,
25
+ "fraction": 0.90,
26
+ }
27
+ )
28
+ SIGMA: dict[str, Any] = field(
29
+ default_factory=lambda: {
30
+ "enabled": True,
31
+ "weight": "Si", # "Si" | "EPI" | "1"
32
+ "smooth": 0.0, # EMA over the global vector (0=off)
33
+ "history_key": "sigma_global",
34
+ "per_node": False,
35
+ }
36
+ )
37
+ TRACE: dict[str, Any] = field(
38
+ default_factory=lambda: {
39
+ "enabled": True,
40
+ "verbosity": "debug",
41
+ "history_key": "trace_meta",
42
+ }
43
+ )
44
+ METRICS: dict[str, Any] = field(
45
+ default_factory=lambda: {
46
+ "enabled": True,
47
+ "save_by_node": True,
48
+ "normalize_series": False,
49
+ "n_jobs": 1,
50
+ "verbosity": "debug",
51
+ }
52
+ )
53
+ GRAMMAR_CANON: dict[str, Any] = field(
54
+ default_factory=lambda: {
55
+ "enabled": True,
56
+ "zhir_requires_oz_window": 3,
57
+ "zhir_dnfr_min": 0.05,
58
+ "thol_min_len": 2,
59
+ "thol_max_len": 6,
60
+ "thol_close_dnfr": 0.15,
61
+ "si_high": 0.66,
62
+ }
63
+ )
64
+ COHERENCE: dict[str, Any] = field(
65
+ default_factory=lambda: {
66
+ "enabled": True,
67
+ "scope": "neighbors",
68
+ "weights": {"phase": 0.34, "epi": 0.33, "vf": 0.20, "si": 0.13},
69
+ "self_on_diag": True,
70
+ "store_mode": "sparse",
71
+ "threshold": 0.0,
72
+ "n_jobs": 1,
73
+ "history_key": "W_sparse",
74
+ "Wi_history_key": "W_i",
75
+ "stats_history_key": "W_stats",
76
+ }
77
+ )
78
+ DIAGNOSIS: dict[str, Any] = field(
79
+ default_factory=lambda: {
80
+ "enabled": True,
81
+ "window": 16,
82
+ "history_key": "nodal_diag",
83
+ "stable": {"Rloc_hi": 0.80, "dnfr_lo": 0.20, "persist": 3},
84
+ "dissonance": {"Rloc_lo": 0.40, "dnfr_hi": 0.50, "persist": 3},
85
+ "transition": {"persist": 2},
86
+ "compute_symmetry": True,
87
+ "include_typology": False,
88
+ "advice": {
89
+ "stable": ["Coherence", "Coupling", "Resonance"],
90
+ "transition": ["Transition", "Resonance", "Self-organisation"],
91
+ "dissonant": ["Silence", "Contraction", "Mutation"],
92
+ },
93
+ }
94
+ )
95
+
96
+
97
+ METRIC_DEFAULTS = asdict(MetricDefaults())
98
+
99
+ SIGMA = MappingProxyType(METRIC_DEFAULTS["SIGMA"])
100
+ TRACE = MappingProxyType(METRIC_DEFAULTS["TRACE"])
101
+ METRICS = MappingProxyType(METRIC_DEFAULTS["METRICS"])
102
+ GRAMMAR_CANON = MappingProxyType(METRIC_DEFAULTS["GRAMMAR_CANON"])
103
+ COHERENCE = MappingProxyType(METRIC_DEFAULTS["COHERENCE"])
104
+ DIAGNOSIS = MappingProxyType(METRIC_DEFAULTS["DIAGNOSIS"])
@@ -0,0 +1,19 @@
1
+ from typing import Any
2
+
3
+ __all__: Any
4
+
5
+ def __getattr__(name: str) -> Any: ...
6
+
7
+ COHERENCE: Any
8
+ DIAGNOSIS: Any
9
+ GRAMMAR_CANON: Any
10
+ METRICS: Any
11
+ METRIC_DEFAULTS: Any
12
+ MappingProxyType: Any
13
+ MetricDefaults: Any
14
+ SIGMA: Any
15
+ TRACE: Any
16
+ annotations: Any
17
+ asdict: Any
18
+ dataclass: Any
19
+ field: Any
tnfr/core/__init__.py ADDED
@@ -0,0 +1,33 @@
1
+ """Core architectural components for TNFR engine.
2
+
3
+ This package contains the foundational interfaces and dependency injection
4
+ infrastructure that enable separation of responsibilities across the TNFR
5
+ engine layers.
6
+
7
+ Public API
8
+ ----------
9
+ OperatorRegistry, ValidationService, DynamicsEngine, TelemetryCollector
10
+ Protocol interfaces defining contracts for each architectural layer.
11
+ TNFRContainer
12
+ Dependency injection container for configuring engine components.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from .container import TNFRContainer
18
+ from .interfaces import (
19
+ DynamicsEngine,
20
+ OperatorRegistry,
21
+ TelemetryCollector,
22
+ TraceContext,
23
+ ValidationService,
24
+ )
25
+
26
+ __all__ = (
27
+ "OperatorRegistry",
28
+ "ValidationService",
29
+ "DynamicsEngine",
30
+ "TelemetryCollector",
31
+ "TraceContext",
32
+ "TNFRContainer",
33
+ )
tnfr/core/container.py ADDED
@@ -0,0 +1,226 @@
1
+ """Dependency injection container for TNFR engine components.
2
+
3
+ This module provides a lightweight dependency injection container that allows
4
+ configuring and resolving engine components (validators, registries, dynamics
5
+ engines, telemetry collectors) without hard-coding implementations.
6
+
7
+ The container supports both singleton and factory registrations, enabling
8
+ flexible composition of TNFR services while maintaining clean separation of
9
+ concerns.
10
+
11
+ Examples
12
+ --------
13
+ Create a container with default implementations:
14
+
15
+ >>> container = TNFRContainer.create_default()
16
+ >>> validator = container.get(ValidationService)
17
+ >>> validator.validate_sequence(["emission", "coherence"])
18
+
19
+ Register custom implementations:
20
+
21
+ >>> container = TNFRContainer()
22
+ >>> container.register_singleton(ValidationService, CustomValidator())
23
+ >>> validator = container.get(ValidationService)
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ from typing import Any, Callable, TypeVar
29
+
30
+ T = TypeVar("T")
31
+
32
+ __all__ = ("TNFRContainer",)
33
+
34
+
35
+ class TNFRContainer:
36
+ """Dependency injection container for TNFR engine components.
37
+
38
+ The container manages the lifecycle of engine services, allowing
39
+ registration of singletons (reused instances) or factories (fresh
40
+ instances on each request). This enables flexible configuration without
41
+ coupling client code to specific implementations.
42
+
43
+ Examples
44
+ --------
45
+ Basic usage with singleton registration:
46
+
47
+ >>> from tnfr.core.interfaces import ValidationService
48
+ >>> class MyValidator:
49
+ ... def validate_sequence(self, seq):
50
+ ... pass
51
+ ... def validate_graph_state(self, graph):
52
+ ... pass
53
+ >>> container = TNFRContainer()
54
+ >>> container.register_singleton(ValidationService, MyValidator())
55
+ >>> validator = container.get(ValidationService)
56
+
57
+ Factory registration for per-request instances:
58
+
59
+ >>> container.register_factory(ValidationService, MyValidator)
60
+ >>> v1 = container.get(ValidationService)
61
+ >>> v2 = container.get(ValidationService)
62
+ >>> v1 is not v2 # Different instances
63
+ True
64
+ """
65
+
66
+ def __init__(self) -> None:
67
+ """Initialize an empty container."""
68
+ self._instances: dict[Any, Any] = {}
69
+ self._factories: dict[Any, Callable[[], Any]] = {}
70
+ self._is_singleton: dict[Any, bool] = {} # Track singleton status
71
+
72
+ def register_singleton(self, interface: type[T], implementation: T) -> None:
73
+ """Register an implementation as a singleton.
74
+
75
+ The provided instance will be cached and returned for all subsequent
76
+ requests for this interface.
77
+
78
+ Parameters
79
+ ----------
80
+ interface : type
81
+ The interface or abstract type to register against.
82
+ implementation : T
83
+ The concrete instance to return for this interface.
84
+
85
+ Examples
86
+ --------
87
+ >>> container = TNFRContainer()
88
+ >>> container.register_singleton(ValidationService, MyValidator())
89
+ """
90
+ # Store as a factory that returns the same instance
91
+ self._factories[interface] = lambda: implementation
92
+ self._is_singleton[interface] = True
93
+
94
+ def register_factory(
95
+ self, interface: type[T], factory_func: Callable[[], T]
96
+ ) -> None:
97
+ """Register a factory function for creating instances.
98
+
99
+ The factory will be called each time the interface is requested,
100
+ allowing fresh instances or cached instances depending on the
101
+ factory implementation.
102
+
103
+ Parameters
104
+ ----------
105
+ interface : type
106
+ The interface or abstract type to register against.
107
+ factory_func : callable
108
+ Function that creates and returns an instance of the interface.
109
+
110
+ Examples
111
+ --------
112
+ >>> container = TNFRContainer()
113
+ >>> container.register_factory(ValidationService, MyValidator)
114
+ """
115
+ self._factories[interface] = factory_func
116
+ self._is_singleton[interface] = False
117
+
118
+ def get(self, interface: type[T]) -> T:
119
+ """Retrieve an instance implementing the specified interface.
120
+
121
+ For singleton registrations, returns the cached instance. For factory
122
+ registrations, calls the factory to produce an instance.
123
+
124
+ Parameters
125
+ ----------
126
+ interface : type
127
+ The interface type to resolve.
128
+
129
+ Returns
130
+ -------
131
+ T
132
+ Instance implementing the interface.
133
+
134
+ Raises
135
+ ------
136
+ ValueError
137
+ When no factory is registered for the interface.
138
+
139
+ Examples
140
+ --------
141
+ >>> container = TNFRContainer()
142
+ >>> container.register_singleton(ValidationService, MyValidator())
143
+ >>> validator = container.get(ValidationService)
144
+ """
145
+ # Check if we have a cached singleton instance
146
+ if interface in self._instances:
147
+ return self._instances[interface]
148
+
149
+ # Check if we have a factory registered
150
+ if interface not in self._factories:
151
+ raise ValueError(
152
+ f"No factory registered for {interface}. "
153
+ f"Use register_singleton() or register_factory() first."
154
+ )
155
+
156
+ # Call factory
157
+ instance = self._factories[interface]()
158
+
159
+ # Cache only if registered as singleton
160
+ if self._is_singleton.get(interface, False):
161
+ self._instances[interface] = instance
162
+
163
+ return instance
164
+
165
+ def has(self, interface: type) -> bool:
166
+ """Check if an interface has a registered factory.
167
+
168
+ Parameters
169
+ ----------
170
+ interface : type
171
+ The interface type to check.
172
+
173
+ Returns
174
+ -------
175
+ bool
176
+ True if a factory is registered for this interface.
177
+ """
178
+ return interface in self._factories
179
+
180
+ @classmethod
181
+ def create_default(cls) -> TNFRContainer:
182
+ """Create a container with default TNFR implementations.
183
+
184
+ This factory method registers the standard implementations of all
185
+ core interfaces, making it easy to get started with the TNFR engine
186
+ without manual configuration.
187
+
188
+ Returns
189
+ -------
190
+ TNFRContainer
191
+ Container configured with default implementations.
192
+
193
+ Examples
194
+ --------
195
+ >>> container = TNFRContainer.create_default()
196
+ >>> validator = container.get(ValidationService)
197
+ >>> # Use validator with default implementation
198
+
199
+ Notes
200
+ -----
201
+ The default implementations are imported lazily to avoid circular
202
+ dependencies. Custom implementations can be registered after creation
203
+ to override defaults.
204
+ """
205
+ from .default_implementations import (
206
+ DefaultDynamicsEngine,
207
+ DefaultOperatorRegistry,
208
+ DefaultTelemetryCollector,
209
+ DefaultValidationService,
210
+ )
211
+ from .interfaces import (
212
+ DynamicsEngine,
213
+ OperatorRegistry,
214
+ TelemetryCollector,
215
+ ValidationService,
216
+ )
217
+
218
+ container = cls()
219
+
220
+ # Register default implementations as singletons
221
+ container.register_singleton(ValidationService, DefaultValidationService())
222
+ container.register_singleton(OperatorRegistry, DefaultOperatorRegistry())
223
+ container.register_singleton(DynamicsEngine, DefaultDynamicsEngine())
224
+ container.register_singleton(TelemetryCollector, DefaultTelemetryCollector())
225
+
226
+ return container