class_docstr: Implementation of heterogeneous graph structure in pgl
  
  This is a simple implementation of heterogeneous graph structure in pgl.
  
  Args:
      num_nodes: number of nodes in a heterogeneous graph
      edges: dict, every element in dict is a list of (u, v) tuples.
      node_types (optional): list of (u, node_type) tuples to specify the node type of every node
      node_feat (optional): a dict of numpy array as node features
      edge_feat (optional): a dict of dict as edge features for every edge type
  
  Examples:
      .. code-block:: python
  
          import numpy as np
          num_nodes = 4
          node_types = [(0, 'user'), (1, 'item'), (2, 'item'), (3, 'user')]
          edges = {
              'edges_type1': [(0,1), (3,2)],
              'edges_type2': [(1,2), (3,1)],
          }
          node_feat = {'feature': np.random.randn(4, 16)}
          edges_feat = {
              'edges_type1': {'h': np.random.randn(2, 16)},
              'edges_type2': {'h': np.random.randn(2, 16)},
          }
  
          g = heter_graph.HeterGraph(
                          num_nodes=num_nodes,
                          edges=edges,
                          node_types=node_types,
                          node_feat=node_feat,
                          edge_feat=edges_feat)
class_docstr_tok: ["Implementation","of","heterogeneous","graph","structure","in","pgl","This","is","a","simple","implementation","of","heterogeneous","graph","structure","in","pgl",".","Args",":","num_nodes",":","number","of","nodes","in","a","heterogeneous","graph","edges",":","dict",",","every","element","in","dict","is","a","list","of","(","u",",","v",")","tuples",".","node_types","(","optional",")",":","list","of","(","u",",","node_type",")","tuples","to","specify","the","node","type","of","every","node","node_feat","(","optional",")",":","a","dict","of","numpy","array","as","node","features","edge_feat","(","optional",")",":","a","dict","of","dict","as","edge","features","for","every","edge","type","Examples",":","..","code-block",":",":","python","import","numpy","as","np","num_nodes","=","4","node_types","=","[","(","0",",","'user","'",")",",","(","1",",","'item","'",")",",","(","2",",","'item","'",")",",","(","3",",","'user","'",")","]","edges","=","{","'edges_type1","'",":","[","(","0,1",")",",","(","3,2",")","]",",","'edges_type2","'",":","[","(","1,2",")",",","(","3,1",")","]",",","}","node_feat","=","{","'feature","'",":","np.random.randn","(","4",",","16",")","}","edges_feat","=","{","'edges_type1","'",":","{","'","h","'",":","np.random.randn","(","2",",","16",")","}",",","'edges_type2","'",":","{","'","h","'",":","np.random.randn","(","2",",","16",")","}",",","}","g","=","heter_graph.HeterGraph","(","num_nodes=num_nodes",",","edges=edges",",","node_types=node_types",",","node_feat=node_feat",",","edge_feat=edges_feat",")"]
docstr: Return the information of edge feature for HeterGraphWrapper.
  
  This function return the information of edge features of all edge types. And this
  function is used to help constructing HeterGraphWrapper
  
  Return:
      A dict of list of tuple (name, shape, dtype) for all given edge feature.
docstr_tok: ["Return","the","information","of","edge","feature","for","HeterGraphWrapper",".","This","function","return","the","information","of","edge","features","of","all","edge","types",".","And","this","function","is","used","to","help","constructing","HeterGraphWrapper","Return",":","A","dict","of","list","of","tuple","(","name",",","shape",",","dtype",")","for","all","given","edge","feature","."]
code: def edge_feat_info(self):
      """Return the information of edge feature for HeterGraphWrapper.
  
      This function return the information of edge features of all edge types. And this
      function is used to help constructing HeterGraphWrapper
  
      Return:
          A dict of list of tuple (name, shape, dtype) for all given edge feature.
  
      """
      edge_feat_info = {}
      for edge_type_name, feat_dict in self._edge_feat.items():
          tmp_edge_feat_info = []
          for feat_name, feat in feat_dict.items():
              full_name = feat_name
              tmp_edge_feat_info.append(
                  (full_name, _hide_num_nodes(feat.shape), feat.dtype)
              )
          edge_feat_info[edge_type_name] = tmp_edge_feat_info
      return edge_feat_info
  
imports: import os
  import time
  import numpy
  import pickle
  import time
  import pgl.graph_kernel
  from pgl.graph import Graph, MemmapGraph
label_desc: Use image node_id 21 for calling the HeterGraph obj's underlying member method code with example usage: obj.edge_feat_info() and returns: edge_feat_info