class_docstr: :class:`FullSortEvalDataLoader` is a dataloader for full-sort evaluation. In order to speed up calculation,
  this dataloader would only return then user part of interactions, positive items and used items.
  It would not return negative items.
  
  Args:
      config (Config): The config of dataloader.
      dataset (Dataset): The dataset of dataloader.
      sampler (Sampler): The sampler of dataloader.
      shuffle (bool, optional): Whether the dataloader will be shuffle after a round. Defaults to ``False``.
code: def __init__(self, config, dataset, sampler, shuffle=False):
      self.logger = getLogger()
      self.uid_field = dataset.uid_field
      self.iid_field = dataset.iid_field
      self.is_sequential = config["MODEL_TYPE"] == ModelType.SEQUENTIAL
      if not self.is_sequential:
          user_num = dataset.user_num
          self.uid_list = []
          self.uid2items_num = np.zeros(user_num, dtype=np.int64)
          self.uid2positive_item = np.array([None] * user_num)
          self.uid2history_item = np.array([None] * user_num)
  
          dataset.sort(by=self.uid_field, ascending=True)
          last_uid = None
          positive_item = set()
          uid2used_item = sampler.used_ids
          for uid, iid in zip(
              dataset.inter_feat[self.uid_field].numpy(),
              dataset.inter_feat[self.iid_field].numpy(),
          ):
              if uid != last_uid:
                  self._set_user_property(
                      last_uid, uid2used_item[last_uid], positive_item
                  )
                  last_uid = uid
                  self.uid_list.append(uid)
                  positive_item = set()
              positive_item.add(iid)
          self._set_user_property(
              last_uid, uid2used_item[last_uid], positive_item
          )
          self.uid_list = torch.tensor(self.uid_list, dtype=torch.int64)
          self.user_df = dataset.join(
              Interaction({self.uid_field: self.uid_list})
          )
  
      self.sample_size = (
          len(self.user_df) if not self.is_sequential else len(dataset)
      )
      if shuffle:
          self.logger.warnning("FullSortEvalDataLoader can't shuffle")
          shuffle = False
      super().__init__(config, dataset, sampler, shuffle=shuffle)
  
imports: import numpy
  import torch
  from logging import getLogger
  from recbole.data.dataloader.abstract_dataloader import AbstractDataLoader, NegSampleDataLoader
  from recbole.data.interaction import Interaction, cat_interactions
  from recbole.utils import InputType, ModelType
label_desc: Use image node_id 1 to create a new FullSortEvalDataLoader object from inherited base classes: AbstractDataLoader with example: obj = FullSortEvalDataLoader(config, dataset, sampler, shuffle)