class_docstr: The LightGCN model from the `"LightGCN: Simplifying and Powering
  Graph Convolution Network for Recommendation"
  <https://arxiv.org/abs/2002.02126>`_ paper.
  
  :class:`~torch_geometric.nn.models.LightGCN` learns embeddings by linearly
  propagating them on the underlying graph, and uses the weighted sum of the
  embeddings learned at all layers as the final embedding
  
  .. math::
      \textbf{x}_i = \sum_{l=0}^{L} \alpha_l \textbf{x}^{(l)}_i,
  
  where each layer's embedding is computed as
  
  .. math::
      \mathbf{x}^{(l+1)}_i = \sum_{j \in \mathcal{N}(i)}
      \frac{1}{\sqrt{\deg(i)\deg(j)}}\mathbf{x}^{(l)}_j.
  
  Two prediction heads and training objectives are provided:
  **link prediction** (via
  :meth:`~torch_geometric.nn.models.LightGCN.link_pred_loss` and
  :meth:`~torch_geometric.nn.models.LightGCN.predict_link`) and
  **recommendation** (via
  :meth:`~torch_geometric.nn.models.LightGCN.recommendation_loss` and
  :meth:`~torch_geometric.nn.models.LightGCN.recommend`).
  
  .. note::
  
      Embeddings are propagated according to the graph connectivity specified
      by :obj:`edge_index` while rankings or link probabilities are computed
      according to the edges specified by :obj:`edge_label_index`.
  
  .. note::
  
      For an example of using :class:`LightGCN`, see `examples/lightgcn.py
      <https://github.com/pyg-team/pytorch_geometric/blob/master/examples/
      lightgcn.py>`_.
  
  Args:
      num_nodes (int): The number of nodes in the graph.
      embedding_dim (int): The dimensionality of node embeddings.
      num_layers (int): The number of
          :class:`~torch_geometric.nn.conv.LGConv` layers.
      alpha (float or torch.Tensor, optional): The scalar or vector
          specifying the re-weighting coefficients for aggregating the final
          embedding. If set to :obj:`None`, the uniform initialization of
          :obj:`1 / (num_layers + 1)` is used. (default: :obj:`None`)
      **kwargs (optional): Additional arguments of the underlying
          :class:`~torch_geometric.nn.conv.LGConv` layers.
docstr: Computes rankings for pairs of nodes.
  
  Args:
      edge_index (torch.Tensor or SparseTensor): Edge tensor specifying
          the connectivity of the graph.
      edge_label_index (torch.Tensor, optional): Edge tensor specifying
          the node pairs for which to compute rankings or probabilities.
          If :obj:`edge_label_index` is set to :obj:`None`, all edges in
          :obj:`edge_index` will be used instead. (default: :obj:`None`)
      edge_weight (torch.Tensor, optional): The weight of each edge in
          :obj:`edge_index`. (default: :obj:`None`)
docstr_tok: ["Computes","rankings","for","pairs","of","nodes",".","Args",":","edge_index","(","torch.Tensor","or","SparseTensor",")",":","Edge","tensor","specifying","the","connectivity","of","the","graph",".","edge_label_index","(","torch.Tensor",",","optional",")",":","Edge","tensor","specifying","the","node","pairs","for","which","to","compute","rankings","or","probabilities",".","If",":","obj",":","`","edge_label_index","`","is","set","to",":","obj",":","`","None","`",",","all","edges","in",":","obj",":","`","edge_index","`","will","be","used","instead",".","(","default",":",":","obj",":","`","None","`",")","edge_weight","(","torch.Tensor",",","optional",")",":","The","weight","of","each","edge","in",":","obj",":","`","edge_index","`",".","(","default",":",":","obj",":","`","None","`",")"]
code: def forward(
      self,
      edge_index: Adj,
      edge_label_index: OptTensor = None,
      edge_weight: OptTensor = None,
  ) -> Tensor:
      r"""Computes rankings for pairs of nodes.
  
      Args:
          edge_index (torch.Tensor or SparseTensor): Edge tensor specifying
              the connectivity of the graph.
          edge_label_index (torch.Tensor, optional): Edge tensor specifying
              the node pairs for which to compute rankings or probabilities.
              If :obj:`edge_label_index` is set to :obj:`None`, all edges in
              :obj:`edge_index` will be used instead. (default: :obj:`None`)
          edge_weight (torch.Tensor, optional): The weight of each edge in
              :obj:`edge_index`. (default: :obj:`None`)
      """
      if edge_label_index is None:
          if is_sparse(edge_index):
              edge_label_index, _ = to_edge_index(edge_index)
          else:
              edge_label_index = edge_index
  
      out = self.get_embedding(edge_index, edge_weight)
  
      out_src = out[edge_label_index[0]]
      out_dst = out[edge_label_index[1]]
  
      return (out_src * out_dst).sum(dim=-1)
  
imports: from typing import Optional, Union
  import torch
  import torch.nn.functional
  from torch import Tensor
  from torch.nn import Embedding, ModuleList
  from torch.nn.modules.loss import _Loss
  from torch_geometric.nn.conv import LGConv
  from torch_geometric.typing import Adj, OptTensor
  from torch_geometric.utils import is_sparse, to_edge_index
label_desc: Use image node_id 4 for calling the LightGCN obj's underlying member method code with example usage: obj.forward(edge_index, edge_label_index, edge_weight) and returns: unknown