sentinel-backend / src /abides /kernel.py
Penguindrum920's picture
Deploy SENTINEL backend to Hugging Face Spaces
6a09e49 verified
Raw
History Blame Contribute Delete
2.15 kB
"""ABIDES-style discrete event kernel."""
from __future__ import annotations
import heapq
from dataclasses import dataclass, field
from enum import Enum, auto
from typing import Any, Callable, List
class EventType(Enum):
WAKEUP = auto()
MESSAGE = auto()
@dataclass(order=True)
class Event:
timestamp: float
event_id: int
event_type: EventType = field(compare=False)
callback: Callable[[Any], None] = field(compare=False)
data: Any = field(compare=False, default=None)
class EventKernel:
"""Priority-queue event scheduler."""
def __init__(self) -> None:
self.queue: List[Event] = []
self.current_time: float = 0.0
self._event_counter: int = 0
def schedule_in(self, delay: float, event_type: EventType, callback: Callable[[Any], None], data: Any = None) -> int:
"""Schedule an event delay seconds in the future."""
self._event_counter += 1
trigger_time = self.current_time + max(0.0, float(delay))
event = Event(trigger_time, self._event_counter, event_type, callback, data)
heapq.heappush(self.queue, event)
return self._event_counter
def schedule_at(self, timestamp: float, event_type: EventType, callback: Callable[[Any], None], data: Any = None) -> int:
"""Schedule an event at an absolute timestamp."""
self._event_counter += 1
event = Event(float(timestamp), self._event_counter, event_type, callback, data)
heapq.heappush(self.queue, event)
return self._event_counter
def run_until(self, target_time: float) -> None:
"""Process events until target_time."""
target = float(target_time)
while self.queue and self.queue[0].timestamp <= target:
event = heapq.heappop(self.queue)
self.current_time = event.timestamp
event.callback(event.data)
self.current_time = max(self.current_time, target)
def clear(self) -> None:
"""Reset the kernel state."""
self.queue.clear()
self.current_time = 0.0
self._event_counter = 0