class_docstr: An implementation of the Node Adaptive Graph Convolution Layer.
  For details see: `"Adaptive Graph Convolutional Recurrent Network
  for Traffic Forecasting" <https://arxiv.org/abs/2007.02842>`_
  Args:
      in_channels (int): Number of input features.
      out_channels (int): Number of output features.
      K (int): Filter size :math:`K`.
      embedding_dimensions (int): Number of node embedding dimensions.
docstr: Making a forward pass.
  Arg types:
      * **X** (PyTorch Float Tensor) - Node features.
      * **E** (PyTorch Float Tensor) - Node embeddings.
  Return types:
      * **X_G** (PyTorch Float Tensor) - Hidden state matrix for all nodes.
docstr_tok: ["Making","a","forward","pass",".","Arg","types",":","*","*","*","X","*","*","(","PyTorch","Float","Tensor",")","-","Node","features",".","*","*","*","E","*","*","(","PyTorch","Float","Tensor",")","-","Node","embeddings",".","Return","types",":","*","*","*","X_G","*","*","(","PyTorch","Float","Tensor",")","-","Hidden","state","matrix","for","all","nodes","."]
code: def forward(
      self, X: torch.FloatTensor, E: torch.FloatTensor
  ) -> torch.FloatTensor:
      r"""Making a forward pass.
      Arg types:
          * **X** (PyTorch Float Tensor) - Node features.
          * **E** (PyTorch Float Tensor) - Node embeddings.
      Return types:
          * **X_G** (PyTorch Float Tensor) - Hidden state matrix for all nodes.
      """
  
      number_of_nodes = E.shape[0]
      supports = F.softmax(
          F.relu(torch.mm(E, E.transpose(0, 1))), dim=1
      )
      support_set = [
          torch.eye(number_of_nodes).to(supports.device),
          supports,
      ]
      for _ in range(2, self.K):
          support = (
              torch.matmul(2 * supports, support_set[-1])
              - support_set[-2]
          )
          support_set.append(support)
      supports = torch.stack(support_set, dim=0)
      W = torch.einsum("nd,dkio->nkio", E, self.weights_pool)
      bias = torch.matmul(E, self.bias_pool)
      X_G = torch.einsum("knm,bmc->bknc", supports, X)
      X_G = X_G.permute(0, 2, 1, 3)
      X_G = torch.einsum("bnki,nkio->bno", X_G, W) + bias
      return X_G
  
file_path: pytorch_geometric_temporal/torch_geometric_temporal/nn/recurrent/agcrn.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  from torch_geometric.nn.inits import glorot, zeros
label_desc: Use image node_id 2 for calling the AVWGCN obj's underlying member method code with example usage: obj.forward(X, E) and returns: X_G