class_docstr:  The ProNet from the "Learning Protein Representations via Complete 3D Graph Networks" paper.
  
  Args:
      level: (str, optional): The level of protein representations. It could be :obj:`aminoacid`, obj:`backbone`, and :obj:`allatom`. (default: :obj:`aminoacid`)
      num_blocks (int, optional): Number of building blocks. (default: :obj:`4`)
      hidden_channels (int, optional): Hidden embedding size. (default: :obj:`128`)
      out_channels (int, optional): Size of each output sample. (default: :obj:`1`)
      mid_emb (int, optional): Embedding size used for geometric features. (default: :obj:`64`)
      num_radial (int, optional): Number of radial basis functions. (default: :obj:`6`)
      num_spherical (int, optional): Number of spherical harmonics. (default: :obj:`2`)
      cutoff (float, optional): Cutoff distance for interatomic interactions. (default: :obj:`10.0`)
      max_num_neighbors (int, optional): Max number of neighbors during graph construction. (default: :obj:`32`)
      int_emb_layers (int, optional): Number of embedding layers in the interaction block. (default: :obj:`3`)
      out_layers (int, optional): Number of layers for features after interaction blocks. (default: :obj:`2`)
      num_pos_emb (int, optional): Number of positional embeddings. (default: :obj:`16`)
      dropout (float, optional): Dropout. (default: :obj:`0`)
      data_augment_eachlayer (bool, optional): Data augmentation tricks. If set to :obj:`True`, will add noise to the node features before each interaction block. (default: :obj:`False`)
      euler_noise (bool, optional): Data augmentation tricks. If set to :obj:`True`, will add noise to Euler angles. (default: :obj:`False`)
      
class_docstr_tok: ["The","ProNet","from","the","``","Learning","Protein","Representations","via","Complete","3D","Graph","Networks","''","paper",".","Args",":","level",":","(","str",",","optional",")",":","The","level","of","protein","representations",".","It","could","be",":","obj",":","`","aminoacid","`",",","obj",":","`","backbone","`",",","and",":","obj",":","`","allatom","`",".","(","default",":",":","obj",":","`","aminoacid","`",")","num_blocks","(","int",",","optional",")",":","Number","of","building","blocks",".","(","default",":",":","obj",":","`","4","`",")","hidden_channels","(","int",",","optional",")",":","Hidden","embedding","size",".","(","default",":",":","obj",":","`","128","`",")","out_channels","(","int",",","optional",")",":","Size","of","each","output","sample",".","(","default",":",":","obj",":","`","1","`",")","mid_emb","(","int",",","optional",")",":","Embedding","size","used","for","geometric","features",".","(","default",":",":","obj",":","`","64","`",")","num_radial","(","int",",","optional",")",":","Number","of","radial","basis","functions",".","(","default",":",":","obj",":","`","6","`",")","num_spherical","(","int",",","optional",")",":","Number","of","spherical","harmonics",".","(","default",":",":","obj",":","`","2","`",")","cutoff","(","float",",","optional",")",":","Cutoff","distance","for","interatomic","interactions",".","(","default",":",":","obj",":","`","10.0","`",")","max_num_neighbors","(","int",",","optional",")",":","Max","number","of","neighbors","during","graph","construction",".","(","default",":",":","obj",":","`","32","`",")","int_emb_layers","(","int",",","optional",")",":","Number","of","embedding","layers","in","the","interaction","block",".","(","default",":",":","obj",":","`","3","`",")","out_layers","(","int",",","optional",")",":","Number","of","layers","for","features","after","interaction","blocks",".","(","default",":",":","obj",":","`","2","`",")","num_pos_emb","(","int",",","optional",")",":","Number","of","positional","embeddings",".","(","default",":",":","obj",":","`","16","`",")","dropout","(","float",",","optional",")",":","Dropout",".","(","default",":",":","obj",":","`","0","`",")","data_augment_eachlayer","(","bool",",","optional",")",":","Data","augmentation","tricks",".","If","set","to",":","obj",":","`","True","`",",","will","add","noise","to","the","node","features","before","each","interaction","block",".","(","default",":",":","obj",":","`","False","`",")","euler_noise","(","bool",",","optional",")",":","Data","augmentation","tricks",".","If","set","to",":","obj",":","`","True","`",",","will","add","noise","to","Euler","angles",".","(","default",":",":","obj",":","`","False","`",")"]
code: def pos_emb(self, edge_index, num_pos_emb=16):
      # From https://github.com/jingraham/neurips19-graph-protein-design
      d = edge_index[0] - edge_index[1]
  
      frequency = torch.exp(
          torch.arange(
              0,
              num_pos_emb,
              2,
              dtype=torch.float32,
              device=edge_index.device,
          )
          * -(np.log(10000.0) / num_pos_emb)
      )
      angles = d.unsqueeze(-1) * frequency
      E = torch.cat((torch.cos(angles), torch.sin(angles)), -1)
      return E
  
imports: from torch_geometric.nn import inits, MessagePassing
  from torch_geometric.nn import radius_graph
  from .features import d_angle_emb, d_theta_phi_emb
  from torch_scatter import scatter
  from torch_sparse import matmul
  import torch
  from torch import nn
  from torch.nn import Embedding
  import torch.nn.functional
  import numpy
label_desc: Use image node_id 3 for calling the ProNet obj's underlying member method code with example usage: obj.pos_emb(edge_index, num_pos_emb) and returns: E