class_docstr: http://jgillenw.com/cikm2018.pdf Algorithm 1
docstr: Args:
      quality_scores: (num_items, 1)
      feature_vectors (num_items, num_feat)
  
  Return:
      chosen indices: (num_items, )
      determinants computed at each selection: (num_items, num_items)
      the kernel matrix: (num_items, num_items)
code: def forward(
      self,
      quality_scores: torch.Tensor,
      feature_vectors: torch.Tensor,
  ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
      """
      Args:
          quality_scores: (num_items, 1)
          feature_vectors (num_items, num_feat)
  
      Return:
          chosen indices: (num_items, )
          determinants computed at each selection: (num_items, num_items)
          the kernel matrix: (num_items, num_items)
      """
  
      quality_scores = quality_scores.float()
      feature_vectors = F.normalize(
          feature_vectors.float(), p=2.0, dim=1
      )
  
      num_items = quality_scores.shape[0]
      if self.kernel == Kernel.Linear:
          B = (self.alpha**0.5) * quality_scores * feature_vectors
          L = torch.mm(B, B.t())
          L[torch.arange(num_items), torch.arange(num_items)] = (
              # pyre-fixme[58]: `**` is not supported for operand types `Tensor`
              #  and `int`.
              quality_scores.squeeze(1)
              ** 2
          )
      elif self.kernel == Kernel.RBF:
          L = (
              self.alpha
              * torch.mm(quality_scores, quality_scores.t())
              * torch.exp(
                  # pyre-fixme[58]: `**` is not supported for operand types
                  #  `Tensor` and `int`.
                  -(
                      torch.cdist(
                          feature_vectors, feature_vectors, p=2.0
                      )
                      ** 2
                  )
                  / (2 * self.sigma**2)
              )
          )
      else:
          raise NotImplementedError()
  
      chosen, dets = self.greedy_select(L)
  
      return chosen, dets, L
  
file_path: ReAgent/reagent/prediction/ranking/predictor_wrapper.py
imports: from enum import Enum
  from typing import List, Optional, Tuple
  import torch
  import torch.nn.functional
label_desc: Use image node_id 4 for calling the DeterminantalPointProcessPredictorWrapper obj's underlying member method code with example usage: obj.forward(quality_scores, feature_vectors) and returns: chosen,  dets,  L