Browse Source

Fixed some parts of the code: at least now some violations are detected
(but don't get resolved...)

Yentl Van Tendeloo 9 years ago
parent
commit
5249d3a690

+ 22 - 10
bootstrap/conformance_scd.alc

@@ -162,40 +162,52 @@ String function conformance_scd(model : Element):
 			Integer upper_val
 			Integer instances
 
-			check_list = selectPossibleIncoming(model, model_name, dict_keys(cardinalities))
+			check_list = selectPossibleOutgoing(model, model_name, dict_keys(cardinalities))
 			while (0 < list_len(check_list)):
+				log("Check cardinalities for " + model_name)
 				check_type = set_pop(check_list)
-				if (dict_in(cardinalities, reverseKeyLookup(metamodel["model"], check_type))):
+				if (dict_in(cardinalities, check_type)):
+					log("Target Got some cardinalities to check!")
 					// Cardinalities defined for this association, so check them
 					lower_val = cardinalities[check_type]["tlc"]
 					upper_val = cardinalities[check_type]["tuc"]
-					instances = list_len(allIncomingAssociationInstances(model, element, check_type))
+					instances = list_len(allOutgoingAssociationInstances(model, model_name, check_type))
+					log("Instances: " + cast_i2s(instances))
 					if (dict_in(cardinalities[check_type], "tlc")):
 						// A lower cardinality was defined at the target
+						log("TLC Compare with " + cast_i2s(instances))
 						if (integer_gt(cardinalities[check_type]["tlc"], instances)):
-							return "Lower cardinality violation for incoming edge at " + model_name
+							return "Lower cardinality violation for outgoing edge at " + model_name
 					if (dict_in(cardinalities[check_type], "tuc")):
 						// An upper cardinality was defined at the target
+						log("TUC Compare with " + cast_i2s(instances))
 						if (integer_gt(cardinalities[check_type]["tuc"], instances)):
-							return "Upper cardinality violation for incoming edge at " + model_name
+							return "Upper cardinality violation for outgoing edge at " + model_name
 
 			// Identical, but for outgoing, and thus for A in the figure
-			check_list = selectPossibleOutgoing(model, model_name, dict_keys(cardinalities))
+			check_list = selectPossibleIncoming(model, model_name, dict_keys(cardinalities))
 			while (0 < list_len(check_list)):
+				log("Check cardinalities for " + model_name)
 				check_type = set_pop(check_list)
-				if (dict_in(cardinalities, reverseKeyLookup(metamodel["model"], check_type))):
+				log(cast_e2s(check_type))
+				if (dict_in(cardinalities, check_type)):
+					log("Source Got some cardinalities to check!")
 					// Cardinalities defined for this association, so check them
 					lower_val = cardinalities[check_type]["slc"]
 					upper_val = cardinalities[check_type]["suc"]
-					instances = list_len(allOutgoingAssociationInstances(model, element, check_type))
+					instances = list_len(allIncomingAssociationInstances(model, model_name, check_type))
+					log("Instances: " + cast_i2s(list_len(instances)))
 					if (dict_in(cardinalities[check_type], "slc")):
 						// A lower cardinality was defined at the source
+						log("SLC Compare with " + cast_i2s(instances))
 						if (integer_gt(cardinalities[check_type]["slc"], instances)):
-							return "Lower cardinality violation for outgoing edge at " + model_name
+							return "Lower cardinality violation for incoming edge at " + model_name
 					if (dict_in(cardinalities[check_type], "suc")):
 						// An upper cardinality was defined at the source
+						log("SUC Compare with " + cast_i2s(instances))
 						if (integer_gt(cardinalities[check_type]["suc"], instances)):
-							return "Upper cardinality violation for outgoing edge at " + model_name
+							return "Upper cardinality violation for incoming edge at " + model_name
+			log("Done for " + model_name)
 
 	// Check multiplicities, if they are defined (optional)
 	Element metamodel_keys

+ 6 - 6
bootstrap/metamodels.alc

@@ -72,16 +72,16 @@ Element function create_metamodels():
 		instantiate_link(pn, "Association", "T2P", "Transition", "Place")
 		instantiate_link(pn, "Association", "Place_tokens", "Place", "Integer")
 		instantiate_attribute(pn, "Place_tokens", "name", "tokens")
-		instantiate_attribute(pn, "Place_tokens", "source_lower_cardinality", 1)
-		instantiate_attribute(pn, "Place_tokens", "source_upper_cardinality", 1)
+		instantiate_attribute(pn, "Place_tokens", "target_lower_cardinality", 1)
+		instantiate_attribute(pn, "Place_tokens", "target_upper_cardinality", 1)
 		instantiate_link(pn, "Association", "P2T_weight", "P2T", "Integer")
 		instantiate_attribute(pn, "P2T_weight", "name", "weight")
-		instantiate_attribute(pn, "P2T_weight", "source_lower_cardinality", 1)
-		instantiate_attribute(pn, "P2T_weight", "source_upper_cardinality", 1)
+		instantiate_attribute(pn, "P2T_weight", "target_lower_cardinality", 1)
+		instantiate_attribute(pn, "P2T_weight", "target_upper_cardinality", 1)
 		instantiate_link(pn, "Association", "T2P_weight", "T2P", "Integer")
 		instantiate_attribute(pn, "T2P_weight", "name", "weight")
-		instantiate_attribute(pn, "T2P_weight", "source_lower_cardinality", 1)
-		instantiate_attribute(pn, "T2P_weight", "source_upper_cardinality", 1)
+		instantiate_attribute(pn, "T2P_weight", "target_lower_cardinality", 1)
+		instantiate_attribute(pn, "T2P_weight", "target_upper_cardinality", 1)
 
 		set_model_constraints(pn, petrinet_constraints)
 		export_node("models/PetriNets", pn)

+ 2 - 2
bootstrap/modelling.alc

@@ -189,7 +189,7 @@ Element function read_attribute(model : Element, element : String, attribute : S
 	Element attr_link
 
 	attr_type = find_attribute_type(model, element, attribute)
-	attr_links = allOutgoingAssociationInstances(model, model["model"][element], model["metamodel"]["model"][attr_type])
+	attr_links = allOutgoingAssociationInstances(model, element, attr_type)
 
 	while (list_len(attr_links) > 0):
 		attr_link = set_pop(attr_links)
@@ -204,7 +204,7 @@ Void function unset_attribute(model : Element, element : String, attribute : Str
 	Element attr_link
 	
 	attr_type = find_attribute_type(model, element, attribute)
-	attr_links = allOutgoingAssociationInstances(model, model["model"][element], model["metamodel"]["model"][attr_type])
+	attr_links = allOutgoingAssociationInstances(model, element, attr_type)
 
 	while (list_len(attr_links) > 0):
 		attr_link = set_pop(attr_links)

+ 18 - 7
bootstrap/object_operations.alc

@@ -41,8 +41,8 @@ Element function selectPossibleIncoming(model : Element, target : String, limit_
 		type = set_pop(limit_set)
 		elem = metamodel["model"][type]
 		if (is_edge(elem)):
-			if (is_nominal_instance(model, model["model"][target], read_edge_src(elem))):
-				set_add(result, elem)
+			if (is_nominal_instance(model, model["model"][target], read_edge_dst(elem))):
+				set_add(result, type)
 	
 	return result
 
@@ -61,14 +61,20 @@ Element function selectPossibleOutgoing(model : Element, source : String, limit_
 		type = set_pop(limit_set)
 		elem = metamodel["model"][type]
 		if (is_edge(elem)):
-			if (is_nominal_instance(model, model["model"][source], read_edge_dst(elem))):
-				set_add(result, elem)
+			if (is_nominal_instance(model, model["model"][source], read_edge_src(elem))):
+				set_add(result, type)
 	
 	return result
 
-Element function allOutgoingAssociationInstances(model : Element, source : Element, assoc : Element):
+Element function allOutgoingAssociationInstances(model : Element, source_name : String, assoc_name : String):
 	// Read out all outgoing edges of the model and select those that are typed by the specified association
 	// TODO for some reason this crashes if allInstances is used!
+
+	Element assoc
+	Element source
+	source = model["model"][source_name]
+	assoc = model["metamodel"]["model"][assoc_name]
+
 	Integer length
 	length = read_nr_out(source)
 
@@ -86,8 +92,13 @@ Element function allOutgoingAssociationInstances(model : Element, source : Eleme
 		counter = counter + 1
 	return result
 
-Element function allIncomingAssociationInstances(model : Element, source : Element, assoc : Element):
+Element function allIncomingAssociationInstances(model : Element, target_name : Element, assoc_name : Element):
 	// Read out all outgoing edges of the model and select those that are typed by the specified association
+	Element assoc
+	Element target 
+	target = model["model"][target_name]
+	assoc = model["metamodel"]["model"][assoc_name]
+
 	Element result
 	result = create_node()
 	Element allinsts
@@ -96,7 +107,7 @@ Element function allIncomingAssociationInstances(model : Element, source : Eleme
 	Element understudy
 	while (0 < read_nr_out(allinsts)):
 		understudy = set_pop(allinsts)
-		if (element_eq(read_edge_dst(understudy), source)):
+		if (element_eq(read_edge_dst(understudy), target)):
 			set_add(result, understudy)
 	return result
 

+ 3 - 3
integration/code/pn_interface.alc

@@ -38,7 +38,7 @@ Element function petrinet_enabled_set(model : Element):
 		enabled = True
 
 		// Find all incoming transitions
-		in_arcs = allIncomingAssociationInstances(model, under_study, model["metamodel"]["model"]["P2T"])
+		in_arcs = allIncomingAssociationInstances(model, reverseKeyLookup(model["model"], under_study), "P2T")
 
 		while (0 < read_nr_out(in_arcs)):
 			arc_under_study = set_pop(in_arcs)
@@ -69,7 +69,7 @@ Element function petrinet_fire(model : Element):
 			Integer new_value
 
 			// Consume tokens
-			workset = allIncomingAssociationInstances(model, transition, model["metamodel"]["model"]["P2T"])
+			workset = allIncomingAssociationInstances(model, reverseKeyLookup(model["model"], transition), "P2T")
 			while (0 < read_nr_out(workset)):
 				working_arc = set_pop(workset)
 				working_place = read_edge_src(working_arc)
@@ -79,7 +79,7 @@ Element function petrinet_fire(model : Element):
 				output((("  " + getName(model, working_place)) + ": ") + cast_i2s(read_attribute(model, getName(model, working_place), "tokens")))
 
 			// Add tokens
-			workset = allOutgoingAssociationInstances(model, transition, model["metamodel"]["model"]["T2P"])
+			workset = allOutgoingAssociationInstances(model, reverseKeyLookup(model["model"], transition), "T2P")
 			while (0 < read_nr_out(workset)):
 				working_arc = set_pop(workset)
 				working_place = read_edge_dst(working_arc)