class_docstr: A GraphNorm layer implemented as in
  
  GraphNorm: A Principled Approach to Accelerating Graph Neural Network Training (arXiv:2009.03294v1)
    Tianle Cai, Shengjie Luo, Keyulu Xu, Di He, Tie-yan Liu, Liwei Wang
class_docstr_tok: ["A","GraphNorm","layer","implemented","as","in","GraphNorm",":","A","Principled","Approach","to","Accelerating","Graph","Neural","Network","Training","(","arXiv:2009.03294v1",")","Tianle","Cai",",","Shengjie","Luo",",","Keyulu","Xu",",","Di","He",",","Tie-yan","Liu",",","Liwei","Wang"]
code: def forward(
      self,
      node_states: torch.Tensor,
      adjacency_lists: List[Tuple[torch.Tensor, torch.Tensor]],
      node_to_graph_idx: torch.Tensor,
      reference_node_ids: Dict[str, torch.Tensor],
      reference_node_graph_idx: Dict[str, torch.Tensor],
      edge_features: List[torch.Tensor],
  ) -> torch.Tensor:
      per_graph_mean = scatter_mean(
          node_states, index=node_to_graph_idx, dim=0
      )  # [num_graphs, D]
      shifted = (
          node_states - self.alpha * per_graph_mean[node_to_graph_idx]
      )  # [num_nodes, D]
      sigma_2 = (
          scatter_mean(
              torch.pow(shifted, 2), index=node_to_graph_idx, dim=0
          )
          + self.__eps
      )  # [num_graphs, D]
  
      return (
          self.gamma * shifted / torch.sqrt(sigma_2[node_to_graph_idx])
          + self.bias
      )
  
file_path: ptgnn/ptgnn/neuralmodels/gnn/messagepassing/graphnorm.py
imports: import torch
  from torch import nn
  from torch_scatter import scatter_mean
  from typing import Dict, List, Tuple
  from ptgnn.neuralmodels.gnn.messagepassing.abstractmessagepassing import AbstractMessagePassingLayer
label_desc: Use image node_id 2 for calling the GraphNorm obj's underlying member method code with example usage: obj.forward(node_states, adjacency_lists, node_to_graph_idx, reference_node_ids, reference_node_graph_idx, edge_features) and returns: unknown