class_docstr: In the original paper, the authors proposed several architectures. We compared 3 different
  architectures:
  
      (1)  Concatenate item input and feature input and use single RNN,
  
      (2)  Concatenate outputs from two different RNNs,
  
      (3)  Weighted sum of outputs from two different RNNs.
  
  We implemented the optimal parallel version(2), which uses different RNNs to
  encode items and features respectively and concatenates the two subparts'
  outputs as the final output. The different RNN encoders are trained simultaneously.
class_docstr_tok: ["In","the","original","paper",",","the","authors","proposed","several","architectures",".","We","compared","3","different","architectures",":","(","1",")","Concatenate","item","input","and","feature","input","and","use","single","RNN",",","(","2",")","Concatenate","outputs","from","two","different","RNNs",",","(","3",")","Weighted","sum","of","outputs","from","two","different","RNNs",".","We","implemented","the","optimal","parallel","version","(","2",")",",","which","uses","different","RNNs","to","encode","items","and","features","respectively","and","concatenates","the","two","subparts'","outputs","as","the","final","output",".","The","different","RNN","encoders","are","trained","simultaneously","."]
code: def predict(self, interaction):
      item_seq = interaction[self.ITEM_SEQ]
      item_seq_len = interaction[self.ITEM_SEQ_LEN]
      test_item = interaction[self.ITEM_ID]
      seq_output = self.forward(item_seq, item_seq_len)
      test_item_emb = self.item_embedding(test_item)
      scores = torch.mul(seq_output, test_item_emb).sum(dim=1)  # [B]
      return scores
  
file_path: RecBole/recbole/model/sequential_recommender/gru4recf.py
imports: import torch
  from torch import nn
  from recbole.model.abstract_recommender import SequentialRecommender
  from recbole.model.init import xavier_normal_initialization
  from recbole.model.layers import FeatureSeqEmbLayer
  from recbole.model.loss import BPRLoss
label_desc: Use image node_id 4 for calling the GRU4RecF obj's underlying member method code with example usage: obj.predict(interaction) and returns: scores