code: def forward(self, g, user_key, item_key, users, pos_items, neg_items):
      h_dict = {ntype: self.feature_dict[ntype] for ntype in g.ntypes}
      # obtain features of each layer and concatenate them all
      user_embeds = []
      item_embeds = []
      user_embeds.append(h_dict[user_key])
      item_embeds.append(h_dict[item_key])
      for layer in self.layers:
          h_dict = layer(g, h_dict)
          user_embeds.append(h_dict[user_key])
          item_embeds.append(h_dict[item_key])
      user_embd = torch.cat(user_embeds, 1)
      item_embd = torch.cat(item_embeds, 1)
  
      u_g_embeddings = user_embd[users, :]
      pos_i_g_embeddings = item_embd[pos_items, :]
      neg_i_g_embeddings = item_embd[neg_items, :]
  
      return u_g_embeddings, pos_i_g_embeddings, neg_i_g_embeddings
  
file_path: dgl/examples/pytorch/NGCF/NGCF/model.py
imports: import dgl.function
  import torch
  import torch.nn
  import torch.nn.functional
label_desc: Use image node_id 4 for calling the NGCF obj's underlying member method code with example usage: obj.forward(g, user_key, item_key, users, pos_items, neg_items) and returns: u_g_embeddings,  pos_i_g_embeddings,  neg_i_g_embeddings