class_docstr: CFConv from `SchNet: A continuous-filter convolutional neural network for
  modeling quantum interactions <https://arxiv.org/abs/1706.08566>`__
  
  It combines node and edge features in message passing and updates node representations.
  
  .. math::
      h_i^{(l+1)} = \sum_{j\in \mathcal{N}(i)} h_j^{l} \circ W^{(l)}e_ij
  
  where :math:`\circ` represents element-wise multiplication and for :math:`\text{SPP}` :
  
  .. math::
      \text{SSP}(x) = \frac{1}{\beta} * \log(1 + \exp(\beta * x)) - \log(\text{shift})
  
  Parameters
  ----------
  node_in_feats : int
      Size for the input node features :math:`h_j^{(l)}`.
  edge_in_feats : int
      Size for the input edge features :math:`e_ij`.
  hidden_feats : int
      Size for the hidden representations.
  out_feats : int
      Size for the output representations :math:`h_j^{(l+1)}`.
  
  Example
  -------
  >>> import dgl
  >>> import numpy as np
  >>> import torch as th
  >>> from dgl.nn import CFConv
  >>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
  >>> nfeat = th.ones(6, 10)
  >>> efeat = th.ones(6, 5)
  >>> conv = CFConv(10, 5, 3, 2)
  >>> res = conv(g, nfeat, efeat)
  >>> res
  tensor([[-0.1209, -0.2289],
          [-0.1209, -0.2289],
          [-0.1209, -0.2289],
          [-0.1135, -0.2338],
          [-0.1209, -0.2289],
          [-0.1283, -0.2240]], grad_fn=<SubBackward0>)
class_docstr_tok: ["CFConv","from","`","SchNet",":","A","continuous-filter","convolutional","neural","network","for","modeling","quantum","interactions","<","https",":","\/\/arxiv.org\/abs\/1706.08566",">","`","__","It","combines","node","and","edge","features","in","message","passing","and","updates","node","representations",".","..","math",":",":","h_i^","{","(","l+1",")","}","=","\\sum_","{","j\\in","\\mathcal","{","N","}","(","i",")","}","h_j^","{","l","}","\\circ","W^","{","(","l",")","}","e_ij","where",":","math",":","`","\\circ","`","represents","element-wise","multiplication","and","for",":","math",":","`","\\text","{","SPP","}","`",":","..","math",":",":","\\text","{","SSP","}","(","x",")","=","\\frac","{","1","}","{","\\beta","}","*","\\log","(","1","+","\\exp","(","\\beta","*","x",")",")","-","\\log","(","\\text","{","shift","}",")","Parameters","--","--","--","--","--","node_in_feats",":","int","Size","for","the","input","node","features",":","math",":","`","h_j^","{","(","l",")","}","`",".","edge_in_feats",":","int","Size","for","the","input","edge","features",":","math",":","`","e_ij","`",".","hidden_feats",":","int","Size","for","the","hidden","representations",".","out_feats",":","int","Size","for","the","output","representations",":","math",":","`","h_j^","{","(","l+1",")","}","`",".","Example","--","--","--","-",">",">",">","import","dgl",">",">",">","import","numpy","as","np",">",">",">","import","torch","as","th",">",">",">","from","dgl.nn","import","CFConv",">",">",">","g","=","dgl.graph","(","(","[","0,1,2,3,2,5","]",",","[","1,2,3,4,0,3","]",")",")",">",">",">","nfeat","=","th.ones","(","6",",","10",")",">",">",">","efeat","=","th.ones","(","6",",","5",")",">",">",">","conv","=","CFConv","(","10",",","5",",","3",",","2",")",">",">",">","res","=","conv","(","g",",","nfeat",",","efeat",")",">",">",">","res","tensor","(","[","[","-0.1209",",","-0.2289","]",",","[","-0.1209",",","-0.2289","]",",","[","-0.1209",",","-0.2289","]",",","[","-0.1135",",","-0.2338","]",",","[","-0.1209",",","-0.2289","]",",","[","-0.1283",",","-0.2240","]","]",",","grad_fn=","<","SubBackward0",">",")"]
code: def __init__(
      self, node_in_feats, edge_in_feats, hidden_feats, out_feats
  ):
      super(CFConv, self).__init__()
  
      self.project_edge = nn.Sequential(
          nn.Linear(edge_in_feats, hidden_feats),
          ShiftedSoftplus(),
          nn.Linear(hidden_feats, hidden_feats),
          ShiftedSoftplus(),
      )
      self.project_node = nn.Linear(node_in_feats, hidden_feats)
      self.project_out = nn.Sequential(
          nn.Linear(hidden_feats, out_feats), ShiftedSoftplus()
      )
  
file_path: dgl/python/dgl/nn/pytorch/conv/cfconv.py
imports: import numpy
  import torch.nn
  from ....None import function
label_desc: Use image node_id 1 to create a new CFConv object from inherited base classes: nn with example: obj = CFConv(node_in_feats, edge_in_feats, hidden_feats, out_feats)