Browse Source

Ported all compiled functions (untested) and fixed code generation bugs

Yentl Van Tendeloo 7 years ago
parent
commit
528cf93f65

+ 9 - 0
bootstrap/semi_primitives.alc

@@ -555,6 +555,9 @@ String function spawn(function : Element, arguments : Element):
 	return taskname!
 	return taskname!
 
 
 Element function list_insert(a : Element, b : Element, c : Integer):
 Element function list_insert(a : Element, b : Element, c : Integer):
+	log("ENTER list insert")
+	log("Insert in list at location " + cast_string(c))
+	log("Length " + cast_string(list_len(a)))
 	Integer current
 	Integer current
 	Element prev
 	Element prev
 	Element new_prev
 	Element new_prev
@@ -562,12 +565,18 @@ Element function list_insert(a : Element, b : Element, c : Integer):
 	current = c
 	current = c
 	prev = b
 	prev = b
 
 
+	log("Before while")
 	while (current < list_len(a)):
 	while (current < list_len(a)):
+		log("In current " + cast_string(current) + " out of " + cast_string(list_len(a)))
 		new_prev = list_read(a, current)
 		new_prev = list_read(a, current)
 		dict_delete(a, current)
 		dict_delete(a, current)
 		dict_add_fast(a, current, prev)
 		dict_add_fast(a, current, prev)
 		prev = new_prev
 		prev = new_prev
 		current = current + 1
 		current = current + 1
+		log("End of while")
+	log("After while")
+
+	dict_add_fast(a, current, prev)
 	
 	
 	return a!
 	return a!
 
 

+ 150 - 112
kernel/modelverse_kernel/compiled.py

@@ -3,12 +3,12 @@ import time
 
 
 """
 """
 def get_superclasses(a, b, **remainder):
 def get_superclasses(a, b, **remainder):
-    model, name = a, b
-    model_dict, tm_dict, name_value = yield [("RD", [a, "model"]), 
-                                             ("RD", [a, "type_mapping"]),
-                                             ("RV", [b])]
+    if 'value' not in b:
+        b['value'], = yield [("RV", [b['id']])]
+    model_dict, tm_dict = yield [("RD", [a, "model"]), 
+                                 ("RD", [a, "type_mapping"])]
 
 
-    worklist = set([name_value])
+    worklist = set(b['value'])
     found = set([])
     found = set([])
 
 
     cache_value = {}
     cache_value = {}
@@ -27,9 +27,11 @@ def get_superclasses(a, b, **remainder):
             link = outgoing.pop()
             link = outgoing.pop()
 
 
             # If the link is typed by "Inheritance", we add its destination
             # If the link is typed by "Inheritance", we add its destination
-            link_name_node, = yield [("CALL_ARGS", [reverseKeyLookup, [model_dict, link]])]
-            link_name, = yield [("RV", [link_name_node])]
-            t_edge, = yield [("RD", [tm_dict, link_name])]
+            link_name_node, = yield [("CALL_ARGS", [reverseKeyLookup, [{'id': model_dict}, {'id': link}]])]
+            if "value" not in link_name_node:
+                link_name_node['id'], = yield [("CNV", [link_name_node['value']])]
+
+            t_edge, = yield [("RD", [tm_dict, link_name_node['value']])]
             t_edge, = yield [("RV", [t_edge])]
             t_edge, = yield [("RV", [t_edge])]
             if t_edge == "Inheritance":
             if t_edge == "Inheritance":
                 edge, = yield [("RE", [link])]
                 edge, = yield [("RE", [link])]
@@ -45,17 +47,20 @@ def get_superclasses(a, b, **remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
     yield [("CD", [result, i, result]) for i in found]
     yield [("CD", [result, i, result]) for i in found]
 
 
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def reverseKeyLookupMulti(a, b, **remainder):
 def reverseKeyLookupMulti(a, b, **remainder):
-    edges, b_val, result = yield [("RO", [a]), ("RV", [b]), ("CN", [])]
+    if "value" not in b:
+        b['value'], = yield [("RV", [b['id']])]
+
+    edges, result = yield [("RO", [a['id']]), ("CN", [])]
     expanded_edges = yield [("RE", [i]) for i in edges]
     expanded_edges = yield [("RE", [i]) for i in edges]
     values = yield [("RV", [i[1]]) for i in expanded_edges]
     values = yield [("RV", [i[1]]) for i in expanded_edges]
 
 
     # Keep results in a local Python set, as we want to bundle as many requests as possible
     # Keep results in a local Python set, as we want to bundle as many requests as possible
     todo = set()
     todo = set()
     for i, edge in enumerate(values):
     for i, edge in enumerate(values):
-        if b_val == edge:
+        if b['value'] == edge:
             todo.add(i)
             todo.add(i)
 
 
     outgoings = yield [("RO", [edges[i]]) for i in todo]
     outgoings = yield [("RO", [edges[i]]) for i in todo]
@@ -63,13 +68,10 @@ def reverseKeyLookupMulti(a, b, **remainder):
     edges = yield [("CE", [result, result]) for value in values]
     edges = yield [("CE", [result, result]) for value in values]
     yield [("CE", [edge, value[1]]) for edge, value in zip(edges, values)]
     yield [("CE", [edge, value[1]]) for edge, value in zip(edges, values)]
 
 
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def reverseKeyLookup(a, b, **remainder):
 def reverseKeyLookup(a, b, **remainder):
-    if a is None or b is None:
-        result, = yield [("CNV", [""])]
-        raise PrimitiveFinished(result)
-    edges_out, edges_in = yield [("RO", [a]), ("RI", [b])]
+    edges_out, edges_in = yield [("RO", [a['id']]), ("RI", [b['id']])]
     options = set(edges_out) & set(edges_in)
     options = set(edges_out) & set(edges_in)
     if options:
     if options:
         # Select one option randomly
         # Select one option randomly
@@ -78,48 +80,52 @@ def reverseKeyLookup(a, b, **remainder):
         # Select one option randomly
         # Select one option randomly
         out_edge = out_edges.pop()
         out_edge = out_edges.pop()
         e, = yield [("RE", [out_edge])]
         e, = yield [("RE", [out_edge])]
-        result = e[1]
+        raise PrimitiveFinished({'id': e[1]})
     else:
     else:
-        result, = yield [("CNV", [""])]
-    raise PrimitiveFinished(result)
+        raise PrimitiveFinished({'value': ""})
 
 
 def instantiated_name(a, b, **remainder):
 def instantiated_name(a, b, **remainder):
-    name_value, = yield [("RV", [b])]
-    if name_value == "":
-        b, = yield [("CNV", ["__" + str(a)])]
+    if "value" not in b:
+        b['value'], = yield [("RV", [b["id"]])]
+    if "id" not in a:
+        a['id'], = yield [("CNV", [a['value']])]
+
+    if b['value'] == "":
+        b['value'] = "__" + str(a['id'])
+
     raise PrimitiveFinished(b)
     raise PrimitiveFinished(b)
 
 
 def set_merge(a, b, **remainder):
 def set_merge(a, b, **remainder):
-    keys, =         yield [("RDK", [b])]
-    edges =         yield [("CE", [a, a]) for key in keys]
+    keys, =         yield [("RDK", [b['id']])]
+    edges =         yield [("CE", [a['id'], a['id']]) for key in keys]
     _ =             yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
     _ =             yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 
 
 def has_value(a, **remainder):
 def has_value(a, **remainder):
-    v, = yield [("RV", [a])]
-    if v is None:
-        result, = yield [("CNV", [False])]
+    if "value" not in a:
+        a['value'], = yield [("RV", [])]
+    if a['value'] is None:
+        raise PrimitiveFinished({'value': False})
     else:
     else:
-        result, = yield [("CNV", [True])]
-    raise PrimitiveFinished(result)
+        raise PrimitiveFinished({'value': True})
 
 
 def make_reverse_dictionary(a, **remainder):
 def make_reverse_dictionary(a, **remainder):
     reverse, = yield [("CN", [])]
     reverse, = yield [("CN", [])]
-    key_nodes, = yield [("RDK", [a])]
-    values = yield [("RDN", [a, i]) for i in key_nodes]
+    key_nodes, = yield [("RDK", [a['id']])]
+    values = yield [("RDN", [a['id'], i]) for i in key_nodes]
     yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
     yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
-    raise PrimitiveFinished(reverse)
+    raise PrimitiveFinished({'id': reverse})
 
 
 def dict_eq(a, b, **remainder):
 def dict_eq(a, b, **remainder):
-    key_nodes, = yield [("RDK", [a])]
+    key_nodes, = yield [("RDK", [a['id']])]
     key_values = yield [("RV", [i]) for i in key_nodes]
     key_values = yield [("RV", [i]) for i in key_nodes]
-    values = yield [("RD", [a, i]) for i in key_values]
+    values = yield [("RD", [a['id'], i]) for i in key_values]
     values = yield [("RV", [i]) for i in values]
     values = yield [("RV", [i]) for i in values]
     a_dict = dict(list(zip(key_values, values)))
     a_dict = dict(list(zip(key_values, values)))
 
 
-    key_nodes, = yield [("RDK", [b])]
+    key_nodes, = yield [("RDK", [b['id']])]
     key_values = yield [("RV", [i]) for i in key_nodes]
     key_values = yield [("RV", [i]) for i in key_nodes]
-    values = yield [("RD", [b, i]) for i in key_values]
+    values = yield [("RD", [b['id'], i]) for i in key_values]
     values = yield [("RV", [i]) for i in values]
     values = yield [("RV", [i]) for i in values]
     b_dict = dict(list(zip(key_values, values)))
     b_dict = dict(list(zip(key_values, values)))
 
 
@@ -127,180 +133,212 @@ def dict_eq(a, b, **remainder):
     raise PrimitiveFinished(result)
     raise PrimitiveFinished(result)
 
 
 def string_substr(a, b, c, **remainder):
 def string_substr(a, b, c, **remainder):
-    a_val, b_val, c_val = yield [("RV", [a]),
-                                 ("RV", [b]),
-                                 ("RV", [c])]
+    if "value" not in a:
+        a['value'], = yield [("RV", [a['id']])]
+    if "value" not in b:
+        b['value'], = yield [("RV", [b['id']])]
+    if "value" not in c:
+        c['value'], = yield [("RV", [c['id']])]
+
     try:
     try:
-        new_value = a_val[b_val:c_val]
+        new_value = a['value'][b['value']:c['value']]
     except:
     except:
         new_value = ""
         new_value = ""
     
     
-    result, = yield [("CNV", [new_value])]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'value': new_value})
 
 
 def integer_gt(a, b, **remainder):
 def integer_gt(a, b, **remainder):
-    a_value, b_value =  yield [("RV", [a]), ("RV", [b])]
-    result, = yield [("CNV", [a_value > b_value])]
-    raise PrimitiveFinished(result)
+    if 'value' not in a:
+        a['value'], = yield [("RV", [a['id']])]
+    if 'value' not in b:
+        b['value'], = yield [("RV", [b['id']])]
+    raise PrimitiveFinished({'value': a['value'] > b['value']})
 
 
 def integer_neg(a, **remainder):
 def integer_neg(a, **remainder):
-    a_value, =          yield [("RV", [a])]
-    result, = yield [("CNV", [-a_value])]
-    raise PrimitiveFinished(result)
+    if 'value' not in a:
+        a['value'], = yield [("RV", [a['id']])]
+    raise PrimitiveFinished({'value': -a['value']})
 
 
 def float_gt(a, b, **remainder):
 def float_gt(a, b, **remainder):
-    a_value, b_value =  yield [("RV", [a]), ("RV", [b])]
-    result, = yield [("CNV", [a_value > b_value])]
-    raise PrimitiveFinished(result)
+    if 'value' not in a:
+        a['value'], = yield [("RV", [a['id']])]
+    if 'value' not in b:
+        b['value'], = yield [("RV", [b['id']])]
+    raise PrimitiveFinished({'value': a['value'] > b['value']})
 
 
 def float_neg(a, **remainder):
 def float_neg(a, **remainder):
-    a_value, =          yield [("RV", [a])]
-    result, = yield [("CNV", [-a_value])]
-    raise PrimitiveFinished(result)
+    if 'value' not in a:
+        a['value'], = yield [("RV", [a['id']])]
+    raise PrimitiveFinished({'value': -a['value']})
 
 
 def value_neq(a, b, **remainder):
 def value_neq(a, b, **remainder):
-    a_value, b_value =  yield [("RV", [a]), ("RV", [b])]
-    result, = yield [("CNV", [a_value != b_value])]
-    raise PrimitiveFinished(result)
+    if 'value' not in a:
+        a['value'], = yield [("RV", [a['id']])]
+    if 'value' not in b:
+        b['value'], = yield [("RV", [b['id']])]
+    raise PrimitiveFinished({'value': a['value'] != b['value']})
 
 
 def element_neq(a, b, **remainder):
 def element_neq(a, b, **remainder):
-    result, = yield [("CNV", [a != b])]
-    raise PrimitiveFinished(result)
+    if 'id' not in a or 'id' not in b:
+        raise PrimitiveFinished({'value': False})
+    else:
+        raise PrimitiveFinished({'value': a['id'] != b['id']})
 
 
 def list_append(a, b, **remainder):
 def list_append(a, b, **remainder):
-    a_outgoing, = yield [("RO", [a])]
-    _ = yield [("CD", [a, len(a_outgoing), b])]
+    if "id" not in b:
+        b['id'], = yield [("CNV", [b['value']])]
+    a_outgoing, = yield [("RO", [a['id']])]
+    _ = yield [("CD", [a['id'], len(a_outgoing), b['id']])]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 
 
 def list_read(a, b, **remainder):
 def list_read(a, b, **remainder):
-    b_value, = yield [("RV", [b])]
-    result, = yield [("RD", [a, b_value])]
+    if 'value' not in b:
+        b['value'], = yield [("RV", [b])]
+    result, = yield [("RD", [a['id'], b['value']])]
     if result is None:
     if result is None:
-        raise Exception("List read out of bounds: %s" % b_value)
-    raise PrimitiveFinished(result)
+        raise Exception("List read out of bounds: %s" % b['value'])
+    raise PrimitiveFinished({'id': result})
 
 
 def list_len(a, **remainder):
 def list_len(a, **remainder):
-    outgoings, = yield [("RO", [a])]
+    outgoings, = yield [("RO", [a['id']])]
     result, = yield [("CNV", [len(outgoings)])]
     result, = yield [("CNV", [len(outgoings)])]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def dict_add(a, b, c, **remainder):
 def dict_add(a, b, c, **remainder):
-    new_edge, = yield [("CE", [a, c])]
-    yield [("CE", [new_edge, b])]
+    if 'id' not in b:
+        b['id'], = yield [("CNV", [b['value']])]
+    if 'id' not in c:
+        c['id'], = yield [("CNV", [c['value']])]
+    new_edge, = yield [("CE", [a['id'], c['id']])]
+    yield [("CE", [new_edge, b['id']])]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 
 
 def dict_len(a, **remainder):
 def dict_len(a, **remainder):
-    outgoings, = yield [("RO", [a])]
-    result, = yield [("CNV", [len(outgoings)])]
-    raise PrimitiveFinished(result)
+    outgoings, = yield [("RO", [a['id']])]
+    raise PrimitiveFinished({'value': len(outgoings)})
 
 
 def set_add(a, b, **remainder):
 def set_add(a, b, **remainder):
-    v, =        yield [("RV", [b])]
-    is_in, =    yield [("RD", [a, v])]
+    if 'value' not in b:
+        b['value'], = yield [("RV", [b['id']])]
+    is_in, =    yield [("RD", [a['id'], b['value']])]
     if not is_in:
     if not is_in:
-        _, =    yield [("CD", [a, v, a])]
+        _, =    yield [("CD", [a['id'], b['value'], a['id']])]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 
 
 def set_add_node(a, b, **remainder):
 def set_add_node(a, b, **remainder):
-    is_in, =    yield [("RDN", [a, b])]
+    if 'id' not in b:
+        b['id'], = yield [("CNV", [b['value']])]
+    is_in, =    yield [("RDN", [a['id'], b['id']])]
     if not is_in:
     if not is_in:
-        edge, = yield [("CE", [a, a])]
-        _, =    yield [("CE", [edge, b])]
+        edge, = yield [("CE", [a['id'], a['id']])]
+        _, =    yield [("CE", [edge, b['id']])]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 
 
 def set_pop(a, **remainder):
 def set_pop(a, **remainder):
-    outgoing, = yield [("RO", [a])]
+    outgoing, = yield [("RO", [a['id']])]
     if outgoing:
     if outgoing:
         outgoing = outgoing[0]
         outgoing = outgoing[0]
         new_outgoing, = yield [("RO", [outgoing])]
         new_outgoing, = yield [("RO", [outgoing])]
         new_outgoing = new_outgoing[0]
         new_outgoing = new_outgoing[0]
         edge, _ = yield [("RE", [new_outgoing]), ("DE", [outgoing])]
         edge, _ = yield [("RE", [new_outgoing]), ("DE", [outgoing])]
-        raise PrimitiveFinished(edge[1])
+        raise PrimitiveFinished({'id': edge[1]})
     else:
     else:
         raise Exception("POP from empty set")
         raise Exception("POP from empty set")
         print("Pop from empty set!")
         print("Pop from empty set!")
-        raise PrimitiveFinished(remainder["root"])
+        raise PrimitiveFinished({'id': remainder["root"]})
 
 
 def set_create(**remainder):
 def set_create(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def list_create(**remainder):
 def list_create(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def dict_create(**remainder):
 def dict_create(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def create_tuple(a, b, **remainder):
 def create_tuple(a, b, **remainder):
+    if "id" not in a:
+        a['id'], = yield [("CNV", [a['value']])]
+    if "id" not in b:
+        b['id'], = yield [("CNV", [b['value']])]
+
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    _, _ =    yield [("CD", [result, 0, a]),
-                     ("CD", [result, 1, b]),
+    _, _ =    yield [("CD", [result, 0, a['id']]),
+                     ("CD", [result, 1, b['id']]),
                     ]
                     ]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def set_overlap(a, b, **remainder):
 def set_overlap(a, b, **remainder):
-    a_keys, b_keys, res = yield [("RDK", [a]), ("RDK", [b]), ("CN", [])]
+    a_keys, b_keys, res = yield [("RDK", [a['id']]), ("RDK", [b['id']]), ("CN", [])]
     a_values = yield [("RV", [i]) for i in a_keys]
     a_values = yield [("RV", [i]) for i in a_keys]
     b_values = yield [("RV", [i]) for i in b_keys]
     b_values = yield [("RV", [i]) for i in b_keys]
 
 
     result = set(a_values) & set(b_values)
     result = set(a_values) & set(b_values)
     yield [("CD", [res, value, res]) for value in result]
     yield [("CD", [res, value, res]) for value in result]
 
 
-    raise PrimitiveFinished(res)
+    raise PrimitiveFinished({'id': res})
 
 
 def list_pop_final(a, **remainder):
 def list_pop_final(a, **remainder):
-    lst, = yield [("RO", [a])]
+    lst, = yield [("RO", [a['id']])]
     length = len(lst)
     length = len(lst)
-    result, result_edge = yield [("RD", [a, length - 1]),
-                                 ("RDE", [a, length -1])]
+    result, result_edge = yield [("RD", [a['id'], length - 1]),
+                                 ("RDE", [a['id'], length -1])]
     _, = yield [("DE", [result_edge])]
     _, = yield [("DE", [result_edge])]
-    raise PrimitiveFinished(result)
+    raise PrimitiveFinished({'id': result})
 
 
 def instantiate_node(a, b, c, **remainder):
 def instantiate_node(a, b, c, **remainder):
-    node, dict_entry, typing, name = \
+    if "value" not in c:
+        c['value'], = yield [("RV", [c['id']])]
+    node, dict_entry, typing = \
         yield [("CN", []),
         yield [("CN", []),
-               ("RD", [a, "model"]),
-               ("RD", [a, "type_mapping"]),
-               ("RV", [c]),
+               ("RD", [a['id'], "model"]),
+               ("RD", [a['id'], "type_mapping"]),
               ]
               ]
 
 
-    if name == "":
+    if c['value'] == "":
         name = "__" + str(node)
         name = "__" + str(node)
-        name_node, = yield [("CNV", [name])]
+        name_node = {'value': name}
     else:
     else:
         name_node = c
         name_node = c
 
 
-    yield [("CD", [dict_entry, name, node])]
-    yield [("CD", [typing, name, b])]
+    yield [("CD", [dict_entry, c['value'], node])]
+    yield [("CD", [typing, c['value'], b])]
 
 
     raise PrimitiveFinished(name_node)
     raise PrimitiveFinished(name_node)
 
 
 def list_insert(a, b, c, **remainder):
 def list_insert(a, b, c, **remainder):
-    # TODO make non-primitive, though compiled
-    a_outgoing, c_value = yield [("RO", [a]), ("RV", [c])] 
-    links = yield [("RD", [a, i]) for i in range(c_value, len(a_outgoing))] + \
-                  [("RDE", [a, i]) for i in range(c_value, len(a_outgoing))]
+    if "id" not in b:
+        b["id"], = yield [("CNV", [b['value']])]
+    if "value" not in c:
+        c['value'], = yield [("RV", [c['id']])]
+
+    a_outgoing, = yield [("RO", [a['id']])]
+    links = yield [("RD", [a['id'], i]) for i in range(c['value'], len(a_outgoing))] + \
+                  [("RDE", [a['id'], i]) for i in range(c['value'], len(a_outgoing))]
 
 
     values = links[:len(links) // 2]
     values = links[:len(links) // 2]
     edges = links[len(links) // 2:] 
     edges = links[len(links) // 2:] 
 
 
-    yield [("CD", [a, c_value, b])] + \
-          [("CD", [a, c_value + 1 + index, value]) for index, value in enumerate(values)] + \
+    yield [("CD", [a['id'], c['value'], b['id']])] + \
+          [("CD", [a['id'], c['value'] + 1 + index, value]) for index, value in enumerate(values)] + \
           [("DE", [i]) for i in edges]
           [("DE", [i]) for i in edges]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 
 
 def list_delete(a, b, **remainder):
 def list_delete(a, b, **remainder):
-    # TODO make non-primitive, though compiled
-    a_outgoing, b_value = yield [("RO", [a]), ("RV", [b])]
-    links = yield [("RD", [a, i]) for i in range(b_value, len(a_outgoing))] + \
-                  [("RDE", [a, i]) for i in range(b_value, len(a_outgoing))]
+    if "value" not in b:
+        b['value'], = yield [("RV", [b['id']])]
+
+    a_outgoing,  = yield [("RO", [a['id']])]
+    links = yield [("RD", [a['id'], i]) for i in range(b['value'], len(a_outgoing))] + \
+                  [("RDE", [a['id'], i]) for i in range(b['value'], len(a_outgoing))]
 
 
     values = links[:len(links) // 2]
     values = links[:len(links) // 2]
     edges = links[len(links) // 2:]
     edges = links[len(links) // 2:]
 
 
-    yield [("CD", [a, b_value + index, value]) for index, value in enumerate(values[1:])] + \
+    yield [("CD", [a['id'], b['value'] + index, value]) for index, value in enumerate(values[1:])] + \
           [("DE", [i]) for i in edges]
           [("DE", [i]) for i in edges]
     raise PrimitiveFinished(a)
     raise PrimitiveFinished(a)
 """
 """

+ 7 - 5
kernel/modelverse_kernel/main.py

@@ -172,7 +172,7 @@ class ModelverseKernel(object):
                 prev = "  " * nested_indent + instruction + " = {'value': " + value + "}\n"
                 prev = "  " * nested_indent + instruction + " = {'value': " + value + "}\n"
             else:
             else:
                 # Node is None, meaning that it was not about the value, but the node itself...
                 # Node is None, meaning that it was not about the value, but the node itself...
-                instruction = str(node)
+                instruction = "{'id': %s}" % str(node)
 
 
         elif inst_type["value"] == "return":
         elif inst_type["value"] == "return":
             value, = yield [("RD", [inst, "value"])]
             value, = yield [("RD", [inst, "value"])]
@@ -213,8 +213,8 @@ class ModelverseKernel(object):
             value, = yield [("RD", [inst, "value"])]
             value, = yield [("RD", [inst, "value"])]
             (prev, inst), = yield [("CALL_ARGS", [self.print_instruction, (value, 0, indent)])]
             (prev, inst), = yield [("CALL_ARGS", [self.print_instruction, (value, 0, indent)])]
             instruction = prev + \
             instruction = prev + \
-                          "  " * indent + "if 'value' not in %s:\n" % inst + \
-                          "  " * (indent + 1) + "%s['value'], = yield [('CNV', [%s['id']])]\n" % (inst, inst) + \
+                          "  " * indent + "if 'id' not in %s:\n" % inst + \
+                          "  " * (indent + 1) + "%s['id'], = yield [('CNV', [%s['value']])]\n" % (inst, inst) + \
                           "  " * indent + "_outputs, _outputs_e = yield [('RD', [_root, 'last_output']), ('RDE', [_root, 'last_output'])]\n" + \
                           "  " * indent + "_outputs, _outputs_e = yield [('RD', [_root, 'last_output']), ('RDE', [_root, 'last_output'])]\n" + \
                           "  " * indent + "_, _new = yield [('CD', [_outputs, 'value', %s['id']]), ('CN', [])]\n" % inst+ \
                           "  " * indent + "_, _new = yield [('CD', [_outputs, 'value', %s['id']]), ('CN', [])]\n" % inst+ \
                           "  " * indent + "yield [('CD', [_outputs, 'next', _new]), ('DE', [_outputs_e]), ('CD', [_root, 'last_output', _new])]\n"
                           "  " * indent + "yield [('CD', [_outputs, 'next', _new]), ('DE', [_outputs_e]), ('CD', [_root, 'last_output', _new])]\n"
@@ -260,8 +260,10 @@ class ModelverseKernel(object):
                        "  " * (nested_indent + 1) + "_var, = yield [('CN', [])]\n" + \
                        "  " * (nested_indent + 1) + "_var, = yield [('CN', [])]\n" + \
                        "  " * (nested_indent + 1) + "yield [('CD', [_globs, '%s', _var])]\n" % instruction_var + \
                        "  " * (nested_indent + 1) + "yield [('CD', [_globs, '%s', _var])]\n" % instruction_var + \
                        "  " * nested_indent + "_old_edge, = yield [('RDE', [_var, 'value'])]\n" + \
                        "  " * nested_indent + "_old_edge, = yield [('RDE', [_var, 'value'])]\n" + \
-                       "  " * nested_indent + "yield [('CD', [_var, 'value', %s]), ('DE', [_old_edge])]\n" % instruction_var + \
-                       "  " * nested_indent + "_mvk.jit.register_global('%s', %s)\n" % (instruction_var, instruction_var)
+                       "  " * nested_indent + "if 'id' not in %s:\n" % instruction_var + \
+                       "  " * (nested_indent + 1) + "%s['id'], = yield [('CNV', [%s['value']])]\n" % (instruction_var, instruction_var) + \
+                       "  " * nested_indent + "yield [('CD', [_var, 'value', %s['id']]), ('DE', [_old_edge])]\n" % instruction_var + \
+                       "  " * nested_indent + "_mvk.jit.register_global('%s', %s['id'])\n" % (instruction_var, instruction_var)
 
 
         elif inst_type["value"] == "call":
         elif inst_type["value"] == "call":
             func_name, = yield [("RD", [inst, "func"])]
             func_name, = yield [("RD", [inst, "func"])]

+ 10 - 10
kernel/modelverse_kernel/primitives.py

@@ -170,17 +170,17 @@ def value_eq(a, b, **remainder):
 
 
 def element_eq(a, b, **remainder):
 def element_eq(a, b, **remainder):
     if "id" not in a:
     if "id" not in a:
-        print("MATERIALIZING A element_eq")
+        #print("MATERIALIZING A element_eq")
         a['id'], = yield [("CNV", [a['value']])]
         a['id'], = yield [("CNV", [a['value']])]
     if "id" not in b:
     if "id" not in b:
-        print("MATERIALIZING B element_eq")
+        #print("MATERIALIZING B element_eq")
         b['id'], = yield [("CNV", [b['value']])]
         b['id'], = yield [("CNV", [b['value']])]
     raise PrimitiveFinished({'value': a['id'] == b['id']})
     raise PrimitiveFinished({'value': a['id'] == b['id']})
 
 
 def cast_string(a, **remainder):
 def cast_string(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    if isinstance(a_value, dict):
+    if isinstance(a['value'], dict):
         raise PrimitiveFinished({'value': str(a['value']['value'])})
         raise PrimitiveFinished({'value': str(a['value']['value'])})
     else:
     else:
         raise PrimitiveFinished({'value': str(a['value'])})
         raise PrimitiveFinished({'value': str(a['value'])})
@@ -203,14 +203,14 @@ def cast_integer(a, **remainder):
 def cast_value(a, **remainder):
 def cast_value(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    if isinstance(a_value, dict):
+    if isinstance(a['value'], dict):
         raise PrimitiveFinished({'value': str(a['value']['value'])})
         raise PrimitiveFinished({'value': str(a['value']['value'])})
     else:
     else:
         raise PrimitiveFinished({'value': json.dumps(a['value'])})
         raise PrimitiveFinished({'value': json.dumps(a['value'])})
 
 
 def cast_id(a, **remainder):
 def cast_id(a, **remainder):
     if "id" not in a:
     if "id" not in a:
-        print("MATERIALIZING A cast_id")
+        #print("MATERIALIZING A cast_id")
         a['id'], = yield [("CNV", [a['value']])]
         a['id'], = yield [("CNV", [a['value']])]
     raise PrimitiveFinished({'value': str(a['id'])})
     raise PrimitiveFinished({'value': str(a['id'])})
 
 
@@ -219,7 +219,7 @@ def dict_add_fast(a, b, c, **remainder):
     if "value" not in b:
     if "value" not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
     if "id" not in c:
     if "id" not in c:
-        print("MATERIALIZING C dict_add_fast")
+        #print("MATERIALIZING C dict_add_fast")
         c['id'], = yield [("CNV", [c['value']])]
         c['id'], = yield [("CNV", [c['value']])]
 
 
     yield [("CD", [a['id'], b['value'], c['id']])]
     yield [("CD", [a['id'], b['value'], c['id']])]
@@ -323,10 +323,10 @@ def create_node(**remainder):
 
 
 def create_edge(a, b, **remainder):
 def create_edge(a, b, **remainder):
     if "id" not in a:
     if "id" not in a:
-        print("MATERIALIZING A create_edge")
+        #print("MATERIALIZING A create_edge")
         a['id'], = yield [("CNV", [a['value']])]
         a['id'], = yield [("CNV", [a['value']])]
     if "id" not in b:
     if "id" not in b:
-        print("MATERIALIZING B create_edge")
+        #print("MATERIALIZING B create_edge")
         b['id'], = yield [("CNV", [b['value']])]
         b['id'], = yield [("CNV", [b['value']])]
     result, = yield [("CE", [a['id'], b['id']])]
     result, = yield [("CE", [a['id'], b['id']])]
     raise PrimitiveFinished({'id': result})
     raise PrimitiveFinished({'id': result})
@@ -415,9 +415,9 @@ def hash(a, **remainder):
     import hashlib
     import hashlib
 
 
     try:
     try:
-        value = hashlib.sha512(a_value).hexdigest()
+        value = hashlib.sha512(a['value']).hexdigest()
     except TypeError:
     except TypeError:
-        value = hashlib.sha512(a_value.encode()).hexdigest()
+        value = hashlib.sha512(a['value'].encode()).hexdigest()
     raise PrimitiveFinished({'value': value})
     raise PrimitiveFinished({'value': value})
 
 
 def __sleep(a, b, **remainder):
 def __sleep(a, b, **remainder):

+ 2 - 0
state/modelverse_state/main.py

@@ -175,6 +175,8 @@ class ModelverseState(object):
         return self.free_id - 1
         return self.free_id - 1
 
 
     def create_dict(self, source, data, destination):
     def create_dict(self, source, data, destination):
+        if isinstance(destination, dict):
+            print("ERROR IN CD: " + str(locals()))
         if source not in self.nodes and source not in self.edges:
         if source not in self.nodes and source not in self.edges:
             return None
             return None
         elif destination not in self.nodes and destination not in self.edges:
         elif destination not in self.nodes and destination not in self.edges:

+ 1 - 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)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Wed Apr 25 14:33:14 2018
+Date:   Wed Apr 25 19:26:56 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server