compiled.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from modelverse_kernel.primitives import PrimitiveFinished
  2. def reverseKeyLookup(a, b, **remainder):
  3. edges = yield [("RO", [a])]
  4. expanded_edges = yield [("RE", [i]) for i in edges]
  5. for i, edge in enumerate(expanded_edges):
  6. if b == edge[1]:
  7. # Found our edge: edges[i]
  8. outgoing = yield [("RO", [edges[i]])]
  9. result = yield [("RE", [outgoing[0]])]
  10. raise PrimitiveFinished(result[1])
  11. result = yield [("CNV", ["(unknown: %s)" % b])]
  12. raise PrimitiveFinished(result)
  13. def read_attribute(a, b, c, **remainder):
  14. #TODO this can be optimized even further...
  15. model_dict, b_val, type_mapping = \
  16. yield [("RD", [a, "model"]),
  17. ("RV", [b]),
  18. ("RD", [a, "type_mapping"]),
  19. ]
  20. model_instance, edges = \
  21. yield [("RD", [model_dict, b]),
  22. ("RO", [a]),
  23. ]
  24. edge_types = yield [("RDN", [type_mapping, i]) for i in edges]
  25. type_edge_val = yield [("RE", [i]) for i in edge_types]
  26. src_nodes = set([i[0] for i in type_edge_val])
  27. found_edges = yield [("RDE", [i, b_val]) for i in src_nodes]
  28. if len(src_nodes) == 1:
  29. found_edges = [found_edges]
  30. for e1 in found_edges:
  31. if e1 is not None:
  32. # Found an edge!
  33. for i, e2 in enumerate(edge_types):
  34. if e1 == e2:
  35. # The instance of this edge is the one we want!
  36. edge = edges[i]
  37. edge_val = yield [("RE", [edge])]
  38. result = edge_val[1]
  39. raise PrimitiveFinished(result)
  40. else:
  41. result = yield [("RR", [])]
  42. raise PrimitiveFinished(result)
  43. raise Exception("Error in reading edge!")