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 the model loss for a link prediction objective via the
  :class:`torch.nn.BCEWithLogitsLoss`.
  
  Args:
      pred (torch.Tensor): The predictions.
      edge_label (torch.Tensor): The ground-truth edge labels.
      **kwargs (optional): Additional arguments of the underlying
          :class:`torch.nn.BCEWithLogitsLoss` loss function.
docstr_tok: ["Computes","the","model","loss","for","a","link","prediction","objective","via","the",":","class",":","`","torch.nn.BCEWithLogitsLoss","`",".","Args",":","pred","(","torch.Tensor",")",":","The","predictions",".","edge_label","(","torch.Tensor",")",":","The","ground-truth","edge","labels",".","*","*","kwargs","(","optional",")",":","Additional","arguments","of","the","underlying",":","class",":","`","torch.nn.BCEWithLogitsLoss","`","loss","function","."]
code: def link_pred_loss(
      self, pred: Tensor, edge_label: Tensor, **kwargs
  ) -> Tensor:
      r"""Computes the model loss for a link prediction objective via the
      :class:`torch.nn.BCEWithLogitsLoss`.
  
      Args:
          pred (torch.Tensor): The predictions.
          edge_label (torch.Tensor): The ground-truth edge labels.
          **kwargs (optional): Additional arguments of the underlying
              :class:`torch.nn.BCEWithLogitsLoss` loss function.
      """
      loss_fn = torch.nn.BCEWithLogitsLoss(**kwargs)
      return loss_fn(pred, edge_label.to(pred.dtype))
  
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 7 for calling the LightGCN obj's underlying member method code with example usage: obj.link_pred_loss(pred, edge_label) and returns: loss_fn