class_docstr: GCMC is a model that incorporate graph autoencoders for recommendation.
  
  Graph autoencoders are comprised of:
  
  1) a graph encoder model :math:`Z = f(X; A)`, which take as input an :math:`N \times D` feature matrix X and
  a graph adjacency matrix A, and produce an :math:`N \times E` node embedding matrix
  :math:`Z = [z_1^T,..., z_N^T ]^T`;
  
  2) a pairwise decoder model :math:`\hat A = g(Z)`, which takes pairs of node embeddings :math:`(z_i, z_j)` and
  predicts respective entries :math:`\hat A_{ij}` in the adjacency matrix.
  
  Note that :math:`N` denotes the number of nodes, :math:`D` the number of input features,
  and :math:`E` the embedding size.
  
  We implement the model following the original author with a pairwise training mode.
class_docstr_tok: ["GCMC","is","a","model","that","incorporate","graph","autoencoders","for","recommendation",".","Graph","autoencoders","are","comprised","of",":","1",")","a","graph","encoder","model",":","math",":","`","Z","=","f","(","X",";","A",")","`",",","which","take","as","input","an",":","math",":","`","N","\\times","D","`","feature","matrix","X","and","a","graph","adjacency","matrix","A",",","and","produce","an",":","math",":","`","N","\\times","E","`","node","embedding","matrix",":","math",":","`","Z","=","[","z_1^T",",","...",",","z_N^T","]","^T","`",";","2",")","a","pairwise","decoder","model",":","math",":","`","\\hat","A","=","g","(","Z",")","`",",","which","takes","pairs","of","node","embeddings",":","math",":","`","(","z_i",",","z_j",")","`","and","predicts","respective","entries",":","math",":","`","\\hat","A_","{","ij","}","`","in","the","adjacency","matrix",".","Note","that",":","math",":","`","N","`","denotes","the","number","of","nodes",",",":","math",":","`","D","`","the","number","of","input","features",",","and",":","math",":","`","E","`","the","embedding","size",".","We","implement","the","model","following","the","original","author","with","a","pairwise","training","mode","."]
code: def forward(self, user_X, item_X, user, item):
      # Graph autoencoders are comprised of a graph encoder model and a pairwise decoder model.
      user_embedding, item_embedding = self.GcEncoder(user_X, item_X)
      predict_score = self.BiDecoder(
          user_embedding, item_embedding, user, item
      )
      return predict_score
  
imports: import math
  import numpy
  import scipy.sparse
  import torch
  import torch.nn
  from recbole.model.abstract_recommender import GeneralRecommender
  from recbole.model.layers import SparseDropout
  from recbole.utils import InputType
label_desc: Use image node_id 4 for calling the GCMC obj's underlying member method code with example usage: obj.forward(user_X, item_X, user, item) and returns: predict_score