Advertisement
Guest User

Event oriented simulation

a guest
Jul 23rd, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.15 KB | None | 0 0
  1. import abc
  2. import heapq
  3. import time
  4.  
  5.  
  6. class SimEvent:
  7.  
  8.     def __init__(self, event_time, simulation):
  9.         self.Time = event_time
  10.         self.Simulation = simulation
  11.  
  12.     @abc.abstractmethod
  13.     def execute(self):
  14.         pass
  15.  
  16.  
  17. class SimCore:
  18.  
  19.     def __init__(self):
  20.         self.CurrentTime = 0
  21.         self.EventsFront = []
  22.         self.Running = True
  23.         self.Pause = False
  24.  
  25.     def simulate(self, max_time):
  26.         self.before_simulation_run()
  27.         self.simulation_run(max_time)
  28.         self.after_simulation_run()
  29.  
  30.     @abc.abstractmethod
  31.     def before_simulation_run(self):
  32.         pass
  33.  
  34.     @abc.abstractmethod
  35.     def after_simulation_run(self):
  36.         pass
  37.  
  38.     def simulation_run(self, max_time):
  39.         while self.EventsFront.__len__() != 0:
  40.             if self.Running:
  41.                 if not self.Pause:
  42.                     (priority, hlpEvent) = heapq.heappop(self.EventsFront)
  43.  
  44.                     self.CurrentTime = priority
  45.  
  46.                     if priority < max_time:
  47.                         hlpEvent.execute()
  48.                     else:
  49.                         break
  50.                 else:
  51.                     time.sleep(0.2)
  52.             else:
  53.                 break
  54.  
  55.     def insert_event(self, sim_event):
  56.         heapq.heappush(self.EventsFront, (sim_event.Time, sim_event))
  57.  
  58.  
  59. class MySimulation(SimCore):
  60.  
  61.     def after_simulation_run(self):
  62.         print "After simulation run"
  63.  
  64.     def before_simulation_run(self):
  65.         print "Before simulation run"
  66.  
  67.  
  68. class SlowingEvent(SimEvent):
  69.  
  70.     def execute(self):
  71.         time.sleep(1)
  72.         self.Simulation.insert_event(SlowingEvent(self.Time + 1, self.Simulation))
  73.  
  74.  
  75. class MyEvent1(SimEvent):
  76.     def execute(self):
  77.         print "Event 1"
  78.         self.Simulation.insert_event(MyEvent1(self.Time + 1, self.Simulation))
  79.  
  80.  
  81. class MyEvent2(SimEvent):
  82.     def execute(self):
  83.         print "Event 2"
  84.         self.Simulation.insert_event(MyEvent2(self.Time + 1, self.Simulation))
  85.  
  86.  
  87. sim = MySimulation()
  88. sim.insert_event(MyEvent1(0.5, sim))
  89. sim.insert_event(MyEvent2(0.51, sim))
  90. sim.insert_event(SlowingEvent(0, sim))
  91. sim.simulate(5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement