|
@@ -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()
|