@@ -57,13 +57,19 @@ def __init__(self, time_unit: type, start_time: int | float):
5757 time_unit: type of the smulaiton time
5858 start_time: the starttime of the simulator
5959 """
60- # should model run in a separate thread,
61- # and we can then interact with start, stop, run_until, and step?
62- self .event_list = EventList ()
6360 self .start_time = start_time
6461 self .time_unit = time_unit
6562 self .model : Model | None = None
6663
64+ @property
65+ def event_list (self ) -> EventList :
66+ """Return the event list from the model."""
67+ if self .model is None :
68+ raise RuntimeError (
69+ "Simulator not set up. Call simulator.setup(model) first."
70+ )
71+ return self .model ._event_list
72+
6773 @property
6874 def time (self ) -> float :
6975 """Simulator time (deprecated)."""
@@ -92,19 +98,18 @@ def setup(self, model: Model) -> None:
9298 f"Model time ({ model .time } ) does not match simulator start_time ({ self .start_time } ). "
9399 "Has the model already been run?"
94100 )
95- if not self . event_list .is_empty ():
101+ if not model . _event_list .is_empty ():
96102 raise ValueError ("Events already scheduled. Call setup before scheduling." )
97103
98104 self .model = model
99105 model ._simulator = self # Register simulator with model
100106
101107 def reset (self ):
102108 """Reset the simulator."""
103- self .event_list .clear ()
104109 if self .model is not None :
110+ self .event_list .clear ()
105111 self .model ._simulator = None
106112 self .model .time = self .start_time
107- self .model = None
108113
109114 def run_until (self , end_time : int | float ) -> None :
110115 """Run the simulator until the end time.
@@ -121,20 +126,7 @@ def run_until(self, end_time: int | float) -> None:
121126 "Simulator not set up. Call simulator.setup(model) first."
122127 )
123128
124- while True :
125- try :
126- event = self .event_list .pop_event ()
127- except IndexError :
128- self .model .time = end_time
129- break
130-
131- if event .time <= end_time :
132- self .model .time = event .time
133- event .execute ()
134- else :
135- self .model .time = end_time
136- self ._schedule_event (event )
137- break
129+ self .model ._advance_time (end_time )
138130
139131 def run_next_event (self ):
140132 """Execute the next event.
@@ -167,14 +159,11 @@ def run_for(self, time_delta: int | float):
167159 Exception if simulator.setup() has not yet been called
168160
169161 """
170- try :
171- end_time = self .model .time + time_delta
172- except AttributeError as e :
162+ if self .model is None :
173163 raise RuntimeError (
174164 "Simulator not set up. Call simulator.setup(model) first."
175- ) from e
176- else :
177- self .run_until (end_time )
165+ )
166+ self .run_until (self .model .time + time_delta )
178167
179168 def schedule_event_now (
180169 self ,
@@ -290,7 +279,6 @@ def _schedule_event(self, event: SimulationEvent):
290279 f"time unit mismatch { event .time } is not of time unit { self .time_unit } "
291280 )
292281
293- # check timeunit of events
294282 self .event_list .add_event (event )
295283
296284
@@ -316,7 +304,8 @@ def setup(self, model):
316304
317305 """
318306 super ().setup (model )
319- self .schedule_event_next_tick (self .model .step , priority = Priority .HIGH )
307+ # Schedule the first step event
308+ model ._schedule_step (1 )
320309
321310 def check_time_unit (self , time ) -> bool :
322311 """Check whether the time is of the correct unit.
@@ -359,43 +348,6 @@ def schedule_event_next_tick(
359348 function_kwargs = function_kwargs ,
360349 )
361350
362- def run_until (self , end_time : int ) -> None :
363- """Run the simulator up to and included the specified end time.
364-
365- Args:
366- end_time (float| int): The end_time delta. The simulator is until the specified end time
367-
368- Raises:
369- Exception if simulator.setup() has not yet been called
370-
371- """
372- if self .model is None :
373- raise RuntimeError (
374- "Simulator not set up. Call simulator.setup(model) first."
375- )
376-
377- while True :
378- try :
379- event = self .event_list .pop_event ()
380- except IndexError :
381- self .model .time = float (end_time )
382- break
383-
384- if event .time <= end_time :
385- self .model .time = float (event .time )
386-
387- # Reschedule model.step for next tick if this is a step event
388- if event .fn () == self .model .step :
389- self .schedule_event_next_tick (
390- self .model .step , priority = Priority .HIGH
391- )
392-
393- event .execute ()
394- else :
395- self .model .time = float (end_time )
396- self ._schedule_event (event )
397- break
398-
399351
400352class DEVSimulator (Simulator ):
401353 """A simulator where the unit of time is a float.
@@ -408,6 +360,18 @@ def __init__(self):
408360 """Initialize a DEVS simulator."""
409361 super ().__init__ (float , 0.0 )
410362
363+ def setup (self , model : Model ) -> None :
364+ """Set up the simulator with the model to simulate.
365+
366+ Args:
367+ model (Model): The model to simulate
368+
369+ """
370+ # For pure DEVS, we don't want automatic step scheduling
371+ # Clear any pre-scheduled events
372+ model ._event_list .clear ()
373+ super ().setup (model )
374+
411375 def check_time_unit (self , time ) -> bool :
412376 """Check whether the time is of the correct unit.
413377
0 commit comments