class_docstr: The topology adaptive graph convolutional networks operator from the
  `"Topology Adaptive Graph Convolutional Networks"
  <https://arxiv.org/abs/1710.10370>`_ paper.
  
  .. math::
      \mathbf{X}^{\prime} = \sum_{k=0}^K \left( \mathbf{D}^{-1/2} \mathbf{A}
      \mathbf{D}^{-1/2} \right)^k \mathbf{X} \mathbf{W}_{k},
  
  where :math:`\mathbf{A}` denotes the adjacency matrix and
  :math:`D_{ii} = \sum_{j=0} A_{ij}` its diagonal degree matrix.
  The adjacency matrix can include other values than :obj:`1` representing
  edge weights via the optional :obj:`edge_weight` tensor.
  
  Args:
      in_channels (int): Size of each input sample, or :obj:`-1` to derive
          the size from the first input(s) to the forward method.
      out_channels (int): Size of each output sample.
      K (int, optional): Number of hops :math:`K`. (default: :obj:`3`)
      bias (bool, optional): If set to :obj:`False`, the layer will not learn
          an additive bias. (default: :obj:`True`)
      normalize (bool, optional): Whether to apply symmetric normalization.
          (default: :obj:`True`)
      **kwargs (optional): Additional arguments of
          :class:`torch_geometric.nn.conv.MessagePassing`.
  
  Shapes:
      - **input:**
        node_features :math:`(|\mathcal{V}|, F_{in})`,
        edge_index :math:`(2, |\mathcal{E}|)`,
        edge_weights :math:`(|\mathcal{E}|)` *(optional)*
      - **output:** node features :math:`(|\mathcal{V}|, F_{out})`
code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      K: int = 3,
      bias: bool = True,
      normalize: bool = True,
      **kwargs,
  ):
      kwargs.setdefault("aggr", "add")
      super().__init__(**kwargs)
  
      self.in_channels = in_channels
      self.out_channels = out_channels
      self.K = K
      self.normalize = normalize
  
      self.lins = torch.nn.ModuleList(
          [
              Linear(in_channels, out_channels, bias=False)
              for _ in range(K + 1)
          ]
      )
  
      if bias:
          self.bias = torch.nn.Parameter(torch.empty(out_channels))
      else:
          self.register_parameter("bias", None)
  
      self.reset_parameters()
  
file_path: pytorch_geometric/torch_geometric/nn/conv/tag_conv.py
imports: import torch
  from torch import Tensor
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.conv.gcn_conv import gcn_norm
  from torch_geometric.nn.dense.linear import Linear
  from torch_geometric.nn.inits import zeros
  from torch_geometric.typing import Adj, OptTensor, SparseTensor
  from torch_geometric.utils import spmm
label_desc: Use image node_id 1 to create a new TAGConv object from inherited base classes: MessagePassing with example: obj = TAGConv(in_channels, out_channels, K, bias, normalize)