class_docstr: The GraphSAGE operator from the `"Inductive Representation Learning on
  Large Graphs" <https://arxiv.org/abs/1706.02216>`_ paper
  
  .. math::
      \mathbf{x}^{\prime}_i = \mathbf{W}_1 \mathbf{x}_i + \mathbf{W_2} \cdot
      \mathrm{mean}_{j \in \mathcal{N(i)}} \mathbf{x}_j
  
  Args:
      in_channels (int or tuple): Size of each input sample. A tuple
          corresponds to the sizes of source and target dimensionalities.
      out_channels (int): Size of each output sample.
      normalize (bool, optional): If set to :obj:`True`, output features
          will be :math:`\ell_2`-normalized, *i.e.*,
          :math:`\frac{\mathbf{x}^{\prime}_i}
          {\| \mathbf{x}^{\prime}_i \|_2}`.
          (default: :obj:`False`)
      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","GraphSAGE","operator","from","the","`","``","Inductive","Representation","Learning","on","Large","Graphs","''","<","https",":","\/\/arxiv.org\/abs\/1706.02216",">","`","_","paper","..","math",":",":","\\mathbf","{","x","}","^","{","\\prime","}","_i","=","\\mathbf","{","W","}","_1","\\mathbf","{","x","}","_i","+","\\mathbf","{","W_2","}","\\cdot","\\mathrm","{","mean","}","_","{","j","\\in","\\mathcal","{","N","(","i",")","}","}","\\mathbf","{","x","}","_j","Args",":","in_channels","(","int","or","tuple",")",":","Size","of","each","input","sample",".","A","tuple","corresponds","to","the","sizes","of","source","and","target","dimensionalities",".","out_channels","(","int",")",":","Size","of","each","output","sample",".","normalize","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","True","`",",","output","features","will","be",":","math",":","`","\\ell_2","`","-normalized",",","*","i.e",".","*",",",":","math",":","`","\\frac","{","\\mathbf","{","x","}","^","{","\\prime","}","_i","}","{","\\|","\\mathbf","{","x","}","^","{","\\prime","}","_i","\\|_2","}","`",".","(","default",":",":","obj",":","`","False","`",")","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 forward(
      self,
      x: Union[Tensor, OptPairTensor],
      edge_index: Adj,
      edge_weight: OptTensor = None,
      size: Size = None,
  ) -> Tensor:
      """"""
      if isinstance(x, Tensor):
          x: OptPairTensor = (x, x)
  
      # propagate_type: (x: OptPairTensor)
      out = self.propagate(
          edge_index, x=x, edge_weight=edge_weight, size=size
      )
      out = self.lin_l(out)
  
      x_r = x[1]
      if x_r is not None:
          out += self.lin_r(x_r)
  
      if self.normalize:
          out = F.normalize(out, p=2.0, dim=-1)
  
      return out
  
file_path: AutoGL/autogl/module/nas/space/gasso_space/sage_conv.py
imports: from typing import Union, Tuple
  from torch_geometric.typing import OptPairTensor, Adj, Size, NoneType, OptTensor
  from torch import Tensor
  from torch.nn import Linear
  import torch.nn.functional
  from torch_sparse import SparseTensor, matmul
  from torch_geometric.nn.conv import MessagePassing
label_desc: Use image node_id 3 for calling the SAGEConv obj's underlying member method code with example usage: obj.forward(x, edge_index, edge_weight, size) and returns: out