-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathepisodic_memory.py
More file actions
49 lines (38 loc) · 1.98 KB
/
episodic_memory.py
File metadata and controls
49 lines (38 loc) · 1.98 KB
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
from typing import List, Dict, Any
import numpy as np
class EpisodicMemory:
"""Stores and retrieves past experiences."""
def __init__(self, max_episodes: int = 10):
self.episodes = []
self.max_episodes = max_episodes
def store_episode(self, episode: Dict[str, Any]) -> None:
"""Store a new episode in memory."""
self.episodes.append(episode)
if len(self.episodes) > self.max_episodes:
self.episodes.pop(0) # Remove oldest episode if at capacity
def retrieve_relevant_experiences(self, problem: Dict[str, Any], top_k: int = 2) -> List[Dict[str, Any]]:
"""Retrieve experiences relevant to the current problem."""
if not self.episodes:
return []
# Simple relevance scoring based on problem type and difficulty
problem_type = problem.get("problem_type", "")
difficulty = problem.get("difficulty", 0)
# Calculate relevance scores
relevance_scores = []
for episode in self.episodes:
episode_problem = episode.get("problem", {})
episode_type = episode_problem.get("problem_type", "")
episode_difficulty = episode_problem.get("difficulty", 0)
# Higher score for same type and similar difficulty
type_match = 1.0 if episode_type == problem_type else 0.0
difficulty_similarity = 1.0 - min(abs(difficulty - episode_difficulty) / 10.0, 1.0)
relevance = (type_match * 0.7) + (difficulty_similarity * 0.3)
relevance_scores.append(relevance)
# Get top-k relevant episodes
if top_k >= len(self.episodes):
return self.episodes
indices = np.argsort(relevance_scores)[-top_k:][::-1] # Indices of top-k scores
return [self.episodes[i] for i in indices]
def get_episode_count(self) -> int:
"""Return the number of episodes in memory."""
return len(self.episodes)