code: def prop_nodes_topo(
      graph,
      message_func,
      reduce_func,
      reverse=False,
      apply_node_func=None,
  ):
      """Message propagation using node frontiers generated by topological order.
  
      Parameters
      ----------
      graph : DGLGraph
          The graph object.
      message_func : callable
          The message function.
      reduce_func : callable
          The reduce function.
      reverse : bool, optional
          If true, traverse following the in-edge direction.
      apply_node_func : callable, optional
          The update function.
  
      See Also
      --------
      dgl.traversal.topological_nodes_generator
      """
      assert isinstance(
          graph, DGLGraph
      ), "DGLHeteroGraph is merged with DGLGraph, Please use DGLGraph"
      assert (
          len(graph.canonical_etypes) == 1
      ), "prop_nodes_topo only support homogeneous graph"
      # TODO(murphy): Graph traversal currently is only supported on
      # CPP graphs. Move graph to CPU as a workaround,
      # which should be fixed in the future.
      nodes_gen = trv.topological_nodes_generator(graph.cpu(), reverse)
      nodes_gen = [
          F.copy_to(frontier, graph.device) for frontier in nodes_gen
      ]
      prop_nodes(
          graph, nodes_gen, message_func, reduce_func, apply_node_func
      )
  
file_path: dgl/python/dgl/propagate.py
imports: from __future__ import absolute_import
  from .None import backend, traversal
  from .heterograph import DGLGraph
label_desc: Use image node_id 4 for calling a global function with example usage: prop_nodes_topo(graph, message_func, reduce_func, reverse, apply_node_func) without return types