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 ranking objective via the Bayesian
  Personalized Ranking (BPR) loss.
  
  .. note::
  
      The i-th entry in the :obj:`pos_edge_rank` vector and i-th entry
      in the :obj:`neg_edge_rank` entry must correspond to ranks of
      positive and negative edges of the same entity (*e.g.*, user).
  
  Args:
      pos_edge_rank (torch.Tensor): Positive edge rankings.
      neg_edge_rank (torch.Tensor): Negative edge rankings.
      node_id (torch.Tensor): The indices of the nodes involved for
          deriving a prediction for both positive and negative edges.
          If set to :obj:`None`, all nodes will be used.
      lambda_reg (int, optional): The :math:`L_2` regularization strength
          of the Bayesian Personalized Ranking (BPR) loss.
          (default: :obj:`1e-4`)
      **kwargs (optional): Additional arguments of the underlying
          :class:`torch_geometric.nn.models.lightgcn.BPRLoss` loss
          function.
docstr_tok: ["Computes","the","model","loss","for","a","ranking","objective","via","the","Bayesian","Personalized","Ranking","(","BPR",")","loss",".","..","note",":",":","The","i-th","entry","in","the",":","obj",":","`","pos_edge_rank","`","vector","and","i-th","entry","in","the",":","obj",":","`","neg_edge_rank","`","entry","must","correspond","to","ranks","of","positive","and","negative","edges","of","the","same","entity","(","*","e.g",".","*",",","user",")",".","Args",":","pos_edge_rank","(","torch.Tensor",")",":","Positive","edge","rankings",".","neg_edge_rank","(","torch.Tensor",")",":","Negative","edge","rankings",".","node_id","(","torch.Tensor",")",":","The","indices","of","the","nodes","involved","for","deriving","a","prediction","for","both","positive","and","negative","edges",".","If","set","to",":","obj",":","`","None","`",",","all","nodes","will","be","used",".","lambda_reg","(","int",",","optional",")",":","The",":","math",":","`","L_2","`","regularization","strength","of","the","Bayesian","Personalized","Ranking","(","BPR",")","loss",".","(","default",":",":","obj",":","`","1e-4","`",")","*","*","kwargs","(","optional",")",":","Additional","arguments","of","the","underlying",":","class",":","`","torch_geometric.nn.models.lightgcn.BPRLoss","`","loss","function","."]
code: def recommendation_loss(
      self,
      pos_edge_rank: Tensor,
      neg_edge_rank: Tensor,
      node_id: Optional[Tensor] = None,
      lambda_reg: float = 1e-4,
      **kwargs,
  ) -> Tensor:
      r"""Computes the model loss for a ranking objective via the Bayesian
      Personalized Ranking (BPR) loss.
  
      .. note::
  
          The i-th entry in the :obj:`pos_edge_rank` vector and i-th entry
          in the :obj:`neg_edge_rank` entry must correspond to ranks of
          positive and negative edges of the same entity (*e.g.*, user).
  
      Args:
          pos_edge_rank (torch.Tensor): Positive edge rankings.
          neg_edge_rank (torch.Tensor): Negative edge rankings.
          node_id (torch.Tensor): The indices of the nodes involved for
              deriving a prediction for both positive and negative edges.
              If set to :obj:`None`, all nodes will be used.
          lambda_reg (int, optional): The :math:`L_2` regularization strength
              of the Bayesian Personalized Ranking (BPR) loss.
              (default: :obj:`1e-4`)
          **kwargs (optional): Additional arguments of the underlying
              :class:`torch_geometric.nn.models.lightgcn.BPRLoss` loss
              function.
      """
      loss_fn = BPRLoss(lambda_reg, **kwargs)
      emb = self.embedding.weight
      emb = emb if node_id is None else emb[node_id]
      return loss_fn(pos_edge_rank, neg_edge_rank, emb)
  
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 8 for calling the LightGCN obj's underlying member method code with example usage: obj.recommendation_loss(pos_edge_rank, neg_edge_rank, node_id, lambda_reg) and returns: loss_fn