Research-Stack/2-Search-Space/manifold/self_typing_engine.py

331 lines
10 KiB
Python

#!/usr/bin/env python3
"""
Self-Typing Engine — Metatype Generation
First-Principles Derivation: Self-typing via integration (type emerges from interaction)
The self-typing loop:
Substrate (ENE) ↔ Surface (Notion) ↔ Intent (Linear) ⟹ Metatype
Performance Targets:
- Automatic type inference from interaction patterns
- Cached type predictions
- GPU-accelerated pattern matching
- Hierarchical type classification
"""
import numpy as np
from typing import List, Dict, Optional, Tuple
from dataclasses import dataclass
from enum import Enum
from datetime import datetime
from collections import defaultdict
class InteractionType(Enum):
"""Types of interactions between layers"""
SUBSTRATE_TO_SURFACE = "substrate_to_surface"
SURFACE_TO_SUBSTRATE = "surface_to_substrate"
SURFACE_TO_INTENT = "surface_to_intent"
INTENT_TO_SURFACE = "intent_to_surface"
SUBSTRATE_TO_INTENT = "substrate_to_intent"
INTENT_TO_SUBSTRATE = "intent_to_substrate"
@dataclass
class Interaction:
"""Interaction event between layers"""
interaction_id: str
interaction_type: InteractionType
source_layer: str
target_layer: str
timestamp: datetime
context: Dict[str, str] # Additional context (e.g., operation type, data size)
def __repr__(self) -> str:
return f"Interaction({self.interaction_type.value}, {self.source_layer}{self.target_layer})"
@dataclass
class Metatype:
"""Emergent type from integration of layers"""
metatype_id: str
type_signature: str # Type signature derived from interactions
confidence: float # Confidence in type inference
source_interactions: List[str] # Interaction IDs that contributed to this type
suggestions: List[str] # Type suggestions based on neighborhood
created_at: datetime = field(default_factory=datetime.now)
def __repr__(self) -> str:
return f"Metatype({self.type_signature}, confidence={self.confidence:.3f})"
class SelfTypingEngine:
"""
Self-Typing Engine — Metatype Generation
System derives type signature from interaction between layers
"""
def __init__(self):
self.interactions: List[Interaction] = []
self.interaction_counter = 0
self.metatypes: Dict[str, Metatype] = {}
self.metatype_counter = 0
self.interaction_patterns: Dict[str, int] = defaultdict(int)
self.type_cache: Dict[str, Metatype] = {}
def record_interaction(
self,
interaction_type: InteractionType,
source_layer: str,
target_layer: str,
context: Optional[Dict[str, str]] = None
) -> Interaction:
"""
Record interaction between layers
Args:
interaction_type: Type of interaction
source_layer: Source layer name
target_layer: Target layer name
context: Additional context
Returns:
Interaction record
"""
self.interaction_counter += 1
interaction_id = f"interaction_{self.interaction_counter}"
if context is None:
context = {}
interaction = Interaction(
interaction_id=interaction_id,
interaction_type=interaction_type,
source_layer=source_layer,
target_layer=target_layer,
timestamp=datetime.now(),
context=context
)
self.interactions.append(interaction)
# Update interaction patterns
pattern_key = f"{interaction_type.value}:{source_layer}:{target_layer}"
self.interaction_patterns[pattern_key] += 1
# Invalidate cache
self.type_cache.clear()
return interaction
def infer_metatype(self, context: Dict[str, str]) -> Metatype:
"""
Infer metatype from interaction patterns
Args:
context: Current context (layer names, operation types, etc.)
Returns:
Inferred metatype
"""
# Check cache first
cache_key = self._context_to_key(context)
if cache_key in self.type_cache:
return self.type_cache[cache_key]
# Extract interaction pattern
pattern = self._extract_pattern(context)
# Generate type signature
type_signature = self._generate_type_signature(pattern)
# Compute confidence based on pattern frequency
confidence = self._compute_confidence(pattern)
# Get type suggestions from neighborhood
suggestions = self._get_type_suggestions(pattern)
# Create metatype
self.metatype_counter += 1
metatype_id = f"metatype_{self.metatype_counter}"
metatype = Metatype(
metatype_id=metatype_id,
type_signature=type_signature,
confidence=confidence,
source_interactions=[i.interaction_id for i in self.interactions[-10:]], # Last 10 interactions
suggestions=suggestions
)
self.metatypes[metatype_id] = metatype
self.type_cache[cache_key] = metatype
return metatype
def _context_to_key(self, context: Dict[str, str]) -> str:
"""Convert context to cache key"""
items = sorted(context.items())
return "|".join(f"{k}:{v}" for k, v in items)
def _extract_pattern(self, context: Dict[str, str]) -> Dict[str, str]:
"""Extract interaction pattern from context"""
pattern = {}
# Extract relevant context fields
for key in ["operation", "data_type", "layer", "action"]:
if key in context:
pattern[key] = context[key]
return pattern
def _generate_type_signature(self, pattern: Dict[str, str]) -> str:
"""
Generate type signature from pattern
Args:
pattern: Interaction pattern
Returns:
Type signature string
"""
# Build signature from pattern components
components = []
if "operation" in pattern:
components.append(f"op:{pattern['operation']}")
if "data_type" in pattern:
components.append(f"dt:{pattern['data_type']}")
if "layer" in pattern:
components.append(f"lyr:{pattern['layer']}")
if "action" in pattern:
components.append(f"act:{pattern['action']}")
# If no components, use default
if not components:
components = ["generic"]
signature = ":".join(components)
return signature
def _compute_confidence(self, pattern: Dict[str, str]) -> float:
"""
Compute confidence based on pattern frequency
Args:
pattern: Interaction pattern
Returns:
Confidence score (0-1)
"""
# Build pattern key
pattern_key = self._pattern_to_key(pattern)
# Get pattern frequency
frequency = self.interaction_patterns.get(pattern_key, 0)
# Normalize to confidence (max frequency = 100)
confidence = min(frequency / 100.0, 1.0)
return confidence
def _pattern_to_key(self, pattern: Dict[str, str]) -> str:
"""Convert pattern to key for frequency lookup"""
items = sorted(pattern.items())
return "|".join(f"{k}:{v}" for k, v in items)
def _get_type_suggestions(self, pattern: Dict[str, str]) -> List[str]:
"""
Get type suggestions based on manifold neighborhood
Args:
pattern: Interaction pattern
Returns:
List of type suggestions
"""
suggestions = []
# Find similar patterns in interaction history
pattern_key = self._pattern_to_key(pattern)
# Look for patterns with similar keys
for key in self.interaction_patterns:
similarity = self._pattern_similarity(pattern_key, key)
if similarity > 0.5: # Similarity threshold
suggestions.append(key)
return suggestions[:5] # Top 5 suggestions
def _pattern_similarity(self, key1: str, key2: str) -> float:
"""
Compute similarity between pattern keys
Args:
key1: First pattern key
key2: Second pattern key
Returns:
Similarity score (0-1)
"""
# Split keys into components
components1 = set(key1.split("|"))
components2 = set(key2.split("|"))
# Jaccard similarity
intersection = components1 & components2
union = components1 | components2
if not union:
return 0.0
return len(intersection) / len(union)
def get_interaction_history(self, limit: int = 100) -> List[Interaction]:
"""Get recent interaction history"""
return self.interactions[-limit:]
def get_type_statistics(self) -> Dict:
"""Get statistics about type inference"""
return {
"total_interactions": len(self.interactions),
"unique_patterns": len(self.interaction_patterns),
"total_metatypes": len(self.metatypes),
"cache_size": len(self.type_cache)
}
def main():
"""Test self-typing engine with sample interactions"""
engine = SelfTypingEngine()
# Record some interactions
interaction1 = engine.record_interaction(
InteractionType.SUBSTRATE_TO_SURFACE,
"ENE",
"Notion",
{"operation": "read", "data_type": "concept_vector"}
)
print(f"Recorded interaction: {interaction1}")
interaction2 = engine.record_interaction(
InteractionType.SURFACE_TO_INTENT,
"Notion",
"Linear",
{"operation": "update", "data_type": "task"}
)
print(f"Recorded interaction: {interaction2}")
# Infer metatype from context
context = {"operation": "read", "data_type": "concept_vector", "layer": "ENE"}
metatype = engine.infer_metatype(context)
print(f"Inferred metatype: {metatype}")
# Get statistics
stats = engine.get_type_statistics()
print(f"Type statistics: {stats}")
if __name__ == "__main__":
main()