class_docstr: GNN Aggregator layer
class_docstr_tok: ["GNN","Aggregator","layer"]
code: def forward(self, norm_matrix, ego_embeddings):
      side_embeddings = torch.sparse.mm(norm_matrix, ego_embeddings)
  
      if self.aggregator_type == "gcn":
          ego_embeddings = self.activation(
              self.W(ego_embeddings + side_embeddings)
          )
      elif self.aggregator_type == "graphsage":
          ego_embeddings = self.activation(
              self.W(
                  torch.cat([ego_embeddings, side_embeddings], dim=1)
              )
          )
      elif self.aggregator_type == "bi":
          add_embeddings = ego_embeddings + side_embeddings
          sum_embeddings = self.activation(self.W1(add_embeddings))
          bi_embeddings = torch.mul(ego_embeddings, side_embeddings)
          bi_embeddings = self.activation(self.W2(bi_embeddings))
          ego_embeddings = bi_embeddings + sum_embeddings
      else:
          raise NotImplementedError
  
      ego_embeddings = self.message_dropout(ego_embeddings)
  
      return ego_embeddings
  
imports: import numpy
  import scipy.sparse
  import torch
  import torch.nn
  import torch.nn.functional
  from recbole.model.abstract_recommender import KnowledgeRecommender
  from recbole.model.init import xavier_normal_initialization
  from recbole.model.loss import BPRLoss, EmbLoss
  from recbole.utils import InputType
label_desc: Use image node_id 2 for calling the Aggregator obj's underlying member method code with example usage: obj.forward(norm_matrix, ego_embeddings) and returns: ego_embeddings