text: # Copyright (c) Microsoft Corporation. All rights reserved.
  # Licensed under the MIT License.
  
  import numpy as np
  import torch
  
  from .base_sampler import BaseSampler
  
  
  class RandomSampler(BaseSampler):
  
      def __init__(self,
                   num,
                   pos_fraction,
                   neg_pos_ub=-1,
                   add_gt_as_proposals=False,
                   **kwargs):
          super(RandomSampler, self).__init__(num, pos_fraction, neg_pos_ub,
                                              add_gt_as_proposals)
  
      @staticmethod
      def random_choice(gallery, num):
          """Random select some elements from the gallery.
  
          It seems that Pytorch's implementation is slower than numpy so we use
          numpy to randperm the indices.
          """
          assert len(gallery) >= num
          if isinstance(gallery, list):
              gallery = np.array(gallery)
          cands = np.arange(len(gallery))
          np.random.shuffle(cands)
          rand_inds = cands[:num]
          if not isinstance(gallery, np.ndarray):
              rand_inds = torch.from_numpy(rand_inds).long().to(gallery.device)
          return gallery[rand_inds]
  
      def _sample_pos(self, assign_result, num_expected, **kwargs):
          """Randomly sample some positive samples."""
          pos_inds = torch.nonzero(assign_result.gt_inds > 0)
          if pos_inds.numel() != 0:
              pos_inds = pos_inds.squeeze(1)
          if pos_inds.numel() <= num_expected:
              return pos_inds
          else:
              return self.random_choice(pos_inds, num_expected)
  
      def _sample_neg(self, assign_result, num_expected, **kwargs):
          """Randomly sample some negative samples."""
          neg_inds = torch.nonzero(assign_result.gt_inds == 0)
          if neg_inds.numel() != 0:
              neg_inds = neg_inds.squeeze(1)
          if len(neg_inds) <= num_expected:
              return neg_inds
          else:
              return self.random_choice(neg_inds, num_expected)
  