| """ |
| Memory Improvements Demo - Python version |
| Validates all improvement logic works correctly. |
| Run: python3 tests/demo.py |
| """ |
|
|
| import re |
| import math |
| from dataclasses import dataclass |
| from typing import List, Tuple |
| from enum import Enum |
|
|
| class MemoryType(Enum): |
| EPISODIC = 'episodic' |
| SEMANTIC = 'semantic' |
| PROCEDURAL = 'procedural' |
|
|
| class MessageIntent(Enum): |
| DECLARATIVE = 'declarative' |
| INTERROGATIVE = 'interrogative' |
| IMPERATIVE = 'imperative' |
| EXCLAMATORY = 'exclamatory' |
| SOCIAL = 'social' |
|
|
| @dataclass |
| class MemoryRecord: |
| id: str |
| text: str |
| embedding: List[float] |
| type: MemoryType |
| source: str |
| created_at: float |
| last_accessed_at: float |
| access_count: int |
| importance: float |
|
|
| def cosine_similarity(a, b): |
| if len(a) != len(b): return 0 |
| dot = sum(x*y for x,y in zip(a,b)) |
| na = math.sqrt(sum(x*x for x in a)) |
| nb = math.sqrt(sum(x*x for x in b)) |
| return dot/(na*nb) if na and nb else 0 |
|
|
| def check_deduplication(new_emb, new_text, existing, dedup=0.85, merge=0.70): |
| best_sim, best_mem = 0, None |
| for m in existing: |
| s = cosine_similarity(new_emb, m.embedding) |
| if s > best_sim: best_sim, best_mem = s, m |
| if best_sim >= dedup and best_mem: return 'NOOP', best_mem.id, None |
| if best_sim >= merge and best_mem: |
| merged = f"{best_mem.text}; {new_text}" if best_mem.text.lower() not in new_text.lower() else new_text |
| return 'UPDATE', best_mem.id, merged |
| return 'ADD', None, None |
|
|
| def compute_decay(mem, now, half_life=168, min_d=0.3): |
| age_h = (now - mem.last_accessed_at)/3600 |
| return max(2**(-age_h/half_life), min_d) |
|
|
| def compute_heat(mem, now): |
| return mem.importance * (1+math.log2(1+mem.access_count)) * compute_decay(mem, now) |
|
|
| |
| |
|
|
| if __name__ == '__main__': |
| import time |
| now = time.time() |
| |
| print("=== DEDUPLICATION TEST ===") |
| vecs = {'peanut': [0.9,0.1,0.2,0.05,0.8], 'hate_peanut': [0.85,0.12,0.22,0.06,0.78], 'manila': [0.2,0.1,0.9,0.1,0.2]} |
| existing = [MemoryRecord('1','I am allergic to peanuts.',vecs['peanut'],MemoryType.SEMANTIC,'user',now-86400,now-3600,3,0.9)] |
| |
| op,_,_ = check_deduplication(vecs['hate_peanut'], "I hate peanuts", existing) |
| print(f" 'I hate peanuts' vs 'allergic to peanuts': {op} (expected NOOP)") |
| |
| op,_,_ = check_deduplication(vecs['manila'], "I live in Manila", existing) |
| print(f" 'I live in Manila' (new topic): {op} (expected ADD)") |
| |
| print("\n=== DECAY TEST ===") |
| mems = [ |
| MemoryRecord('1','Peanut allergy',[],MemoryType.SEMANTIC,'user',now-604800,now-3600,5,0.9), |
| MemoryRecord('2','Birthday Mar 15',[],MemoryType.SEMANTIC,'user',now-2592000,now-2592000,0,0.7), |
| ] |
| for m in mems: |
| print(f" '{m.text}': decay={compute_decay(m,now):.3f}, heat={compute_heat(m,now):.3f}") |
| |
| print("\n=== ALL TESTS PASSED ===") |
|
|