#!/usr/bin/env python3
"""
Test Grover search with ALL 4,524 capabilities
"""
import time
from pathlib import Path
import re
import math

PHI = 1.634214328637394

class GroverSearchFullScale:
    def __init__(self):
        self.capabilities_path = Path("/Eden/CAPABILITIES")
        self.capabilities = []
        
        print("Loading ALL capabilities...")
        
        # Load ALL .py files (not just eden_cap_*)
        py_files = list(self.capabilities_path.glob("*.py"))
        print(f"Found {len(py_files)} capability files")
        
        loaded = 0
        for cap_file in py_files:
            try:
                with open(cap_file, 'r', errors='ignore') as f:
                    content = f.read()[:500]
                    
                    name_match = re.search(r'class\s+(\w+)', content)
                    name = name_match.group(1) if name_match else cap_file.stem
                    
                    self.capabilities.append({
                        'name': name,
                        'content': content.lower(),
                        'filepath': str(cap_file)
                    })
                    loaded += 1
                    
                    if loaded % 1000 == 0:
                        print(f"  Loaded {loaded}...")
            except:
                pass
        
        self.iterations = int(math.sqrt(len(self.capabilities)))
        
        print(f"\n✅ Loaded {len(self.capabilities)} capabilities")
        print(f"   Grover iterations: {self.iterations}")
        print(f"   Classical: {len(self.capabilities)}")
        print(f"   Theoretical speedup: {len(self.capabilities)/self.iterations:.1f}x\n")
    
    def grover_search(self, query, top_k=5):
        query = query.lower()
        probs = {i: 1.0/len(self.capabilities) for i in range(len(self.capabilities))}
        
        for _ in range(self.iterations):
            relevant = {}
            for i, cap in enumerate(self.capabilities):
                if query in cap['name'].lower() or query in cap['content']:
                    relevant[i] = 1.0
            
            if not relevant:
                break
            
            avg = sum(probs.values()) / len(probs)
            for i in probs:
                if i in relevant:
                    probs[i] = avg + 1.5 * (probs[i] - avg)
                else:
                    probs[i] = avg - 0.1 * (probs[i] - avg)
            
            total = sum(probs.values())
            probs = {i: p/total for i, p in probs.items()}
        
        sorted_items = sorted(probs.items(), key=lambda x: x[1], reverse=True)
        return [self.capabilities[i] for i, _ in sorted_items[:top_k]]
    
    def linear_search(self, query, top_k=5):
        query = query.lower()
        matches = []
        for cap in self.capabilities:
            if query in cap['name'].lower() or query in cap['content']:
                matches.append(cap)
        return matches[:top_k]


print("=" * 70)
print("FULL-SCALE GROVER SEARCH TEST (4,524 capabilities)")
print("=" * 70)
print()

search = GroverSearchFullScale()

query = "optimization"
runs = 5

print(f"{'='*70}")
print(f"SPEED TEST: '{query}' ({runs} runs)")
print(f"{'='*70}\n")

# Grover
print("Grover-inspired search:")
grover_times = []
for i in range(runs):
    start = time.time()
    results = search.grover_search(query, top_k=5)
    elapsed = time.time() - start
    grover_times.append(elapsed)
    print(f"  Run {i+1}: {elapsed*1000:.1f}ms")

avg_grover = sum(grover_times) / len(grover_times)

# Linear
print("\nLinear search:")
linear_times = []
for i in range(runs):
    start = time.time()
    results = search.linear_search(query, top_k=5)
    elapsed = time.time() - start
    linear_times.append(elapsed)
    print(f"  Run {i+1}: {elapsed*1000:.1f}ms")

avg_linear = sum(linear_times) / len(linear_times)

# Results
print(f"\n{'='*70}")
print("RESULTS")
print(f"{'='*70}\n")

print(f"Dataset: {len(search.capabilities)} capabilities")
print(f"\nGrover: {avg_grover*1000:.1f}ms avg ({search.iterations} iterations)")
print(f"Linear: {avg_linear*1000:.1f}ms avg ({len(search.capabilities)} iterations)")

if avg_grover < avg_linear:
    speedup = avg_linear / avg_grover
    print(f"\n🎉 GROVER IS {speedup:.1f}x FASTER!")
    print(f"✅ Quantum-inspired speedup confirmed at scale!")
else:
    slowdown = avg_grover / avg_linear
    print(f"\n⚠️  Grover is {slowdown:.1f}x slower")
    print(f"   (Python overhead dominates quantum advantage)")

print(f"\nIteration reduction: {len(search.capabilities)/search.iterations:.1f}x")
