compiled_legacy.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. from modelverse_kernel.primitives import PrimitiveFinished
  2. def reverseKeyLookupMulti(a, b, **remainder):
  3. edges, = yield [("RO", [a])]
  4. b_val, = yield [("RV", [b])]
  5. expanded_edges = yield [("RE", [i]) for i in edges]
  6. values = yield [("RV", [i[1]]) for i in expanded_edges]
  7. result, = yield [("CN", [])]
  8. for i, edge in enumerate(values):
  9. if b_val == edge:
  10. # Found our edge: edges[i]
  11. outgoing, = yield [("RO", [edges[i]])]
  12. value, = yield [("RE", [outgoing[0]])]
  13. yield [("CE", [result, value[1]])]
  14. raise PrimitiveFinished(result)
  15. def reverseKeyLookup(a, b, **remainder):
  16. # Guess, which might work
  17. guess, = yield [("RD", [a, "__%s" % b])]
  18. if guess == b:
  19. result, = yield [("CNV", ["__%s" % b])]
  20. raise PrimitiveFinished(result)
  21. edges, = yield [("RO", [a])]
  22. expanded_edges = yield [("RE", [i]) for i in edges]
  23. for i, edge in enumerate(expanded_edges):
  24. if b == edge[1]:
  25. # Found our edge: edges[i]
  26. outgoing, = yield [("RO", [edges[i]])]
  27. result, = yield [("RE", [outgoing[0]])]
  28. raise PrimitiveFinished(result[1])
  29. result, = yield [("CNV", ["(unknown: %s)" % b])]
  30. raise PrimitiveFinished(result)
  31. def set_copy(a, **remainder):
  32. b, = yield [("CN", [])]
  33. links, = yield [("RO", [a])]
  34. exp_links = yield [("RE", [i]) for i in links]
  35. _ = yield [("CE", [b, i[1]]) for i in exp_links]
  36. raise PrimitiveFinished(b)
  37. def check_symbols(a, b, c, **remainder):
  38. symbols = {}
  39. function_name, = yield [("RV", [b])]
  40. symbols[function_name] = False
  41. object_links, = yield [("RO", [c])]
  42. set_elements = yield [("RE", [i]) for i in object_links]
  43. set_elements = [i[1] for i in set_elements]
  44. set_values = yield [("RV", [i]) for i in set_elements]
  45. set_elements = yield [("RD", [a, i]) for i in set_values]
  46. symbols_set = yield [("RD", [i, "symbols"]) for i in set_elements]
  47. all_keys = yield [("RDK", [i]) for i in symbols_set]
  48. for i, s in zip(all_keys, symbols_set):
  49. # For each object we have found
  50. keys = yield [("RV", [j]) for j in i]
  51. values = yield [("RD", [s, j]) for j in keys]
  52. values = yield [("RV", [j]) for j in values]
  53. for key, value in zip(keys, values):
  54. k = key
  55. v = value
  56. if v and symbols.get(k, False):
  57. result, = yield [("CNV", ["ERROR: multiple definition of symbol " + str(key)])]
  58. raise PrimitiveFinished(result)
  59. elif v and not symbols.get(k, False):
  60. symbols[k] = True
  61. elif not v and k not in symbols:
  62. symbols[k] = False
  63. for i, j in symbols.items():
  64. if i == "input" or i == "output":
  65. continue
  66. if not j:
  67. result, = yield [("CNV", ["ERROR: undefined symbol " + str(i)])]
  68. raise PrimitiveFinished(result)
  69. result, = yield [("CNV", ["OK"])]
  70. raise PrimitiveFinished(result)
  71. def construct_const(**remainder):
  72. v, = yield [("CNV", [{"value": "constant"}])]
  73. # Get input: keep trying until we get something
  74. try:
  75. gen = __get_input(remainder)
  76. inp = None
  77. while 1:
  78. inp = yield gen.send(inp)
  79. except PrimitiveFinished as e:
  80. inp = e.result
  81. yield [("CD", [v, "node", inp])]
  82. raise PrimitiveFinished(v)
  83. def instantiated_name(a, b, **remainder):
  84. name_value, = yield [("RV", [b])]
  85. if name_value == "":
  86. b, = yield [("CNV", ["__" + str(a)])]
  87. raise PrimitiveFinished(b)
  88. def __get_input(parameters):
  89. mvk = parameters["mvk"]
  90. task_root = parameters["task_root"]
  91. while 1:
  92. try:
  93. gen = mvk.input_init(task_root)
  94. inp = None
  95. while 1:
  96. inp = yield gen.send(inp)
  97. except StopIteration:
  98. # Finished
  99. if mvk.success:
  100. # Got some input, so we can access it
  101. raise PrimitiveFinished(mvk.input_value)
  102. else:
  103. # No input, so yield None but don't stop
  104. yield None
  105. def instantiated_name(a, b, **remainder):
  106. name_value, = yield [("RV", [b])]
  107. if name_value == "":
  108. b, = yield [("CNV", ["__" + str(a)])]
  109. raise PrimitiveFinished(b)
  110. def set_merge(a, b, **remainder):
  111. outputs, = yield [("RO", [b])]
  112. values = yield [("RE", [i]) for i in outputs]
  113. yield [("CE", [a, i[1]]) for i in values]
  114. raise PrimitiveFinished(a)
  115. def has_value(a, **remainder):
  116. v, = yield [("RV", [a])]
  117. if v is None:
  118. result, = yield [("CNV", [False])]
  119. else:
  120. result, = yield [("CNV", [True])]
  121. raise PrimitiveFinished(result)
  122. def make_reverse_dictionary(a, **remainder):
  123. reverse, = yield [("CN", [])]
  124. key_nodes, = yield [("RDK", [a])]
  125. values = yield [("RDN", [a, i]) for i in key_nodes]
  126. yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
  127. raise PrimitiveFinished(reverse)
  128. def dict_eq(a, b, **remainder):
  129. key_nodes, = yield [("RDK", [a])]
  130. key_values = yield [("RV", [i]) for i in key_nodes]
  131. values = yield [("RD", [a, i]) for i in key_values]
  132. values = yield [("RV", [i]) for i in values]
  133. a_dict = dict(zip(key_values, values))
  134. key_nodes, = yield [("RDK", [b])]
  135. key_values = yield [("RV", [i]) for i in key_nodes]
  136. values = yield [("RD", [b, i]) for i in key_values]
  137. values = yield [("RV", [i]) for i in values]
  138. b_dict = dict(zip(key_values, values))
  139. result, = yield [("CNV", [a_dict == b_dict])]
  140. raise PrimitiveFinished(result)
  141. def string_substr(a, b, c, **remainder):
  142. a_val, b_val, c_val = yield [("RV", [a]),
  143. ("RV", [b]),
  144. ("RV", [c])]
  145. try:
  146. new_value = a_val[b_val:c_val]
  147. except:
  148. new_value = ""
  149. result, = yield [("CNV", [new_value])]
  150. raise PrimitiveFinished(result)