compiled.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from modelverse_kernel.primitives import PrimitiveFinished
  2. import modelverse_jit.runtime as jit_runtime
  3. def reverseKeyLookupMulti(a, b, **remainder):
  4. edges, = yield [("RO", [a])]
  5. b_val, = yield [("RV", [b])]
  6. expanded_edges = yield [("RE", [i]) for i in edges]
  7. values = yield [("RV", [i[1]]) for i in expanded_edges]
  8. result, = yield [("CN", [])]
  9. for i, edge in enumerate(values):
  10. if b_val == edge:
  11. # Found our edge: edges[i]
  12. outgoing, = yield [("RO", [edges[i]])]
  13. value, = yield [("RE", [outgoing[0]])]
  14. yield [("CE", [result, value[1]])]
  15. raise PrimitiveFinished(result)
  16. """
  17. edges_out, edges_in, result = yield [("RO", [a]), ("RI", [b]), ("CN", [])]
  18. python_result = set()
  19. options = set(edges_out) & set(edges_in)
  20. if options:
  21. all_destination_edges = yield [("RO", [i]) for i in options]
  22. for e in all_destination_edges:
  23. st, = yield [("RE", [edge]) for edge in e]
  24. s, t = st
  25. python_result.add(t)
  26. yield [("CE", [result, i]) for i in python_result]
  27. raise PrimitiveFinished(result)
  28. """
  29. def reverseKeyLookup(a, b, **remainder):
  30. edges_out, edges_in = yield [("RO", [a]), ("RI", [b])]
  31. options = set(edges_out) & set(edges_in)
  32. if options:
  33. # Select one option randomly
  34. edge = options.pop()
  35. out_edges, = yield [("RO", [edge])]
  36. # Select one option randomly
  37. out_edge = out_edges.pop()
  38. e, = yield [("RE", [out_edge])]
  39. s, t = e
  40. raise PrimitiveFinished(t)
  41. else:
  42. result, = yield [("CNV", ["(unknown: %s)" % b])]
  43. raise PrimitiveFinished(result)
  44. def set_copy(a, **remainder):
  45. b, = yield [("CN", [])]
  46. links, = yield [("RO", [a])]
  47. exp_links = yield [("RE", [i]) for i in links]
  48. _ = yield [("CE", [b, i[1]]) for i in exp_links]
  49. raise PrimitiveFinished(b)
  50. def construct_const(**remainder):
  51. v, = yield [("CNV", [{"value": "constant"}])]
  52. # Get input: keep trying until we get something
  53. inp, = yield [("CALL_KWARGS", [jit_runtime.get_input, remainder])]
  54. yield [("CD", [v, "node", inp])]
  55. raise PrimitiveFinished(v)
  56. def instantiated_name(a, b, **remainder):
  57. name_value, = yield [("RV", [b])]
  58. if name_value == "":
  59. b, = yield [("CNV", ["__" + str(a)])]
  60. raise PrimitiveFinished(b)
  61. def set_merge(a, b, **remainder):
  62. outputs, = yield [("RO", [b])]
  63. values = yield [("RE", [i]) for i in outputs]
  64. yield [("CE", [a, i[1]]) for i in values]
  65. raise PrimitiveFinished(a)
  66. def has_value(a, **remainder):
  67. v, = yield [("RV", [a])]
  68. if v is None:
  69. result, = yield [("CNV", [False])]
  70. else:
  71. result, = yield [("CNV", [True])]
  72. raise PrimitiveFinished(result)
  73. def make_reverse_dictionary(a, **remainder):
  74. reverse, = yield [("CN", [])]
  75. key_nodes, = yield [("RDK", [a])]
  76. values = yield [("RDN", [a, i]) for i in key_nodes]
  77. yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
  78. raise PrimitiveFinished(reverse)
  79. def dict_eq(a, b, **remainder):
  80. key_nodes, = yield [("RDK", [a])]
  81. key_values = yield [("RV", [i]) for i in key_nodes]
  82. values = yield [("RD", [a, i]) for i in key_values]
  83. values = yield [("RV", [i]) for i in values]
  84. a_dict = dict(zip(key_values, values))
  85. key_nodes, = yield [("RDK", [b])]
  86. key_values = yield [("RV", [i]) for i in key_nodes]
  87. values = yield [("RD", [b, i]) for i in key_values]
  88. values = yield [("RV", [i]) for i in values]
  89. b_dict = dict(zip(key_values, values))
  90. result, = yield [("CNV", [a_dict == b_dict])]
  91. raise PrimitiveFinished(result)
  92. def string_substr(a, b, c, **remainder):
  93. a_val, b_val, c_val = yield [("RV", [a]),
  94. ("RV", [b]),
  95. ("RV", [c])]
  96. try:
  97. new_value = a_val[b_val:c_val]
  98. except:
  99. new_value = ""
  100. result, = yield [("CNV", [new_value])]
  101. raise PrimitiveFinished(result)