code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      aggregators: List[str],
      scalers: List[str],
      deg: Tensor,
      **kwargs,
  ):
      super().__init__(aggr=None, **kwargs)
  
      self.in_channels = in_channels
      self.out_channels = out_channels
      self.aggregators = aggregators
      self.scalers = scalers
  
      deg = deg.to(torch.float)
      self.avg_deg = {
          "lin": deg.mean().item(),
          "log": (deg + 1).log().mean().item(),
      }
  
      self.pre_lins = torch.nn.ModuleList(
          [
              Linear(in_channels, out_channels)
              for _ in range(len(aggregators) * len(scalers))
          ]
      )
      self.post_lins = torch.nn.ModuleList(
          [
              Linear(out_channels, out_channels)
              for _ in range(len(aggregators) * len(scalers))
          ]
      )
  
      self.lin = Linear(in_channels, out_channels)
  
      self.reset_parameters()
  
imports: from itertools import product
  from typing import Optional, List
  import tqdm
  import torch
  from torch import Tensor
  import torch.nn.functional
  from torch.nn import ModuleList, Linear, BatchNorm1d
  from torch_sparse import SparseTensor
  from torch_geometric.nn import MessagePassing
  from torch_geometric.nn import PNAConv
  from torch_scatter import segment_csr
  from ..models import ScalableGNN
label_desc: Use image node_id 1 to create a new PNAConv object from inherited base classes: MessagePassing with example: obj = PNAConv(in_channels, out_channels, aggregators, scalers, deg)