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
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"""Service orchestration layer for TNFR engine.
|
|
2
|
+
|
|
3
|
+
This module provides the TNFROrchestrator service that coordinates execution
|
|
4
|
+
of operator sequences with clear separation of responsibilities:
|
|
5
|
+
|
|
6
|
+
1. Validation (delegated to ValidationService)
|
|
7
|
+
2. Execution (coordinated through OperatorRegistry)
|
|
8
|
+
3. Dynamics (delegated to DynamicsEngine)
|
|
9
|
+
4. Telemetry (delegated to TelemetryCollector)
|
|
10
|
+
|
|
11
|
+
The orchestrator maintains the nodal equation ∂EPI/∂t = νf · ΔNFR(t) while
|
|
12
|
+
ensuring that each layer operates independently and can be replaced without
|
|
13
|
+
affecting the others.
|
|
14
|
+
|
|
15
|
+
Examples
|
|
16
|
+
--------
|
|
17
|
+
Execute a sequence with default services:
|
|
18
|
+
|
|
19
|
+
>>> from tnfr.core.container import TNFRContainer
|
|
20
|
+
>>> from tnfr.services.orchestrator import TNFROrchestrator
|
|
21
|
+
>>> from tnfr.structural import create_nfr
|
|
22
|
+
>>>
|
|
23
|
+
>>> container = TNFRContainer.create_default()
|
|
24
|
+
>>> orchestrator = TNFROrchestrator.from_container(container)
|
|
25
|
+
>>> G, node = create_nfr("seed", epi=1.0, vf=2.0)
|
|
26
|
+
>>> orchestrator.execute_sequence(G, node, ["emission", "coherence"])
|
|
27
|
+
|
|
28
|
+
Execute with custom services:
|
|
29
|
+
|
|
30
|
+
>>> class CustomValidator:
|
|
31
|
+
... def validate_sequence(self, seq):
|
|
32
|
+
... print(f"Validating {seq}")
|
|
33
|
+
... def validate_graph_state(self, graph):
|
|
34
|
+
... pass
|
|
35
|
+
>>>
|
|
36
|
+
>>> container = TNFRContainer()
|
|
37
|
+
>>> container.register_singleton(ValidationService, CustomValidator())
|
|
38
|
+
>>> # ... register other services
|
|
39
|
+
>>> orchestrator = TNFROrchestrator.from_container(container)
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
from typing import TYPE_CHECKING, Iterable
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING:
|
|
47
|
+
from ..core.interfaces import (
|
|
48
|
+
DynamicsEngine,
|
|
49
|
+
OperatorRegistry,
|
|
50
|
+
TelemetryCollector,
|
|
51
|
+
ValidationService,
|
|
52
|
+
)
|
|
53
|
+
from ..types import NodeId, TNFRGraph
|
|
54
|
+
from ..operators.definitions import Operator
|
|
55
|
+
|
|
56
|
+
__all__ = ("TNFROrchestrator",)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class TNFROrchestrator:
|
|
60
|
+
"""Orchestrates TNFR sequence execution with separated responsibilities.
|
|
61
|
+
|
|
62
|
+
The orchestrator coordinates validation, execution, dynamics updates, and
|
|
63
|
+
telemetry collection without directly implementing any of these concerns.
|
|
64
|
+
Each responsibility is delegated to a specialized service, enabling
|
|
65
|
+
flexible composition and testing.
|
|
66
|
+
|
|
67
|
+
Attributes
|
|
68
|
+
----------
|
|
69
|
+
_validator : ValidationService
|
|
70
|
+
Service for validating sequences and graph states.
|
|
71
|
+
_registry : OperatorRegistry
|
|
72
|
+
Service for retrieving operator implementations.
|
|
73
|
+
_dynamics : DynamicsEngine
|
|
74
|
+
Service for computing ΔNFR and integrating nodal equation.
|
|
75
|
+
_telemetry : TelemetryCollector
|
|
76
|
+
Service for collecting metrics and traces.
|
|
77
|
+
|
|
78
|
+
Examples
|
|
79
|
+
--------
|
|
80
|
+
Create orchestrator with dependency injection:
|
|
81
|
+
|
|
82
|
+
>>> from tnfr.core.container import TNFRContainer
|
|
83
|
+
>>> container = TNFRContainer.create_default()
|
|
84
|
+
>>> orch = TNFROrchestrator.from_container(container)
|
|
85
|
+
|
|
86
|
+
Execute a validated sequence:
|
|
87
|
+
|
|
88
|
+
>>> from tnfr.structural import create_nfr
|
|
89
|
+
>>> G, node = create_nfr("test", epi=1.0, vf=1.0)
|
|
90
|
+
>>> orch.execute_sequence(G, node, ["emission", "coherence"])
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
validator: ValidationService,
|
|
96
|
+
registry: OperatorRegistry,
|
|
97
|
+
dynamics: DynamicsEngine,
|
|
98
|
+
telemetry: TelemetryCollector,
|
|
99
|
+
):
|
|
100
|
+
"""Initialize orchestrator with injected services.
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
validator : ValidationService
|
|
105
|
+
Service for validation.
|
|
106
|
+
registry : OperatorRegistry
|
|
107
|
+
Service for operator lookup.
|
|
108
|
+
dynamics : DynamicsEngine
|
|
109
|
+
Service for dynamics computation.
|
|
110
|
+
telemetry : TelemetryCollector
|
|
111
|
+
Service for telemetry collection.
|
|
112
|
+
"""
|
|
113
|
+
self._validator = validator
|
|
114
|
+
self._registry = registry
|
|
115
|
+
self._dynamics = dynamics
|
|
116
|
+
self._telemetry = telemetry
|
|
117
|
+
|
|
118
|
+
@classmethod
|
|
119
|
+
def from_container(cls, container) -> TNFROrchestrator:
|
|
120
|
+
"""Create orchestrator from dependency injection container.
|
|
121
|
+
|
|
122
|
+
Parameters
|
|
123
|
+
----------
|
|
124
|
+
container : TNFRContainer
|
|
125
|
+
Container with registered services.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
TNFROrchestrator
|
|
130
|
+
Configured orchestrator instance.
|
|
131
|
+
|
|
132
|
+
Examples
|
|
133
|
+
--------
|
|
134
|
+
>>> from tnfr.core.container import TNFRContainer
|
|
135
|
+
>>> container = TNFRContainer.create_default()
|
|
136
|
+
>>> orch = TNFROrchestrator.from_container(container)
|
|
137
|
+
"""
|
|
138
|
+
from ..core.interfaces import (
|
|
139
|
+
DynamicsEngine,
|
|
140
|
+
OperatorRegistry,
|
|
141
|
+
TelemetryCollector,
|
|
142
|
+
ValidationService,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return cls(
|
|
146
|
+
validator=container.get(ValidationService),
|
|
147
|
+
registry=container.get(OperatorRegistry),
|
|
148
|
+
dynamics=container.get(DynamicsEngine),
|
|
149
|
+
telemetry=container.get(TelemetryCollector),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def execute_sequence(
|
|
153
|
+
self,
|
|
154
|
+
graph: TNFRGraph,
|
|
155
|
+
node: NodeId,
|
|
156
|
+
sequence: Iterable[str | Operator],
|
|
157
|
+
*,
|
|
158
|
+
enable_telemetry: bool = False,
|
|
159
|
+
) -> None:
|
|
160
|
+
"""Execute operator sequence with separated responsibilities.
|
|
161
|
+
|
|
162
|
+
This method coordinates the full execution pipeline:
|
|
163
|
+
1. Validate sequence against TNFR grammar
|
|
164
|
+
2. Convert tokens to operator instances
|
|
165
|
+
3. Apply each operator with telemetry (optional)
|
|
166
|
+
4. Update ΔNFR after each operator
|
|
167
|
+
5. Integrate nodal equation
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
graph : TNFRGraph
|
|
172
|
+
Graph containing the target node.
|
|
173
|
+
node : NodeId
|
|
174
|
+
Node identifier to receive operators.
|
|
175
|
+
sequence : iterable of str or Operator
|
|
176
|
+
Operator tokens or instances to apply.
|
|
177
|
+
enable_telemetry : bool, optional
|
|
178
|
+
Whether to capture detailed telemetry traces. Default is False.
|
|
179
|
+
|
|
180
|
+
Raises
|
|
181
|
+
------
|
|
182
|
+
ValueError
|
|
183
|
+
When sequence validation fails or operators are unknown.
|
|
184
|
+
|
|
185
|
+
Examples
|
|
186
|
+
--------
|
|
187
|
+
Execute with string tokens:
|
|
188
|
+
|
|
189
|
+
>>> from tnfr.structural import create_nfr
|
|
190
|
+
>>> G, n = create_nfr("node1", epi=1.0)
|
|
191
|
+
>>> orch = TNFROrchestrator.from_container(container)
|
|
192
|
+
>>> orch.execute_sequence(G, n, ["emission", "coherence"])
|
|
193
|
+
|
|
194
|
+
Execute with telemetry enabled:
|
|
195
|
+
|
|
196
|
+
>>> orch.execute_sequence(G, n, ["emission"], enable_telemetry=True)
|
|
197
|
+
>>> # Check transitions in G.graph["_trace_transitions"]
|
|
198
|
+
"""
|
|
199
|
+
# Convert sequence to list and extract operator tokens
|
|
200
|
+
ops_list = list(sequence)
|
|
201
|
+
|
|
202
|
+
# Separate tokens from Operator instances
|
|
203
|
+
tokens = []
|
|
204
|
+
operator_instances = []
|
|
205
|
+
for item in ops_list:
|
|
206
|
+
if isinstance(item, str):
|
|
207
|
+
tokens.append(item)
|
|
208
|
+
operator_instances.append(None) # Will resolve later
|
|
209
|
+
else:
|
|
210
|
+
# Assume it's an Operator instance
|
|
211
|
+
tokens.append(item.name)
|
|
212
|
+
operator_instances.append(item)
|
|
213
|
+
|
|
214
|
+
# Step 1: Validation (delegated to ValidationService)
|
|
215
|
+
if tokens: # Skip validation for empty sequences
|
|
216
|
+
self._validator.validate_sequence(tokens)
|
|
217
|
+
|
|
218
|
+
# Step 2: Execution with optional telemetry
|
|
219
|
+
if enable_telemetry:
|
|
220
|
+
with self._telemetry.trace_context(graph) as tracer:
|
|
221
|
+
self._execute_with_telemetry(
|
|
222
|
+
graph, node, tokens, operator_instances, tracer
|
|
223
|
+
)
|
|
224
|
+
else:
|
|
225
|
+
self._execute_without_telemetry(graph, node, tokens, operator_instances)
|
|
226
|
+
|
|
227
|
+
def _execute_with_telemetry(
|
|
228
|
+
self, graph, node, tokens, operator_instances, tracer
|
|
229
|
+
) -> None:
|
|
230
|
+
"""Execute sequence with telemetry capture."""
|
|
231
|
+
for token, op_instance in zip(tokens, operator_instances):
|
|
232
|
+
# Pre-execution: capture state
|
|
233
|
+
pre_state = tracer.capture_state(graph)
|
|
234
|
+
|
|
235
|
+
# Execution: apply operator
|
|
236
|
+
if op_instance is None:
|
|
237
|
+
operator_cls = self._registry.get_operator(token)
|
|
238
|
+
operator_cls()(graph, node) # Instantiate and call
|
|
239
|
+
else:
|
|
240
|
+
op_instance(graph, node)
|
|
241
|
+
|
|
242
|
+
# Post-execution: update dynamics
|
|
243
|
+
self._dynamics.update_delta_nfr(graph)
|
|
244
|
+
|
|
245
|
+
# Telemetry: record transition
|
|
246
|
+
post_state = tracer.capture_state(graph)
|
|
247
|
+
tracer.record_transition(token, pre_state, post_state)
|
|
248
|
+
|
|
249
|
+
def _execute_without_telemetry(
|
|
250
|
+
self, graph, node, tokens, operator_instances
|
|
251
|
+
) -> None:
|
|
252
|
+
"""Execute sequence without telemetry overhead."""
|
|
253
|
+
for token, op_instance in zip(tokens, operator_instances):
|
|
254
|
+
# Execution: apply operator
|
|
255
|
+
if op_instance is None:
|
|
256
|
+
operator_cls = self._registry.get_operator(token)
|
|
257
|
+
operator_cls()(graph, node) # Instantiate and call
|
|
258
|
+
else:
|
|
259
|
+
op_instance(graph, node)
|
|
260
|
+
|
|
261
|
+
# Post-execution: update dynamics
|
|
262
|
+
self._dynamics.update_delta_nfr(graph)
|
|
263
|
+
|
|
264
|
+
def validate_only(self, sequence: list[str]) -> None:
|
|
265
|
+
"""Validate sequence without executing.
|
|
266
|
+
|
|
267
|
+
This method is useful for pre-flight checks before committing to
|
|
268
|
+
execution.
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
sequence : list of str
|
|
273
|
+
Operator tokens to validate.
|
|
274
|
+
|
|
275
|
+
Raises
|
|
276
|
+
------
|
|
277
|
+
ValueError
|
|
278
|
+
When sequence violates grammar rules.
|
|
279
|
+
|
|
280
|
+
Examples
|
|
281
|
+
--------
|
|
282
|
+
>>> orch.validate_only(["emission", "coherence"]) # OK
|
|
283
|
+
>>> orch.validate_only(["unknown_op"]) # Raises ValueError
|
|
284
|
+
"""
|
|
285
|
+
self._validator.validate_sequence(sequence)
|
|
286
|
+
|
|
287
|
+
def get_coherence(self, graph: TNFRGraph) -> float:
|
|
288
|
+
"""Get current coherence C(t) from telemetry service.
|
|
289
|
+
|
|
290
|
+
Parameters
|
|
291
|
+
----------
|
|
292
|
+
graph : TNFRGraph
|
|
293
|
+
Graph to measure.
|
|
294
|
+
|
|
295
|
+
Returns
|
|
296
|
+
-------
|
|
297
|
+
float
|
|
298
|
+
Current coherence value.
|
|
299
|
+
|
|
300
|
+
Examples
|
|
301
|
+
--------
|
|
302
|
+
>>> coherence = orch.get_coherence(G)
|
|
303
|
+
>>> print(f"C(t) = {coherence:.3f}")
|
|
304
|
+
"""
|
|
305
|
+
return self._telemetry.compute_coherence(graph)
|
|
306
|
+
|
|
307
|
+
def get_sense_index(self, graph: TNFRGraph) -> dict:
|
|
308
|
+
"""Get sense index Si from telemetry service.
|
|
309
|
+
|
|
310
|
+
Parameters
|
|
311
|
+
----------
|
|
312
|
+
graph : TNFRGraph
|
|
313
|
+
Graph to measure.
|
|
314
|
+
|
|
315
|
+
Returns
|
|
316
|
+
-------
|
|
317
|
+
dict
|
|
318
|
+
Sense index metrics.
|
|
319
|
+
|
|
320
|
+
Examples
|
|
321
|
+
--------
|
|
322
|
+
>>> si_metrics = orch.get_sense_index(G)
|
|
323
|
+
>>> print(f"Si = {si_metrics['Si']:.3f}")
|
|
324
|
+
"""
|
|
325
|
+
return self._telemetry.compute_sense_index(graph)
|
tnfr/sparse/__init__.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Sparse representations for memory-efficient TNFR networks.
|
|
2
|
+
|
|
3
|
+
This module provides memory-optimized graph representations that reduce
|
|
4
|
+
per-node memory footprint from ~8.5KB to <1KB while preserving all TNFR
|
|
5
|
+
canonical invariants.
|
|
6
|
+
|
|
7
|
+
Canonical Invariants Preserved
|
|
8
|
+
------------------------------
|
|
9
|
+
1. Nodal equation: ∂EPI/∂t = νf · ΔNFR(t)
|
|
10
|
+
2. Sparse storage: only non-default values stored
|
|
11
|
+
3. Cache coherence: intelligent caching for repeated computations
|
|
12
|
+
4. Deterministic computation: same inputs yield same outputs
|
|
13
|
+
|
|
14
|
+
Examples
|
|
15
|
+
--------
|
|
16
|
+
Create a sparse graph with 10,000 nodes:
|
|
17
|
+
|
|
18
|
+
>>> from tnfr.sparse import SparseTNFRGraph
|
|
19
|
+
>>> graph = SparseTNFRGraph(node_count=10000, expected_density=0.1)
|
|
20
|
+
>>> footprint = graph.memory_footprint()
|
|
21
|
+
>>> print(f"Memory per node: {footprint.per_node_kb:.2f} KB") # doctest: +SKIP
|
|
22
|
+
Memory per node: 0.85 KB
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from .representations import (
|
|
28
|
+
CompactAttributeStore,
|
|
29
|
+
MemoryReport,
|
|
30
|
+
SparseCache,
|
|
31
|
+
SparseTNFRGraph,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"SparseTNFRGraph",
|
|
36
|
+
"CompactAttributeStore",
|
|
37
|
+
"MemoryReport",
|
|
38
|
+
"SparseCache",
|
|
39
|
+
]
|