Browse Source

Added compiled version of SPI/SPO

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

+ 106 - 0
kernel/modelverse_kernel/compiled.py

@@ -293,3 +293,109 @@ def add_AL(a, b, **remainder):
                 worklist.append((destination, destination_type))
 
     raise PrimitiveFinished(result)
+
+def get_superclasses(a, b, **remainder):
+    inheritance =   yield [("RD", [a, "inheritance"])]
+    model_dict =    yield [("RD", [a, "model"])]
+    b_v =           yield [("RV", [b])]
+    subclass =      yield [("RD", [model_dict, b_v])]
+    type_mapping =  yield [("RD", [a, "type_mapping"])]
+    names =         yield [("RDK", [model_dict])]
+    elems =         yield [("RDN", [model_dict, i]) for i in names]
+    elem_to_name =  dict(zip(elems, names))
+
+    result =        yield [("CN", [])]
+    worklist = [subclass]
+    while worklist:
+        subclass = worklist.pop()
+        res = elem_to_name[subclass]
+        yield [("CE", [result, res])]
+
+        outgoing =      yield [("RO", [subclass])]
+        types =         yield [("RDN", [type_mapping, i]) for i in outgoing]
+        types = [types] if len(outgoing) == 1 else types
+
+        for i, t in enumerate(types):
+            if t == inheritance:
+                # Found an inheritance link!
+                elem = outgoing[i]
+                src, dst = \
+                        yield [("RE", [elem])]
+                # Find elem in elems
+                worklist.append(dst)
+
+    raise PrimitiveFinished(result)
+
+def selectPossibleIncoming(a, b, c, **remainder):
+    model_dict =    yield [("RD", [a, "model"])]
+    limit_set_links = \
+                    yield [("RO", [c])]
+    limit_set =     yield [("RE", [i]) for i in limit_set_links]
+    limit_set_names = \
+                    [i[1] for i in limit_set]
+    limit_set_names = [limit_set_names] if len(limit_set) == 1 else limit_set_names
+    name_values =   yield [("RV", [i]) for i in limit_set_names]
+    limit_set =     yield [("RD", [model_dict, i]) for i in name_values]
+    limit_set = [limit_set] if len(limit_set_names) == 1 else limit_set
+
+    try:
+        gen = get_superclasses(a, b)
+        inp = None
+        while 1:
+            inp =   yield gen.send(inp)
+    except PrimitiveFinished as e:
+        superclasses = e.result
+        vals = yield [("RO", [superclasses])]
+        superclasses = yield [("RE", [i]) for i in vals]
+        superclasses = [superclasses] if len(vals) == 1 else superclasses
+        superclasses = [i[1] for i in superclasses]
+
+    superclass_names = yield [("RV", [i]) for i in superclasses]
+    superclass_names = [superclass_names] if len(superclasses) == 1 else superclass_names
+    elems =         yield [("RD", [model_dict, i]) for i in superclass_names]
+    elems = [elems] if len(superclasses) == 1 else elems
+
+    result =        yield [("CN", [])]
+    for i, edge in enumerate(limit_set):
+        src, dst =  yield [("RE", [edge])]
+        if dst in elems:
+            yield [("CE", [result, limit_set_names[i]])]
+
+    raise PrimitiveFinished(result)
+
+def selectPossibleOutgoing(a, b, c, **remainder):
+    model_dict =    yield [("RD", [a, "model"])]
+    limit_set_links = \
+                    yield [("RO", [c])]
+    limit_set =     yield [("RE", [i]) for i in limit_set_links]
+    limit_set_names = \
+                    [i[1] for i in limit_set]
+    limit_set_names = [limit_set_names] if len(limit_set) == 1 else limit_set_names
+    name_values =   yield [("RV", [i]) for i in limit_set_names]
+    limit_set =     yield [("RD", [model_dict, i]) for i in name_values]
+    limit_set = [limit_set] if len(limit_set_names) == 1 else limit_set
+
+    try:
+        gen = get_superclasses(a, b)
+        inp = None
+        while 1:
+            inp =   yield gen.send(inp)
+    except PrimitiveFinished as e:
+        superclasses = e.result
+        vals = yield [("RO", [superclasses])]
+        superclasses = yield [("RE", [i]) for i in vals]
+        superclasses = [superclasses] if len(vals) == 1 else superclasses
+        superclasses = [i[1] for i in superclasses]
+
+    superclass_names = yield [("RV", [i]) for i in superclasses]
+    superclass_names = [superclass_names] if len(superclasses) == 1 else superclass_names
+    elems =         yield [("RD", [model_dict, i]) for i in superclass_names]
+    elems = [elems] if len(superclasses) == 1 else elems
+
+    result =        yield [("CN", [])]
+    for i, edge in enumerate(limit_set):
+        src, dst =  yield [("RE", [edge])]
+        if src in elems:
+            yield [("CE", [result, limit_set_names[i]])]
+
+    raise PrimitiveFinished(result)