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.
|
# Fast access to nodes in the spec.
|
||||||
nodes = clone.index()
|
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 = []
|
frontier = []
|
||||||
|
|
||||||
def ordered_deps(node):
|
def ordered_deps(node):
|
||||||
@ -1363,29 +1373,30 @@ def back_edge(prev_ends, end, start, collapse, label=None):
|
|||||||
|
|
||||||
f = len(frontier)
|
f = len(frontier)
|
||||||
|
|
||||||
|
self._pos = 0
|
||||||
def advance(to, fun):
|
def advance(to, fun):
|
||||||
for i in range(advance.pos, to):
|
for i in range(self._pos, to):
|
||||||
fun()
|
fun()
|
||||||
advance.pos += 1
|
self._pos += 1
|
||||||
advance.pos = 0
|
|
||||||
|
|
||||||
for p in prev_ends:
|
for p in prev_ends:
|
||||||
advance(p, lambda: out.write("| "))
|
advance(p, lambda: write_edge("| ", self._pos))
|
||||||
advance(p+1, lambda: out.write("|/"))
|
advance(p+1, lambda: write_edge("|/", self._pos))
|
||||||
|
|
||||||
if end >= 0:
|
if end >= 0:
|
||||||
advance(end + 1, lambda: out.write("| "))
|
advance(end + 1, lambda: write_edge("| ", self._pos))
|
||||||
advance(start - 1, lambda: out.write("|_"))
|
advance(start - 1, lambda: (write_edge("|", self._pos) or
|
||||||
|
write_edge("_", end)))
|
||||||
else:
|
else:
|
||||||
advance(start - 1, lambda: out.write("| "))
|
advance(start - 1, lambda: write_edge("| ", self._pos))
|
||||||
|
|
||||||
if start >= 0:
|
if start >= 0:
|
||||||
advance(start, lambda: out.write("|/"))
|
advance(start, lambda: (write_edge("|", self._pos) or
|
||||||
|
write_edge("/", end)))
|
||||||
|
|
||||||
if collapse:
|
if collapse:
|
||||||
advance(len(frontier), lambda: out.write(" /"))
|
advance(len(frontier), lambda: write_edge(" /", self._pos))
|
||||||
else:
|
else:
|
||||||
advance(len(frontier), lambda: out.write("| "))
|
advance(len(frontier), lambda: write_edge("| ", self._pos))
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
out.write(" " * 10)
|
out.write(" " * 10)
|
||||||
@ -1462,11 +1473,11 @@ def find(seq, predicate):
|
|||||||
|
|
||||||
prev_ends = []
|
prev_ends = []
|
||||||
for j, (b, d) in enumerate(back):
|
for j, (b, d) in enumerate(back):
|
||||||
|
frontier[i].remove(d)
|
||||||
if i-b > 1:
|
if i-b > 1:
|
||||||
back_edge(prev_ends, b, i, False)
|
back_edge(prev_ends, b, i, False)
|
||||||
del prev_ends[:]
|
del prev_ends[:]
|
||||||
prev_ends.append(b)
|
prev_ends.append(b)
|
||||||
frontier[i].remove(d)
|
|
||||||
back_edge(prev_ends, -1, -1, False)
|
back_edge(prev_ends, -1, -1, False)
|
||||||
|
|
||||||
if not frontier[i]:
|
if not frontier[i]:
|
||||||
@ -1475,8 +1486,9 @@ def find(seq, predicate):
|
|||||||
elif len(frontier[i]) > 1:
|
elif len(frontier[i]) > 1:
|
||||||
# Expand forawrd after doing all back connections
|
# Expand forawrd after doing all back connections
|
||||||
out.write(indent)
|
out.write(indent)
|
||||||
out.write("| " * i)
|
for c in range(i):
|
||||||
out.write("|\\")
|
write_edge("| ", c)
|
||||||
|
write_edge("|", i)
|
||||||
|
|
||||||
if (i+1 < len(frontier) and len(frontier[i+1]) == 1
|
if (i+1 < len(frontier) and len(frontier[i+1]) == 1
|
||||||
and frontier[i+1][0] in frontier[i]):
|
and frontier[i+1][0] in frontier[i]):
|
||||||
@ -1485,14 +1497,19 @@ def find(seq, predicate):
|
|||||||
# avoiding immediate expand/contract.
|
# avoiding immediate expand/contract.
|
||||||
name = frontier[i+1][0]
|
name = frontier[i+1][0]
|
||||||
frontier[i].remove(name)
|
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")
|
out.write("\n")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Just allow the expansion here.
|
# Just allow the expansion here.
|
||||||
name = frontier[i].pop(0)
|
name = frontier[i].pop(0)
|
||||||
deps = [name]
|
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")
|
out.write("\n")
|
||||||
connect_deps(i, deps, True, "expansion")
|
connect_deps(i, deps, True, "expansion")
|
||||||
|
|
||||||
@ -1518,17 +1535,21 @@ def find(seq, predicate):
|
|||||||
frontier.pop(i)
|
frontier.pop(i)
|
||||||
|
|
||||||
out.write(indent)
|
out.write(indent)
|
||||||
out.write("| " * i)
|
for c in range(i):
|
||||||
|
write_edge("| ", c)
|
||||||
out.write("%s " % N)
|
out.write("%s " % N)
|
||||||
out.write("| " * (len(frontier) - i))
|
for c in range(i, len(frontier)):
|
||||||
|
write_edge("| ", c)
|
||||||
out.write(" %s\n" % name)
|
out.write(" %s\n" % name)
|
||||||
|
|
||||||
if node.dependencies:
|
if node.dependencies:
|
||||||
add_deps_to_frontier(node, i)
|
add_deps_to_frontier(node, i)
|
||||||
elif frontier:
|
elif frontier:
|
||||||
out.write(indent)
|
out.write(indent)
|
||||||
out.write("| " * i)
|
for c in range(i):
|
||||||
out.write(" /" * (len(frontier) - i))
|
write_edge("| ", c)
|
||||||
|
for c in range(i, len(frontier)):
|
||||||
|
write_edge(" /", c)
|
||||||
out.write("\n")
|
out.write("\n")
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user