|
@@ -32,50 +32,55 @@ def _find_lcas(lookup_parents, c1, c2s):
|
|
|
_ANC_OF_1 = 1
|
|
|
_ANC_OF_2 = 2
|
|
|
_DNC = 4
|
|
|
- _LCA = 8
|
|
|
+ _LCA = 8
|
|
|
|
|
|
def _has_candidates(wlst, cstates):
|
|
|
for cmt in wlst:
|
|
|
if cmt in cstates:
|
|
|
- if not (cstates[cmt] & _DNC):
|
|
|
+ if not ((cstates[cmt] & _DNC) == _DNC):
|
|
|
return True
|
|
|
return False
|
|
|
|
|
|
-
|
|
|
- wlst: Deque[int] = deque()
|
|
|
+
|
|
|
+
|
|
|
+ wlst: Deque[bytes] = deque()
|
|
|
cstates[c1] = _ANC_OF_1
|
|
|
wlst.append(c1)
|
|
|
for c2 in c2s:
|
|
|
- cstates[c2] = _ANC_OF_2
|
|
|
+ cflags = cstates.get(c2, 0)
|
|
|
+ cstates[c2] = cflags | _ANC_OF_2
|
|
|
wlst.append(c2)
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
|
|
|
while _has_candidates(wlst, cstates):
|
|
|
cmt = wlst.popleft()
|
|
|
- flags = cstates[cmt]
|
|
|
- if flags == (_ANC_OF_1 | _ANC_OF_2):
|
|
|
-
|
|
|
- if not (flags & _LCA):
|
|
|
- flags = flags | _LCA
|
|
|
- cstates[cmt] = flags
|
|
|
+
|
|
|
+
|
|
|
+ cflags = cstates[cmt] & (_ANC_OF_1 | _ANC_OF_2 | _DNC)
|
|
|
+ if cflags == (_ANC_OF_1 | _ANC_OF_2):
|
|
|
+
|
|
|
+ if not (cstates[cmt] & _LCA) == _LCA:
|
|
|
+ cstates[cmt] = cstates[cmt] | _LCA
|
|
|
cands.append(cmt)
|
|
|
-
|
|
|
-
|
|
|
- flags = flags | _DNC
|
|
|
+
|
|
|
+
|
|
|
+ cflags = cflags | _DNC
|
|
|
parents = lookup_parents(cmt)
|
|
|
if parents:
|
|
|
for pcmt in parents:
|
|
|
- if pcmt in cstates:
|
|
|
- cstates[pcmt] = cstates[pcmt] | flags
|
|
|
- else:
|
|
|
- cstates[pcmt] = flags
|
|
|
+ pflags = cstates.get(pcmt, 0)
|
|
|
+
|
|
|
+
|
|
|
+ if ((pflags & cflags) == cflags):
|
|
|
+ continue
|
|
|
+ cstates[pcmt] = pflags | cflags
|
|
|
wlst.append(pcmt)
|
|
|
|
|
|
-
|
|
|
+
|
|
|
results = []
|
|
|
for cmt in cands:
|
|
|
- if not (cstates[cmt] & _DNC):
|
|
|
+ if not ((cstates[cmt] & _DNC) == _DNC):
|
|
|
results.append(cmt)
|
|
|
return results
|
|
|
|