class_docstr: The crystal graph convolutional operator from the
  `"Crystal Graph Convolutional Neural Networks for an
  Accurate and Interpretable Prediction of Material Properties"
  <https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.120.145301>`_
  paper.
  
  .. math::
      \mathbf{x}^{\prime}_i = \mathbf{x}_i + \sum_{j \in \mathcal{N}(i)}
      \sigma \left( \mathbf{z}_{i,j} \mathbf{W}_f + \mathbf{b}_f \right)
      \odot g \left( \mathbf{z}_{i,j} \mathbf{W}_s + \mathbf{b}_s  \right)
  
  where :math:`\mathbf{z}_{i,j} = [ \mathbf{x}_i, \mathbf{x}_j,
  \mathbf{e}_{i,j} ]` denotes the concatenation of central node features,
  neighboring node features and edge features.
  In addition, :math:`\sigma` and :math:`g` denote the sigmoid and softplus
  functions, respectively.
  
  Args:
      channels (int or tuple): Size of each input sample. A tuple
          corresponds to the sizes of source and target dimensionalities.
      dim (int, optional): Edge feature dimensionality. (default: :obj:`0`)
      aggr (str, optional): The aggregation operator to use
          (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`).
          (default: :obj:`"add"`)
      batch_norm (bool, optional): If set to :obj:`True`, will make use of
          batch normalization. (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`.
  
  Shapes:
      - **input:**
        node features :math:`(|\mathcal{V}|, F)` or
        :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))`
        if bipartite,
        edge indices :math:`(2, |\mathcal{E}|)`,
        edge features :math:`(|\mathcal{E}|, D)` *(optional)*
      - **output:** node features :math:`(|\mathcal{V}|, F)` or
        :math:`(|\mathcal{V_t}|, F_{t})` if bipartite
class_docstr_tok: ["The","crystal","graph","convolutional","operator","from","the","`","``","Crystal","Graph","Convolutional","Neural","Networks","for","an","Accurate","and","Interpretable","Prediction","of","Material","Properties","''","<","https",":","\/\/journals.aps.org\/prl\/abstract\/10.1103\/PhysRevLett.120.145301",">","`","_","paper",".","..","math",":",":","\\mathbf","{","x","}","^","{","\\prime","}","_i","=","\\mathbf","{","x","}","_i","+","\\sum_","{","j","\\in","\\mathcal","{","N","}","(","i",")","}","\\sigma","\\left","(","\\mathbf","{","z","}","_","{","i",",","j","}","\\mathbf","{","W","}","_f","+","\\mathbf","{","b","}","_f","\\right",")","\\odot","g","\\left","(","\\mathbf","{","z","}","_","{","i",",","j","}","\\mathbf","{","W","}","_s","+","\\mathbf","{","b","}","_s","\\right",")","where",":","math",":","`","\\mathbf","{","z","}","_","{","i",",","j","}","=","[","\\mathbf","{","x","}","_i",",","\\mathbf","{","x","}","_j",",","\\mathbf","{","e","}","_","{","i",",","j","}","]","`","denotes","the","concatenation","of","central","node","features",",","neighboring","node","features","and","edge","features",".","In","addition",",",":","math",":","`","\\sigma","`","and",":","math",":","`","g","`","denote","the","sigmoid","and","softplus","functions",",","respectively",".","Args",":","channels","(","int","or","tuple",")",":","Size","of","each","input","sample",".","A","tuple","corresponds","to","the","sizes","of","source","and","target","dimensionalities",".","dim","(","int",",","optional",")",":","Edge","feature","dimensionality",".","(","default",":",":","obj",":","`","0","`",")","aggr","(","str",",","optional",")",":","The","aggregation","operator","to","use","(",":","obj",":","`","``","add","''","`",",",":","obj",":","`","``","mean","''","`",",",":","obj",":","`","``","max","''","`",")",".","(","default",":",":","obj",":","`","``","add","''","`",")","batch_norm","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","True","`",",","will","make","use","of","batch","normalization",".","(","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","`",".","Shapes",":","-","*","*","input",":","*","*","node","features",":","math",":","`","(","|\\mathcal","{","V","}","|",",","F",")","`","or",":","math",":","`","(","(","|\\mathcal","{","V_s","}","|",",","F_","{","s","}",")",",","(","|\\mathcal","{","V_t","}","|",",","F_","{","t","}",")",")","`","if","bipartite",",","edge","indices",":","math",":","`","(","2",",","|\\mathcal","{","E","}","|",")","`",",","edge","features",":","math",":","`","(","|\\mathcal","{","E","}","|",",","D",")","`","*","(","optional",")","*","-","*","*","output",":","*","*","node","features",":","math",":","`","(","|\\mathcal","{","V","}","|",",","F",")","`","or",":","math",":","`","(","|\\mathcal","{","V_t","}","|",",","F_","{","t","}",")","`","if","bipartite"]
code: def message(self, x_i, x_j, edge_attr: OptTensor) -> Tensor:
      if edge_attr is None:
          z = torch.cat([x_i, x_j], dim=-1)
      else:
          z = torch.cat([x_i, x_j, edge_attr], dim=-1)
      return self.lin_f(z).sigmoid() * F.softplus(self.lin_s(z))
  
file_path: pytorch_geometric/torch_geometric/nn/conv/cg_conv.py
imports: from typing import Tuple, Union
  import torch
  import torch.nn.functional
  from torch import Tensor
  from torch.nn import BatchNorm1d, Linear
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.typing import Adj, OptTensor, PairTensor
label_desc: Use image node_id 4 for calling the CGConv obj's underlying member method code with example usage: obj.message(x_i, x_j, edge_attr) and returns: unknown