Harry00 commited on
Commit
aafc205
·
verified ·
1 Parent(s): 909b197

Upload run_benchmark.py

Browse files
Files changed (1) hide show
  1. run_benchmark.py +222 -0
run_benchmark.py ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Benchmark rapide et efficace du système MLE."""
2
+ import sys
3
+ sys.path.insert(0, '.')
4
+
5
+ import numpy as np
6
+ import json
7
+ import time
8
+
9
+ from mle.mle_system import MLESystem
10
+ from mle.memory import VECTOR_SIZE
11
+
12
+ np.random.seed(42)
13
+
14
+
15
+ def generate_related_vectors(n: int, base_sparsity: float = 0.05, relatedness: float = 0.7):
16
+ target_active = int(VECTOR_SIZE * base_sparsity)
17
+ n_shared = int(target_active * relatedness)
18
+ n_unique = max(1, target_active - n_shared)
19
+ shared_indices = np.random.choice(VECTOR_SIZE, size=n_shared, replace=False)
20
+ vectors = []
21
+ for i in range(n):
22
+ vec = np.zeros(VECTOR_SIZE, dtype=np.uint8)
23
+ vec[shared_indices] = 1
24
+ remaining = np.setdiff1d(np.arange(VECTOR_SIZE), shared_indices)
25
+ if len(remaining) >= n_unique:
26
+ unique_indices = np.random.choice(remaining, size=n_unique, replace=False)
27
+ vec[unique_indices] = 1
28
+ vectors.append(vec)
29
+ return vectors
30
+
31
+
32
+ def generate_unrelated_vectors(n: int, base_sparsity: float = 0.05):
33
+ target_active = int(VECTOR_SIZE * base_sparsity)
34
+ vectors = []
35
+ for i in range(n):
36
+ indices = np.random.choice(VECTOR_SIZE, size=target_active, replace=False)
37
+ vec = np.zeros(VECTOR_SIZE, dtype=np.uint8)
38
+ vec[indices] = 1
39
+ vectors.append(vec)
40
+ return vectors
41
+
42
+
43
+ def generate_query_from_base(base: np.ndarray, noise: float = 0.1):
44
+ vec = base.copy()
45
+ active = np.where(vec)[0]
46
+ n_flip = max(1, int(len(active) * noise))
47
+ if n_flip > 0 and len(active) > 0:
48
+ to_off = np.random.choice(active, size=min(n_flip, len(active)), replace=False)
49
+ vec[to_off] = 0
50
+ inactive = np.where(vec == 0)[0]
51
+ if len(inactive) > 0:
52
+ to_on = np.random.choice(inactive, size=min(n_flip, len(inactive)), replace=False)
53
+ vec[to_on] = 1
54
+ return vec
55
+
56
+
57
+ def benchmark_learning(mle: MLESystem, n_concepts: int = 5, n_batches: int = 3):
58
+ """Benchmark d'apprentissage et généralisation - version rapide."""
59
+ print("\n" + "="*70)
60
+ print("BENCHMARK: Learning Curve & Generalization")
61
+ print("="*70)
62
+
63
+ concepts = []
64
+ for i in range(n_concepts):
65
+ base = generate_related_vectors(1, relatedness=1.0)[0]
66
+ variants = generate_related_vectors(4, relatedness=0.7)
67
+ concepts.append((base, variants))
68
+
69
+ train_data = []
70
+ test_data = []
71
+ for base, variants in concepts:
72
+ for v in variants[:2]:
73
+ train_data.append(v)
74
+ for v in variants[2:]:
75
+ test_data.append(v)
76
+ for _ in range(2):
77
+ train_data.append(generate_query_from_base(base, noise=0.15))
78
+ for _ in range(2):
79
+ test_data.append(generate_query_from_base(base, noise=0.30))
80
+
81
+ np.random.shuffle(train_data)
82
+ np.random.shuffle(test_data)
83
+
84
+ results = []
85
+ batch_size = max(1, len(train_data) // n_batches)
86
+
87
+ for batch_idx in range(n_batches):
88
+ start = batch_idx * batch_size
89
+ end = min(start + batch_size, len(train_data))
90
+ batch = train_data[start:end]
91
+
92
+ print(f"\n--- Batch {batch_idx + 1}/{n_batches} ({len(batch)} vectors) ---")
93
+
94
+ energies = []
95
+ for i, vec in enumerate(batch):
96
+ result = mle.process(vec)
97
+ if result.energy_trajectory:
98
+ energies.append(result.energy_trajectory[-1])
99
+
100
+ avg_train = np.mean(energies) if energies else 0
101
+ print(f" Train energy: {avg_train:.0f} (n={len(energies)})")
102
+
103
+ # Test rapide
104
+ test_energies = []
105
+ for vec in test_data[:5]:
106
+ result = mle.process(vec)
107
+ if result.energy_trajectory:
108
+ test_energies.append(result.energy_trajectory[-1])
109
+
110
+ avg_test = np.mean(test_energies) if test_energies else 0
111
+ print(f" Test energy: {avg_test:.0f} (n={len(test_energies)})")
112
+ print(f" Memory size: {mle.memory.size}")
113
+
114
+ results.append({
115
+ 'batch': batch_idx + 1,
116
+ 'train_avg_energy': float(avg_train),
117
+ 'test_avg_energy': float(avg_test),
118
+ 'memory_size': mle.memory.size,
119
+ 'n_associations': len(mle.energy.associations),
120
+ })
121
+
122
+ return results
123
+
124
+
125
+ def benchmark_stability(mle: MLESystem, n_iterations: int = 50):
126
+ """Test de stabilité - rapide."""
127
+ print("\n" + "="*70)
128
+ print("BENCHMARK: Stability Test")
129
+ print("="*70)
130
+
131
+ base_vectors = generate_unrelated_vectors(5)
132
+ energies = []
133
+
134
+ for i in range(n_iterations):
135
+ base = base_vectors[i % len(base_vectors)]
136
+ vec = generate_query_from_base(base, noise=0.20)
137
+ result = mle.process(vec)
138
+ if result.energy_trajectory:
139
+ energies.append(result.energy_trajectory[-1])
140
+
141
+ if i % 10 == 0:
142
+ recent = np.mean(energies[-10:]) if len(energies) >= 10 else (np.mean(energies) if energies else 0)
143
+ print(f" [{i:3d}] energy={recent:.0f} memory={mle.memory.size}")
144
+
145
+ if len(energies) > 20:
146
+ early = np.mean(energies[:10])
147
+ late = np.mean(energies[-10:])
148
+ print(f"\n Early energy: {early:.0f}")
149
+ print(f" Late energy: {late:.0f}")
150
+
151
+ if late < early * 0.9:
152
+ print(" ✓ Energy DECREASED with experience")
153
+ elif late < early * 1.1:
154
+ print(" ✓ Energy STABLE")
155
+ else:
156
+ print(" ⚠ Energy INCREASED")
157
+
158
+ return {'early_energy': float(np.mean(energies[:10])) if len(energies) > 10 else 0,
159
+ 'late_energy': float(np.mean(energies[-10:])) if len(energies) > 10 else 0}
160
+
161
+
162
+ def benchmark_binding(mle: MLESystem, n_trials: int = 10):
163
+ """Test de binding/unbinding - rapide."""
164
+ print("\n" + "="*70)
165
+ print("BENCHMARK: Binding & Composition")
166
+ print("="*70)
167
+
168
+ roles = generate_unrelated_vectors(3)
169
+ fillers = generate_unrelated_vectors(3)
170
+
171
+ successes = 0
172
+ for trial in range(n_trials):
173
+ role_idx = trial % 3
174
+ filler_idx = (trial + 1) % 3
175
+
176
+ bound = mle.binder.bind_role_filler(roles[role_idx], fillers[filler_idx])
177
+ recovered = mle.binder.unbind_role_filler(bound, roles[role_idx])
178
+ similarity = np.mean(recovered == fillers[filler_idx])
179
+
180
+ if similarity > 0.6:
181
+ successes += 1
182
+
183
+ accuracy = successes / n_trials
184
+ print(f" Binding accuracy: {successes}/{n_trials} ({accuracy:.1%})")
185
+ return {'binding_accuracy': accuracy}
186
+
187
+
188
+ def main():
189
+ print("="*70)
190
+ print("MLE SYSTEM COMPREHENSIVE BENCHMARK")
191
+ print("="*70)
192
+
193
+ mle = MLESystem(
194
+ memory_capacity=2000,
195
+ online_learning=True,
196
+ temperature=0.5,
197
+ )
198
+
199
+ learning_results = benchmark_learning(mle)
200
+ stability_results = benchmark_stability(mle)
201
+ binding_results = benchmark_binding(mle)
202
+
203
+ print("\n" + "="*70)
204
+ print("FINAL SUMMARY")
205
+ print("="*70)
206
+ mle.print_summary()
207
+
208
+ all_results = {
209
+ 'learning_curve': learning_results,
210
+ 'stability': stability_results,
211
+ 'binding': binding_results,
212
+ }
213
+
214
+ with open("benchmark_results.json", "w") as f:
215
+ json.dump(all_results, f, indent=2, default=float)
216
+
217
+ print("\n✓ Benchmark complete!")
218
+ return all_results
219
+
220
+
221
+ if __name__ == "__main__":
222
+ results = main()