code: function run(g) {
    var root = util.addDummyNode(g, "root", {}, "_root");
    var depths = treeDepths(g);
    var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array
    var nodeSep = 2 * height + 1;
  
    g.graph().nestingRoot = root;
  
    // Multiply minlen by nodeSep to align nodes on non-border ranks.
    _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });
  
    // Calculate a weight that is sufficient to keep subgraphs vertically compact
    var weight = sumWeights(g) + 1;
  
    // Create border nodes and link them up
    _.forEach(g.children(), function(child) {
      dfs(g, root, nodeSep, weight, height, depths, child);
    });
  
    // Save the multiplier for node layers for later removal of empty border
    // layers.
    g.graph().nodeRankFactor = nodeSep;
  }
docs: /*
  A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,
  adds appropriate edges to ensure that all cluster nodes are placed between
  these boundries, and ensures that the graph is connected.
  
  In addition we ensure, through the use of the minlen property, that nodes
  and subgraph border nodes to not end up on the same rank.
  
  Preconditions:
  
  1. Input graph is a DAG
  2. Nodes in the input graph has a minlen attribute
  
  Postconditions:
  
  1. Input graph is connected.
  2. Dummy nodes are added for the tops and bottoms of subgraphs.
  3. The minlen attribute for nodes is adjusted to ensure nodes do not
  get placed on the same rank as subgraph border nodes.
  
  The nesting graph idea comes from Sander, "Layout of Compound Directed
  Graphs."