File size: 3,148 Bytes
29b620f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""Test rapide et léger du système MLE."""
import sys
sys.path.insert(0, '.')

import numpy as np
import time
from mle.mle_system import MLESystem
from mle.memory import VECTOR_SIZE

np.random.seed(42)

print("="*60)
print("MLE QUICK TEST")
print("="*60)

mle = MLESystem(memory_capacity=500, online_learning=True, temperature=0.5)

# Phase 1: Crée des vecteurs reliés (concepts)
print("\n--- Creating related concepts ---")
n_concepts = 3
n_variants = 3

concepts = []
for c in range(n_concepts):
    base_active = np.random.choice(VECTOR_SIZE, size=200, replace=False)
    base = np.zeros(VECTOR_SIZE, dtype=np.uint8)
    base[base_active] = 1
    
    variants = []
    for v in range(n_variants):
        variant = base.copy()
        # Ajoute du bruit
        to_flip = np.random.choice(VECTOR_SIZE, size=30, replace=False)
        variant[to_flip] = 1 - variant[to_flip]
        variants.append(variant)
    
    concepts.append((base, variants))
    
    # Traite les variants
    for variant in variants:
        t0 = time.time()
        result = mle.process(variant)
        t1 = time.time()
        
        if result.energy_trajectory:
            print(f"  Concept {c}, variant: energy={result.energy_trajectory[-1]:.0f}, "
                  f"conv={result.converged}, time={(t1-t0)*1000:.0f}ms")

print(f"\nMemory after concepts: {mle.memory.size}")

# Phase 2: Test généralisation avec requêtes bruitées
print("\n--- Testing generalization (noisy queries) ---")
for c, (base, _) in enumerate(concepts):
    query = base.copy()
    # Plus de bruit
    to_flip = np.random.choice(VECTOR_SIZE, size=80, replace=False)
    query[to_flip] = 1 - query[to_flip]
    
    result = mle.process(query)
    if result.energy_trajectory:
        print(f"  Query concept {c}: energy={result.energy_trajectory[-1]:.0f}, "
              f"conv={result.converged}")

# Phase 3: Test stabilité
print("\n--- Testing stability (continuous stream) ---")
energies = []
for i in range(20):
    c = i % n_concepts
    _, variants = concepts[c]
    vec = variants[i % len(variants)]
    
    result = mle.process(vec)
    if result.energy_trajectory:
        energies.append(result.energy_trajectory[-1])
    
    if i % 5 == 0:
        print(f"  [{i:2d}] memory={mle.memory.size}, n_assoc={len(mle.energy.associations)}")

if len(energies) >= 10:
    early = np.mean(energies[:5])
    late = np.mean(energies[-5:])
    print(f"\n  Early energy: {early:.0f}")
    print(f"  Late energy:  {late:.0f}")
    if late < early * 0.95:
        print("  ✓ System is LEARNING")
    else:
        print("  ~ System is STABLE")

# Phase 4: Test binding
print("\n--- Testing binding ---")
a = np.zeros(VECTOR_SIZE, dtype=np.uint8)
a[np.random.choice(VECTOR_SIZE, size=200, replace=False)] = 1
b = np.zeros(VECTOR_SIZE, dtype=np.uint8)
b[np.random.choice(VECTOR_SIZE, size=200, replace=False)] = 1

bound = mle.binder.bind(a, b)
recovered = mle.binder.unbind(bound, a)
sim = np.mean(recovered == b)
print(f"  Binding similarity: {sim:.3f}")

# Résumé
print("\n" + "="*60)
print("SUMMARY")
print("="*60)
mle.print_summary()

print("\n✓ Quick test complete!")