Source code for LSD.detecter
"""The package to detect superbubbles in a DAG"""
from math import inf as infinity
[docs]def out_child(v, g, order):
"""Calculate the outChild value of an vertex.
Note that by construction every vertex beside b have a successor."""
maximum = -1
for v2 in g.successors(v):
maximum = max(maximum, order.get_position(v2))
return maximum
[docs]def out_parent(v, g, order):
"""Calculate the outParent value of an vertex.
Note that by construction every vertex beside a have a predecessor."""
minimum = infinity
for v2 in g.predecessors(v):
minimum = min(minimum, order.get_position(v2))
return minimum
[docs]def dag_superbubble(g, order, reporter):
"""Detect all superbubbles in a DAG."""
def report(i, o):
reporter.rep(order[i: o + 1])
stack = Stack()
out_parent_map = {None: -3}
t = None
for k in range(order.n-1, -1, -1):
v = order[k]
child = out_child(v, g, order)
if child == k+1:
stack.put(t)
t = order[k + 1]
while order.get_position(t) < child:
t2 = stack.pop()
out_parent_map[t2] = min(out_parent_map[t], out_parent_map[t2])
t = t2
if out_parent_map[t] == k:
report(k, order.get_position(t))
t2 = stack.pop()
out_parent_map[t2] = min(out_parent_map[t], out_parent_map[t2])
t = t2
out_parent_map[v] = out_parent(v, g, order)
out_parent_map[t] = min(out_parent_map[t], out_parent_map[v])
[docs]class Stack:
"""A simple stack implementation that return None when the stack is empty."""
def __init__(self):
self.list = []
def put(self, c):
if c is not None:
self.list.append(c)
def pop(self):
if len(self.list) == 0:
return None
return self.list.pop()