1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- from modelverse_kernel.primitives import PrimitiveFinished
- import modelverse_jit.runtime as jit_runtime
- def reverseKeyLookupMulti(a, b, **remainder):
- edges, b_val, result = yield [("RO", [a]), ("RV", [b]), ("CN", [])]
- expanded_edges = yield [("RE", [i]) for i in edges]
- values = yield [("RV", [i[1]]) for i in expanded_edges]
- # Keep results in a local Python set, as we want to bundle as many requests as possible
- todo = set()
- for i, edge in enumerate(values):
- if b_val == edge:
- todo.add(i)
- outgoings = yield [("RO", [edges[i]]) for i in todo]
- values = yield [("RE", [outgoing[0]]) for outgoing in outgoings]
- yield [("CE", [result, value[1]]) for value in values]
- raise PrimitiveFinished(result)
- def reverseKeyLookup(a, b, **remainder):
- edges_out, edges_in = yield [("RO", [a]), ("RI", [b])]
- options = set(edges_out) & set(edges_in)
- if options:
- # Select one option randomly
- edge = options.pop()
- out_edges, = yield [("RO", [edge])]
- # Select one option randomly
- out_edge = out_edges.pop()
- e, = yield [("RE", [out_edge])]
- s, t = e
- raise PrimitiveFinished(t)
- else:
- result, = yield [("CNV", ["(unknown: %s)" % b])]
- raise PrimitiveFinished(result)
- def set_copy(a, **remainder):
- b, = yield [("CN", [])]
- links, = yield [("RO", [a])]
- exp_links = yield [("RE", [i]) for i in links]
- _ = yield [("CE", [b, i[1]]) for i in exp_links]
- raise PrimitiveFinished(b)
- def instantiated_name(a, b, **remainder):
- name_value, = yield [("RV", [b])]
- if name_value == "":
- b, = yield [("CNV", ["__" + str(a)])]
- raise PrimitiveFinished(b)
- def set_merge(a, b, **remainder):
- outputs, = yield [("RO", [b])]
- values = yield [("RE", [i]) for i in outputs]
- yield [("CE", [a, i[1]]) for i in values]
- raise PrimitiveFinished(a)
- def has_value(a, **remainder):
- v, = yield [("RV", [a])]
- if v is None:
- result, = yield [("CNV", [False])]
- else:
- result, = yield [("CNV", [True])]
- raise PrimitiveFinished(result)
- def make_reverse_dictionary(a, **remainder):
- reverse, = yield [("CN", [])]
- key_nodes, = yield [("RDK", [a])]
- values = yield [("RDN", [a, i]) for i in key_nodes]
- yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
- raise PrimitiveFinished(reverse)
- def dict_eq(a, b, **remainder):
- key_nodes, = yield [("RDK", [a])]
- key_values = yield [("RV", [i]) for i in key_nodes]
- values = yield [("RD", [a, i]) for i in key_values]
- values = yield [("RV", [i]) for i in values]
- a_dict = dict(zip(key_values, values))
- key_nodes, = yield [("RDK", [b])]
- key_values = yield [("RV", [i]) for i in key_nodes]
- values = yield [("RD", [b, i]) for i in key_values]
- values = yield [("RV", [i]) for i in values]
- b_dict = dict(zip(key_values, values))
- result, = yield [("CNV", [a_dict == b_dict])]
- raise PrimitiveFinished(result)
- def string_substr(a, b, c, **remainder):
- a_val, b_val, c_val = yield [("RV", [a]),
- ("RV", [b]),
- ("RV", [c])]
- try:
- new_value = a_val[b_val:c_val]
- except:
- new_value = ""
-
- result, = yield [("CNV", [new_value])]
- raise PrimitiveFinished(result)
|