class_docstr: The LINKX model from the `"Large Scale Learning on Non-Homophilous
  Graphs: New Benchmarks and Strong Simple Methods"
  <https://arxiv.org/abs/2110.14446>`_ paper.
  
  .. math::
      \mathbf{H}_{\mathbf{A}} &= \textrm{MLP}_{\mathbf{A}}(\mathbf{A})
  
      \mathbf{H}_{\mathbf{X}} &= \textrm{MLP}_{\mathbf{X}}(\mathbf{X})
  
      \mathbf{Y} &= \textrm{MLP}_{f} \left( \sigma \left( \mathbf{W}
      [\mathbf{H}_{\mathbf{A}}, \mathbf{H}_{\mathbf{X}}] +
      \mathbf{H}_{\mathbf{A}} + \mathbf{H}_{\mathbf{X}} \right) \right)
  
  .. note::
  
      For an example of using LINKX, see `examples/linkx.py <https://
      github.com/pyg-team/pytorch_geometric/blob/master/examples/linkx.py>`_.
  
  Args:
      num_nodes (int): The number of nodes in the graph.
      in_channels (int): Size of each input sample, or :obj:`-1` to derive
          the size from the first input(s) to the forward method.
      hidden_channels (int): Size of each hidden sample.
      out_channels (int): Size of each output sample.
      num_layers (int): Number of layers of :math:`\textrm{MLP}_{f}`.
      num_edge_layers (int, optional): Number of layers of
          :math:`\textrm{MLP}_{\mathbf{A}}`. (default: :obj:`1`)
      num_node_layers (int, optional): Number of layers of
          :math:`\textrm{MLP}_{\mathbf{X}}`. (default: :obj:`1`)
      dropout (float, optional): Dropout probability of each hidden
          embedding. (default: :obj:`0.0`)
code: def __repr__(self) -> str:
      return (
          f"{self.__class__.__name__}(num_nodes={self.num_nodes}, "
          f"in_channels={self.in_channels}, "
          f"out_channels={self.out_channels})"
      )
  
imports: import math
  import torch
  from torch import Tensor
  from torch.nn import BatchNorm1d, Parameter
  from torch_geometric.nn import inits
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.models import MLP
  from torch_geometric.typing import Adj, OptTensor
  from torch_geometric.utils import spmm
label_desc: Use image node_id 4 for calling the LINKX obj's underlying member method code with example usage: obj.__repr__() and returns: self, str, self, str, self, str, self, str