src/main/java/com/feedzai/fos/impl/weka/WekaScorer.java
@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;
    }
@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;
    }
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