|
@@ -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)
|