65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
# analysis/timeline_store.py
|
|
|
|
class TimelineStore:
|
|
|
|
def __init__(self):
|
|
self.events = []
|
|
|
|
# -----------------------------
|
|
# APPEND EVENT (IMMUTABLE LOG)
|
|
# -----------------------------
|
|
def record(self, event):
|
|
"""
|
|
Every state transition in the system must go here.
|
|
"""
|
|
self.events.append(event)
|
|
|
|
# -----------------------------
|
|
# GET EVENTS FOR NODE
|
|
# -----------------------------
|
|
def get_node_events(self, node_name):
|
|
|
|
return [
|
|
e for e in self.events
|
|
if e.get("data", {}).get("node") == node_name
|
|
]
|
|
|
|
# -----------------------------
|
|
# GET TIMELINE SNAPSHOT
|
|
# -----------------------------
|
|
def snapshot_at(self, index):
|
|
|
|
if index < 0 or index >= len(self.events):
|
|
return None
|
|
|
|
return self.events[index]
|
|
|
|
# -----------------------------
|
|
# FIND LAST STATE BEFORE EVENT
|
|
# -----------------------------
|
|
def rewind_to_event(self, node_name, event_index):
|
|
|
|
history = []
|
|
|
|
for i in range(event_index + 1):
|
|
e = self.events[i]
|
|
|
|
if e.get("data", {}).get("node") == node_name:
|
|
history.append(e)
|
|
|
|
return history
|
|
|
|
# -----------------------------
|
|
# FIND LAST SCHEDULER DECISION
|
|
# -----------------------------
|
|
def last_scheduler_state(self, node_name, event_index):
|
|
|
|
for i in range(event_index, -1, -1):
|
|
e = self.events[i]
|
|
|
|
if e["type"] == "schedule_decision":
|
|
if e.get("data", {}).get("node") == node_name:
|
|
return e["data"]
|
|
|
|
return None
|