Browse Source

Minor performance improvements

Yentl Van Tendeloo 7 years ago
parent
commit
6aceea2240
2 changed files with 53 additions and 17 deletions
  1. 34 17
      bootstrap/core_algorithm.alc
  2. 19 0
      kernel/modelverse_kernel/compiled.py

+ 34 - 17
bootstrap/core_algorithm.alc

@@ -110,9 +110,11 @@ Element function get_full_model(model_id : String, metamodel_id : String):
 			dict_add(m, "metamodel", mm)
 
 	if (element_neq(choice, read_root())):
-		if (set_len(allAssociationDestinations(core, choice, "typing")) == 1):
+		Element types
+		types = allAssociationDestinations(core, choice, "typing")
+		if (set_len(types) == 1):
 			// Add the preferred original type mapping
-			set_type_mapping(m, import_node(read_attribute(core, set_pop(allAssociationDestinations(core, choice, "typing")), "location")))
+			set_type_mapping(m, import_node(read_attribute(core, set_pop(types), "location")))
 		else:
 			// Start from scratch
 			new_type_mapping(m)
@@ -639,7 +641,7 @@ Element function execute_operation(operation_id : String, input_models : Element
 	while (set_len(iter) > 0):
 		edge = set_pop(iter)
 		dict_add(output_metamodels, read_attribute(core, edge, "name"), full_name(readAssociationDestination(core, edge)))
-
+	
 	// 1) Find merged metamodel
 
 	exact_type = read_type(core, operation_id)
@@ -835,7 +837,6 @@ Boolean function enact_action(pm : Element, element : String, prefix : String):
 Void function enact_PM(pm : Element, prefix : String):
 	Element worklist
 	String element
-	String start
 	String type
 	Boolean result
 	Element tuple
@@ -1100,6 +1101,12 @@ String function cmd_model_render(model_name : String, mapper_name : String, rend
 	Element out_links
 	String link
 
+	String ID_rendered_M
+	String ID_rendered_MM
+	String ID_SCD
+	String ID_tracability_MM
+	String ID_tracability_M
+
 	model_ID = get_entry_id(model_name)
 
 	if (model_ID != ""):
@@ -1124,24 +1131,33 @@ String function cmd_model_render(model_name : String, mapper_name : String, rend
 						link = set_pop(out_links)
 						dict_add(output_map, read_attribute(core, link, "name"), full_name(readAssociationDestination(core, link)))
 
-					if (get_entry_id(rendered_name) == ""):
+					ID_rendered_MM = get_entry_id(output_map["rendered"])
+					ID_SCD = get_entry_id("formalisms/SimpleClassDiagrams")
+					ID_tracability_MM = get_entry_id("formalisms/Tracability")
+					ID_tracability_M = get_entry_id(tracability_name)
+					ID_rendered_M = get_entry_id(rendered_name)
+
+					if (ID_rendered_M == ""):
 						// Instantiate
 						Element rendered
-						rendered = get_full_model(get_entry_id(output_map["rendered"]), get_entry_id("formalisms/SimpleClassDiagrams"))
+						rendered = get_full_model(ID_rendered_MM, ID_SCD)
 						if (element_eq(rendered, read_root())):
 							return "Rendered metamodel doesn't conform to formalisms/SimpleClassDiagrams"!
 
 						rendered_model = instantiate_model(rendered)
 
-						model_create(rendered_model, rendered_name, get_entry_id(output_map["rendered"]), "Model")
+						model_create(rendered_model, rendered_name, ID_rendered_MM, "Model")
 						
 						// Tracability model won't exist either
-						tracability_model = instantiate_model(get_full_model(get_entry_id("formalisms/Tracability"), get_entry_id("formalisms/SimpleClassDiagrams")))
-						model_create(tracability_model, tracability_name, get_entry_id("formalisms/Tracability"), "Model")
+						tracability_model = instantiate_model(get_full_model(ID_tracability_MM, ID_SCD))
+						model_create(tracability_model, tracability_name, ID_tracability_MM, "Model")
+
+						ID_rendered_M = get_entry_id(rendered_name)
+						ID_tracability_M = get_entry_id(tracability_name)
 
 					else:
 						// Read out tracability model
-						tracability_model = get_full_model(get_entry_id(tracability_name), get_entry_id("formalisms/Tracability"))
+						tracability_model = get_full_model(ID_tracability_M, ID_tracability_MM)
 						if (element_eq(tracability_model, read_root())):
 							return "Tracability model not typed by Tracability metamodel: " + tracability_name!
 
@@ -1149,23 +1165,24 @@ String function cmd_model_render(model_name : String, mapper_name : String, rend
 					result = execute_operation(mapper_ID, inputs, tracability_model)
 
 					// Overwrite the previous rendered model
-					model_overwrite(result["rendered"], get_entry_id(rendered_name), get_entry_id(output_map["rendered"]))
+					model_overwrite(result["rendered"], ID_rendered_M, ID_rendered_MM)
 
 					// Tracability updated in-place
-					model_overwrite(tracability_model, get_entry_id(tracability_name), get_entry_id("formalisms/Tracability"))
-					tracability_model = get_full_model(get_entry_id(tracability_name), get_entry_id("formalisms/Tracability"))
+					model_overwrite(tracability_model, ID_tracability_M, ID_tracability_MM)
 					if (element_eq(tracability_model, read_root())):
 						return "Tracability model not typed by Tracability metamodel: " + tracability_name!
 
 					// Link all information in the megamodel
 					String tr_link
-					tr_link = instantiate_link(core, "tracability", "", get_entry_id(model_name), get_entry_id(rendered_name))
+					tr_link = instantiate_link(core, "tracability", "", get_entry_id(model_name), ID_rendered_M)
 					instantiate_attribute(core, tr_link, "type", "CS_perceptualized")
-					tr_link = instantiate_link(core, "tracability", "", get_entry_id(rendered_name), get_entry_id(mapper_name))
+					tr_link = instantiate_link(core, "tracability", "", ID_rendered_M, get_entry_id(mapper_name))
 					instantiate_attribute(core, tr_link, "type", "CS_mapper")
 
-					// Also output the resulting model
-					return "Success: " + JSON_print(get_full_model(get_entry_id(rendered_name), get_entry_id(output_map["rendered"])))!
+					// Output the resulting model
+					String value
+					value = JSON_print(result["rendered"])
+					return ("Success: " + value) !
 				else:
 					return "Permission denied to model: " + mapper_name!
 			else:

+ 19 - 0
kernel/modelverse_kernel/compiled.py

@@ -254,3 +254,22 @@ def list_pop_final(a, **remainder):
                                  ("RDE", [a, length -1])]
     _, = yield [("DE", [result_edge])]
     raise PrimitiveFinished(result)
+
+def instantiate_node(a, b, c, **remainder):
+    node, dict_entry, typing, name = \
+        yield [("CN", []),
+               ("RD", [a, "model"]),
+               ("RD", [a, "type_mapping"]),
+               ("RV", [c]),
+              ]
+
+    if name == "":
+        name = "__" + str(node)
+        name_node, = yield [("CNV", [name])]
+    else:
+        name_node = c
+
+    yield [("CD", [dict_entry, name, node])]
+    yield [("CD", [typing, name, b])]
+
+    raise PrimitiveFinished(name_node)