code: def forward(
      self, data: torch_geometric.data.Data, *__args, **__kwargs
  ):
      x: torch.Tensor = data.x
      edge_index: torch.LongTensor = data.edge_index
      if (
          hasattr(data, "edge_weight")
          and isinstance(getattr(data, "edge_weight"), torch.Tensor)
          and torch.is_tensor(data.edge_weight)
      ):
          edge_weight: _typing.Optional[torch.Tensor] = data.edge_weight
      else:
          edge_weight: _typing.Optional[torch.Tensor] = None
      results: _typing.MutableSequence[torch.Tensor] = [x]
      for layer, _gat in enumerate(self.__convolution_layers):
          x: torch.Tensor = torch.nn.functional.dropout(
              x, self._dropout, self.training
          )
          x: torch.Tensor = _gat(x, edge_index, edge_weight)
          if layer < len(self.__convolution_layers) - 1:
              x: torch.Tensor = _utils.activation.activation_func(
                  x, self._act
              )
          results.append(x)
      logging.debug(
          "{:d} layer, each layer shape {:s}".format(
              len(results), " ".join([str(x.shape) for x in results])
          )
      )
      return results
  
file_path: AutoGL/autogl/module/model/encoders/_pyg/_gat.py
imports: import logging
  import torch.nn.functional
  import typing
  import torch_geometric
  from torch_geometric.nn.conv import GATConv
  from ..None import base_encoder, encoder_registry
  from ...None import _utils
label_desc: Use image node_id 2 for calling the _GAT obj's underlying member method code with example usage: obj.forward(data) and returns: results