compiled.py 4.5 KB

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