AJMR-Python-Baird/LAVegMOD_DM/event.py

104 lines
2.4 KiB
Python

#!/usr/bin/env python
##\file
# This file defined the base Event class and the EventQueue class.
# These classes form the basis of the model update process
import copy
import heapq
import signal
import sys
class Time(object):
def __init__(self, time, priority):
self.time = copy.copy(time)
self.priority = copy.copy(priority)
def __lt__(self, other):
return self.time < other.time or ( self.time == other.time and self.priority < other.priority )
def __str__(self):
return str(self.time) + '(' + str(self.priority) + ')'
class Event(object):
def __init__(self, time, name = 'Event' ):
self.time = copy.copy(time)
self.name = copy.copy(name)
def __lt__(self, other):
return self.time < other.time
def __str__(self):
return str(self.time) + ' : ' + self.name
def act(self):
print self.__str__()
class GenericEvent(Event):
def __init__(self, time, name = 'GenericEvent', callable=None):
Event.__init__(self, time, name)
self.callable = callable
def act(self):
self.callable.act()
class PauseEvent(Event):
def __init__(self, time, name='PauseEvent'):
Event.__init__(self, time, name)
def act(self):
pass
class MsgEvent(Event):
def __init__(self, time, name = 'MsgEvent', stream=sys.stdout, msg = 'None'):
Event.__init__(self, time, name)
self.stream = stream
self.msg = copy.copy(msg)
def __str__(self):
return self.msg
def act(self):
print >> self.stream, self.__str__()
#class ReadCSVEvent(Event):
# def __init__(self, time, name = 'ReadCSVEvent', file=0):
# Event.__init__(self, time, name)
# self.file = copy.copy(file)
#
# def __str__(self):
# return Event.__str__(self)
#
# def read(self, file):
# pass
#
# def act(self):
# pass
class EventQueue(object):
def __init__(self):
self.queue = list()
def run(self, while_condition=(lambda arg: True)):
elt = Event(Time(0,0))
while len(self.queue) != 0 and while_condition(elt):
elt = heapq.heappop(self.queue)
elt.act()
def add_event(self, event):
heapq.heappush(self.queue, event)
def clear(self):
del self.queue
self.queue = list()
def __str__(self):
ret = ''
for elt in self.queue:
ret += str(elt) + '\n'
return ret