compiled.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. from modelverse_kernel.primitives import PrimitiveFinished
  2. import modelverse_jit.runtime as jit_runtime
  3. import time
  4. def reverseKeyLookupMulti(a, b, **remainder):
  5. #PROFILE start = time.time()
  6. edges, b_val, result = yield [("RO", [a]), ("RV", [b]), ("CN", [])]
  7. expanded_edges = yield [("RE", [i]) for i in edges]
  8. values = yield [("RV", [i[1]]) for i in expanded_edges]
  9. # Keep results in a local Python set, as we want to bundle as many requests as possible
  10. todo = set()
  11. for i, edge in enumerate(values):
  12. if b_val == edge:
  13. todo.add(i)
  14. outgoings = yield [("RO", [edges[i]]) for i in todo]
  15. values = yield [("RE", [outgoing[0]]) for outgoing in outgoings]
  16. edges = yield [("CE", [result, result]) for value in values]
  17. yield [("CE", [edge, value[1]]) for edge, value in zip(edges, values)]
  18. #PROFILE print("[COMPILED]reverseKeyLookupMulti : %s : %s" % (time.time() - start, time.time() - start))
  19. raise PrimitiveFinished(result)
  20. def reverseKeyLookup(a, b, **remainder):
  21. #PROFILE start = time.time()
  22. edges_out, edges_in = yield [("RO", [a]), ("RI", [b])]
  23. options = set(edges_out) & set(edges_in)
  24. if options:
  25. # Select one option randomly
  26. edge = options.pop()
  27. out_edges, = yield [("RO", [edge])]
  28. # Select one option randomly
  29. out_edge = out_edges.pop()
  30. e, = yield [("RE", [out_edge])]
  31. result = e[1]
  32. else:
  33. result, = yield [("CNV", ["(unknown: %s)" % b])]
  34. #PROFILE print("[COMPILED]reverseKeyLookup : %s : %s" % (time.time() - start, time.time() - start))
  35. raise PrimitiveFinished(result)
  36. def instantiated_name(a, b, **remainder):
  37. #PROFILE start = time.time()
  38. name_value, = yield [("RV", [b])]
  39. if name_value == "":
  40. b, = yield [("CNV", ["__" + str(a)])]
  41. #PROFILE print("[COMPILED]instantiated_name : %s : %s" % (time.time() - start, time.time() - start))
  42. raise PrimitiveFinished(b)
  43. def set_merge(a, b, **remainder):
  44. #PROFILE start = time.time()
  45. keys, = yield [("RDK", [b])]
  46. edges = yield [("CE", [a, a]) for key in keys]
  47. _ = yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
  48. #PROFILE print("[COMPILED]set_merge : %s : %s" % (time.time() - start, time.time() - start))
  49. raise PrimitiveFinished(a)
  50. def has_value(a, **remainder):
  51. #PROFILE start = time.time()
  52. v, = yield [("RV", [a])]
  53. if v is None:
  54. result, = yield [("CNV", [False])]
  55. else:
  56. result, = yield [("CNV", [True])]
  57. #PROFILE print("[COMPILED]has_value : %s : %s" % (time.time() - start, time.time() - start))
  58. raise PrimitiveFinished(result)
  59. def make_reverse_dictionary(a, **remainder):
  60. #PROFILE start = time.time()
  61. reverse, = yield [("CN", [])]
  62. key_nodes, = yield [("RDK", [a])]
  63. values = yield [("RDN", [a, i]) for i in key_nodes]
  64. yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
  65. #PROFILE print("[COMPILED]make_reverse_dictionary : %s : %s" % (time.time() - start, time.time() - start))
  66. raise PrimitiveFinished(reverse)
  67. def dict_eq(a, b, **remainder):
  68. #PROFILE start = time.time()
  69. key_nodes, = yield [("RDK", [a])]
  70. key_values = yield [("RV", [i]) for i in key_nodes]
  71. values = yield [("RD", [a, i]) for i in key_values]
  72. values = yield [("RV", [i]) for i in values]
  73. a_dict = dict(zip(key_values, values))
  74. key_nodes, = yield [("RDK", [b])]
  75. key_values = yield [("RV", [i]) for i in key_nodes]
  76. values = yield [("RD", [b, i]) for i in key_values]
  77. values = yield [("RV", [i]) for i in values]
  78. b_dict = dict(zip(key_values, values))
  79. result, = yield [("CNV", [a_dict == b_dict])]
  80. #PROFILE print("[COMPILED]dict_eq : %s : %s" % (time.time() - start, time.time() - start))
  81. raise PrimitiveFinished(result)
  82. def string_substr(a, b, c, **remainder):
  83. #PROFILE start = time.time()
  84. a_val, b_val, c_val = yield [("RV", [a]),
  85. ("RV", [b]),
  86. ("RV", [c])]
  87. try:
  88. new_value = a_val[b_val:c_val]
  89. except:
  90. new_value = ""
  91. result, = yield [("CNV", [new_value])]
  92. #PROFILE print("[COMPILED]string_substr : %s : %s" % (time.time() - start, time.time() - start))
  93. raise PrimitiveFinished(result)
  94. def integer_gt(a, b, **remainder):
  95. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  96. result, = yield [("CNV", [a_value > b_value])]
  97. raise PrimitiveFinished(result)
  98. def integer_neg(a, **remainder):
  99. a_value, = yield [("RV", [a])]
  100. result, = yield [("CNV", [-a_value])]
  101. raise PrimitiveFinished(result)
  102. def float_gt(a, b, **remainder):
  103. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  104. result, = yield [("CNV", [a_value > b_value])]
  105. raise PrimitiveFinished(result)
  106. def float_neg(a, **remainder):
  107. a_value, = yield [("RV", [a])]
  108. result, = yield [("CNV", [-a_value])]
  109. raise PrimitiveFinished(result)
  110. def value_neq(a, b, **remainder):
  111. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  112. result, = yield [("CNV", [a_value != b_value])]
  113. raise PrimitiveFinished(result)
  114. def element_neq(a, b, **remainder):
  115. result, = yield [("CNV", [a != b])]
  116. raise PrimitiveFinished(result)
  117. def list_append(a, b, **remainder):
  118. a_outgoing, = yield [("RO", [a])]
  119. _ = yield [("CD", [a, len(a_outgoing), b])]
  120. raise PrimitiveFinished(a)
  121. def list_read(a, b, **remainder):
  122. b_value, = yield [("RV", [b])]
  123. result, = yield [("RD", [a, b_value])]
  124. if result is None:
  125. raise Exception("List read out of bounds: %s" % b_value)
  126. raise PrimitiveFinished(result)
  127. def list_len(a, **remainder):
  128. outgoings, = yield [("RO", [a])]
  129. result, = yield [("CNV", [len(outgoings)])]
  130. raise PrimitiveFinished(result)
  131. def dict_add(a, b, c, **remainder):
  132. new_edge, = yield [("CE", [a, c])]
  133. yield [("CE", [new_edge, b])]
  134. raise PrimitiveFinished(a)
  135. def dict_len(a, **remainder):
  136. outgoings, = yield [("RO", [a])]
  137. result, = yield [("CNV", [len(outgoings)])]
  138. raise PrimitiveFinished(result)
  139. def set_add(a, b, **remainder):
  140. v, = yield [("RV", [b])]
  141. is_in, = yield [("RD", [a, v])]
  142. if not is_in:
  143. _, = yield [("CD", [a, v, a])]
  144. raise PrimitiveFinished(a)
  145. def set_add_node(a, b, **remainder):
  146. is_in, = yield [("RDN", [a, b])]
  147. if not is_in:
  148. edge, = yield [("CE", [a, a])]
  149. _, = yield [("CE", [edge, b])]
  150. raise PrimitiveFinished(a)
  151. def set_pop(a, **remainder):
  152. outgoing, = yield [("RO", [a])]
  153. if outgoing:
  154. outgoing = outgoing[0]
  155. new_outgoing, = yield [("RO", [outgoing])]
  156. new_outgoing = new_outgoing[0]
  157. edge, _ = yield [("RE", [new_outgoing]), ("DE", [outgoing])]
  158. raise PrimitiveFinished(edge[1])
  159. else:
  160. raise Exception("POP from empty set")
  161. print("Pop from empty set!")
  162. raise PrimitiveFinished(remainder["root"])
  163. def set_create(**remainder):
  164. result, = yield [("CN", [])]
  165. raise PrimitiveFinished(result)
  166. def list_create(**remainder):
  167. result, = yield [("CN", [])]
  168. raise PrimitiveFinished(result)
  169. def dict_create(**remainder):
  170. result, = yield [("CN", [])]
  171. raise PrimitiveFinished(result)
  172. def create_tuple(a, b, **remainder):
  173. result, = yield [("CN", [])]
  174. _, _ = yield [("CD", [result, 0, a]),
  175. ("CD", [result, 1, b]),
  176. ]
  177. raise PrimitiveFinished(result)