code: def recv(
      self, edge_index, num_nodes, reduce_func, msg, recv_mode="dst"
  ):
      if not isinstance(msg, dict):
          raise TypeError(
              "The input of msg should be a dict, but receives a %s"
              % (type(msg))
          )
  
      if not callable(reduce_func):
          raise TypeError("reduce_func should be callable")
  
      src, dst, eid = self.sort_edges(
          edge_index, num_nodes, sort_by=recv_mode
      )
  
      msg = op.RowReader(msg, eid)
  
      if recv_mode == "dst":
          # pdb.set_trace()
          # uniq_ind, self._segment_ids = unique_segment(dst)
          uniq_ind, segment_ids = unique_segment(dst)
      elif recv_mode == "src":
          # uniq_ind, segment_ids = unique_segment(src)
          uniq_ind, segment_ids = unique_segment(src)
  
      bucketed_msg = Message(msg, segment_ids)
      output = reduce_func(bucketed_msg)
      output_dim = output.shape[-1]
      init_output = paddle.zeros(
          shape=[num_nodes, output_dim], dtype=output.dtype
      )
      final_output = paddle.scatter(init_output, uniq_ind, output)
  
      return final_output
  
file_path: PGL/examples/gnn_depoly/models/base_conv.py
imports: import pdb
  import paddle
  import paddle.nn
  from pgl.utils import op
  from pgl.message import Message
  from pgl.utils.helper import unique_segment
label_desc: Use image node_id 4 for calling the BaseConv obj's underlying member method code with example usage: obj.recv(edge_index, num_nodes, reduce_func, msg, recv_mode) and returns: final_output