class_docstr: The ClusterGCN graph convolutional operator from the
  `"Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph
  Convolutional Networks" <https://arxiv.org/abs/1905.07953>`_ paper.
  
  .. math::
      \mathbf{X}^{\prime} = \left( \mathbf{\hat{A}} + \lambda \cdot
      \textrm{diag}(\mathbf{\hat{A}}) \right) \mathbf{X} \mathbf{W}_1 +
      \mathbf{X} \mathbf{W}_2
  
  where :math:`\mathbf{\hat{A}} = {(\mathbf{D} + \mathbf{I})}^{-1}(\mathbf{A}
  + \mathbf{I})`.
  
  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.
      diag_lambda (float, optional): Diagonal enhancement value
          :math:`\lambda`. (default: :obj:`0.`)
      add_self_loops (bool, optional): If set to :obj:`False`, will not add
          self-loops to the input graph. (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`.
  
  Shapes:
      - **input:**
        node features :math:`(|\mathcal{V}|, F_{in})`,
        edge indices :math:`(2, |\mathcal{E}|)`
      - **output:** node features :math:`(|\mathcal{V}|, F_{out})`
class_docstr_tok: ["The","ClusterGCN","graph","convolutional","operator","from","the","`","``","Cluster-GCN",":","An","Efficient","Algorithm","for","Training","Deep","and","Large","Graph","Convolutional","Networks","''","<","https",":","\/\/arxiv.org\/abs\/1905.07953",">","`","_","paper",".","..","math",":",":","\\mathbf","{","X","}","^","{","\\prime","}","=","\\left","(","\\mathbf","{","\\hat","{","A","}","}","+","\\lambda","\\cdot","\\textrm","{","diag","}","(","\\mathbf","{","\\hat","{","A","}","}",")","\\right",")","\\mathbf","{","X","}","\\mathbf","{","W","}","_1","+","\\mathbf","{","X","}","\\mathbf","{","W","}","_2","where",":","math",":","`","\\mathbf","{","\\hat","{","A","}","}","=","{","(","\\mathbf","{","D","}","+","\\mathbf","{","I","}",")","}","^","{","-1","}","(","\\mathbf","{","A","}","+","\\mathbf","{","I","}",")","`",".","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",".","diag_lambda","(","float",",","optional",")",":","Diagonal","enhancement","value",":","math",":","`","\\lambda","`",".","(","default",":",":","obj",":","`","0.","`",")","add_self_loops","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","False","`",",","will","not","add","self-loops","to","the","input","graph",".","(","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","`",".","Shapes",":","-","*","*","input",":","*","*","node","features",":","math",":","`","(","|\\mathcal","{","V","}","|",",","F_","{","in","}",")","`",",","edge","indices",":","math",":","`","(","2",",","|\\mathcal","{","E","}","|",")","`","-","*","*","output",":","*","*","node","features",":","math",":","`","(","|\\mathcal","{","V","}","|",",","F_","{","out","}",")","`"]
code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      diag_lambda: float = 0.0,
      add_self_loops: bool = True,
      bias: bool = True,
      **kwargs,
  ):
      kwargs.setdefault("aggr", "add")
      super().__init__(**kwargs)
  
      self.in_channels = in_channels
      self.out_channels = out_channels
      self.diag_lambda = diag_lambda
      self.add_self_loops = add_self_loops
  
      self.lin_out = Linear(
          in_channels,
          out_channels,
          bias=bias,
          weight_initializer="glorot",
      )
      self.lin_root = Linear(
          in_channels,
          out_channels,
          bias=False,
          weight_initializer="glorot",
      )
  
      self.reset_parameters()
  
file_path: pytorch_geometric/torch_geometric/nn/conv/cluster_gcn_conv.py
imports: import torch
  from torch import Tensor
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.dense.linear import Linear
  from torch_geometric.typing import Adj, OptTensor, SparseTensor, torch_sparse
  from torch_geometric.utils import add_self_loops, degree, is_torch_sparse_tensor, remove_self_loops, spmm, to_edge_index
  from torch_geometric.utils.sparse import set_sparse_value
label_desc: Use image node_id 1 to create a new ClusterGCNConv object from inherited base classes: MessagePassing with example: obj = ClusterGCNConv(in_channels, out_channels, diag_lambda, add__loops, bias)