class_docstr: Dense bi-linear decoder.
  
  Dense implementation of the bi-linear decoder used in GCMC. Suitable when
  the graph can be efficiently represented by a pair of arrays (one for source
  nodes; one for destination nodes).
  
  Parameters
  ----------
  in_units : int
      Size of input user and movie features
  num_classes : int
      Number of classes.
  num_basis : int, optional
      Number of basis. (Default: 2)
  dropout_rate : float, optional
      Dropout raite (Default: 0.0)
class_docstr_tok: ["Dense","bi-linear","decoder",".","Dense","implementation","of","the","bi-linear","decoder","used","in","GCMC",".","Suitable","when","the","graph","can","be","efficiently","represented","by","a","pair","of","arrays","(","one","for","source","nodes",";","one","for","destination","nodes",")",".","Parameters","--","--","--","--","--","in_units",":","int","Size","of","input","user","and","movie","features","num_classes",":","int","Number","of","classes",".","num_basis",":","int",",","optional","Number","of","basis",".","(","Default",":","2",")","dropout_rate",":","float",",","optional","Dropout","raite","(","Default",":","0.0",")"]
code: def __init__(
      self, in_units, num_classes, num_basis=2, dropout_rate=0.0
  ):
      super().__init__()
      self._num_basis = num_basis
      self.dropout = nn.Dropout(dropout_rate)
      self.P = nn.Parameter(th.randn(num_basis, in_units, in_units))
      self.combine_basis = nn.Linear(
          self._num_basis, num_classes, bias=False
      )
      self.reset_parameters()
  
imports: import dgl.function
  import dgl.nn.pytorch
  import torch
  import torch.nn
  from torch.nn import init
  from utils import get_activation, to_etype_name
label_desc: Use image node_id 1 to create a new DenseBiDecoder object from inherited base classes: nn with example: obj = DenseBiDecoder(in_units, num_classes, num_basis, dropout_rate)