Browse Source

Added compiled version of read_attribute

Yentl Van Tendeloo 9 years ago
parent
commit
2bfb702047
1 changed files with 37 additions and 0 deletions
  1. 37 0
      kernel/modelverse_kernel/compiled.py

+ 37 - 0
kernel/modelverse_kernel/compiled.py

@@ -12,3 +12,40 @@ def reverseKeyLookup(a, b, **remainder):
 
     result = yield [("CNV", ["(unknown: %s)" % b])]
     raise PrimitiveFinished(result)
+
+def read_attribute(a, b, c, **remainder):
+    #TODO this can be optimized even further...
+    model_dict, b_val, type_mapping = \
+                    yield [("RD", [a, "model"]),
+                           ("RV", [b]),
+                           ("RD", [a, "type_mapping"]),
+                           ]
+    model_instance, edges = \
+                    yield [("RD", [model_dict, b]),
+                           ("RO", [a]),
+                           ]
+    edge_types =    yield [("RDN", [type_mapping, i]) for i in edges]
+    type_edge_val = yield [("RE", [i]) for i in edge_types]
+
+    src_nodes = set([i[0] for i in type_edge_val])
+
+    found_edges =   yield [("RDE", [i, b_val]) for i in src_nodes]
+
+    if len(src_nodes) == 1:
+        found_edges = [found_edges]
+
+    for e1 in found_edges:
+        if e1 is not None:
+            # Found an edge!
+            for i, e2 in enumerate(edge_types):
+                if e1 == e2:
+                    # The instance of this edge is the one we want!
+                    edge = edges[i]
+                    edge_val = yield [("RE", [edge])]
+                    result = edge_val[1]
+                    raise PrimitiveFinished(result)
+    else:
+        result = yield [("RR", [])]
+        raise PrimitiveFinished(result)
+
+    raise Exception("Error in reading edge!")