class_docstr: The graph convolutional operator from the `"Semi-supervised
  Classification with Graph Convolutional Networks"
  <https://arxiv.org/abs/1609.02907>`_ paper
  
  .. math::
      \mathbf{X}^{\prime} = \mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}}
      \mathbf{\hat{D}}^{-1/2} \mathbf{X} \mathbf{\Theta},
  
  where :math:`\mathbf{\hat{A}} = \mathbf{A} + \mathbf{I}` denotes the
  adjacency matrix with inserted self-loops and
  :math:`\hat{D}_{ii} = \sum_{j=0} \hat{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.
  
  Its node-wise formulation is given by:
  
  .. math::
      \mathbf{x}^{\prime}_i = \mathbf{\Theta} \sum_{j}
      \frac{1}{\sqrt{\hat{d}_j \hat{d}_i}} \mathbf{x}_j
  
  with :math:`\hat{d}_i = 1 + \sum_{j \in \mathcal{N}(i)} e_{j,i}`, where
  :math:`e_{j,i}` denotes the edge weight from source node :obj:`i` to target
  node :obj:`j` (default: :obj:`1`)
  
  Args:
      in_channels (int): Size of each input sample.
      out_channels (int): Size of each output sample.
      improved (bool, optional): If set to :obj:`True`, the layer computes
          :math:`\mathbf{\hat{A}}` as :math:`\mathbf{A} + 2\mathbf{I}`.
          (default: :obj:`False`)
      cached (bool, optional): If set to :obj:`True`, the layer will cache
          the computation of :math:`\mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}}
          \mathbf{\hat{D}}^{-1/2}` on first execution, and will use the
          cached version for further executions.
          This parameter should only be set to :obj:`True` in transductive
          learning scenarios. (default: :obj:`False`)
      add_self_loops (bool, optional): If set to :obj:`False`, will not add
          self-loops to the input graph. (default: :obj:`True`)
      normalize (bool, optional): Whether to add self-loops and apply
          symmetric normalization. (default: :obj:`True`)
      bias (bool, optional): If set to :obj:`False`, the layer will not learn
          an additive bias. (default: :obj:`True`)
      **kwargs (optional): Additional arguments of
          :class:`torch_geometric.nn.conv.MessagePassing`.
class_docstr_tok: ["The","graph","convolutional","operator","from","the","`","``","Semi-supervised","Classification","with","Graph","Convolutional","Networks","''","<","https",":","\/\/arxiv.org\/abs\/1609.02907",">","`","_","paper","..","math",":",":","\\mathbf","{","X","}","^","{","\\prime","}","=","\\mathbf","{","\\hat","{","D","}","}","^","{","-1\/2","}","\\mathbf","{","\\hat","{","A","}","}","\\mathbf","{","\\hat","{","D","}","}","^","{","-1\/2","}","\\mathbf","{","X","}","\\mathbf","{","\\Theta","}",",","where",":","math",":","`","\\mathbf","{","\\hat","{","A","}","}","=","\\mathbf","{","A","}","+","\\mathbf","{","I","}","`","denotes","the","adjacency","matrix","with","inserted","self-loops","and",":","math",":","`","\\hat","{","D","}","_","{","ii","}","=","\\sum_","{","j=0","}","\\hat","{","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",".","Its","node-wise","formulation","is","given","by",":","..","math",":",":","\\mathbf","{","x","}","^","{","\\prime","}","_i","=","\\mathbf","{","\\Theta","}","\\sum_","{","j","}","\\frac","{","1","}","{","\\sqrt","{","\\hat","{","d","}","_j","\\hat","{","d","}","_i","}","}","\\mathbf","{","x","}","_j","with",":","math",":","`","\\hat","{","d","}","_i","=","1","+","\\sum_","{","j","\\in","\\mathcal","{","N","}","(","i",")","}","e_","{","j",",","i","}","`",",","where",":","math",":","`","e_","{","j",",","i","}","`","denotes","the","edge","weight","from","source","node",":","obj",":","`","i","`","to","target","node",":","obj",":","`","j","`","(","default",":",":","obj",":","`","1","`",")","Args",":","in_channels","(","int",")",":","Size","of","each","input","sample",".","out_channels","(","int",")",":","Size","of","each","output","sample",".","improved","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","True","`",",","the","layer","computes",":","math",":","`","\\mathbf","{","\\hat","{","A","}","}","`","as",":","math",":","`","\\mathbf","{","A","}","+","2\\mathbf","{","I","}","`",".","(","default",":",":","obj",":","`","False","`",")","cached","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","True","`",",","the","layer","will","cache","the","computation","of",":","math",":","`","\\mathbf","{","\\hat","{","D","}","}","^","{","-1\/2","}","\\mathbf","{","\\hat","{","A","}","}","\\mathbf","{","\\hat","{","D","}","}","^","{","-1\/2","}","`","on","first","execution",",","and","will","use","the","cached","version","for","further","executions",".","This","parameter","should","only","be","set","to",":","obj",":","`","True","`","in","transductive","learning","scenarios",".","(","default",":",":","obj",":","`","False","`",")","add_self_loops","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","False","`",",","will","not","add","self-loops","to","the","input","graph",".","(","default",":",":","obj",":","`","True","`",")","normalize","(","bool",",","optional",")",":","Whether","to","add","self-loops","and","apply","symmetric","normalization",".","(","default",":",":","obj",":","`","True","`",")","bias","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","False","`",",","the","layer","will","not","learn","an","additive","bias",".","(","default",":",":","obj",":","`","True","`",")","*","*","kwargs","(","optional",")",":","Additional","arguments","of",":","class",":","`","torch_geometric.nn.conv.MessagePassing","`","."]
code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      improved: bool = False,
      cached: bool = False,
      add_self_loops: bool = True,
      normalize: bool = True,
      bias: bool = True,
      **kwargs,
  ):
      kwargs.setdefault("aggr", "add")
      super(GCNConv, self).__init__(**kwargs)
  
      self.in_channels = in_channels
      self.out_channels = out_channels
      self.improved = improved
      self.cached = cached
      self.add_self_loops = add_self_loops
      self.normalize = normalize
  
      self._cached_edge_index = None
      self._cached_adj_t = None
  
      self.weight = Parameter(torch.Tensor(in_channels, out_channels))
  
      if bias:
          self.bias = Parameter(torch.Tensor(out_channels))
      else:
          self.register_parameter("bias", None)
  
      self.reset_parameters()
  
imports: from typing import Optional, Tuple
  from torch_geometric.typing import Adj, OptTensor, PairTensor
  import torch
  from torch import Tensor
  from torch.nn import Parameter
  from torch_scatter import scatter_add
  from torch_sparse import SparseTensor, matmul, fill_diag, sum, mul
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.utils import add_remaining_self_loops
  from torch_geometric.utils.num_nodes import maybe_num_nodes
  from .inits import glorot, zeros
label_desc: Use image node_id 1 to create a new GCNConv object from inherited base classes: MessagePassing with example: obj = GCNConv(in_channels, out_channels, improved, cached, add__loops, normalize, bias)