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/sdk/utils.py
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"""Utility functions for TNFR SDK.
|
|
2
|
+
|
|
3
|
+
This module provides helper functions for common operations,
|
|
4
|
+
analysis, and visualization support.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Dict, List, Optional, Tuple, Any
|
|
10
|
+
import json
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
HAS_NUMPY = True
|
|
17
|
+
except ImportError:
|
|
18
|
+
np = None # type: ignore[assignment]
|
|
19
|
+
HAS_NUMPY = False
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"compare_networks",
|
|
23
|
+
"compute_network_statistics",
|
|
24
|
+
"export_to_json",
|
|
25
|
+
"import_from_json",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def compare_networks(
|
|
30
|
+
networks: Dict[str, Any],
|
|
31
|
+
metrics: Optional[List[str]] = None,
|
|
32
|
+
) -> Dict[str, Dict[str, float]]:
|
|
33
|
+
"""Compare metrics across multiple networks.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
networks : Dict[str, NetworkResults]
|
|
38
|
+
Dictionary mapping network names to their results.
|
|
39
|
+
metrics : List[str], optional
|
|
40
|
+
List of metrics to compare. If None, compares all available.
|
|
41
|
+
Options: 'coherence', 'avg_si', 'avg_delta_nfr', 'node_count'
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
Dict[str, Dict[str, float]]
|
|
46
|
+
Comparison table with metrics for each network.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> from tnfr.sdk import TNFRExperimentBuilder
|
|
51
|
+
>>> comparison = TNFRExperimentBuilder.compare_topologies(30, 5)
|
|
52
|
+
>>> from tnfr.sdk.utils import compare_networks
|
|
53
|
+
>>> stats = compare_networks(comparison)
|
|
54
|
+
"""
|
|
55
|
+
if metrics is None:
|
|
56
|
+
metrics = ["coherence", "avg_si", "avg_delta_nfr", "node_count"]
|
|
57
|
+
|
|
58
|
+
comparison = {}
|
|
59
|
+
for name, results in networks.items():
|
|
60
|
+
comparison[name] = {}
|
|
61
|
+
|
|
62
|
+
if "coherence" in metrics:
|
|
63
|
+
comparison[name]["coherence"] = results.coherence
|
|
64
|
+
|
|
65
|
+
if "avg_si" in metrics:
|
|
66
|
+
si_values = list(results.sense_indices.values())
|
|
67
|
+
comparison[name]["avg_si"] = (
|
|
68
|
+
sum(si_values) / len(si_values) if si_values else 0.0
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if "avg_delta_nfr" in metrics:
|
|
72
|
+
dnfr_values = list(results.delta_nfr.values())
|
|
73
|
+
comparison[name]["avg_delta_nfr"] = (
|
|
74
|
+
sum(dnfr_values) / len(dnfr_values) if dnfr_values else 0.0
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if "node_count" in metrics:
|
|
78
|
+
comparison[name]["node_count"] = len(results.sense_indices)
|
|
79
|
+
|
|
80
|
+
return comparison
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def compute_network_statistics(results: Any) -> Dict[str, float]:
|
|
84
|
+
"""Compute extended statistics for a network.
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
results : NetworkResults
|
|
89
|
+
Results from network measurement.
|
|
90
|
+
|
|
91
|
+
Returns
|
|
92
|
+
-------
|
|
93
|
+
Dict[str, float]
|
|
94
|
+
Dictionary of computed statistics.
|
|
95
|
+
|
|
96
|
+
Examples
|
|
97
|
+
--------
|
|
98
|
+
>>> from tnfr.sdk import TNFRNetwork
|
|
99
|
+
>>> network = TNFRNetwork().add_nodes(10).connect_nodes(0.3)
|
|
100
|
+
>>> results = network.apply_sequence("basic_activation").measure()
|
|
101
|
+
>>> from tnfr.sdk.utils import compute_network_statistics
|
|
102
|
+
>>> stats = compute_network_statistics(results)
|
|
103
|
+
"""
|
|
104
|
+
si_values = list(results.sense_indices.values())
|
|
105
|
+
dnfr_values = list(results.delta_nfr.values())
|
|
106
|
+
|
|
107
|
+
stats = {
|
|
108
|
+
"coherence": results.coherence,
|
|
109
|
+
"node_count": len(si_values),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if si_values:
|
|
113
|
+
stats["avg_si"] = sum(si_values) / len(si_values)
|
|
114
|
+
stats["min_si"] = min(si_values)
|
|
115
|
+
stats["max_si"] = max(si_values)
|
|
116
|
+
|
|
117
|
+
if HAS_NUMPY:
|
|
118
|
+
stats["std_si"] = float(np.std(si_values))
|
|
119
|
+
else:
|
|
120
|
+
mean_si = stats["avg_si"]
|
|
121
|
+
variance = sum((x - mean_si) ** 2 for x in si_values) / len(si_values)
|
|
122
|
+
stats["std_si"] = variance**0.5
|
|
123
|
+
|
|
124
|
+
if dnfr_values:
|
|
125
|
+
stats["avg_delta_nfr"] = sum(dnfr_values) / len(dnfr_values)
|
|
126
|
+
stats["min_delta_nfr"] = min(dnfr_values)
|
|
127
|
+
stats["max_delta_nfr"] = max(dnfr_values)
|
|
128
|
+
|
|
129
|
+
if HAS_NUMPY:
|
|
130
|
+
stats["std_delta_nfr"] = float(np.std(dnfr_values))
|
|
131
|
+
else:
|
|
132
|
+
mean_dnfr = stats["avg_delta_nfr"]
|
|
133
|
+
variance = sum((x - mean_dnfr) ** 2 for x in dnfr_values) / len(dnfr_values)
|
|
134
|
+
stats["std_delta_nfr"] = variance**0.5
|
|
135
|
+
|
|
136
|
+
if results.avg_vf is not None:
|
|
137
|
+
stats["avg_vf"] = results.avg_vf
|
|
138
|
+
|
|
139
|
+
if results.avg_phase is not None:
|
|
140
|
+
stats["avg_phase"] = results.avg_phase
|
|
141
|
+
|
|
142
|
+
return stats
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def export_to_json(
|
|
146
|
+
network_data: Any,
|
|
147
|
+
filepath: Path | str,
|
|
148
|
+
indent: int = 2,
|
|
149
|
+
) -> None:
|
|
150
|
+
"""Export network data to JSON file.
|
|
151
|
+
|
|
152
|
+
Parameters
|
|
153
|
+
----------
|
|
154
|
+
network_data : TNFRNetwork or NetworkResults or dict
|
|
155
|
+
Network data to export. If TNFRNetwork, calls export_to_dict().
|
|
156
|
+
If NetworkResults, calls to_dict(). Otherwise uses dict directly.
|
|
157
|
+
filepath : Path or str
|
|
158
|
+
Path where JSON file should be saved.
|
|
159
|
+
indent : int, default=2
|
|
160
|
+
JSON indentation level for readability.
|
|
161
|
+
|
|
162
|
+
Examples
|
|
163
|
+
--------
|
|
164
|
+
>>> from tnfr.sdk import TNFRNetwork
|
|
165
|
+
>>> from tnfr.sdk.utils import export_to_json
|
|
166
|
+
>>> network = TNFRNetwork().add_nodes(10).connect_nodes(0.3)
|
|
167
|
+
>>> export_to_json(network, "network.json")
|
|
168
|
+
"""
|
|
169
|
+
filepath = Path(filepath)
|
|
170
|
+
|
|
171
|
+
# Convert to dict if needed
|
|
172
|
+
if hasattr(network_data, "export_to_dict"):
|
|
173
|
+
data = network_data.export_to_dict()
|
|
174
|
+
elif hasattr(network_data, "to_dict"):
|
|
175
|
+
data = network_data.to_dict()
|
|
176
|
+
else:
|
|
177
|
+
data = network_data
|
|
178
|
+
|
|
179
|
+
# Write JSON
|
|
180
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
181
|
+
json.dump(data, f, indent=indent, ensure_ascii=False)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def import_from_json(filepath: Path | str) -> Dict[str, Any]:
|
|
185
|
+
"""Import network data from JSON file.
|
|
186
|
+
|
|
187
|
+
Parameters
|
|
188
|
+
----------
|
|
189
|
+
filepath : Path or str
|
|
190
|
+
Path to JSON file to load.
|
|
191
|
+
|
|
192
|
+
Returns
|
|
193
|
+
-------
|
|
194
|
+
Dict[str, Any]
|
|
195
|
+
Dictionary with network data.
|
|
196
|
+
|
|
197
|
+
Examples
|
|
198
|
+
--------
|
|
199
|
+
>>> from tnfr.sdk.utils import import_from_json
|
|
200
|
+
>>> data = import_from_json("network.json")
|
|
201
|
+
>>> print(data['metadata']['nodes'])
|
|
202
|
+
"""
|
|
203
|
+
filepath = Path(filepath)
|
|
204
|
+
|
|
205
|
+
with open(filepath, "r", encoding="utf-8") as f:
|
|
206
|
+
data = json.load(f)
|
|
207
|
+
|
|
208
|
+
return data
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def format_comparison_table(
|
|
212
|
+
comparison: Dict[str, Dict[str, float]],
|
|
213
|
+
metrics: Optional[List[str]] = None,
|
|
214
|
+
) -> str:
|
|
215
|
+
"""Format network comparison as a readable table.
|
|
216
|
+
|
|
217
|
+
Parameters
|
|
218
|
+
----------
|
|
219
|
+
comparison : Dict[str, Dict[str, float]]
|
|
220
|
+
Comparison data from compare_networks().
|
|
221
|
+
metrics : List[str], optional
|
|
222
|
+
Metrics to include in table. If None, uses all available.
|
|
223
|
+
|
|
224
|
+
Returns
|
|
225
|
+
-------
|
|
226
|
+
str
|
|
227
|
+
Formatted table string.
|
|
228
|
+
|
|
229
|
+
Examples
|
|
230
|
+
--------
|
|
231
|
+
>>> from tnfr.sdk import TNFRExperimentBuilder
|
|
232
|
+
>>> from tnfr.sdk.utils import compare_networks, format_comparison_table
|
|
233
|
+
>>> results = TNFRExperimentBuilder.compare_topologies(20, 3)
|
|
234
|
+
>>> comp = compare_networks(results)
|
|
235
|
+
>>> print(format_comparison_table(comp))
|
|
236
|
+
"""
|
|
237
|
+
if not comparison:
|
|
238
|
+
return "No networks to compare"
|
|
239
|
+
|
|
240
|
+
# Get all available metrics if not specified
|
|
241
|
+
if metrics is None:
|
|
242
|
+
metrics = list(next(iter(comparison.values())).keys())
|
|
243
|
+
|
|
244
|
+
# Build table
|
|
245
|
+
lines = []
|
|
246
|
+
|
|
247
|
+
# Header
|
|
248
|
+
header = f"{'Network':<20} " + " ".join(f"{m:>12}" for m in metrics)
|
|
249
|
+
lines.append(header)
|
|
250
|
+
lines.append("-" * len(header))
|
|
251
|
+
|
|
252
|
+
# Data rows
|
|
253
|
+
for network_name, data in sorted(comparison.items()):
|
|
254
|
+
values = " ".join(f"{data.get(m, 0.0):>12.3f}" for m in metrics)
|
|
255
|
+
lines.append(f"{network_name:<20} {values}")
|
|
256
|
+
|
|
257
|
+
return "\n".join(lines)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def suggest_sequence_for_goal(goal: str) -> Tuple[str, str]:
|
|
261
|
+
"""Suggest operator sequence for a specific goal.
|
|
262
|
+
|
|
263
|
+
Parameters
|
|
264
|
+
----------
|
|
265
|
+
goal : str
|
|
266
|
+
Description of the goal. Options:
|
|
267
|
+
- "activation", "start", "initialize"
|
|
268
|
+
- "stabilize", "consolidate"
|
|
269
|
+
- "explore", "diverge"
|
|
270
|
+
- "synchronize", "align", "coordinate"
|
|
271
|
+
- "mutate", "innovate", "create"
|
|
272
|
+
|
|
273
|
+
Returns
|
|
274
|
+
-------
|
|
275
|
+
Tuple[str, str]
|
|
276
|
+
(sequence_name, description) tuple.
|
|
277
|
+
|
|
278
|
+
Examples
|
|
279
|
+
--------
|
|
280
|
+
>>> from tnfr.sdk.utils import suggest_sequence_for_goal
|
|
281
|
+
>>> seq, desc = suggest_sequence_for_goal("stabilize")
|
|
282
|
+
>>> print(f"Use: {seq}")
|
|
283
|
+
>>> print(f"Description: {desc}")
|
|
284
|
+
"""
|
|
285
|
+
goal_lower = goal.lower()
|
|
286
|
+
|
|
287
|
+
suggestions = {
|
|
288
|
+
"activation": (
|
|
289
|
+
"basic_activation",
|
|
290
|
+
"Initiates network with emission, reception, coherence, and resonance",
|
|
291
|
+
),
|
|
292
|
+
"start": (
|
|
293
|
+
"basic_activation",
|
|
294
|
+
"Initiates network with emission, reception, coherence, and resonance",
|
|
295
|
+
),
|
|
296
|
+
"initialize": (
|
|
297
|
+
"basic_activation",
|
|
298
|
+
"Initiates network with emission, reception, coherence, and resonance",
|
|
299
|
+
),
|
|
300
|
+
"stabilize": (
|
|
301
|
+
"stabilization",
|
|
302
|
+
"Establishes and maintains coherent structure with recursivity",
|
|
303
|
+
),
|
|
304
|
+
"consolidate": (
|
|
305
|
+
"consolidation",
|
|
306
|
+
"Consolidates structure with recursive coherence and silence",
|
|
307
|
+
),
|
|
308
|
+
"explore": (
|
|
309
|
+
"exploration",
|
|
310
|
+
"Explores phase space with dissonance and transition",
|
|
311
|
+
),
|
|
312
|
+
"diverge": (
|
|
313
|
+
"exploration",
|
|
314
|
+
"Explores phase space with dissonance and transition",
|
|
315
|
+
),
|
|
316
|
+
"synchronize": (
|
|
317
|
+
"network_sync",
|
|
318
|
+
"Synchronizes nodes through coupling and resonance",
|
|
319
|
+
),
|
|
320
|
+
"align": ("network_sync", "Synchronizes nodes through coupling and resonance"),
|
|
321
|
+
"coordinate": (
|
|
322
|
+
"network_sync",
|
|
323
|
+
"Synchronizes nodes through coupling and resonance",
|
|
324
|
+
),
|
|
325
|
+
"mutate": (
|
|
326
|
+
"creative_mutation",
|
|
327
|
+
"Generates variation through dissonance and mutation",
|
|
328
|
+
),
|
|
329
|
+
"innovate": (
|
|
330
|
+
"creative_mutation",
|
|
331
|
+
"Generates variation through dissonance and mutation",
|
|
332
|
+
),
|
|
333
|
+
"create": (
|
|
334
|
+
"creative_mutation",
|
|
335
|
+
"Generates variation through dissonance and mutation",
|
|
336
|
+
),
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return suggestions.get(
|
|
340
|
+
goal_lower, ("basic_activation", "Default: basic activation sequence")
|
|
341
|
+
)
|
tnfr/secure_config.py
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Secure configuration management (backward compatibility wrapper).
|
|
2
|
+
|
|
3
|
+
This module re-exports from tnfr.config.security for backward compatibility.
|
|
4
|
+
New code should import directly from tnfr.config.security.
|
|
5
|
+
|
|
6
|
+
Migration Path:
|
|
7
|
+
Old: from tnfr.secure_config import get_env_variable
|
|
8
|
+
New: from tnfr.config.security import get_env_variable
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
# Re-export all secure config functionality from tnfr.config.security
|
|
14
|
+
from .config.security import (
|
|
15
|
+
ConfigurationError,
|
|
16
|
+
CredentialRotationManager,
|
|
17
|
+
SecureCredentialValidator,
|
|
18
|
+
SecureSecretManager,
|
|
19
|
+
SecurityAuditWarning,
|
|
20
|
+
SecurityAuditor,
|
|
21
|
+
get_cache_secret,
|
|
22
|
+
get_env_variable,
|
|
23
|
+
get_rotation_manager,
|
|
24
|
+
get_secret_manager,
|
|
25
|
+
load_github_credentials,
|
|
26
|
+
load_pypi_credentials,
|
|
27
|
+
load_redis_config,
|
|
28
|
+
validate_no_hardcoded_secrets,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
__all__ = (
|
|
32
|
+
"ConfigurationError",
|
|
33
|
+
"SecurityAuditWarning",
|
|
34
|
+
"get_env_variable",
|
|
35
|
+
"load_pypi_credentials",
|
|
36
|
+
"load_github_credentials",
|
|
37
|
+
"load_redis_config",
|
|
38
|
+
"get_cache_secret",
|
|
39
|
+
"validate_no_hardcoded_secrets",
|
|
40
|
+
"SecureCredentialValidator",
|
|
41
|
+
"SecureSecretManager",
|
|
42
|
+
"CredentialRotationManager",
|
|
43
|
+
"SecurityAuditor",
|
|
44
|
+
"get_secret_manager",
|
|
45
|
+
"get_rotation_manager",
|
|
46
|
+
)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Security utilities for TNFR.
|
|
2
|
+
|
|
3
|
+
This module provides security utilities including SQL injection prevention,
|
|
4
|
+
input validation, secure database query patterns, and secure subprocess execution.
|
|
5
|
+
These utilities are designed to be used proactively should database functionality
|
|
6
|
+
be added to TNFR, and to prevent command injection in script execution.
|
|
7
|
+
|
|
8
|
+
Structural Context (TNFR)
|
|
9
|
+
-------------------------
|
|
10
|
+
These security utilities maintain TNFR structural coherence by ensuring:
|
|
11
|
+
- Data persistence preserves EPI integrity
|
|
12
|
+
- Query operations maintain nodal coherence
|
|
13
|
+
- Input validation respects structural frequency constraints
|
|
14
|
+
- Database interactions preserve operational fractality
|
|
15
|
+
- External command execution maintains system integrity
|
|
16
|
+
|
|
17
|
+
Example
|
|
18
|
+
-------
|
|
19
|
+
>>> from tnfr.security import SecureQueryBuilder, validate_identifier
|
|
20
|
+
>>> from tnfr.security import run_command_safely, validate_git_ref
|
|
21
|
+
>>> # Validate database identifiers
|
|
22
|
+
>>> table = validate_identifier("nfr_nodes") # Safe
|
|
23
|
+
>>> # Use parameterized queries
|
|
24
|
+
>>> builder = SecureQueryBuilder()
|
|
25
|
+
>>> query, params = builder.select("nodes", ["epi", "nu_f"]).where("id = ?", 123).build()
|
|
26
|
+
>>> # Execute commands safely
|
|
27
|
+
>>> result = run_command_safely(["git", "status"])
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from .database import (
|
|
33
|
+
SecureQueryBuilder,
|
|
34
|
+
execute_parameterized_query,
|
|
35
|
+
sanitize_string_input,
|
|
36
|
+
validate_identifier,
|
|
37
|
+
)
|
|
38
|
+
from .subprocess import (
|
|
39
|
+
CommandValidationError,
|
|
40
|
+
PathTraversalError,
|
|
41
|
+
resolve_safe_path,
|
|
42
|
+
run_command_safely,
|
|
43
|
+
validate_file_path,
|
|
44
|
+
validate_git_ref,
|
|
45
|
+
validate_path_safe,
|
|
46
|
+
validate_version_string,
|
|
47
|
+
)
|
|
48
|
+
from .validation import (
|
|
49
|
+
validate_nodal_input,
|
|
50
|
+
validate_phase_value,
|
|
51
|
+
validate_structural_frequency,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
__all__ = (
|
|
55
|
+
"SecureQueryBuilder",
|
|
56
|
+
"execute_parameterized_query",
|
|
57
|
+
"sanitize_string_input",
|
|
58
|
+
"validate_identifier",
|
|
59
|
+
"validate_nodal_input",
|
|
60
|
+
"validate_phase_value",
|
|
61
|
+
"validate_structural_frequency",
|
|
62
|
+
"CommandValidationError",
|
|
63
|
+
"PathTraversalError",
|
|
64
|
+
"run_command_safely",
|
|
65
|
+
"validate_git_ref",
|
|
66
|
+
"validate_path_safe",
|
|
67
|
+
"validate_file_path",
|
|
68
|
+
"resolve_safe_path",
|
|
69
|
+
"validate_version_string",
|
|
70
|
+
)
|