Browse Source

Made little optimizations + made it automatically

sampieters 1 year ago
parent
commit
df75a87503

+ 6 - 59
examples/BouncingBalls/PyDEVS/target.py

@@ -197,18 +197,11 @@ class MainAppInstance(RuntimeClassBase):
 
 class MainApp(ObjectManagerBase):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
-        ObjectManagerBase.__init__(self)
-        self.elapsed = 0
-        self.name = "MainApp"
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        ObjectManagerBase.__init__(self, name)
         self.input = self.addInPort("input")
-        self.outputs = {}
         self.outputs["fields"] = self.addOutPort("fields")
         self.instances[self.next_instance] = MainAppInstance(self)
         self.next_instance = self.next_instance + 1
-        self.next_time = INFINITY
     
     def constructObject(self, parameters):
         new_instance = MainAppInstance(self)
@@ -471,19 +464,12 @@ class FieldInstance(RuntimeClassBase):
 
 class Field(ObjectManagerBase):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
-        ObjectManagerBase.__init__(self)
-        self.elapsed = 0
-        self.name = "Field"
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        ObjectManagerBase.__init__(self, name)
         self.input = self.addInPort("input")
-        self.outputs = {}
         self.outputs["balls"] = self.addOutPort("balls")
         self.outputs["buttons"] = self.addOutPort("buttons")
         self.outputs["parent"] = self.addOutPort("parent")
         self.field_ui = self.addInPort("field_ui")
-        self.next_time = INFINITY
     
     def constructObject(self, parameters):
         new_instance = FieldInstance(self)
@@ -580,17 +566,10 @@ class ButtonInstance(RuntimeClassBase):
 
 class Button(ObjectManagerBase):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
-        ObjectManagerBase.__init__(self)
-        self.elapsed = 0
-        self.name = "Button"
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        ObjectManagerBase.__init__(self, name)
         self.input = self.addInPort("input")
-        self.outputs = {}
         self.outputs["parent"] = self.addOutPort("parent")
         self.button_ui = self.addInPort("button_ui")
-        self.next_time = INFINITY
     
     def constructObject(self, parameters):
         new_instance = ButtonInstance(self, parameters[2], parameters[3], parameters[4])
@@ -814,17 +793,10 @@ class BallInstance(RuntimeClassBase):
 
 class Ball(ObjectManagerBase):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
-        ObjectManagerBase.__init__(self)
-        self.elapsed = 0
-        self.name = "Ball"
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        ObjectManagerBase.__init__(self, name)
         self.input = self.addInPort("input")
-        self.outputs = {}
         self.outputs["parent"] = self.addOutPort("parent")
         self.ball_ui = self.addInPort("ball_ui")
-        self.next_time = INFINITY
     
     def constructObject(self, parameters):
         new_instance = BallInstance(self, parameters[2], parameters[3], parameters[4])
@@ -834,40 +806,15 @@ class ObjectManagerState:
     def __init__(self):
         self.to_send = [("MainApp", "MainApp", Event("start_instance", None, ["MainApp[0]"], 0))]
 
-class ObjectManager(AtomicDEVS):
+class ObjectManager(TheObjectManager):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
+        TheObjectManager.__init__(self, name)
         self.State = ObjectManagerState()
         self.input = self.addInPort("input")
-        self.output = {}
         self.output["MainApp"] = self.addOutPort()
         self.output["Field"] = self.addOutPort()
         self.output["Button"] = self.addOutPort()
         self.output["Ball"] = self.addOutPort()
-    
-    def extTransition(self, inputs):
-        all_inputs = inputs[self.input]
-        for input in all_inputs:
-            self.State.to_send.append(input)
-        return self.State
-    
-    def intTransition(self):
-        self.State.to_send = []
-        return self.State
-    
-    def outputFnc(self):
-        out_dict = {}
-        for (source, target, message) in self.State.to_send:
-            if self.output[target] in out_dict:
-                out_dict[self.output[target]].append((source, target, message))
-            else:
-                out_dict[self.output[target]] = [(source, target, message)]
-        return out_dict
-    
-    def timeAdvance(self):
-        if self.State.to_send:
-            return 0
-        return INFINITY
 
 class Controller(CoupledDEVS):
     def __init__(self, name):

+ 7 - 67
sccd/compiler/DEVS_generator.py

@@ -68,11 +68,11 @@ class DEVSGenerator(Visitor):
         ################################
         # Object Manager
         ################################
-        self.writer.beginClass("ObjectManager", ["AtomicDEVS"])
+        self.writer.beginClass("ObjectManager", ["TheObjectManager"])
         self.writer.beginConstructor()
         self.writer.addFormalParameter("name")
         self.writer.beginMethodBody()
-        self.writer.beginSuperClassConstructorCall("AtomicDEVS")
+        self.writer.beginSuperClassConstructorCall("TheObjectManager")
         self.writer.addActualParameter("name")
         self.writer.endSuperClassConstructorCall()
 
@@ -80,60 +80,12 @@ class DEVSGenerator(Visitor):
         self.writer.addAssignment(GLC.SelfProperty("input"),
                                   GLC.FunctionCall(GLC.SelfProperty("addInPort"), [GLC.String("input")]))
 
-        self.writer.addAssignment(GLC.SelfProperty("output"), "{}")
         for class_name in class_diagram.class_names:
             self.writer.addAssignment(GLC.SelfProperty(f"output[\"{class_name}\"]"),
                                       GLC.FunctionCall(GLC.SelfProperty("addOutPort")))
 
         self.writer.endMethodBody()
         self.writer.endConstructor()
-
-        self.writer.beginMethod("extTransition")
-        self.writer.addFormalParameter("inputs")
-        self.writer.beginMethodBody()
-
-        self.writer.addAssignment("all_inputs", "inputs[self.input]")
-        self.writer.beginForLoopIterateArray("all_inputs", "input")
-        self.writer.add(GLC.FunctionCall(GLC.SelfProperty("State.to_send.append"), ["input"]))
-        self.writer.endForLoopIterateArray()
-        self.writer.add(GLC.ReturnStatement(GLC.SelfProperty("State")))
-
-        self.writer.endMethodBody()
-        self.writer.endMethod()
-
-        self.writer.beginMethod("intTransition")
-        self.writer.beginMethodBody()
-        self.writer.addAssignment(GLC.SelfProperty("State.to_send"), GLC.ArrayExpression())
-
-        self.writer.add(GLC.ReturnStatement(GLC.SelfProperty("State")))
-        self.writer.endMethodBody()
-        self.writer.endMethod()
-
-        self.writer.beginMethod("outputFnc")
-        self.writer.beginMethodBody()
-        self.writer.addAssignment("out_dict", "{}")
-
-        self.writer.beginForLoopIterateArray(GLC.SelfProperty("State.to_send"), "(source, target, message)")
-        self.writer.beginIf(GLC.ArrayContains("out_dict", "self.output[target]"))
-        self.writer.add(GLC.FunctionCall("out_dict[self.output[target]].append", ["(source, target, message)"]))
-        self.writer.endIf()
-        self.writer.beginElse()
-        self.writer.addAssignment(f"out_dict[self.output[target]]", "[(source, target, message)]")
-        self.writer.endElse()
-        self.writer.endForLoopIterateArray()
-
-        self.writer.add(GLC.ReturnStatement("out_dict"))
-        self.writer.endMethodBody()
-        self.writer.endMethod()
-
-        self.writer.beginMethod("timeAdvance")
-        self.writer.beginMethodBody()
-        self.writer.beginIf((GLC.SelfProperty("State.to_send")))
-        self.writer.add(GLC.ReturnStatement("0"))
-        self.writer.endIf()
-        self.writer.add(GLC.ReturnStatement("INFINITY"))
-        self.writer.endMethodBody()
-        self.writer.endMethod()
         self.writer.endClass()
 
         ################################
@@ -389,30 +341,20 @@ class DEVSGenerator(Visitor):
 
     # CLASS -- CONSTRUCTOR
     def visit_Constructor(self, constructor):
+        ################################
+        # Constructor of State Object
+        ################################
+
         self.writer.beginConstructor()
         self.writer.addFormalParameter("name")
 
         self.writer.beginMethodBody()  # constructor body
-
-
-        self.writer.beginSuperClassConstructorCall("AtomicDEVS")
-        self.writer.addActualParameter("name")
-        self.writer.endSuperClassConstructorCall()
-
         self.writer.beginSuperClassConstructorCall("ObjectManagerBase")
+        self.writer.addActualParameter("name")
         self.writer.endSuperClassConstructorCall()
 
-        self.writer.addAssignment(GLC.SelfProperty("elapsed"), "0")
-        self.writer.addAssignment(GLC.SelfProperty("name"), GLC.String(constructor.name))
-
-        self.writer.addAssignment(GLC.SelfProperty("obj_manager_in"),
-                                  GLC.FunctionCall(GLC.SelfProperty("addInPort"), [GLC.String("obj_manager_in")]))
-        self.writer.addAssignment(GLC.SelfProperty("obj_manager_out"),
-                                  GLC.FunctionCall(GLC.SelfProperty("addOutPort"), [GLC.String("obj_manager_out")]))
-
         self.writer.addAssignment(GLC.SelfProperty("input"), GLC.FunctionCall(GLC.SelfProperty("addInPort"), [GLC.String("input")]))
 
-        self.writer.addAssignment(GLC.SelfProperty("outputs"), "{}")
         for association in constructor.parent_class.associations:
             self.writer.addAssignment(GLC.SelfProperty(f"outputs[\"{association.name}\"]"),
                                       GLC.FunctionCall(GLC.SelfProperty("addOutPort"), [GLC.String(association.name)]))
@@ -431,8 +373,6 @@ class DEVSGenerator(Visitor):
             self.writer.addAssignment("self.instances[self.next_instance]", f"{constructor.parent_class.name}Instance(self)")
             self.writer.addAssignment("self.next_instance", "self.next_instance + 1")
 
-        self.writer.addAssignment(GLC.SelfProperty("next_time"), "INFINITY")
-
         self.writer.endMethodBody()
         self.writer.endConstructor()
 

+ 40 - 4
sccd/runtime/DEVS_statecharts_core.py

@@ -675,10 +675,17 @@ class SmallStepState(object):
         return len(self.candidates) > 0
 
 class ObjectManagerBase(AtomicDEVS):    
-    def __init__(self):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        self.elapsed = 0
+        self.obj_manager_in = self.addInPort("obj_manager_in")
+        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        self.outputs = {}
+        self.next_time = INFINITY
+        
+        
+        
         self.input_queue = EventQueue()
-        #self.controller = controller
-
         self.simulated_time = 0
         self.to_send = []
 
@@ -1122,4 +1129,33 @@ class ObjectManagerBase(AtomicDEVS):
         return to_dict
     
     def timeAdvance(self):
-        return self.next_time
+        return self.next_time
+
+class TheObjectManager(AtomicDEVS):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        self.output = {}
+    
+    def extTransition(self, inputs):
+        all_inputs = inputs[self.input]
+        for input in all_inputs:
+            self.State.to_send.append(input)
+        return self.State
+    
+    def intTransition(self):
+        self.State.to_send = []
+        return self.State
+    
+    def outputFnc(self):
+        out_dict = {}
+        for (source, target, message) in self.State.to_send:
+            if self.output[target] in out_dict:
+                out_dict[self.output[target]].append((source, target, message))
+            else:
+                out_dict[self.output[target]] = [(source, target, message)]
+        return out_dict
+    
+    def timeAdvance(self):
+        if self.State.to_send:
+            return 0
+        return INFINITY