code: def _get_graph_reductions(graph):
      def frontier(g, nd):
          if g.out_degree(nd) == 0:
              return set([nd])
          else:
              frontiers = set()
              for n in g.successors(nd):
                  frontiers = frontiers.union(frontier(graph, n))
              return frontiers
      reductions = {}
      nodes_sort = list(networkx.algorithms.dag.topological_sort(graph))
      frontiers = [frontier(graph, n) for n in nodes_sort]
      for i, n1 in enumerate(nodes_sort):
          for j, n2 in enumerate(nodes_sort):
              if i > j:
                  continue
              if frontiers[i] == frontiers[j]:
                  reductions[n1] = n2
      return reductions