浏览代码

Updated task changing interval: change based on time

Yentl Van Tendeloo 7 年之前
父节点
当前提交
e5cb3e56dd
共有 1 个文件被更改,包括 14 次插入9 次删除
  1. 14 9
      model/model.py

+ 14 - 9
model/model.py

@@ -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,