浏览代码

Fixed some problems with copying attributes during RAMification

Yentl Van Tendeloo 8 年之前
父节点
当前提交
390004f619
共有 3 个文件被更改,包括 345 次插入13 次删除
  1. 25 12
      bootstrap/ramify.alc
  2. 319 0
      integration/test_mvc.py
  3. 1 1
      scripts/run_local_modelverse.py

+ 25 - 12
bootstrap/ramify.alc

@@ -24,6 +24,8 @@ Element function ramify(model : Element):
 	old_m = model["model"]
 	mm = new_model["metamodel"]["model"]
 
+	log("Metamodel has elements: " + set_to_string(dict_keys(model["metamodel"]["model"])))
+
 	// Add in some primitives
 	instantiate_node(new_model, "SimpleAttribute", "Natural")
 	instantiate_attribute(new_model, "Natural", "constraint", constraint_Natural)
@@ -106,6 +108,9 @@ Element function ramify(model : Element):
 	Element masked_attributes
 	Element copied_attributes
 
+	Integer i
+	Integer cnt
+
 	masked_attributes = create_node()
 	set_add(masked_attributes, "constraint")
 	set_add(masked_attributes, "lower_cardinality")
@@ -130,6 +135,16 @@ Element function ramify(model : Element):
 			instantiate_link(new_model, "Inheritance", "", "Pre_" + key, "PreElement")
 			instantiate_link(new_model, "Inheritance", "", "Post_" + key, "PostElement")
 
+			i = 0
+			cnt = read_nr_out(copied_attributes)
+			while (i < cnt):
+				attr_name = read_edge_dst(read_out(copied_attributes, i))
+				if (element_neq(read_attribute(old_m, key, attr_name), read_root())):
+					// Attribute was defined, so reassign in both LHS and RHS
+					instantiate_attribute(new_model, "Pre_" + key, attr_name, read_attribute(old_m, key, attr_name))
+					instantiate_attribute(new_model, "Post_" + key, attr_name, read_attribute(old_m, key, attr_name))
+				i = i + 1
+
 		elif (type_name == "AttributeLink"):
 			// Got an attribute, so find out the source and name
 			old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
@@ -163,6 +178,16 @@ Element function ramify(model : Element):
 				// Queue for later
 				list_append(keys, key)
 				
+			i = 0
+			cnt = read_nr_out(copied_attributes)
+			while (i < cnt):
+				attr_name = read_edge_dst(read_out(copied_attributes, i))
+				if (element_neq(read_attribute(old_m, key, attr_name), read_root())):
+					// Attribute was defined, so reassign in both LHS and RHS
+					instantiate_attribute(new_model, "Pre_" + key, attr_name, read_attribute(old_m, key, attr_name))
+					instantiate_attribute(new_model, "Post_" + key, attr_name, read_attribute(old_m, key, attr_name))
+				i = i + 1
+
 		elif (type_name == "Inheritance"):
 			old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
 			old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
@@ -174,18 +199,6 @@ Element function ramify(model : Element):
 				// Queue for later
 				list_append(keys, key)
 
-		elif (bool_not(has_value(entry))):
-			type_name = read_type(model, key)
-			// Primitive values themselves are not copied, so skip that here
-
-			attr_name = read_attribute(model, type_name, "name")
-			if (is_nominal_instance(model["metamodel"], type_name, "Attribute")):
-				old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
-
-				if (set_in(copied_attributes, attr_name)):
-					instantiate_attribute(new_model, "Pre_" + old_source, attr_name, read_attribute(model, old_source, attr_name))
-					instantiate_attribute(new_model, "Post_" + old_source, attr_name, read_attribute(model, old_source, attr_name))
-
 	// Define schedule over these elements
 
 	//  Class Entry {}

+ 319 - 0
integration/test_mvc.py

@@ -1468,6 +1468,325 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
             ]))
 
+    def test_transform_add_MANUAL_pn_simulate(self):
+        self.assertTrue(run_file(all_files,
+            [ "root", "root", "root", 
+                "model_add",
+                    "SimpleClassDiagrams",
+                    "PetriNets",
+                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
+                "model_add",
+                    "SimpleClassDiagrams",
+                    "PetriNets_Runtime",
+                    ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
+                "model_add",
+                    "PetriNets",
+                    "my_pn",
+                    ] + get_model_constructor(open("integration/code/pn_design_model.mvc", "r").read()) + [
+                "model_list",
+                "transformation_add_MT_language",
+                    "PetriNets_Runtime",
+                    "PetriNets",
+                    "",
+                    "PetriNets_RAM",
+                "model_list",
+                "model_modify",
+                    "__merged_PetriNets_RAM",
+                        "instantiate",
+                            "Association",
+                            "D2R_PlaceLink",
+                            "PetriNets/Place",
+                            "PetriNets_Runtime/Place",
+                        "instantiate",
+                            "Association",
+                            "D2R_TransitionLink",
+                            "PetriNets/Transition",
+                            "PetriNets_Runtime/Transition",
+                        "instantiate",
+                            "Association",
+                            "R2D_PlaceLink",
+                            "PetriNets_Runtime/Place",
+                            "PetriNets/Place",
+                        "instantiate",
+                            "Association",
+                            "R2D_TransitionLink",
+                            "PetriNets_Runtime/Transition",
+                            "PetriNets/Transition",
+                        "exit",
+                "transformation_RAMify",
+                    "__merged_PetriNets_RAM",
+                    "PetriNets_RAM",
+                "transformation_add_MANUAL",
+                    "PetriNets",
+                    "",
+                    "PetriNets_Runtime",
+                    "",
+                    "pn_design_to_runtime",
+                "transformation_add_MT",
+                    "PetriNets_RAM",
+                    "PetriNets_Runtime",
+                    "",
+                    "PetriNets",
+                    "",
+                    "pn_runtime_to_design",
+                    ] + get_model_constructor(open("integration/code/pn_runtime_to_design.mvc", "r").read()) + [
+                "transformation_add_MT",
+                    "PetriNets_RAM",
+                    "PetriNets_Runtime",
+                    "",
+                    "PetriNets_Runtime",
+                    "",
+                    "pn_step",
+                    ] + get_model_constructor(open("integration/code/pn_simulate.mvc", "r").read()) + [
+                "transformation_add_MT",
+                    "PetriNets_RAM",
+                    "PetriNets",
+                    "",
+                    "",
+                    "pn_print",
+                    ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
+                "model_list",
+                "transformation_list",
+                "transformation_execute",
+                "pn_print",
+                "my_pn",
+                "transformation_execute",
+                "pn_design_to_runtime",
+                "my_pn",
+                "my_pn_runtime",
+                "nice_list",
+                "instantiate", "PetriNets_Runtime/Place", "p1",
+                "add_attr", "p1", "tokens", 1,
+                "add_attr", "p1", "name", "p1",
+                "instantiate", "PetriNets_Runtime/Place", "p2",
+                "add_attr", "p2", "tokens", 2,
+                "add_attr", "p2", "name", "p2",
+                "instantiate", "PetriNets_Runtime/Place", "p3",
+                "add_attr", "p3", "tokens", 3,
+                "add_attr", "p3", "name", "p3",
+                "instantiate", "PetriNets_Runtime/Transition", "t1",
+                "add_attr", "t1", "name", "t1",
+                "instantiate", "PetriNets_Runtime/P2T", "p2t1", "p1", "t1",
+                "add_attr", "p2t1", "weight", 1,
+                "instantiate", "PetriNets_Runtime/P2T", "p2t2", "p2", "t1",
+                "add_attr", "p2t2", "weight", 1,
+                "instantiate", "PetriNets_Runtime/T2P", "t2p", "t1", "p3",
+                "add_attr", "t2p", "weight", 2,
+                "nice_list",
+                "exit",
+                "transformation_execute",
+                "pn_step",
+                "my_pn_runtime",
+                "my_pn_runtime",
+                "transformation_execute",
+                "pn_runtime_to_design",
+                "my_pn_runtime",
+                "my_pn",
+                "transformation_execute",
+                "pn_print",
+                "my_pn",
+            ],
+
+            [   # bootup phase
+                "Desired username for admin user?",
+                "Desired password for admin user?",
+                "Please repeat the password",
+                "Passwords match!",
+                "Welcome to the Model Management Interface v2.0!",
+                "Use the 'help' command for a list of possible commands",
+                "Ready for command...",
+                # model_add
+                "Creating new model!",
+                "Model type?",
+                "Model name?",
+                "Waiting for model constructors...",
+                "Model upload success!",
+                "Ready for command...",
+                # model_add
+                "Creating new model!",
+                "Model type?",
+                "Model name?",
+                "Waiting for model constructors...",
+                "Model upload success!",
+                "Ready for command...",
+                # model_add
+                "Creating new model!",
+                "Model type?",
+                "Model name?",
+                "Waiting for model constructors...",
+                "Model upload success!",
+                "Ready for command...",
+                # model_list
+                set(["  SimpleClassDiagrams : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
+                     "  CoreFormalism : SimpleClassDiagrams",
+                     "  ManualOperation : SimpleClassDiagrams",
+                     "  PetriNets : SimpleClassDiagrams",
+                     "  my_pn : PetriNets",
+                     "  PetriNets_Runtime : SimpleClassDiagrams",
+                     "  core : CoreFormalism"]),
+                "Ready for command...",
+                # transformation_add_MT_language
+                "Formalisms to include (terminate with empty string)?",
+                "Name of the RAMified transformation metamodel?",
+                "Ready for command...",
+                # model_list
+                set(["  SimpleClassDiagrams : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
+                     "  CoreFormalism : SimpleClassDiagrams",
+                     "  PetriNets_Runtime : SimpleClassDiagrams",
+                     "  ManualOperation : SimpleClassDiagrams",
+                     "  PetriNets : SimpleClassDiagrams",
+                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
+                     "  PetriNets_RAM : SimpleClassDiagrams",
+                     "  my_pn : PetriNets",
+                     "  core : CoreFormalism"]),
+                "Ready for command...",
+                # model_modify
+                "Which model do you want to modify?",
+                "Model loaded, ready for commands!",
+                "Use 'help' command for a list of possible commands",
+                "Please give your command.",
+                # instantiate 1
+                "Type to instantiate?",
+                "Name of new element?",
+                "Source name?",
+                "Destination name?",
+                "Instantiation successful!",
+                "Please give your command.",
+                # instantiate 2
+                "Type to instantiate?",
+                "Name of new element?",
+                "Source name?",
+                "Destination name?",
+                "Instantiation successful!",
+                "Please give your command.",
+                # instantiate 3
+                "Type to instantiate?",
+                "Name of new element?",
+                "Source name?",
+                "Destination name?",
+                "Instantiation successful!",
+                "Please give your command.",
+                # instantiate 4
+                "Type to instantiate?",
+                "Name of new element?",
+                "Source name?",
+                "Destination name?",
+                "Instantiation successful!",
+                "Please give your command.",
+                "Ready for command...",
+                # transformation_RAMify
+                "Which metamodel do you want to RAMify?",
+                "Where do you want to store the RAMified metamodel?",
+                "Ready for command...",
+                # transformation_add_MANUAL
+                "Which metamodels do you want to use as source for the manual operation (empty string to finish)?",
+                "Model added as source",
+                "Which metamodels do you want to use as target for the manual operation (empty string to finish)?",
+                "Model added as target",
+                "Name of Manual operation model?",
+                "Ready for command...",
+                # transformation_add_MT
+                "RAMified metamodel to use?",
+                "Supported metamodels:",
+                set(["  PetriNets",
+                     "  PetriNets_Runtime",
+                    ]),
+                "",
+                "Which ones do you want to use as source (empty string to finish)?",
+                "Model added as source",
+                "Which ones do you want to use as target (empty string to finish)?",
+                "Model added as target",
+                "Name of new transformation?",
+                "Waiting for model constructors...",
+                "Ready for command...",
+                # transformation_add_MT
+                "RAMified metamodel to use?",
+                "Supported metamodels:",
+                set(["  PetriNets",
+                     "  PetriNets_Runtime",
+                    ]),
+                "",
+                "Which ones do you want to use as source (empty string to finish)?",
+                "Model added as source",
+                "Which ones do you want to use as target (empty string to finish)?",
+                "Model added as target",
+                "Name of new transformation?",
+                "Waiting for model constructors...",
+                "Ready for command...",
+                # transformation_add_MT
+                "RAMified metamodel to use?",
+                "Supported metamodels:",
+                set(["  PetriNets",
+                     "  PetriNets_Runtime",
+                    ]),
+                "",
+                "Which ones do you want to use as source (empty string to finish)?",
+                "Model added as source",
+                "Which ones do you want to use as target (empty string to finish)?",
+                "Name of new transformation?",
+                "Waiting for model constructors...",
+                "Ready for command...",
+                # model_list
+                set(["  SimpleClassDiagrams : SimpleClassDiagrams",
+                     "  CoreFormalism : SimpleClassDiagrams",
+                     "  PetriNets_Runtime : SimpleClassDiagrams",
+                     "  PetriNets : SimpleClassDiagrams",
+                     "  pn_print : PetriNets_RAM",
+                     "  pn_design_to_runtime : PetriNets_RAM",
+                     "  ManualOperation : SimpleClassDiagrams",
+                     "  pn_runtime_to_design : PetriNets_RAM",
+                     "  pn_step : PetriNets_RAM",
+                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
+                     "  PetriNets_RAM : SimpleClassDiagrams",
+                     "  my_pn : PetriNets",
+                     "  ActionLanguage : SimpleClassDiagrams",
+                     "  core : CoreFormalism"]),
+                "Ready for command...",
+                # transformation_list
+                set(["[ModelTransformation] pn_print : PetriNets_RAM",
+                     "[ModelTransformation] pn_design_to_runtime : PetriNets_RAM",
+                     "[ModelTransformation] pn_runtime_to_design : PetriNets_RAM",
+                     "[ModelTransformation] pn_step : PetriNets_RAM"]),
+                "Ready for command...",
+                # transformation_execute (pn_print)
+                "Which transformation do you want to execute?",
+                "Which model to bind for source element PetriNets",
+                set(['"p1" --> 1',
+                     '"p2" --> 2',
+                     '"p3" --> 3',
+                    ]),
+                "Transformation executed with result: True",
+                "Ready for command...",
+                # transformation_execute (pn_design_to_runtime)
+                "Which transformation do you want to execute?",
+                "Which model to bind for source element PetriNets",
+                "Which model to create for target element PetriNets_Runtime",
+                "Transformation executed with result: True",
+                "Ready for command...",
+                # transformation_execute (pn_step)
+                "Which transformation do you want to execute?",
+                "Which model to bind for source element PetriNets_Runtime",
+                "Which model to create for target element PetriNets_Runtime",
+                "Transformation executed with result: True",
+                "Ready for command...",
+                # transformation_execute (pn_runtime_to_design)
+                "Which transformation do you want to execute?",
+                "Which model to bind for source element PetriNets_Runtime",
+                "Which model to create for target element PetriNets",
+                "Transformation executed with result: True",
+                "Ready for command...",
+                # transformation_execute (pn_print)
+                "Which transformation do you want to execute?",
+                "Which model to bind for source element PetriNets",
+                set(['"p1" --> 0',
+                     '"p2" --> 1',
+                     '"p3" --> 5',
+                    ]),
+                "Transformation executed with result: True",
+                "Ready for command...",
+            ]))
     """
     def test_powerwindow(self):
         self.assertTrue(run_file(all_files,

+ 1 - 1
scripts/run_local_modelverse.py

@@ -10,4 +10,4 @@ else:
     # There's no need to specify `--kernel=baseline-jit` here, because that's the default kernel.
     # Also, specifying a kernel here breaks the performance tests.
     subprocess.call([sys.executable, "run_mvk_server.py"] + sys.argv[1:], cwd="hybrid_server")
-    # subprocess.call([sys.executable, "run_mvk_server.py"] + sys.argv[1:] + ["--kernel=legacy-interpreter"], cwd="hybrid_server")
+    #subprocess.call([sys.executable, "run_mvk_server.py"] + sys.argv[1:] + ["--kernel=legacy-interpreter"], cwd="hybrid_server")