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/initialization.py ADDED
@@ -0,0 +1,203 @@
1
+ """Node initialization."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import random
6
+ from dataclasses import dataclass
7
+ from typing import TYPE_CHECKING, cast
8
+
9
+ from .constants import THETA_KEY, VF_KEY, get_graph_param
10
+ from .utils import clamp
11
+ from .rng import make_rng
12
+ from .types import NodeInitAttrMap
13
+
14
+ if TYPE_CHECKING: # pragma: no cover
15
+ import networkx as nx
16
+
17
+ __all__ = ("InitParams", "init_node_attrs")
18
+
19
+
20
+ @dataclass
21
+ class InitParams:
22
+ """Parameters governing node initialisation."""
23
+
24
+ seed: int | None
25
+ init_rand_phase: bool
26
+ th_min: float
27
+ th_max: float
28
+ vf_mode: str
29
+ vf_min_lim: float
30
+ vf_max_lim: float
31
+ vf_uniform_min: float | None
32
+ vf_uniform_max: float | None
33
+ vf_mean: float
34
+ vf_std: float
35
+ clamp_to_limits: bool
36
+ si_min: float
37
+ si_max: float
38
+ epi_val: float
39
+
40
+ @classmethod
41
+ def from_graph(cls, G: "nx.Graph") -> "InitParams":
42
+ """Construct ``InitParams`` from ``G.graph`` configuration."""
43
+
44
+ return cls(
45
+ seed=get_graph_param(G, "RANDOM_SEED", int),
46
+ init_rand_phase=get_graph_param(G, "INIT_RANDOM_PHASE", bool),
47
+ th_min=get_graph_param(G, "INIT_THETA_MIN"),
48
+ th_max=get_graph_param(G, "INIT_THETA_MAX"),
49
+ vf_mode=str(get_graph_param(G, "INIT_VF_MODE", str)).lower(),
50
+ vf_min_lim=get_graph_param(G, "VF_MIN"),
51
+ vf_max_lim=get_graph_param(G, "VF_MAX"),
52
+ vf_uniform_min=get_graph_param(G, "INIT_VF_MIN"),
53
+ vf_uniform_max=get_graph_param(G, "INIT_VF_MAX"),
54
+ vf_mean=get_graph_param(G, "INIT_VF_MEAN"),
55
+ vf_std=get_graph_param(G, "INIT_VF_STD"),
56
+ clamp_to_limits=get_graph_param(G, "INIT_VF_CLAMP_TO_LIMITS", bool),
57
+ si_min=get_graph_param(G, "INIT_SI_MIN"),
58
+ si_max=get_graph_param(G, "INIT_SI_MAX"),
59
+ epi_val=get_graph_param(G, "INIT_EPI_VALUE"),
60
+ )
61
+
62
+
63
+ def _init_phase(
64
+ nd: NodeInitAttrMap,
65
+ rng: random.Random,
66
+ *,
67
+ override: bool,
68
+ random_phase: bool,
69
+ th_min: float,
70
+ th_max: float,
71
+ ) -> None:
72
+ """Initialise ``θ`` in ``nd``."""
73
+ if random_phase:
74
+ if override or THETA_KEY not in nd:
75
+ nd[THETA_KEY] = rng.uniform(th_min, th_max)
76
+ else:
77
+ if override:
78
+ nd[THETA_KEY] = 0.0
79
+ else:
80
+ nd.setdefault(THETA_KEY, 0.0)
81
+
82
+
83
+ def _init_vf(
84
+ nd: NodeInitAttrMap,
85
+ rng: random.Random,
86
+ *,
87
+ override: bool,
88
+ mode: str,
89
+ vf_uniform_min: float,
90
+ vf_uniform_max: float,
91
+ vf_mean: float,
92
+ vf_std: float,
93
+ vf_min_lim: float,
94
+ vf_max_lim: float,
95
+ clamp_to_limits: bool,
96
+ ) -> None:
97
+ """Initialise ``νf`` in ``nd``."""
98
+ if mode == "uniform":
99
+ vf = rng.uniform(vf_uniform_min, vf_uniform_max)
100
+ elif mode == "normal":
101
+ for _ in range(16):
102
+ cand = rng.normalvariate(vf_mean, vf_std)
103
+ if vf_min_lim <= cand <= vf_max_lim:
104
+ vf = cand
105
+ break
106
+ else:
107
+ vf = min(
108
+ max(rng.normalvariate(vf_mean, vf_std), vf_min_lim),
109
+ vf_max_lim,
110
+ )
111
+ else:
112
+ vf = float(nd.get(VF_KEY, 0.5))
113
+ if clamp_to_limits:
114
+ vf = clamp(vf, vf_min_lim, vf_max_lim)
115
+ if override or VF_KEY not in nd:
116
+ nd[VF_KEY] = vf
117
+
118
+
119
+ def _init_si_epi(
120
+ nd: NodeInitAttrMap,
121
+ rng: random.Random,
122
+ *,
123
+ override: bool,
124
+ si_min: float,
125
+ si_max: float,
126
+ epi_val: float,
127
+ ) -> None:
128
+ """Initialise ``Si`` and ``EPI`` in ``nd``."""
129
+ if override or "EPI" not in nd:
130
+ nd["EPI"] = epi_val
131
+
132
+ si = rng.uniform(si_min, si_max)
133
+ if override or "Si" not in nd:
134
+ nd["Si"] = si
135
+
136
+
137
+ def init_node_attrs(G: "nx.Graph", *, override: bool = True) -> "nx.Graph":
138
+ """Initialise EPI, θ, νf and Si on the nodes of ``G``.
139
+
140
+ Parameters can be customised via ``G.graph`` entries:
141
+ ``RANDOM_SEED``, ``INIT_RANDOM_PHASE``, ``INIT_THETA_MIN/MAX``,
142
+ ``INIT_VF_MODE``, ``VF_MIN``, ``VF_MAX``, ``INIT_VF_MIN/MAX``,
143
+ ``INIT_VF_MEAN``, ``INIT_VF_STD`` and ``INIT_VF_CLAMP_TO_LIMITS``.
144
+ Ranges for ``Si`` are added via ``INIT_SI_MIN`` and ``INIT_SI_MAX``, and
145
+ for ``EPI`` via ``INIT_EPI_VALUE``. If ``INIT_VF_MIN`` is greater than
146
+ ``INIT_VF_MAX``, values are swapped and clamped to ``VF_MIN``/``VF_MAX``.
147
+ When clamping results in an invalid range (min > max), both bounds
148
+ collapse to ``VF_MIN``, ensuring ``VF_MIN``/``VF_MAX`` are hard limits.
149
+ """
150
+ params = InitParams.from_graph(G)
151
+
152
+ vf_uniform_min = params.vf_uniform_min
153
+ vf_uniform_max = params.vf_uniform_max
154
+ vf_min_lim = params.vf_min_lim
155
+ vf_max_lim = params.vf_max_lim
156
+ if vf_uniform_min is None:
157
+ vf_uniform_min = vf_min_lim
158
+ if vf_uniform_max is None:
159
+ vf_uniform_max = vf_max_lim
160
+ if vf_uniform_min > vf_uniform_max:
161
+ vf_uniform_min, vf_uniform_max = vf_uniform_max, vf_uniform_min
162
+ params.vf_uniform_min = max(vf_uniform_min, vf_min_lim)
163
+ params.vf_uniform_max = min(vf_uniform_max, vf_max_lim)
164
+ # After clamping to VF_MIN/VF_MAX, ensure min <= max
165
+ if params.vf_uniform_min > params.vf_uniform_max:
166
+ # Collapse to VF_MIN when the requested range is entirely below the limit
167
+ params.vf_uniform_min = params.vf_uniform_max = vf_min_lim
168
+
169
+ rng = make_rng(params.seed, -1, G)
170
+ for _, nd in G.nodes(data=True):
171
+ node_attrs = cast(NodeInitAttrMap, nd)
172
+
173
+ _init_phase(
174
+ node_attrs,
175
+ rng,
176
+ override=override,
177
+ random_phase=params.init_rand_phase,
178
+ th_min=params.th_min,
179
+ th_max=params.th_max,
180
+ )
181
+ _init_vf(
182
+ node_attrs,
183
+ rng,
184
+ override=override,
185
+ mode=params.vf_mode,
186
+ vf_uniform_min=params.vf_uniform_min,
187
+ vf_uniform_max=params.vf_uniform_max,
188
+ vf_mean=params.vf_mean,
189
+ vf_std=params.vf_std,
190
+ vf_min_lim=params.vf_min_lim,
191
+ vf_max_lim=params.vf_max_lim,
192
+ clamp_to_limits=params.clamp_to_limits,
193
+ )
194
+ _init_si_epi(
195
+ node_attrs,
196
+ rng,
197
+ override=override,
198
+ si_min=params.si_min,
199
+ si_max=params.si_max,
200
+ epi_val=params.epi_val,
201
+ )
202
+
203
+ return G
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ import random
4
+ from dataclasses import dataclass
5
+
6
+ import networkx as nx
7
+
8
+ from .types import NodeInitAttrMap
9
+
10
+ __all__: tuple[str, str] = ("InitParams", "init_node_attrs")
11
+
12
+ @dataclass
13
+ class InitParams:
14
+ seed: int | None
15
+ init_rand_phase: bool
16
+ th_min: float
17
+ th_max: float
18
+ vf_mode: str
19
+ vf_min_lim: float
20
+ vf_max_lim: float
21
+ vf_uniform_min: float | None
22
+ vf_uniform_max: float | None
23
+ vf_mean: float
24
+ vf_std: float
25
+ clamp_to_limits: bool
26
+ si_min: float
27
+ si_max: float
28
+ epi_val: float
29
+
30
+ @classmethod
31
+ def from_graph(cls, G: nx.Graph) -> InitParams: ...
32
+
33
+ def _init_phase(
34
+ nd: NodeInitAttrMap,
35
+ rng: random.Random,
36
+ *,
37
+ override: bool,
38
+ random_phase: bool,
39
+ th_min: float,
40
+ th_max: float,
41
+ ) -> None: ...
42
+ def _init_vf(
43
+ nd: NodeInitAttrMap,
44
+ rng: random.Random,
45
+ *,
46
+ override: bool,
47
+ mode: str,
48
+ vf_uniform_min: float,
49
+ vf_uniform_max: float,
50
+ vf_mean: float,
51
+ vf_std: float,
52
+ vf_min_lim: float,
53
+ vf_max_lim: float,
54
+ clamp_to_limits: bool,
55
+ ) -> None: ...
56
+ def _init_si_epi(
57
+ nd: NodeInitAttrMap,
58
+ rng: random.Random,
59
+ *,
60
+ override: bool,
61
+ si_min: float,
62
+ si_max: float,
63
+ epi_val: float,
64
+ ) -> None: ...
65
+ def init_node_attrs(G: nx.Graph, *, override: bool = True) -> nx.Graph: ...
tnfr/io.py ADDED
@@ -0,0 +1,10 @@
1
+ """Legacy JSON utilities module.
2
+
3
+ The backwards-compatible re-export was removed; use :mod:`tnfr.utils.io`
4
+ directly. Importing :mod:`tnfr.io` now raises an :class:`ImportError` with a
5
+ clear migration hint.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ raise ImportError("`tnfr.io` was removed. Import helpers from `tnfr.utils.io` instead.")
tnfr/io.pyi ADDED
@@ -0,0 +1,13 @@
1
+ """Compatibility stub removed; import from :mod:`tnfr.utils.io` instead."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import NoReturn
6
+
7
+ __all__ = ()
8
+
9
+ def __getattr__(name: str) -> NoReturn:
10
+ """Indicate that :mod:`tnfr.io` no longer exports IO helpers."""
11
+
12
+ def __dir__() -> tuple[str, ...]:
13
+ """Return an empty set of exports to mirror the removed shim."""
tnfr/locking.py ADDED
@@ -0,0 +1,37 @@
1
+ """Utilities for named locks.
2
+
3
+ This module provides helpers to obtain process-wide ``threading.Lock``
4
+ instances identified by name. Locks are created lazily and reused,
5
+ allowing different modules to synchronise on shared resources without
6
+ redefining locks repeatedly.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import threading
12
+ from weakref import WeakValueDictionary
13
+
14
+ # Registry of locks by name guarded by ``_REGISTRY_LOCK``.
15
+ # Using ``WeakValueDictionary`` ensures that once a lock is no longer
16
+ # referenced elsewhere, it is removed from the registry automatically,
17
+ # keeping the catalogue aligned with active coherence nodes.
18
+ _locks: WeakValueDictionary[str, threading.Lock] = WeakValueDictionary()
19
+ _REGISTRY_LOCK = threading.Lock()
20
+
21
+
22
+ def get_lock(name: str) -> threading.Lock:
23
+ """Return a re-usable lock identified by ``name``.
24
+
25
+ The same lock object is returned for identical names. Locks are
26
+ created on first use and stored in a process-wide registry.
27
+ """
28
+
29
+ with _REGISTRY_LOCK:
30
+ lock = _locks.get(name)
31
+ if lock is None:
32
+ lock = threading.Lock()
33
+ _locks[name] = lock
34
+ return lock
35
+
36
+
37
+ __all__ = ["get_lock"]
tnfr/locking.pyi ADDED
@@ -0,0 +1,7 @@
1
+ from typing import Any
2
+
3
+ __all__: Any
4
+
5
+ def __getattr__(name: str) -> Any: ...
6
+
7
+ get_lock: Any
@@ -0,0 +1,79 @@
1
+ """Mathematics primitives aligned with TNFR coherence modeling.
2
+
3
+ Backend selection
4
+ -----------------
5
+ Use :func:`get_backend` to retrieve a numerical backend compatible with TNFR's
6
+ structural operators. The selection order is ``name`` → ``TNFR_MATH_BACKEND``
7
+ → :func:`tnfr.config.get_flags`. NumPy remains the canonical default so
8
+ existing code continues to operate even when optional dependencies are absent.
9
+ """
10
+
11
+ from .backend import (
12
+ MathematicsBackend,
13
+ available_backends,
14
+ ensure_array,
15
+ ensure_numpy,
16
+ get_backend,
17
+ register_backend,
18
+ )
19
+ from .dynamics import ContractiveDynamicsEngine, MathematicalDynamicsEngine
20
+ from .epi import BEPIElement, CoherenceEvaluation, evaluate_coherence_transform
21
+ from .generators import build_delta_nfr, build_lindblad_delta_nfr
22
+ from .metrics import dcoh
23
+ from .operators import CoherenceOperator, FrequencyOperator
24
+ from .operators_factory import make_coherence_operator, make_frequency_operator
25
+ from .projection import BasicStateProjector, StateProjector
26
+ from .runtime import (
27
+ coherence,
28
+ coherence_expectation,
29
+ frequency_expectation,
30
+ frequency_positive,
31
+ normalized,
32
+ stable_unitary,
33
+ )
34
+ from .spaces import BanachSpaceEPI, HilbertSpace
35
+ from .transforms import (
36
+ CoherenceMonotonicityReport,
37
+ CoherenceViolation,
38
+ IsometryFactory,
39
+ build_isometry_factory,
40
+ ensure_coherence_monotonicity,
41
+ validate_norm_preservation,
42
+ )
43
+
44
+ __all__ = [
45
+ "MathematicsBackend",
46
+ "ensure_array",
47
+ "ensure_numpy",
48
+ "HilbertSpace",
49
+ "BanachSpaceEPI",
50
+ "BEPIElement",
51
+ "CoherenceEvaluation",
52
+ "CoherenceOperator",
53
+ "ContractiveDynamicsEngine",
54
+ "CoherenceMonotonicityReport",
55
+ "CoherenceViolation",
56
+ "FrequencyOperator",
57
+ "MathematicalDynamicsEngine",
58
+ "build_delta_nfr",
59
+ "build_lindblad_delta_nfr",
60
+ "make_coherence_operator",
61
+ "make_frequency_operator",
62
+ "IsometryFactory",
63
+ "build_isometry_factory",
64
+ "validate_norm_preservation",
65
+ "ensure_coherence_monotonicity",
66
+ "evaluate_coherence_transform",
67
+ "StateProjector",
68
+ "BasicStateProjector",
69
+ "normalized",
70
+ "coherence",
71
+ "frequency_positive",
72
+ "stable_unitary",
73
+ "dcoh",
74
+ "coherence_expectation",
75
+ "frequency_expectation",
76
+ "available_backends",
77
+ "get_backend",
78
+ "register_backend",
79
+ ]