class_docstr: Aggregation layer for message passing withing GNN.
  
  :param aggregate: The aggregation function to use (max, mean, sum).
  :param pooling_mask: Multiplicative pooling mask for efficient aggregation computation.
docstr: implementation of :class:`~maze.perception.blocks.base.PerceptionBlock` interface
          
docstr_tok: ["implementation","of",":","class",":","`","~maze.perception.blocks.base.PerceptionBlock","`","interface"]
code: def forward(self, t: torch.Tensor) -> torch.Tensor:
      """implementation of :class:`~maze.perception.blocks.base.PerceptionBlock` interface"""
      row, col = self.edges.to(t.device)
      aggr = scatter(
          src=t[:, row],
          index=col,
          dim=-2,
          dim_size=self.pooling_mask.shape[1],
          reduce=self.aggregate_str,
      )
  
      # kept for debugging purposes
      # self._assert_scatter_output(t, aggr)
  
      return aggr
  
imports: from typing import Any, List, Tuple, Union, Sequence, Dict
  import numpy
  import torch
  from torch import nn
  from torch_scatter import scatter
  from maze.core.annotations import override
  from maze.core.utils.factory import Factory
  from maze.perception.blocks.shape_normalization import ShapeNormalizationBlock
label_desc: Use image node_id 2 for calling the AggregationLayer obj's underlying member method code with example usage: obj.forward(t) and returns: aggr