class_docstr: An implementation of the 2D-convolution block.
  For details see this paper: `"GMAN: A Graph Multi-Attention Network for Traffic Prediction."
  <https://arxiv.org/pdf/1911.08415.pdf>`_
  
  Args:
      input_dims (int): Dimension of input.
      output_dims (int): Dimension of output.
      kernel_size (tuple or list): Size of the convolution kernel.
      stride (tuple or list, optional): Convolution strides, default (1,1).
      use_bias (bool, optional): Whether to use bias, default is True.
      activation (Callable, optional): Activation function, default is torch.nn.functional.relu.
      bn_decay (float, optional): Batch normalization momentum, default is None.
docstr: Making a forward pass of the 2D-convolution block.
  
  Arg types:
      * **X** (PyTorch Float Tensor) - Input tensor, with shape (batch_size, num_his, num_nodes, input_dims).
  
  Return types:
      * **X** (PyTorch Float Tensor) - Output tensor, with shape (batch_size, num_his, num_nodes, output_dims).
docstr_tok: ["Making","a","forward","pass","of","the","2D-convolution","block",".","Arg","types",":","*","*","*","X","*","*","(","PyTorch","Float","Tensor",")","-","Input","tensor",",","with","shape","(","batch_size",",","num_his",",","num_nodes",",","input_dims",")",".","Return","types",":","*","*","*","X","*","*","(","PyTorch","Float","Tensor",")","-","Output","tensor",",","with","shape","(","batch_size",",","num_his",",","num_nodes",",","output_dims",")","."]
code: def forward(self, X: torch.FloatTensor) -> torch.FloatTensor:
      """
      Making a forward pass of the 2D-convolution block.
  
      Arg types:
          * **X** (PyTorch Float Tensor) - Input tensor, with shape (batch_size, num_his, num_nodes, input_dims).
  
      Return types:
          * **X** (PyTorch Float Tensor) - Output tensor, with shape (batch_size, num_his, num_nodes, output_dims).
      """
      X = X.permute(0, 3, 2, 1)
      X = self._conv2d(X)
      X = self._batch_norm(X)
      if self._activation is not None:
          X = self._activation(X)
      return X.permute(0, 3, 2, 1)
  
imports: import math
  from typing import Union, Callable, Optional
  import torch
  import torch.nn
  import torch.nn.functional
label_desc: Use image node_id 2 for calling the Conv2D obj's underlying member method code with example usage: obj.forward(X) and returns: X