Spaces:
Runtime error
Runtime error
| """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() | |
| 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 | |