class_docstr: The graph isomorphism operator from the `"How Powerful are
  Graph Neural Networks?" <https://arxiv.org/abs/1810.00826>`_ paper.
  
  .. math::
      \mathbf{x}^{\prime}_i = h_{\mathbf{\Theta}} \left( (1 + \epsilon) \cdot
      \mathbf{x}_i + \sum_{j \in \mathcal{N}(i)} \mathbf{x}_j \right)
  
  or
  
  .. math::
      \mathbf{X}^{\prime} = h_{\mathbf{\Theta}} \left( \left( \mathbf{A} +
      (1 + \epsilon) \cdot \mathbf{I} \right) \cdot \mathbf{X} \right),
  
  here :math:`h_{\mathbf{\Theta}}` denotes a neural network, *.i.e.* an MLP.
  
  Args:
      nn (torch.nn.Module): A neural network :math:`h_{\mathbf{\Theta}}` that
          maps node features :obj:`x` of shape :obj:`[-1, in_channels]` to
          shape :obj:`[-1, out_channels]`, *e.g.*, defined by
          :class:`torch.nn.Sequential`.
      eps (float, optional): (Initial) :math:`\epsilon`-value.
          (default: :obj:`0.`)
      train_eps (bool, optional): If set to :obj:`True`, :math:`\epsilon`
          will be a trainable parameter. (default: :obj:`False`)
      **kwargs (optional): Additional arguments of
          :class:`torch_geometric.nn.conv.MessagePassing`.
  
  Shapes:
      - **input:**
        node features :math:`(|\mathcal{V}|, F_{in})` or
        :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))`
        if bipartite,
        edge indices :math:`(2, |\mathcal{E}|)`
      - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or
        :math:`(|\mathcal{V}_t|, F_{out})` if bipartite
code: def __init__(
      self,
      nn: Callable,
      eps: float = 0.0,
      train_eps: bool = False,
      **kwargs,
  ):
      kwargs.setdefault("aggr", "add")
      super().__init__(**kwargs)
      self.nn = nn
      self.initial_eps = eps
      if train_eps:
          self.eps = torch.nn.Parameter(torch.empty(1))
      else:
          self.register_buffer("eps", torch.empty(1))
      self.reset_parameters()
  
imports: from typing import Callable, Optional, Union
  import torch
  from torch import Tensor
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.dense.linear import Linear
  from torch_geometric.nn.inits import reset
  from torch_geometric.typing import Adj, OptPairTensor, OptTensor, Size, SparseTensor
  from torch_geometric.utils import spmm
label_desc: Use image node_id 1 to create a new GINConv object from inherited base classes: MessagePassing with example: obj = GINConv(nn, eps, train_eps)