Parcourir la source

Fix some models

Yentl Van Tendeloo il y a 7 ans
Parent
commit
27e0b0cd77
4 fichiers modifiés avec 24 ajouts et 31 suppressions
  1. 0 1
      models/dtcbd_simple.mvc
  2. 17 28
      models/dtcbd_simulate.alc
  3. 4 1
      models/fsa_simulate.alc
  4. 3 1
      models/live_modelling.py

+ 0 - 1
models/dtcbd_simple.mvc

@@ -15,5 +15,4 @@ InitialCondition (cte_x, delay){}
 Link (cte_x, adder) {}
 Link (adder, y) {}
 Link (adder, neg) {}
-Link (neg, adder) {}
 Link (delay, z) {}

+ 17 - 28
models/dtcbd_simulate.alc

@@ -7,6 +7,7 @@ include "metamodels.alh"
 include "mini_modify.alh"
 
 Boolean function main(model : Element):
+	log("Start DTCBD simulation!")
 	String cmd
 	Boolean running
 	Element schedule_init
@@ -15,16 +16,22 @@ Boolean function main(model : Element):
 	Float current_time
 
 	String time
+	log("Fetching time...")
 	time = set_pop(allInstances(model, "FullRuntime/Time"))
+	log("Time OK")
 	current_time = read_attribute(model, time, "current_time")
+	log("Fetching time now: " + cast_value(current_time))
 
 	schedule_init = create_schedule(model)
+	log("Schedule OK")
 	schedule_run = read_root()
 
 	Element nodes
 	Element inputs
 	String node
+	log("Compute all blocks")
 	nodes = allInstances(model, "FullRuntime/Block")
+	log("Blocks: " + cast_value(set_len(nodes)))
 	inputs = dict_create()
 	while (set_len(nodes) > 0):
 		node = set_pop(nodes)
@@ -40,6 +47,7 @@ Boolean function main(model : Element):
 		current_time = step_simulation(model, schedule, current_time, inputs)
 
 	instantiate_attribute(model, time, "current_time", current_time)
+	log("CLOSE")
 	output("CLOSE")
 	return True!
 
@@ -51,12 +59,15 @@ Element function create_schedule(model : Element):
 	String element_name
 	Element incoming_links
 	Element all_blocks
+	log("Create schedule...")
 
 	nodes = allInstances(model, "FullRuntime/Block")
 	successors = dict_create()
 	predecessors = dict_create()
+	log("Got all instances")
 	while (set_len(nodes) > 0):
 		element_name = set_pop(nodes)
+		log("Loop for " + cast_value(element_name))
 		if (bool_not(dict_in(successors, element_name))):
 			dict_add(successors, element_name, create_node())
 		if (bool_not(dict_in(predecessors, element_name))):
@@ -67,11 +78,6 @@ Element function create_schedule(model : Element):
 				incoming_links = allIncomingAssociationInstances(model, element_name, "FullRuntime/InitialCondition")
 			else:
 				incoming_links = create_node()
-			if (is_nominal_instance(model, element_name, "FullRuntime/DerivatorBlock")):
-				Element new_incoming_links
-				new_incoming_links = allIncomingAssociationInstances(model, element_name, "FullRuntime/Link")
-				while (read_nr_out(new_incoming_links) > 0):
-					list_append(incoming_links, set_pop(new_incoming_links))
 		else:
 			incoming_links = allIncomingAssociationInstances(model, element_name, "FullRuntime/Link")
 
@@ -83,6 +89,7 @@ Element function create_schedule(model : Element):
 			set_add(successors[source], element_name)
 			set_add(predecessors[element_name], source)
 	
+	log("Loop done")
 	Element values
 	values = create_node()
 	dict_add(values, "model", model)
@@ -95,9 +102,12 @@ Element function create_schedule(model : Element):
 	dict_add(values, "predecessors", predecessors)
 	dict_add(values, "SCC", create_node())
 
+	log("Toposort")
 	nodes = get_topolist(values)
 	while (list_len(nodes) > 0):
+		log("Strong connect")
 		strongconnect(list_pop_final(nodes), values)
+	log("OK")
 
 	return values["SCC"]!
 
@@ -308,6 +318,7 @@ Float function step_simulation(model : Element, schedule : Element, time : Float
 
 		if (list_len(scc) > 1):
 			if (bool_not(solve_scc(model, scc))):
+				log("ALGEBRAIC_LOOP")
 				output("ALGEBRAIC_LOOP")
 				return time!
 		else:
@@ -349,33 +360,11 @@ Float function step_simulation(model : Element, schedule : Element, time : Float
 				else:
 					signal = read_attribute(model, block, "last_in")
 				set_add(memory_blocks, block)
-			elif (blocktype == "FullRuntime/IntegratorBlock"):
-				if (bool_not(is_physical_float(read_attribute(model, block, "last_in")))):
-					// No history yet, so use initial values
-					incoming = allAssociationOrigins(model, block, "FullRuntime/InitialCondition")
-					while (set_len(incoming) > 0):
-						selected = set_pop(incoming)
-						signal = cast_float(read_attribute(model, selected, "signal"))
-				else:
-					signal = cast_float(read_attribute(model, block, "last_out")) + (delta_t * cast_float(read_attribute(model, block, "last_in")))
-				instantiate_attribute(model, block, "last_out", signal)
-				set_add(memory_blocks, block)
-			elif (blocktype == "FullRuntime/DerivatorBlock"):
-				if (bool_not(is_physical_float(read_attribute(model, block, "last_in")))):
-					// No history yet, so use initial values
-					incoming = allAssociationOrigins(model, block, "FullRuntime/InitialCondition")
-					while (set_len(incoming) > 0):
-						selected = set_pop(incoming)
-						signal = cast_float(read_attribute(model, selected, "signal"))
-				else:
-					while (set_len(incoming) > 0):
-						selected = set_pop(incoming)
-						signal = (cast_float(read_attribute(model, selected, "signal")) - cast_float(read_attribute(model, block, "last_in"))) / delta_t
-				set_add(memory_blocks, block)
 			elif (blocktype == "FullRuntime/ProbeBlock"):
 				while (set_len(incoming) > 0):
 					signal = cast_float(read_attribute(model, set_pop(incoming), "signal"))
 					output(cast_string(time) + " " + cast_string(read_attribute(model, block, "name")) + " " + cast_string(signal))
+					log(cast_string(time) + " " + cast_string(read_attribute(model, block, "name")) + " " + cast_string(signal))
 
 			instantiate_attribute(model, block, "signal", signal)
 	

+ 4 - 1
models/fsa_simulate.alc

@@ -22,19 +22,22 @@ Boolean function main(model : Element):
 			if (input_value == "__EXIT__"):
 				break!
 
-			transitions = allOutgoingAssociationInstances(model, current_state)
+			transitions = allOutgoingAssociationInstances(model, current_state, "FullRuntime/Transition")
 			while (set_len(transitions) > 0):
 				transition = set_pop(transitions)
 				if (read_attribute(model, transition, "trigger") == input_value):
 					if (element_neq(read_attribute(model, transition, "raise"), read_root())):
+						log(cast_value(time() - start_time) + " ! " + cast_value(read_attribute(model, transition, "raise")))
 						output(cast_value(time() - start_time) + " ! " + cast_value(read_attribute(model, transition, "raise")))
 					instantiate_attribute(model, current_state, "current", False)
 					current_state = readAssociationDestination(model, transition)
 					instantiate_attribute(model, current_state, "current", True)
 					break!
 
+		log(cast_value(time() - start_time) + " : " + cast_value(read_attribute(model, current_state, "name")))
 		output(cast_value(time() - start_time) + " : " + cast_value(read_attribute(model, current_state, "name")))
 		sleep(0.2)
 
+	log("CLOSE")
 	output("CLOSE")
 	return True!

+ 3 - 1
models/live_modelling.py

@@ -29,6 +29,7 @@ transformation_add_AL({}, {}, "models/DTCBD/restartSim", open("models/cbd_restar
 
 model_add("models/live_modelling_DTCBD", "formalisms/ProcessModel", open("models/pm_live_DTCBD.mvc", 'r').read())
 
+"""
 ### live modelling CTCBD
 
 model_add("formalisms/CTCBD/Design_MM", "formalisms/SimpleClassDiagrams", open("models/ctcbd_design.mvc", 'r').read())
@@ -72,8 +73,9 @@ def trace_P2F(model):
     instantiate(model, "Association", ("PartialRuntime/State", "FullRuntime/State"), ID="P2F_state")
 
 transformation_add_AL({"PartialRuntime": "formalisms/FSA/PartialRuntime_MM", "FullRuntime": "formalisms/FSA/FullRuntime_MM"}, {"NewFullRuntime": "formalisms/FSA/FullRuntime_MM"}, "models/FSA/merge", open("models/fsa_merge.alc", 'r').read(), trace_P2F)
-transformation_add_AL({"FullRuntime": "formalisms/FSA/FullRuntime_MM"}, {"FullRuntime": "formalisms/FSA/FullRuntime_MM"}, "models/FSA/simulate", open("models/cbd_simulate.alc", 'r').read())
+transformation_add_AL({"FullRuntime": "formalisms/FSA/FullRuntime_MM"}, {"FullRuntime": "formalisms/FSA/FullRuntime_MM"}, "models/FSA/simulate", open("models/fsa_simulate.alc", 'r').read())
 transformation_add_AL({}, {}, "models/FSA/restartSim", open("models/cbd_restartSim.alc", 'r').read())
 
 model_add("models/live_modelling_FSA", "formalisms/ProcessModel", open("models/pm_live_FSA.mvc", 'r').read())
 
+"""