class_docstr: The edge convolutional operator from the `"Dynamic Graph CNN for
  Learning on Point Clouds" <https://arxiv.org/abs/1801.07829>`_ paper
  
  .. math::
      \mathbf{x}^{\prime}_i = \sum_{j \in \mathcal{N}(i)}
      h_{\mathbf{\Theta}}(\mathbf{x}_i \, \Vert \,
      \mathbf{x}_j - \mathbf{x}_i),
  
  where :math:`h_{\mathbf{\Theta}}` denotes a neural network, *.i.e.* a MLP.
  
  Args:
      nn (torch.nn.Module): A neural network :math:`h_{\mathbf{\Theta}}` that
          maps pair-wise concatenated node features :obj:`x` of shape
          :obj:`[-1, 2 * in_channels]` to shape :obj:`[-1, out_channels]`,
          *e.g.*, defined by :class:`torch.nn.Sequential`.
      aggr (string, optional): The aggregation scheme to use
          (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`).
          (default: :obj:`"max"`)
      **kwargs (optional): Additional arguments of
          :class:`torch_geometric.nn.conv.MessagePassing`.
class_docstr_tok: ["The","edge","convolutional","operator","from","the","`","``","Dynamic","Graph","CNN","for","Learning","on","Point","Clouds","''","<","https",":","\/\/arxiv.org\/abs\/1801.07829",">","`","_","paper","..","math",":",":","\\mathbf","{","x","}","^","{","\\prime","}","_i","=","\\sum_","{","j","\\in","\\mathcal","{","N","}","(","i",")","}","h_","{","\\mathbf","{","\\Theta","}","}","(","\\mathbf","{","x","}","_i","\\",",","\\Vert","\\",",","\\mathbf","{","x","}","_j","-","\\mathbf","{","x","}","_i",")",",","where",":","math",":","`","h_","{","\\mathbf","{","\\Theta","}","}","`","denotes","a","neural","network",",","*",".i.e",".","*","a","MLP",".","Args",":","nn","(","torch.nn.Module",")",":","A","neural","network",":","math",":","`","h_","{","\\mathbf","{","\\Theta","}","}","`","that","maps","pair-wise","concatenated","node","features",":","obj",":","`","x","`","of","shape",":","obj",":","`","[","-1",",","2","*","in_channels","]","`","to","shape",":","obj",":","`","[","-1",",","out_channels","]","`",",","*","e.g",".","*",",","defined","by",":","class",":","`","torch.nn.Sequential","`",".","aggr","(","string",",","optional",")",":","The","aggregation","scheme","to","use","(",":","obj",":","`","``","add","''","`",",",":","obj",":","`","``","mean","''","`",",",":","obj",":","`","``","max","''","`",")",".","(","default",":",":","obj",":","`","``","max","''","`",")","*","*","kwargs","(","optional",")",":","Additional","arguments","of",":","class",":","`","torch_geometric.nn.conv.MessagePassing","`","."]
code: def __init__(self, nn: Callable, aggr: str = "max", **kwargs):
      super(EdgeConv, self).__init__(aggr=aggr, **kwargs)
      self.nn = nn
      self.reset_parameters()
  
imports: from typing import Callable, Union, Optional
  from torch_geometric.typing import OptTensor, PairTensor, PairOptTensor, Adj
  import torch
  from torch import Tensor
  from torch_geometric.nn.conv import MessagePassing
  from .inits import reset
label_desc: Use image node_id 1 to create a new EdgeConv object from inherited base classes: MessagePassing with example: obj = EdgeConv(nn, aggr)