docs: def nx_dag_node_rank(graph, nodes=None):
      """
      Returns rank of nodes that define the "level" each node is on in a
      topological sort. This is the same as the Graphviz dot rank.
  
      Ignore:
          simple_graph = ut.simplify_graph(exi_graph)
          adj_dict = ut.nx_to_adj_dict(simple_graph)
          import plottool as pt
          pt.qt4ensure()
          pt.show_nx(graph)
  
      Example:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_graph import *  # NOQA
          >>> import utool as ut
          >>> adj_dict = {0: [5], 1: [5], 2: [1], 3: [4], 4: [0], 5: [], 6: [4], 7: [9], 8: [6], 9: [1]}
          >>> nodes = [2, 1, 5]
          >>> f_graph = ut.nx_from_adj_dict(adj_dict, nx.DiGraph)
          >>> graph = f_graph.reverse()
          >>> #ranks = ut.nx_dag_node_rank(graph, nodes)
          >>> ranks = ut.nx_dag_node_rank(graph, nodes)
          >>> result = ('ranks = %r' % (ranks,))
          >>> print(result)
          ranks = [3, 2, 1]
      """
      import utool as ut
      source = list(ut.nx_source_nodes(graph))[0]
      longest_paths = dict([(target, dag_longest_path(graph, source, target))
                            for target in graph.nodes()])
      node_to_rank = ut.map_dict_vals(len, longest_paths)
      if nodes is None:
          return node_to_rank
      else:
          ranks = ut.dict_take(node_to_rank, nodes)
          return ranks