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","]"]
docstr: Merge information for nodes and edges.
          
docstr_tok: ["Merge","information","for","nodes","and","edges","."]
code: def __build_meta_data(self, num_nodes, num_edges):
      """Merge information for nodes and edges."""
      num_nodes = L.reshape(num_nodes, [-1])
      num_edges = L.reshape(num_edges, [-1])
      num_nodes = paddle_helper.ensure_dtype(num_nodes, dtype="int32")
      num_edges = paddle_helper.ensure_dtype(num_edges, dtype="int32")
  
      num_graph = L.shape(num_nodes)[0]
      sum_num_nodes = L.reduce_sum(num_nodes)
      sum_num_edges = L.reduce_sum(num_edges)
      edge_lod = L.concat(
          [L.cumsum(num_edges, exclusive=True), sum_num_edges]
      )
      edge_lod = paddle_helper.lod_remove(edge_lod)
  
      node_shift = L.cumsum(num_nodes, exclusive=True)
      graph_lod = L.concat([node_shift, sum_num_nodes])
      graph_lod = paddle_helper.lod_remove(graph_lod)
      self._num_nodes = sum_num_nodes
      self._num_edges = sum_num_edges
      self._num_graph = num_graph
      self._graph_lod = graph_lod
      return node_shift, edge_lod
  
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 2 for calling the BatchGraphWrapper obj's underlying member method code with example usage: obj.__build_meta_data(num_nodes, num_edges) and returns: node_shift,  edge_lod