code: func (g *Graph) String() string {
  	var s []string
  
  	nodeIndex := make(map[*Node]int, len(g.Nodes))
  
  	for i, n := range g.Nodes {
  		nodeIndex[n] = i + 1
  	}
  
  	for i, n := range g.Nodes {
  		name := n.Info.PrintableName()
  		var in, out []int
  
  		for _, from := range n.In {
  			in = append(in, nodeIndex[from.Src])
  		}
  		for _, to := range n.Out {
  			out = append(out, nodeIndex[to.Dest])
  		}
  		s = append(s, fmt.Sprintf("%d: %s[flat=%d cum=%d] %x -> %v ", i+1, name, n.Flat, n.Cum, in, out))
  	}
  	return strings.Join(s, "\n")
  }
docs: // String returns a text representation of a graph, for debugging purposes.