Преглед изворни кода

Merge branch 'yentl' of msdl.uantwerpen.be:yentl/modelverse into yentl

Yentl Van Tendeloo пре 9 година
родитељ
комит
90fdb89a0b
1 измењених фајлова са 58 додато и 21 уклоњено
  1. 58 21
      model/model.py

+ 58 - 21
model/model.py

@@ -34,7 +34,7 @@ class MvSState(object):
     def __init__(self):
         self.queue = []
         self.output = None
-        self.mvs = MvS()
+        self.mvs = MvS("../bootstrap/bootstrap.m")
         self.timer = float("inf")
 
 class ModelverseState(AtomicDEVS):
@@ -93,7 +93,7 @@ class ModelverseState(AtomicDEVS):
             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.output.append(getattr(self.state.mvs, translate(v[0]))(*v[1]))
                 self.state.timer += self.timings[translate(v[0])]()
         else:
             # Just append the message to process
@@ -131,6 +131,8 @@ class MvKState(object):
         self.reply = None
         self.phase = None
         self.commands = None
+        self.root = None
+        self.current_user = None
 
     def __str__(self):
         return "\nMvK: %s\n" % self.mvk + \
@@ -140,7 +142,9 @@ class MvKState(object):
                 "users: %s\n" % self.users + \
                 "reply: %s\n" % self.reply + \
                 "phase: %s\n" % self.phase + \
-                "commands: %s\n" % self.commands
+                "commands: %s\n" % self.commands + \
+                "root: %s\n" % self.root + \
+                "current user: %s\n" % self.current_user
 
 class ModelverseKernel(AtomicDEVS):
     def __init__(self):
@@ -157,22 +161,31 @@ class ModelverseKernel(AtomicDEVS):
             # Got input from MvI, so we queue it
             for inp in inputs[self.from_mvi]:
                 if inp is not None:
-                    self.state.inputs.append(inp)
+                    self.state.inputs.extend(inp)
                 else:
                     self.state.outputs.append(None)
 
         if self.from_mvs in inputs:
             # Got input from MvS, so we can continue processing
-            if self.state.mvk is None:
-                # No MvK, so set it with the root we have just received (or should have received)
-                self.state.mvk = MvK(inputs[self.from_mvs][0])
-            else:
-                self.state.reply = inputs[self.from_mvs][0]
+            for mvs_input in inputs[self.from_mvs]:
+                mvs_stripped = [i[0] for i in mvs_input]
+                if self.state.mvk is None:
+                    # No MvK, so set it with the root we have just received (or should have received)
+                    self.state.root = mvs_stripped[0]
+                    self.state.mvk = MvK(self.state.root)
+                else:
+                    if len(mvs_stripped) == 1:
+                        self.state.reply = mvs_stripped[0]
+                        print("Clip reply to " + str(mvs_stripped[0]))
+                    else:
+                        self.state.reply = mvs_stripped
+                        print("Set reply to " + str(mvs_stripped))
             self.state.waiting = False
 
         return self.state
 
     def intTransition(self):
+        was_empty = len(self.state.users) == 0
         if self.state.commands is not None:
             self.state.commands = None
             return self.state
@@ -185,31 +198,51 @@ class ModelverseKernel(AtomicDEVS):
             if len(self.state.users) == 0:
                 # Read out new set of users first
                 if self.state.reply is None:
-                    commands = [("RDK", [])]
+                    commands = [("RDK", [self.state.root])]
+                else:
+                    self.state.users = self.state.reply
+                    commands = None
+            elif self.state.phase == "init_user":
+                if self.state.reply is None:
+                    commands = [("RV", [self.state.users[0]])]
                 else:
-                    self.users = self.state.reply
-                    print("Got users: " + str(self.users))
+                    self.state.current_user = self.state.reply
+                    if self.state.current_user.startswith("__"):
+                        # Don't process this user and force termination of user
+                        self.state.phase = "output"
                     commands = None
             elif self.state.phase == "input":
                 # Process inputs
-                commands = self.state.mvk.execute_yields(self.state.users[0], "set_input", [self.state.inputs[0]], self.state.reply)
+                if self.state.inputs:
+                    element_type, value = self.state.inputs[0]
+                    print(str((element_type, value)))
+                    print(self.state.reply)
+                    commands = self.state.mvk.execute_yields(self.state.current_user, "set_input", [element_type, value], self.state.reply)
+                    if commands is None:
+                        self.state.inputs.pop(0)
+                else:
+                    commands = None
+
             elif self.state.phase == "computation":
-                commands = self.state.mvk.execute_yields(self.state.users[0], "execute_rule", [], self.state.reply)
+                commands = self.state.mvk.execute_yields(self.state.current_user, "execute_rule", [], self.state.reply)
             elif self.state.phase == "output":
-                commands = self.state.mvk.execute_yields(self.state.users[0], "get_output", [], self.state.reply)
+                commands = self.state.mvk.execute_yields(self.state.current_user, "get_output", [], self.state.reply)
+            else:
+                raise Exception("Phase: " + str(self.state.phase))
 
             # Advance phase
             if commands is None:
-                if len(self.state.users) == 0:
+                if was_empty:
+                    self.state.phase = "init_user"
+                elif self.state.phase == "init_user":
                     self.state.phase = "input"
                 elif self.state.phase == "input":
-                    self.state.inputs.pop(0)
                     self.state.phase = "computation"
                 elif self.state.phase == "computation":
                     self.state.phase = "output"
                 elif self.state.phase == "output":
                     self.state.users.pop(0)
-                    self.state.phase = "input"
+                    self.state.phase = "init_user"
                 self.state.waiting = False
                 self.state.reply = None
             else:
@@ -247,10 +280,11 @@ class MvIState():
         self.init = True
 
 class ModelverseInterface(AtomicDEVS):
-    def __init__(self, operations):
+    def __init__(self, username, operations):
         AtomicDEVS.__init__(self, "MvI")
         self.state = MvIState()
         self.state.operations = operations
+        self.username = username
 
         self.to_mvk = self.addOutPort("to_MvK")
         self.from_mvk = self.addInPort("from_MvK")
@@ -334,6 +368,7 @@ class Network(AtomicDEVS):
 
 class System(CoupledDEVS):
     def __init__(self,
+                username,
                 operations,
                 mvi2mvk_latency,
                 mvi2mvk_bandwidth,
@@ -363,6 +398,7 @@ class System(CoupledDEVS):
         CoupledDEVS.__init__(self, "System")
 
         self.mvi = self.addSubModel(ModelverseInterface(\
+                            username            = username,
                             operations          = operations
                         ))
         self.mvk = self.addSubModel(ModelverseKernel())
@@ -420,7 +456,8 @@ operations = [
     ]
 
 args = {
-        "operations": operations,
+        "username":             "test_user",
+        "operations":           operations,
         "mvi2mvk_latency":      1,
         "mvi2mvk_bandwidth":    2000,
         "mvk2mvs_latency":      1,
@@ -450,6 +487,6 @@ args = {
 
 model = System(**args)
 sim = Simulator(model)
-sim.setTerminationTime(10)
+sim.setTerminationTime(20)
 sim.setVerbose()
 sim.simulate()