class_docstr: DiffConv is the implementation of diffusion convolution from paper DCRNN
  It will compute multiple diffusion matrix and perform multiple diffusion conv on it,
  this layer can be used for traffic prediction, pedamic model.
  Parameter
  ==========
  in_feats : int
      number of input feature
  
  out_feats : int
      number of output feature
  
  k : int
      number of diffusion steps
  
  dir : str [both/in/out]
      direction of diffusion convolution
      From paper default both direction
code: def attach_graph(g, k):
      device = g.device
      out_graph_list = []
      in_graph_list = []
      wadj, ind, outd = DiffConv.get_weight_matrix(g)
      adj = sparse.coo_matrix(wadj / outd.cpu().numpy())
      outg = dgl.from_scipy(adj, eweight_name="weight").to(device)
      outg.edata["weight"] = outg.edata["weight"].float().to(device)
      out_graph_list.append(outg)
      for i in range(k - 1):
          out_graph_list.append(
              DiffConv.diffuse(out_graph_list[-1], wadj, outd)
          )
      adj = sparse.coo_matrix(wadj.T / ind.cpu().numpy())
      ing = dgl.from_scipy(adj, eweight_name="weight").to(device)
      ing.edata["weight"] = ing.edata["weight"].float().to(device)
      in_graph_list.append(ing)
      for i in range(k - 1):
          in_graph_list.append(
              DiffConv.diffuse(in_graph_list[-1], wadj.T, ind)
          )
      return out_graph_list, in_graph_list
  
file_path: dgl/examples/pytorch/dtgrnn/dcrnn.py
imports: import dgl
  import dgl.function
  import numpy
  import scipy.sparse
  import torch
  import torch.nn
  from dgl.base import DGLError
label_desc: Use image node_id 2 for calling the DiffConv obj's underlying member method code with example usage: obj.attach_graph(g, k) and returns: out_graph_list,  in_graph_list