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.

Files changed (360) hide show
  1. tnfr/__init__.py +375 -56
  2. tnfr/__init__.pyi +33 -0
  3. tnfr/_compat.py +10 -0
  4. tnfr/_generated_version.py +34 -0
  5. tnfr/_version.py +49 -0
  6. tnfr/_version.pyi +7 -0
  7. tnfr/alias.py +723 -0
  8. tnfr/alias.pyi +108 -0
  9. tnfr/backends/__init__.py +354 -0
  10. tnfr/backends/jax_backend.py +173 -0
  11. tnfr/backends/numpy_backend.py +238 -0
  12. tnfr/backends/optimized_numpy.py +420 -0
  13. tnfr/backends/torch_backend.py +408 -0
  14. tnfr/cache.py +171 -0
  15. tnfr/cache.pyi +13 -0
  16. tnfr/cli/__init__.py +110 -0
  17. tnfr/cli/__init__.pyi +26 -0
  18. tnfr/cli/arguments.py +489 -0
  19. tnfr/cli/arguments.pyi +29 -0
  20. tnfr/cli/execution.py +914 -0
  21. tnfr/cli/execution.pyi +70 -0
  22. tnfr/cli/interactive_validator.py +614 -0
  23. tnfr/cli/utils.py +51 -0
  24. tnfr/cli/utils.pyi +7 -0
  25. tnfr/cli/validate.py +236 -0
  26. tnfr/compat/__init__.py +85 -0
  27. tnfr/compat/dataclass.py +136 -0
  28. tnfr/compat/jsonschema_stub.py +61 -0
  29. tnfr/compat/matplotlib_stub.py +73 -0
  30. tnfr/compat/numpy_stub.py +155 -0
  31. tnfr/config/__init__.py +224 -0
  32. tnfr/config/__init__.pyi +10 -0
  33. tnfr/config/constants.py +104 -0
  34. tnfr/config/constants.pyi +12 -0
  35. tnfr/config/defaults.py +54 -0
  36. tnfr/config/defaults_core.py +212 -0
  37. tnfr/config/defaults_init.py +33 -0
  38. tnfr/config/defaults_metric.py +104 -0
  39. tnfr/config/feature_flags.py +81 -0
  40. tnfr/config/feature_flags.pyi +16 -0
  41. tnfr/config/glyph_constants.py +31 -0
  42. tnfr/config/init.py +77 -0
  43. tnfr/config/init.pyi +8 -0
  44. tnfr/config/operator_names.py +254 -0
  45. tnfr/config/operator_names.pyi +36 -0
  46. tnfr/config/physics_derivation.py +354 -0
  47. tnfr/config/presets.py +83 -0
  48. tnfr/config/presets.pyi +7 -0
  49. tnfr/config/security.py +927 -0
  50. tnfr/config/thresholds.py +114 -0
  51. tnfr/config/tnfr_config.py +498 -0
  52. tnfr/constants/__init__.py +92 -0
  53. tnfr/constants/__init__.pyi +92 -0
  54. tnfr/constants/aliases.py +33 -0
  55. tnfr/constants/aliases.pyi +27 -0
  56. tnfr/constants/init.py +33 -0
  57. tnfr/constants/init.pyi +12 -0
  58. tnfr/constants/metric.py +104 -0
  59. tnfr/constants/metric.pyi +19 -0
  60. tnfr/core/__init__.py +33 -0
  61. tnfr/core/container.py +226 -0
  62. tnfr/core/default_implementations.py +329 -0
  63. tnfr/core/interfaces.py +279 -0
  64. tnfr/dynamics/__init__.py +238 -0
  65. tnfr/dynamics/__init__.pyi +83 -0
  66. tnfr/dynamics/adaptation.py +267 -0
  67. tnfr/dynamics/adaptation.pyi +7 -0
  68. tnfr/dynamics/adaptive_sequences.py +189 -0
  69. tnfr/dynamics/adaptive_sequences.pyi +14 -0
  70. tnfr/dynamics/aliases.py +23 -0
  71. tnfr/dynamics/aliases.pyi +19 -0
  72. tnfr/dynamics/bifurcation.py +232 -0
  73. tnfr/dynamics/canonical.py +229 -0
  74. tnfr/dynamics/canonical.pyi +48 -0
  75. tnfr/dynamics/coordination.py +385 -0
  76. tnfr/dynamics/coordination.pyi +25 -0
  77. tnfr/dynamics/dnfr.py +3034 -0
  78. tnfr/dynamics/dnfr.pyi +26 -0
  79. tnfr/dynamics/dynamic_limits.py +225 -0
  80. tnfr/dynamics/feedback.py +252 -0
  81. tnfr/dynamics/feedback.pyi +24 -0
  82. tnfr/dynamics/fused_dnfr.py +454 -0
  83. tnfr/dynamics/homeostasis.py +157 -0
  84. tnfr/dynamics/homeostasis.pyi +14 -0
  85. tnfr/dynamics/integrators.py +661 -0
  86. tnfr/dynamics/integrators.pyi +36 -0
  87. tnfr/dynamics/learning.py +310 -0
  88. tnfr/dynamics/learning.pyi +33 -0
  89. tnfr/dynamics/metabolism.py +254 -0
  90. tnfr/dynamics/nbody.py +796 -0
  91. tnfr/dynamics/nbody_tnfr.py +783 -0
  92. tnfr/dynamics/propagation.py +326 -0
  93. tnfr/dynamics/runtime.py +908 -0
  94. tnfr/dynamics/runtime.pyi +77 -0
  95. tnfr/dynamics/sampling.py +36 -0
  96. tnfr/dynamics/sampling.pyi +7 -0
  97. tnfr/dynamics/selectors.py +711 -0
  98. tnfr/dynamics/selectors.pyi +85 -0
  99. tnfr/dynamics/structural_clip.py +207 -0
  100. tnfr/errors/__init__.py +37 -0
  101. tnfr/errors/contextual.py +492 -0
  102. tnfr/execution.py +223 -0
  103. tnfr/execution.pyi +45 -0
  104. tnfr/extensions/__init__.py +205 -0
  105. tnfr/extensions/__init__.pyi +18 -0
  106. tnfr/extensions/base.py +173 -0
  107. tnfr/extensions/base.pyi +35 -0
  108. tnfr/extensions/business/__init__.py +71 -0
  109. tnfr/extensions/business/__init__.pyi +11 -0
  110. tnfr/extensions/business/cookbook.py +88 -0
  111. tnfr/extensions/business/cookbook.pyi +8 -0
  112. tnfr/extensions/business/health_analyzers.py +202 -0
  113. tnfr/extensions/business/health_analyzers.pyi +9 -0
  114. tnfr/extensions/business/patterns.py +183 -0
  115. tnfr/extensions/business/patterns.pyi +8 -0
  116. tnfr/extensions/medical/__init__.py +73 -0
  117. tnfr/extensions/medical/__init__.pyi +11 -0
  118. tnfr/extensions/medical/cookbook.py +88 -0
  119. tnfr/extensions/medical/cookbook.pyi +8 -0
  120. tnfr/extensions/medical/health_analyzers.py +181 -0
  121. tnfr/extensions/medical/health_analyzers.pyi +9 -0
  122. tnfr/extensions/medical/patterns.py +163 -0
  123. tnfr/extensions/medical/patterns.pyi +8 -0
  124. tnfr/flatten.py +262 -0
  125. tnfr/flatten.pyi +21 -0
  126. tnfr/gamma.py +354 -0
  127. tnfr/gamma.pyi +36 -0
  128. tnfr/glyph_history.py +377 -0
  129. tnfr/glyph_history.pyi +35 -0
  130. tnfr/glyph_runtime.py +19 -0
  131. tnfr/glyph_runtime.pyi +8 -0
  132. tnfr/immutable.py +218 -0
  133. tnfr/immutable.pyi +36 -0
  134. tnfr/initialization.py +203 -0
  135. tnfr/initialization.pyi +65 -0
  136. tnfr/io.py +10 -0
  137. tnfr/io.pyi +13 -0
  138. tnfr/locking.py +37 -0
  139. tnfr/locking.pyi +7 -0
  140. tnfr/mathematics/__init__.py +79 -0
  141. tnfr/mathematics/backend.py +453 -0
  142. tnfr/mathematics/backend.pyi +99 -0
  143. tnfr/mathematics/dynamics.py +408 -0
  144. tnfr/mathematics/dynamics.pyi +90 -0
  145. tnfr/mathematics/epi.py +391 -0
  146. tnfr/mathematics/epi.pyi +65 -0
  147. tnfr/mathematics/generators.py +242 -0
  148. tnfr/mathematics/generators.pyi +29 -0
  149. tnfr/mathematics/metrics.py +119 -0
  150. tnfr/mathematics/metrics.pyi +16 -0
  151. tnfr/mathematics/operators.py +239 -0
  152. tnfr/mathematics/operators.pyi +59 -0
  153. tnfr/mathematics/operators_factory.py +124 -0
  154. tnfr/mathematics/operators_factory.pyi +11 -0
  155. tnfr/mathematics/projection.py +87 -0
  156. tnfr/mathematics/projection.pyi +33 -0
  157. tnfr/mathematics/runtime.py +182 -0
  158. tnfr/mathematics/runtime.pyi +64 -0
  159. tnfr/mathematics/spaces.py +256 -0
  160. tnfr/mathematics/spaces.pyi +83 -0
  161. tnfr/mathematics/transforms.py +305 -0
  162. tnfr/mathematics/transforms.pyi +62 -0
  163. tnfr/metrics/__init__.py +79 -0
  164. tnfr/metrics/__init__.pyi +20 -0
  165. tnfr/metrics/buffer_cache.py +163 -0
  166. tnfr/metrics/buffer_cache.pyi +24 -0
  167. tnfr/metrics/cache_utils.py +214 -0
  168. tnfr/metrics/coherence.py +2009 -0
  169. tnfr/metrics/coherence.pyi +129 -0
  170. tnfr/metrics/common.py +158 -0
  171. tnfr/metrics/common.pyi +35 -0
  172. tnfr/metrics/core.py +316 -0
  173. tnfr/metrics/core.pyi +13 -0
  174. tnfr/metrics/diagnosis.py +833 -0
  175. tnfr/metrics/diagnosis.pyi +86 -0
  176. tnfr/metrics/emergence.py +245 -0
  177. tnfr/metrics/export.py +179 -0
  178. tnfr/metrics/export.pyi +7 -0
  179. tnfr/metrics/glyph_timing.py +379 -0
  180. tnfr/metrics/glyph_timing.pyi +81 -0
  181. tnfr/metrics/learning_metrics.py +280 -0
  182. tnfr/metrics/learning_metrics.pyi +21 -0
  183. tnfr/metrics/phase_coherence.py +351 -0
  184. tnfr/metrics/phase_compatibility.py +349 -0
  185. tnfr/metrics/reporting.py +183 -0
  186. tnfr/metrics/reporting.pyi +25 -0
  187. tnfr/metrics/sense_index.py +1203 -0
  188. tnfr/metrics/sense_index.pyi +9 -0
  189. tnfr/metrics/trig.py +373 -0
  190. tnfr/metrics/trig.pyi +13 -0
  191. tnfr/metrics/trig_cache.py +233 -0
  192. tnfr/metrics/trig_cache.pyi +10 -0
  193. tnfr/multiscale/__init__.py +32 -0
  194. tnfr/multiscale/hierarchical.py +517 -0
  195. tnfr/node.py +763 -0
  196. tnfr/node.pyi +139 -0
  197. tnfr/observers.py +255 -130
  198. tnfr/observers.pyi +31 -0
  199. tnfr/ontosim.py +144 -137
  200. tnfr/ontosim.pyi +28 -0
  201. tnfr/operators/__init__.py +1672 -0
  202. tnfr/operators/__init__.pyi +31 -0
  203. tnfr/operators/algebra.py +277 -0
  204. tnfr/operators/canonical_patterns.py +420 -0
  205. tnfr/operators/cascade.py +267 -0
  206. tnfr/operators/cycle_detection.py +358 -0
  207. tnfr/operators/definitions.py +4108 -0
  208. tnfr/operators/definitions.pyi +78 -0
  209. tnfr/operators/grammar.py +1164 -0
  210. tnfr/operators/grammar.pyi +140 -0
  211. tnfr/operators/hamiltonian.py +710 -0
  212. tnfr/operators/health_analyzer.py +809 -0
  213. tnfr/operators/jitter.py +272 -0
  214. tnfr/operators/jitter.pyi +11 -0
  215. tnfr/operators/lifecycle.py +314 -0
  216. tnfr/operators/metabolism.py +618 -0
  217. tnfr/operators/metrics.py +2138 -0
  218. tnfr/operators/network_analysis/__init__.py +27 -0
  219. tnfr/operators/network_analysis/source_detection.py +186 -0
  220. tnfr/operators/nodal_equation.py +395 -0
  221. tnfr/operators/pattern_detection.py +660 -0
  222. tnfr/operators/patterns.py +669 -0
  223. tnfr/operators/postconditions/__init__.py +38 -0
  224. tnfr/operators/postconditions/mutation.py +236 -0
  225. tnfr/operators/preconditions/__init__.py +1226 -0
  226. tnfr/operators/preconditions/coherence.py +305 -0
  227. tnfr/operators/preconditions/dissonance.py +236 -0
  228. tnfr/operators/preconditions/emission.py +128 -0
  229. tnfr/operators/preconditions/mutation.py +580 -0
  230. tnfr/operators/preconditions/reception.py +125 -0
  231. tnfr/operators/preconditions/resonance.py +364 -0
  232. tnfr/operators/registry.py +74 -0
  233. tnfr/operators/registry.pyi +9 -0
  234. tnfr/operators/remesh.py +1809 -0
  235. tnfr/operators/remesh.pyi +26 -0
  236. tnfr/operators/structural_units.py +268 -0
  237. tnfr/operators/unified_grammar.py +105 -0
  238. tnfr/parallel/__init__.py +54 -0
  239. tnfr/parallel/auto_scaler.py +234 -0
  240. tnfr/parallel/distributed.py +384 -0
  241. tnfr/parallel/engine.py +238 -0
  242. tnfr/parallel/gpu_engine.py +420 -0
  243. tnfr/parallel/monitoring.py +248 -0
  244. tnfr/parallel/partitioner.py +459 -0
  245. tnfr/py.typed +0 -0
  246. tnfr/recipes/__init__.py +22 -0
  247. tnfr/recipes/cookbook.py +743 -0
  248. tnfr/rng.py +178 -0
  249. tnfr/rng.pyi +26 -0
  250. tnfr/schemas/__init__.py +8 -0
  251. tnfr/schemas/grammar.json +94 -0
  252. tnfr/sdk/__init__.py +107 -0
  253. tnfr/sdk/__init__.pyi +19 -0
  254. tnfr/sdk/adaptive_system.py +173 -0
  255. tnfr/sdk/adaptive_system.pyi +21 -0
  256. tnfr/sdk/builders.py +370 -0
  257. tnfr/sdk/builders.pyi +51 -0
  258. tnfr/sdk/fluent.py +1121 -0
  259. tnfr/sdk/fluent.pyi +74 -0
  260. tnfr/sdk/templates.py +342 -0
  261. tnfr/sdk/templates.pyi +41 -0
  262. tnfr/sdk/utils.py +341 -0
  263. tnfr/secure_config.py +46 -0
  264. tnfr/security/__init__.py +70 -0
  265. tnfr/security/database.py +514 -0
  266. tnfr/security/subprocess.py +503 -0
  267. tnfr/security/validation.py +290 -0
  268. tnfr/selector.py +247 -0
  269. tnfr/selector.pyi +19 -0
  270. tnfr/sense.py +378 -0
  271. tnfr/sense.pyi +23 -0
  272. tnfr/services/__init__.py +17 -0
  273. tnfr/services/orchestrator.py +325 -0
  274. tnfr/sparse/__init__.py +39 -0
  275. tnfr/sparse/representations.py +492 -0
  276. tnfr/structural.py +705 -0
  277. tnfr/structural.pyi +83 -0
  278. tnfr/telemetry/__init__.py +35 -0
  279. tnfr/telemetry/cache_metrics.py +226 -0
  280. tnfr/telemetry/cache_metrics.pyi +64 -0
  281. tnfr/telemetry/nu_f.py +422 -0
  282. tnfr/telemetry/nu_f.pyi +108 -0
  283. tnfr/telemetry/verbosity.py +36 -0
  284. tnfr/telemetry/verbosity.pyi +15 -0
  285. tnfr/tokens.py +58 -0
  286. tnfr/tokens.pyi +36 -0
  287. tnfr/tools/__init__.py +20 -0
  288. tnfr/tools/domain_templates.py +478 -0
  289. tnfr/tools/sequence_generator.py +846 -0
  290. tnfr/topology/__init__.py +13 -0
  291. tnfr/topology/asymmetry.py +151 -0
  292. tnfr/trace.py +543 -0
  293. tnfr/trace.pyi +42 -0
  294. tnfr/tutorials/__init__.py +38 -0
  295. tnfr/tutorials/autonomous_evolution.py +285 -0
  296. tnfr/tutorials/interactive.py +1576 -0
  297. tnfr/tutorials/structural_metabolism.py +238 -0
  298. tnfr/types.py +775 -0
  299. tnfr/types.pyi +357 -0
  300. tnfr/units.py +68 -0
  301. tnfr/units.pyi +13 -0
  302. tnfr/utils/__init__.py +282 -0
  303. tnfr/utils/__init__.pyi +215 -0
  304. tnfr/utils/cache.py +4223 -0
  305. tnfr/utils/cache.pyi +470 -0
  306. tnfr/utils/callbacks.py +375 -0
  307. tnfr/utils/callbacks.pyi +49 -0
  308. tnfr/utils/chunks.py +108 -0
  309. tnfr/utils/chunks.pyi +22 -0
  310. tnfr/utils/data.py +428 -0
  311. tnfr/utils/data.pyi +74 -0
  312. tnfr/utils/graph.py +85 -0
  313. tnfr/utils/graph.pyi +10 -0
  314. tnfr/utils/init.py +821 -0
  315. tnfr/utils/init.pyi +80 -0
  316. tnfr/utils/io.py +559 -0
  317. tnfr/utils/io.pyi +66 -0
  318. tnfr/utils/numeric.py +114 -0
  319. tnfr/utils/numeric.pyi +21 -0
  320. tnfr/validation/__init__.py +257 -0
  321. tnfr/validation/__init__.pyi +85 -0
  322. tnfr/validation/compatibility.py +460 -0
  323. tnfr/validation/compatibility.pyi +6 -0
  324. tnfr/validation/config.py +73 -0
  325. tnfr/validation/graph.py +139 -0
  326. tnfr/validation/graph.pyi +18 -0
  327. tnfr/validation/input_validation.py +755 -0
  328. tnfr/validation/invariants.py +712 -0
  329. tnfr/validation/rules.py +253 -0
  330. tnfr/validation/rules.pyi +44 -0
  331. tnfr/validation/runtime.py +279 -0
  332. tnfr/validation/runtime.pyi +28 -0
  333. tnfr/validation/sequence_validator.py +162 -0
  334. tnfr/validation/soft_filters.py +170 -0
  335. tnfr/validation/soft_filters.pyi +32 -0
  336. tnfr/validation/spectral.py +164 -0
  337. tnfr/validation/spectral.pyi +42 -0
  338. tnfr/validation/validator.py +1266 -0
  339. tnfr/validation/window.py +39 -0
  340. tnfr/validation/window.pyi +1 -0
  341. tnfr/visualization/__init__.py +98 -0
  342. tnfr/visualization/cascade_viz.py +256 -0
  343. tnfr/visualization/hierarchy.py +284 -0
  344. tnfr/visualization/sequence_plotter.py +784 -0
  345. tnfr/viz/__init__.py +60 -0
  346. tnfr/viz/matplotlib.py +278 -0
  347. tnfr/viz/matplotlib.pyi +35 -0
  348. tnfr-8.5.0.dist-info/METADATA +573 -0
  349. tnfr-8.5.0.dist-info/RECORD +353 -0
  350. tnfr-8.5.0.dist-info/entry_points.txt +3 -0
  351. tnfr-3.0.3.dist-info/licenses/LICENSE.txt → tnfr-8.5.0.dist-info/licenses/LICENSE.md +1 -1
  352. tnfr/constants.py +0 -183
  353. tnfr/dynamics.py +0 -543
  354. tnfr/helpers.py +0 -198
  355. tnfr/main.py +0 -37
  356. tnfr/operators.py +0 -296
  357. tnfr-3.0.3.dist-info/METADATA +0 -35
  358. tnfr-3.0.3.dist-info/RECORD +0 -13
  359. {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
  360. {tnfr-3.0.3.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)