Color graph edges.
This commit is contained in:
parent
dba5d020cd
commit
478af54cce
@ -1342,6 +1342,16 @@ def graph(self, **kwargs):
|
||||
|
||||
# Fast access to nodes in the spec.
|
||||
nodes = clone.index()
|
||||
|
||||
# Colors associated with each node in the DAG.
|
||||
# Edges are colored by the node they point to.
|
||||
all_colors = 'rgbmcyRGBMCY'
|
||||
colors = dict((name, all_colors[i % len(all_colors)])
|
||||
for i, name in enumerate(topo_order))
|
||||
def write_edge(string, index, sub=0):
|
||||
edge = "@%s{%s}" % (colors[frontier[index][sub]], string)
|
||||
out.write(edge)
|
||||
|
||||
frontier = []
|
||||
|
||||
def ordered_deps(node):
|
||||
@ -1363,29 +1373,30 @@ def back_edge(prev_ends, end, start, collapse, label=None):
|
||||
|
||||
f = len(frontier)
|
||||
|
||||
self._pos = 0
|
||||
def advance(to, fun):
|
||||
for i in range(advance.pos, to):
|
||||
for i in range(self._pos, to):
|
||||
fun()
|
||||
advance.pos += 1
|
||||
advance.pos = 0
|
||||
self._pos += 1
|
||||
|
||||
for p in prev_ends:
|
||||
advance(p, lambda: out.write("| "))
|
||||
advance(p+1, lambda: out.write("|/"))
|
||||
|
||||
advance(p, lambda: write_edge("| ", self._pos))
|
||||
advance(p+1, lambda: write_edge("|/", self._pos))
|
||||
if end >= 0:
|
||||
advance(end + 1, lambda: out.write("| "))
|
||||
advance(start - 1, lambda: out.write("|_"))
|
||||
advance(end + 1, lambda: write_edge("| ", self._pos))
|
||||
advance(start - 1, lambda: (write_edge("|", self._pos) or
|
||||
write_edge("_", end)))
|
||||
else:
|
||||
advance(start - 1, lambda: out.write("| "))
|
||||
advance(start - 1, lambda: write_edge("| ", self._pos))
|
||||
|
||||
if start >= 0:
|
||||
advance(start, lambda: out.write("|/"))
|
||||
advance(start, lambda: (write_edge("|", self._pos) or
|
||||
write_edge("/", end)))
|
||||
|
||||
if collapse:
|
||||
advance(len(frontier), lambda: out.write(" /"))
|
||||
advance(len(frontier), lambda: write_edge(" /", self._pos))
|
||||
else:
|
||||
advance(len(frontier), lambda: out.write("| "))
|
||||
advance(len(frontier), lambda: write_edge("| ", self._pos))
|
||||
|
||||
if debug:
|
||||
out.write(" " * 10)
|
||||
@ -1462,11 +1473,11 @@ def find(seq, predicate):
|
||||
|
||||
prev_ends = []
|
||||
for j, (b, d) in enumerate(back):
|
||||
frontier[i].remove(d)
|
||||
if i-b > 1:
|
||||
back_edge(prev_ends, b, i, False)
|
||||
del prev_ends[:]
|
||||
prev_ends.append(b)
|
||||
frontier[i].remove(d)
|
||||
back_edge(prev_ends, -1, -1, False)
|
||||
|
||||
if not frontier[i]:
|
||||
@ -1475,8 +1486,9 @@ def find(seq, predicate):
|
||||
elif len(frontier[i]) > 1:
|
||||
# Expand forawrd after doing all back connections
|
||||
out.write(indent)
|
||||
out.write("| " * i)
|
||||
out.write("|\\")
|
||||
for c in range(i):
|
||||
write_edge("| ", c)
|
||||
write_edge("|", i)
|
||||
|
||||
if (i+1 < len(frontier) and len(frontier[i+1]) == 1
|
||||
and frontier[i+1][0] in frontier[i]):
|
||||
@ -1485,14 +1497,19 @@ def find(seq, predicate):
|
||||
# avoiding immediate expand/contract.
|
||||
name = frontier[i+1][0]
|
||||
frontier[i].remove(name)
|
||||
out.write("| " * (len(frontier) - i - 1))
|
||||
|
||||
write_edge("\\", i+1)
|
||||
for c in range(i+1, len(frontier)):
|
||||
write_edge("| ", c )
|
||||
out.write("\n")
|
||||
|
||||
else:
|
||||
# Just allow the expansion here.
|
||||
name = frontier[i].pop(0)
|
||||
deps = [name]
|
||||
out.write(" \\" * (len(frontier) - i - 1))
|
||||
write_edge("\\", i)
|
||||
for c in range(i+1, len(frontier)):
|
||||
write_edge(" \\", c)
|
||||
out.write("\n")
|
||||
connect_deps(i, deps, True, "expansion")
|
||||
|
||||
@ -1518,17 +1535,21 @@ def find(seq, predicate):
|
||||
frontier.pop(i)
|
||||
|
||||
out.write(indent)
|
||||
out.write("| " * i)
|
||||
for c in range(i):
|
||||
write_edge("| ", c)
|
||||
out.write("%s " % N)
|
||||
out.write("| " * (len(frontier) - i))
|
||||
for c in range(i, len(frontier)):
|
||||
write_edge("| ", c)
|
||||
out.write(" %s\n" % name)
|
||||
|
||||
if node.dependencies:
|
||||
add_deps_to_frontier(node, i)
|
||||
elif frontier:
|
||||
out.write(indent)
|
||||
out.write("| " * i)
|
||||
out.write(" /" * (len(frontier) - i))
|
||||
for c in range(i):
|
||||
write_edge("| ", c)
|
||||
for c in range(i, len(frontier)):
|
||||
write_edge(" /", c)
|
||||
out.write("\n")
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user