code: @Override
      @NotNull
      public List<double[]> score(UUID modelId, List<Object[]> scorables) throws FOSException {
          checkNotNull(scorables, "List of scorables cannot be null");
  
          List<double[]> scores = new ArrayList<>(scorables.size());
  
          try {
              reloadModelsLock.readLock().lock();
  
              if (scorables.size() == 1) {
                  // if only one model, then don't parallelize scoring
                  WekaThreadSafeScorer wekaThreadSafeScorer = getScorer(modelId);
                  scores.add(wekaThreadSafeScorer.score(scorables.get(0)));
              } else {
                  Map<Object[], Future<double[]>> futureScores = new HashMap<>(scorables.size());
  
                  // scatter
                  for (Object[] scorable : scorables) {
                      WekaThreadSafeScorer wekaThreadSafeScorer = wekaThreadSafeScorers.get(modelId);
                      futureScores.put(scorable, executorService.submit(new AsyncScoringTask(wekaThreadSafeScorer, scorable)));
                  }
  
                  // gather
                  for (Object[] scorable : scorables) {
                      scores.add(getFuture(futureScores.get(scorable), modelId));
                  }
              }
          } finally {
              reloadModelsLock.readLock().unlock();
          }
  
          return scores;
      }
docs: Score each <code>scorable</code> with the given <code>modelId</code>.
  
  <p> If multiple <code>scorables</code> are given as parameters, they will be scored in parallel.
  
  @param modelId   the id of the model
  @param scorables an array of instances to score
  @return a list of scores with the same order as the scorable array
  @throws FOSException when classification was not possible