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
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
"""Unified TNFR Pattern Detection - Single Source of Truth.
|
|
2
|
+
|
|
3
|
+
Detects structural patterns in operator sequences based on unified grammar (U1-U4).
|
|
4
|
+
Consolidates functionality from canonical_patterns.py and patterns.py into a single
|
|
5
|
+
coherent module that explicitly maps patterns to grammar rules.
|
|
6
|
+
|
|
7
|
+
Pattern Categories
|
|
8
|
+
------------------
|
|
9
|
+
1. **Initiation Patterns**: Based on U1a (GENERATORS)
|
|
10
|
+
2. **Closure Patterns**: Based on U1b (CLOSURES)
|
|
11
|
+
3. **Convergence Patterns**: Based on U2 (STABILIZERS/DESTABILIZERS)
|
|
12
|
+
4. **Resonance Patterns**: Based on U3 (COUPLING_RESONANCE)
|
|
13
|
+
5. **Bifurcation Patterns**: Based on U4 (TRANSFORMERS)
|
|
14
|
+
6. **Composite Patterns**: Combinations of above
|
|
15
|
+
7. **Domain Patterns**: Application-specific patterns
|
|
16
|
+
|
|
17
|
+
All patterns align with unified grammar constraints from UNIFIED_GRAMMAR_RULES.md.
|
|
18
|
+
|
|
19
|
+
References
|
|
20
|
+
----------
|
|
21
|
+
- UNIFIED_GRAMMAR_RULES.md: Physics basis for patterns
|
|
22
|
+
- grammar.py: Operator sets (GENERATORS, CLOSURES, etc.)
|
|
23
|
+
- canonical_patterns.py: Archetypal sequences with metadata
|
|
24
|
+
- patterns.py: Advanced pattern detection algorithms
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
from dataclasses import dataclass
|
|
30
|
+
from typing import TYPE_CHECKING, Any, List, Mapping, Optional, Sequence
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from .grammar import StructuralPattern
|
|
34
|
+
|
|
35
|
+
from ..config.operator_names import (
|
|
36
|
+
COHERENCE,
|
|
37
|
+
CONTRACTION,
|
|
38
|
+
COUPLING,
|
|
39
|
+
DISSONANCE,
|
|
40
|
+
EMISSION,
|
|
41
|
+
EXPANSION,
|
|
42
|
+
MUTATION,
|
|
43
|
+
RECEPTION,
|
|
44
|
+
RECURSIVITY,
|
|
45
|
+
RESONANCE,
|
|
46
|
+
SELF_ORGANIZATION,
|
|
47
|
+
SILENCE,
|
|
48
|
+
TRANSITION,
|
|
49
|
+
)
|
|
50
|
+
from .grammar import (
|
|
51
|
+
BIFURCATION_HANDLERS,
|
|
52
|
+
BIFURCATION_TRIGGERS,
|
|
53
|
+
CLOSURES,
|
|
54
|
+
COUPLING_RESONANCE,
|
|
55
|
+
DESTABILIZERS,
|
|
56
|
+
GENERATORS,
|
|
57
|
+
STABILIZERS,
|
|
58
|
+
TRANSFORMERS,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
__all__ = [
|
|
62
|
+
"PatternMatch",
|
|
63
|
+
"UnifiedPatternDetector",
|
|
64
|
+
"detect_pattern",
|
|
65
|
+
"analyze_sequence",
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class PatternMatch:
|
|
71
|
+
"""Detected pattern in operator sequence.
|
|
72
|
+
|
|
73
|
+
Attributes
|
|
74
|
+
----------
|
|
75
|
+
pattern_name : str
|
|
76
|
+
Name of detected pattern (e.g., 'bootstrap', 'therapeutic')
|
|
77
|
+
start_idx : int
|
|
78
|
+
Starting index in sequence (0-based)
|
|
79
|
+
end_idx : int
|
|
80
|
+
Ending index in sequence (inclusive)
|
|
81
|
+
confidence : float
|
|
82
|
+
Match confidence score (0.0-1.0)
|
|
83
|
+
grammar_rule : str
|
|
84
|
+
Which U1-U4 rule this pattern relates to
|
|
85
|
+
description : str
|
|
86
|
+
Human-readable description of pattern
|
|
87
|
+
structural_pattern : Optional[StructuralPattern]
|
|
88
|
+
Corresponding StructuralPattern enum if applicable
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
pattern_name: str
|
|
92
|
+
start_idx: int
|
|
93
|
+
end_idx: int
|
|
94
|
+
confidence: float
|
|
95
|
+
grammar_rule: str
|
|
96
|
+
description: str
|
|
97
|
+
structural_pattern: Optional[StructuralPattern] = None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class UnifiedPatternDetector:
|
|
101
|
+
"""Unified pattern detector aligned with grammar rules U1-U4.
|
|
102
|
+
|
|
103
|
+
This class consolidates pattern detection from both canonical_patterns.py
|
|
104
|
+
(archetypal sequences) and patterns.py (advanced detection algorithms).
|
|
105
|
+
|
|
106
|
+
Key Features
|
|
107
|
+
------------
|
|
108
|
+
- Explicit mapping of patterns to U1-U4 grammar rules
|
|
109
|
+
- Coherence-weighted scoring for pattern prioritization
|
|
110
|
+
- Detection of both canonical sequences and meta-patterns
|
|
111
|
+
- Grammar validation integrated with pattern recognition
|
|
112
|
+
|
|
113
|
+
Examples
|
|
114
|
+
--------
|
|
115
|
+
>>> from tnfr.operators.pattern_detection import UnifiedPatternDetector
|
|
116
|
+
>>> detector = UnifiedPatternDetector()
|
|
117
|
+
>>> sequence = ["emission", "coupling", "coherence"]
|
|
118
|
+
>>> pattern = detector.detect_pattern(sequence)
|
|
119
|
+
>>> print(pattern) # doctest: +SKIP
|
|
120
|
+
StructuralPattern.BOOTSTRAP
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
def __init__(self) -> None:
|
|
124
|
+
"""Initialize unified pattern detector."""
|
|
125
|
+
# Import pattern detection logic from patterns.py
|
|
126
|
+
from .patterns import AdvancedPatternDetector
|
|
127
|
+
|
|
128
|
+
self._advanced_detector = AdvancedPatternDetector()
|
|
129
|
+
|
|
130
|
+
# Pattern to grammar rule mappings
|
|
131
|
+
self._pattern_grammar_map = {
|
|
132
|
+
# U1a: Initiation patterns (use GENERATORS)
|
|
133
|
+
"cold_start": "U1a",
|
|
134
|
+
"phase_transition_start": "U1a",
|
|
135
|
+
"fractal_awakening": "U1a",
|
|
136
|
+
# U1b: Closure patterns (use CLOSURES)
|
|
137
|
+
"terminal_silence": "U1b",
|
|
138
|
+
"regime_handoff": "U1b",
|
|
139
|
+
"fractal_distribution": "U1b",
|
|
140
|
+
"intentional_tension": "U1b",
|
|
141
|
+
# U2: Convergence patterns (STABILIZERS/DESTABILIZERS)
|
|
142
|
+
"stabilization_cycle": "U2",
|
|
143
|
+
"bounded_evolution": "U2",
|
|
144
|
+
"bootstrap": "U2",
|
|
145
|
+
"stabilize": "U2",
|
|
146
|
+
# U3: Resonance patterns (COUPLING_RESONANCE)
|
|
147
|
+
"coupling_chain": "U3",
|
|
148
|
+
"resonance_cascade": "U3",
|
|
149
|
+
"phase_locked_network": "U3",
|
|
150
|
+
"resonate": "U3",
|
|
151
|
+
# U4: Bifurcation patterns (TRANSFORMERS)
|
|
152
|
+
"graduated_destabilization": "U4b",
|
|
153
|
+
"managed_bifurcation": "U4a",
|
|
154
|
+
"stable_transformation": "U4b",
|
|
155
|
+
"spontaneous_organization": "U4b",
|
|
156
|
+
"bifurcated": "U4",
|
|
157
|
+
"explore": "U4b",
|
|
158
|
+
# Composite patterns
|
|
159
|
+
"bootstrap": "U1a+U2",
|
|
160
|
+
"regenerative_cycle": "U1a+U1b",
|
|
161
|
+
"exploration": "U2+U4b",
|
|
162
|
+
# Domain patterns (combinations)
|
|
163
|
+
"therapeutic": "U1+U2+U4",
|
|
164
|
+
"educational": "U1+U2+U4",
|
|
165
|
+
"organizational": "U1+U2+U3+U4",
|
|
166
|
+
"creative": "U1+U2+U4",
|
|
167
|
+
"regenerative": "U1+U2+U3",
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
def detect_pattern(self, sequence: Sequence[str]) -> StructuralPattern:
|
|
171
|
+
"""Detect the best matching pattern in sequence.
|
|
172
|
+
|
|
173
|
+
Uses coherence-weighted scoring from AdvancedPatternDetector.
|
|
174
|
+
|
|
175
|
+
Parameters
|
|
176
|
+
----------
|
|
177
|
+
sequence : Sequence[str]
|
|
178
|
+
Canonical operator names to analyze
|
|
179
|
+
|
|
180
|
+
Returns
|
|
181
|
+
-------
|
|
182
|
+
StructuralPattern
|
|
183
|
+
The best matching structural pattern
|
|
184
|
+
|
|
185
|
+
Examples
|
|
186
|
+
--------
|
|
187
|
+
>>> detector = UnifiedPatternDetector()
|
|
188
|
+
>>> seq = ["emission", "coupling", "coherence"]
|
|
189
|
+
>>> pattern = detector.detect_pattern(seq) # doctest: +SKIP
|
|
190
|
+
"""
|
|
191
|
+
return self._advanced_detector.detect_pattern(sequence)
|
|
192
|
+
|
|
193
|
+
def detect_initiation_patterns(
|
|
194
|
+
self, sequence: Sequence[str]
|
|
195
|
+
) -> List[PatternMatch]:
|
|
196
|
+
"""Detect U1a-based initiation patterns.
|
|
197
|
+
|
|
198
|
+
Patterns that use GENERATORS (emission, transition, recursivity) to
|
|
199
|
+
create structure from null/dormant states.
|
|
200
|
+
|
|
201
|
+
Parameters
|
|
202
|
+
----------
|
|
203
|
+
sequence : Sequence[str]
|
|
204
|
+
Operator sequence to analyze
|
|
205
|
+
|
|
206
|
+
Returns
|
|
207
|
+
-------
|
|
208
|
+
List[PatternMatch]
|
|
209
|
+
List of detected initiation patterns
|
|
210
|
+
"""
|
|
211
|
+
patterns = []
|
|
212
|
+
|
|
213
|
+
# Cold start: Begins with AL (Emission) from EPI=0
|
|
214
|
+
if sequence and sequence[0] == EMISSION:
|
|
215
|
+
patterns.append(
|
|
216
|
+
PatternMatch(
|
|
217
|
+
pattern_name="cold_start",
|
|
218
|
+
start_idx=0,
|
|
219
|
+
end_idx=0,
|
|
220
|
+
confidence=1.0,
|
|
221
|
+
grammar_rule="U1a",
|
|
222
|
+
description="Emission from vacuum (EPI=0 → active structure)",
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Phase transition start: Begins with NAV (Transition)
|
|
227
|
+
if sequence and sequence[0] == TRANSITION:
|
|
228
|
+
patterns.append(
|
|
229
|
+
PatternMatch(
|
|
230
|
+
pattern_name="phase_transition_start",
|
|
231
|
+
start_idx=0,
|
|
232
|
+
end_idx=0,
|
|
233
|
+
confidence=1.0,
|
|
234
|
+
grammar_rule="U1a",
|
|
235
|
+
description="Transition activates latent EPI",
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
# Fractal awakening: Begins with REMESH (Recursivity)
|
|
240
|
+
if sequence and sequence[0] == RECURSIVITY:
|
|
241
|
+
patterns.append(
|
|
242
|
+
PatternMatch(
|
|
243
|
+
pattern_name="fractal_awakening",
|
|
244
|
+
start_idx=0,
|
|
245
|
+
end_idx=0,
|
|
246
|
+
confidence=1.0,
|
|
247
|
+
grammar_rule="U1a",
|
|
248
|
+
description="Recursivity echoes dormant structure",
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
return patterns
|
|
253
|
+
|
|
254
|
+
def detect_closure_patterns(self, sequence: Sequence[str]) -> List[PatternMatch]:
|
|
255
|
+
"""Detect U1b-based closure patterns.
|
|
256
|
+
|
|
257
|
+
Patterns that use CLOSURES (silence, transition, recursivity, dissonance)
|
|
258
|
+
to leave system in coherent attractor states.
|
|
259
|
+
|
|
260
|
+
Parameters
|
|
261
|
+
----------
|
|
262
|
+
sequence : Sequence[str]
|
|
263
|
+
Operator sequence to analyze
|
|
264
|
+
|
|
265
|
+
Returns
|
|
266
|
+
-------
|
|
267
|
+
List[PatternMatch]
|
|
268
|
+
List of detected closure patterns
|
|
269
|
+
"""
|
|
270
|
+
patterns = []
|
|
271
|
+
|
|
272
|
+
if not sequence:
|
|
273
|
+
return patterns
|
|
274
|
+
|
|
275
|
+
last_op = sequence[-1]
|
|
276
|
+
last_idx = len(sequence) - 1
|
|
277
|
+
|
|
278
|
+
# Terminal silence: Ends with SHA (Silence)
|
|
279
|
+
if last_op == SILENCE:
|
|
280
|
+
patterns.append(
|
|
281
|
+
PatternMatch(
|
|
282
|
+
pattern_name="terminal_silence",
|
|
283
|
+
start_idx=last_idx,
|
|
284
|
+
end_idx=last_idx,
|
|
285
|
+
confidence=1.0,
|
|
286
|
+
grammar_rule="U1b",
|
|
287
|
+
description="Silence freezes evolution (νf → 0)",
|
|
288
|
+
)
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
# Regime handoff: Ends with NAV (Transition)
|
|
292
|
+
if last_op == TRANSITION:
|
|
293
|
+
patterns.append(
|
|
294
|
+
PatternMatch(
|
|
295
|
+
pattern_name="regime_handoff",
|
|
296
|
+
start_idx=last_idx,
|
|
297
|
+
end_idx=last_idx,
|
|
298
|
+
confidence=1.0,
|
|
299
|
+
grammar_rule="U1b",
|
|
300
|
+
description="Transition transfers to next regime",
|
|
301
|
+
)
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
# Fractal distribution: Ends with REMESH (Recursivity)
|
|
305
|
+
if last_op == RECURSIVITY:
|
|
306
|
+
patterns.append(
|
|
307
|
+
PatternMatch(
|
|
308
|
+
pattern_name="fractal_distribution",
|
|
309
|
+
start_idx=last_idx,
|
|
310
|
+
end_idx=last_idx,
|
|
311
|
+
confidence=1.0,
|
|
312
|
+
grammar_rule="U1b",
|
|
313
|
+
description="Recursivity distributes across scales",
|
|
314
|
+
)
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
# Intentional tension: Ends with OZ (Dissonance)
|
|
318
|
+
if last_op == DISSONANCE:
|
|
319
|
+
patterns.append(
|
|
320
|
+
PatternMatch(
|
|
321
|
+
pattern_name="intentional_tension",
|
|
322
|
+
start_idx=last_idx,
|
|
323
|
+
end_idx=last_idx,
|
|
324
|
+
confidence=1.0,
|
|
325
|
+
grammar_rule="U1b",
|
|
326
|
+
description="Dissonance preserves activation/tension",
|
|
327
|
+
)
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
return patterns
|
|
331
|
+
|
|
332
|
+
def detect_convergence_patterns(
|
|
333
|
+
self, sequence: Sequence[str]
|
|
334
|
+
) -> List[PatternMatch]:
|
|
335
|
+
"""Detect U2-based convergence patterns.
|
|
336
|
+
|
|
337
|
+
Patterns involving STABILIZERS and DESTABILIZERS to ensure bounded evolution.
|
|
338
|
+
|
|
339
|
+
Parameters
|
|
340
|
+
----------
|
|
341
|
+
sequence : Sequence[str]
|
|
342
|
+
Operator sequence to analyze
|
|
343
|
+
|
|
344
|
+
Returns
|
|
345
|
+
-------
|
|
346
|
+
List[PatternMatch]
|
|
347
|
+
List of detected convergence patterns
|
|
348
|
+
"""
|
|
349
|
+
patterns = []
|
|
350
|
+
|
|
351
|
+
# Check for destabilizers without stabilizers (runaway risk)
|
|
352
|
+
has_destabilizers = any(op in DESTABILIZERS for op in sequence)
|
|
353
|
+
has_stabilizers = any(op in STABILIZERS for op in sequence)
|
|
354
|
+
|
|
355
|
+
if has_destabilizers and not has_stabilizers:
|
|
356
|
+
patterns.append(
|
|
357
|
+
PatternMatch(
|
|
358
|
+
pattern_name="runaway_risk",
|
|
359
|
+
start_idx=0,
|
|
360
|
+
end_idx=len(sequence) - 1,
|
|
361
|
+
confidence=1.0,
|
|
362
|
+
grammar_rule="U2",
|
|
363
|
+
description="Destabilizers present without stabilizers (divergence risk)",
|
|
364
|
+
)
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# Stabilization cycle: destabilizers followed by stabilizers
|
|
368
|
+
for i in range(len(sequence) - 1):
|
|
369
|
+
if sequence[i] in DESTABILIZERS and sequence[i + 1] in STABILIZERS:
|
|
370
|
+
patterns.append(
|
|
371
|
+
PatternMatch(
|
|
372
|
+
pattern_name="stabilization_cycle",
|
|
373
|
+
start_idx=i,
|
|
374
|
+
end_idx=i + 1,
|
|
375
|
+
confidence=1.0,
|
|
376
|
+
grammar_rule="U2",
|
|
377
|
+
description="Destabilizer → Stabilizer (bounded evolution)",
|
|
378
|
+
)
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
# Bounded evolution: alternating destabilizers and stabilizers
|
|
382
|
+
if len(sequence) >= 4:
|
|
383
|
+
alternating = True
|
|
384
|
+
for i in range(0, len(sequence) - 1, 2):
|
|
385
|
+
if i + 1 < len(sequence):
|
|
386
|
+
if not (
|
|
387
|
+
sequence[i] in DESTABILIZERS and sequence[i + 1] in STABILIZERS
|
|
388
|
+
):
|
|
389
|
+
alternating = False
|
|
390
|
+
break
|
|
391
|
+
if alternating and has_destabilizers and has_stabilizers:
|
|
392
|
+
patterns.append(
|
|
393
|
+
PatternMatch(
|
|
394
|
+
pattern_name="bounded_evolution",
|
|
395
|
+
start_idx=0,
|
|
396
|
+
end_idx=len(sequence) - 1,
|
|
397
|
+
confidence=0.8,
|
|
398
|
+
grammar_rule="U2",
|
|
399
|
+
description="Oscillation between destabilizers and stabilizers",
|
|
400
|
+
)
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
return patterns
|
|
404
|
+
|
|
405
|
+
def detect_resonance_patterns(
|
|
406
|
+
self, sequence: Sequence[str]
|
|
407
|
+
) -> List[PatternMatch]:
|
|
408
|
+
"""Detect U3-based resonance patterns.
|
|
409
|
+
|
|
410
|
+
Patterns involving COUPLING_RESONANCE operators that require phase verification.
|
|
411
|
+
|
|
412
|
+
Parameters
|
|
413
|
+
----------
|
|
414
|
+
sequence : Sequence[str]
|
|
415
|
+
Operator sequence to analyze
|
|
416
|
+
|
|
417
|
+
Returns
|
|
418
|
+
-------
|
|
419
|
+
List[PatternMatch]
|
|
420
|
+
List of detected resonance patterns
|
|
421
|
+
"""
|
|
422
|
+
patterns = []
|
|
423
|
+
|
|
424
|
+
# Coupling chain: multiple UM (Coupling) in sequence
|
|
425
|
+
coupling_count = sum(1 for op in sequence if op == COUPLING)
|
|
426
|
+
if coupling_count >= 2:
|
|
427
|
+
patterns.append(
|
|
428
|
+
PatternMatch(
|
|
429
|
+
pattern_name="coupling_chain",
|
|
430
|
+
start_idx=0,
|
|
431
|
+
end_idx=len(sequence) - 1,
|
|
432
|
+
confidence=0.7,
|
|
433
|
+
grammar_rule="U3",
|
|
434
|
+
description=f"Multiple coupling operations ({coupling_count}) - requires phase verification",
|
|
435
|
+
)
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
# Resonance cascade: multiple RA (Resonance) in sequence
|
|
439
|
+
resonance_count = sum(1 for op in sequence if op == RESONANCE)
|
|
440
|
+
if resonance_count >= 2:
|
|
441
|
+
patterns.append(
|
|
442
|
+
PatternMatch(
|
|
443
|
+
pattern_name="resonance_cascade",
|
|
444
|
+
start_idx=0,
|
|
445
|
+
end_idx=len(sequence) - 1,
|
|
446
|
+
confidence=0.7,
|
|
447
|
+
grammar_rule="U3",
|
|
448
|
+
description=f"Resonance propagation ({resonance_count} ops)",
|
|
449
|
+
)
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
# Phase-locked network: alternating UM and RA
|
|
453
|
+
for i in range(len(sequence) - 1):
|
|
454
|
+
if (sequence[i] == COUPLING and sequence[i + 1] == RESONANCE) or (
|
|
455
|
+
sequence[i] == RESONANCE and sequence[i + 1] == COUPLING
|
|
456
|
+
):
|
|
457
|
+
patterns.append(
|
|
458
|
+
PatternMatch(
|
|
459
|
+
pattern_name="phase_locked_network",
|
|
460
|
+
start_idx=i,
|
|
461
|
+
end_idx=i + 1,
|
|
462
|
+
confidence=0.9,
|
|
463
|
+
grammar_rule="U3",
|
|
464
|
+
description="Coupling ↔ Resonance (synchronized network)",
|
|
465
|
+
)
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
return patterns
|
|
469
|
+
|
|
470
|
+
def detect_bifurcation_patterns(
|
|
471
|
+
self, sequence: Sequence[str]
|
|
472
|
+
) -> List[PatternMatch]:
|
|
473
|
+
"""Detect U4-based bifurcation patterns.
|
|
474
|
+
|
|
475
|
+
Patterns involving TRANSFORMERS and BIFURCATION_TRIGGERS.
|
|
476
|
+
|
|
477
|
+
Parameters
|
|
478
|
+
----------
|
|
479
|
+
sequence : Sequence[str]
|
|
480
|
+
Operator sequence to analyze
|
|
481
|
+
|
|
482
|
+
Returns
|
|
483
|
+
-------
|
|
484
|
+
List[PatternMatch]
|
|
485
|
+
List of detected bifurcation patterns
|
|
486
|
+
"""
|
|
487
|
+
patterns = []
|
|
488
|
+
|
|
489
|
+
# Graduated destabilization: destabilizer → transformer (U4b)
|
|
490
|
+
for i in range(len(sequence) - 1):
|
|
491
|
+
if (
|
|
492
|
+
sequence[i] in DESTABILIZERS
|
|
493
|
+
and sequence[i + 1] in TRANSFORMERS
|
|
494
|
+
):
|
|
495
|
+
patterns.append(
|
|
496
|
+
PatternMatch(
|
|
497
|
+
pattern_name="graduated_destabilization",
|
|
498
|
+
start_idx=i,
|
|
499
|
+
end_idx=i + 1,
|
|
500
|
+
confidence=1.0,
|
|
501
|
+
grammar_rule="U4b",
|
|
502
|
+
description=f"Destabilizer → Transformer ({sequence[i]} → {sequence[i+1]})",
|
|
503
|
+
)
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
# Managed bifurcation: trigger → handler (U4a)
|
|
507
|
+
for i in range(len(sequence) - 1):
|
|
508
|
+
if (
|
|
509
|
+
sequence[i] in BIFURCATION_TRIGGERS
|
|
510
|
+
and sequence[i + 1] in BIFURCATION_HANDLERS
|
|
511
|
+
):
|
|
512
|
+
patterns.append(
|
|
513
|
+
PatternMatch(
|
|
514
|
+
pattern_name="managed_bifurcation",
|
|
515
|
+
start_idx=i,
|
|
516
|
+
end_idx=i + 1,
|
|
517
|
+
confidence=1.0,
|
|
518
|
+
grammar_rule="U4a",
|
|
519
|
+
description=f"Bifurcation trigger → handler ({sequence[i]} → {sequence[i+1]})",
|
|
520
|
+
)
|
|
521
|
+
)
|
|
522
|
+
|
|
523
|
+
# Stable transformation: IL → ZHIR sequence
|
|
524
|
+
for i in range(len(sequence) - 1):
|
|
525
|
+
if sequence[i] == COHERENCE and sequence[i + 1] == MUTATION:
|
|
526
|
+
patterns.append(
|
|
527
|
+
PatternMatch(
|
|
528
|
+
pattern_name="stable_transformation",
|
|
529
|
+
start_idx=i,
|
|
530
|
+
end_idx=i + 1,
|
|
531
|
+
confidence=0.9,
|
|
532
|
+
grammar_rule="U4b",
|
|
533
|
+
description="Coherence → Mutation (stable base for transformation)",
|
|
534
|
+
)
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
# Spontaneous organization: disorder → THOL
|
|
538
|
+
for i in range(len(sequence) - 1):
|
|
539
|
+
if (
|
|
540
|
+
sequence[i] in DESTABILIZERS
|
|
541
|
+
and sequence[i + 1] == SELF_ORGANIZATION
|
|
542
|
+
):
|
|
543
|
+
patterns.append(
|
|
544
|
+
PatternMatch(
|
|
545
|
+
pattern_name="spontaneous_organization",
|
|
546
|
+
start_idx=i,
|
|
547
|
+
end_idx=i + 1,
|
|
548
|
+
confidence=0.9,
|
|
549
|
+
grammar_rule="U4b",
|
|
550
|
+
description="Disorder → Self-organization",
|
|
551
|
+
)
|
|
552
|
+
)
|
|
553
|
+
|
|
554
|
+
return patterns
|
|
555
|
+
|
|
556
|
+
def detect_all_patterns(self, sequence: Sequence[str]) -> List[PatternMatch]:
|
|
557
|
+
"""Detect all patterns in sequence.
|
|
558
|
+
|
|
559
|
+
Parameters
|
|
560
|
+
----------
|
|
561
|
+
sequence : Sequence[str]
|
|
562
|
+
Operator sequence to analyze
|
|
563
|
+
|
|
564
|
+
Returns
|
|
565
|
+
-------
|
|
566
|
+
List[PatternMatch]
|
|
567
|
+
List of all detected patterns
|
|
568
|
+
"""
|
|
569
|
+
patterns = []
|
|
570
|
+
patterns.extend(self.detect_initiation_patterns(sequence))
|
|
571
|
+
patterns.extend(self.detect_closure_patterns(sequence))
|
|
572
|
+
patterns.extend(self.detect_convergence_patterns(sequence))
|
|
573
|
+
patterns.extend(self.detect_resonance_patterns(sequence))
|
|
574
|
+
patterns.extend(self.detect_bifurcation_patterns(sequence))
|
|
575
|
+
return patterns
|
|
576
|
+
|
|
577
|
+
def get_grammar_rule_for_pattern(self, pattern_name: str) -> Optional[str]:
|
|
578
|
+
"""Get the grammar rule associated with a pattern.
|
|
579
|
+
|
|
580
|
+
Parameters
|
|
581
|
+
----------
|
|
582
|
+
pattern_name : str
|
|
583
|
+
Name of the pattern
|
|
584
|
+
|
|
585
|
+
Returns
|
|
586
|
+
-------
|
|
587
|
+
Optional[str]
|
|
588
|
+
Grammar rule string (e.g., "U1a", "U2", "U1+U2+U4") or None
|
|
589
|
+
"""
|
|
590
|
+
return self._pattern_grammar_map.get(pattern_name.lower())
|
|
591
|
+
|
|
592
|
+
def analyze_sequence_composition(
|
|
593
|
+
self, sequence: Sequence[str]
|
|
594
|
+
) -> Mapping[str, Any]:
|
|
595
|
+
"""Perform comprehensive analysis of sequence structure.
|
|
596
|
+
|
|
597
|
+
Delegates to AdvancedPatternDetector for detailed analysis.
|
|
598
|
+
|
|
599
|
+
Parameters
|
|
600
|
+
----------
|
|
601
|
+
sequence : Sequence[str]
|
|
602
|
+
Operator sequence to analyze
|
|
603
|
+
|
|
604
|
+
Returns
|
|
605
|
+
-------
|
|
606
|
+
Mapping[str, Any]
|
|
607
|
+
Detailed analysis including patterns, scores, health metrics
|
|
608
|
+
"""
|
|
609
|
+
return self._advanced_detector.analyze_sequence_composition(sequence)
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
# Convenience functions for backward compatibility
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
def detect_pattern(sequence: Sequence[str]) -> StructuralPattern:
|
|
616
|
+
"""Detect structural pattern in operator sequence.
|
|
617
|
+
|
|
618
|
+
Convenience function that creates detector and returns pattern.
|
|
619
|
+
|
|
620
|
+
Parameters
|
|
621
|
+
----------
|
|
622
|
+
sequence : Sequence[str]
|
|
623
|
+
Canonical operator names
|
|
624
|
+
|
|
625
|
+
Returns
|
|
626
|
+
-------
|
|
627
|
+
StructuralPattern
|
|
628
|
+
Detected structural pattern
|
|
629
|
+
|
|
630
|
+
Examples
|
|
631
|
+
--------
|
|
632
|
+
>>> from tnfr.operators.pattern_detection import detect_pattern
|
|
633
|
+
>>> pattern = detect_pattern(["emission", "coupling", "coherence"]) # doctest: +SKIP
|
|
634
|
+
"""
|
|
635
|
+
detector = UnifiedPatternDetector()
|
|
636
|
+
return detector.detect_pattern(sequence)
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def analyze_sequence(sequence: Sequence[str]) -> Mapping[str, Any]:
|
|
640
|
+
"""Analyze operator sequence comprehensively.
|
|
641
|
+
|
|
642
|
+
Convenience function for sequence analysis.
|
|
643
|
+
|
|
644
|
+
Parameters
|
|
645
|
+
----------
|
|
646
|
+
sequence : Sequence[str]
|
|
647
|
+
Canonical operator names
|
|
648
|
+
|
|
649
|
+
Returns
|
|
650
|
+
-------
|
|
651
|
+
Mapping[str, Any]
|
|
652
|
+
Detailed analysis including patterns, scores, components
|
|
653
|
+
|
|
654
|
+
Examples
|
|
655
|
+
--------
|
|
656
|
+
>>> from tnfr.operators.pattern_detection import analyze_sequence
|
|
657
|
+
>>> analysis = analyze_sequence(["emission", "coupling", "coherence"]) # doctest: +SKIP
|
|
658
|
+
"""
|
|
659
|
+
detector = UnifiedPatternDetector()
|
|
660
|
+
return detector.analyze_sequence_composition(sequence)
|