code: def batch_predictions(
              self, images, greedy=False, strict=True, return_details=False):
          
          if strict:
              in_bounds = self.in_bounds(images)
              assert in_bounds
  
          self._total_prediction_calls += len(images)
          predictions = self.__model.batch_predictions(images)
  
          assert predictions.ndim == 2
          assert predictions.shape[0] == images.shape[0]
  
          if return_details:
              assert greedy
  
          adversarials = []
          for i in range(len(predictions)):
              if strict:
                  in_bounds_i = True
              else:
                  in_bounds_i = self.in_bounds(images[i])
              is_adversarial, is_best, distance = self.__is_adversarial(
                  images[i], predictions[i], in_bounds_i)
              if is_adversarial and greedy:
                  if return_details:
                      return predictions, is_adversarial, i, is_best, distance
                  else:
                      return predictions, is_adversarial, i
              adversarials.append(is_adversarial)
  
          if greedy:  # pragma: no cover
              # no adversarial found
              if return_details:
                  return predictions, False, None, False, None
              else:
                  return predictions, False, None
  
          is_adversarial = np.array(adversarials)
          assert is_adversarial.ndim == 1
          assert is_adversarial.shape[0] == images.shape[0]
  
          return predictions, is_adversarial
docs: Interface to model.batch_predictions for attacks.
  
          Parameters
          ----------
          images : `numpy.ndarray`
              Batch of inputs with shape as expected by the model.
          greedy : bool
              Whether the first adversarial should be returned.
          strict : bool
              Controls if the bounds for the pixel values should be checked.