class_docstr: Implement a graph wrapper that user can use their own data holder. 
  And this graph wrapper support multiple graphs which is benefit for data parallel algorithms.
  
  Args:
      num_nodes (int32 or int64): Shape [ num_graph ]. 
  
      num_edges (int32 or int64): Shape [ num_graph ]. 
  
      edges (int32 or int64): Shape [ total_num_edges_in_the_graphs, 2 ] 
                                or Tuple with (src, dst).
  
      node_feats: A dictionary for node features. Each value should be tensor
                  with shape [ total_num_nodes_in_the_graphs, feature_size]
  
      edge_feats: A dictionary for edge features. Each value should be tensor
                  with shape [ total_num_edges_in_the_graphs, feature_size]
class_docstr_tok: ["Implement","a","graph","wrapper","that","user","can","use","their","own","data","holder",".","And","this","graph","wrapper","support","multiple","graphs","which","is","benefit","for","data","parallel","algorithms",".","Args",":","num_nodes","(","int32","or","int64",")",":","Shape","[","num_graph","]",".","num_edges","(","int32","or","int64",")",":","Shape","[","num_graph","]",".","edges","(","int32","or","int64",")",":","Shape","[","total_num_edges_in_the_graphs",",","2","]","or","Tuple","with","(","src",",","dst",")",".","node_feats",":","A","dictionary","for","node","features",".","Each","value","should","be","tensor","with","shape","[","total_num_nodes_in_the_graphs",",","feature_size","]","edge_feats",":","A","dictionary","for","edge","features",".","Each","value","should","be","tensor","with","shape","[","total_num_edges_in_the_graphs",",","feature_size","]"]
code: def __init__(
      self,
      num_nodes,
      num_edges,
      edges,
      node_feats=None,
      edge_feats=None,
  ):
      super(BatchGraphWrapper, self).__init__()
  
      node_shift, edge_lod = self.__build_meta_data(
          num_nodes, num_edges
      )
      self.__build_edges(edges, node_shift, edge_lod, edge_feats)
  
      # assign node features
      if node_feats is not None:
          for key, value in node_feats.items():
              self.node_feat_tensor_dict[key] = value
  
      # other meta-data
      self._edge_uniq_dst, _, uniq_count = L.unique_with_counts(
          self._edges_dst, dtype="int32"
      )
      self._edge_uniq_dst.stop_gradient = True
      last = L.reduce_sum(uniq_count, keep_dim=True)
      uniq_count = L.cumsum(uniq_count, exclusive=True)
      self._edge_uniq_dst_count = L.concat([uniq_count, last])
      self._edge_uniq_dst_count.stop_gradient = True
      self._indegree = get_degree(self._edges_dst, self._num_nodes)
  
imports: import warnings
  import numpy
  import paddle.fluid
  import paddle.fluid.layers
  from pgl.utils import op
  from pgl.utils import paddle_helper
  from pgl.utils.logger import log
label_desc: Use image node_id 1 to create a new BatchGraphWrapper object from inherited base classes: BaseGraphWrapper with example: obj = BatchGraphWrapper(num_nodes, num_edges, edges, node_feats, edge_feats)