from modelverse_kernel.primitives import PrimitiveFinished def reverseKeyLookup(a, b, **remainder): edges = yield [("RO", [a])] expanded_edges = yield [("RE", [i]) for i in edges] for i, edge in enumerate(expanded_edges): if b == edge[1]: # Found our edge: edges[i] outgoing = yield [("RO", [edges[i]])] result = yield [("RE", [outgoing[0]])] raise PrimitiveFinished(result[1]) 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!")