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.
- tnfr/__init__.py +334 -50
- tnfr/__init__.pyi +33 -0
- tnfr/_compat.py +10 -0
- tnfr/_generated_version.py +34 -0
- tnfr/_version.py +49 -0
- tnfr/_version.pyi +7 -0
- tnfr/alias.py +214 -37
- tnfr/alias.pyi +108 -0
- tnfr/backends/__init__.py +354 -0
- tnfr/backends/jax_backend.py +173 -0
- tnfr/backends/numpy_backend.py +238 -0
- tnfr/backends/optimized_numpy.py +420 -0
- tnfr/backends/torch_backend.py +408 -0
- tnfr/cache.py +149 -556
- tnfr/cache.pyi +13 -0
- tnfr/cli/__init__.py +51 -16
- tnfr/cli/__init__.pyi +26 -0
- tnfr/cli/arguments.py +344 -32
- tnfr/cli/arguments.pyi +29 -0
- tnfr/cli/execution.py +676 -50
- tnfr/cli/execution.pyi +70 -0
- tnfr/cli/interactive_validator.py +614 -0
- tnfr/cli/utils.py +18 -3
- tnfr/cli/utils.pyi +7 -0
- tnfr/cli/validate.py +236 -0
- tnfr/compat/__init__.py +85 -0
- tnfr/compat/dataclass.py +136 -0
- tnfr/compat/jsonschema_stub.py +61 -0
- tnfr/compat/matplotlib_stub.py +73 -0
- tnfr/compat/numpy_stub.py +155 -0
- tnfr/config/__init__.py +224 -0
- tnfr/config/__init__.pyi +10 -0
- tnfr/{constants_glyphs.py → config/constants.py} +26 -20
- tnfr/config/constants.pyi +12 -0
- tnfr/config/defaults.py +54 -0
- tnfr/{constants/core.py → config/defaults_core.py} +59 -6
- tnfr/config/defaults_init.py +33 -0
- tnfr/config/defaults_metric.py +104 -0
- tnfr/config/feature_flags.py +81 -0
- tnfr/config/feature_flags.pyi +16 -0
- tnfr/config/glyph_constants.py +31 -0
- tnfr/config/init.py +77 -0
- tnfr/config/init.pyi +8 -0
- tnfr/config/operator_names.py +254 -0
- tnfr/config/operator_names.pyi +36 -0
- tnfr/config/physics_derivation.py +354 -0
- tnfr/config/presets.py +83 -0
- tnfr/config/presets.pyi +7 -0
- tnfr/config/security.py +927 -0
- tnfr/config/thresholds.py +114 -0
- tnfr/config/tnfr_config.py +498 -0
- tnfr/constants/__init__.py +51 -133
- tnfr/constants/__init__.pyi +92 -0
- tnfr/constants/aliases.py +33 -0
- tnfr/constants/aliases.pyi +27 -0
- tnfr/constants/init.py +3 -1
- tnfr/constants/init.pyi +12 -0
- tnfr/constants/metric.py +9 -15
- tnfr/constants/metric.pyi +19 -0
- tnfr/core/__init__.py +33 -0
- tnfr/core/container.py +226 -0
- tnfr/core/default_implementations.py +329 -0
- tnfr/core/interfaces.py +279 -0
- tnfr/dynamics/__init__.py +213 -633
- tnfr/dynamics/__init__.pyi +83 -0
- tnfr/dynamics/adaptation.py +267 -0
- tnfr/dynamics/adaptation.pyi +7 -0
- tnfr/dynamics/adaptive_sequences.py +189 -0
- tnfr/dynamics/adaptive_sequences.pyi +14 -0
- tnfr/dynamics/aliases.py +23 -0
- tnfr/dynamics/aliases.pyi +19 -0
- tnfr/dynamics/bifurcation.py +232 -0
- tnfr/dynamics/canonical.py +229 -0
- tnfr/dynamics/canonical.pyi +48 -0
- tnfr/dynamics/coordination.py +385 -0
- tnfr/dynamics/coordination.pyi +25 -0
- tnfr/dynamics/dnfr.py +2699 -398
- tnfr/dynamics/dnfr.pyi +26 -0
- tnfr/dynamics/dynamic_limits.py +225 -0
- tnfr/dynamics/feedback.py +252 -0
- tnfr/dynamics/feedback.pyi +24 -0
- tnfr/dynamics/fused_dnfr.py +454 -0
- tnfr/dynamics/homeostasis.py +157 -0
- tnfr/dynamics/homeostasis.pyi +14 -0
- tnfr/dynamics/integrators.py +496 -102
- tnfr/dynamics/integrators.pyi +36 -0
- tnfr/dynamics/learning.py +310 -0
- tnfr/dynamics/learning.pyi +33 -0
- tnfr/dynamics/metabolism.py +254 -0
- tnfr/dynamics/nbody.py +796 -0
- tnfr/dynamics/nbody_tnfr.py +783 -0
- tnfr/dynamics/propagation.py +326 -0
- tnfr/dynamics/runtime.py +908 -0
- tnfr/dynamics/runtime.pyi +77 -0
- tnfr/dynamics/sampling.py +10 -5
- tnfr/dynamics/sampling.pyi +7 -0
- tnfr/dynamics/selectors.py +711 -0
- tnfr/dynamics/selectors.pyi +85 -0
- tnfr/dynamics/structural_clip.py +207 -0
- tnfr/errors/__init__.py +37 -0
- tnfr/errors/contextual.py +492 -0
- tnfr/execution.py +77 -55
- tnfr/execution.pyi +45 -0
- tnfr/extensions/__init__.py +205 -0
- tnfr/extensions/__init__.pyi +18 -0
- tnfr/extensions/base.py +173 -0
- tnfr/extensions/base.pyi +35 -0
- tnfr/extensions/business/__init__.py +71 -0
- tnfr/extensions/business/__init__.pyi +11 -0
- tnfr/extensions/business/cookbook.py +88 -0
- tnfr/extensions/business/cookbook.pyi +8 -0
- tnfr/extensions/business/health_analyzers.py +202 -0
- tnfr/extensions/business/health_analyzers.pyi +9 -0
- tnfr/extensions/business/patterns.py +183 -0
- tnfr/extensions/business/patterns.pyi +8 -0
- tnfr/extensions/medical/__init__.py +73 -0
- tnfr/extensions/medical/__init__.pyi +11 -0
- tnfr/extensions/medical/cookbook.py +88 -0
- tnfr/extensions/medical/cookbook.pyi +8 -0
- tnfr/extensions/medical/health_analyzers.py +181 -0
- tnfr/extensions/medical/health_analyzers.pyi +9 -0
- tnfr/extensions/medical/patterns.py +163 -0
- tnfr/extensions/medical/patterns.pyi +8 -0
- tnfr/flatten.py +29 -50
- tnfr/flatten.pyi +21 -0
- tnfr/gamma.py +66 -53
- tnfr/gamma.pyi +36 -0
- tnfr/glyph_history.py +144 -57
- tnfr/glyph_history.pyi +35 -0
- tnfr/glyph_runtime.py +19 -0
- tnfr/glyph_runtime.pyi +8 -0
- tnfr/immutable.py +70 -30
- tnfr/immutable.pyi +36 -0
- tnfr/initialization.py +22 -16
- tnfr/initialization.pyi +65 -0
- tnfr/io.py +5 -241
- tnfr/io.pyi +13 -0
- tnfr/locking.pyi +7 -0
- tnfr/mathematics/__init__.py +79 -0
- tnfr/mathematics/backend.py +453 -0
- tnfr/mathematics/backend.pyi +99 -0
- tnfr/mathematics/dynamics.py +408 -0
- tnfr/mathematics/dynamics.pyi +90 -0
- tnfr/mathematics/epi.py +391 -0
- tnfr/mathematics/epi.pyi +65 -0
- tnfr/mathematics/generators.py +242 -0
- tnfr/mathematics/generators.pyi +29 -0
- tnfr/mathematics/metrics.py +119 -0
- tnfr/mathematics/metrics.pyi +16 -0
- tnfr/mathematics/operators.py +239 -0
- tnfr/mathematics/operators.pyi +59 -0
- tnfr/mathematics/operators_factory.py +124 -0
- tnfr/mathematics/operators_factory.pyi +11 -0
- tnfr/mathematics/projection.py +87 -0
- tnfr/mathematics/projection.pyi +33 -0
- tnfr/mathematics/runtime.py +182 -0
- tnfr/mathematics/runtime.pyi +64 -0
- tnfr/mathematics/spaces.py +256 -0
- tnfr/mathematics/spaces.pyi +83 -0
- tnfr/mathematics/transforms.py +305 -0
- tnfr/mathematics/transforms.pyi +62 -0
- tnfr/metrics/__init__.py +47 -9
- tnfr/metrics/__init__.pyi +20 -0
- tnfr/metrics/buffer_cache.py +163 -0
- tnfr/metrics/buffer_cache.pyi +24 -0
- tnfr/metrics/cache_utils.py +214 -0
- tnfr/metrics/coherence.py +1510 -330
- tnfr/metrics/coherence.pyi +129 -0
- tnfr/metrics/common.py +23 -16
- tnfr/metrics/common.pyi +35 -0
- tnfr/metrics/core.py +251 -36
- tnfr/metrics/core.pyi +13 -0
- tnfr/metrics/diagnosis.py +709 -110
- tnfr/metrics/diagnosis.pyi +86 -0
- tnfr/metrics/emergence.py +245 -0
- tnfr/metrics/export.py +60 -18
- tnfr/metrics/export.pyi +7 -0
- tnfr/metrics/glyph_timing.py +233 -43
- tnfr/metrics/glyph_timing.pyi +81 -0
- tnfr/metrics/learning_metrics.py +280 -0
- tnfr/metrics/learning_metrics.pyi +21 -0
- tnfr/metrics/phase_coherence.py +351 -0
- tnfr/metrics/phase_compatibility.py +349 -0
- tnfr/metrics/reporting.py +63 -28
- tnfr/metrics/reporting.pyi +25 -0
- tnfr/metrics/sense_index.py +1126 -43
- tnfr/metrics/sense_index.pyi +9 -0
- tnfr/metrics/trig.py +215 -23
- tnfr/metrics/trig.pyi +13 -0
- tnfr/metrics/trig_cache.py +148 -24
- tnfr/metrics/trig_cache.pyi +10 -0
- tnfr/multiscale/__init__.py +32 -0
- tnfr/multiscale/hierarchical.py +517 -0
- tnfr/node.py +646 -140
- tnfr/node.pyi +139 -0
- tnfr/observers.py +160 -45
- tnfr/observers.pyi +31 -0
- tnfr/ontosim.py +23 -19
- tnfr/ontosim.pyi +28 -0
- tnfr/operators/__init__.py +1358 -106
- tnfr/operators/__init__.pyi +31 -0
- tnfr/operators/algebra.py +277 -0
- tnfr/operators/canonical_patterns.py +420 -0
- tnfr/operators/cascade.py +267 -0
- tnfr/operators/cycle_detection.py +358 -0
- tnfr/operators/definitions.py +4108 -0
- tnfr/operators/definitions.pyi +78 -0
- tnfr/operators/grammar.py +1164 -0
- tnfr/operators/grammar.pyi +140 -0
- tnfr/operators/hamiltonian.py +710 -0
- tnfr/operators/health_analyzer.py +809 -0
- tnfr/operators/jitter.py +107 -38
- tnfr/operators/jitter.pyi +11 -0
- tnfr/operators/lifecycle.py +314 -0
- tnfr/operators/metabolism.py +618 -0
- tnfr/operators/metrics.py +2138 -0
- tnfr/operators/network_analysis/__init__.py +27 -0
- tnfr/operators/network_analysis/source_detection.py +186 -0
- tnfr/operators/nodal_equation.py +395 -0
- tnfr/operators/pattern_detection.py +660 -0
- tnfr/operators/patterns.py +669 -0
- tnfr/operators/postconditions/__init__.py +38 -0
- tnfr/operators/postconditions/mutation.py +236 -0
- tnfr/operators/preconditions/__init__.py +1226 -0
- tnfr/operators/preconditions/coherence.py +305 -0
- tnfr/operators/preconditions/dissonance.py +236 -0
- tnfr/operators/preconditions/emission.py +128 -0
- tnfr/operators/preconditions/mutation.py +580 -0
- tnfr/operators/preconditions/reception.py +125 -0
- tnfr/operators/preconditions/resonance.py +364 -0
- tnfr/operators/registry.py +74 -0
- tnfr/operators/registry.pyi +9 -0
- tnfr/operators/remesh.py +1415 -91
- tnfr/operators/remesh.pyi +26 -0
- tnfr/operators/structural_units.py +268 -0
- tnfr/operators/unified_grammar.py +105 -0
- tnfr/parallel/__init__.py +54 -0
- tnfr/parallel/auto_scaler.py +234 -0
- tnfr/parallel/distributed.py +384 -0
- tnfr/parallel/engine.py +238 -0
- tnfr/parallel/gpu_engine.py +420 -0
- tnfr/parallel/monitoring.py +248 -0
- tnfr/parallel/partitioner.py +459 -0
- tnfr/py.typed +0 -0
- tnfr/recipes/__init__.py +22 -0
- tnfr/recipes/cookbook.py +743 -0
- tnfr/rng.py +75 -151
- tnfr/rng.pyi +26 -0
- tnfr/schemas/__init__.py +8 -0
- tnfr/schemas/grammar.json +94 -0
- tnfr/sdk/__init__.py +107 -0
- tnfr/sdk/__init__.pyi +19 -0
- tnfr/sdk/adaptive_system.py +173 -0
- tnfr/sdk/adaptive_system.pyi +21 -0
- tnfr/sdk/builders.py +370 -0
- tnfr/sdk/builders.pyi +51 -0
- tnfr/sdk/fluent.py +1121 -0
- tnfr/sdk/fluent.pyi +74 -0
- tnfr/sdk/templates.py +342 -0
- tnfr/sdk/templates.pyi +41 -0
- tnfr/sdk/utils.py +341 -0
- tnfr/secure_config.py +46 -0
- tnfr/security/__init__.py +70 -0
- tnfr/security/database.py +514 -0
- tnfr/security/subprocess.py +503 -0
- tnfr/security/validation.py +290 -0
- tnfr/selector.py +59 -22
- tnfr/selector.pyi +19 -0
- tnfr/sense.py +92 -67
- tnfr/sense.pyi +23 -0
- tnfr/services/__init__.py +17 -0
- tnfr/services/orchestrator.py +325 -0
- tnfr/sparse/__init__.py +39 -0
- tnfr/sparse/representations.py +492 -0
- tnfr/structural.py +639 -263
- tnfr/structural.pyi +83 -0
- tnfr/telemetry/__init__.py +35 -0
- tnfr/telemetry/cache_metrics.py +226 -0
- tnfr/telemetry/cache_metrics.pyi +64 -0
- tnfr/telemetry/nu_f.py +422 -0
- tnfr/telemetry/nu_f.pyi +108 -0
- tnfr/telemetry/verbosity.py +36 -0
- tnfr/telemetry/verbosity.pyi +15 -0
- tnfr/tokens.py +2 -4
- tnfr/tokens.pyi +36 -0
- tnfr/tools/__init__.py +20 -0
- tnfr/tools/domain_templates.py +478 -0
- tnfr/tools/sequence_generator.py +846 -0
- tnfr/topology/__init__.py +13 -0
- tnfr/topology/asymmetry.py +151 -0
- tnfr/trace.py +300 -126
- tnfr/trace.pyi +42 -0
- tnfr/tutorials/__init__.py +38 -0
- tnfr/tutorials/autonomous_evolution.py +285 -0
- tnfr/tutorials/interactive.py +1576 -0
- tnfr/tutorials/structural_metabolism.py +238 -0
- tnfr/types.py +743 -12
- tnfr/types.pyi +357 -0
- tnfr/units.py +68 -0
- tnfr/units.pyi +13 -0
- tnfr/utils/__init__.py +282 -0
- tnfr/utils/__init__.pyi +215 -0
- tnfr/utils/cache.py +4223 -0
- tnfr/utils/cache.pyi +470 -0
- tnfr/{callback_utils.py → utils/callbacks.py} +26 -39
- tnfr/utils/callbacks.pyi +49 -0
- tnfr/utils/chunks.py +108 -0
- tnfr/utils/chunks.pyi +22 -0
- tnfr/utils/data.py +428 -0
- tnfr/utils/data.pyi +74 -0
- tnfr/utils/graph.py +85 -0
- tnfr/utils/graph.pyi +10 -0
- tnfr/utils/init.py +821 -0
- tnfr/utils/init.pyi +80 -0
- tnfr/utils/io.py +559 -0
- tnfr/utils/io.pyi +66 -0
- tnfr/{helpers → utils}/numeric.py +51 -24
- tnfr/utils/numeric.pyi +21 -0
- tnfr/validation/__init__.py +257 -0
- tnfr/validation/__init__.pyi +85 -0
- tnfr/validation/compatibility.py +460 -0
- tnfr/validation/compatibility.pyi +6 -0
- tnfr/validation/config.py +73 -0
- tnfr/validation/graph.py +139 -0
- tnfr/validation/graph.pyi +18 -0
- tnfr/validation/input_validation.py +755 -0
- tnfr/validation/invariants.py +712 -0
- tnfr/validation/rules.py +253 -0
- tnfr/validation/rules.pyi +44 -0
- tnfr/validation/runtime.py +279 -0
- tnfr/validation/runtime.pyi +28 -0
- tnfr/validation/sequence_validator.py +162 -0
- tnfr/validation/soft_filters.py +170 -0
- tnfr/validation/soft_filters.pyi +32 -0
- tnfr/validation/spectral.py +164 -0
- tnfr/validation/spectral.pyi +42 -0
- tnfr/validation/validator.py +1266 -0
- tnfr/validation/window.py +39 -0
- tnfr/validation/window.pyi +1 -0
- tnfr/visualization/__init__.py +98 -0
- tnfr/visualization/cascade_viz.py +256 -0
- tnfr/visualization/hierarchy.py +284 -0
- tnfr/visualization/sequence_plotter.py +784 -0
- tnfr/viz/__init__.py +60 -0
- tnfr/viz/matplotlib.py +278 -0
- tnfr/viz/matplotlib.pyi +35 -0
- tnfr-8.5.0.dist-info/METADATA +573 -0
- tnfr-8.5.0.dist-info/RECORD +353 -0
- {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/entry_points.txt +1 -0
- {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/licenses/LICENSE.md +1 -1
- tnfr/collections_utils.py +0 -300
- tnfr/config.py +0 -32
- tnfr/grammar.py +0 -344
- tnfr/graph_utils.py +0 -84
- tnfr/helpers/__init__.py +0 -71
- tnfr/import_utils.py +0 -228
- tnfr/json_utils.py +0 -162
- tnfr/logging_utils.py +0 -116
- tnfr/presets.py +0 -60
- tnfr/validators.py +0 -84
- tnfr/value_utils.py +0 -59
- tnfr-4.5.2.dist-info/METADATA +0 -379
- tnfr-4.5.2.dist-info/RECORD +0 -67
- {tnfr-4.5.2.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
- {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
|
-
|
|
14
|
-
from enum import Enum
|
|
12
|
+
import threading
|
|
13
|
+
import traceback
|
|
15
14
|
from collections import defaultdict, deque
|
|
16
|
-
from collections.abc import Callable,
|
|
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
|
-
|
|
25
|
-
|
|
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(
|
|
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
|
-
|
tnfr/utils/callbacks.pyi
ADDED
|
@@ -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: ...
|