class_docstr:  The ComENet from the `"ComENet: Towards Complete and Efficient Message Passing for 3D Molecular Graphs" <https://arxiv.org/abs/2206.08515>`_ paper.
  
  Args:
      cutoff (float, optional): Cutoff distance for interatomic interactions. (default: :obj:`8.0`)
      num_layers (int, optional): Number of building blocks. (default: :obj:`4`)
      hidden_channels (int, optional): Hidden embedding size. (default: :obj:`256`)
      middle_channels (int, optional): Middle embedding size for the two layer linear block. (default: :obj:`256`)
      out_channels (int, optional): Size of each output sample. (default: :obj:`1`)
      num_radial (int, optional): Number of radial basis functions. (default: :obj:`3`)
      num_spherical (int, optional): Number of spherical harmonics. (default: :obj:`2`)
      num_output_layers (int, optional): Number of linear layers for the output blocks. (default: :obj:`3`)
code: def __init__(
      self,
      cutoff=8.0,
      num_layers=4,
      hidden_channels=256,
      middle_channels=64,
      out_channels=1,
      num_radial=3,
      num_spherical=2,
      num_output_layers=3,
  ):
      super(ComENet, self).__init__()
      self.out_channels = out_channels
      self.cutoff = cutoff
      self.num_layers = num_layers
  
      if sym is None:
          raise ImportError("Package `sympy` could not be found.")
  
      act = swish
      self.act = act
  
      self.feature1 = torsion_emb(
          num_radial=num_radial,
          num_spherical=num_spherical,
          cutoff=cutoff,
      )
      self.feature2 = angle_emb(
          num_radial=num_radial,
          num_spherical=num_spherical,
          cutoff=cutoff,
      )
  
      self.emb = EmbeddingBlock(hidden_channels, act)
  
      self.interaction_blocks = torch.nn.ModuleList(
          [
              SimpleInteractionBlock(
                  hidden_channels,
                  middle_channels,
                  num_radial,
                  num_spherical,
                  num_output_layers,
                  hidden_channels,
                  act,
              )
              for _ in range(num_layers)
          ]
      )
  
      self.lins = torch.nn.ModuleList()
      for _ in range(num_output_layers):
          self.lins.append(Linear(hidden_channels, hidden_channels))
      self.lin_out = Linear(hidden_channels, out_channels)
      self.reset_parameters()
  
imports: from torch_cluster import radius_graph
  from torch_geometric.nn import GraphConv, GraphNorm
  from torch_geometric.nn import inits
  from .features import angle_emb, torsion_emb
  from torch_scatter import scatter, scatter_min
  from torch.nn import Embedding
  import torch
  from torch import nn
  from torch import Tensor
  import torch.nn.functional
  import math
  from math import sqrt
label_desc: Use image node_id 1 to create a new ComENet object from inherited base classes: nn with example: obj = ComENet(cutoff, num_layers, hidden_channels, middle_channels, out_channels, num_radial, num_spherical, num_output_layers)