class_docstr: The Lattice Convolution layer of LCNN
  
  The following class implements the lattice convolution function which is
  based on graph convolution networks where,
  [1] Each atom is represented as a node
  [2] Adjacent atom based on distance are considered as neighbors.
  
  Operations in Lattice Convolution:
  
  [1] In graph aggregation step- node features of neighbors are concatenated and
  into a linear layer. But since diffrent permutation of order of neighbors could
  be considered because of which , diffrent permutation of the lattice
  structure are considered in diffrent symmetrical angles (0 , 60 ,120 180 , 240 , 300 )
  
  [2] After the linear layer on each permutations, they are added up for each node and
  each node is transformed into a vector.
  
  Examples
  --------
  >>> import deepchem as dc
  >>> from deepchem.models.torch_models.lcnn import LCNNBlock
  >>> from deepchem.feat.graph_data import GraphData
  >>> import numpy as np
  >>> nodes = np.array([0, 1, 2])
  >>> x = np.zeros((nodes.size, nodes.max()+1))
  >>> x[np.arange(nodes.size),nodes] = 1
  >>> v = np.array([ 0,0, 0,0, 1,1, 1,1, 2,2, 2,2 ])
  >>> u = np.array([ 1,2, 2,1, 2,0, 0,2, 1,0, 0,1 ])
  >>> graph = GraphData(node_features=x, edge_index=np.array([u, v]))
  >>> model = LCNNBlock(3*2, 3, 2)
  >>> G = graph.to_dgl_graph()
  >>> x = G.ndata.pop('x')
  >>> print(model(G, x).shape)
  torch.Size([3, 3])
docstr: Lattice Convolution Layer used in the main model
  
  Parameters
  ----------
  input_feature: int
      Dimenion of the concatenated input vector. Node_feature_size*number of neighbors
  output_feature: int, default 19
      Dimension of feature size of the convolution
  n_permutation_list: int, default 6
      Diffrent permutations taken along diffrent directions
  dropout: float
      p value for dropout between 0.0 to 1.0
  UseBN: bool
      To use batch normalisation
docstr_tok: ["Lattice","Convolution","Layer","used","in","the","main","model","Parameters","--","--","--","--","--","input_feature",":","int","Dimenion","of","the","concatenated","input","vector",".","Node_feature_size","*","number","of","neighbors","output_feature",":","int",",","default","19","Dimension","of","feature","size","of","the","convolution","n_permutation_list",":","int",",","default","6","Diffrent","permutations","taken","along","diffrent","directions","dropout",":","float","p","value","for","dropout","between","0.0","to","1.0","UseBN",":","bool","To","use","batch","normalisation"]
code: def __init__(
      self,
      input_feature: int,
      output_feature: int = 19,
      n_permutation_list: int = 6,
      dropout: float = 0.2,
      UseBN: bool = True,
  ):
      """
      Lattice Convolution Layer used in the main model
  
      Parameters
      ----------
      input_feature: int
          Dimenion of the concatenated input vector. Node_feature_size*number of neighbors
      output_feature: int, default 19
          Dimension of feature size of the convolution
      n_permutation_list: int, default 6
          Diffrent permutations taken along diffrent directions
      dropout: float
          p value for dropout between 0.0 to 1.0
      UseBN: bool
          To use batch normalisation
      """
      super(LCNNBlock, self).__init__()
  
      self.conv_weights = nn.Linear(input_feature, output_feature)
      self.batch_norm = nn.BatchNorm1d(output_feature)
      self.UseBN = UseBN
      self.activation = Shifted_softplus()
      self.dropout = Custom_dropout(dropout, n_permutation_list)
      self.permutation = n_permutation_list
  
imports: import torch
  import torch.nn
  from deepchem.models.torch_models.torch_model import TorchModel
  from deepchem.models.losses import L2Loss
label_desc: Use image node_id 1 to create a new LCNNBlock object from inherited base classes: nn with example: obj = LCNNBlock(input_feature, output_feature, n_permutation_list, dropout, UseBN)