class_docstr: An implementation of GMAN.
  For details see this paper: `"GMAN: A Graph Multi-Attention Network for Traffic Prediction."
  <https://arxiv.org/pdf/1911.08415.pdf>`_
  
  Args:
      L (int) : Number of STAtt blocks in the encoder/decoder.
      K (int) : Number of attention heads.
      d (int) : Dimension of each attention head outputs.
      num_his (int): Number of history steps.
      bn_decay (float): Batch normalization momentum.
      steps_per_day (int): Number of steps in a day.
      use_bias (bool): Whether to use bias in Fully Connected layers.
      mask (bool): Whether to mask attention score in temporal attention.
docstr: Making a forward pass of GMAN.
  
  Arg types:
      * **X** (PyTorch Float Tensor) - Input sequence, with shape (batch_size, num_hist, num of nodes).
      * **SE** (Pytorch Float Tensor) - Spatial embedding, with shape (numbed of nodes, K * d).
      * **TE** (Pytorch Float Tensor) - Temporal embedding, with shape (batch_size, num_his + num_pred, 2).
  
  Return types:
      * **X** (PyTorch Float Tensor) - Output sequence for prediction, with shape (batch_size, num_pred, num of nodes).
docstr_tok: ["Making","a","forward","pass","of","GMAN",".","Arg","types",":","*","*","*","X","*","*","(","PyTorch","Float","Tensor",")","-","Input","sequence",",","with","shape","(","batch_size",",","num_hist",",","num","of","nodes",")",".","*","*","*","SE","*","*","(","Pytorch","Float","Tensor",")","-","Spatial","embedding",",","with","shape","(","numbed","of","nodes",",","K","*","d",")",".","*","*","*","TE","*","*","(","Pytorch","Float","Tensor",")","-","Temporal","embedding",",","with","shape","(","batch_size",",","num_his","+","num_pred",",","2",")",".","Return","types",":","*","*","*","X","*","*","(","PyTorch","Float","Tensor",")","-","Output","sequence","for","prediction",",","with","shape","(","batch_size",",","num_pred",",","num","of","nodes",")","."]
code: def forward(
      self,
      X: torch.FloatTensor,
      SE: torch.FloatTensor,
      TE: torch.FloatTensor,
  ) -> torch.FloatTensor:
      """
      Making a forward pass of GMAN.
  
      Arg types:
          * **X** (PyTorch Float Tensor) - Input sequence, with shape (batch_size, num_hist, num of nodes).
          * **SE** (Pytorch Float Tensor) - Spatial embedding, with shape (numbed of nodes, K * d).
          * **TE** (Pytorch Float Tensor) - Temporal embedding, with shape (batch_size, num_his + num_pred, 2).
  
      Return types:
          * **X** (PyTorch Float Tensor) - Output sequence for prediction, with shape (batch_size, num_pred, num of nodes).
      """
      X = torch.unsqueeze(X, -1)
      X = self._fully_connected_1(X)
      STE = self._st_embedding(SE, TE, self._steps_per_day)
      STE_his = STE[:, : self._num_his]
      STE_pred = STE[:, self._num_his :]
      for net in self._st_att_block1:
          X = net(X, STE_his)
      X = self._transform_attention(X, STE_his, STE_pred)
      for net in self._st_att_block2:
          X = net(X, STE_pred)
      X = torch.squeeze(self._fully_connected_2(X), 3)
      return X
  
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 GMAN obj's underlying member method code with example usage: obj.forward(X, SE, TE) and returns: X