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