|
@@ -146,6 +146,8 @@ class MvKState(object):
|
|
|
self.loaded_primitives = False
|
|
|
self.execution_counter = 0
|
|
|
self.rule_generation = rule_generation
|
|
|
+ self.current_time = 0.0
|
|
|
+ self.start_task_time = 0.0
|
|
|
|
|
|
def __str__(self):
|
|
|
return "\nMvK: %s\n" % self.mvk + \
|
|
@@ -161,7 +163,7 @@ class MvKState(object):
|
|
|
"execution counter: %s\n"
|
|
|
|
|
|
class ModelverseKernel(AtomicDEVS):
|
|
|
- def __init__(self, rules_per_phase, rule_generation):
|
|
|
+ def __init__(self, time_per_phase, rule_generation):
|
|
|
AtomicDEVS.__init__(self, "MvK")
|
|
|
self.state = MvKState(rule_generation)
|
|
|
|
|
@@ -170,9 +172,10 @@ class ModelverseKernel(AtomicDEVS):
|
|
|
self.to_mvi = self.addOutPort("to_MvI")
|
|
|
self.to_mvs = self.addOutPort("to_MvS")
|
|
|
|
|
|
- self.rules_per_phase = rules_per_phase
|
|
|
+ self.time_per_phase = time_per_phase
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
+ self.state.current_time += self.elapsed
|
|
|
if self.from_mvi in inputs:
|
|
|
# Got input from MvI, so we queue it
|
|
|
for inp in inputs[self.from_mvi]:
|
|
@@ -199,6 +202,7 @@ class ModelverseKernel(AtomicDEVS):
|
|
|
return self.state
|
|
|
|
|
|
def intTransition(self):
|
|
|
+ self.state.current_time += self.timeAdvance()
|
|
|
was_empty = len(self.state.tasks) == 0
|
|
|
if self.state.commands is not None:
|
|
|
self.state.commands = None
|
|
@@ -232,6 +236,8 @@ class ModelverseKernel(AtomicDEVS):
|
|
|
commands = [("RV", [self.state.tasks[0]])]
|
|
|
else:
|
|
|
self.state.current_task = self.state.reply[0]
|
|
|
+ #print("Processing task %s at time %s" % (self.state.current_task, self.time_last))
|
|
|
+ self.state.start_task_time = self.state.current_time
|
|
|
if self.state.current_task.startswith("__"):
|
|
|
# Don't process this task and force termination of task
|
|
|
self.state.phase = "output"
|
|
@@ -276,11 +282,10 @@ class ModelverseKernel(AtomicDEVS):
|
|
|
elif self.state.phase == "input":
|
|
|
self.state.phase = "computation"
|
|
|
elif self.state.phase == "computation":
|
|
|
- if not self.state.mvk.success or (self.state.execution_counter > self.rules_per_phase):
|
|
|
+ if not self.state.mvk.success or (self.state.current_time - self.state.start_task_time > self.time_per_phase):
|
|
|
+ #print("Computed for %s" % (self.state.current_time - self.state.start_task_time))
|
|
|
+ #print("Success: " + str(self.state.mvk.success))
|
|
|
self.state.phase = "output"
|
|
|
- self.state.execution_counter = 0
|
|
|
- else:
|
|
|
- self.state.execution_counter += 1
|
|
|
elif self.state.phase == "output":
|
|
|
self.state.tasks.pop(0)
|
|
|
self.state.phase = "init_task"
|
|
@@ -409,7 +414,7 @@ class System(CoupledDEVS):
|
|
|
operations,
|
|
|
finish_on,
|
|
|
rule_generation,
|
|
|
- rules_per_phase,
|
|
|
+ time_per_phase,
|
|
|
mvi2mvk_latency,
|
|
|
mvi2mvk_bandwidth,
|
|
|
mvk2mvs_latency,
|
|
@@ -448,7 +453,7 @@ class System(CoupledDEVS):
|
|
|
finish_on = finish_on,
|
|
|
))
|
|
|
self.mvk = self.addSubModel(ModelverseKernel(\
|
|
|
- rules_per_phase = rules_per_phase,
|
|
|
+ time_per_phase = time_per_phase,
|
|
|
rule_generation = rule_generation,
|
|
|
))
|
|
|
self.mvs = self.addSubModel(ModelverseState(\
|
|
@@ -518,7 +523,7 @@ args = {
|
|
|
"mvs2mvk_bandwidth": 50000000000,
|
|
|
"mvk2mvi_latency": 0.000001,
|
|
|
"mvk2mvi_bandwidth": 50000000000,
|
|
|
- "rules_per_phase": 5000,
|
|
|
+ "time_per_phase": 0.05,
|
|
|
# Automatically filled in from calibration results, just here to prevent crashes (results for my UA desktop)
|
|
|
"read_root": 0.00001406669616699,
|
|
|
"create_node": 0.00000379181167487,
|