class_docstr: Directional Graph Network Layer from `Directional Graph Networks
  <https://arxiv.org/abs/2010.02863>`__
  
  DGN introduces two special directional aggregators according to the vector field
  :math:`F`, which is defined as the gradient of the low-frequency eigenvectors of graph
  laplacian.
  
  The directional average aggregator is defined as
  :math:`h_i' = \sum_{j\in\mathcal{N}(i)}\frac{|F_{i,j}|\cdot h_j}{||F_{i,:}||_1+\epsilon}`
  
  The directional derivative aggregator is defined as
  :math:`h_i' = \sum_{j\in\mathcal{N}(i)}\frac{F_{i,j}\cdot h_j}{||F_{i,:}||_1+\epsilon}
  -h_i\cdot\sum_{j\in\mathcal{N}(i)}\frac{F_{i,j}}{||F_{i,:}||_1+\epsilon}`
  
  :math:`\epsilon` is the infinitesimal to keep the computation numerically stable.
  
  Parameters
  ----------
  in_size : int
      Input feature size; i.e. the size of :math:`h_i^l`.
  out_size : int
      Output feature size; i.e. the size of :math:`h_i^{l+1}`.
  aggregators : list of str
      List of aggregation function names(each aggregator specifies a way to aggregate
      messages from neighbours), selected from:
  
      * ``mean``: the mean of neighbour messages
  
      * ``max``: the maximum of neighbour messages
  
      * ``min``: the minimum of neighbour messages
  
      * ``std``: the standard deviation of neighbour messages
  
      * ``var``: the variance of neighbour messages
  
      * ``sum``: the sum of neighbour messages
  
      * ``moment3``, ``moment4``, ``moment5``: the normalized moments aggregation
      :math:`(E[(X-E[X])^n])^{1/n}`
  
      * ``dir{k}-av``: directional average aggregation with directions defined by the k-th
      smallest eigenvectors. k can be selected from 1, 2, 3.
  
      * ``dir{k}-dx``: directional derivative aggregation with directions defined by the k-th
      smallest eigenvectors. k can be selected from 1, 2, 3.
  
      Note that using directional aggregation requires the LaplacianPE transform on the input
      graph for eigenvector computation (the PE size must be >= k above).
  scalers: list of str
      List of scaler function names, selected from:
  
      * ``identity``: no scaling
  
      * ``amplification``: multiply the aggregated message by :math:`\log(d+1)/\delta`,
      where :math:`d` is the in-degree of the node.
  
      * ``attenuation``: multiply the aggregated message by :math:`\delta/\log(d+1)`
  delta: float
      The in-degree-related normalization factor computed over the training set, used by scalers
      for normalization. :math:`E[\log(d+1)]`, where :math:`d` is the in-degree for each node
      in the training set.
  dropout: float, optional
      The dropout ratio. Default: 0.0.
  num_towers: int, optional
      The number of towers used. Default: 1. Note that in_size and out_size must be divisible
      by num_towers.
  edge_feat_size: int, optional
      The edge feature size. Default: 0.
  residual : bool, optional
      The bool flag that determines whether to add a residual connection for the
      output. Default: True. If in_size and out_size of the DGN conv layer are not
      the same, this flag will be set as False forcibly.
  
  Example
  -------
  >>> import dgl
  >>> import torch as th
  >>> from dgl.nn import DGNConv
  >>> from dgl import LaplacianPE
  >>>
  >>> # DGN requires precomputed eigenvectors, with 'eig' as feature name.
  >>> transform = LaplacianPE(k=3, feat_name='eig')
  >>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
  >>> g = transform(g)
  >>> eig = g.ndata['eig']
  >>> feat = th.ones(6, 10)
  >>> conv = DGNConv(10, 10, ['dir1-av', 'dir1-dx', 'sum'], ['identity', 'amplification'], 2.5)
  >>> ret = conv(g, feat, eig_vec=eig)
docstr: Description
  -----------
  Compute DGN layer.
  
  Parameters
  ----------
  graph : DGLGraph
      The graph.
  node_feat : torch.Tensor
      The input feature of shape :math:`(N, h_n)`. :math:`N` is the number of
      nodes, and :math:`h_n` must be the same as in_size.
  edge_feat : torch.Tensor, optional
      The edge feature of shape :math:`(M, h_e)`. :math:`M` is the number of
      edges, and :math:`h_e` must be the same as edge_feat_size.
  eig_vec : torch.Tensor, optional
      K smallest non-trivial eigenvectors of Graph Laplacian of shape :math:`(N, K)`.
      It is only required when :attr:`aggregators` contains directional aggregators.
  
  Returns
  -------
  torch.Tensor
      The output node feature of shape :math:`(N, h_n')` where :math:`h_n'`
      should be the same as out_size.
docstr_tok: ["Description","--","--","--","--","--","-","Compute","DGN","layer",".","Parameters","--","--","--","--","--","graph",":","DGLGraph","The","graph",".","node_feat",":","torch.Tensor","The","input","feature","of","shape",":","math",":","`","(","N",",","h_n",")","`",".",":","math",":","`","N","`","is","the","number","of","nodes",",","and",":","math",":","`","h_n","`","must","be","the","same","as","in_size",".","edge_feat",":","torch.Tensor",",","optional","The","edge","feature","of","shape",":","math",":","`","(","M",",","h_e",")","`",".",":","math",":","`","M","`","is","the","number","of","edges",",","and",":","math",":","`","h_e","`","must","be","the","same","as","edge_feat_size",".","eig_vec",":","torch.Tensor",",","optional","K","smallest","non-trivial","eigenvectors","of","Graph","Laplacian","of","shape",":","math",":","`","(","N",",","K",")","`",".","It","is","only","required","when",":","attr",":","`","aggregators","`","contains","directional","aggregators",".","Returns","--","--","--","-","torch.Tensor","The","output","node","feature","of","shape",":","math",":","`","(","N",",","h_n","'",")","`","where",":","math",":","`","h_n","'","`","should","be","the","same","as","out_size","."]
code: def forward(self, graph, node_feat, edge_feat=None, eig_vec=None):
      r"""
      Description
      -----------
      Compute DGN layer.
  
      Parameters
      ----------
      graph : DGLGraph
          The graph.
      node_feat : torch.Tensor
          The input feature of shape :math:`(N, h_n)`. :math:`N` is the number of
          nodes, and :math:`h_n` must be the same as in_size.
      edge_feat : torch.Tensor, optional
          The edge feature of shape :math:`(M, h_e)`. :math:`M` is the number of
          edges, and :math:`h_e` must be the same as edge_feat_size.
      eig_vec : torch.Tensor, optional
          K smallest non-trivial eigenvectors of Graph Laplacian of shape :math:`(N, K)`.
          It is only required when :attr:`aggregators` contains directional aggregators.
  
      Returns
      -------
      torch.Tensor
          The output node feature of shape :math:`(N, h_n')` where :math:`h_n'`
          should be the same as out_size.
      """
      with graph.local_scope():
          if self.use_eig_vec:
              graph.ndata["eig"] = eig_vec
          return super().forward(graph, node_feat, edge_feat)
  
file_path: dgl/python/dgl/nn/pytorch/conv/dgnconv.py
imports: from functools import partial
  import torch
  import torch.nn
  from .pnaconv import AGGREGATORS, PNAConv, PNAConvTower, SCALERS
label_desc: Use image node_id 2 for calling the DGNConv obj's underlying member method code with example usage: obj.forward(graph, node_feat, edge_feat, eig_vec) and returns: super