class_docstr: Graph Isomorphism Network with Edge Features, introduced by
  `Strategies for Pre-training Graph Neural Networks <https://arxiv.org/abs/1905.12265>`__
  
  .. math::
      h_i^{(l+1)} = f_\Theta \left((1 + \epsilon) h_i^{l} +
      \sum_{j\in\mathcal{N}(i)}\mathrm{ReLU}(h_j^{l} + e_{j,i}^{l})\right)
  
  where :math:`e_{j,i}^{l}` is the edge feature.
  
  Parameters
  ----------
  apply_func : callable module or None
      The :math:`f_\Theta` in the formula. If not None, it will be applied to
      the updated node features. The default value is None.
  init_eps : float, optional
      Initial :math:`\epsilon` value, default: ``0``.
  learn_eps : bool, optional
      If True, :math:`\epsilon` will be a learnable parameter. Default: ``False``.
  
  Examples
  --------
  
  >>> import dgl
  >>> import torch
  >>> import torch.nn as nn
  >>> from dgl.nn import GINEConv
  
  >>> g = dgl.graph(([0, 1, 2], [1, 1, 3]))
  >>> in_feats = 10
  >>> out_feats = 20
  >>> nfeat = torch.randn(g.num_nodes(), in_feats)
  >>> efeat = torch.randn(g.num_edges(), in_feats)
  >>> conv = GINEConv(nn.Linear(in_feats, out_feats))
  >>> res = conv(g, nfeat, efeat)
  >>> print(res.shape)
  torch.Size([4, 20])
code: def __init__(self, apply_func=None, init_eps=0, learn_eps=False):
      super(GINEConv, self).__init__()
      self.apply_func = apply_func
      # to specify whether eps is trainable or not.
      if learn_eps:
          self.eps = nn.Parameter(th.FloatTensor([init_eps]))
      else:
          self.register_buffer("eps", th.FloatTensor([init_eps]))
  
file_path: dgl/python/dgl/nn/pytorch/conv/gineconv.py
imports: import torch
  import torch.nn.functional
  from torch import nn
  from ....None import function
  from ....utils import expand_as_pair
label_desc: Use image node_id 1 to create a new GINEConv object from inherited base classes: nn with example: obj = GINEConv(apply_func, init_eps, learn_eps)