|
37 | 37 |
|
38 | 38 | from __future__ import annotations |
39 | 39 |
|
40 | | -from typing import TYPE_CHECKING, List |
| 40 | +from enum import Enum |
| 41 | +from typing import TYPE_CHECKING, Any, List |
41 | 42 |
|
42 | 43 | if TYPE_CHECKING: |
43 | | - from ..types import NodeId |
| 44 | + from ..types import NodeId, TNFRGraph, Glyph |
44 | 45 | from .definitions import Operator |
| 46 | +else: |
| 47 | + from ..types import Glyph |
| 48 | + |
| 49 | + |
| 50 | +class StructuralPattern(Enum): |
| 51 | + """Classification of structural patterns in TNFR sequences. |
| 52 | + |
| 53 | + Used by canonical_patterns module for backward compatibility. |
| 54 | + Deprecated - use pattern_detection module for new code. |
| 55 | + """ |
| 56 | + BIFURCATED = "bifurcated" |
| 57 | + THERAPEUTIC = "therapeutic" |
| 58 | + EDUCATIONAL = "educational" |
| 59 | + COMPLEX = "complex" |
| 60 | + COMPRESS = "compress" |
| 61 | + EXPLORE = "explore" |
| 62 | + RESONATE = "resonate" |
| 63 | + |
| 64 | + |
| 65 | +# ============================================================================ |
| 66 | +# Glyph-Function Name Mappings |
| 67 | +# ============================================================================ |
| 68 | + |
| 69 | +# Mapping from Glyph to canonical function name |
| 70 | +GLYPH_TO_FUNCTION = { |
| 71 | + Glyph.AL: "emission", |
| 72 | + Glyph.EN: "reception", |
| 73 | + Glyph.IL: "coherence", |
| 74 | + Glyph.OZ: "dissonance", |
| 75 | + Glyph.UM: "coupling", |
| 76 | + Glyph.RA: "resonance", |
| 77 | + Glyph.SHA: "silence", |
| 78 | + Glyph.VAL: "expansion", |
| 79 | + Glyph.NUL: "contraction", |
| 80 | + Glyph.THOL: "self_organization", |
| 81 | + Glyph.ZHIR: "mutation", |
| 82 | + Glyph.NAV: "transition", |
| 83 | + Glyph.REMESH: "recursivity", |
| 84 | +} |
| 85 | + |
| 86 | +# Reverse mapping from function name to Glyph |
| 87 | +FUNCTION_TO_GLYPH = {v: k for k, v in GLYPH_TO_FUNCTION.items()} |
| 88 | + |
| 89 | + |
| 90 | +def glyph_function_name( |
| 91 | + val: Any, |
| 92 | + *, |
| 93 | + default: Any = None, |
| 94 | +) -> Any: |
| 95 | + """Convert glyph to canonical function name. |
| 96 | + |
| 97 | + Parameters |
| 98 | + ---------- |
| 99 | + val : Glyph | str | None |
| 100 | + Glyph or string to convert |
| 101 | + default : str | None, optional |
| 102 | + Default value if conversion fails |
| 103 | + |
| 104 | + Returns |
| 105 | + ------- |
| 106 | + str | None |
| 107 | + Canonical function name or default |
| 108 | + """ |
| 109 | + if val is None: |
| 110 | + return default |
| 111 | + if isinstance(val, str): |
| 112 | + return val |
| 113 | + return GLYPH_TO_FUNCTION.get(val, default) |
| 114 | + |
| 115 | + |
| 116 | +def function_name_to_glyph( |
| 117 | + val: Any, |
| 118 | + *, |
| 119 | + default: Any = None, |
| 120 | +) -> Any: |
| 121 | + """Convert function name to glyph. |
| 122 | + |
| 123 | + Parameters |
| 124 | + ---------- |
| 125 | + val : str | Glyph | None |
| 126 | + Function name or glyph to convert |
| 127 | + default : Glyph | None, optional |
| 128 | + Default value if conversion fails |
| 129 | + |
| 130 | + Returns |
| 131 | + ------- |
| 132 | + Glyph | None |
| 133 | + Glyph or default |
| 134 | + """ |
| 135 | + if val is None: |
| 136 | + return default |
| 137 | + if isinstance(val, Glyph): |
| 138 | + return val |
| 139 | + return FUNCTION_TO_GLYPH.get(val, default) |
| 140 | + |
45 | 141 |
|
46 | 142 | __all__ = [ |
47 | 143 | "GrammarValidator", |
48 | 144 | "validate_grammar", |
| 145 | + "StructuralPattern", |
| 146 | + # Glyph mappings |
| 147 | + "GLYPH_TO_FUNCTION", |
| 148 | + "FUNCTION_TO_GLYPH", |
| 149 | + "glyph_function_name", |
| 150 | + "function_name_to_glyph", |
| 151 | + # Grammar application functions |
| 152 | + "apply_glyph_with_grammar", |
| 153 | + "on_applied_glyph", |
| 154 | + "enforce_canonical_grammar", |
49 | 155 | # Operator sets |
50 | 156 | "GENERATORS", |
51 | 157 | "CLOSURES", |
@@ -536,3 +642,90 @@ def validate_grammar( |
536 | 642 | """ |
537 | 643 | is_valid, _ = GrammarValidator.validate(sequence, epi_initial) |
538 | 644 | return is_valid |
| 645 | + |
| 646 | + |
| 647 | +# ============================================================================ |
| 648 | +# Grammar Application Functions (Minimal Stubs for Import Compatibility) |
| 649 | +# ============================================================================ |
| 650 | + |
| 651 | + |
| 652 | +def apply_glyph_with_grammar( |
| 653 | + G: "TNFRGraph", |
| 654 | + nodes: Any, |
| 655 | + glyph: Any, |
| 656 | + window: Any = None, |
| 657 | +) -> None: |
| 658 | + """Apply glyph to nodes with grammar validation. |
| 659 | + |
| 660 | + Minimal stub implementation for import compatibility. |
| 661 | + This function delegates actual operator application to the dynamics module. |
| 662 | + |
| 663 | + Parameters |
| 664 | + ---------- |
| 665 | + G : TNFRGraph |
| 666 | + Graph containing nodes |
| 667 | + nodes : Any |
| 668 | + Nodes to apply glyph to |
| 669 | + glyph : Any |
| 670 | + Glyph to apply |
| 671 | + window : Any, optional |
| 672 | + Grammar window constraint |
| 673 | + |
| 674 | + Notes |
| 675 | + ----- |
| 676 | + This is a compatibility stub. The actual operator application logic |
| 677 | + is handled by individual Operator classes in definitions.py through |
| 678 | + their __call__ method. |
| 679 | + """ |
| 680 | + # Minimal stub - actual logic handled by Operator.__call__ |
| 681 | + pass |
| 682 | + |
| 683 | + |
| 684 | +def on_applied_glyph(G: "TNFRGraph", n: "NodeId", applied: Any) -> None: |
| 685 | + """Record glyph application in node history. |
| 686 | + |
| 687 | + Minimal stub for tracking operator sequences. |
| 688 | + |
| 689 | + Parameters |
| 690 | + ---------- |
| 691 | + G : TNFRGraph |
| 692 | + Graph containing node |
| 693 | + n : NodeId |
| 694 | + Node identifier |
| 695 | + applied : Any |
| 696 | + Applied glyph or operator name |
| 697 | + """ |
| 698 | + # Minimal stub for telemetry |
| 699 | + if "glyph_history" not in G.nodes[n]: |
| 700 | + G.nodes[n]["glyph_history"] = [] |
| 701 | + G.nodes[n]["glyph_history"].append(applied) |
| 702 | + |
| 703 | + |
| 704 | +def enforce_canonical_grammar( |
| 705 | + G: "TNFRGraph", |
| 706 | + n: "NodeId", |
| 707 | + cand: Any, |
| 708 | + ctx: Any = None, |
| 709 | +) -> Any: |
| 710 | + """Enforce canonical grammar constraints before operator application. |
| 711 | + |
| 712 | + Minimal stub implementation. |
| 713 | + |
| 714 | + Parameters |
| 715 | + ---------- |
| 716 | + G : TNFRGraph |
| 717 | + Graph containing node |
| 718 | + n : NodeId |
| 719 | + Node identifier |
| 720 | + cand : Any |
| 721 | + Candidate glyph/operator |
| 722 | + ctx : Any, optional |
| 723 | + Grammar context |
| 724 | + |
| 725 | + Returns |
| 726 | + ------- |
| 727 | + Any |
| 728 | + Validated glyph/operator |
| 729 | + """ |
| 730 | + # Minimal stub - return candidate as-is |
| 731 | + return cand |
0 commit comments