Ver código fonte

Fixed some issues with timing

Yentl Van Tendeloo 9 anos atrás
pai
commit
3dadd9a483
1 arquivos alterados com 32 adições e 16 exclusões
  1. 32 16
      model/model.py

+ 32 - 16
model/model.py

@@ -84,25 +84,36 @@ class ModelverseState(AtomicDEVS):
 
     def extTransition(self, inputs):
         self.state.timer -= self.elapsed
-        self.state.queue.extend(inputs[self.from_mvk])
+        self.state.queue.append(inputs[self.from_mvk])
+        if len(self.state.queue) == 1:
+            # First message, so set the timer
+            # And already compute the result so it is ready to output
+            self.state.output = []
+            self.state.timer = 0.0
+            print("Got input: " + str(inputs[self.from_mvk]))
+            for v in self.state.queue[0]:
+                self.state.output.append(getattr(self.state.mvs, translate(v[0]))(*v[1])[0])
+                self.state.timer += self.timings[translate(v[0])]()
+        else:
+            # Just append the message to process
+            pass
         return self.state
 
     def outputFnc(self):
-        if self.state.output is not None:
-            return {self.to_mvk: [self.state.output]}
-        else:
-            return {}
+        return {self.to_mvk: [self.state.output]}
 
     def intTransition(self):
-        self.state.output = None
-        if self.state.queue:
-            self.state.output = []
-            value = self.state.queue.pop(0)
+        self.state.queue.pop(0)
+        self.state.output = []
+        if len(self.state.queue) > 0:
+            self.state.timer = 0.0
             # Value contains a list of operations to do
-            # So do them and calculate how long it took!
-            for v in value:
+            # So do them and calculate how long it takes
+            for v in self.state.queue[0]:
                 self.state.output.append(getattr(self.state.mvs, translate(v[0]))(*v[1])[0])
-                self.state.timer += self.timings[translate(v[0])]
+                self.state.timer += self.timings[translate(v[0])]()
+        else:
+            self.state.timer = float("inf")
 
         return self.state
 
@@ -197,7 +208,7 @@ class ModelverseInterface(AtomicDEVS):
                 send.append(("R", self.memory[i]))
             elif not isinstance(i, int):
                 send.append(("V", i))
-        return {self.to_mvk: [json.dumps(send)]}
+        return {self.to_mvk: [send]}
 
     def timeAdvance(self):
         if self.state.processing and (not isinstance(self.state.processing[0], int) or self.state.processing[0] in self.memory):
@@ -231,11 +242,15 @@ class Network(AtomicDEVS):
 
     def extTransition(self, inputs):
         self.state.timer -= self.elapsed
-        self.state.processing.extend(inputs[self.input_port])
+        if self.state.timer == float("inf"):
+            self.state.timer = 0
+        self.state.processing.append(json.dumps(inputs[self.input_port]))
+        if len(self.state.processing) > 0:
+            self.state.timer = int(len(self.state.processing[0]) / float(self.bandwidth) + self.latency)
         return self.state
 
     def outputFnc(self):
-        return {self.output_port: [self.state.processing[0]]}
+        return {self.output_port: [json.loads(self.state.processing[0])]}
 
     def timeAdvance(self):
         return self.state.timer
@@ -358,5 +373,6 @@ args = {
 
 model = System(**args)
 sim = Simulator(model)
-sim.setTerminationTime(1000)
+sim.setTerminationTime(10)
+sim.setVerbose()
 sim.simulate()