class_docstr: A single PNA tower in PNA layers
class_docstr_tok: ["A","single","PNA","tower","in","PNA","layers"]
docstr: reduce function for PNA layer:
  tensordot of multiple aggregation and scaling operations
docstr_tok: ["reduce","function","for","PNA","layer",":","tensordot","of","multiple","aggregation","and","scaling","operations"]
code: def reduce_func(self, nodes):
      """reduce function for PNA layer:
      tensordot of multiple aggregation and scaling operations"""
      msg = nodes.mailbox["msg"]
      degree = msg.size(1)
      h = torch.cat(
          [AGGREGATORS[agg](msg) for agg in self.aggregators], dim=1
      )
      h = torch.cat(
          [
              SCALERS[scaler](h, D=degree, delta=self.delta)
              if scaler != "identity"
              else h
              for scaler in self.scalers
          ],
          dim=1,
      )
      return {"h_neigh": h}
  
imports: import numpy
  import torch
  import torch.nn
label_desc: Use image node_id 2 for calling the PNAConvTower obj's underlying member method code with example usage: obj.reduce_func(nodes) and returns: dict