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

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

Potentially problematic release.


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

Files changed (365) hide show
  1. tnfr/__init__.py +334 -50
  2. tnfr/__init__.pyi +33 -0
  3. tnfr/_compat.py +10 -0
  4. tnfr/_generated_version.py +34 -0
  5. tnfr/_version.py +49 -0
  6. tnfr/_version.pyi +7 -0
  7. tnfr/alias.py +214 -37
  8. tnfr/alias.pyi +108 -0
  9. tnfr/backends/__init__.py +354 -0
  10. tnfr/backends/jax_backend.py +173 -0
  11. tnfr/backends/numpy_backend.py +238 -0
  12. tnfr/backends/optimized_numpy.py +420 -0
  13. tnfr/backends/torch_backend.py +408 -0
  14. tnfr/cache.py +149 -556
  15. tnfr/cache.pyi +13 -0
  16. tnfr/cli/__init__.py +51 -16
  17. tnfr/cli/__init__.pyi +26 -0
  18. tnfr/cli/arguments.py +344 -32
  19. tnfr/cli/arguments.pyi +29 -0
  20. tnfr/cli/execution.py +676 -50
  21. tnfr/cli/execution.pyi +70 -0
  22. tnfr/cli/interactive_validator.py +614 -0
  23. tnfr/cli/utils.py +18 -3
  24. tnfr/cli/utils.pyi +7 -0
  25. tnfr/cli/validate.py +236 -0
  26. tnfr/compat/__init__.py +85 -0
  27. tnfr/compat/dataclass.py +136 -0
  28. tnfr/compat/jsonschema_stub.py +61 -0
  29. tnfr/compat/matplotlib_stub.py +73 -0
  30. tnfr/compat/numpy_stub.py +155 -0
  31. tnfr/config/__init__.py +224 -0
  32. tnfr/config/__init__.pyi +10 -0
  33. tnfr/{constants_glyphs.py → config/constants.py} +26 -20
  34. tnfr/config/constants.pyi +12 -0
  35. tnfr/config/defaults.py +54 -0
  36. tnfr/{constants/core.py → config/defaults_core.py} +59 -6
  37. tnfr/config/defaults_init.py +33 -0
  38. tnfr/config/defaults_metric.py +104 -0
  39. tnfr/config/feature_flags.py +81 -0
  40. tnfr/config/feature_flags.pyi +16 -0
  41. tnfr/config/glyph_constants.py +31 -0
  42. tnfr/config/init.py +77 -0
  43. tnfr/config/init.pyi +8 -0
  44. tnfr/config/operator_names.py +254 -0
  45. tnfr/config/operator_names.pyi +36 -0
  46. tnfr/config/physics_derivation.py +354 -0
  47. tnfr/config/presets.py +83 -0
  48. tnfr/config/presets.pyi +7 -0
  49. tnfr/config/security.py +927 -0
  50. tnfr/config/thresholds.py +114 -0
  51. tnfr/config/tnfr_config.py +498 -0
  52. tnfr/constants/__init__.py +51 -133
  53. tnfr/constants/__init__.pyi +92 -0
  54. tnfr/constants/aliases.py +33 -0
  55. tnfr/constants/aliases.pyi +27 -0
  56. tnfr/constants/init.py +3 -1
  57. tnfr/constants/init.pyi +12 -0
  58. tnfr/constants/metric.py +9 -15
  59. tnfr/constants/metric.pyi +19 -0
  60. tnfr/core/__init__.py +33 -0
  61. tnfr/core/container.py +226 -0
  62. tnfr/core/default_implementations.py +329 -0
  63. tnfr/core/interfaces.py +279 -0
  64. tnfr/dynamics/__init__.py +213 -633
  65. tnfr/dynamics/__init__.pyi +83 -0
  66. tnfr/dynamics/adaptation.py +267 -0
  67. tnfr/dynamics/adaptation.pyi +7 -0
  68. tnfr/dynamics/adaptive_sequences.py +189 -0
  69. tnfr/dynamics/adaptive_sequences.pyi +14 -0
  70. tnfr/dynamics/aliases.py +23 -0
  71. tnfr/dynamics/aliases.pyi +19 -0
  72. tnfr/dynamics/bifurcation.py +232 -0
  73. tnfr/dynamics/canonical.py +229 -0
  74. tnfr/dynamics/canonical.pyi +48 -0
  75. tnfr/dynamics/coordination.py +385 -0
  76. tnfr/dynamics/coordination.pyi +25 -0
  77. tnfr/dynamics/dnfr.py +2699 -398
  78. tnfr/dynamics/dnfr.pyi +26 -0
  79. tnfr/dynamics/dynamic_limits.py +225 -0
  80. tnfr/dynamics/feedback.py +252 -0
  81. tnfr/dynamics/feedback.pyi +24 -0
  82. tnfr/dynamics/fused_dnfr.py +454 -0
  83. tnfr/dynamics/homeostasis.py +157 -0
  84. tnfr/dynamics/homeostasis.pyi +14 -0
  85. tnfr/dynamics/integrators.py +496 -102
  86. tnfr/dynamics/integrators.pyi +36 -0
  87. tnfr/dynamics/learning.py +310 -0
  88. tnfr/dynamics/learning.pyi +33 -0
  89. tnfr/dynamics/metabolism.py +254 -0
  90. tnfr/dynamics/nbody.py +796 -0
  91. tnfr/dynamics/nbody_tnfr.py +783 -0
  92. tnfr/dynamics/propagation.py +326 -0
  93. tnfr/dynamics/runtime.py +908 -0
  94. tnfr/dynamics/runtime.pyi +77 -0
  95. tnfr/dynamics/sampling.py +10 -5
  96. tnfr/dynamics/sampling.pyi +7 -0
  97. tnfr/dynamics/selectors.py +711 -0
  98. tnfr/dynamics/selectors.pyi +85 -0
  99. tnfr/dynamics/structural_clip.py +207 -0
  100. tnfr/errors/__init__.py +37 -0
  101. tnfr/errors/contextual.py +492 -0
  102. tnfr/execution.py +77 -55
  103. tnfr/execution.pyi +45 -0
  104. tnfr/extensions/__init__.py +205 -0
  105. tnfr/extensions/__init__.pyi +18 -0
  106. tnfr/extensions/base.py +173 -0
  107. tnfr/extensions/base.pyi +35 -0
  108. tnfr/extensions/business/__init__.py +71 -0
  109. tnfr/extensions/business/__init__.pyi +11 -0
  110. tnfr/extensions/business/cookbook.py +88 -0
  111. tnfr/extensions/business/cookbook.pyi +8 -0
  112. tnfr/extensions/business/health_analyzers.py +202 -0
  113. tnfr/extensions/business/health_analyzers.pyi +9 -0
  114. tnfr/extensions/business/patterns.py +183 -0
  115. tnfr/extensions/business/patterns.pyi +8 -0
  116. tnfr/extensions/medical/__init__.py +73 -0
  117. tnfr/extensions/medical/__init__.pyi +11 -0
  118. tnfr/extensions/medical/cookbook.py +88 -0
  119. tnfr/extensions/medical/cookbook.pyi +8 -0
  120. tnfr/extensions/medical/health_analyzers.py +181 -0
  121. tnfr/extensions/medical/health_analyzers.pyi +9 -0
  122. tnfr/extensions/medical/patterns.py +163 -0
  123. tnfr/extensions/medical/patterns.pyi +8 -0
  124. tnfr/flatten.py +29 -50
  125. tnfr/flatten.pyi +21 -0
  126. tnfr/gamma.py +66 -53
  127. tnfr/gamma.pyi +36 -0
  128. tnfr/glyph_history.py +144 -57
  129. tnfr/glyph_history.pyi +35 -0
  130. tnfr/glyph_runtime.py +19 -0
  131. tnfr/glyph_runtime.pyi +8 -0
  132. tnfr/immutable.py +70 -30
  133. tnfr/immutable.pyi +36 -0
  134. tnfr/initialization.py +22 -16
  135. tnfr/initialization.pyi +65 -0
  136. tnfr/io.py +5 -241
  137. tnfr/io.pyi +13 -0
  138. tnfr/locking.pyi +7 -0
  139. tnfr/mathematics/__init__.py +79 -0
  140. tnfr/mathematics/backend.py +453 -0
  141. tnfr/mathematics/backend.pyi +99 -0
  142. tnfr/mathematics/dynamics.py +408 -0
  143. tnfr/mathematics/dynamics.pyi +90 -0
  144. tnfr/mathematics/epi.py +391 -0
  145. tnfr/mathematics/epi.pyi +65 -0
  146. tnfr/mathematics/generators.py +242 -0
  147. tnfr/mathematics/generators.pyi +29 -0
  148. tnfr/mathematics/metrics.py +119 -0
  149. tnfr/mathematics/metrics.pyi +16 -0
  150. tnfr/mathematics/operators.py +239 -0
  151. tnfr/mathematics/operators.pyi +59 -0
  152. tnfr/mathematics/operators_factory.py +124 -0
  153. tnfr/mathematics/operators_factory.pyi +11 -0
  154. tnfr/mathematics/projection.py +87 -0
  155. tnfr/mathematics/projection.pyi +33 -0
  156. tnfr/mathematics/runtime.py +182 -0
  157. tnfr/mathematics/runtime.pyi +64 -0
  158. tnfr/mathematics/spaces.py +256 -0
  159. tnfr/mathematics/spaces.pyi +83 -0
  160. tnfr/mathematics/transforms.py +305 -0
  161. tnfr/mathematics/transforms.pyi +62 -0
  162. tnfr/metrics/__init__.py +47 -9
  163. tnfr/metrics/__init__.pyi +20 -0
  164. tnfr/metrics/buffer_cache.py +163 -0
  165. tnfr/metrics/buffer_cache.pyi +24 -0
  166. tnfr/metrics/cache_utils.py +214 -0
  167. tnfr/metrics/coherence.py +1510 -330
  168. tnfr/metrics/coherence.pyi +129 -0
  169. tnfr/metrics/common.py +23 -16
  170. tnfr/metrics/common.pyi +35 -0
  171. tnfr/metrics/core.py +251 -36
  172. tnfr/metrics/core.pyi +13 -0
  173. tnfr/metrics/diagnosis.py +709 -110
  174. tnfr/metrics/diagnosis.pyi +86 -0
  175. tnfr/metrics/emergence.py +245 -0
  176. tnfr/metrics/export.py +60 -18
  177. tnfr/metrics/export.pyi +7 -0
  178. tnfr/metrics/glyph_timing.py +233 -43
  179. tnfr/metrics/glyph_timing.pyi +81 -0
  180. tnfr/metrics/learning_metrics.py +280 -0
  181. tnfr/metrics/learning_metrics.pyi +21 -0
  182. tnfr/metrics/phase_coherence.py +351 -0
  183. tnfr/metrics/phase_compatibility.py +349 -0
  184. tnfr/metrics/reporting.py +63 -28
  185. tnfr/metrics/reporting.pyi +25 -0
  186. tnfr/metrics/sense_index.py +1126 -43
  187. tnfr/metrics/sense_index.pyi +9 -0
  188. tnfr/metrics/trig.py +215 -23
  189. tnfr/metrics/trig.pyi +13 -0
  190. tnfr/metrics/trig_cache.py +148 -24
  191. tnfr/metrics/trig_cache.pyi +10 -0
  192. tnfr/multiscale/__init__.py +32 -0
  193. tnfr/multiscale/hierarchical.py +517 -0
  194. tnfr/node.py +646 -140
  195. tnfr/node.pyi +139 -0
  196. tnfr/observers.py +160 -45
  197. tnfr/observers.pyi +31 -0
  198. tnfr/ontosim.py +23 -19
  199. tnfr/ontosim.pyi +28 -0
  200. tnfr/operators/__init__.py +1358 -106
  201. tnfr/operators/__init__.pyi +31 -0
  202. tnfr/operators/algebra.py +277 -0
  203. tnfr/operators/canonical_patterns.py +420 -0
  204. tnfr/operators/cascade.py +267 -0
  205. tnfr/operators/cycle_detection.py +358 -0
  206. tnfr/operators/definitions.py +4108 -0
  207. tnfr/operators/definitions.pyi +78 -0
  208. tnfr/operators/grammar.py +1164 -0
  209. tnfr/operators/grammar.pyi +140 -0
  210. tnfr/operators/hamiltonian.py +710 -0
  211. tnfr/operators/health_analyzer.py +809 -0
  212. tnfr/operators/jitter.py +107 -38
  213. tnfr/operators/jitter.pyi +11 -0
  214. tnfr/operators/lifecycle.py +314 -0
  215. tnfr/operators/metabolism.py +618 -0
  216. tnfr/operators/metrics.py +2138 -0
  217. tnfr/operators/network_analysis/__init__.py +27 -0
  218. tnfr/operators/network_analysis/source_detection.py +186 -0
  219. tnfr/operators/nodal_equation.py +395 -0
  220. tnfr/operators/pattern_detection.py +660 -0
  221. tnfr/operators/patterns.py +669 -0
  222. tnfr/operators/postconditions/__init__.py +38 -0
  223. tnfr/operators/postconditions/mutation.py +236 -0
  224. tnfr/operators/preconditions/__init__.py +1226 -0
  225. tnfr/operators/preconditions/coherence.py +305 -0
  226. tnfr/operators/preconditions/dissonance.py +236 -0
  227. tnfr/operators/preconditions/emission.py +128 -0
  228. tnfr/operators/preconditions/mutation.py +580 -0
  229. tnfr/operators/preconditions/reception.py +125 -0
  230. tnfr/operators/preconditions/resonance.py +364 -0
  231. tnfr/operators/registry.py +74 -0
  232. tnfr/operators/registry.pyi +9 -0
  233. tnfr/operators/remesh.py +1415 -91
  234. tnfr/operators/remesh.pyi +26 -0
  235. tnfr/operators/structural_units.py +268 -0
  236. tnfr/operators/unified_grammar.py +105 -0
  237. tnfr/parallel/__init__.py +54 -0
  238. tnfr/parallel/auto_scaler.py +234 -0
  239. tnfr/parallel/distributed.py +384 -0
  240. tnfr/parallel/engine.py +238 -0
  241. tnfr/parallel/gpu_engine.py +420 -0
  242. tnfr/parallel/monitoring.py +248 -0
  243. tnfr/parallel/partitioner.py +459 -0
  244. tnfr/py.typed +0 -0
  245. tnfr/recipes/__init__.py +22 -0
  246. tnfr/recipes/cookbook.py +743 -0
  247. tnfr/rng.py +75 -151
  248. tnfr/rng.pyi +26 -0
  249. tnfr/schemas/__init__.py +8 -0
  250. tnfr/schemas/grammar.json +94 -0
  251. tnfr/sdk/__init__.py +107 -0
  252. tnfr/sdk/__init__.pyi +19 -0
  253. tnfr/sdk/adaptive_system.py +173 -0
  254. tnfr/sdk/adaptive_system.pyi +21 -0
  255. tnfr/sdk/builders.py +370 -0
  256. tnfr/sdk/builders.pyi +51 -0
  257. tnfr/sdk/fluent.py +1121 -0
  258. tnfr/sdk/fluent.pyi +74 -0
  259. tnfr/sdk/templates.py +342 -0
  260. tnfr/sdk/templates.pyi +41 -0
  261. tnfr/sdk/utils.py +341 -0
  262. tnfr/secure_config.py +46 -0
  263. tnfr/security/__init__.py +70 -0
  264. tnfr/security/database.py +514 -0
  265. tnfr/security/subprocess.py +503 -0
  266. tnfr/security/validation.py +290 -0
  267. tnfr/selector.py +59 -22
  268. tnfr/selector.pyi +19 -0
  269. tnfr/sense.py +92 -67
  270. tnfr/sense.pyi +23 -0
  271. tnfr/services/__init__.py +17 -0
  272. tnfr/services/orchestrator.py +325 -0
  273. tnfr/sparse/__init__.py +39 -0
  274. tnfr/sparse/representations.py +492 -0
  275. tnfr/structural.py +639 -263
  276. tnfr/structural.pyi +83 -0
  277. tnfr/telemetry/__init__.py +35 -0
  278. tnfr/telemetry/cache_metrics.py +226 -0
  279. tnfr/telemetry/cache_metrics.pyi +64 -0
  280. tnfr/telemetry/nu_f.py +422 -0
  281. tnfr/telemetry/nu_f.pyi +108 -0
  282. tnfr/telemetry/verbosity.py +36 -0
  283. tnfr/telemetry/verbosity.pyi +15 -0
  284. tnfr/tokens.py +2 -4
  285. tnfr/tokens.pyi +36 -0
  286. tnfr/tools/__init__.py +20 -0
  287. tnfr/tools/domain_templates.py +478 -0
  288. tnfr/tools/sequence_generator.py +846 -0
  289. tnfr/topology/__init__.py +13 -0
  290. tnfr/topology/asymmetry.py +151 -0
  291. tnfr/trace.py +300 -126
  292. tnfr/trace.pyi +42 -0
  293. tnfr/tutorials/__init__.py +38 -0
  294. tnfr/tutorials/autonomous_evolution.py +285 -0
  295. tnfr/tutorials/interactive.py +1576 -0
  296. tnfr/tutorials/structural_metabolism.py +238 -0
  297. tnfr/types.py +743 -12
  298. tnfr/types.pyi +357 -0
  299. tnfr/units.py +68 -0
  300. tnfr/units.pyi +13 -0
  301. tnfr/utils/__init__.py +282 -0
  302. tnfr/utils/__init__.pyi +215 -0
  303. tnfr/utils/cache.py +4223 -0
  304. tnfr/utils/cache.pyi +470 -0
  305. tnfr/{callback_utils.py → utils/callbacks.py} +26 -39
  306. tnfr/utils/callbacks.pyi +49 -0
  307. tnfr/utils/chunks.py +108 -0
  308. tnfr/utils/chunks.pyi +22 -0
  309. tnfr/utils/data.py +428 -0
  310. tnfr/utils/data.pyi +74 -0
  311. tnfr/utils/graph.py +85 -0
  312. tnfr/utils/graph.pyi +10 -0
  313. tnfr/utils/init.py +821 -0
  314. tnfr/utils/init.pyi +80 -0
  315. tnfr/utils/io.py +559 -0
  316. tnfr/utils/io.pyi +66 -0
  317. tnfr/{helpers → utils}/numeric.py +51 -24
  318. tnfr/utils/numeric.pyi +21 -0
  319. tnfr/validation/__init__.py +257 -0
  320. tnfr/validation/__init__.pyi +85 -0
  321. tnfr/validation/compatibility.py +460 -0
  322. tnfr/validation/compatibility.pyi +6 -0
  323. tnfr/validation/config.py +73 -0
  324. tnfr/validation/graph.py +139 -0
  325. tnfr/validation/graph.pyi +18 -0
  326. tnfr/validation/input_validation.py +755 -0
  327. tnfr/validation/invariants.py +712 -0
  328. tnfr/validation/rules.py +253 -0
  329. tnfr/validation/rules.pyi +44 -0
  330. tnfr/validation/runtime.py +279 -0
  331. tnfr/validation/runtime.pyi +28 -0
  332. tnfr/validation/sequence_validator.py +162 -0
  333. tnfr/validation/soft_filters.py +170 -0
  334. tnfr/validation/soft_filters.pyi +32 -0
  335. tnfr/validation/spectral.py +164 -0
  336. tnfr/validation/spectral.pyi +42 -0
  337. tnfr/validation/validator.py +1266 -0
  338. tnfr/validation/window.py +39 -0
  339. tnfr/validation/window.pyi +1 -0
  340. tnfr/visualization/__init__.py +98 -0
  341. tnfr/visualization/cascade_viz.py +256 -0
  342. tnfr/visualization/hierarchy.py +284 -0
  343. tnfr/visualization/sequence_plotter.py +784 -0
  344. tnfr/viz/__init__.py +60 -0
  345. tnfr/viz/matplotlib.py +278 -0
  346. tnfr/viz/matplotlib.pyi +35 -0
  347. tnfr-8.5.0.dist-info/METADATA +573 -0
  348. tnfr-8.5.0.dist-info/RECORD +353 -0
  349. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/entry_points.txt +1 -0
  350. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/licenses/LICENSE.md +1 -1
  351. tnfr/collections_utils.py +0 -300
  352. tnfr/config.py +0 -32
  353. tnfr/grammar.py +0 -344
  354. tnfr/graph_utils.py +0 -84
  355. tnfr/helpers/__init__.py +0 -71
  356. tnfr/import_utils.py +0 -228
  357. tnfr/json_utils.py +0 -162
  358. tnfr/logging_utils.py +0 -116
  359. tnfr/presets.py +0 -60
  360. tnfr/validators.py +0 -84
  361. tnfr/value_utils.py +0 -59
  362. tnfr-4.5.2.dist-info/METADATA +0 -379
  363. tnfr-4.5.2.dist-info/RECORD +0 -67
  364. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
  365. {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/top_level.txt +0 -0
tnfr/utils/cache.pyi ADDED
@@ -0,0 +1,470 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import threading
5
+ from collections import defaultdict
6
+ from collections.abc import (
7
+ Callable,
8
+ Hashable,
9
+ Iterable,
10
+ Iterator,
11
+ Mapping,
12
+ MutableMapping,
13
+ )
14
+ from dataclasses import dataclass
15
+ from typing import Any, ClassVar, ContextManager, Generic, TypeVar
16
+
17
+ import networkx as nx
18
+ from cachetools import LRUCache
19
+
20
+ from ..types import GraphLike, NodeId, TimingContext, TNFRGraph
21
+
22
+ K = TypeVar("K", bound=Hashable)
23
+ V = TypeVar("V")
24
+ T = TypeVar("T")
25
+
26
+ class SecurityError(RuntimeError):
27
+ """Raised when a cache payload fails hardened validation."""
28
+
29
+ ...
30
+
31
+ @dataclass(frozen=True)
32
+ class CacheCapacityConfig:
33
+ default_capacity: int | None
34
+ overrides: dict[str, int | None]
35
+
36
+ @dataclass(frozen=True)
37
+ class CacheStatistics:
38
+ hits: int = ...
39
+ misses: int = ...
40
+ evictions: int = ...
41
+ total_time: float = ...
42
+ timings: int = ...
43
+
44
+ def merge(self, other: CacheStatistics) -> CacheStatistics: ...
45
+
46
+ class CacheLayer:
47
+ def load(self, name: str) -> Any: ...
48
+ def store(self, name: str, value: Any) -> None: ...
49
+ def delete(self, name: str) -> None: ...
50
+ def clear(self) -> None: ...
51
+ def close(self) -> None: ...
52
+
53
+ class MappingCacheLayer(CacheLayer):
54
+ def __init__(self, storage: MutableMapping[str, Any] | None = ...) -> None: ...
55
+
56
+ class ShelveCacheLayer(CacheLayer):
57
+ def __init__(
58
+ self,
59
+ path: str,
60
+ *,
61
+ flag: str = ...,
62
+ protocol: int | None = ...,
63
+ writeback: bool = ...,
64
+ ) -> None: ...
65
+
66
+ class RedisCacheLayer(CacheLayer):
67
+ def __init__(self, client: Any | None = ..., *, namespace: str = ...) -> None: ...
68
+
69
+ class CacheManager:
70
+ _MISSING: ClassVar[object]
71
+
72
+ def __init__(
73
+ self,
74
+ storage: MutableMapping[str, Any] | None = ...,
75
+ *,
76
+ default_capacity: int | None = ...,
77
+ overrides: Mapping[str, int | None] | None = ...,
78
+ layers: Iterable[CacheLayer] | None = ...,
79
+ ) -> None: ...
80
+ @staticmethod
81
+ def _normalise_capacity(value: int | None) -> int | None: ...
82
+ def register(
83
+ self,
84
+ name: str,
85
+ factory: Callable[[], Any],
86
+ *,
87
+ lock_factory: Callable[[], threading.Lock | threading.RLock] | None = ...,
88
+ reset: Callable[[Any], Any] | None = ...,
89
+ create: bool = ...,
90
+ encoder: Callable[[Any], Any] | None = ...,
91
+ decoder: Callable[[Any], Any] | None = ...,
92
+ ) -> None: ...
93
+ def configure(
94
+ self,
95
+ *,
96
+ default_capacity: int | None | object = ...,
97
+ overrides: Mapping[str, int | None] | None = ...,
98
+ replace_overrides: bool = ...,
99
+ ) -> None: ...
100
+ def configure_from_mapping(self, config: Mapping[str, Any]) -> None: ...
101
+ def export_config(self) -> CacheCapacityConfig: ...
102
+ def get_capacity(
103
+ self,
104
+ name: str,
105
+ *,
106
+ requested: int | None = ...,
107
+ fallback: int | None = ...,
108
+ use_default: bool = ...,
109
+ ) -> int | None: ...
110
+ def has_override(self, name: str) -> bool: ...
111
+ def get_lock(self, name: str) -> threading.Lock | threading.RLock: ...
112
+ def names(self) -> Iterator[str]: ...
113
+ def get(self, name: str, *, create: bool = ...) -> Any: ...
114
+ def peek(self, name: str) -> Any: ...
115
+ def store(self, name: str, value: Any) -> None: ...
116
+ def update(
117
+ self,
118
+ name: str,
119
+ updater: Callable[[Any], Any],
120
+ *,
121
+ create: bool = ...,
122
+ ) -> Any: ...
123
+ def clear(self, name: str | None = ...) -> None: ...
124
+ def increment_hit(
125
+ self,
126
+ name: str,
127
+ *,
128
+ amount: int = ...,
129
+ duration: float | None = ...,
130
+ ) -> None: ...
131
+ def increment_miss(
132
+ self,
133
+ name: str,
134
+ *,
135
+ amount: int = ...,
136
+ duration: float | None = ...,
137
+ ) -> None: ...
138
+ def increment_eviction(self, name: str, *, amount: int = ...) -> None: ...
139
+ def record_timing(self, name: str, duration: float) -> None: ...
140
+ def timer(self, name: str) -> TimingContext: ...
141
+ def get_metrics(self, name: str) -> CacheStatistics: ...
142
+ def iter_metrics(self) -> Iterator[tuple[str, CacheStatistics]]: ...
143
+ def aggregate_metrics(self) -> CacheStatistics: ...
144
+ def register_metrics_publisher(
145
+ self, publisher: Callable[[str, CacheStatistics], None]
146
+ ) -> None: ...
147
+ def publish_metrics(
148
+ self,
149
+ *,
150
+ publisher: Callable[[str, CacheStatistics], None] | None = ...,
151
+ ) -> None: ...
152
+ def log_metrics(self, logger: logging.Logger, *, level: int = ...) -> None: ...
153
+
154
+ class InstrumentedLRUCache(MutableMapping[K, V], Generic[K, V]):
155
+ _MISSING: ClassVar[object]
156
+
157
+ def __init__(
158
+ self,
159
+ maxsize: int,
160
+ *,
161
+ manager: CacheManager | None = ...,
162
+ metrics_key: str | None = ...,
163
+ telemetry_callbacks: (
164
+ Iterable[Callable[[K, V], None]] | Callable[[K, V], None] | None
165
+ ) = ...,
166
+ eviction_callbacks: (
167
+ Iterable[Callable[[K, V], None]] | Callable[[K, V], None] | None
168
+ ) = ...,
169
+ locks: MutableMapping[K, Any] | None = ...,
170
+ getsizeof: Callable[[V], int] | None = ...,
171
+ count_overwrite_hit: bool = ...,
172
+ ) -> None: ...
173
+ @property
174
+ def telemetry_callbacks(self) -> tuple[Callable[[K, V], None], ...]: ...
175
+ @property
176
+ def eviction_callbacks(self) -> tuple[Callable[[K, V], None], ...]: ...
177
+ def set_telemetry_callbacks(
178
+ self,
179
+ callbacks: Iterable[Callable[[K, V], None]] | Callable[[K, V], None] | None,
180
+ *,
181
+ append: bool = ...,
182
+ ) -> None: ...
183
+ def set_eviction_callbacks(
184
+ self,
185
+ callbacks: Iterable[Callable[[K, V], None]] | Callable[[K, V], None] | None,
186
+ *,
187
+ append: bool = ...,
188
+ ) -> None: ...
189
+ def pop(self, key: K, default: Any = ...) -> V: ...
190
+ def popitem(self) -> tuple[K, V]: ...
191
+ def clear(self) -> None: ...
192
+ @property
193
+ def maxsize(self) -> int: ...
194
+ @property
195
+ def currsize(self) -> int: ...
196
+ def get(self, key: K, default: V | None = ...) -> V | None: ...
197
+
198
+ class ManagedLRUCache(LRUCache[K, V], Generic[K, V]):
199
+ def __init__(
200
+ self,
201
+ maxsize: int,
202
+ *,
203
+ manager: CacheManager | None = ...,
204
+ metrics_key: str | None = ...,
205
+ eviction_callbacks: (
206
+ Iterable[Callable[[K, V], None]] | Callable[[K, V], None] | None
207
+ ) = ...,
208
+ telemetry_callbacks: (
209
+ Iterable[Callable[[K, V], None]] | Callable[[K, V], None] | None
210
+ ) = ...,
211
+ locks: MutableMapping[K, Any] | None = ...,
212
+ ) -> None: ...
213
+ def popitem(self) -> tuple[K, V]: ...
214
+
215
+ def prune_lock_mapping(
216
+ cache: Mapping[K, Any] | MutableMapping[K, Any] | None,
217
+ locks: MutableMapping[K, Any] | None,
218
+ ) -> None: ...
219
+
220
+ __all__ = (
221
+ "CacheLayer",
222
+ "CacheManager",
223
+ "CacheCapacityConfig",
224
+ "CacheStatistics",
225
+ "InstrumentedLRUCache",
226
+ "ManagedLRUCache",
227
+ "MappingCacheLayer",
228
+ "RedisCacheLayer",
229
+ "ShelveCacheLayer",
230
+ "prune_lock_mapping",
231
+ "EdgeCacheManager",
232
+ "NODE_SET_CHECKSUM_KEY",
233
+ "cached_node_list",
234
+ "cached_nodes_and_A",
235
+ "clear_node_repr_cache",
236
+ "edge_version_cache",
237
+ "edge_version_update",
238
+ "ensure_node_index_map",
239
+ "ensure_node_offset_map",
240
+ "get_graph_version",
241
+ "increment_edge_version",
242
+ "increment_graph_version",
243
+ "node_set_checksum",
244
+ "stable_json",
245
+ "configure_graph_cache_limits",
246
+ "DNFR_PREP_STATE_KEY",
247
+ "DnfrCache",
248
+ "DnfrPrepState",
249
+ "new_dnfr_cache",
250
+ "build_cache_manager",
251
+ "configure_global_cache_layers",
252
+ "reset_global_cache_manager",
253
+ "_GRAPH_CACHE_LAYERS_KEY",
254
+ "_SeedHashCache",
255
+ "ScopedCounterCache",
256
+ )
257
+
258
+ NODE_SET_CHECKSUM_KEY: str
259
+ _GRAPH_CACHE_LAYERS_KEY: str
260
+ DNFR_PREP_STATE_KEY: str
261
+
262
+ class DnfrCache:
263
+ idx: dict[Any, int]
264
+ theta: list[float]
265
+ epi: list[float]
266
+ vf: list[float]
267
+ cos_theta: list[float]
268
+ sin_theta: list[float]
269
+ neighbor_x: list[float]
270
+ neighbor_y: list[float]
271
+ neighbor_epi_sum: list[float]
272
+ neighbor_vf_sum: list[float]
273
+ neighbor_count: list[float]
274
+ neighbor_deg_sum: list[float] | None
275
+ th_bar: list[float] | None
276
+ epi_bar: list[float] | None
277
+ vf_bar: list[float] | None
278
+ deg_bar: list[float] | None
279
+ degs: dict[Any, float] | None
280
+ deg_list: list[float] | None
281
+ theta_np: Any | None
282
+ epi_np: Any | None
283
+ vf_np: Any | None
284
+ cos_theta_np: Any | None
285
+ sin_theta_np: Any | None
286
+ deg_array: Any | None
287
+ edge_src: Any | None
288
+ edge_dst: Any | None
289
+ checksum: Any | None
290
+ neighbor_x_np: Any | None
291
+ neighbor_y_np: Any | None
292
+ neighbor_epi_sum_np: Any | None
293
+ neighbor_vf_sum_np: Any | None
294
+ neighbor_count_np: Any | None
295
+ neighbor_deg_sum_np: Any | None
296
+ th_bar_np: Any | None
297
+ epi_bar_np: Any | None
298
+ vf_bar_np: Any | None
299
+ deg_bar_np: Any | None
300
+ grad_phase_np: Any | None
301
+ grad_epi_np: Any | None
302
+ grad_vf_np: Any | None
303
+ grad_topo_np: Any | None
304
+ grad_total_np: Any | None
305
+ dense_components_np: Any | None
306
+ dense_accum_np: Any | None
307
+ dense_degree_np: Any | None
308
+ neighbor_accum_np: Any | None
309
+ neighbor_inv_count_np: Any | None
310
+ neighbor_cos_avg_np: Any | None
311
+ neighbor_sin_avg_np: Any | None
312
+ neighbor_mean_tmp_np: Any | None
313
+ neighbor_mean_length_np: Any | None
314
+ edge_signature: Any | None
315
+ neighbor_accum_signature: Any | None
316
+ neighbor_edge_values_np: Any | None
317
+
318
+ class EdgeCacheState:
319
+ cache: MutableMapping[Hashable, Any]
320
+ locks: defaultdict[Hashable, threading.RLock]
321
+ max_entries: int | None
322
+ dirty: bool
323
+
324
+ def new_dnfr_cache() -> DnfrCache: ...
325
+
326
+ class DnfrPrepState:
327
+ cache: DnfrCache
328
+ cache_lock: threading.RLock
329
+ vector_lock: threading.RLock
330
+
331
+ class EdgeCacheManager:
332
+ _STATE_KEY: str
333
+
334
+ def __init__(self, graph: MutableMapping[str, Any]) -> None: ...
335
+ def record_hit(self) -> None: ...
336
+ def record_miss(self, *, track_metrics: bool = ...) -> None: ...
337
+ def record_eviction(self, *, track_metrics: bool = ...) -> None: ...
338
+ def timer(self) -> TimingContext: ...
339
+ def _default_state(self) -> EdgeCacheState: ...
340
+ def resolve_max_entries(self, max_entries: int | None | object) -> int | None: ...
341
+ def _build_state(self, max_entries: int | None) -> EdgeCacheState: ...
342
+ def _ensure_state(
343
+ self, state: EdgeCacheState | None, max_entries: int | None | object
344
+ ) -> EdgeCacheState: ...
345
+ def _reset_state(self, state: EdgeCacheState | None) -> EdgeCacheState: ...
346
+ def get_cache(
347
+ self,
348
+ max_entries: int | None | object,
349
+ *,
350
+ create: bool = ...,
351
+ ) -> EdgeCacheState | None: ...
352
+ def flush_state(self, state: EdgeCacheState) -> None: ...
353
+ def clear(self) -> None: ...
354
+
355
+ def get_graph_version(graph: Any, key: str, default: int = ...) -> int: ...
356
+ def increment_graph_version(graph: Any, key: str) -> int: ...
357
+ def stable_json(obj: Any) -> str: ...
358
+ def clear_node_repr_cache() -> None: ...
359
+ def configure_global_cache_layers(
360
+ *,
361
+ shelve: Mapping[str, Any] | None = ...,
362
+ redis: Mapping[str, Any] | None = ...,
363
+ replace: bool = ...,
364
+ ) -> None: ...
365
+ def node_set_checksum(
366
+ G: nx.Graph,
367
+ nodes: Iterable[Any] | None = ...,
368
+ *,
369
+ presorted: bool = ...,
370
+ store: bool = ...,
371
+ ) -> str: ...
372
+ def reset_global_cache_manager() -> None: ...
373
+ def build_cache_manager(
374
+ *,
375
+ graph: MutableMapping[str, Any] | None = ...,
376
+ storage: MutableMapping[str, Any] | None = ...,
377
+ default_capacity: int | None = ...,
378
+ overrides: Mapping[str, int | None] | None = ...,
379
+ ) -> CacheManager: ...
380
+ def cached_node_list(G: nx.Graph) -> tuple[Any, ...]: ...
381
+ def ensure_node_index_map(G: TNFRGraph) -> dict[NodeId, int]: ...
382
+ def ensure_node_offset_map(G: TNFRGraph) -> dict[NodeId, int]: ...
383
+ def configure_graph_cache_limits(
384
+ G: GraphLike | TNFRGraph | MutableMapping[str, Any],
385
+ *,
386
+ default_capacity: int | None | object = CacheManager._MISSING,
387
+ overrides: Mapping[str, int | None] | None = ...,
388
+ replace_overrides: bool = ...,
389
+ ) -> CacheCapacityConfig: ...
390
+ def increment_edge_version(G: Any) -> None: ...
391
+ def edge_version_cache(
392
+ G: Any,
393
+ key: Hashable,
394
+ builder: Callable[[], T],
395
+ *,
396
+ max_entries: int | None | object = CacheManager._MISSING,
397
+ ) -> T: ...
398
+ def cached_nodes_and_A(
399
+ G: nx.Graph,
400
+ *,
401
+ cache_size: int | None = ...,
402
+ require_numpy: bool = ...,
403
+ prefer_sparse: bool = ...,
404
+ nodes: tuple[Any, ...] | None = ...,
405
+ ) -> tuple[tuple[Any, ...], Any]: ...
406
+ def edge_version_update(G: TNFRGraph) -> ContextManager[None]: ...
407
+
408
+ class _SeedCacheState:
409
+ cache: InstrumentedLRUCache[tuple[int, int], int] | None
410
+ maxsize: int
411
+
412
+ class _CounterState(Generic[K]):
413
+ cache: InstrumentedLRUCache[K, int]
414
+ locks: dict[K, threading.RLock]
415
+ max_entries: int
416
+
417
+ class _SeedHashCache(MutableMapping[tuple[int, int], int]):
418
+ _state_key: str
419
+
420
+ def __init__(
421
+ self,
422
+ *,
423
+ manager: CacheManager | None = ...,
424
+ state_key: str = ...,
425
+ default_maxsize: int = ...,
426
+ ) -> None: ...
427
+ def configure(self, maxsize: int) -> None: ...
428
+ def __getitem__(self, key: tuple[int, int]) -> int: ...
429
+ def __setitem__(self, key: tuple[int, int], value: int) -> None: ...
430
+ def __delitem__(self, key: tuple[int, int]) -> None: ...
431
+ def __iter__(self) -> Iterator[tuple[int, int]]: ...
432
+ def __len__(self) -> int: ...
433
+ def clear(self) -> None: ...
434
+ @property
435
+ def maxsize(self) -> int: ...
436
+ @property
437
+ def enabled(self) -> bool: ...
438
+ @property
439
+ def data(self) -> InstrumentedLRUCache[tuple[int, int], int] | None: ...
440
+
441
+ class ScopedCounterCache(Generic[K]):
442
+ _state_key: str
443
+
444
+ def __init__(
445
+ self,
446
+ name: str,
447
+ max_entries: int | None = ...,
448
+ *,
449
+ manager: CacheManager | None = ...,
450
+ default_max_entries: int = ...,
451
+ ) -> None: ...
452
+ def configure(
453
+ self, *, force: bool = ..., max_entries: int | None = ...
454
+ ) -> None: ...
455
+ def clear(self) -> None: ...
456
+ def bump(self, key: K) -> int: ...
457
+ def __len__(self) -> int: ...
458
+ @property
459
+ def lock(self) -> threading.Lock | threading.RLock: ...
460
+ @property
461
+ def max_entries(self) -> int: ...
462
+ @property
463
+ def cache(self) -> InstrumentedLRUCache[K, int]: ...
464
+ @property
465
+ def locks(self) -> dict[K, threading.RLock]: ...
466
+
467
+ # Internal symbols used by utils.__init__.py
468
+ _GRAPH_CACHE_MANAGER_KEY: str
469
+
470
+ def _graph_cache_manager(graph: MutableMapping[str, Any]) -> CacheManager: ...
@@ -9,28 +9,35 @@ modify shared state.
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
-
13
- from typing import Any, TypedDict
14
- from enum import Enum
12
+ import threading
13
+ import traceback
15
14
  from collections import defaultdict, deque
16
- from collections.abc import Callable, Mapping, Iterable
15
+ from collections.abc import Callable, Iterable, Mapping
16
+ from enum import Enum
17
+ from typing import Any, NamedTuple
18
+
19
+ import networkx as nx
20
+
21
+ from ..constants import DEFAULTS
22
+ from ..locking import get_lock
23
+ from .init import get_logger
24
+ from .data import is_non_string_sequence
25
+ from ..types import CallbackError
17
26
 
18
- import traceback
19
- import threading
20
- from .logging_utils import get_logger
21
- from .constants import DEFAULTS
22
- from .locking import get_lock
23
27
 
24
- from .trace import CallbackSpec
25
- from .collections_utils import is_non_string_sequence
28
+ class CallbackSpec(NamedTuple):
29
+ """Specification for a registered callback."""
30
+
31
+ name: str | None
32
+ func: Callable[..., Any]
26
33
 
27
- import networkx as nx # type: ignore[import-untyped]
28
34
 
29
35
  __all__ = (
30
36
  "CallbackEvent",
31
37
  "CallbackManager",
32
38
  "callback_manager",
33
39
  "CallbackError",
40
+ "CallbackSpec",
34
41
  )
35
42
 
36
43
  logger = get_logger(__name__)
@@ -42,6 +49,7 @@ class CallbackEvent(str, Enum):
42
49
  BEFORE_STEP = "before_step"
43
50
  AFTER_STEP = "after_step"
44
51
  ON_REMESH = "on_remesh"
52
+ CACHE_METRICS = "cache_metrics"
45
53
 
46
54
 
47
55
  class CallbackManager:
@@ -131,9 +139,7 @@ class CallbackManager:
131
139
  cb_name = name or getattr(func, "__name__", None)
132
140
  spec = CallbackSpec(cb_name, func)
133
141
  existing_map = cbs[event]
134
- strict = bool(
135
- G.graph.get("CALLBACKS_STRICT", DEFAULTS["CALLBACKS_STRICT"])
136
- )
142
+ strict = bool(G.graph.get("CALLBACKS_STRICT", DEFAULTS["CALLBACKS_STRICT"]))
137
143
  key = _reconcile_callback(event, existing_map, spec, strict)
138
144
 
139
145
  existing_map[key] = spec
@@ -152,9 +158,7 @@ class CallbackManager:
152
158
  event = _normalize_event(event)
153
159
  with self._lock:
154
160
  cbs = dict(self._ensure_callbacks_nolock(G).get(event, {}))
155
- strict = bool(
156
- G.graph.get("CALLBACKS_STRICT", DEFAULTS["CALLBACKS_STRICT"])
157
- )
161
+ strict = bool(G.graph.get("CALLBACKS_STRICT", DEFAULTS["CALLBACKS_STRICT"]))
158
162
  if ctx is None:
159
163
  ctx = {}
160
164
  for spec in cbs.values():
@@ -185,17 +189,6 @@ Callback = Callable[["nx.Graph", dict[str, Any]], None]
185
189
  CallbackRegistry = dict[str, dict[str, "CallbackSpec"]]
186
190
 
187
191
 
188
- class CallbackError(TypedDict):
189
- """Metadata for a failed callback invocation."""
190
-
191
- event: str
192
- step: int | None
193
- error: str
194
- traceback: str
195
- fn: str
196
- name: str | None
197
-
198
-
199
192
  def _func_id(fn: Callable[..., Any]) -> str:
200
193
  """Return a deterministic identifier for ``fn``.
201
194
 
@@ -211,9 +204,7 @@ def _func_id(fn: Callable[..., Any]) -> str:
211
204
  return f"{module}.{qualname}"
212
205
 
213
206
 
214
- def _validate_registry(
215
- G: "nx.Graph", cbs: Any, dirty: set[str]
216
- ) -> CallbackRegistry:
207
+ def _validate_registry(G: "nx.Graph", cbs: Any, dirty: set[str]) -> CallbackRegistry:
217
208
  """Validate and normalise the callback registry.
218
209
 
219
210
  ``cbs`` is coerced to a ``defaultdict(dict)`` and any events listed in
@@ -246,13 +237,13 @@ def _validate_registry(
246
237
  return cbs
247
238
 
248
239
 
249
-
250
-
251
240
  def _normalize_callbacks(entries: Any) -> dict[str, CallbackSpec]:
252
241
  """Return ``entries`` normalised into a callback mapping."""
253
242
  if isinstance(entries, Mapping):
254
243
  entries_iter = entries.values()
255
- elif isinstance(entries, Iterable) and not isinstance(entries, (str, bytes, bytearray)):
244
+ elif isinstance(entries, Iterable) and not isinstance(
245
+ entries, (str, bytes, bytearray)
246
+ ):
256
247
  entries_iter = entries
257
248
  else:
258
249
  return {}
@@ -328,7 +319,6 @@ def _normalize_callback_entry(entry: Any) -> "CallbackSpec | None":
328
319
  return None
329
320
 
330
321
 
331
-
332
322
  def _reconcile_callback(
333
323
  event: str,
334
324
  existing_map: dict[str, CallbackSpec],
@@ -383,6 +373,3 @@ def _reconcile_callback(
383
373
  # ---------------------------------------------------------------------------
384
374
 
385
375
  callback_manager = CallbackManager()
386
-
387
-
388
-
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ import networkx as nx
4
+ from ..types import CallbackError as CallbackError
5
+ from _typeshed import Incomplete
6
+ from collections.abc import Callable
7
+ from enum import Enum
8
+ from typing import Any, NamedTuple
9
+
10
+ __all__ = [
11
+ "CallbackEvent",
12
+ "CallbackManager",
13
+ "callback_manager",
14
+ "CallbackError",
15
+ "CallbackSpec",
16
+ ]
17
+
18
+ Callback = Callable[[nx.Graph, dict[str, Any]], None]
19
+
20
+ class CallbackSpec(NamedTuple):
21
+ name: str | None
22
+ func: Callable[..., Any]
23
+
24
+ class CallbackEvent(str, Enum):
25
+ BEFORE_STEP = "before_step"
26
+ AFTER_STEP = "after_step"
27
+ ON_REMESH = "on_remesh"
28
+ CACHE_METRICS = "cache_metrics"
29
+
30
+ class CallbackManager:
31
+ def __init__(self) -> None: ...
32
+ def get_callback_error_limit(self) -> int: ...
33
+ def set_callback_error_limit(self, limit: int) -> int: ...
34
+ def register_callback(
35
+ self,
36
+ G: nx.Graph,
37
+ event: CallbackEvent | str,
38
+ func: Callback,
39
+ *,
40
+ name: str | None = None,
41
+ ) -> Callback: ...
42
+ def invoke_callbacks(
43
+ self, G: nx.Graph, event: CallbackEvent | str, ctx: dict[str, Any] | None = None
44
+ ) -> None: ...
45
+
46
+ callback_manager: Incomplete
47
+
48
+ def _normalize_callbacks(entries: Any) -> dict[str, CallbackSpec]: ...
49
+ def _normalize_callback_entry(entry: Any) -> CallbackSpec | None: ...