class_docstr: Radial pooling from `Atomic Convolutional Networks for
  Predicting Protein-Ligand Binding Affinity <https://arxiv.org/abs/1703.10603>`__
  
  We denote the distance between atom :math:`i` and :math:`j` by :math:`r_{ij}`.
  
  A radial pooling layer transforms distances with radial filters. For radial filter
  indexed by :math:`k`, it projects edge distances with
  
  .. math::
      h_{ij}^{k} = \exp(-\gamma_{k}|r_{ij}-r_{k}|^2)
  
  If :math:`r_{ij} < c_k`,
  
  .. math::
      f_{ij}^{k} = 0.5 * \cos(\frac{\pi r_{ij}}{c_k} + 1),
  
  else,
  
  .. math::
      f_{ij}^{k} = 0.
  
  Finally,
  
  .. math::
      e_{ij}^{k} = h_{ij}^{k} * f_{ij}^{k}
  
  Parameters
  ----------
  interaction_cutoffs : float32 tensor of shape (K)
      :math:`c_k` in the equations above. Roughly they can be considered as learnable cutoffs
      and two atoms are considered as connected if the distance between them is smaller than
      the cutoffs. K for the number of radial filters.
  rbf_kernel_means : float32 tensor of shape (K)
      :math:`r_k` in the equations above. K for the number of radial filters.
  rbf_kernel_scaling : float32 tensor of shape (K)
      :math:`\gamma_k` in the equations above. K for the number of radial filters.
class_docstr_tok: ["Radial","pooling","from","`","Atomic","Convolutional","Networks","for","Predicting","Protein-Ligand","Binding","Affinity","<","https",":","\/\/arxiv.org\/abs\/1703.10603",">","`","__","We","denote","the","distance","between","atom",":","math",":","`","i","`","and",":","math",":","`","j","`","by",":","math",":","`","r_","{","ij","}","`",".","A","radial","pooling","layer","transforms","distances","with","radial","filters",".","For","radial","filter","indexed","by",":","math",":","`","k","`",",","it","projects","edge","distances","with","..","math",":",":","h_","{","ij","}","^","{","k","}","=","\\exp","(","-\\gamma_","{","k","}","|r_","{","ij","}","-r_","{","k","}","|^2",")","If",":","math",":","`","r_","{","ij","}","<","c_k","`",",","..","math",":",":","f_","{","ij","}","^","{","k","}","=","0.5","*","\\cos","(","\\frac","{","\\pi","r_","{","ij","}","}","{","c_k","}","+","1",")",",","else",",","..","math",":",":","f_","{","ij","}","^","{","k","}","=","0",".","Finally",",","..","math",":",":","e_","{","ij","}","^","{","k","}","=","h_","{","ij","}","^","{","k","}","*","f_","{","ij","}","^","{","k","}","Parameters","--","--","--","--","--","interaction_cutoffs",":","float32","tensor","of","shape","(","K",")",":","math",":","`","c_k","`","in","the","equations","above",".","Roughly","they","can","be","considered","as","learnable","cutoffs","and","two","atoms","are","considered","as","connected","if","the","distance","between","them","is","smaller","than","the","cutoffs",".","K","for","the","number","of","radial","filters",".","rbf_kernel_means",":","float32","tensor","of","shape","(","K",")",":","math",":","`","r_k","`","in","the","equations","above",".","K","for","the","number","of","radial","filters",".","rbf_kernel_scaling",":","float32","tensor","of","shape","(","K",")",":","math",":","`","\\gamma_k","`","in","the","equations","above",".","K","for","the","number","of","radial","filters","."]
code: def __init__(
      self, interaction_cutoffs, rbf_kernel_means, rbf_kernel_scaling
  ):
      super(RadialPooling, self).__init__()
  
      self.interaction_cutoffs = nn.Parameter(
          interaction_cutoffs.reshape(-1, 1, 1), requires_grad=True
      )
      self.rbf_kernel_means = nn.Parameter(
          rbf_kernel_means.reshape(-1, 1, 1), requires_grad=True
      )
      self.rbf_kernel_scaling = nn.Parameter(
          rbf_kernel_scaling.reshape(-1, 1, 1), requires_grad=True
      )
  
file_path: dgl/python/dgl/nn/pytorch/conv/atomicconv.py
imports: import numpy
  import torch
  import torch.nn
label_desc: Use image node_id 1 to create a new RadialPooling object from inherited base classes: nn with example: obj = RadialPooling(interaction_cutoffs, rbf_kernel_means, rbf_kernel_scaling)