Prechádzať zdrojové kódy

i was still mutating the state in outputFnc

Joeri Exelmans 7 mesiacov pred
rodič
commit
dc7a549b45
1 zmenil súbory, kde vykonal 18 pridanie a 8 odobranie
  1. 18 8
      examples/queueing/generator.py

+ 18 - 8
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}