private static Map initEvaluationContexts()

in modules/ml-ext/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/Evaluator.java [493:546]


    private static Map<Class, EvaluationContext> initEvaluationContexts(
        Dataset<EmptyContext, FeatureMatrixWithLabelsOnHeapData> dataset,
        Metric... metrics
    ) {
        long nonEmptyCtxsCnt = Arrays.stream(metrics)
            .map(x -> x.makeAggregator().createInitializedContext())
            .filter(x -> ((EvaluationContext)x).needToCompute())
            .count();

        if (nonEmptyCtxsCnt == 0) {
            HashMap<Class, EvaluationContext> res = new HashMap<>();

            for (Metric m : metrics) {
                MetricStatsAggregator<Double, ?, ?> aggregator = m.makeAggregator();
                res.put(aggregator.getClass(), (EvaluationContext)m.makeAggregator().createInitializedContext());
                return res;
            }
        }

        return dataset.compute(data -> {
            Map<Class, MetricStatsAggregator> aggrs = new HashMap<>();
            for (Metric m : metrics) {
                MetricStatsAggregator<Double, ?, ?> aggregator = m.makeAggregator();
                if (!aggrs.containsKey(aggregator.getClass()))
                    aggrs.put(aggregator.getClass(), aggregator);
            }

            Map<Class, EvaluationContext> aggrToEvCtx = new HashMap<>();
            aggrs.forEach((clazz, aggr) -> aggrToEvCtx.put(clazz, (EvaluationContext)aggr.createInitializedContext()));

            for (int i = 0; i < data.getLabels().length; i++) {
                LabeledVector<Double> vector = VectorUtils.of(data.getFeatures()[i]).labeled(data.getLabels()[i]);
                aggrToEvCtx.values().forEach(ctx -> ctx.aggregate(vector));
            }
            return aggrToEvCtx;
        }, (left, right) -> {
            if (left == null && right == null)
                return new HashMap<>();

            if (left == null)
                return right;
            if (right == null)
                return left;

            HashMap<Class, EvaluationContext> res = new HashMap<>();
            for (Class key : left.keySet()) {
                EvaluationContext ctx1 = left.get(key);
                EvaluationContext ctx2 = right.get(key);
                A.ensure(ctx1 != null && ctx2 != null, "ctx1 != null && ctx2 != null");
                res.put(key, ctx1.mergeWith(ctx2));
            }
            return res;
        });
    }