class_docstr: Applies message normalization over the aggregated messages as described
  in the `"DeeperGCNs: All You Need to Train Deeper GCNs"
  <https://arxiv.org/abs/2006.07739>`_ paper.
  
  .. math::
  
      \mathbf{x}_i^{\prime} = \mathrm{MLP} \left( \mathbf{x}_{i} + s \cdot
      {\| \mathbf{x}_i \|}_2 \cdot
      \frac{\mathbf{m}_{i}}{{\|\mathbf{m}_i\|}_2} \right)
  
  Args:
      learn_scale (bool, optional): If set to :obj:`True`, will learn the
          scaling factor :math:`s` of message normalization.
          (default: :obj:`False`)
docstr: Forward pass.
  
  Args:
      x (torch.Tensor): The source tensor.
      msg (torch.Tensor): The message tensor :math:`\mathbf{M}`.
      p (float, optional): The norm :math:`p` to use for normalization.
          (default: :obj:`2.0`)
docstr_tok: ["Forward","pass",".","Args",":","x","(","torch.Tensor",")",":","The","source","tensor",".","msg","(","torch.Tensor",")",":","The","message","tensor",":","math",":","`","\\mathbf","{","M","}","`",".","p","(","float",",","optional",")",":","The","norm",":","math",":","`","p","`","to","use","for","normalization",".","(","default",":",":","obj",":","`","2.0","`",")"]
code: def forward(self, x: Tensor, msg: Tensor, p: float = 2.0) -> Tensor:
      r"""Forward pass.
  
      Args:
          x (torch.Tensor): The source tensor.
          msg (torch.Tensor): The message tensor :math:`\mathbf{M}`.
          p (float, optional): The norm :math:`p` to use for normalization.
              (default: :obj:`2.0`)
      """
      msg = F.normalize(msg, p=p, dim=-1)
      x_norm = x.norm(p=p, dim=-1, keepdim=True)
      return msg * x_norm * self.scale
  
file_path: pytorch_geometric/torch_geometric/nn/norm/msg_norm.py
imports: import torch
  import torch.nn.functional
  from torch import Tensor
  from torch.nn import Parameter
label_desc: Use image node_id 3 for calling the MessageNorm obj's underlying member method code with example usage: obj.forward(x, msg, p) and returns: unknown