|
@@ -132,6 +132,7 @@ class MvKState(object):
|
|
|
self.phase = None
|
|
|
self.commands = None
|
|
|
self.root = None
|
|
|
+ self.current_user = None
|
|
|
|
|
|
def __str__(self):
|
|
|
return "\nMvK: %s\n" % self.mvk + \
|
|
@@ -142,7 +143,8 @@ class MvKState(object):
|
|
|
"reply: %s\n" % self.reply + \
|
|
|
"phase: %s\n" % self.phase + \
|
|
|
"commands: %s\n" % self.commands + \
|
|
|
- "root: %s\n" % self.root
|
|
|
+ "root: %s\n" % self.root + \
|
|
|
+ "current user: %s\n" % self.current_user
|
|
|
|
|
|
class ModelverseKernel(AtomicDEVS):
|
|
|
def __init__(self):
|
|
@@ -171,12 +173,16 @@ class ModelverseKernel(AtomicDEVS):
|
|
|
self.state.root = mvs_input[0]
|
|
|
self.state.mvk = MvK(self.state.root)
|
|
|
else:
|
|
|
- self.state.reply = inputs[self.from_mvs]
|
|
|
+ if len(mvs_input) == 1:
|
|
|
+ self.state.reply = mvs_input[0]
|
|
|
+ else:
|
|
|
+ self.state.reply = mvs_input
|
|
|
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
|
|
@@ -189,22 +195,33 @@ class ModelverseKernel(AtomicDEVS):
|
|
|
if len(self.state.users) == 0:
|
|
|
# Read out new set of users first
|
|
|
if self.state.reply is None:
|
|
|
+ print("Request users!")
|
|
|
commands = [("RDK", [self.state.root])]
|
|
|
else:
|
|
|
- self.users = self.state.reply
|
|
|
- print("Got users: " + str(self.users))
|
|
|
+ print("Got users!")
|
|
|
+ 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.state.current_user = self.state.reply
|
|
|
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)
|
|
|
+ commands = self.state.mvk.execute_yields(self.state.current_user, "set_input", [self.state.inputs[0]], self.state.reply)
|
|
|
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)
|