public static aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs()

in packages/dispatcher/src/mathematics/confusion_matrix/UtilityConfusionMatrix.ts [424:850]


    public static aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(
        binaryConfusionMatrices: BinaryConfusionMatrix[],
        labelArrayAndMap: ILabelArrayAndMap,
        confusionMatrixOutputLines: string[][],
        confusionMatrixAverageOutputLines: string[][],
        confusionMatrixAverageDescriptionOutputLines: string[][],
        columnNamePreffix: string,
        toObfuscate: boolean = false,
        quantileConfiguration: number = 4): IMultiLabelObjectConfusionMatrixEvaluationStructure {
        // -----------------------------------------------------------------------
        const confusionMatrix: ConfusionMatrix =
            new ConfusionMatrix(labelArrayAndMap.stringArray, labelArrayAndMap.stringMap);
        // -----------------------------------------------------------------------
        if (Utility.isEmptyArray(confusionMatrixOutputLines)) {
            confusionMatrixOutputLines = [];
        }
        if (Utility.isEmptyArray(confusionMatrixAverageOutputLines)) {
            confusionMatrixAverageOutputLines = [];
        }
        if (Utility.isEmptyArray(confusionMatrixAverageDescriptionOutputLines)) {
            confusionMatrixAverageDescriptionOutputLines = [];
        }
        // -----------------------------------------------------------------------
        Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices.length=${binaryConfusionMatrices.length}`);
        for (let i: number = 0; i < binaryConfusionMatrices.length; i++) {
            const label: string = Utility.carefullyAccessStringArray(labelArrayAndMap.stringArray, i);
            const precision: number = Utility.round(binaryConfusionMatrices[i].getPrecision());
            const recall: number = Utility.round(binaryConfusionMatrices[i].getRecall());
            const f1: number = Utility.round(binaryConfusionMatrices[i].getF1Measure());
            const accuracy: number = Utility.round(binaryConfusionMatrices[i].getAccuracy());
            const truePositives: number = binaryConfusionMatrices[i].getTruePositives();
            const falsePositives: number = binaryConfusionMatrices[i].getFalsePositives();
            const trueNegatives: number = binaryConfusionMatrices[i].getTrueNegatives();
            const falseNegatives: number = binaryConfusionMatrices[i].getFalseNegatives();
            const support: number = binaryConfusionMatrices[i].getSupport();
            const total: number = binaryConfusionMatrices[i].getTotal();
            const confusionMatrixOutputLine: any[] = [
                Utility.outputString(label, toObfuscate),
                precision,
                recall,
                f1,
                accuracy,
                truePositives,
                falsePositives,
                trueNegatives,
                falseNegatives,
                support,
                total,
            ];
            confusionMatrixOutputLines.push(confusionMatrixOutputLine);
            Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getTotal()         =${binaryConfusionMatrices[i].getTotal()}`);
            Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getTruePositives() =${binaryConfusionMatrices[i].getTruePositives()}`);
            Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getFalsePositives()=${binaryConfusionMatrices[i].getFalsePositives()}`);
            Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getTrueNegatives() =${binaryConfusionMatrices[i].getTrueNegatives()}`);
            Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getFalseNegatives()=${binaryConfusionMatrices[i].getFalseNegatives()}`);
        }
        const confusionMatrixMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
            "Confusion matrix metrics",
            confusionMatrixOutputLines,
            ["Label", "Precision", "Recall", "F1", "Accuracy", "#TruePositives", "#FalsePositives", "#TrueNegatives", "#FalseNegatives", "Support", "Total"]);
        // -----------------------------------------------------------------------
        const microAverageMetrics: IConfusionMatrixBaseMicroAverageMetrics =
            confusionMatrix.getMicroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLineMicroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNameMicroAverage,
            "N/A", // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
            "N/A", // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
            // tslint:disable-next-line: max-line-length
            "N/A", // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
            // tslint:disable-next-line: max-line-length
            Utility.getBolded(Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy)), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
            microAverageMetrics.truePositives,
            "N/A", // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
            "N/A",
            microAverageMetrics.falseNegatives,
            "N/A",
            microAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroAverage,
            UtilityConfusionMatrix.DescriptionMicroAverage,
        ]);
        // -----------------------------------------------------------------------
        const microQuantileMetrics: IConfusionMatrixQuantileMetrics =
            confusionMatrix.getMicroQuantileMetrics(binaryConfusionMatrices, quantileConfiguration);
        const confusionMatrixOutputLineMicroQuantile1: any[] = [
            UtilityConfusionMatrix.ColumnNameMicroFirstQuartile,
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesPrecisions, 1) ?
                Utility.round(microQuantileMetrics.quantilesPrecisions[1]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesRecalls, 1) ?
                Utility.round(microQuantileMetrics.quantilesRecalls[1]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesF1Scores, 1) ?
                Utility.getBolded(Utility.round(microQuantileMetrics.quantilesF1Scores[1])) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesAccuracies, 1) ?
                Utility.getBolded(Utility.round(microQuantileMetrics.quantilesAccuracies[1])) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesTruePositives, 1) ?
                microQuantileMetrics.quantilesTruePositives[1] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalsePositives, 1) ?
                microQuantileMetrics.quantilesFalsePositives[1] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesTrueNegatives, 1) ?
                microQuantileMetrics.quantilesTrueNegatives[1] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalseNegatives, 1) ?
                microQuantileMetrics.quantilesFalseNegatives[1] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesSupports, 1) ?
                microQuantileMetrics.quantilesSupports[1] : "N/A",
            microQuantileMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroQuantile1);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroFirstQuartile,
            UtilityConfusionMatrix.DescriptionMicroFirstQuartile,
        ]);
        const confusionMatrixOutputLineMicroQuantile2: any[] = [
            UtilityConfusionMatrix.ColumnNameMicroMedian,
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesPrecisions, 2) ?
                Utility.round(microQuantileMetrics.quantilesPrecisions[2]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesRecalls, 2) ?
                Utility.round(microQuantileMetrics.quantilesRecalls[2]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesF1Scores, 2) ?
                Utility.getBolded(Utility.round(microQuantileMetrics.quantilesF1Scores[2])) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesAccuracies, 2) ?
                Utility.getBolded(Utility.round(microQuantileMetrics.quantilesAccuracies[2])) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesTruePositives, 2) ?
                microQuantileMetrics.quantilesTruePositives[2] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalsePositives, 2) ?
                microQuantileMetrics.quantilesFalsePositives[2] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesTrueNegatives, 2) ?
                microQuantileMetrics.quantilesTrueNegatives[2] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalseNegatives, 2) ?
                microQuantileMetrics.quantilesFalseNegatives[2] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesSupports, 2) ?
                microQuantileMetrics.quantilesSupports[2] : "N/A",
            microQuantileMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroQuantile2);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroMedian,
            UtilityConfusionMatrix.DescriptionMicroMedian,
        ]);
        const confusionMatrixOutputLineMicroQuantile3: any[] = [
            UtilityConfusionMatrix.ColumnNameMicroThirdQuartile,
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesPrecisions, 3) ?
                Utility.round(microQuantileMetrics.quantilesPrecisions[3]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesRecalls, 3) ?
                Utility.round(microQuantileMetrics.quantilesRecalls[3]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesF1Scores, 3) ?
                Utility.round(microQuantileMetrics.quantilesF1Scores[3]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesAccuracies, 3) ?
                Utility.round(microQuantileMetrics.quantilesAccuracies[3]) : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesTruePositives, 3) ?
                microQuantileMetrics.quantilesTruePositives[3] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalsePositives, 3) ?
                microQuantileMetrics.quantilesFalsePositives[3] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesTrueNegatives, 3) ?
                microQuantileMetrics.quantilesTrueNegatives[3] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalseNegatives, 3) ?
                microQuantileMetrics.quantilesFalseNegatives[3] : "N/A",
            Utility.canAccessNumberArray(microQuantileMetrics.quantilesSupports, 3) ?
                microQuantileMetrics.quantilesSupports[3] : "N/A",
            microQuantileMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroQuantile3);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroThirdQuartile,
            UtilityConfusionMatrix.DescriptionMicroThirdQuartile,
        ]);
        // -----------------------------------------------------------------------
        const macroQuantileMetrics: IConfusionMatrixQuantileMetrics =
            confusionMatrix.getMacroQuantileMetrics(binaryConfusionMatrices, quantileConfiguration);
        const confusionMatrixOutputLineMacroQuantile1: any[] = [
            UtilityConfusionMatrix.ColumnNameMacroFirstQuartile,
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesPrecisions, 1) ?
                Utility.round(macroQuantileMetrics.quantilesPrecisions[1]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesRecalls, 1) ?
                Utility.round(macroQuantileMetrics.quantilesRecalls[1]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesF1Scores, 1) ?
                Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesF1Scores[1])) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesAccuracies, 1) ?
                Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesAccuracies[1])) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTruePositives, 1) ?
                macroQuantileMetrics.quantilesTruePositives[1] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalsePositives, 1) ?
                macroQuantileMetrics.quantilesFalsePositives[1] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTrueNegatives, 1) ?
                macroQuantileMetrics.quantilesTrueNegatives[1] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalseNegatives, 1) ?
                macroQuantileMetrics.quantilesFalseNegatives[1] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesSupports, 1) ?
                macroQuantileMetrics.quantilesSupports[1] : "N/A",
            macroQuantileMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroQuantile1);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroFirstQuartile,
            UtilityConfusionMatrix.DescriptionMacroFirstQuartile,
        ]);
        const confusionMatrixOutputLineMacroQuantile2: any[] = [
            UtilityConfusionMatrix.ColumnNameMacroMedian,
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesPrecisions, 2) ?
                Utility.round(macroQuantileMetrics.quantilesPrecisions[2]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesRecalls, 2) ?
                Utility.round(macroQuantileMetrics.quantilesRecalls[2]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesF1Scores, 2) ?
                Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesF1Scores[2])) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesAccuracies, 2) ?
                Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesAccuracies[2])) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTruePositives, 2) ?
                macroQuantileMetrics.quantilesTruePositives[2] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalsePositives, 2) ?
                macroQuantileMetrics.quantilesFalsePositives[2] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTrueNegatives, 2) ?
                macroQuantileMetrics.quantilesTrueNegatives[2] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalseNegatives, 2) ?
                macroQuantileMetrics.quantilesFalseNegatives[2] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesSupports, 2) ?
                macroQuantileMetrics.quantilesSupports[2] : "N/A",
            macroQuantileMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroQuantile2);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroMedian,
            UtilityConfusionMatrix.DescriptionMacroMedian,
        ]);
        const confusionMatrixOutputLineMacroQuantile3: any[] = [
            UtilityConfusionMatrix.ColumnNameMacroThirdQuartile,
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesPrecisions, 3) ?
                Utility.round(macroQuantileMetrics.quantilesPrecisions[3]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesRecalls, 3) ?
                Utility.round(macroQuantileMetrics.quantilesRecalls[3]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesF1Scores, 3) ?
                Utility.round(macroQuantileMetrics.quantilesF1Scores[3]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesAccuracies, 3) ?
                Utility.round(macroQuantileMetrics.quantilesAccuracies[3]) : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTruePositives, 3) ?
                macroQuantileMetrics.quantilesTruePositives[3] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalsePositives, 3) ?
                macroQuantileMetrics.quantilesFalsePositives[3] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTrueNegatives, 3) ?
                macroQuantileMetrics.quantilesTrueNegatives[3] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalseNegatives, 3) ?
                macroQuantileMetrics.quantilesFalseNegatives[3] : "N/A",
            Utility.canAccessNumberArray(macroQuantileMetrics.quantilesSupports, 3) ?
                macroQuantileMetrics.quantilesSupports[3] : "N/A",
            macroQuantileMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroQuantile3);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroThirdQuartile,
            UtilityConfusionMatrix.DescriptionMacroThirdQuartile,
        ]);
        // -----------------------------------------------------------------------
        const summationMicroAverageMetrics: IConfusionMatrixSummationMetrics =
            confusionMatrix.getSummationMicroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLineSummationMicroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNameSummationMicroAverage,
            Utility.round(summationMicroAverageMetrics.summationPrecision),
            Utility.round(summationMicroAverageMetrics.summationRecall),
            Utility.getBolded(Utility.round(summationMicroAverageMetrics.summationF1Score)),
            Utility.getBolded(Utility.round(summationMicroAverageMetrics.summationAccuracy)),
            Utility.round(summationMicroAverageMetrics.summationTruePositives),
            Utility.round(summationMicroAverageMetrics.summationFalsePositives),
            Utility.round(summationMicroAverageMetrics.summationTrueNegatives),
            Utility.round(summationMicroAverageMetrics.summationFalseNegatives),
            Utility.round(summationMicroAverageMetrics.summationSupport),
            "N/A", // ---- summationMicroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineSummationMicroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameSummationMicroAverage,
            UtilityConfusionMatrix.DescriptionSummationMicroAverage,
        ]);
        // -----------------------------------------------------------------------
        const macroAverageMetrics: IConfusionMatrixMeanMetrics =
            confusionMatrix.getMacroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLineMacroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNameMacroAverage,
            Utility.round(macroAverageMetrics.averagePrecision),
            Utility.round(macroAverageMetrics.averageRecall),
            Utility.getBolded(Utility.round(macroAverageMetrics.averageF1Score)),
            Utility.getBolded(Utility.round(macroAverageMetrics.averageAccuracy)),
            "N/A", // ---- Utility.round(macroAverageMetrics.averageTruePositives),
            "N/A", // ---- Utility.round(macroAverageMetrics.averageFalsePositives),
            "N/A", // ---- Utility.round(macroAverageMetrics.averageTrueNegatives),
            "N/A", // ---- Utility.round(macroAverageMetrics.averageFalseNegatives),
            "N/A", // ---- Utility.round(macroAverageMetrics.averageSupport),
            "N/A", // ---- macroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroAverage,
            UtilityConfusionMatrix.DescriptionMacroAverage,
        ]);
        // -----------------------------------------------------------------------
        const summationMacroAverageMetrics: IConfusionMatrixMeanMetrics =
            confusionMatrix.getSummationMacroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLineSummationMacroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNameSummationMacroAverage,
            Utility.round(summationMacroAverageMetrics.averagePrecision),
            Utility.round(summationMacroAverageMetrics.averageRecall),
            Utility.round(summationMacroAverageMetrics.averageF1Score),
            Utility.round(summationMacroAverageMetrics.averageAccuracy),
            Utility.round(summationMacroAverageMetrics.averageTruePositives),
            Utility.round(summationMacroAverageMetrics.averageFalsePositives),
            Utility.round(summationMacroAverageMetrics.averageTrueNegatives),
            Utility.round(summationMacroAverageMetrics.averageFalseNegatives),
            Utility.round(summationMacroAverageMetrics.averageSupport),
            "N/A", // ---- summationMacroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineSummationMacroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameSummationMacroAverage,
            UtilityConfusionMatrix.DescriptionSummationMacroAverage,
        ]);
        // -----------------------------------------------------------------------
        const positiveSupportLabelMacroAverageMetrics: IConfusionMatrixMeanMetrics =
            confusionMatrix.getPositiveSupportLabelMacroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLinePositiveSupportLabelMacroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNamePositiveSupportMacroAverage,
            Utility.round(positiveSupportLabelMacroAverageMetrics.averagePrecision),
            Utility.round(positiveSupportLabelMacroAverageMetrics.averageRecall),
            Utility.round(positiveSupportLabelMacroAverageMetrics.averageF1Score),
            Utility.round(positiveSupportLabelMacroAverageMetrics.averageAccuracy),
            "N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageTruePositives),
            "N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageFalsePositives),
            "N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageTrueNegatives),
            "N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageFalseNegatives),
            "N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageSupport),
            "N/A", // ---- positiveSupportLabelMacroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(
            confusionMatrixOutputLinePositiveSupportLabelMacroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNamePositiveSupportMacroAverage,
            UtilityConfusionMatrix.DescriptionPositiveSupportMacroAverage,
        ]);
        // -----------------------------------------------------------------------
        const positiveSupportLabelSummationMacroAverageMetrics: IConfusionMatrixMeanMetrics =
            confusionMatrix.getPositiveSupportLabelSummationMacroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLinePositiveSupportLabelSummationMacroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNamePositiveSupportSummationMacroAverage,
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averagePrecision),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageRecall),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageF1Score),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageAccuracy),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageTruePositives),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageFalsePositives),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageTrueNegatives),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageFalseNegatives),
            Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageSupport),
            "N/A", // ---- positiveSupportLabelSummationMacroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(
            confusionMatrixOutputLinePositiveSupportLabelSummationMacroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNamePositiveSupportSummationMacroAverage,
            UtilityConfusionMatrix.DescriptionPositiveSupportSummationMacroAverage,
        ]);
        // -----------------------------------------------------------------------
        const weightedMacroAverageMetrics: IConfusionMatrixMeanDerivedMetrics =
            confusionMatrix.getWeightedMacroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLineWeightedMacroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNameWeightedMacroAverage,
            Utility.round(weightedMacroAverageMetrics.averagePrecision),
            Utility.round(weightedMacroAverageMetrics.averageRecall),
            Utility.round(weightedMacroAverageMetrics.averageF1Score),
            Utility.round(weightedMacroAverageMetrics.averageAccuracy),
            "N/A",
            "N/A",
            "N/A",
            "N/A",
            "N/A",
            "N/A", // ---- weightedMacroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(
            confusionMatrixOutputLineWeightedMacroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameWeightedMacroAverage,
            UtilityConfusionMatrix.DescriptionWeightedMacroAverage,
        ]);
        // -----------------------------------------------------------------------
        const summationWeightedMacroAverageMetrics: IConfusionMatrixMeanMetrics =
            confusionMatrix.getSummationWeightedMacroAverageMetrics(binaryConfusionMatrices);
        const confusionMatrixOutputLineSummationWeightedMacroAverage: any[] = [
            UtilityConfusionMatrix.ColumnNameWeightedSummationMacroAverage,
            Utility.round(summationWeightedMacroAverageMetrics.averagePrecision),
            Utility.round(summationWeightedMacroAverageMetrics.averageRecall),
            Utility.round(summationWeightedMacroAverageMetrics.averageF1Score),
            Utility.round(summationWeightedMacroAverageMetrics.averageAccuracy),
            Utility.round(summationWeightedMacroAverageMetrics.averageTruePositives),
            Utility.round(summationWeightedMacroAverageMetrics.averageFalsePositives),
            Utility.round(summationWeightedMacroAverageMetrics.averageTrueNegatives),
            Utility.round(summationWeightedMacroAverageMetrics.averageFalseNegatives),
            Utility.round(summationWeightedMacroAverageMetrics.averageSupport),
            "N/A", // ---- summationWeightedMacroAverageMetrics.total,
        ];
        confusionMatrixAverageOutputLines.push(
            confusionMatrixOutputLineSummationWeightedMacroAverage);
        confusionMatrixAverageDescriptionOutputLines.push([
            columnNamePreffix + UtilityConfusionMatrix.ColumnNameWeightedSummationMacroAverage,
            UtilityConfusionMatrix.DescriptionWeightedSummationMacroAverage,
        ]);
        // -----------------------------------------------------------------------
        Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), confusionMatrix.getMicroAverageMetrics()=        ${Utility.jsonStringify(confusionMatrix.getMicroAverageMetrics(binaryConfusionMatrices))}`);
        Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), confusionMatrix.getMacroAverageMetrics()=        ${Utility.jsonStringify(confusionMatrix.getMacroAverageMetrics(binaryConfusionMatrices))}`);
        Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), confusionMatrix.getWeightedMacroAverageMetrics()=${Utility.jsonStringify(confusionMatrix.getWeightedMacroAverageMetrics(binaryConfusionMatrices))}`);
        // -----------------------------------------------------------------------
        const confusionMatrixAverageMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
            "Average confusion matrix metrics",
            confusionMatrixAverageOutputLines,
            ["Type", "Precision", "Recall", "F1", "Accuracy", "#TruePositives", "#FalsePositives", "#TrueNegatives", "#FalseNegatives", "Support", "Total"]);
        const confusionMatrixAverageDescriptionMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
            "Average confusion matrix metric descriptions",
            confusionMatrixAverageDescriptionOutputLines,
            ["Type", "Description"]);
        // -----------------------------------------------------------------------
        return {
            binaryConfusionMatrices,
            confusionMatrixOutputLines,
            confusionMatrixMetricsHtml,
            confusionMatrixAverageOutputLines,
            confusionMatrixAverageMetricsHtml,
            confusionMatrixAverageDescriptionOutputLines,
            confusionMatrixAverageDescriptionMetricsHtml,
        };
        // -----------------------------------------------------------------------
    }