Color graph edges.
This commit is contained in:
		@@ -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")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user