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/sdk/builders.py
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
"""Builder patterns for common TNFR experiment workflows.
|
|
2
|
+
|
|
3
|
+
This module provides builder pattern implementations for standard TNFR
|
|
4
|
+
experiments. Builders offer more control than templates while still
|
|
5
|
+
simplifying common research patterns.
|
|
6
|
+
|
|
7
|
+
Examples
|
|
8
|
+
--------
|
|
9
|
+
Run a small-world network study:
|
|
10
|
+
|
|
11
|
+
>>> from tnfr.sdk import TNFRExperimentBuilder
|
|
12
|
+
>>> results = TNFRExperimentBuilder.small_world_study(
|
|
13
|
+
... nodes=50, rewiring_prob=0.1, steps=10
|
|
14
|
+
... )
|
|
15
|
+
|
|
16
|
+
Compare different network topologies:
|
|
17
|
+
|
|
18
|
+
>>> comparison = TNFRExperimentBuilder.compare_topologies(
|
|
19
|
+
... node_count=40, steps=10
|
|
20
|
+
... )
|
|
21
|
+
>>> for topology, results in comparison.items():
|
|
22
|
+
... print(f"{topology}: coherence={results.coherence:.3f}")
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from typing import Dict, Optional
|
|
28
|
+
|
|
29
|
+
from .fluent import TNFRNetwork, NetworkResults
|
|
30
|
+
|
|
31
|
+
__all__ = ["TNFRExperimentBuilder"]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TNFRExperimentBuilder:
|
|
35
|
+
"""Builder pattern for standard TNFR experiments.
|
|
36
|
+
|
|
37
|
+
This class provides static methods that implement common experimental
|
|
38
|
+
patterns in TNFR research. Each method configures and runs a complete
|
|
39
|
+
experiment, returning structured results for analysis.
|
|
40
|
+
|
|
41
|
+
Builders are more flexible than templates, allowing researchers to
|
|
42
|
+
control specific parameters while handling boilerplate setup.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def small_world_study(
|
|
47
|
+
nodes: int = 50,
|
|
48
|
+
rewiring_prob: float = 0.1,
|
|
49
|
+
steps: int = 10,
|
|
50
|
+
random_seed: Optional[int] = None,
|
|
51
|
+
) -> NetworkResults:
|
|
52
|
+
"""Study small-world network properties with TNFR dynamics.
|
|
53
|
+
|
|
54
|
+
Creates a Watts-Strogatz small-world network and evolves it through
|
|
55
|
+
TNFR operator sequences to study how small-world topology affects
|
|
56
|
+
coherence and synchronization.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
nodes : int, default=50
|
|
61
|
+
Number of nodes in the network.
|
|
62
|
+
rewiring_prob : float, default=0.1
|
|
63
|
+
Rewiring probability for small-world construction.
|
|
64
|
+
steps : int, default=10
|
|
65
|
+
Number of activation steps to apply.
|
|
66
|
+
random_seed : int, optional
|
|
67
|
+
Random seed for reproducibility.
|
|
68
|
+
|
|
69
|
+
Returns
|
|
70
|
+
-------
|
|
71
|
+
NetworkResults
|
|
72
|
+
Complete results including coherence and sense indices.
|
|
73
|
+
|
|
74
|
+
Examples
|
|
75
|
+
--------
|
|
76
|
+
>>> results = TNFRExperimentBuilder.small_world_study(
|
|
77
|
+
... nodes=100, rewiring_prob=0.2
|
|
78
|
+
... )
|
|
79
|
+
>>> print(f"Network coherence: {results.coherence:.3f}")
|
|
80
|
+
"""
|
|
81
|
+
network = TNFRNetwork("small_world_study")
|
|
82
|
+
if random_seed is not None:
|
|
83
|
+
network._config.random_seed = random_seed
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
network.add_nodes(nodes)
|
|
87
|
+
.connect_nodes(rewiring_prob, "small_world")
|
|
88
|
+
.apply_sequence("basic_activation", repeat=steps)
|
|
89
|
+
.measure()
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def synchronization_study(
|
|
94
|
+
nodes: int = 30,
|
|
95
|
+
coupling_strength: float = 0.5,
|
|
96
|
+
steps: int = 20,
|
|
97
|
+
random_seed: Optional[int] = None,
|
|
98
|
+
) -> NetworkResults:
|
|
99
|
+
"""Study synchronization in densely coupled TNFR networks.
|
|
100
|
+
|
|
101
|
+
Creates a network with similar structural frequencies (within TNFR
|
|
102
|
+
bounds) and dense coupling, then applies synchronization sequences
|
|
103
|
+
to study phase locking and coherence emergence.
|
|
104
|
+
|
|
105
|
+
Parameters
|
|
106
|
+
----------
|
|
107
|
+
nodes : int, default=30
|
|
108
|
+
Number of nodes in the network.
|
|
109
|
+
coupling_strength : float, default=0.5
|
|
110
|
+
Connection probability (controls coupling density).
|
|
111
|
+
steps : int, default=20
|
|
112
|
+
Number of synchronization steps.
|
|
113
|
+
random_seed : int, optional
|
|
114
|
+
Random seed for reproducibility.
|
|
115
|
+
|
|
116
|
+
Returns
|
|
117
|
+
-------
|
|
118
|
+
NetworkResults
|
|
119
|
+
Results showing synchronization metrics.
|
|
120
|
+
|
|
121
|
+
Examples
|
|
122
|
+
--------
|
|
123
|
+
>>> results = TNFRExperimentBuilder.synchronization_study(
|
|
124
|
+
... nodes=50, coupling_strength=0.7
|
|
125
|
+
... )
|
|
126
|
+
>>> avg_si = sum(results.sense_indices.values()) / len(results.sense_indices)
|
|
127
|
+
>>> print(f"Synchronization (avg Si): {avg_si:.3f}")
|
|
128
|
+
"""
|
|
129
|
+
network = TNFRNetwork("sync_study")
|
|
130
|
+
if random_seed is not None:
|
|
131
|
+
network._config.random_seed = random_seed
|
|
132
|
+
|
|
133
|
+
# Similar frequencies promote synchronization (within bounds: 0.6-0.9)
|
|
134
|
+
network.add_nodes(nodes, vf_range=(0.6, 0.9))
|
|
135
|
+
network.connect_nodes(coupling_strength, "random")
|
|
136
|
+
|
|
137
|
+
# Multi-phase synchronization protocol
|
|
138
|
+
for step in range(steps):
|
|
139
|
+
if step < 5:
|
|
140
|
+
# Initial activation
|
|
141
|
+
network.apply_sequence("basic_activation")
|
|
142
|
+
elif step < 15:
|
|
143
|
+
# Synchronization phase
|
|
144
|
+
network.apply_sequence("network_sync")
|
|
145
|
+
else:
|
|
146
|
+
# Consolidation
|
|
147
|
+
network.apply_sequence("consolidation")
|
|
148
|
+
|
|
149
|
+
return network.measure()
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def creativity_emergence(
|
|
153
|
+
nodes: int = 20,
|
|
154
|
+
mutation_intensity: float = 0.3,
|
|
155
|
+
steps: int = 15,
|
|
156
|
+
random_seed: Optional[int] = None,
|
|
157
|
+
) -> NetworkResults:
|
|
158
|
+
"""Study creative emergence through controlled mutation.
|
|
159
|
+
|
|
160
|
+
Models creative processes by starting with diverse frequencies
|
|
161
|
+
and applying mutation operators to study how new coherent forms
|
|
162
|
+
emerge from structural reorganization.
|
|
163
|
+
|
|
164
|
+
Parameters
|
|
165
|
+
----------
|
|
166
|
+
nodes : int, default=20
|
|
167
|
+
Number of nodes (ideas/concepts).
|
|
168
|
+
mutation_intensity : float, default=0.3
|
|
169
|
+
Not currently used, reserved for future mutation parameters.
|
|
170
|
+
steps : int, default=15
|
|
171
|
+
Number of creative mutation cycles.
|
|
172
|
+
random_seed : int, optional
|
|
173
|
+
Random seed for reproducibility.
|
|
174
|
+
|
|
175
|
+
Returns
|
|
176
|
+
-------
|
|
177
|
+
NetworkResults
|
|
178
|
+
Results showing creative coherence emergence.
|
|
179
|
+
|
|
180
|
+
Examples
|
|
181
|
+
--------
|
|
182
|
+
>>> results = TNFRExperimentBuilder.creativity_emergence(nodes=25)
|
|
183
|
+
>>> print(f"Creative coherence: {results.coherence:.3f}")
|
|
184
|
+
"""
|
|
185
|
+
network = TNFRNetwork("creativity_study")
|
|
186
|
+
if random_seed is not None:
|
|
187
|
+
network._config.random_seed = random_seed
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
network.add_nodes(nodes, vf_range=(0.2, 0.8)) # High diversity
|
|
191
|
+
.connect_nodes(0.2, "ring") # Conservative connectivity
|
|
192
|
+
.apply_sequence("creative_mutation", repeat=steps)
|
|
193
|
+
.measure()
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
@staticmethod
|
|
197
|
+
def compare_topologies(
|
|
198
|
+
node_count: int = 40,
|
|
199
|
+
steps: int = 10,
|
|
200
|
+
topologies: Optional[list[str]] = None,
|
|
201
|
+
random_seed: Optional[int] = None,
|
|
202
|
+
) -> Dict[str, NetworkResults]:
|
|
203
|
+
"""Compare TNFR dynamics across different network topologies.
|
|
204
|
+
|
|
205
|
+
Creates multiple networks with identical node properties but
|
|
206
|
+
different topological structures, then compares their evolution
|
|
207
|
+
under the same operator sequences.
|
|
208
|
+
|
|
209
|
+
Parameters
|
|
210
|
+
----------
|
|
211
|
+
node_count : int, default=40
|
|
212
|
+
Number of nodes in each network.
|
|
213
|
+
steps : int, default=10
|
|
214
|
+
Number of activation steps to apply.
|
|
215
|
+
topologies : list[str], optional
|
|
216
|
+
List of topologies to compare. If None, uses
|
|
217
|
+
["random", "ring", "small_world"].
|
|
218
|
+
random_seed : int, optional
|
|
219
|
+
Random seed for reproducibility across all networks.
|
|
220
|
+
|
|
221
|
+
Returns
|
|
222
|
+
-------
|
|
223
|
+
Dict[str, NetworkResults]
|
|
224
|
+
Dictionary mapping topology names to their results.
|
|
225
|
+
|
|
226
|
+
Examples
|
|
227
|
+
--------
|
|
228
|
+
>>> comparison = TNFRExperimentBuilder.compare_topologies(
|
|
229
|
+
... node_count=50, steps=15
|
|
230
|
+
... )
|
|
231
|
+
>>> for topo, res in comparison.items():
|
|
232
|
+
... print(f"{topo}: C(t)={res.coherence:.3f}")
|
|
233
|
+
"""
|
|
234
|
+
if topologies is None:
|
|
235
|
+
topologies = ["random", "ring", "small_world"]
|
|
236
|
+
|
|
237
|
+
results = {}
|
|
238
|
+
|
|
239
|
+
for topology in topologies:
|
|
240
|
+
network = TNFRNetwork(f"topology_study_{topology}")
|
|
241
|
+
if random_seed is not None:
|
|
242
|
+
network._config.random_seed = random_seed
|
|
243
|
+
|
|
244
|
+
network.add_nodes(node_count)
|
|
245
|
+
network.connect_nodes(0.3, topology)
|
|
246
|
+
network.apply_sequence("basic_activation", repeat=steps)
|
|
247
|
+
|
|
248
|
+
results[topology] = network.measure()
|
|
249
|
+
|
|
250
|
+
return results
|
|
251
|
+
|
|
252
|
+
@staticmethod
|
|
253
|
+
def phase_transition_study(
|
|
254
|
+
nodes: int = 50,
|
|
255
|
+
initial_coupling: float = 0.1,
|
|
256
|
+
final_coupling: float = 0.9,
|
|
257
|
+
steps_per_level: int = 5,
|
|
258
|
+
coupling_levels: int = 5,
|
|
259
|
+
random_seed: Optional[int] = None,
|
|
260
|
+
) -> Dict[float, NetworkResults]:
|
|
261
|
+
"""Study phase transitions by varying coupling strength.
|
|
262
|
+
|
|
263
|
+
Investigates how network coherence changes as coupling strength
|
|
264
|
+
increases, potentially revealing critical phase transitions in
|
|
265
|
+
TNFR network dynamics.
|
|
266
|
+
|
|
267
|
+
Parameters
|
|
268
|
+
----------
|
|
269
|
+
nodes : int, default=50
|
|
270
|
+
Number of nodes in the network.
|
|
271
|
+
initial_coupling : float, default=0.1
|
|
272
|
+
Starting coupling strength.
|
|
273
|
+
final_coupling : float, default=0.9
|
|
274
|
+
Final coupling strength.
|
|
275
|
+
steps_per_level : int, default=5
|
|
276
|
+
Number of evolution steps at each coupling level.
|
|
277
|
+
coupling_levels : int, default=5
|
|
278
|
+
Number of coupling levels to test.
|
|
279
|
+
random_seed : int, optional
|
|
280
|
+
Random seed for reproducibility.
|
|
281
|
+
|
|
282
|
+
Returns
|
|
283
|
+
-------
|
|
284
|
+
Dict[float, NetworkResults]
|
|
285
|
+
Mapping from coupling strength to network results.
|
|
286
|
+
|
|
287
|
+
Examples
|
|
288
|
+
--------
|
|
289
|
+
>>> transition = TNFRExperimentBuilder.phase_transition_study(nodes=60)
|
|
290
|
+
>>> for coupling, res in sorted(transition.items()):
|
|
291
|
+
... print(f"Coupling {coupling:.2f}: C(t)={res.coherence:.3f}")
|
|
292
|
+
"""
|
|
293
|
+
import numpy as np
|
|
294
|
+
|
|
295
|
+
coupling_values = np.linspace(initial_coupling, final_coupling, coupling_levels)
|
|
296
|
+
results = {}
|
|
297
|
+
|
|
298
|
+
for coupling in coupling_values:
|
|
299
|
+
network = TNFRNetwork(f"phase_study_{coupling:.2f}")
|
|
300
|
+
if random_seed is not None:
|
|
301
|
+
network._config.random_seed = random_seed
|
|
302
|
+
|
|
303
|
+
network.add_nodes(nodes)
|
|
304
|
+
network.connect_nodes(float(coupling), "random")
|
|
305
|
+
network.apply_sequence("network_sync", repeat=steps_per_level)
|
|
306
|
+
|
|
307
|
+
results[float(coupling)] = network.measure()
|
|
308
|
+
|
|
309
|
+
return results
|
|
310
|
+
|
|
311
|
+
@staticmethod
|
|
312
|
+
def resilience_study(
|
|
313
|
+
nodes: int = 40,
|
|
314
|
+
initial_steps: int = 10,
|
|
315
|
+
perturbation_steps: int = 5,
|
|
316
|
+
recovery_steps: int = 10,
|
|
317
|
+
random_seed: Optional[int] = None,
|
|
318
|
+
) -> Dict[str, NetworkResults]:
|
|
319
|
+
"""Study network resilience to perturbations.
|
|
320
|
+
|
|
321
|
+
Establishes a stable network, applies dissonance perturbations,
|
|
322
|
+
then measures recovery through stabilization sequences. Reveals
|
|
323
|
+
network resilience properties.
|
|
324
|
+
|
|
325
|
+
Parameters
|
|
326
|
+
----------
|
|
327
|
+
nodes : int, default=40
|
|
328
|
+
Number of nodes in the network.
|
|
329
|
+
initial_steps : int, default=10
|
|
330
|
+
Steps to establish initial stable state.
|
|
331
|
+
perturbation_steps : int, default=5
|
|
332
|
+
Steps of dissonance perturbation.
|
|
333
|
+
recovery_steps : int, default=10
|
|
334
|
+
Steps to observe recovery.
|
|
335
|
+
random_seed : int, optional
|
|
336
|
+
Random seed for reproducibility.
|
|
337
|
+
|
|
338
|
+
Returns
|
|
339
|
+
-------
|
|
340
|
+
Dict[str, NetworkResults]
|
|
341
|
+
Results at 'initial', 'perturbed', and 'recovered' states.
|
|
342
|
+
|
|
343
|
+
Examples
|
|
344
|
+
--------
|
|
345
|
+
>>> resilience = TNFRExperimentBuilder.resilience_study(nodes=50)
|
|
346
|
+
>>> initial_c = resilience['initial'].coherence
|
|
347
|
+
>>> recovered_c = resilience['recovered'].coherence
|
|
348
|
+
>>> print(f"Recovery: {recovered_c / initial_c:.1%}")
|
|
349
|
+
"""
|
|
350
|
+
network = TNFRNetwork("resilience_study")
|
|
351
|
+
if random_seed is not None:
|
|
352
|
+
network._config.random_seed = random_seed
|
|
353
|
+
|
|
354
|
+
results = {}
|
|
355
|
+
|
|
356
|
+
# Phase 1: Establish stable network
|
|
357
|
+
network.add_nodes(nodes)
|
|
358
|
+
network.connect_nodes(0.3, "small_world")
|
|
359
|
+
network.apply_sequence("stabilization", repeat=initial_steps)
|
|
360
|
+
results["initial"] = network.measure()
|
|
361
|
+
|
|
362
|
+
# Phase 2: Apply perturbation
|
|
363
|
+
network.apply_sequence("creative_mutation", repeat=perturbation_steps)
|
|
364
|
+
results["perturbed"] = network.measure()
|
|
365
|
+
|
|
366
|
+
# Phase 3: Recovery
|
|
367
|
+
network.apply_sequence("stabilization", repeat=recovery_steps)
|
|
368
|
+
results["recovered"] = network.measure()
|
|
369
|
+
|
|
370
|
+
return results
|
tnfr/sdk/builders.pyi
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Type stubs for TNFR SDK builders."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
|
+
from .fluent import NetworkResults
|
|
5
|
+
|
|
6
|
+
class TNFRExperimentBuilder:
|
|
7
|
+
@staticmethod
|
|
8
|
+
def small_world_study(
|
|
9
|
+
nodes: int = 50,
|
|
10
|
+
rewiring_prob: float = 0.1,
|
|
11
|
+
steps: int = 10,
|
|
12
|
+
random_seed: Optional[int] = None,
|
|
13
|
+
) -> NetworkResults: ...
|
|
14
|
+
@staticmethod
|
|
15
|
+
def synchronization_study(
|
|
16
|
+
nodes: int = 30,
|
|
17
|
+
coupling_strength: float = 0.5,
|
|
18
|
+
steps: int = 20,
|
|
19
|
+
random_seed: Optional[int] = None,
|
|
20
|
+
) -> NetworkResults: ...
|
|
21
|
+
@staticmethod
|
|
22
|
+
def creativity_emergence(
|
|
23
|
+
nodes: int = 20,
|
|
24
|
+
mutation_intensity: float = 0.3,
|
|
25
|
+
steps: int = 15,
|
|
26
|
+
random_seed: Optional[int] = None,
|
|
27
|
+
) -> NetworkResults: ...
|
|
28
|
+
@staticmethod
|
|
29
|
+
def compare_topologies(
|
|
30
|
+
node_count: int = 40,
|
|
31
|
+
steps: int = 10,
|
|
32
|
+
topologies: Optional[List[str]] = None,
|
|
33
|
+
random_seed: Optional[int] = None,
|
|
34
|
+
) -> Dict[str, NetworkResults]: ...
|
|
35
|
+
@staticmethod
|
|
36
|
+
def phase_transition_study(
|
|
37
|
+
nodes: int = 50,
|
|
38
|
+
initial_coupling: float = 0.1,
|
|
39
|
+
final_coupling: float = 0.9,
|
|
40
|
+
steps_per_level: int = 5,
|
|
41
|
+
coupling_levels: int = 5,
|
|
42
|
+
random_seed: Optional[int] = None,
|
|
43
|
+
) -> Dict[float, NetworkResults]: ...
|
|
44
|
+
@staticmethod
|
|
45
|
+
def resilience_study(
|
|
46
|
+
nodes: int = 40,
|
|
47
|
+
initial_steps: int = 10,
|
|
48
|
+
perturbation_steps: int = 5,
|
|
49
|
+
recovery_steps: int = 10,
|
|
50
|
+
random_seed: Optional[int] = None,
|
|
51
|
+
) -> Dict[str, NetworkResults]: ...
|