| library graphlib.layout.order.add_subgraph_constraints; |
| |
| import "../../graph.dart" show Graph; |
| |
| addSubgraphConstraints(Graph g, Graph cg, Iterable vs) { |
| var prev = {}, |
| rootPrev; |
| |
| vs.forEach((v) { |
| var child = g.parent(v), |
| parent, |
| prevChild; |
| while (child != null) { |
| parent = g.parent(child); |
| if (parent != null) { |
| prevChild = prev[parent]; |
| prev[parent] = child; |
| } else { |
| prevChild = rootPrev; |
| rootPrev = child; |
| } |
| if (prevChild != null && prevChild != child) { |
| cg.setEdge(prevChild, child); |
| return; |
| } |
| child = parent; |
| } |
| }); |
| |
| /* |
| function dfs(v) { |
| var children = v ? g.children(v) : g.children(); |
| if (children.length) { |
| var min = Number.POSITIVE_INFINITY, |
| subgraphs = []; |
| _.each(children, function(child) { |
| var childMin = dfs(child); |
| if (g.children(child).length) { |
| subgraphs.push({ v: child, order: childMin }); |
| } |
| min = Math.min(min, childMin); |
| }); |
| _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) { |
| cg.setEdge(prev.v, curr.v); |
| return curr; |
| }); |
| return min; |
| } |
| return g.node(v).order; |
| } |
| dfs(undefined); |
| */ |
| } |