code: def forward(self, user, item, *args):
      # args should be in the order of sparse feats and dense feats
      if not self.model == "MLP":
          embed_user_GMF = self.embed_user_GMF(user)
          embed_item_GMF = self.embed_item_GMF(item)
          output_GMF = embed_user_GMF * embed_item_GMF
      if not self.model == "GMF":
          embed_user_MLP = self.embed_user_MLP(user)
          embed_item_MLP = self.embed_item_MLP(item)
          interaction = torch.cat((embed_user_MLP, embed_item_MLP), -1)
          for i in range(self.num_sparse_feats):
              embed_catFeats_MLP = self.embed_catFeats_MLP[i](args[i])
              interaction = torch.cat(
                  (interaction, embed_catFeats_MLP), -1
              )
          for i in range(self.num_dense_feats):
              interaction = torch.cat(
                  (interaction, args[i + self.num_sparse_feats]), -1
              )
          output_MLP = self.MLP_layers(interaction)
  
      if self.model == "GMF":
          concat = output_GMF
      elif self.model == "MLP":
          concat = output_MLP
      else:
          concat = torch.cat((output_GMF, output_MLP), -1)
  
      prediction = self.predict_layer(concat)
      return prediction.view(-1)
  
imports: import torch
  import torch.nn
label_desc: Use image node_id 3 for calling the NCF obj's underlying member method code with example usage: obj.forward(user, item) and returns: prediction