Merge branch 'bugfix' of jexelmans/joeriPDEVS into master
This commit is contained in:
commit
3404c782a9
1 changed files with 18 additions and 8 deletions
|
|
@ -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}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue