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/utils.py ADDED
@@ -0,0 +1,341 @@
1
+ """Utility functions for TNFR SDK.
2
+
3
+ This module provides helper functions for common operations,
4
+ analysis, and visualization support.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Dict, List, Optional, Tuple, Any
10
+ import json
11
+ from pathlib import Path
12
+
13
+ try:
14
+ import numpy as np
15
+
16
+ HAS_NUMPY = True
17
+ except ImportError:
18
+ np = None # type: ignore[assignment]
19
+ HAS_NUMPY = False
20
+
21
+ __all__ = [
22
+ "compare_networks",
23
+ "compute_network_statistics",
24
+ "export_to_json",
25
+ "import_from_json",
26
+ ]
27
+
28
+
29
+ def compare_networks(
30
+ networks: Dict[str, Any],
31
+ metrics: Optional[List[str]] = None,
32
+ ) -> Dict[str, Dict[str, float]]:
33
+ """Compare metrics across multiple networks.
34
+
35
+ Parameters
36
+ ----------
37
+ networks : Dict[str, NetworkResults]
38
+ Dictionary mapping network names to their results.
39
+ metrics : List[str], optional
40
+ List of metrics to compare. If None, compares all available.
41
+ Options: 'coherence', 'avg_si', 'avg_delta_nfr', 'node_count'
42
+
43
+ Returns
44
+ -------
45
+ Dict[str, Dict[str, float]]
46
+ Comparison table with metrics for each network.
47
+
48
+ Examples
49
+ --------
50
+ >>> from tnfr.sdk import TNFRExperimentBuilder
51
+ >>> comparison = TNFRExperimentBuilder.compare_topologies(30, 5)
52
+ >>> from tnfr.sdk.utils import compare_networks
53
+ >>> stats = compare_networks(comparison)
54
+ """
55
+ if metrics is None:
56
+ metrics = ["coherence", "avg_si", "avg_delta_nfr", "node_count"]
57
+
58
+ comparison = {}
59
+ for name, results in networks.items():
60
+ comparison[name] = {}
61
+
62
+ if "coherence" in metrics:
63
+ comparison[name]["coherence"] = results.coherence
64
+
65
+ if "avg_si" in metrics:
66
+ si_values = list(results.sense_indices.values())
67
+ comparison[name]["avg_si"] = (
68
+ sum(si_values) / len(si_values) if si_values else 0.0
69
+ )
70
+
71
+ if "avg_delta_nfr" in metrics:
72
+ dnfr_values = list(results.delta_nfr.values())
73
+ comparison[name]["avg_delta_nfr"] = (
74
+ sum(dnfr_values) / len(dnfr_values) if dnfr_values else 0.0
75
+ )
76
+
77
+ if "node_count" in metrics:
78
+ comparison[name]["node_count"] = len(results.sense_indices)
79
+
80
+ return comparison
81
+
82
+
83
+ def compute_network_statistics(results: Any) -> Dict[str, float]:
84
+ """Compute extended statistics for a network.
85
+
86
+ Parameters
87
+ ----------
88
+ results : NetworkResults
89
+ Results from network measurement.
90
+
91
+ Returns
92
+ -------
93
+ Dict[str, float]
94
+ Dictionary of computed statistics.
95
+
96
+ Examples
97
+ --------
98
+ >>> from tnfr.sdk import TNFRNetwork
99
+ >>> network = TNFRNetwork().add_nodes(10).connect_nodes(0.3)
100
+ >>> results = network.apply_sequence("basic_activation").measure()
101
+ >>> from tnfr.sdk.utils import compute_network_statistics
102
+ >>> stats = compute_network_statistics(results)
103
+ """
104
+ si_values = list(results.sense_indices.values())
105
+ dnfr_values = list(results.delta_nfr.values())
106
+
107
+ stats = {
108
+ "coherence": results.coherence,
109
+ "node_count": len(si_values),
110
+ }
111
+
112
+ if si_values:
113
+ stats["avg_si"] = sum(si_values) / len(si_values)
114
+ stats["min_si"] = min(si_values)
115
+ stats["max_si"] = max(si_values)
116
+
117
+ if HAS_NUMPY:
118
+ stats["std_si"] = float(np.std(si_values))
119
+ else:
120
+ mean_si = stats["avg_si"]
121
+ variance = sum((x - mean_si) ** 2 for x in si_values) / len(si_values)
122
+ stats["std_si"] = variance**0.5
123
+
124
+ if dnfr_values:
125
+ stats["avg_delta_nfr"] = sum(dnfr_values) / len(dnfr_values)
126
+ stats["min_delta_nfr"] = min(dnfr_values)
127
+ stats["max_delta_nfr"] = max(dnfr_values)
128
+
129
+ if HAS_NUMPY:
130
+ stats["std_delta_nfr"] = float(np.std(dnfr_values))
131
+ else:
132
+ mean_dnfr = stats["avg_delta_nfr"]
133
+ variance = sum((x - mean_dnfr) ** 2 for x in dnfr_values) / len(dnfr_values)
134
+ stats["std_delta_nfr"] = variance**0.5
135
+
136
+ if results.avg_vf is not None:
137
+ stats["avg_vf"] = results.avg_vf
138
+
139
+ if results.avg_phase is not None:
140
+ stats["avg_phase"] = results.avg_phase
141
+
142
+ return stats
143
+
144
+
145
+ def export_to_json(
146
+ network_data: Any,
147
+ filepath: Path | str,
148
+ indent: int = 2,
149
+ ) -> None:
150
+ """Export network data to JSON file.
151
+
152
+ Parameters
153
+ ----------
154
+ network_data : TNFRNetwork or NetworkResults or dict
155
+ Network data to export. If TNFRNetwork, calls export_to_dict().
156
+ If NetworkResults, calls to_dict(). Otherwise uses dict directly.
157
+ filepath : Path or str
158
+ Path where JSON file should be saved.
159
+ indent : int, default=2
160
+ JSON indentation level for readability.
161
+
162
+ Examples
163
+ --------
164
+ >>> from tnfr.sdk import TNFRNetwork
165
+ >>> from tnfr.sdk.utils import export_to_json
166
+ >>> network = TNFRNetwork().add_nodes(10).connect_nodes(0.3)
167
+ >>> export_to_json(network, "network.json")
168
+ """
169
+ filepath = Path(filepath)
170
+
171
+ # Convert to dict if needed
172
+ if hasattr(network_data, "export_to_dict"):
173
+ data = network_data.export_to_dict()
174
+ elif hasattr(network_data, "to_dict"):
175
+ data = network_data.to_dict()
176
+ else:
177
+ data = network_data
178
+
179
+ # Write JSON
180
+ with open(filepath, "w", encoding="utf-8") as f:
181
+ json.dump(data, f, indent=indent, ensure_ascii=False)
182
+
183
+
184
+ def import_from_json(filepath: Path | str) -> Dict[str, Any]:
185
+ """Import network data from JSON file.
186
+
187
+ Parameters
188
+ ----------
189
+ filepath : Path or str
190
+ Path to JSON file to load.
191
+
192
+ Returns
193
+ -------
194
+ Dict[str, Any]
195
+ Dictionary with network data.
196
+
197
+ Examples
198
+ --------
199
+ >>> from tnfr.sdk.utils import import_from_json
200
+ >>> data = import_from_json("network.json")
201
+ >>> print(data['metadata']['nodes'])
202
+ """
203
+ filepath = Path(filepath)
204
+
205
+ with open(filepath, "r", encoding="utf-8") as f:
206
+ data = json.load(f)
207
+
208
+ return data
209
+
210
+
211
+ def format_comparison_table(
212
+ comparison: Dict[str, Dict[str, float]],
213
+ metrics: Optional[List[str]] = None,
214
+ ) -> str:
215
+ """Format network comparison as a readable table.
216
+
217
+ Parameters
218
+ ----------
219
+ comparison : Dict[str, Dict[str, float]]
220
+ Comparison data from compare_networks().
221
+ metrics : List[str], optional
222
+ Metrics to include in table. If None, uses all available.
223
+
224
+ Returns
225
+ -------
226
+ str
227
+ Formatted table string.
228
+
229
+ Examples
230
+ --------
231
+ >>> from tnfr.sdk import TNFRExperimentBuilder
232
+ >>> from tnfr.sdk.utils import compare_networks, format_comparison_table
233
+ >>> results = TNFRExperimentBuilder.compare_topologies(20, 3)
234
+ >>> comp = compare_networks(results)
235
+ >>> print(format_comparison_table(comp))
236
+ """
237
+ if not comparison:
238
+ return "No networks to compare"
239
+
240
+ # Get all available metrics if not specified
241
+ if metrics is None:
242
+ metrics = list(next(iter(comparison.values())).keys())
243
+
244
+ # Build table
245
+ lines = []
246
+
247
+ # Header
248
+ header = f"{'Network':<20} " + " ".join(f"{m:>12}" for m in metrics)
249
+ lines.append(header)
250
+ lines.append("-" * len(header))
251
+
252
+ # Data rows
253
+ for network_name, data in sorted(comparison.items()):
254
+ values = " ".join(f"{data.get(m, 0.0):>12.3f}" for m in metrics)
255
+ lines.append(f"{network_name:<20} {values}")
256
+
257
+ return "\n".join(lines)
258
+
259
+
260
+ def suggest_sequence_for_goal(goal: str) -> Tuple[str, str]:
261
+ """Suggest operator sequence for a specific goal.
262
+
263
+ Parameters
264
+ ----------
265
+ goal : str
266
+ Description of the goal. Options:
267
+ - "activation", "start", "initialize"
268
+ - "stabilize", "consolidate"
269
+ - "explore", "diverge"
270
+ - "synchronize", "align", "coordinate"
271
+ - "mutate", "innovate", "create"
272
+
273
+ Returns
274
+ -------
275
+ Tuple[str, str]
276
+ (sequence_name, description) tuple.
277
+
278
+ Examples
279
+ --------
280
+ >>> from tnfr.sdk.utils import suggest_sequence_for_goal
281
+ >>> seq, desc = suggest_sequence_for_goal("stabilize")
282
+ >>> print(f"Use: {seq}")
283
+ >>> print(f"Description: {desc}")
284
+ """
285
+ goal_lower = goal.lower()
286
+
287
+ suggestions = {
288
+ "activation": (
289
+ "basic_activation",
290
+ "Initiates network with emission, reception, coherence, and resonance",
291
+ ),
292
+ "start": (
293
+ "basic_activation",
294
+ "Initiates network with emission, reception, coherence, and resonance",
295
+ ),
296
+ "initialize": (
297
+ "basic_activation",
298
+ "Initiates network with emission, reception, coherence, and resonance",
299
+ ),
300
+ "stabilize": (
301
+ "stabilization",
302
+ "Establishes and maintains coherent structure with recursivity",
303
+ ),
304
+ "consolidate": (
305
+ "consolidation",
306
+ "Consolidates structure with recursive coherence and silence",
307
+ ),
308
+ "explore": (
309
+ "exploration",
310
+ "Explores phase space with dissonance and transition",
311
+ ),
312
+ "diverge": (
313
+ "exploration",
314
+ "Explores phase space with dissonance and transition",
315
+ ),
316
+ "synchronize": (
317
+ "network_sync",
318
+ "Synchronizes nodes through coupling and resonance",
319
+ ),
320
+ "align": ("network_sync", "Synchronizes nodes through coupling and resonance"),
321
+ "coordinate": (
322
+ "network_sync",
323
+ "Synchronizes nodes through coupling and resonance",
324
+ ),
325
+ "mutate": (
326
+ "creative_mutation",
327
+ "Generates variation through dissonance and mutation",
328
+ ),
329
+ "innovate": (
330
+ "creative_mutation",
331
+ "Generates variation through dissonance and mutation",
332
+ ),
333
+ "create": (
334
+ "creative_mutation",
335
+ "Generates variation through dissonance and mutation",
336
+ ),
337
+ }
338
+
339
+ return suggestions.get(
340
+ goal_lower, ("basic_activation", "Default: basic activation sequence")
341
+ )
tnfr/secure_config.py ADDED
@@ -0,0 +1,46 @@
1
+ """Secure configuration management (backward compatibility wrapper).
2
+
3
+ This module re-exports from tnfr.config.security for backward compatibility.
4
+ New code should import directly from tnfr.config.security.
5
+
6
+ Migration Path:
7
+ Old: from tnfr.secure_config import get_env_variable
8
+ New: from tnfr.config.security import get_env_variable
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ # Re-export all secure config functionality from tnfr.config.security
14
+ from .config.security import (
15
+ ConfigurationError,
16
+ CredentialRotationManager,
17
+ SecureCredentialValidator,
18
+ SecureSecretManager,
19
+ SecurityAuditWarning,
20
+ SecurityAuditor,
21
+ get_cache_secret,
22
+ get_env_variable,
23
+ get_rotation_manager,
24
+ get_secret_manager,
25
+ load_github_credentials,
26
+ load_pypi_credentials,
27
+ load_redis_config,
28
+ validate_no_hardcoded_secrets,
29
+ )
30
+
31
+ __all__ = (
32
+ "ConfigurationError",
33
+ "SecurityAuditWarning",
34
+ "get_env_variable",
35
+ "load_pypi_credentials",
36
+ "load_github_credentials",
37
+ "load_redis_config",
38
+ "get_cache_secret",
39
+ "validate_no_hardcoded_secrets",
40
+ "SecureCredentialValidator",
41
+ "SecureSecretManager",
42
+ "CredentialRotationManager",
43
+ "SecurityAuditor",
44
+ "get_secret_manager",
45
+ "get_rotation_manager",
46
+ )
@@ -0,0 +1,70 @@
1
+ """Security utilities for TNFR.
2
+
3
+ This module provides security utilities including SQL injection prevention,
4
+ input validation, secure database query patterns, and secure subprocess execution.
5
+ These utilities are designed to be used proactively should database functionality
6
+ be added to TNFR, and to prevent command injection in script execution.
7
+
8
+ Structural Context (TNFR)
9
+ -------------------------
10
+ These security utilities maintain TNFR structural coherence by ensuring:
11
+ - Data persistence preserves EPI integrity
12
+ - Query operations maintain nodal coherence
13
+ - Input validation respects structural frequency constraints
14
+ - Database interactions preserve operational fractality
15
+ - External command execution maintains system integrity
16
+
17
+ Example
18
+ -------
19
+ >>> from tnfr.security import SecureQueryBuilder, validate_identifier
20
+ >>> from tnfr.security import run_command_safely, validate_git_ref
21
+ >>> # Validate database identifiers
22
+ >>> table = validate_identifier("nfr_nodes") # Safe
23
+ >>> # Use parameterized queries
24
+ >>> builder = SecureQueryBuilder()
25
+ >>> query, params = builder.select("nodes", ["epi", "nu_f"]).where("id = ?", 123).build()
26
+ >>> # Execute commands safely
27
+ >>> result = run_command_safely(["git", "status"])
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ from .database import (
33
+ SecureQueryBuilder,
34
+ execute_parameterized_query,
35
+ sanitize_string_input,
36
+ validate_identifier,
37
+ )
38
+ from .subprocess import (
39
+ CommandValidationError,
40
+ PathTraversalError,
41
+ resolve_safe_path,
42
+ run_command_safely,
43
+ validate_file_path,
44
+ validate_git_ref,
45
+ validate_path_safe,
46
+ validate_version_string,
47
+ )
48
+ from .validation import (
49
+ validate_nodal_input,
50
+ validate_phase_value,
51
+ validate_structural_frequency,
52
+ )
53
+
54
+ __all__ = (
55
+ "SecureQueryBuilder",
56
+ "execute_parameterized_query",
57
+ "sanitize_string_input",
58
+ "validate_identifier",
59
+ "validate_nodal_input",
60
+ "validate_phase_value",
61
+ "validate_structural_frequency",
62
+ "CommandValidationError",
63
+ "PathTraversalError",
64
+ "run_command_safely",
65
+ "validate_git_ref",
66
+ "validate_path_safe",
67
+ "validate_file_path",
68
+ "resolve_safe_path",
69
+ "validate_version_string",
70
+ )