Merge branch 'bugfix' of jexelmans/joeriPDEVS into master

This commit is contained in:
Joeri Exelmans 2024-12-12 14:59:10 +01:00 committed by Gogs
commit 3404c782a9

View file

@ -11,6 +11,8 @@ class GeneratorState:
self.remaining = 0.0 self.remaining = 0.0
# Counter on how many events to generate still # Counter on how many events to generate still
self.to_generate = gen_num self.to_generate = gen_num
# Next job to output
self.next_job = None
# State of our random number generator # State of our random number generator
self.random = random.Random(seed) self.random = random.Random(seed)
@ -19,13 +21,24 @@ class Generator(AtomicDEVS):
AtomicDEVS.__init__(self, "Generator") AtomicDEVS.__init__(self, "Generator")
# Output port for the event # Output port for the event
self.out_event = self.addOutPort("out_event") self.out_event = self.addOutPort("out_event")
# Define the state
self.state = GeneratorState(gen_num)
# Parameters defining the generator's behaviour # Parameters defining the generator's behaviour
self.gen_param = gen_param self.gen_param = gen_param
self.size_param = size_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): def intTransition(self):
# Update simulation time # Update simulation time
self.state.current_time += self.timeAdvance() self.state.current_time += self.timeAdvance()
@ -34,9 +47,10 @@ class Generator(AtomicDEVS):
if self.state.to_generate == 0: if self.state.to_generate == 0:
# Already generated enough events, so stop # Already generated enough events, so stop
self.state.remaining = float('inf') self.state.remaining = float('inf')
self.state.next_job = None
else: else:
# Still have to generate events, so sample for new duration # 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 return self.state
def timeAdvance(self): def timeAdvance(self):
@ -44,9 +58,5 @@ class Generator(AtomicDEVS):
return self.state.remaining return self.state.remaining
def outputFnc(self): 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 # Output the new event on the output port
return {self.out_event: Job(size, creation)} return {self.out_event: self.state.next_job}