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/ontosim.py CHANGED
@@ -1,137 +1,144 @@
1
- """
2
- ontosim.py — TNFR canónica
3
-
4
- Módulo de orquestación mínima que encadena:
5
- ΔNFR (campo) Si → glifos → ecuación nodal → clamps → U’M → observadores → RE’MESH
6
- """
7
- from __future__ import annotations
8
- import networkx as nx
9
- import math
10
- import random
11
-
12
- from constants import DEFAULTS, attach_defaults
13
- from dynamics import step as _step, run as _run
14
- from dynamics import default_compute_delta_nfr
15
-
16
- # API de alto nivel
17
-
18
- def preparar_red(G: nx.Graph, *, override_defaults: bool = False, **overrides) -> nx.Graph:
19
- attach_defaults(G, override=override_defaults)
20
- if overrides:
21
- from constants import merge_overrides
22
- merge_overrides(G, **overrides)
23
- # Inicializaciones blandas
24
- G.graph.setdefault("history", {
25
- "C_steps": [],
26
- "stable_frac": [],
27
- "phase_sync": [],
28
- "kuramoto_R": [],
29
- "sense_sigma_x": [],
30
- "sense_sigma_y": [],
31
- "sense_sigma_mag": [],
32
- "sense_sigma_angle": [],
33
- "iota": [],
34
- "glyph_load_estab": [],
35
- "glyph_load_disr": [],
36
- "Si_mean": [],
37
- "Si_hi_frac": [],
38
- "Si_lo_frac": [],
39
- "W_bar": [],
40
- "phase_kG": [],
41
- "phase_kL": [],
42
- "phase_state": [],
43
- "phase_R": [],
44
- "phase_disr": [],
45
- })
46
- G.graph.setdefault("_epi_hist", [])
47
- # Auto-attach del observador estándar si se pide
48
- if G.graph.get("ATTACH_STD_OBSERVER", False):
49
- try:
50
- from observers import attach_standard_observer
51
- attach_standard_observer(G)
52
- except Exception as e:
53
- G.graph.setdefault("_callback_errors", []).append(
54
- {"event":"attach_std_observer","error":repr(e)}
55
- )
56
- # Hook explícito para ΔNFR (se puede sustituir luego con dynamics.set_delta_nfr_hook)
57
- G.graph.setdefault("compute_delta_nfr", default_compute_delta_nfr)
58
- G.graph.setdefault("_dnfr_hook_name", "default_compute_delta_nfr")
59
- # Callbacks Γ(R): before_step / after_step / on_remesh
60
- G.graph.setdefault("callbacks", {
61
- "before_step": [],
62
- "after_step": [],
63
- "on_remesh": [],
64
- })
65
- G.graph.setdefault("_CALLBACKS_DOC",
66
- "Interfaz Γ(R): registrar funciones (G, ctx) en callbacks['before_step'|'after_step'|'on_remesh']")
67
-
68
- # --- Inicialización configurable de θ y νf ---
69
- seed = int(G.graph.get("RANDOM_SEED", 0))
70
- init_rand_phase = bool(G.graph.get("INIT_RANDOM_PHASE", DEFAULTS.get("INIT_RANDOM_PHASE", True)))
71
-
72
- th_min = float(G.graph.get("INIT_THETA_MIN", DEFAULTS.get("INIT_THETA_MIN", -math.pi)))
73
- th_max = float(G.graph.get("INIT_THETA_MAX", DEFAULTS.get("INIT_THETA_MAX", math.pi)))
74
-
75
- vf_mode = str(G.graph.get("INIT_VF_MODE", DEFAULTS.get("INIT_VF_MODE", "uniform"))).lower()
76
- vf_min_lim = float(G.graph.get("VF_MIN", DEFAULTS["VF_MIN"]))
77
- vf_max_lim = float(G.graph.get("VF_MAX", DEFAULTS["VF_MAX"]))
78
-
79
- vf_uniform_min = G.graph.get("INIT_VF_MIN", DEFAULTS.get("INIT_VF_MIN", None))
80
- vf_uniform_max = G.graph.get("INIT_VF_MAX", DEFAULTS.get("INIT_VF_MAX", None))
81
- if vf_uniform_min is None: vf_uniform_min = vf_min_lim
82
- if vf_uniform_max is None: vf_uniform_max = vf_max_lim
83
-
84
- vf_mean = float(G.graph.get("INIT_VF_MEAN", DEFAULTS.get("INIT_VF_MEAN", 0.5)))
85
- vf_std = float(G.graph.get("INIT_VF_STD", DEFAULTS.get("INIT_VF_STD", 0.15)))
86
- clamp_to_limits = bool(G.graph.get("INIT_VF_CLAMP_TO_LIMITS", DEFAULTS.get("INIT_VF_CLAMP_TO_LIMITS", True)))
87
-
88
- for idx, n in enumerate(G.nodes()):
89
- nd = G.nodes[n]
90
- # EPI canónico
91
- nd.setdefault("EPI", 0.0)
92
-
93
- # θ aleatoria (opt-in por flag)
94
- if init_rand_phase:
95
- th_rng = random.Random(seed + 1009 * idx)
96
- nd["θ"] = th_rng.uniform(th_min, th_max)
97
- else:
98
- nd.setdefault("θ", 0.0)
99
-
100
- # νf distribuida
101
- if vf_mode == "uniform":
102
- vf_rng = random.Random(seed * 1000003 + idx)
103
- vf = vf_rng.uniform(float(vf_uniform_min), float(vf_uniform_max))
104
- elif vf_mode == "normal":
105
- vf_rng = random.Random(seed * 1000003 + idx)
106
- # normal truncada simple (rechazo)
107
- for _ in range(16):
108
- cand = vf_rng.normalvariate(vf_mean, vf_std)
109
- if vf_min_lim <= cand <= vf_max_lim:
110
- vf = cand
111
- break
112
- else:
113
- # fallback: clamp del último candidato
114
- vf = min(max(vf_rng.normalvariate(vf_mean, vf_std), vf_min_lim), vf_max_lim)
115
- else:
116
- # fallback: conserva si existe, si no 0.5
117
- vf = float(nd.get("νf", 0.5))
118
-
119
- if clamp_to_limits:
120
- vf = min(max(vf, vf_min_lim), vf_max_lim)
121
-
122
- nd["νf"] = float(vf)
123
-
124
- return G
125
-
126
- def step(G: nx.Graph, *, dt: float | None = None, use_Si: bool = True, apply_glyphs: bool = True) -> None:
127
- _step(G, dt=dt, use_Si=use_Si, apply_glyphs=apply_glyphs)
128
-
129
- def run(G: nx.Graph, steps: int, *, dt: float | None = None, use_Si: bool = True, apply_glyphs: bool = True) -> None:
130
- _run(G, steps=steps, dt=dt, use_Si=use_Si, apply_glyphs=apply_glyphs)
131
-
132
- # Helper rápido para pruebas manuales
133
- if __name__ == "__main__":
134
- G = nx.erdos_renyi_graph(30, 0.15)
135
- preparar_red(G)
136
- run(G, 100)
137
- print("C(t) muestras:", G.graph["history"]["C_steps"][-5:])
1
+ """Orchestrate the canonical simulation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections import deque
6
+ from typing import TYPE_CHECKING
7
+
8
+ from .utils import CallbackEvent
9
+ from .constants import METRIC_DEFAULTS, get_param, inject_defaults
10
+ from .dynamics import default_compute_delta_nfr
11
+ from .dynamics import run as _run
12
+ from .dynamics import step as _step
13
+ from .glyph_history import append_metric
14
+ from .initialization import init_node_attrs
15
+ from .utils import cached_import
16
+
17
+ if TYPE_CHECKING: # pragma: no cover
18
+ import networkx as nx
19
+
20
+ # High-level API exports
21
+ __all__ = ("prepare_network", "step", "run")
22
+
23
+
24
+ def prepare_network(
25
+ G: "nx.Graph",
26
+ *,
27
+ init_attrs: bool = True,
28
+ override_defaults: bool = False,
29
+ **overrides,
30
+ ) -> "nx.Graph":
31
+ """Prepare ``G`` for simulation.
32
+
33
+ Parameters
34
+ ----------
35
+ init_attrs:
36
+ Run ``init_node_attrs`` when ``True`` (default), leaving node
37
+ attributes untouched when ``False``.
38
+ override_defaults:
39
+ If ``True``, :func:`inject_defaults` overwrites existing entries.
40
+ **overrides:
41
+ Parameters applied after the defaults phase.
42
+ """
43
+ inject_defaults(G, override=override_defaults)
44
+ if overrides:
45
+ from .constants import merge_overrides
46
+
47
+ merge_overrides(G, **overrides)
48
+ # Initialize history buffers
49
+ ph_len = int(
50
+ G.graph.get("PHASE_HISTORY_MAXLEN", METRIC_DEFAULTS["PHASE_HISTORY_MAXLEN"])
51
+ )
52
+ hist_keys = [
53
+ "C_steps",
54
+ "stable_frac",
55
+ "phase_sync",
56
+ "kuramoto_R",
57
+ "sense_sigma_x",
58
+ "sense_sigma_y",
59
+ "sense_sigma_mag",
60
+ "sense_sigma_angle",
61
+ "iota",
62
+ "glyph_load_stabilizers",
63
+ "glyph_load_disr",
64
+ "Si_mean",
65
+ "Si_hi_frac",
66
+ "Si_lo_frac",
67
+ "W_bar",
68
+ "phase_kG",
69
+ "phase_kL",
70
+ ]
71
+ history = {k: [] for k in hist_keys}
72
+ history.update(
73
+ {
74
+ "phase_state": deque(maxlen=ph_len),
75
+ "phase_R": deque(maxlen=ph_len),
76
+ "phase_disr": deque(maxlen=ph_len),
77
+ }
78
+ )
79
+ G.graph.setdefault("history", history)
80
+ # Global REMESH memory
81
+ tau = int(get_param(G, "REMESH_TAU_GLOBAL"))
82
+ maxlen = max(2 * tau + 5, 64)
83
+ G.graph.setdefault("_epi_hist", deque(maxlen=maxlen))
84
+ # Auto-attach the standard observer when requested
85
+ if G.graph.get("ATTACH_STD_OBSERVER", False):
86
+ attach_standard_observer = cached_import(
87
+ "tnfr.observers",
88
+ "attach_standard_observer",
89
+ )
90
+ if attach_standard_observer is not None:
91
+ attach_standard_observer(G)
92
+ else:
93
+ append_metric(
94
+ G.graph,
95
+ "_callback_errors",
96
+ {"event": "attach_std_observer", "error": "ImportError"},
97
+ )
98
+ # Explicit hook for ΔNFR (can later be replaced with
99
+ # dynamics.set_delta_nfr_hook)
100
+ G.graph.setdefault("compute_delta_nfr", default_compute_delta_nfr)
101
+ G.graph.setdefault("_dnfr_hook_name", "default_compute_delta_nfr")
102
+ # Callbacks Γ(R): before_step / after_step / on_remesh
103
+ G.graph.setdefault(
104
+ "callbacks",
105
+ {
106
+ CallbackEvent.BEFORE_STEP.value: [],
107
+ CallbackEvent.AFTER_STEP.value: [],
108
+ CallbackEvent.ON_REMESH.value: [],
109
+ },
110
+ )
111
+ G.graph.setdefault(
112
+ "_CALLBACKS_DOC",
113
+ "Γ(R) interface: register (name, func) pairs with signature (G, ctx) "
114
+ "in callbacks['before_step'|'after_step'|'on_remesh']",
115
+ )
116
+
117
+ if init_attrs:
118
+ init_node_attrs(G, override=True)
119
+ return G
120
+
121
+
122
+ def step(
123
+ G: "nx.Graph",
124
+ *,
125
+ dt: float | None = None,
126
+ use_Si: bool = True,
127
+ apply_glyphs: bool = True,
128
+ ) -> None:
129
+ """Advance the ontosim runtime by a single step."""
130
+
131
+ _step(G, dt=dt, use_Si=use_Si, apply_glyphs=apply_glyphs)
132
+
133
+
134
+ def run(
135
+ G: "nx.Graph",
136
+ steps: int,
137
+ *,
138
+ dt: float | None = None,
139
+ use_Si: bool = True,
140
+ apply_glyphs: bool = True,
141
+ ) -> None:
142
+ """Advance the ontosim runtime ``steps`` times with optional overrides."""
143
+
144
+ _run(G, steps=steps, dt=dt, use_Si=use_Si, apply_glyphs=apply_glyphs)
tnfr/ontosim.pyi ADDED
@@ -0,0 +1,28 @@
1
+ from __future__ import annotations
2
+
3
+ from .types import TNFRConfigValue, TNFRGraph
4
+
5
+ __all__: tuple[str, ...]
6
+
7
+ def prepare_network(
8
+ G: TNFRGraph,
9
+ *,
10
+ init_attrs: bool = True,
11
+ override_defaults: bool = False,
12
+ **overrides: TNFRConfigValue,
13
+ ) -> TNFRGraph: ...
14
+ def step(
15
+ G: TNFRGraph,
16
+ *,
17
+ dt: float | None = None,
18
+ use_Si: bool = True,
19
+ apply_glyphs: bool = True,
20
+ ) -> None: ...
21
+ def run(
22
+ G: TNFRGraph,
23
+ steps: int,
24
+ *,
25
+ dt: float | None = None,
26
+ use_Si: bool = True,
27
+ apply_glyphs: bool = True,
28
+ ) -> None: ...