Просмотр исходного кода

Implemented decent termination condition

Yentl Van Tendeloo 7 лет назад
Родитель
Сommit
07c62a9afb
1 измененных файлов с 15 добавлено и 6 удалено
  1. 15 6
      model/model.py

+ 15 - 6
model/model.py

@@ -143,7 +143,7 @@ class MvKState(object):
         self.loaded_primitives = False
         self.execution_counter = 0
         self.all_failed = True
-        self.rule_generation_time = 0.0
+        self.rule_generation_time = 0
 
     def __str__(self):
         return "\nMvK: %s\n" % self.mvk + \
@@ -321,13 +321,15 @@ class MvIState():
         self.output = []
         self.processing = []
         self.init = True
+        self.finished = False
 
 class ModelverseInterface(AtomicDEVS):
-    def __init__(self, taskname, operations):
+    def __init__(self, taskname, operations, finish_on):
         AtomicDEVS.__init__(self, "MvI_%s" % taskname)
         self.state = MvIState()
         self.state.operations = operations
         self.taskname = taskname
+        self.finish_on = finish_on
 
         self.to_mvk = self.addOutPort("to_MvK")
         self.from_mvk = self.addInPort("from_MvK")
@@ -340,6 +342,8 @@ class ModelverseInterface(AtomicDEVS):
     def extTransition(self, inputs):
         for inp in inputs[self.from_mvk]:
             self.state.output.append(inp)
+            if inp == self.finish_on:
+                self.state.finished = True
         print("Event history: " + str(self.state.output))
         return self.state
 
@@ -401,6 +405,7 @@ class System(CoupledDEVS):
     def __init__(self,
                 taskname,
                 operations,
+                finish_on,
                 rules_per_phase,
                 mvi2mvk_latency,
                 mvi2mvk_bandwidth,
@@ -432,13 +437,15 @@ class System(CoupledDEVS):
         self.mvi_manager = self.addSubModel(ModelverseInterface(\
                             taskname            = "task_manager",
                             operations          = [taskname],
+                            finish_on           = None,
                         ))
         self.mvi = self.addSubModel(ModelverseInterface(\
                             taskname            = taskname,
-                            operations          = operations
+                            operations          = operations,
+                            finish_on           = finish_on,
                         ))
         self.mvk = self.addSubModel(ModelverseKernel(\
-                            rules_per_phase     = rules_per_phase
+                            rules_per_phase     = rules_per_phase,
                         ))
         self.mvs = self.addSubModel(ModelverseState(\
                             read_root           = read_root,
@@ -457,7 +464,7 @@ class System(CoupledDEVS):
                             read_dict_node_edge = read_dict_node_edge,
                             read_reverse_dict   = read_reverse_dict,
                             delete_node         = delete_node,
-                            delete_edge         = delete_edge
+                            delete_edge         = delete_edge,
                         ))
         self.mvi2mvk = self.addSubModel(Network(\
                             name        = "mvi2mvk",
@@ -493,10 +500,12 @@ class System(CoupledDEVS):
 taskname = "test_task"
 
 operations = ["admin", "admin"]
+finish_on = "Use the 'help' command for a list of possible commands"
 
 args = {
         "taskname":             taskname,
         "operations":           operations,
+        "finish_on":            finish_on,
         "mvi2mvk_latency":      1,
         "mvi2mvk_bandwidth":    2000,
         "mvk2mvs_latency":      1,
@@ -527,6 +536,6 @@ args = {
 
 model = System(**args)
 sim = Simulator(model)
-sim.setTerminationTime(10000000)
+sim.setTerminationCondition(lambda t, m: m.mvi.state.finished)
 #sim.setVerbose()
 sim.simulate()