from __future__ import annotations # Grammatica JSON Schema (Phase 1, post S-expression refactor). # # Distinzione strutturale: # * Nodi OPERATORE -> dict con chiave ``"op"`` (logici, comparatori, crossover) # * Nodi LEAF -> dict con chiave ``"kind"`` (indicator, feature, literal) # ``op`` e ``kind`` sono mutuamente esclusivi sullo stesso nodo. LOGICAL_OPS: frozenset[str] = frozenset({"and", "or", "not"}) COMPARATOR_OPS: frozenset[str] = frozenset({"gt", "lt", "eq"}) CROSSOVER_OPS: frozenset[str] = frozenset({"crossover", "crossunder"}) ACTION_VALUES: frozenset[str] = frozenset( {"entry-long", "entry-short", "exit", "flat"} ) KIND_VALUES: frozenset[str] = frozenset({"indicator", "feature", "literal"}) KNOWN_INDICATORS: frozenset[str] = frozenset( {"sma", "rsi", "atr", "macd", "realized_vol"} ) KNOWN_FEATURES: frozenset[str] = frozenset( {"open", "high", "low", "close", "volume"} ) # Convenience union (utile a validator / parser). ALL_OPS: frozenset[str] = LOGICAL_OPS | COMPARATOR_OPS | CROSSOVER_OPS