(self)
| 67 | # self.save() # Avoid saving on every minor update; save at higher level operations |
| 68 | |
| 69 | def evict_lfu(self): |
| 70 | if not self.access_frequency or not self.sessions: |
| 71 | return |
| 72 | |
| 73 | lfu_sid = min(self.access_frequency, key=self.access_frequency.get) |
| 74 | print(f"MidTermMemory: LFU eviction. Session {lfu_sid} has lowest access frequency.") |
| 75 | |
| 76 | if lfu_sid not in self.sessions: |
| 77 | del self.access_frequency[lfu_sid] # Clean up access frequency if session already gone |
| 78 | self.rebuild_heap() |
| 79 | return |
| 80 | |
| 81 | session_to_delete = self.sessions.pop(lfu_sid) # Remove from sessions |
| 82 | del self.access_frequency[lfu_sid] # Remove from LFU tracking |
| 83 | |
| 84 | # Clean up page connections if this session's pages were linked |
| 85 | for page in session_to_delete.get("details", []): |
| 86 | prev_page_id = page.get("pre_page") |
| 87 | next_page_id = page.get("next_page") |
| 88 | # If a page from this session was linked to an external page, nullify the external link |
| 89 | if prev_page_id and not self.get_page_by_id(prev_page_id): # Check if prev page is still in memory |
| 90 | # This case should ideally not happen if connections are within sessions or handled carefully |
| 91 | pass |
| 92 | if next_page_id and not self.get_page_by_id(next_page_id): |
| 93 | pass |
| 94 | # More robustly, one might need to search all other sessions if inter-session linking was allowed |
| 95 | # For now, assuming internal consistency or that MemoryOS class manages higher-level links |
| 96 | |
| 97 | self.rebuild_heap() |
| 98 | self.save() |
| 99 | print(f"MidTermMemory: Evicted session {lfu_sid}.") |
| 100 | |
| 101 | def add_session(self, summary, details, summary_keywords=None): |
| 102 | session_id = generate_id("session") |
no test coverage detected