compiled.py 7.6 KB

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