فهرست منبع

Improved version of reverseKeyLookup: much less MvS requests

Yentl Van Tendeloo 8 سال پیش
والد
کامیت
3e74f5e348
1فایلهای تغییر یافته به همراه27 افزوده شده و 17 حذف شده
  1. 27 17
      kernel/modelverse_kernel/compiled.py

+ 27 - 17
kernel/modelverse_kernel/compiled.py

@@ -17,26 +17,36 @@ def reverseKeyLookupMulti(a, b, **remainder):
 
     raise PrimitiveFinished(result)
 
+    """
+    edges_out, edges_in, result = yield [("RO", [a]), ("RI", [b]), ("CN", [])]
+    python_result = set()
+    options = set(edges_out) & set(edges_in)
+    if options:
+        all_destination_edges = yield [("RO", [i]) for i in options]
+        for e in all_destination_edges:
+            st, = yield [("RE", [edge]) for edge in e]
+            s, t = st
+            python_result.add(t)
+    yield [("CE", [result, i]) for i in python_result]
+    raise PrimitiveFinished(result)
+    """
+
 def reverseKeyLookup(a, b, **remainder):
-    # Guess, which might work
-    guess, = yield [("RD", [a, "__%s" % b])]
-    if guess == b:
-        result, = yield [("CNV", ["__%s" % b])]
+    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)
 
-    # We failed: do the slow way
-    edges, = yield [("RO", [a])]
-    expanded_edges = yield [("RE", [i]) for i in edges]
-    for i, edge in enumerate(expanded_edges):
-        if b == edge[1]:
-            # Found our edge: edges[i]
-            outgoing, = yield [("RO", [edges[i]])]
-            result, = yield [("RE", [outgoing[0]])]
-            raise PrimitiveFinished(result[1])
-
-    result, = yield [("CNV", ["(unknown: %s)" % b])]
-    raise PrimitiveFinished(result)
-
 def set_copy(a, **remainder):
     b, =         yield [("CN", [])]
     links, =     yield [("RO", [a])]