diff --git a/examples/queueing/generator.py b/examples/queueing/generator.py index 52e73a0..57423eb 100644 --- a/examples/queueing/generator.py +++ b/examples/queueing/generator.py @@ -11,6 +11,8 @@ class GeneratorState: self.remaining = 0.0 # Counter on how many events to generate still self.to_generate = gen_num + # Next job to output + self.next_job = None # State of our random number generator self.random = random.Random(seed) @@ -19,13 +21,24 @@ class Generator(AtomicDEVS): AtomicDEVS.__init__(self, "Generator") # Output port for the event self.out_event = self.addOutPort("out_event") - # Define the state - self.state = GeneratorState(gen_num) # Parameters defining the generator's behaviour self.gen_param = gen_param self.size_param = size_param + # Init state + self.state = GeneratorState(gen_num) + self.__nextJob() # already schedule the first job to generate + + def __nextJob(self): + # Determine size of the event to generate + size = max(1, int(self.state.random.gauss(self.size_param, 5))) + # Calculate current time (note the addition!) + creation = self.state.current_time + self.state.remaining + # Update state + self.state.next_job = Job(size, creation) + self.state.remaining = self.state.random.expovariate(self.gen_param) + def intTransition(self): # Update simulation time self.state.current_time += self.timeAdvance() @@ -34,9 +47,10 @@ class Generator(AtomicDEVS): if self.state.to_generate == 0: # Already generated enough events, so stop self.state.remaining = float('inf') + self.state.next_job = None else: # Still have to generate events, so sample for new duration - self.state.remaining = self.state.random.expovariate(self.gen_param) + self.__nextJob() return self.state def timeAdvance(self): @@ -44,9 +58,5 @@ class Generator(AtomicDEVS): return self.state.remaining def outputFnc(self): - # Determine size of the event to generate - size = max(1, int(self.state.random.gauss(self.size_param, 5))) - # Calculate current time (note the addition!) - creation = self.state.current_time + self.state.remaining # Output the new event on the output port - return {self.out_event: Job(size, creation)} + return {self.out_event: self.state.next_job}