MnemoCore / tests /benchmark_performance.py
Granis87's picture
Initial upload of MnemoCore
dbb04e4 verified
import asyncio
import time
import tracemalloc
import numpy as np
from mnemocore.core.engine import HAIMEngine
from mnemocore.core.synapse import SynapticConnection
from mnemocore.core.binary_hdv import BinaryHDV
from mnemocore.core.node import MemoryNode
async def benchmark_synapse_lookup():
print("\n--- Benchmarking Synapse Lookup ---")
engine = HAIMEngine(dimension=4096) # Smaller dim for speed
# Create artificial synapses
print("Generating 10,000 synapses...")
node_id = "test_node_center"
# 100 connections for the center node
for i in range(100):
neighbor = f"neighbor_{i}"
key = tuple(sorted([node_id, neighbor]))
syn = SynapticConnection(node_id, neighbor, initial_strength=0.5)
engine.synapses[key] = syn
# Populate adjacency manually for benchmark
if node_id not in engine.synapse_adjacency: engine.synapse_adjacency[node_id] = []
if neighbor not in engine.synapse_adjacency: engine.synapse_adjacency[neighbor] = []
engine.synapse_adjacency[node_id].append(syn)
engine.synapse_adjacency[neighbor].append(syn)
# 9,900 irrelevant connections
for i in range(9900):
id_a = f"noise_a_{i}"
id_b = f"noise_b_{i}"
key = tuple(sorted([id_a, id_b]))
syn = SynapticConnection(id_a, id_b, initial_strength=0.1)
engine.synapses[key] = syn
if id_a not in engine.synapse_adjacency: engine.synapse_adjacency[id_a] = []
if id_b not in engine.synapse_adjacency: engine.synapse_adjacency[id_b] = []
engine.synapse_adjacency[id_a].append(syn)
engine.synapse_adjacency[id_b].append(syn)
print(f"Total synapses: {len(engine.synapses)}")
start_time = time.time()
iterations = 1000
for _ in range(iterations):
await engine.get_node_boost(node_id)
total_time = time.time() - start_time
print(f"Time for {iterations} lookups: {total_time:.4f}s")
print(f"Avg time per lookup: {total_time/iterations*1000:.4f}ms")
with open("benchmark_results.txt", "a") as f:
f.write(f"Synapse Lookup Time: {total_time:.4f}s\n")
f.write(f"Avg time per lookup: {total_time/iterations*1000:.4f}ms\n")
return total_time
async def benchmark_vector_allocations():
print("\n--- Benchmarking Vector Allocations ---")
engine = HAIMEngine(dimension=16384)
# Populate HOT tier slightly
print("Populating HOT tier with 50 nodes...")
vectors = []
for i in range(50):
vec = BinaryHDV.random(engine.dimension)
node = MemoryNode(id=f"node_{i}", hdv=vec, content=f"content_{i}")
await engine.tier_manager.add_memory(node)
tracemalloc.start()
start_snapshot = tracemalloc.take_snapshot()
start_time = time.time()
iterations = 100
for _ in range(iterations):
await engine._current_context_vector(sample_n=50)
total_time = time.time() - start_time
end_snapshot = tracemalloc.take_snapshot()
tracemalloc.stop()
stats = end_snapshot.compare_to(start_snapshot, 'lineno')
print(f"Time for {iterations} context calcs: {total_time:.4f}s")
with open("benchmark_results.txt", "a") as f:
f.write(f"Vector Context Time: {total_time:.4f}s\n")
f.write("Top memory allocations:\n")
for stat in stats[:3]:
f.write(str(stat) + "\n")
async def main():
# Clear file
with open("benchmark_results.txt", "w") as f:
f.write("Benchmark Results:\n")
await benchmark_synapse_lookup()
await benchmark_vector_allocations()
if __name__ == "__main__":
asyncio.run(main())