Browse Source

Updated model to make it compilable

Yentl Van Tendeloo 7 years ago
parent
commit
eef98b85c4

+ 4 - 2
models/cbd_merge.alc

@@ -1,6 +1,7 @@
 include "primitives.alh"
 include "modelling.alh"
 include "object_operations.alh"
+include "conformance_scd.alh"
 
 String function map_P2F(model : Element, name : String):
 	return readAssociationDestination(model, set_pop(allAssociationDestinations(model, name, "P2F_block")))!
@@ -9,6 +10,7 @@ Boolean function main(model : Element):
 	Element all_blocks
 	String element_name
 	Float current_time
+	String time_block
 
 	all_blocks = allInstances(model, "PartialRuntime/Block")
 	while (set_len(all_blocks) > 0):
@@ -19,11 +21,11 @@ Boolean function main(model : Element):
                 instantiate_attribute(model, element_name, "last_in", read_attribute(model, map_P2F(model, element_name), "last_in"))
             if (is_nominal_instance(model, element_name, "IntegratorBlock")):
                 instantiate_attribute(model, element_name, "last_out", read_attribute(model, map_P2F(model, element_name), "last_out"))
-            instantiate_attribute(model, element_name, "signal", read_attribute(model, map_P2F(model, element_name)))
+            instantiate_attribute(model, element_name, "signal", read_attribute(model, map_P2F(model, element_name), "signal"))
 		else:
 			// Element doesn't exist, so initialize with 0.0
             instantiate_attribute(model, element_name, "signal", 0.0)
-			instantiate_edge(model, "P2F_block", "", element_name, element_name)
+			instantiate_link(model, "P2F_block", "", element_name, element_name)
 
 	if (set_len(allInstances(model, "FullRuntime/Time")) > 0):
 		// Time already exists, so copy the value

+ 5 - 0
models/cbd_restartSim.alc

@@ -0,0 +1,5 @@
+include "primitives.alh"
+
+Boolean function main(model : Element):
+	log("Restarting simulator (TODO")
+	return True!

+ 27 - 31
models/cbd_simulate.alc

@@ -92,7 +92,7 @@ Void function strongconnect(v : String, values : Element):
 
 	dict_overwrite(values["indices"], v, values["index"])
 	dict_overwrite(values["lowlink"], v, values["index"])
-	dict_overwrite(values, "index", cast_s2i(cast_v2s(values["index"])) + 1)
+	dict_overwrite(values, "index", cast_integer(values["index"]) + 1)
 
 	list_append(values["S"], v)
 	dict_overwrite(values["onStack"], v, True)
@@ -207,10 +207,10 @@ Boolean function solve_scc(model : Element, scc : Element):
 			else:
 				// A constant, which we can assume is already computed and thus usable
 				if (blocktype == "AdditionBlock"):
-					constant = constant + v2f(read_attribute(model, selected, "signal"))
+					constant = constant + cast_float(read_attribute(model, selected, "signal"))
 					dict_overwrite(m[i], read_nr_out(scc), constant)
 				elif (blocktype == "MultiplyBlock"):
-					constant = constant * v2f(read_attribute(model, selected, "signal"))
+					constant = constant * cast_float(read_attribute(model, selected, "signal"))
 					// Not written to constant part, as multiplies a variable
 
 				// Any other block is impossible:
@@ -238,7 +238,7 @@ Boolean function solve_scc(model : Element, scc : Element):
 		block = scc[i]
 		unset_attribute(model, block, "signal")
 		instantiate_attribute(model, block, "signal", m[i][read_nr_out(scc)])
-		log((("Solved " + block) + " to ") + cast_v2s(m[i][read_nr_out(scc)]))
+		log((("Solved " + block) + " to ") + cast_string(m[i][read_nr_out(scc)]))
 		i = i + 1
 
 	return True!
@@ -270,7 +270,7 @@ Void function step_simulation(model : Element, schedule : Element):
 	delta_t = 0.1
 
 	memory_blocks = create_node()
-	output("SIM_TIME " + cast_v2s(read_attribute(model, time, "current_time")))
+	output("SIM_TIME " + cast_string(read_attribute(model, time, "current_time")))
 	i = 0
 	while (i < read_nr_out(schedule)):
 		scc = list_read(schedule, i)
@@ -293,25 +293,25 @@ Void function step_simulation(model : Element, schedule : Element):
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = signal + cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+					signal = signal + cast_float(read_attribute(model, selected, "signal"))
 			elif (blocktype == "MultiplyBlock"):
 				signal = 1.0
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = signal * cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+					signal = signal * cast_float(read_attribute(model, selected, "signal"))
 			elif (blocktype == "NegatorBlock"):
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				signal = 0.0
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = float_neg(cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+					signal = float_neg(cast_float(read_attribute(model, selected, "signal")))
 			elif (blocktype == "InverseBlock"):
 				signal = 0.0
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = float_division(1.0, cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+					signal = float_division(1.0, cast_float(read_attribute(model, selected, "signal")))
 			elif (blocktype == "DelayBlock"):
 				signal = 0.0
 				if (element_eq(read_attribute(model, block, "last_in"), read_root())):
@@ -319,7 +319,7 @@ Void function step_simulation(model : Element, schedule : Element):
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+						signal = cast_float(read_attribute(model, selected, "signal"))
 				else:
 					signal = read_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_in")
@@ -330,9 +330,9 @@ Void function step_simulation(model : Element, schedule : Element):
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+						signal = cast_float(read_attribute(model, selected, "signal"))
 				else:
-					signal = cast_s2f(cast_v2s(read_attribute(model, block, "last_in"))) + (delta_t * cast_s2f(cast_v2s(read_attribute(model, block, "last_out"))))
+					signal = cast_float(read_attribute(model, block, "last_in")) + (delta_t * cast_float(read_attribute(model, block, "last_out")))
 					unset_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_out")
 				instantiate_attribute(model, block, "last_out", signal)
@@ -343,20 +343,20 @@ Void function step_simulation(model : Element, schedule : Element):
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+						signal = cast_float(read_attribute(model, selected, "signal"))
 				else:
 					incoming = allIncomingAssociationInstances(model, block, "Link")
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = (cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))) - cast_s2f(cast_v2s(read_attribute(model, block, "last_in")))) / delta_t
+						signal = (cast_float(read_attribute(model, selected, "signal")) - cast_float(read_attribute(model, block, "last_in"))) / delta_t
 					unset_attribute(model, block, "last_in")
 				set_add(memory_blocks, block)
 			elif (blocktype == "ProbeBlock"):
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
-					output((("SIM_PROBE " + cast_v2s(read_attribute(model, block, "name"))) + " ") + cast_v2s(signal))
+					signal = cast_float(read_attribute(model, selected, "signal"))
+					output((("SIM_PROBE " + cast_string(read_attribute(model, block, "name"))) + " ") + cast_string(signal))
 
 			unset_attribute(model, block, "signal")
 			instantiate_attribute(model, block, "signal", signal)
@@ -368,19 +368,16 @@ Void function step_simulation(model : Element, schedule : Element):
 		incoming = allIncomingAssociationInstances(model, block, "Link")
 		while (read_nr_out(incoming) > 0):
 			selected = readAssociationSource(model, set_pop(incoming))
-			instantiate_attribute(model, block, "last_in", cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+			instantiate_attribute(model, block, "last_in", cast_float(read_attribute(model, selected, "signal")))
 
 	// Increase simulation time
 	Float new_time
-	new_time = cast_s2f(cast_v2s(read_attribute(model, time, "current_time"))) + delta_t
+	new_time = cast_float(read_attribute(model, time, "current_time")) + delta_t
 	unset_attribute(model, time, "current_time")
 	instantiate_attribute(model, time, "current_time", new_time)
 
 	return !
 
-Float function v2f(i : Element):
-	return cast_s2f(cast_v2s(i))!
-
 Void function eliminateGaussJordan(m : Element):
 	Integer i
 	Integer j
@@ -395,7 +392,7 @@ Void function eliminateGaussJordan(m : Element):
 
 	while (i < read_nr_out(m)):
 		// Make sure pivot m[i][j] != 0, swapping if necessary
-		while (v2f(m[i][j]) == 0.0):
+		while (cast_float(m[i][j]) == 0.0):
 			// Is zero, so find row which is not zero
 			f = i + 1
 			searching = True
@@ -405,13 +402,13 @@ Void function eliminateGaussJordan(m : Element):
 					searching = False
 					j = j + 1
 				else:
-					if (v2f(m[f][j]) == 0.0):
+					if (cast_float(m[f][j]) == 0.0):
 						// Also zero, so continue
 						f = f + 1
 					else:
 						// Found non-zero, so swap row
-						t = v2f(m[f])
-						dict_overwrite(m, f, v2f(m[i]))
+						t = cast_float(m[f])
+						dict_overwrite(m, f, cast_float(m[i]))
 						dict_overwrite(m, i, t)
 						searching = False
 			// If we have increased j, we will just start the loop again (possibly), as m[i][j] might be zero again
@@ -419,9 +416,9 @@ Void function eliminateGaussJordan(m : Element):
 		// Pivot in m[i][j] guaranteed to not be 0
 		// Now divide complete row by value of m[i][j] to make it equal 1
 		f = j
-		divisor = v2f(m[i][j])
+		divisor = cast_float(m[i][j])
 		while (f < read_nr_out(m[i])):
-			dict_overwrite(m[i], f, float_division(v2f(m[i][f]), divisor))
+			dict_overwrite(m[i], f, float_division(cast_float(m[i][f]), divisor))
 			f = f + 1
 
 		// Eliminate all rows in the j-th column, except the i-th row
@@ -429,9 +426,9 @@ Void function eliminateGaussJordan(m : Element):
 		while (f < read_nr_out(m)):
 			if (bool_not(f == i)):
 				g = j
-				divisor = v2f(m[f][j])
+				divisor = cast_float(m[f][j])
 				while (g < read_nr_out(m[f])):
-					dict_overwrite(m[f], g, v2f(m[f][g]) - (divisor * v2f(m[i][g])))
+					dict_overwrite(m[f], g, cast_float(m[f][g]) - (divisor * cast_float(m[i][g])))
 					g = g + 1
 			f = f + 1
 
@@ -451,8 +448,7 @@ String function matrix2string(m : Element):
 	while (i < read_nr_out(m)):
 		j = 0
 		while (j < read_nr_out(m[i])):
-			result = result + cast_v2s(m[i][j])
-			result = result + ", "
+			result = result + cast_string(m[i][j]) + ", "
 			j = j + 1
 		i = i + 1
 		result = result + "\n"

+ 3 - 2
models/cbd_toRuntime.alc

@@ -10,6 +10,7 @@ Boolean function main(model : Element):
 	String element_name
 	String new_element_name
 	String mm_type_name
+	Element all_links
 
 	all_blocks = allInstances(model, "Design/Block")
 	while (set_len(all_blocks) > 0):
@@ -19,7 +20,7 @@ Boolean function main(model : Element):
 		if (set_len(allOutgoingAssociationInstances(model, element_name, "D2P_block")) == 0):
 			// New design element, so create in partial runtime model as well
 			new_element_name = instantiate_node(model, mm_type_name, "")
-			instantiate_edge(model, "D2P_block", element_name, new_element_name)
+			instantiate_link(model, "D2P_block", "", element_name, new_element_name)
 
 		// Always update the value of attributes of PartialRuntime
 		new_element_name = set_pop(readAssociationDestination(model, set_pop(allOutgoingAssociationInstances(model, element_name, "D2P_block"))))
@@ -33,7 +34,7 @@ Boolean function main(model : Element):
 		element_name = set_pop(all_blocks)
 		if (set_len(allIncomingAssociationInstances(model, element_name, "D2P_block")) == 0):
 			// Old partial runtime element, so remove
-			model_delete(model, element_name)
+			model_delete_element(model, element_name)
 
 	// Delete all existing links
 	all_links = allInstances(model, "PartialRuntime/Link")

+ 33 - 8
models/pm_live_CBD.mvc

@@ -23,6 +23,16 @@ Exec merge {
 Fork fork1 {}
 Fork fork2 {}
 
+Data trace_Design2Partial {
+    name = "trace_D2P"
+    type = "formalisms/Tracability"
+}
+
+Data trace_Partial2Runtime {
+    name = "trace_P2R"
+    type = "formalisms/Tracability"
+}
+
 Data design_model {
     name = "design_model"
     type = "formalisms/CBD/Design_MM"
@@ -49,29 +59,44 @@ Next (simulate, merge) {}
 Next (merge, simulate) {}
 
 Consumes (edit, design_model) {
-    name = "DesignModel"
+    name = "Design"
 }
 Produces (edit, design_model) {
-    name = "DesignModel"
+    name = "Design"
 }
 
 Consumes (toRuntime, design_model) {
-    name = "DesignModel"
+    name = "Design"
+}
+Consumes (toRuntime, trace_Design2Partial) {
+    name = "__traceability"
 }
 Produces (toRuntime, partial_runtime_model) {
-    name = "PartialRuntimeModel"
+    name = "PartialRuntime"
+}
+Produces (toRuntime, trace_Design2Partial) {
+    name = "__traceability"
 }
 
 Consumes (merge, partial_runtime_model) {
-    name = "PartialRuntimeModel"
+    name = "PartialRuntime"
+}
+Consumes (merge, full_runtime_model) {
+    name = "FullRuntime"
+}
+Consumes (merge, trace_Partial2Runtime) {
+    name = "__traceability"
 }
 Produces (merge, full_runtime_model) {
-    name = "FullRuntimeModel"
+    name = "PartialRuntime"
+}
+Produces (merge, trace_Partial2Runtime) {
+    name = "__traceability"
 }
 
 Consumes (simulate, full_runtime_model) {
-    name = "FullRuntimeModel"
+    name = "FullRuntime"
 }
 Produces (simulate, full_runtime_model) {
-    name = "FullRuntimeModel"
+    name = "FullRuntime"
 }

+ 28 - 0
models/upload_models.py

@@ -4,7 +4,34 @@ from modelverse import *
 
 init()
 login("admin", "admin")
+folder_create("formalisms/CBD")
+folder_create("models/CBD")
 
+print("Add design")
+model_add("formalisms/CBD/Design_MM", "formalisms/SimpleClassDiagrams", open("models/cbd_design.mvc", 'r').read())
+print("Add partial")
+model_add("formalisms/CBD/PartialRuntime_MM", "formalisms/SimpleClassDiagrams", open("models/cbd_partial_runtime.mvc", 'r').read())
+print("Add full")
+model_add("formalisms/CBD/FullRuntime_MM", "formalisms/SimpleClassDiagrams", open("models/cbd_runtime.mvc", 'r').read())
+
+print("Add model")
+model_add("models/CBD_spring", "formalisms/CBD/Design_MM", open("models/cbd_spring.mvc", 'r').read())
+
+print("Add transformation edit")
+transformation_add_MANUAL({"Design": "formalisms/CBD/Design_MM"}, {"Design": "formalisms/CBD/Design_MM"}, "models/CBD/edit")
+print("Add transformation toRuntime")
+transformation_add_AL({"Design": "formalisms/CBD/Design_MM"}, {"PartialRuntime": "formalisms/CBD/PartialRuntime_MM"}, "models/CBD/toRuntime", open("models/cbd_toRuntime.alc", 'r').read())
+print("Add transformation merge")
+transformation_add_AL({"PartialRuntime": "formalisms/CBD/PartialRuntime_MM", "FullRuntime": "formalisms/CBD/FullRuntime_MM"}, {"FullRuntime": "formalisms/CBD/FullRuntime_MM"}, "models/CBD/merge", open("models/cbd_merge.alc", 'r').read())
+print("Add transformation simulate")
+transformation_add_AL({"FullRuntime": "formalisms/CBD/FullRuntime_MM"}, {"FullRuntime": "formalisms/CBD/FullRuntime_MM"}, "models/CBD/simulate", open("models/cbd_simulate.alc", 'r').read())
+print("Add transformation restart")
+transformation_add_AL({}, {}, "models/CBD/restartSim", open("models/cbd_restartSim.alc", 'r').read())
+
+print("Add process model")
+model_add("models/live_modelling_CBD", "formalisms/ProcessModel", open("models/pm_live_CBD.mvc", 'r').read())
+
+"""
 model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/plant_PW.mvc", 'r').read())
 model_add("models/plant", "formalisms/PW_Plant", open("models/plant_model.mvc", 'r').read().replace("PW_Plant/", ""))
 model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/requirements.mvc", 'r').read())
@@ -65,3 +92,4 @@ transformation_add_AL({"EPN_Plant": "formalisms/Encapsulated_PetriNet", "EPN_Con
 
 transformation_add_AL({"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, {}, "epn_print", open("models/epn_print.alc").read())
 transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {}, "pn_print", open("models/pn_print.alc").read())
+"""

+ 9 - 0
wrappers/classes/modelverse.xml

@@ -611,6 +611,15 @@
                                         <parameter expr="model"/>
                                     </raise>
                                 </transition>
+
+                                <transition cond="self.expect_response('Waiting for code constructors...')" target="../upload_changes">
+                                    <raise event="result">
+                                        <parameter expr="None"/>
+                                    </raise>
+                                    <raise event="request">
+                                        <parameter expr="self.parameters[3]"/>
+                                    </raise>
+                                </transition>
                             </state>
 
                             <state id="wait_for_user">

+ 5 - 6
wrappers/modelverse.py

@@ -252,13 +252,12 @@ def transformation_add_AL(source_metamodels, target_metamodels, operation_name,
     INPUT("transformation_add_AL", None, [source_metamodels, target_metamodels, operation_name, code, True])
     model = OUTPUT()
 
-    if model is None:
-        # In case the source and target metamodels are empty, the context will be None, indicating that we are finished already (no callbacks allowed)
-        return
+    if model is not None:
+        # In case the source and target metamodels are empty, the model will be None, indicating that we are finished already (no callbacks allowed)
 
-    if callback is not None:
-        __invoke(callback, model)
-    controller.addInput(Event("data_input", "action_in", [None, None]))
+        if callback is not None:
+            __invoke(callback, model)
+        controller.addInput(Event("data_input", "action_in", [None, None]))
 
     return OUTPUT()
 

+ 13 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Wed Nov 15 13:36:26 2017
+Date:   Wed Nov 15 16:03:44 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
@@ -958,6 +958,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0.setTrigger(None)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0_guard)
         self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0)
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"], [self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/upload_changes"]])
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1.setAction(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_exec)
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1.setTrigger(None)
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_guard)
+        self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1)
         
         # transition /initialized/behaviour/operations/store_on_scripted/transformation_add/wait_for_user
         _initialized_behaviour_operations_store_on_scripted_transformation_add_wait_for_user_0 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/wait_for_user"], [self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/upload_changes"]])
@@ -2517,6 +2522,13 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0_guard(self, parameters):
         return self.expect_response_partial('Please edit this model before sending next input: ', pop=False)
     
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [None]))
+        self.raiseInternalEvent(Event("request", None, [self.parameters[3]]))
+    
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_guard(self, parameters):
+        return self.expect_response('Waiting for code constructors...')
+    
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_wait_for_user_0_exec(self, parameters):
         self.inputs[None].pop(0)
         self.raiseInternalEvent(Event("request", None, [True]))