class_docstr: The Jumping Knowledge layer aggregation module from the
  `"Representation Learning on Graphs with Jumping Knowledge Networks"
  <https://arxiv.org/abs/1806.03536>`_ paper.
  
  Jumping knowledge is performed based on either **concatenation**
  (:obj:`"cat"`)
  
  .. math::
  
      \mathbf{x}_v^{(1)} \, \Vert \, \ldots \, \Vert \, \mathbf{x}_v^{(T)},
  
  **max pooling** (:obj:`"max"`)
  
  .. math::
  
      \max \left( \mathbf{x}_v^{(1)}, \ldots, \mathbf{x}_v^{(T)} \right),
  
  or **weighted summation**
  
  .. math::
  
      \sum_{t=1}^T \alpha_v^{(t)} \mathbf{x}_v^{(t)}
  
  with attention scores :math:`\alpha_v^{(t)}` obtained from a bi-directional
  LSTM (:obj:`"lstm"`).
  
  Args:
      mode (str): The aggregation scheme to use
          (:obj:`"cat"`, :obj:`"max"` or :obj:`"lstm"`).
      channels (int, optional): The number of channels per representation.
          Needs to be only set for LSTM-style aggregation.
          (default: :obj:`None`)
      num_layers (int, optional): The number of layers to aggregate. Needs to
          be only set for LSTM-style aggregation. (default: :obj:`None`)
code: def __init__(
      self,
      mode: str,
      channels: Optional[int] = None,
      num_layers: Optional[int] = None,
  ):
      super().__init__()
      self.mode = mode.lower()
      assert self.mode in ["cat", "max", "lstm"]
  
      if mode == "lstm":
          assert (
              channels is not None
          ), "channels cannot be None for lstm"
          assert (
              num_layers is not None
          ), "num_layers cannot be None for lstm"
          self.lstm = LSTM(
              channels,
              (num_layers * channels) // 2,
              bidirectional=True,
              batch_first=True,
          )
          self.att = Linear(2 * ((num_layers * channels) // 2), 1)
          self.channels = channels
          self.num_layers = num_layers
      else:
          self.lstm = None
          self.att = None
          self.channels = None
          self.num_layers = None
  
      self.reset_parameters()
  
file_path: pytorch_geometric/torch_geometric/nn/models/jumping_knowledge.py
imports: from typing import List, Optional
  import torch
  from torch import Tensor
  from torch.nn import LSTM, Linear
label_desc: Use image node_id 1 to create a new JumpingKnowledge object from inherited base classes: torch.nn with example: obj = JumpingKnowledge(mode, channels, num_layers)