deepbox 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +344 -0
- package/dist/CSRMatrix-CwGwQRea.d.cts +219 -0
- package/dist/CSRMatrix-KzNt6QpS.d.ts +219 -0
- package/dist/Tensor-BQLk1ltW.d.cts +147 -0
- package/dist/Tensor-g8mUClel.d.ts +147 -0
- package/dist/chunk-4S73VUBD.js +677 -0
- package/dist/chunk-4S73VUBD.js.map +1 -0
- package/dist/chunk-5R4S63PF.js +2925 -0
- package/dist/chunk-5R4S63PF.js.map +1 -0
- package/dist/chunk-6AE5FKKQ.cjs +9264 -0
- package/dist/chunk-6AE5FKKQ.cjs.map +1 -0
- package/dist/chunk-AD436M45.js +3854 -0
- package/dist/chunk-AD436M45.js.map +1 -0
- package/dist/chunk-ALS7ETWZ.cjs +4263 -0
- package/dist/chunk-ALS7ETWZ.cjs.map +1 -0
- package/dist/chunk-AU7XHGKJ.js +2092 -0
- package/dist/chunk-AU7XHGKJ.js.map +1 -0
- package/dist/chunk-B5TNKUEY.js +1481 -0
- package/dist/chunk-B5TNKUEY.js.map +1 -0
- package/dist/chunk-BCR7G3A6.js +9136 -0
- package/dist/chunk-BCR7G3A6.js.map +1 -0
- package/dist/chunk-C4PKXY74.cjs +1917 -0
- package/dist/chunk-C4PKXY74.cjs.map +1 -0
- package/dist/chunk-DWZY6PIP.cjs +6400 -0
- package/dist/chunk-DWZY6PIP.cjs.map +1 -0
- package/dist/chunk-E3EU5FZO.cjs +2113 -0
- package/dist/chunk-E3EU5FZO.cjs.map +1 -0
- package/dist/chunk-F3JWBINJ.js +1054 -0
- package/dist/chunk-F3JWBINJ.js.map +1 -0
- package/dist/chunk-FJYLIGJX.js +1940 -0
- package/dist/chunk-FJYLIGJX.js.map +1 -0
- package/dist/chunk-JSCDE774.cjs +729 -0
- package/dist/chunk-JSCDE774.cjs.map +1 -0
- package/dist/chunk-LWECRCW2.cjs +2412 -0
- package/dist/chunk-LWECRCW2.cjs.map +1 -0
- package/dist/chunk-MLBMYKCG.js +6379 -0
- package/dist/chunk-MLBMYKCG.js.map +1 -0
- package/dist/chunk-OX6QXFMV.cjs +3874 -0
- package/dist/chunk-OX6QXFMV.cjs.map +1 -0
- package/dist/chunk-PHV2DKRS.cjs +1072 -0
- package/dist/chunk-PHV2DKRS.cjs.map +1 -0
- package/dist/chunk-PL7TAYKI.js +4056 -0
- package/dist/chunk-PL7TAYKI.js.map +1 -0
- package/dist/chunk-PR647I7R.js +1898 -0
- package/dist/chunk-PR647I7R.js.map +1 -0
- package/dist/chunk-QERHVCHC.cjs +2960 -0
- package/dist/chunk-QERHVCHC.cjs.map +1 -0
- package/dist/chunk-XEG44RF6.cjs +1514 -0
- package/dist/chunk-XEG44RF6.cjs.map +1 -0
- package/dist/chunk-XMWVME2W.js +2377 -0
- package/dist/chunk-XMWVME2W.js.map +1 -0
- package/dist/chunk-ZB75FESB.cjs +1979 -0
- package/dist/chunk-ZB75FESB.cjs.map +1 -0
- package/dist/chunk-ZLW62TJG.cjs +4061 -0
- package/dist/chunk-ZLW62TJG.cjs.map +1 -0
- package/dist/chunk-ZXKBDFP3.js +4235 -0
- package/dist/chunk-ZXKBDFP3.js.map +1 -0
- package/dist/core/index.cjs +204 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +2 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/dataframe/index.cjs +22 -0
- package/dist/dataframe/index.cjs.map +1 -0
- package/dist/dataframe/index.d.cts +3 -0
- package/dist/dataframe/index.d.ts +3 -0
- package/dist/dataframe/index.js +5 -0
- package/dist/dataframe/index.js.map +1 -0
- package/dist/datasets/index.cjs +134 -0
- package/dist/datasets/index.cjs.map +1 -0
- package/dist/datasets/index.d.cts +3 -0
- package/dist/datasets/index.d.ts +3 -0
- package/dist/datasets/index.js +5 -0
- package/dist/datasets/index.js.map +1 -0
- package/dist/index-74AB8Cyh.d.cts +1126 -0
- package/dist/index-9oQx1HgV.d.cts +1180 -0
- package/dist/index-BJY2SI4i.d.ts +483 -0
- package/dist/index-BWGhrDlr.d.ts +733 -0
- package/dist/index-B_DK4FKY.d.cts +242 -0
- package/dist/index-BbA2Gxfl.d.ts +456 -0
- package/dist/index-BgHYAoSS.d.cts +837 -0
- package/dist/index-BndMbqsM.d.ts +1439 -0
- package/dist/index-C1mfVYoo.d.ts +2517 -0
- package/dist/index-CCvlwAmL.d.cts +809 -0
- package/dist/index-CDw5CnOU.d.ts +785 -0
- package/dist/index-Cn3SdB0O.d.ts +1126 -0
- package/dist/index-CrqLlS-a.d.ts +776 -0
- package/dist/index-D61yaSMY.d.cts +483 -0
- package/dist/index-D9Loo1_A.d.cts +2517 -0
- package/dist/index-DIT_OO9C.d.cts +785 -0
- package/dist/index-DIp_RrRt.d.ts +242 -0
- package/dist/index-DbultU6X.d.cts +1427 -0
- package/dist/index-DmEg_LCm.d.cts +776 -0
- package/dist/index-DoPWVxPo.d.cts +1439 -0
- package/dist/index-DuCxd-8d.d.ts +837 -0
- package/dist/index-Dx42TZaY.d.ts +809 -0
- package/dist/index-DyZ4QQf5.d.cts +456 -0
- package/dist/index-GFAVyOWO.d.ts +1427 -0
- package/dist/index-WHQLn0e8.d.cts +733 -0
- package/dist/index-ZtI1Iy4L.d.ts +1180 -0
- package/dist/index-eJgeni9c.d.cts +1911 -0
- package/dist/index-tk4lSYod.d.ts +1911 -0
- package/dist/index.cjs +72 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/linalg/index.cjs +86 -0
- package/dist/linalg/index.cjs.map +1 -0
- package/dist/linalg/index.d.cts +3 -0
- package/dist/linalg/index.d.ts +3 -0
- package/dist/linalg/index.js +5 -0
- package/dist/linalg/index.js.map +1 -0
- package/dist/metrics/index.cjs +158 -0
- package/dist/metrics/index.cjs.map +1 -0
- package/dist/metrics/index.d.cts +3 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.js +5 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/ml/index.cjs +87 -0
- package/dist/ml/index.cjs.map +1 -0
- package/dist/ml/index.d.cts +3 -0
- package/dist/ml/index.d.ts +3 -0
- package/dist/ml/index.js +6 -0
- package/dist/ml/index.js.map +1 -0
- package/dist/ndarray/index.cjs +501 -0
- package/dist/ndarray/index.cjs.map +1 -0
- package/dist/ndarray/index.d.cts +5 -0
- package/dist/ndarray/index.d.ts +5 -0
- package/dist/ndarray/index.js +4 -0
- package/dist/ndarray/index.js.map +1 -0
- package/dist/nn/index.cjs +142 -0
- package/dist/nn/index.cjs.map +1 -0
- package/dist/nn/index.d.cts +6 -0
- package/dist/nn/index.d.ts +6 -0
- package/dist/nn/index.js +5 -0
- package/dist/nn/index.js.map +1 -0
- package/dist/optim/index.cjs +77 -0
- package/dist/optim/index.cjs.map +1 -0
- package/dist/optim/index.d.cts +4 -0
- package/dist/optim/index.d.ts +4 -0
- package/dist/optim/index.js +4 -0
- package/dist/optim/index.js.map +1 -0
- package/dist/plot/index.cjs +114 -0
- package/dist/plot/index.cjs.map +1 -0
- package/dist/plot/index.d.cts +6 -0
- package/dist/plot/index.d.ts +6 -0
- package/dist/plot/index.js +5 -0
- package/dist/plot/index.js.map +1 -0
- package/dist/preprocess/index.cjs +82 -0
- package/dist/preprocess/index.cjs.map +1 -0
- package/dist/preprocess/index.d.cts +4 -0
- package/dist/preprocess/index.d.ts +4 -0
- package/dist/preprocess/index.js +5 -0
- package/dist/preprocess/index.js.map +1 -0
- package/dist/random/index.cjs +74 -0
- package/dist/random/index.cjs.map +1 -0
- package/dist/random/index.d.cts +3 -0
- package/dist/random/index.d.ts +3 -0
- package/dist/random/index.js +5 -0
- package/dist/random/index.js.map +1 -0
- package/dist/stats/index.cjs +142 -0
- package/dist/stats/index.cjs.map +1 -0
- package/dist/stats/index.d.cts +3 -0
- package/dist/stats/index.d.ts +3 -0
- package/dist/stats/index.js +5 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/tensor-B96jjJLQ.d.cts +205 -0
- package/dist/tensor-B96jjJLQ.d.ts +205 -0
- package/package.json +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/metrics/index.ts","../src/metrics/_internal.ts","../src/metrics/classification.ts","../src/metrics/clustering.ts","../src/metrics/regression.ts"],"names":["recall","precision","contingency"],"mappings":"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","file":"chunk-FJYLIGJX.js","sourcesContent":["export {\n accuracy,\n averagePrecisionScore,\n balancedAccuracyScore,\n classificationReport,\n cohenKappaScore,\n confusionMatrix,\n f1Score,\n fbetaScore,\n hammingLoss,\n jaccardScore,\n logLoss,\n matthewsCorrcoef,\n precision,\n precisionRecallCurve,\n recall,\n rocAucScore,\n rocCurve,\n} from \"./classification\";\nexport {\n adjustedMutualInfoScore,\n adjustedRandScore,\n calinskiHarabaszScore,\n completenessScore,\n daviesBouldinScore,\n fowlkesMallowsScore,\n homogeneityScore,\n normalizedMutualInfoScore,\n silhouetteSamples,\n silhouetteScore,\n vMeasureScore,\n} from \"./clustering\";\nexport {\n adjustedR2Score,\n explainedVarianceScore,\n mae,\n mape,\n maxError,\n medianAbsoluteError,\n mse,\n r2Score,\n rmse,\n} from \"./regression\";\n","/**\n * Shared internal helpers for the metrics module.\n *\n * These functions are used across classification, regression, and clustering metrics\n * to handle strided tensor access and input validation.\n *\n * @internal\n */\n\nimport { DataValidationError, ShapeError } from \"../core/errors\";\nimport type { Tensor } from \"../ndarray\";\n\n/**\n * Converts a flat (logical) index to a physical buffer offset.\n *\n * @internal\n */\nexport type FlatOffsetter = (flatIndex: number) => number;\n\n/**\n * Compute row-major logical strides from a tensor shape.\n *\n * @internal\n */\nexport function computeLogicalStrides(shape: readonly number[]): number[] {\n const strides = new Array<number>(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n const dim = shape[i];\n if (dim === undefined) {\n throw new ShapeError(\"Tensor shape must be fully defined\");\n }\n strides[i] = stride;\n stride *= dim;\n }\n return strides;\n}\n\n/**\n * Build a function that maps flat (logical) indices to physical buffer offsets.\n *\n * Handles arbitrary strides (views, slices, transposes).\n *\n * @internal\n */\nexport function createFlatOffsetter(t: Tensor): FlatOffsetter {\n const base = t.offset;\n\n if (t.ndim <= 1) {\n const stride0 = t.strides[0] ?? 1;\n return (flatIndex: number) => base + flatIndex * stride0;\n }\n\n const logicalStrides = computeLogicalStrides(t.shape);\n const strides = t.strides;\n\n return (flatIndex: number) => {\n let rem = flatIndex;\n let offset = base;\n\n for (let axis = 0; axis < logicalStrides.length; axis++) {\n const axisLogicalStride = logicalStrides[axis] ?? 1;\n const coord = Math.floor(rem / axisLogicalStride);\n rem -= coord * axisLogicalStride;\n offset += coord * (strides[axis] ?? 0);\n }\n\n return offset;\n };\n}\n\n/**\n * Assert that a numeric value is finite.\n *\n * @param value - The value to check\n * @param name - Name of the tensor for error messages\n * @param detail - Additional detail for the error message (e.g., \"index 5\")\n *\n * @internal\n */\nexport function assertFiniteNumber(value: number, name: string, detail: string): void {\n if (!Number.isFinite(value)) {\n throw new DataValidationError(\n `${name} must contain only finite numbers; found ${String(value)} at ${detail}`\n );\n }\n}\n\n/**\n * Assert that a tensor is 1D or a column vector.\n *\n * @internal\n */\nexport function assertVectorLike(t: Tensor, name: string): void {\n if (t.ndim <= 1) return;\n if (t.ndim === 2 && (t.shape[1] ?? 0) === 1) return;\n throw new ShapeError(`${name} must be 1D or a column vector`);\n}\n\n/**\n * Assert that two tensors have the same size and are vector-like.\n *\n * @internal\n */\nexport function assertSameSizeVectors(a: Tensor, b: Tensor, nameA: string, nameB: string): void {\n if (a.size !== b.size) {\n throw new ShapeError(\n `${nameA} (size ${a.size}) and ${nameB} (size ${b.size}) must have same size`\n );\n }\n assertVectorLike(a, nameA);\n assertVectorLike(b, nameB);\n}\n\n/**\n * Assert that two tensors have the same size (without vector-like check).\n *\n * @internal\n */\nexport function assertSameSize(a: Tensor, b: Tensor, nameA: string, nameB: string): void {\n if (a.size !== b.size) {\n throw new ShapeError(\n `${nameA} (size ${a.size}) and ${nameB} (size ${b.size}) must have same size`\n );\n }\n}\n","import {\n getBigIntElement,\n getNumericElement,\n getStringElement,\n isNumericTypedArray,\n isTypedArray,\n type NumericTypedArray,\n} from \"../core\";\nimport { DTypeError, InvalidParameterError } from \"../core/errors\";\nimport { type Tensor, tensor } from \"../ndarray\";\nimport {\n assertFiniteNumber,\n assertSameSizeVectors,\n createFlatOffsetter,\n type FlatOffsetter,\n} from \"./_internal\";\n\nfunction getNumericLabelData(t: Tensor): NumericTypedArray {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"metrics do not support string labels\");\n }\n if (t.dtype === \"int64\") {\n throw new DTypeError(\"metrics do not support int64 tensors\");\n }\n\n const data = t.data;\n if (!isTypedArray(data) || !isNumericTypedArray(data)) {\n throw new DTypeError(\"metrics require numeric tensors\");\n }\n return data;\n}\n\nfunction readNumericLabel(\n data: NumericTypedArray,\n offsetter: FlatOffsetter,\n index: number,\n name: string\n) {\n const value = getNumericElement(data, offsetter(index));\n assertFiniteNumber(value, name, `index ${index}`);\n return value;\n}\n\nfunction ensureBinaryValue(value: number, name: string, index: number): void {\n if (value !== 0 && value !== 1) {\n throw new InvalidParameterError(\n `${name} must contain only binary values (0 or 1); found ${String(value)} at index ${index}`,\n name,\n value\n );\n }\n}\n\nfunction assertBinaryLabels(yTrue: Tensor, yPred: Tensor): void {\n if (yTrue.dtype === \"string\" || yPred.dtype === \"string\") {\n throw new InvalidParameterError(\n \"classificationReport requires binary numeric labels (0 or 1)\",\n \"yTrue\"\n );\n }\n\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n ensureBinaryValue(trueVal, \"yTrue\", i);\n ensureBinaryValue(predVal, \"yPred\", i);\n }\n}\n\ntype LabelKind = \"string\" | \"int64\" | \"numeric\";\n\nfunction assertComparableLabelTypes(yTrue: Tensor, yPred: Tensor): LabelKind {\n const trueKind =\n yTrue.dtype === \"string\" ? \"string\" : yTrue.dtype === \"int64\" ? \"int64\" : \"numeric\";\n const predKind =\n yPred.dtype === \"string\" ? \"string\" : yPred.dtype === \"int64\" ? \"int64\" : \"numeric\";\n\n if (trueKind !== predKind) {\n throw new DTypeError(\"yTrue and yPred must use compatible label types\");\n }\n\n return trueKind;\n}\n\nfunction readComparableLabel(t: Tensor, offsetter: FlatOffsetter, index: number, name: string) {\n const offset = offsetter(index);\n const data = t.data;\n\n if (Array.isArray(data)) {\n return getStringElement(data, offset);\n }\n\n if (data instanceof BigInt64Array) {\n return getBigIntElement(data, offset);\n }\n\n if (!isTypedArray(data) || !isNumericTypedArray(data)) {\n throw new DTypeError(`${name} must be numeric or string labels`);\n }\n\n const value = getNumericElement(data, offset);\n assertFiniteNumber(value, name, `index ${index}`);\n return value;\n}\n\ntype ClassStats = {\n tp: number;\n fp: number;\n fn: number;\n support: number;\n};\n\nfunction buildClassStats(yTrue: Tensor, yPred: Tensor) {\n assertComparableLabelTypes(yTrue, yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n const stats = new Map<number | string | bigint, ClassStats>();\n let totalTp = 0;\n let totalFp = 0;\n let totalFn = 0;\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readComparableLabel(yTrue, trueOffset, i, \"yTrue\");\n const predVal = readComparableLabel(yPred, predOffset, i, \"yPred\");\n\n let trueStats = stats.get(trueVal);\n if (!trueStats) {\n trueStats = { tp: 0, fp: 0, fn: 0, support: 0 };\n stats.set(trueVal, trueStats);\n }\n\n let predStats = stats.get(predVal);\n if (!predStats) {\n predStats = { tp: 0, fp: 0, fn: 0, support: 0 };\n stats.set(predVal, predStats);\n }\n\n trueStats.support += 1;\n\n if (trueVal === predVal) {\n trueStats.tp += 1;\n totalTp += 1;\n } else {\n predStats.fp += 1;\n trueStats.fn += 1;\n totalFp += 1;\n totalFn += 1;\n }\n }\n\n const classes = Array.from(stats.keys()).sort((a, b) => {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"string\" && typeof b === \"string\") return a.localeCompare(b);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") return a === b ? 0 : a < b ? -1 : 1;\n return String(a).localeCompare(String(b));\n });\n return { classes, stats, totalTp, totalFp, totalFn };\n}\n\n/**\n * Calculates the accuracy classification score.\n *\n * Accuracy is the fraction of predictions that match the true labels.\n * It's the most intuitive performance measure but can be misleading\n * for imbalanced datasets.\n *\n * **Formula**: accuracy = (correct predictions) / (total predictions)\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated targets as returned by a classifier\n * @returns Accuracy score in range [0, 1], where 1 is perfect accuracy\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue and yPred use incompatible label types\n * @throws {DataValidationError} If numeric labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { accuracy, tensor } from 'deepbox/core';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const acc = accuracy(yTrue, yPred); // 0.8 (4 out of 5 correct)\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html | Scikit-learn accuracy_score}\n */\nexport function accuracy(yTrue: Tensor, yPred: Tensor): number {\n // Validate input tensors have same size\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n // Handle empty input - return 0 for undefined accuracy\n if (yTrue.size === 0) return 0;\n\n assertComparableLabelTypes(yTrue, yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n // Count correct predictions\n let correct = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readComparableLabel(yTrue, trueOffset, i, \"yTrue\");\n const predVal = readComparableLabel(yPred, predOffset, i, \"yPred\");\n if (trueVal === predVal) {\n correct++;\n }\n }\n\n // Return fraction of correct predictions\n return correct / yTrue.size;\n}\n\n/**\n * Calculates the precision classification score.\n *\n * Precision is the ratio of true positives to all positive predictions.\n * It answers: \"Of all samples predicted as positive, how many are actually positive?\"\n * High precision means low false positive rate.\n *\n * **Formula**: precision = TP / (TP + FP)\n *\n * **Time Complexity**: O(n) for binary, O(n*k) for multiclass where k is number of classes\n * **Space Complexity**: O(k) for multiclass\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated targets as returned by a classifier\n * @param average - Averaging strategy: 'binary', 'micro', 'macro', 'weighted', or null\n * - 'binary': Calculate metrics for positive class only (default)\n * - 'micro': Calculate metrics globally by counting total TP, FP, FN\n * - 'macro': Calculate metrics for each class, return unweighted mean\n * - 'weighted': Calculate metrics for each class, return weighted mean by support\n * - null: Return array of scores for each class\n * @returns Precision score(s) in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n * @throws {InvalidParameterError} If average is invalid or binary labels are not in {0,1}\n *\n * @example\n * ```ts\n * import { precision, tensor } from 'deepbox/core';\n *\n * // Binary classification\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const prec = precision(yTrue, yPred); // 1.0 (2 TP, 0 FP)\n *\n * // Multiclass\n * const yTrueMulti = tensor([0, 1, 2, 0, 1, 2]);\n * const yPredMulti = tensor([0, 2, 1, 0, 0, 1]);\n * const precMacro = precision(yTrueMulti, yPredMulti, 'macro');\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html | Scikit-learn precision_score}\n */\nexport function precision(yTrue: Tensor, yPred: Tensor): number;\nexport function precision(\n yTrue: Tensor,\n yPred: Tensor,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\"\n): number;\nexport function precision(yTrue: Tensor, yPred: Tensor, average: null): number[];\nexport function precision(\n yTrue: Tensor,\n yPred: Tensor,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\" | null = \"binary\"\n): number | number[] {\n // Validate input tensors have same size\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n // Handle empty input\n if (yTrue.size === 0) return average === null ? [] : 0;\n\n // Binary classification (assumes positive class is 1)\n if (average === \"binary\") {\n if (yTrue.dtype === \"string\" || yPred.dtype === \"string\") {\n throw new InvalidParameterError(\n \"Binary average requires numeric labels (0/1). Use 'macro', 'micro', or 'weighted' for string labels.\"\n );\n }\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let tp = 0;\n let fp = 0;\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n ensureBinaryValue(trueVal, \"yTrue\", i);\n ensureBinaryValue(predVal, \"yPred\", i);\n\n if (predVal === 1) {\n if (trueVal === 1) {\n tp++;\n } else {\n fp++;\n }\n }\n }\n\n return tp + fp === 0 ? 0 : tp / (tp + fp);\n }\n\n const { classes, stats, totalTp, totalFp } = buildClassStats(yTrue, yPred);\n\n const precisions: number[] = [];\n const supports: number[] = [];\n for (const cls of classes) {\n const classStats = stats.get(cls);\n const tp = classStats?.tp ?? 0;\n const fp = classStats?.fp ?? 0;\n const support = classStats?.support ?? 0;\n precisions.push(tp + fp === 0 ? 0 : tp / (tp + fp));\n supports.push(support);\n }\n\n if (average === null) {\n return precisions;\n }\n\n if (average === \"micro\") {\n return totalTp + totalFp === 0 ? 0 : totalTp / (totalTp + totalFp);\n }\n\n if (average === \"macro\") {\n const sum = precisions.reduce((acc, val) => acc + val, 0);\n return precisions.length === 0 ? 0 : sum / precisions.length;\n }\n\n if (average === \"weighted\") {\n let weightedSum = 0;\n let totalSupport = 0;\n\n for (let i = 0; i < precisions.length; i++) {\n weightedSum += (precisions[i] ?? 0) * (supports[i] ?? 0);\n totalSupport += supports[i] ?? 0;\n }\n\n return totalSupport === 0 ? 0 : weightedSum / totalSupport;\n }\n\n throw new InvalidParameterError(\n `Invalid average parameter: ${average}. Must be one of: 'binary', 'micro', 'macro', 'weighted', or null`,\n \"average\",\n average\n );\n}\n\n/**\n * Calculates the recall classification score (sensitivity, true positive rate).\n *\n * Recall is the ratio of true positives to all actual positive samples.\n * It answers: \"Of all actual positive samples, how many did we correctly identify?\"\n * High recall means low false negative rate.\n *\n * **Formula**: recall = TP / (TP + FN)\n *\n * **Time Complexity**: O(n) for binary, O(n*k) for multiclass where k is number of classes\n * **Space Complexity**: O(k) for multiclass\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated targets as returned by a classifier\n * @param average - Averaging strategy: 'binary', 'micro', 'macro', 'weighted', or null\n * @returns Recall score(s) in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n * @throws {InvalidParameterError} If average is invalid or binary labels are not in {0,1}\n *\n * @example\n * ```ts\n * import { recall, tensor } from 'deepbox/core';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const rec = recall(yTrue, yPred); // 0.667 (2 out of 3 positives found)\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html | Scikit-learn recall_score}\n */\nexport function recall(yTrue: Tensor, yPred: Tensor): number;\nexport function recall(\n yTrue: Tensor,\n yPred: Tensor,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\"\n): number;\nexport function recall(yTrue: Tensor, yPred: Tensor, average: null): number[];\nexport function recall(\n yTrue: Tensor,\n yPred: Tensor,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\" | null = \"binary\"\n): number | number[] {\n // Validate input tensors have same size\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n // Handle empty input\n if (yTrue.size === 0) return average === null ? [] : 0;\n\n // Binary classification (assumes positive class is 1)\n if (average === \"binary\") {\n if (yTrue.dtype === \"string\" || yPred.dtype === \"string\") {\n throw new InvalidParameterError(\n \"Binary average requires numeric labels (0/1). Use 'macro', 'micro', or 'weighted' for string labels.\"\n );\n }\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let tp = 0;\n let fn = 0;\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n ensureBinaryValue(trueVal, \"yTrue\", i);\n ensureBinaryValue(predVal, \"yPred\", i);\n\n if (trueVal === 1) {\n if (predVal === 1) {\n tp++;\n } else {\n fn++;\n }\n }\n }\n\n return tp + fn === 0 ? 0 : tp / (tp + fn);\n }\n\n const { classes, stats, totalTp, totalFn } = buildClassStats(yTrue, yPred);\n\n const recalls: number[] = [];\n const supports: number[] = [];\n for (const cls of classes) {\n const classStats = stats.get(cls);\n const tp = classStats?.tp ?? 0;\n const fn = classStats?.fn ?? 0;\n const support = classStats?.support ?? 0;\n recalls.push(tp + fn === 0 ? 0 : tp / (tp + fn));\n supports.push(support);\n }\n\n if (average === null) {\n return recalls;\n }\n\n if (average === \"micro\") {\n return totalTp + totalFn === 0 ? 0 : totalTp / (totalTp + totalFn);\n }\n\n if (average === \"macro\") {\n const sum = recalls.reduce((acc, val) => acc + val, 0);\n return recalls.length === 0 ? 0 : sum / recalls.length;\n }\n\n if (average === \"weighted\") {\n let weightedSum = 0;\n let totalSupport = 0;\n\n for (let i = 0; i < recalls.length; i++) {\n weightedSum += (recalls[i] ?? 0) * (supports[i] ?? 0);\n totalSupport += supports[i] ?? 0;\n }\n\n return totalSupport === 0 ? 0 : weightedSum / totalSupport;\n }\n\n throw new InvalidParameterError(\n `Invalid average parameter: ${average}. Must be one of: 'binary', 'micro', 'macro', 'weighted', or null`,\n \"average\",\n average\n );\n}\n\n/**\n * Calculates the F1 score (harmonic mean of precision and recall).\n *\n * F1 score is the harmonic mean of precision and recall, providing a single\n * metric that balances both concerns. It's especially useful when you need\n * to balance false positives and false negatives.\n *\n * **Formula**: F1 = 2 * (precision * recall) / (precision + recall)\n *\n * **Time Complexity**: O(n) for binary, O(n*k) for multiclass\n * **Space Complexity**: O(k) for multiclass\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated targets as returned by a classifier\n * @param average - Averaging strategy: 'binary', 'micro', 'macro', 'weighted', or null\n * @returns F1 score(s) in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n * @throws {InvalidParameterError} If average is invalid or binary labels are not in {0,1}\n *\n * @example\n * ```ts\n * import { f1Score, tensor } from 'deepbox/core';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const f1 = f1Score(yTrue, yPred); // 0.8\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html | Scikit-learn f1_score}\n */\nexport function f1Score(yTrue: Tensor, yPred: Tensor): number;\nexport function f1Score(\n yTrue: Tensor,\n yPred: Tensor,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\"\n): number;\nexport function f1Score(yTrue: Tensor, yPred: Tensor, average: null): number[];\nexport function f1Score(\n yTrue: Tensor,\n yPred: Tensor,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\" | null = \"binary\"\n): number | number[] {\n // For binary and micro, computing F1 from scalar P and R is correct.\n // For macro and weighted, we must compute per-class F1 first, then average,\n // because the harmonic mean is non-linear: avg(F1_i) ≠ F1(avg(P_i), avg(R_i)).\n if (average === \"binary\" || average === \"micro\") {\n const p = precision(yTrue, yPred, average);\n const r = recall(yTrue, yPred, average);\n return p + r === 0 ? 0 : (2 * p * r) / (p + r);\n }\n\n // Compute per-class precision and recall\n const prec = precision(yTrue, yPred, null);\n const rec = recall(yTrue, yPred, null);\n\n // Compute per-class F1 scores\n const f1Scores: number[] = [];\n for (let i = 0; i < prec.length; i++) {\n const p = prec[i] ?? 0;\n const r = rec[i] ?? 0;\n f1Scores.push(p + r === 0 ? 0 : (2 * p * r) / (p + r));\n }\n\n if (average === null) {\n return f1Scores;\n }\n\n if (f1Scores.length === 0) return 0;\n\n if (average === \"macro\") {\n const sum = f1Scores.reduce((acc, val) => acc + val, 0);\n return sum / f1Scores.length;\n }\n\n if (average === \"weighted\") {\n const { classes, stats } = buildClassStats(yTrue, yPred);\n let weightedSum = 0;\n let totalSupport = 0;\n for (let i = 0; i < f1Scores.length; i++) {\n const cls = classes[i];\n const support = cls !== undefined ? (stats.get(cls)?.support ?? 0) : 0;\n weightedSum += (f1Scores[i] ?? 0) * support;\n totalSupport += support;\n }\n return totalSupport === 0 ? 0 : weightedSum / totalSupport;\n }\n\n throw new InvalidParameterError(\n `Invalid average parameter: ${average}. Must be one of: 'binary', 'micro', 'macro', 'weighted', or null`,\n \"average\",\n average\n );\n}\n\n/**\n * Calculates the F-beta score.\n *\n * F-beta score is a weighted harmonic mean of precision and recall, where\n * beta controls the trade-off between precision and recall.\n * - beta < 1: More weight on precision\n * - beta = 1: Equal weight (equivalent to F1 score)\n * - beta > 1: More weight on recall\n *\n * **Formula**: F_beta = (1 + beta²) * (precision * recall) / (beta² * precision + recall)\n *\n * **Time Complexity**: O(n) for binary, O(n*k) for multiclass\n * **Space Complexity**: O(k) for multiclass\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated targets as returned by a classifier\n * @param beta - Weight of recall vs precision (beta > 1 favors recall, beta < 1 favors precision)\n * @param average - Averaging strategy: 'binary', 'micro', 'macro', 'weighted', or null\n * @returns F-beta score(s) in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { fbetaScore, tensor } from 'deepbox/core';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const fb2 = fbetaScore(yTrue, yPred, 2); // Favors recall\n * const fb05 = fbetaScore(yTrue, yPred, 0.5); // Favors precision\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.fbeta_score.html | Scikit-learn fbeta_score}\n */\nexport function fbetaScore(yTrue: Tensor, yPred: Tensor, beta: number): number;\nexport function fbetaScore(\n yTrue: Tensor,\n yPred: Tensor,\n beta: number,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\"\n): number;\nexport function fbetaScore(yTrue: Tensor, yPred: Tensor, beta: number, average: null): number[];\nexport function fbetaScore(\n yTrue: Tensor,\n yPred: Tensor,\n beta: number,\n average: \"binary\" | \"micro\" | \"macro\" | \"weighted\" | null = \"binary\"\n) {\n if (!Number.isFinite(beta) || beta <= 0) {\n throw new InvalidParameterError(\"beta must be a positive finite number\", \"beta\", beta);\n }\n\n const betaSq = beta * beta;\n\n // For binary and micro, computing fbeta from scalar P and R is correct.\n // For macro and weighted, we must compute per-class fbeta first, then average,\n // because the weighted harmonic mean is non-linear.\n if (average === \"binary\" || average === \"micro\") {\n const p = precision(yTrue, yPred, average);\n const r = recall(yTrue, yPred, average);\n return p + r === 0 ? 0 : ((1 + betaSq) * p * r) / (betaSq * p + r);\n }\n\n // Compute per-class precision and recall\n const prec = precision(yTrue, yPred, null);\n const rec = recall(yTrue, yPred, null);\n\n // Compute per-class fbeta scores\n const fbetaScores: number[] = [];\n for (let i = 0; i < prec.length; i++) {\n const p = prec[i] ?? 0;\n const r = rec[i] ?? 0;\n fbetaScores.push(p + r === 0 ? 0 : ((1 + betaSq) * p * r) / (betaSq * p + r));\n }\n\n if (average === null) {\n return fbetaScores;\n }\n\n if (fbetaScores.length === 0) return 0;\n\n if (average === \"macro\") {\n const sum = fbetaScores.reduce((acc, val) => acc + val, 0);\n return sum / fbetaScores.length;\n }\n\n if (average === \"weighted\") {\n const { classes, stats } = buildClassStats(yTrue, yPred);\n let weightedSum = 0;\n let totalSupport = 0;\n for (let i = 0; i < fbetaScores.length; i++) {\n const cls = classes[i];\n const support = cls !== undefined ? (stats.get(cls)?.support ?? 0) : 0;\n weightedSum += (fbetaScores[i] ?? 0) * support;\n totalSupport += support;\n }\n return totalSupport === 0 ? 0 : weightedSum / totalSupport;\n }\n\n throw new InvalidParameterError(\n `Invalid average parameter: ${average}. Must be one of: 'binary', 'micro', 'macro', 'weighted', or null`,\n \"average\",\n average\n );\n}\n\n/**\n * Computes the confusion matrix to evaluate classification accuracy.\n *\n * A confusion matrix is a table showing the counts of correct and incorrect\n * predictions broken down by each class. Rows represent true labels,\n * columns represent predicted labels.\n *\n * **Time Complexity**: O(n + k²) where n is number of samples, k is number of classes\n * **Space Complexity**: O(k²)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated targets as returned by a classifier\n * @returns Confusion matrix as a 2D tensor of shape [n_classes, n_classes]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { confusionMatrix, tensor } from 'deepbox/core';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const cm = confusionMatrix(yTrue, yPred);\n * // [[2, 0],\n * // [1, 2]]\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html | Scikit-learn confusion_matrix}\n */\nexport function confusionMatrix(yTrue: Tensor, yPred: Tensor): Tensor {\n // Validate input tensors have same size\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n assertComparableLabelTypes(yTrue, yPred);\n\n if (yTrue.size === 0) {\n return tensor([]).reshape([0, 0]);\n }\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n // Collect all unique labels from both true and predicted values\n const labelSet = new Set<number | string | bigint>();\n for (let i = 0; i < yTrue.size; i++) {\n labelSet.add(readComparableLabel(yTrue, trueOffset, i, \"yTrue\"));\n labelSet.add(readComparableLabel(yPred, predOffset, i, \"yPred\"));\n }\n\n // Sort labels for consistent ordering\n const labels = Array.from(labelSet).sort((a, b) => {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"string\" && typeof b === \"string\") return a.localeCompare(b);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") return a === b ? 0 : a < b ? -1 : 1;\n return String(a).localeCompare(String(b));\n });\n\n // Create mapping from label to matrix index\n const labelToIndex = new Map<number | string | bigint, number>();\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n if (label === undefined) continue;\n labelToIndex.set(label, i);\n }\n\n // Initialize confusion matrix with zeros\n const nClasses = labels.length;\n const matrix = Array.from({ length: nClasses }, () => new Array<number>(nClasses).fill(0));\n\n // Populate confusion matrix by counting predictions\n for (let i = 0; i < yTrue.size; i++) {\n const trueLabel = readComparableLabel(yTrue, trueOffset, i, \"yTrue\");\n const predLabel = readComparableLabel(yPred, predOffset, i, \"yPred\");\n\n // Get matrix indices for this true/pred label pair\n const r = labelToIndex.get(trueLabel);\n const c = labelToIndex.get(predLabel);\n if (r === undefined || c === undefined) continue;\n\n // Increment count at [true_label, pred_label]\n const row = matrix[r];\n if (row) row[c] = (row[c] ?? 0) + 1;\n }\n\n // Convert to tensor and return\n return tensor(matrix);\n}\n\n/**\n * Generates a text classification report showing main classification metrics.\n *\n * Provides a comprehensive summary including precision, recall, F1-score,\n * and accuracy for the classification task.\n *\n * **Time Complexity**: O(n * k) where n is the number of samples and k is the number of classes\n * **Space Complexity**: O(k) where k is the number of classes\n *\n * @param yTrue - Ground truth (correct) binary target values (0 or 1)\n * @param yPred - Estimated binary targets as returned by a classifier (0 or 1)\n * @returns Formatted string report with per-class and aggregate classification metrics\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or int64)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n * @throws {InvalidParameterError} If labels are not binary (0 or 1)\n *\n * @example\n * ```ts\n * import { classificationReport, tensor } from 'deepbox/core';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * console.log(classificationReport(yTrue, yPred));\n * // Classification Report:\n * // Precision: 1.0000\n * // Recall: 0.6667\n * // F1-Score: 0.8000\n * // Accuracy: 0.8000\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html | Scikit-learn classification_report}\n */\nexport function classificationReport(yTrue: Tensor, yPred: Tensor): string {\n // Validate input tensors have same size\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n // Handle empty input\n if (yTrue.size === 0) return \"Classification Report:\\n (empty)\";\n\n assertBinaryLabels(yTrue, yPred);\n\n // Calculate per-class metrics\n const { classes, stats } = buildClassStats(yTrue, yPred);\n const precs = precision(yTrue, yPred, null);\n const recs = recall(yTrue, yPred, null);\n const f1s = f1Score(yTrue, yPred, null);\n const acc = accuracy(yTrue, yPred);\n\n // Determine width for class names\n const maxClassLen = Math.max(...classes.map((c) => String(c).length), \"Class\".length);\n const colWidth = Math.max(12, maxClassLen + 2);\n\n // Header\n let report = \"Classification Report:\\n\";\n report +=\n \"Class\".padEnd(colWidth) +\n \"Precision\".padEnd(12) +\n \"Recall\".padEnd(12) +\n \"F1-Score\".padEnd(12) +\n \"Support\\n\";\n report += `${\"-\".repeat(colWidth + 36 + 7)}\\n`;\n\n let totalSupport = 0;\n let weightedPrec = 0;\n let weightedRec = 0;\n let weightedF1 = 0;\n let macroPrec = 0;\n let macroRec = 0;\n let macroF1 = 0;\n\n for (const [i, cls] of classes.entries()) {\n const p = precs[i] ?? 0;\n const r = recs[i] ?? 0;\n const f1 = f1s[i] ?? 0;\n const s = stats.get(cls)?.support ?? 0;\n\n totalSupport += s;\n weightedPrec += p * s;\n weightedRec += r * s;\n weightedF1 += f1 * s;\n macroPrec += p;\n macroRec += r;\n macroF1 += f1;\n\n report +=\n String(cls).padEnd(colWidth) +\n p.toFixed(4).padEnd(12) +\n r.toFixed(4).padEnd(12) +\n f1.toFixed(4).padEnd(12) +\n String(s) +\n \"\\n\";\n }\n\n report += \"\\n\";\n\n // Averages\n\n const nClasses = classes.length;\n if (nClasses > 0) {\n macroPrec /= nClasses;\n macroRec /= nClasses;\n macroF1 /= nClasses;\n } else {\n macroPrec = 0;\n macroRec = 0;\n macroF1 = 0;\n }\n\n weightedPrec = totalSupport === 0 ? 0 : weightedPrec / totalSupport;\n weightedRec = totalSupport === 0 ? 0 : weightedRec / totalSupport;\n weightedF1 = totalSupport === 0 ? 0 : weightedF1 / totalSupport;\n\n report +=\n \"Accuracy\".padEnd(colWidth) +\n \"\".padEnd(12) +\n \"\".padEnd(12) +\n acc.toFixed(4).padEnd(12) +\n String(totalSupport) +\n \"\\n\";\n report +=\n \"Macro Avg\".padEnd(colWidth) +\n macroPrec.toFixed(4).padEnd(12) +\n macroRec.toFixed(4).padEnd(12) +\n macroF1.toFixed(4).padEnd(12) +\n String(totalSupport) +\n \"\\n\";\n report +=\n \"Weighted Avg\".padEnd(colWidth) +\n weightedPrec.toFixed(4).padEnd(12) +\n weightedRec.toFixed(4).padEnd(12) +\n weightedF1.toFixed(4).padEnd(12) +\n String(totalSupport);\n\n return report;\n}\n\n/**\n * ROC curve data.\n *\n * Computes Receiver Operating Characteristic (ROC) curve for binary classification.\n * The ROC curve shows the trade-off between true positive rate and false positive rate\n * at various threshold settings.\n *\n * **Returns**: [fpr, tpr, thresholds]\n * - fpr: False positive rates\n * - tpr: True positive rates\n * - thresholds: Decision thresholds (in descending order)\n *\n * **Edge Cases**:\n * - Returns empty tensors if yTrue contains only one class\n * - Handles tied scores by grouping them at the same threshold\n *\n * @param yTrue - Ground truth binary labels (must be 0 or 1)\n * @param yScore - Target scores (higher score = more likely positive class)\n * @returns Tuple of [fpr, tpr, thresholds] tensors\n *\n * @throws {ShapeError} If yTrue and yScore have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If inputs are not numeric (string or int64)\n * @throws {InvalidParameterError} If yTrue contains non-binary values\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html | Scikit-learn roc_curve}\n */\nexport function rocCurve(yTrue: Tensor, yScore: Tensor): [Tensor, Tensor, Tensor] {\n assertSameSizeVectors(yTrue, yScore, \"yTrue\", \"yScore\");\n\n const n = yTrue.size;\n\n if (n === 0) return [tensor([]), tensor([]), tensor([])];\n\n const yTrueData = getNumericLabelData(yTrue);\n const yScoreData = getNumericLabelData(yScore);\n const trueOffset = createFlatOffsetter(yTrue);\n const scoreOffset = createFlatOffsetter(yScore);\n\n // Create pairs of (score, label)\n const pairs: Array<{ score: number; label: number }> = [];\n let nPos = 0;\n let nNeg = 0;\n for (let i = 0; i < n; i++) {\n const label = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n ensureBinaryValue(label, \"yTrue\", i);\n const score = readNumericLabel(yScoreData, scoreOffset, i, \"yScore\");\n pairs.push({ score, label });\n if (label === 1) nPos++;\n else nNeg++;\n }\n\n // Sort by score descending\n pairs.sort((a, b) => b.score - a.score);\n\n if (nPos === 0 || nNeg === 0) return [tensor([]), tensor([]), tensor([])];\n\n const fpr = [0];\n const tpr = [0];\n const thresholds = [Infinity];\n\n let tp = 0;\n let fp = 0;\n let idx = 0;\n while (idx < pairs.length) {\n const threshold = pairs[idx]?.score ?? 0;\n\n // Consume all samples with the same score as one step.\n while (idx < pairs.length && (pairs[idx]?.score ?? 0) === threshold) {\n const label = pairs[idx]?.label ?? 0;\n if (label === 1) tp++;\n else fp++;\n idx++;\n }\n\n fpr.push(fp / nNeg);\n tpr.push(tp / nPos);\n thresholds.push(threshold);\n }\n\n return [tensor(fpr), tensor(tpr), tensor(thresholds)];\n}\n\n/**\n * Area Under ROC Curve (AUC-ROC).\n *\n * Computes the Area Under the Receiver Operating Characteristic Curve.\n * AUC represents the probability that a randomly chosen positive sample\n * is ranked higher than a randomly chosen negative sample.\n *\n * **Range**: [0, 1], where 1 is perfect and 0.5 is random.\n *\n * **Time Complexity**: O(n log n) due to sorting\n * **Space Complexity**: O(n)\n *\n * @param yTrue - Ground truth binary labels (must be 0 or 1)\n * @param yScore - Target scores (higher score = more likely positive class)\n * @returns AUC score in range [0, 1], or 0.5 if ROC curve cannot be computed\n *\n * @throws {ShapeError} If yTrue and yScore have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If inputs are not numeric (string or int64)\n * @throws {InvalidParameterError} If yTrue contains non-binary values\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { rocAucScore, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 0, 1, 1]);\n * const yScore = tensor([0.1, 0.4, 0.35, 0.8]);\n * const auc = rocAucScore(yTrue, yScore); // ~0.75\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html | Scikit-learn roc_auc_score}\n */\nexport function rocAucScore(yTrue: Tensor, yScore: Tensor): number {\n const curves = rocCurve(yTrue, yScore);\n const fprT = curves[0];\n const tprT = curves[1];\n if (!fprT || !tprT || fprT.size === 0 || tprT.size === 0) return 0.5;\n\n const fprData = getNumericLabelData(fprT);\n const tprData = getNumericLabelData(tprT);\n const fprOffset = createFlatOffsetter(fprT);\n const tprOffset = createFlatOffsetter(tprT);\n\n let auc = 0;\n let prevX = 0;\n let prevY = 0;\n for (let i = 1; i < fprT.size; i++) {\n const x = readNumericLabel(fprData, fprOffset, i, \"fpr\");\n const y = readNumericLabel(tprData, tprOffset, i, \"tpr\");\n auc += (x - prevX) * ((y + prevY) / 2);\n prevX = x;\n prevY = y;\n }\n\n return auc;\n}\n\n/**\n * Precision-Recall curve.\n *\n * Computes precision-recall pairs for different probability thresholds.\n * Useful for evaluating classifiers on imbalanced datasets where ROC curves\n * may be overly optimistic.\n *\n * **Returns**: [precision, recall, thresholds] as a tuple of tensors\n * - precision: Precision values at each threshold\n * - recall: Recall values at each threshold\n * - thresholds: Decision thresholds (in descending order)\n *\n * **Time Complexity**: O(n log n) due to sorting\n * **Space Complexity**: O(n)\n *\n * @param yTrue - Ground truth binary labels (0 or 1)\n * @param yScore - Target scores (higher score = more likely positive class)\n * @returns Tuple of [precision, recall, thresholds] tensors\n *\n * @throws {ShapeError} If yTrue and yScore have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If inputs are not numeric (string or int64)\n * @throws {InvalidParameterError} If yTrue contains non-binary values\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { precisionRecallCurve, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 0, 1, 1]);\n * const yScore = tensor([0.1, 0.4, 0.35, 0.8]);\n * const [prec, rec, thresh] = precisionRecallCurve(yTrue, yScore);\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html | Scikit-learn precision_recall_curve}\n */\nexport function precisionRecallCurve(yTrue: Tensor, yScore: Tensor): [Tensor, Tensor, Tensor] {\n assertSameSizeVectors(yTrue, yScore, \"yTrue\", \"yScore\");\n\n const n = yTrue.size;\n\n if (n === 0) return [tensor([]), tensor([]), tensor([])];\n\n const yTrueData = getNumericLabelData(yTrue);\n const yScoreData = getNumericLabelData(yScore);\n const trueOffset = createFlatOffsetter(yTrue);\n const scoreOffset = createFlatOffsetter(yScore);\n\n // Create pairs of (score, label)\n const pairs: Array<{ score: number; label: number }> = [];\n let nPos = 0;\n for (let i = 0; i < n; i++) {\n const label = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n ensureBinaryValue(label, \"yTrue\", i);\n const score = readNumericLabel(yScoreData, scoreOffset, i, \"yScore\");\n pairs.push({ score, label });\n if (label === 1) nPos++;\n }\n\n // Sort by score descending\n pairs.sort((a, b) => b.score - a.score);\n\n if (nPos === 0) return [tensor([]), tensor([]), tensor([])];\n\n const prec = [1];\n const rec = [0];\n const thresholds = [Infinity];\n\n let tp = 0;\n let fp = 0;\n let idx = 0;\n while (idx < pairs.length) {\n const threshold = pairs[idx]?.score ?? 0;\n while (idx < pairs.length && (pairs[idx]?.score ?? 0) === threshold) {\n const label = pairs[idx]?.label ?? 0;\n if (label === 1) tp++;\n else fp++;\n idx++;\n }\n\n const precisionVal = tp + fp === 0 ? 1 : tp / (tp + fp);\n const recallVal = tp / nPos;\n prec.push(precisionVal);\n rec.push(recallVal);\n thresholds.push(threshold);\n }\n\n return [tensor(prec), tensor(rec), tensor(thresholds)];\n}\n\n/**\n * Average precision score.\n *\n * Computes the average precision (AP) from prediction scores. AP summarizes\n * a precision-recall curve as the weighted mean of precisions achieved at\n * each threshold, with the increase in recall from the previous threshold\n * used as the weight.\n *\n * **Range**: [0, 1], where 1 is perfect.\n *\n * **Time Complexity**: O(n log n) due to sorting\n * **Space Complexity**: O(n)\n *\n * @param yTrue - Ground truth binary labels (0 or 1)\n * @param yScore - Target scores (higher score = more likely positive class)\n * @returns Average precision score in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yScore have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If inputs are not numeric (string or int64)\n * @throws {InvalidParameterError} If yTrue contains non-binary values\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { averagePrecisionScore, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 0, 1, 1]);\n * const yScore = tensor([0.1, 0.4, 0.35, 0.8]);\n * const ap = averagePrecisionScore(yTrue, yScore);\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.average_precision_score.html | Scikit-learn average_precision_score}\n */\nexport function averagePrecisionScore(yTrue: Tensor, yScore: Tensor): number {\n const curves = precisionRecallCurve(yTrue, yScore);\n const precT = curves[0];\n const recT = curves[1];\n if (!precT || !recT || precT.size === 0 || recT.size === 0) return 0;\n\n const precData = getNumericLabelData(precT);\n const recData = getNumericLabelData(recT);\n const precOffset = createFlatOffsetter(precT);\n const recOffset = createFlatOffsetter(recT);\n\n let ap = 0;\n let prevRecall = readNumericLabel(recData, recOffset, 0, \"recall\");\n for (let i = 1; i < recT.size; i++) {\n const recall = readNumericLabel(recData, recOffset, i, \"recall\");\n const precision = readNumericLabel(precData, precOffset, i, \"precision\");\n const deltaRecall = recall - prevRecall;\n if (deltaRecall > 0) {\n ap += deltaRecall * precision;\n }\n prevRecall = recall;\n }\n\n return ap;\n}\n\n/**\n * Log loss (logistic loss, cross-entropy loss).\n *\n * Measures the performance of a classification model where the prediction is a probability\n * value between 0 and 1. Lower log loss indicates better predictions.\n *\n * **Formula**: -1/n * Σ(y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred))\n *\n * **Edge Cases**:\n * - Predictions are clipped to [1e-15, 1-1e-15] to avoid log(0)\n * - Returns 0 for empty inputs\n *\n * @param yTrue - Ground truth binary labels (0 or 1)\n * @param yPred - Predicted probabilities (must be in range [0, 1])\n * @returns Log loss value (lower is better, 0 is perfect)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If inputs are not numeric (string or int64)\n * @throws {InvalidParameterError} If yTrue is not binary or yPred is outside [0, 1]\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html | Scikit-learn log_loss}\n */\nexport function logLoss(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n const eps = 1e-15;\n let loss = 0;\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n ensureBinaryValue(trueVal, \"yTrue\", i);\n const predRaw = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n if (predRaw < 0 || predRaw > 1) {\n throw new InvalidParameterError(\n `yPred must contain probabilities in range [0, 1], found ${String(predRaw)} at index ${i}`,\n \"yPred\",\n predRaw\n );\n }\n const predVal = Math.max(eps, Math.min(1 - eps, predRaw));\n loss -= trueVal * Math.log(predVal) + (1 - trueVal) * Math.log(1 - predVal);\n }\n\n return loss / yTrue.size;\n}\n\n/**\n * Hamming loss.\n *\n * Computes the fraction of labels that are incorrectly predicted.\n * For binary classification, this equals 1 - accuracy.\n *\n * **Formula**: hamming_loss = (incorrect predictions) / (total predictions)\n *\n * **Range**: [0, 1], where 0 is perfect.\n *\n * **Time Complexity**: O(n)\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth target values\n * @param yPred - Estimated targets as returned by a classifier\n * @returns Hamming loss in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue and yPred use incompatible label types\n * @throws {DataValidationError} If numeric labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { hammingLoss, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const loss = hammingLoss(yTrue, yPred); // 0.2\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.hamming_loss.html | Scikit-learn hamming_loss}\n */\nexport function hammingLoss(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n assertComparableLabelTypes(yTrue, yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let errors = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readComparableLabel(yTrue, trueOffset, i, \"yTrue\");\n const predVal = readComparableLabel(yPred, predOffset, i, \"yPred\");\n if (trueVal !== predVal) {\n errors++;\n }\n }\n\n return errors / yTrue.size;\n}\n\n/**\n * Jaccard similarity score (Intersection over Union).\n *\n * Computes the Jaccard similarity coefficient between two binary label sets.\n * Also known as the Jaccard index or Intersection over Union (IoU).\n *\n * **Formula**: jaccard = TP / (TP + FP + FN)\n *\n * **Edge Cases**:\n * - If both yTrue and yPred contain no positive labels (TP + FP + FN = 0),\n * returns 1 to reflect perfect similarity of empty sets.\n *\n * **Range**: [0, 1], where 1 is perfect.\n *\n * **Time Complexity**: O(n)\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth binary labels (0 or 1)\n * @param yPred - Predicted binary labels (0 or 1)\n * @returns Jaccard score in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n * @throws {InvalidParameterError} If labels are not binary (0 or 1)\n *\n * @example\n * ```ts\n * import { jaccardScore, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const score = jaccardScore(yTrue, yPred); // 0.667\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_score.html | Scikit-learn jaccard_score}\n */\nexport function jaccardScore(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n if (yTrue.size === 0) return 1;\n\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let tp = 0,\n fp = 0,\n fn = 0;\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n ensureBinaryValue(trueVal, \"yTrue\", i);\n ensureBinaryValue(predVal, \"yPred\", i);\n\n if (trueVal === 1 && predVal === 1) tp++;\n else if (trueVal === 0 && predVal === 1) fp++;\n else if (trueVal === 1 && predVal === 0) fn++;\n }\n\n return tp + fp + fn === 0 ? 1 : tp / (tp + fp + fn);\n}\n\n/**\n * Matthews correlation coefficient (MCC).\n *\n * Computes the Matthews correlation coefficient, a balanced measure that\n * can be used even if the classes are of very different sizes. MCC is\n * considered one of the best metrics for binary classification.\n *\n * **Formula**: MCC = (TP*TN - FP*FN) / sqrt((TP+FP)(TP+FN)(TN+FP)(TN+FN))\n *\n * **Range**: [-1, 1], where 1 is perfect, 0 is random, -1 is inverse.\n *\n * **Time Complexity**: O(n)\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth binary labels (0 or 1)\n * @param yPred - Predicted binary labels (0 or 1)\n * @returns MCC score in range [-1, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { matthewsCorrcoef, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const mcc = matthewsCorrcoef(yTrue, yPred); // ~0.667\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.matthews_corrcoef.html | Scikit-learn matthews_corrcoef}\n */\nexport function matthewsCorrcoef(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let tp = 0,\n tn = 0,\n fp = 0,\n fn = 0;\n\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n ensureBinaryValue(trueVal, \"yTrue\", i);\n ensureBinaryValue(predVal, \"yPred\", i);\n\n if (trueVal === 1 && predVal === 1) tp++;\n else if (trueVal === 0 && predVal === 0) tn++;\n else if (trueVal === 0 && predVal === 1) fp++;\n else if (trueVal === 1 && predVal === 0) fn++;\n }\n\n const numerator = tp * tn - fp * fn;\n const denominator = Math.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn));\n\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n/**\n * Cohen's kappa score.\n *\n * Computes Cohen's kappa, a statistic that measures inter-annotator agreement.\n * It is generally thought to be a more robust measure than simple percent\n * agreement since it takes into account the possibility of agreement by chance.\n *\n * **Formula**: kappa = (p_o - p_e) / (1 - p_e)\n * - p_o: observed agreement\n * - p_e: expected agreement by chance\n *\n * **Range**: [-1, 1], where 1 is perfect agreement, 0 is chance, <0 is worse than chance.\n *\n * **Time Complexity**: O(n)\n * **Space Complexity**: O(k) where k is number of classes\n *\n * @param yTrue - Ground truth labels\n * @param yPred - Predicted labels\n * @returns Kappa score in range [-1, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { cohenKappaScore, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 1, 1, 0, 1]);\n * const yPred = tensor([0, 1, 0, 0, 1]);\n * const kappa = cohenKappaScore(yTrue, yPred); // ~0.615\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.cohen_kappa_score.html | Scikit-learn cohen_kappa_score}\n */\nexport function cohenKappaScore(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n const n = yTrue.size;\n\n if (n === 0) return 0;\n\n const yTrueData = getNumericLabelData(yTrue);\n const yPredData = getNumericLabelData(yPred);\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n // Observed agreement and class marginals\n let po = 0;\n const trueCount = new Map<number, number>();\n const predCount = new Map<number, number>();\n\n for (let i = 0; i < n; i++) {\n const t = readNumericLabel(yTrueData, trueOffset, i, \"yTrue\");\n const p = readNumericLabel(yPredData, predOffset, i, \"yPred\");\n if (t === p) {\n po++;\n }\n trueCount.set(t, (trueCount.get(t) ?? 0) + 1);\n predCount.set(p, (predCount.get(p) ?? 0) + 1);\n }\n\n po /= n;\n\n let pe = 0;\n const allClasses = new Set([...trueCount.keys(), ...predCount.keys()]);\n for (const c of allClasses) {\n const trueProb = (trueCount.get(c) ?? 0) / n;\n const predProb = (predCount.get(c) ?? 0) / n;\n pe += trueProb * predProb;\n }\n\n const denom = 1 - pe;\n if (denom === 0) return po === 1 ? 1 : 0;\n return (po - pe) / denom;\n}\n\n/**\n * Balanced accuracy score.\n *\n * Computes the balanced accuracy, which is the macro-averaged recall.\n * It is useful for imbalanced datasets where regular accuracy can be misleading.\n *\n * **Formula**: balanced_accuracy = (1/n_classes) * Σ(recall_per_class)\n *\n * **Range**: [0, 1], where 1 is perfect.\n *\n * **Time Complexity**: O(n * k) where k is number of classes\n * **Space Complexity**: O(k)\n *\n * @param yTrue - Ground truth labels\n * @param yPred - Predicted labels\n * @returns Balanced accuracy score in range [0, 1]\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If labels are not numeric (string or bigint)\n * @throws {DataValidationError} If labels contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { balancedAccuracyScore, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([0, 0, 0, 0, 1]); // Imbalanced\n * const yPred = tensor([0, 0, 0, 0, 0]); // Predicts all 0\n * const bacc = balancedAccuracyScore(yTrue, yPred); // 0.5 (not 0.8!)\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.balanced_accuracy_score.html | Scikit-learn balanced_accuracy_score}\n */\nexport function balancedAccuracyScore(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n const { classes, stats } = buildClassStats(yTrue, yPred);\n let sumRecall = 0;\n let classCount = 0;\n\n for (const cls of classes) {\n const classStats = stats.get(cls);\n const support = classStats?.support ?? 0;\n if (support === 0) continue;\n const tp = classStats?.tp ?? 0;\n const fn = classStats?.fn ?? 0;\n const recall = tp + fn > 0 ? tp / (tp + fn) : 0;\n sumRecall += recall;\n classCount++;\n }\n\n return classCount === 0 ? 0 : sumRecall / classCount;\n}\n","import {\n getNumericElement,\n isNumericTypedArray,\n isTypedArray,\n type NumericTypedArray,\n} from \"../core\";\nimport { DataValidationError, DTypeError, InvalidParameterError, ShapeError } from \"../core/errors\";\nimport { type Tensor, tensor } from \"../ndarray\";\nimport {\n assertFiniteNumber,\n assertSameSize,\n computeLogicalStrides,\n createFlatOffsetter,\n type FlatOffsetter,\n} from \"./_internal\";\n\nfunction isBigIntTypedArray(x: unknown): x is BigInt64Array | BigUint64Array {\n return x instanceof BigInt64Array || x instanceof BigUint64Array;\n}\n\nfunction readIndex<T>(arr: ArrayLike<T>, index: number, name: string): T {\n const v = arr[index];\n if (v === undefined) {\n throw new DataValidationError(`${name} index out of range: ${index}`);\n }\n return v;\n}\n\nfunction getNumericTensorData(t: Tensor, name: string): NumericTypedArray {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${name} must be numeric (string tensors not supported)`);\n }\n if (t.dtype === \"int64\") {\n throw new DTypeError(`${name} must be numeric (int64 tensors not supported)`);\n }\n const data = t.data;\n if (!isTypedArray(data) || !isNumericTypedArray(data)) {\n throw new DTypeError(`${name} must be a numeric tensor`);\n }\n return data;\n}\n\nfunction getFeatureAccessor(X: Tensor) {\n const data = getNumericTensorData(X, \"X\");\n\n if (X.ndim === 0 || X.ndim > 2) {\n throw new ShapeError(\"X must be a 1D or 2D tensor\");\n }\n\n const nSamples = X.shape[0] ?? 0;\n const nFeatures = X.ndim === 1 ? 1 : (X.shape[1] ?? 0);\n if (nFeatures === 0) {\n throw new ShapeError(\"X must have at least one feature\");\n }\n\n const logicalStrides = computeLogicalStrides(X.shape);\n const logical0 = logicalStrides[0];\n if (logical0 === undefined) throw new ShapeError(\"Invalid logical strides\");\n\n const sampleStride = X.strides[0] ?? logical0 ?? nFeatures;\n\n const featureStride = X.ndim === 1 ? 0 : (X.strides[1] ?? logicalStrides[1] ?? 1);\n\n if (X.ndim === 2 && featureStride === 0) {\n throw new ShapeError(\"X must have a non-degenerate feature stride\");\n }\n\n return {\n data,\n nSamples,\n nFeatures,\n sampleStride,\n featureStride,\n offset: X.offset,\n };\n}\n\ntype EncodedLabels = {\n readonly codes: Int32Array;\n readonly nClusters: number;\n};\n\nfunction readLabelValue(\n labels: Tensor,\n offsetter: FlatOffsetter,\n index: number,\n name: string\n): string | number | boolean | bigint {\n const data = labels.data;\n const flat = offsetter(index);\n\n if (isBigIntTypedArray(data)) {\n const v = data[flat];\n if (v === undefined) {\n throw new DataValidationError(`${name} must contain a value for index ${index}`);\n }\n return v;\n }\n\n if (isTypedArray(data) && isNumericTypedArray(data)) {\n const v = getNumericElement(data, flat);\n assertFiniteNumber(v, name, `index ${index}`);\n\n if ((labels.dtype === \"float32\" || labels.dtype === \"float64\") && !Number.isInteger(v)) {\n throw new DataValidationError(\n `${name} must contain discrete labels; found non-integer ${String(v)} at index ${index}`\n );\n }\n\n if (labels.dtype === \"int64\" && (!Number.isInteger(v) || !Number.isSafeInteger(v))) {\n throw new DataValidationError(\n `${name} contains an int64 value that cannot be represented safely as a number at index ${index}`\n );\n }\n\n return v;\n }\n\n if (Array.isArray(data)) {\n const v = data[flat];\n if (v === undefined || v === null) {\n throw new DataValidationError(`${name} must contain a value for index ${index}`);\n }\n\n if (typeof v === \"string\") return v;\n if (typeof v === \"boolean\") return v;\n\n if (typeof v === \"number\") {\n assertFiniteNumber(v, name, `index ${index}`);\n\n if ((labels.dtype === \"float32\" || labels.dtype === \"float64\") && !Number.isInteger(v)) {\n throw new DataValidationError(\n `${name} must contain discrete labels; found non-integer ${String(v)} at index ${index}`\n );\n }\n\n if (labels.dtype === \"int64\" && (!Number.isInteger(v) || !Number.isSafeInteger(v))) {\n throw new DataValidationError(\n `${name} contains an int64 value that cannot be represented safely as a number at index ${index}`\n );\n }\n\n return v;\n }\n\n throw new DTypeError(`${name} must contain primitive labels (string, boolean, number, bigint)`);\n }\n\n throw new DTypeError(`${name} has unsupported backing storage for labels`);\n}\n\nfunction encodeLabels(labels: Tensor, name: string): EncodedLabels {\n if (labels.dtype === \"string\") {\n throw new DTypeError(`${name}: string labels not supported for clustering metrics`);\n }\n\n const n = labels.size;\n const codes = new Int32Array(n);\n const offsetter = createFlatOffsetter(labels);\n\n const map = new Map<string | number | boolean | bigint, number>();\n let next = 0;\n\n for (let i = 0; i < n; i++) {\n const raw = readLabelValue(labels, offsetter, i, name);\n\n const existing = map.get(raw);\n if (existing === undefined) {\n map.set(raw, next);\n codes[i] = next;\n next++;\n } else {\n codes[i] = existing;\n }\n }\n\n return { codes, nClusters: next };\n}\n\nfunction comb2(x: number): number {\n return x <= 1 ? 0 : (x * (x - 1)) / 2;\n}\n\ntype ContingencyStats = {\n readonly contingencyDense: Int32Array | null;\n readonly contingencySparse: Map<number, number> | null;\n readonly trueCount: Int32Array;\n readonly predCount: Int32Array;\n readonly nTrue: number;\n readonly nPred: number;\n readonly n: number;\n};\n\nfunction buildContingencyStats(labelsTrue: Tensor, labelsPred: Tensor): ContingencyStats {\n assertSameSize(labelsTrue, labelsPred, \"labelsTrue\", \"labelsPred\");\n\n const n = labelsTrue.size;\n const encT = encodeLabels(labelsTrue, \"labelsTrue\");\n const encP = encodeLabels(labelsPred, \"labelsPred\");\n\n const trueCodes = encT.codes;\n const predCodes = encP.codes;\n const nTrue = encT.nClusters;\n const nPred = encP.nClusters;\n\n const trueCount = new Int32Array(nTrue);\n const predCount = new Int32Array(nPred);\n\n for (let i = 0; i < n; i++) {\n const t = readIndex(trueCodes, i, \"trueCodes\");\n const p = readIndex(predCodes, i, \"predCodes\");\n trueCount[t] = (trueCount[t] ?? 0) + 1;\n predCount[p] = (predCount[p] ?? 0) + 1;\n }\n\n const denseSize = nTrue * nPred;\n const maxDenseCells = 4_000_000; // ~16MB Int32\n\n if (denseSize > 0 && denseSize <= maxDenseCells) {\n const contingency = new Int32Array(denseSize);\n for (let i = 0; i < n; i++) {\n const t = readIndex(trueCodes, i, \"trueCodes\");\n const p = readIndex(predCodes, i, \"predCodes\");\n const idx = t * nPred + p;\n contingency[idx] = (contingency[idx] ?? 0) + 1;\n }\n return {\n contingencyDense: contingency,\n contingencySparse: null,\n trueCount,\n predCount,\n nTrue,\n nPred,\n n,\n };\n }\n\n const contingency = new Map<number, number>();\n for (let i = 0; i < n; i++) {\n const t = readIndex(trueCodes, i, \"trueCodes\");\n const p = readIndex(predCodes, i, \"predCodes\");\n const key = t * nPred + p;\n contingency.set(key, (contingency.get(key) ?? 0) + 1);\n }\n\n return {\n contingencyDense: null,\n contingencySparse: contingency,\n trueCount,\n predCount,\n nTrue,\n nPred,\n n,\n };\n}\n\nfunction entropyFromCountArray(counts: Int32Array, n: number): number {\n if (n === 0) return 0;\n let h = 0;\n\n for (let i = 0; i < counts.length; i++) {\n const c = readIndex(counts, i, \"counts\");\n if (c > 0) {\n const p = c / n;\n h -= p * Math.log(p);\n }\n }\n return h;\n}\n\nfunction mutualInformationFromContingency(stats: ContingencyStats): number {\n const { contingencyDense, contingencySparse, trueCount, predCount, nPred, n } = stats;\n if (n === 0) return 0;\n\n let mi = 0;\n\n if (contingencyDense) {\n for (let idx = 0; idx < contingencyDense.length; idx++) {\n const nij = readIndex(contingencyDense, idx, \"contingencyDense\");\n if (nij <= 0) continue;\n\n const t = Math.floor(idx / nPred);\n const p = idx - t * nPred;\n\n const ni = readIndex(trueCount, t, \"trueCount\");\n const nj = readIndex(predCount, p, \"predCount\");\n if (ni > 0 && nj > 0) {\n mi += (nij / n) * Math.log((n * nij) / (ni * nj));\n }\n }\n return mi;\n }\n\n if (contingencySparse) {\n for (const [key, nij] of contingencySparse) {\n if (nij <= 0) continue;\n\n const t = Math.floor(key / nPred);\n const p = key - t * nPred;\n\n const ni = readIndex(trueCount, t, \"trueCount\");\n const nj = readIndex(predCount, p, \"predCount\");\n if (ni > 0 && nj > 0) {\n mi += (nij / n) * Math.log((n * nij) / (ni * nj));\n }\n }\n return mi;\n }\n\n return 0;\n}\n\nfunction buildLogFactorials(n: number): Float64Array {\n const out = new Float64Array(n + 1);\n for (let i = 1; i <= n; i++) {\n out[i] = (out[i - 1] ?? 0) + Math.log(i);\n }\n return out;\n}\n\nfunction logCombination(n: number, k: number, logFactorials: Float64Array): number {\n if (k < 0 || k > n) return Number.NEGATIVE_INFINITY;\n const a = readIndex(logFactorials, n, \"logFactorials\");\n const b = readIndex(logFactorials, k, \"logFactorials\");\n const c = readIndex(logFactorials, n - k, \"logFactorials\");\n return a - b - c;\n}\n\nconst LOG_EXP_UNDERFLOW_CUTOFF = -745;\n\nfunction expectedMutualInformation(stats: ContingencyStats): number {\n const { trueCount, predCount, n } = stats;\n if (n <= 1) return 0;\n\n const rowSums = Array.from(trueCount);\n const colSums = Array.from(predCount);\n const logFactorials = buildLogFactorials(n);\n\n let emi = 0;\n let comp = 0;\n\n for (const a of rowSums) {\n if (a <= 0) continue;\n for (const b of colSums) {\n if (b <= 0) continue;\n\n const nijMin = Math.max(1, a + b - n);\n const nijMax = Math.min(a, b);\n if (nijMin > nijMax) continue;\n\n const logDenominator = logCombination(n, b, logFactorials);\n\n for (let nij = nijMin; nij <= nijMax; nij++) {\n const logProbability =\n logCombination(a, nij, logFactorials) +\n logCombination(n - a, b - nij, logFactorials) -\n logDenominator;\n\n if (logProbability < LOG_EXP_UNDERFLOW_CUTOFF) continue;\n\n const probability = Math.exp(logProbability);\n if (!Number.isFinite(probability) || probability === 0) continue;\n\n const miTerm = (nij / n) * Math.log((n * nij) / (a * b));\n const y = probability * miTerm - comp;\n const t = emi + y;\n comp = t - emi - y;\n emi = t;\n }\n }\n }\n\n return emi;\n}\n\ntype AverageMethod = \"min\" | \"geometric\" | \"arithmetic\" | \"max\";\n\nfunction averageEntropy(hTrue: number, hPred: number, method: AverageMethod): number {\n if (method === \"min\") return Math.min(hTrue, hPred);\n if (method === \"max\") return Math.max(hTrue, hPred);\n if (method === \"geometric\") return Math.sqrt(hTrue * hPred);\n return (hTrue + hPred) / 2;\n}\n\nfunction euclideanDistance(\n data: NumericTypedArray,\n offset: number,\n sampleStride: number,\n featureStride: number,\n nFeatures: number,\n i: number,\n j: number\n): number {\n let sum = 0;\n const baseI = offset + i * sampleStride;\n const baseJ = offset + j * sampleStride;\n\n for (let k = 0; k < nFeatures; k++) {\n const vi = getNumericElement(data, baseI + k * featureStride);\n const vj = getNumericElement(data, baseJ + k * featureStride);\n assertFiniteNumber(vi, \"X\", `sample ${i}, feature ${k}`);\n assertFiniteNumber(vj, \"X\", `sample ${j}, feature ${k}`);\n const d = vi - vj;\n sum += d * d;\n }\n return Math.sqrt(sum);\n}\n\ntype SilhouetteMetric = \"euclidean\" | \"precomputed\";\n\nfunction getPrecomputedDistanceAccessor(X: Tensor, n: number) {\n const data = getNumericTensorData(X, \"X\");\n\n if (X.ndim !== 2) {\n throw new ShapeError(\"X must be a 2D tensor for metric='precomputed'\");\n }\n const rows = X.shape[0] ?? 0;\n const cols = X.shape[1] ?? 0;\n if (rows !== n || cols !== n) {\n throw new ShapeError(\n \"For metric='precomputed', X must be a square [n_samples, n_samples] matrix\"\n );\n }\n\n const logicalStrides = computeLogicalStrides(X.shape);\n const rowStride = X.strides[0] ?? logicalStrides[0] ?? n;\n const colStride = X.strides[1] ?? logicalStrides[1] ?? 1;\n\n if (rowStride === 0 || colStride === 0) {\n throw new ShapeError(\"Precomputed distance matrix must have non-degenerate strides\");\n }\n\n const base = X.offset;\n\n return (i: number, j: number) => {\n const v = getNumericElement(data, base + i * rowStride + j * colStride);\n assertFiniteNumber(v, \"X\", `distance[${i},${j}]`);\n if (v < 0) {\n throw new DataValidationError(\n `Precomputed distances must be non-negative; found ${String(v)} at [${i},${j}]`\n );\n }\n return v;\n };\n}\n\nfunction validateSilhouetteLabels(labels: Tensor, nSamples: number): EncodedLabels {\n if (labels.size !== nSamples) {\n throw new ShapeError(\"labels length must match number of samples\");\n }\n\n const enc = encodeLabels(labels, \"labels\");\n const k = enc.nClusters;\n\n if (k < 2 || k > nSamples - 1) {\n throw new InvalidParameterError(\n \"silhouette requires 2 <= n_clusters <= n_samples - 1\",\n \"n_clusters\",\n k\n );\n }\n\n return enc;\n}\n\nfunction reservoirSampleIndices(n: number, k: number, seed: number | undefined): Int32Array {\n let state = (seed ?? 0) >>> 0;\n const hasSeed = seed !== undefined;\n\n const randU32 = () => {\n if (!hasSeed) return (Math.random() * 0x1_0000_0000) >>> 0;\n state = (1664525 * state + 1013904223) >>> 0;\n return state;\n };\n\n const randInt = (exclusiveMax: number) => randU32() % exclusiveMax;\n\n const out = new Int32Array(k);\n for (let i = 0; i < k; i++) out[i] = i;\n\n for (let i = k; i < n; i++) {\n const j = randInt(i + 1);\n if (j < k) out[j] = i;\n }\n return out;\n}\n\nfunction reencodeSubset(codes: Int32Array): {\n codes: Int32Array;\n nClusters: number;\n} {\n const out = new Int32Array(codes.length);\n const map = new Map<number, number>();\n let next = 0;\n\n for (let i = 0; i < codes.length; i++) {\n const v = readIndex(codes, i, \"codes\");\n const existing = map.get(v);\n if (existing === undefined) {\n map.set(v, next);\n out[i] = next;\n next++;\n } else {\n out[i] = existing;\n }\n }\n\n return { codes: out, nClusters: next };\n}\n\nfunction silhouetteMeanEuclidean(X: Tensor, labels: Tensor, indices: Int32Array | null): number {\n const { data, nSamples, nFeatures, sampleStride, featureStride, offset } = getFeatureAccessor(X);\n\n const n = indices ? indices.length : nSamples;\n if (nSamples < 2 || n < 2) {\n throw new InvalidParameterError(\"silhouette requires at least 2 samples\", \"n_samples\", n);\n }\n\n const encAll = validateSilhouetteLabels(labels, nSamples);\n\n const subsetCodesRaw = new Int32Array(n);\n for (let i = 0; i < n; i++) {\n const src = indices ? readIndex(indices, i, \"indices\") : i;\n const c = readIndex(encAll.codes, src, \"labels.codes\");\n subsetCodesRaw[i] = c;\n }\n\n const re = reencodeSubset(subsetCodesRaw);\n const codes = re.codes;\n const k = re.nClusters;\n\n if (k < 2 || k > n - 1) {\n throw new InvalidParameterError(\n \"silhouette requires 2 <= n_clusters <= n_samples - 1\",\n \"n_clusters\",\n k\n );\n }\n\n const clusterSizes = new Int32Array(k);\n for (let i = 0; i < n; i++) {\n const ci = readIndex(codes, i, \"codes\");\n clusterSizes[ci] = (clusterSizes[ci] ?? 0) + 1;\n }\n\n const sumsToClusters = new Float64Array(k);\n\n let sum = 0;\n let comp = 0;\n\n for (let i = 0; i < n; i++) {\n const ci = readIndex(codes, i, \"codes\");\n const sizeOwn = readIndex(clusterSizes, ci, \"clusterSizes\");\n\n if (sizeOwn <= 1) continue; // singleton => 0\n\n sumsToClusters.fill(0);\n\n const srcI = indices ? readIndex(indices, i, \"indices\") : i;\n\n for (let j = 0; j < n; j++) {\n if (i === j) continue;\n const srcJ = indices ? readIndex(indices, j, \"indices\") : j;\n const cj = readIndex(codes, j, \"codes\");\n\n const d = euclideanDistance(data, offset, sampleStride, featureStride, nFeatures, srcI, srcJ);\n sumsToClusters[cj] = (sumsToClusters[cj] ?? 0) + d;\n }\n\n const a = readIndex(sumsToClusters, ci, \"sumsToClusters\") / (sizeOwn - 1);\n\n let b = Infinity;\n for (let cl = 0; cl < k; cl++) {\n if (cl === ci) continue;\n const sz = readIndex(clusterSizes, cl, \"clusterSizes\");\n if (sz <= 0) continue;\n const mean = readIndex(sumsToClusters, cl, \"sumsToClusters\") / sz;\n if (mean < b) b = mean;\n }\n\n if (!Number.isFinite(b) || b === Infinity) continue;\n\n const denom = Math.max(a, b);\n const s = denom > 0 ? (b - a) / denom : 0;\n\n const y = s - comp;\n const t = sum + y;\n comp = t - sum - y;\n sum = t;\n }\n\n return sum / n;\n}\n\nfunction silhouetteMeanPrecomputed(X: Tensor, labels: Tensor, indices: Int32Array | null): number {\n const nSamples = labels.size;\n if (nSamples < 2) {\n throw new InvalidParameterError(\n \"silhouette requires at least 2 samples\",\n \"n_samples\",\n nSamples\n );\n }\n\n const encAll = validateSilhouetteLabels(labels, nSamples);\n const dist = getPrecomputedDistanceAccessor(X, nSamples);\n\n const n = indices ? indices.length : nSamples;\n if (n < 2) {\n throw new InvalidParameterError(\"silhouette requires at least 2 samples\", \"n_samples\", n);\n }\n\n // Validate diagonal ~ 0 for relevant indices\n for (let i = 0; i < n; i++) {\n const src = indices ? readIndex(indices, i, \"indices\") : i;\n const d0 = dist(src, src);\n if (!Number.isFinite(d0) || Math.abs(d0) > 1e-12) {\n throw new DataValidationError(\n `Precomputed distance matrix diagonal must be ~0; found ${String(d0)} at [${src},${src}]`\n );\n }\n }\n\n const subsetCodesRaw = new Int32Array(n);\n for (let i = 0; i < n; i++) {\n const src = indices ? readIndex(indices, i, \"indices\") : i;\n const c = readIndex(encAll.codes, src, \"labels.codes\");\n subsetCodesRaw[i] = c;\n }\n\n const re = reencodeSubset(subsetCodesRaw);\n const codes = re.codes;\n const k = re.nClusters;\n\n if (k < 2 || k > n - 1) {\n throw new InvalidParameterError(\n \"silhouette requires 2 <= n_clusters <= n_samples - 1\",\n \"n_clusters\",\n k\n );\n }\n\n const clusterSizes = new Int32Array(k);\n for (let i = 0; i < n; i++) {\n const ci = readIndex(codes, i, \"codes\");\n clusterSizes[ci] = (clusterSizes[ci] ?? 0) + 1;\n }\n\n const sumsToClusters = new Float64Array(k);\n\n let sum = 0;\n let comp = 0;\n\n for (let i = 0; i < n; i++) {\n const ci = readIndex(codes, i, \"codes\");\n const sizeOwn = readIndex(clusterSizes, ci, \"clusterSizes\");\n if (sizeOwn <= 1) continue;\n\n sumsToClusters.fill(0);\n\n const srcI = indices ? readIndex(indices, i, \"indices\") : i;\n\n for (let j = 0; j < n; j++) {\n if (i === j) continue;\n\n const srcJ = indices ? readIndex(indices, j, \"indices\") : j;\n const cj = readIndex(codes, j, \"codes\");\n\n const d = dist(srcI, srcJ);\n sumsToClusters[cj] = (sumsToClusters[cj] ?? 0) + d;\n }\n\n const a = readIndex(sumsToClusters, ci, \"sumsToClusters\") / (sizeOwn - 1);\n\n let b = Infinity;\n for (let cl = 0; cl < k; cl++) {\n if (cl === ci) continue;\n const sz = readIndex(clusterSizes, cl, \"clusterSizes\");\n if (sz <= 0) continue;\n const mean = readIndex(sumsToClusters, cl, \"sumsToClusters\") / sz;\n if (mean < b) b = mean;\n }\n\n if (!Number.isFinite(b) || b === Infinity) continue;\n\n const denom = Math.max(a, b);\n const s = denom > 0 ? (b - a) / denom : 0;\n\n const y = s - comp;\n const t = sum + y;\n comp = t - sum - y;\n sum = t;\n }\n\n return sum / n;\n}\n\n/**\n * Computes the mean Silhouette Coefficient over all samples.\n *\n * The Silhouette Coefficient for a sample measures how similar it is to its own\n * cluster compared to other clusters. Values range from -1 to 1, where higher\n * values indicate better-defined clusters.\n *\n * **Formula**: s(i) = (b(i) - a(i)) / max(a(i), b(i))\n * - a(i): mean intra-cluster distance for sample i\n * - b(i): mean nearest-cluster distance for sample i\n *\n * **Time Complexity**: O(n²) where n is the number of samples\n * **Space Complexity**: O(n + k) where k is the number of clusters\n *\n * @param X - Feature matrix of shape [n_samples, n_features], or a precomputed distance matrix\n * @param labels - Cluster labels for each sample\n * @param metric - Distance metric: 'euclidean' (default) or 'precomputed'\n * @param options - Optional parameters\n * @param options.sampleSize - Number of samples to use for approximation (required when n > 2000)\n * @param options.randomState - Seed for reproducible sampling\n * @returns Mean silhouette coefficient in range [-1, 1]\n *\n * @throws {InvalidParameterError} If fewer than 2 samples, invalid sampleSize, or unsupported metric\n * @throws {ShapeError} If labels length doesn't match samples, or X shape is invalid\n * @throws {DTypeError} If labels are string or X is non-numeric\n * @throws {DataValidationError} If X contains non-finite values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html | Scikit-learn silhouette_score}\n */\nexport function silhouetteScore(\n X: Tensor,\n labels: Tensor,\n metric: SilhouetteMetric = \"euclidean\",\n options?: { sampleSize?: number; randomState?: number }\n): number {\n const sampleSize = options?.sampleSize;\n const randomState = options?.randomState;\n\n const nSamples = labels.size;\n if (nSamples < 2) {\n throw new InvalidParameterError(\n \"silhouette requires at least 2 samples\",\n \"n_samples\",\n nSamples\n );\n }\n\n const maxFull = 2000;\n if (sampleSize === undefined && nSamples > maxFull) {\n throw new InvalidParameterError(\n `silhouetteScore is O(n²) and n_samples=${nSamples} is too large for full computation; provide options.sampleSize`,\n \"sampleSize\",\n sampleSize\n );\n }\n\n if (sampleSize !== undefined) {\n if (!Number.isFinite(sampleSize) || !Number.isInteger(sampleSize)) {\n throw new InvalidParameterError(\"sampleSize must be an integer\", \"sampleSize\", sampleSize);\n }\n if (sampleSize < 2 || sampleSize > nSamples) {\n throw new InvalidParameterError(\n \"sampleSize must satisfy 2 <= sampleSize <= n_samples\",\n \"sampleSize\",\n sampleSize\n );\n }\n }\n\n const indices =\n sampleSize !== undefined && sampleSize < nSamples\n ? reservoirSampleIndices(nSamples, sampleSize, randomState)\n : null;\n\n if (metric === \"euclidean\") return silhouetteMeanEuclidean(X, labels, indices);\n if (metric === \"precomputed\") return silhouetteMeanPrecomputed(X, labels, indices);\n\n throw new InvalidParameterError(\n `Unsupported metric: '${String(metric)}'. Must be 'euclidean' or 'precomputed'`,\n \"metric\",\n metric\n );\n}\n\n/**\n * Computes the Silhouette Coefficient for each sample.\n *\n * Returns a tensor of per-sample silhouette values. Useful for identifying\n * samples that are well-clustered vs. poorly-clustered.\n *\n * **Time Complexity**: O(n²) where n is the number of samples\n * **Space Complexity**: O(n + k) where k is the number of clusters\n *\n * @param X - Feature matrix of shape [n_samples, n_features], or a precomputed distance matrix\n * @param labels - Cluster labels for each sample\n * @param metric - Distance metric: 'euclidean' (default) or 'precomputed'\n * @returns Tensor of silhouette coefficients in range [-1, 1] for each sample\n *\n * @throws {InvalidParameterError} If fewer than 2 samples or unsupported metric\n * @throws {ShapeError} If labels length doesn't match samples, or X shape is invalid\n * @throws {DTypeError} If labels are string or X is non-numeric\n * @throws {DataValidationError} If X contains non-finite values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_samples.html | Scikit-learn silhouette_samples}\n */\nexport function silhouetteSamples(\n X: Tensor,\n labels: Tensor,\n metric: SilhouetteMetric = \"euclidean\"\n): Tensor {\n const nSamples = labels.size;\n if (nSamples < 2) {\n throw new InvalidParameterError(\n \"silhouette requires at least 2 samples\",\n \"n_samples\",\n nSamples\n );\n }\n\n const enc = validateSilhouetteLabels(labels, nSamples);\n const codes = enc.codes;\n const k = enc.nClusters;\n\n const silhouettes = new Float64Array(nSamples);\n\n const clusterSizes = new Int32Array(k);\n for (let i = 0; i < nSamples; i++) {\n const ci = readIndex(codes, i, \"codes\");\n clusterSizes[ci] = (clusterSizes[ci] ?? 0) + 1;\n }\n\n const sumsToClusters = new Float64Array(k);\n\n if (metric === \"euclidean\") {\n const { data, nFeatures, sampleStride, featureStride, offset } = getFeatureAccessor(X);\n\n for (let i = 0; i < nSamples; i++) {\n const ci = readIndex(codes, i, \"codes\");\n const sizeOwn = readIndex(clusterSizes, ci, \"clusterSizes\");\n if (sizeOwn <= 1) {\n silhouettes[i] = 0;\n continue;\n }\n\n sumsToClusters.fill(0);\n\n for (let j = 0; j < nSamples; j++) {\n if (i === j) continue;\n const cj = readIndex(codes, j, \"codes\");\n\n const d = euclideanDistance(data, offset, sampleStride, featureStride, nFeatures, i, j);\n sumsToClusters[cj] = (sumsToClusters[cj] ?? 0) + d;\n }\n\n const a = readIndex(sumsToClusters, ci, \"sumsToClusters\") / (sizeOwn - 1);\n\n let b = Infinity;\n for (let cl = 0; cl < k; cl++) {\n if (cl === ci) continue;\n const sz = readIndex(clusterSizes, cl, \"clusterSizes\");\n if (sz <= 0) continue;\n const mean = readIndex(sumsToClusters, cl, \"sumsToClusters\") / sz;\n if (mean < b) b = mean;\n }\n\n if (!Number.isFinite(b) || b === Infinity) {\n silhouettes[i] = 0;\n continue;\n }\n\n const denom = Math.max(a, b);\n silhouettes[i] = denom > 0 ? (b - a) / denom : 0;\n }\n\n return tensor(silhouettes);\n }\n\n if (metric === \"precomputed\") {\n const dist = getPrecomputedDistanceAccessor(X, nSamples);\n\n for (let i = 0; i < nSamples; i++) {\n const d0 = dist(i, i);\n if (!Number.isFinite(d0) || Math.abs(d0) > 1e-12) {\n throw new DataValidationError(\n `Precomputed distance matrix diagonal must be ~0; found ${String(d0)} at [${i},${i}]`\n );\n }\n }\n\n for (let i = 0; i < nSamples; i++) {\n const ci = readIndex(codes, i, \"codes\");\n const sizeOwn = readIndex(clusterSizes, ci, \"clusterSizes\");\n if (sizeOwn <= 1) {\n silhouettes[i] = 0;\n continue;\n }\n\n sumsToClusters.fill(0);\n\n for (let j = 0; j < nSamples; j++) {\n if (i === j) continue;\n const cj = readIndex(codes, j, \"codes\");\n\n const d = dist(i, j);\n sumsToClusters[cj] = (sumsToClusters[cj] ?? 0) + d;\n }\n\n const a = readIndex(sumsToClusters, ci, \"sumsToClusters\") / (sizeOwn - 1);\n\n let b = Infinity;\n for (let cl = 0; cl < k; cl++) {\n if (cl === ci) continue;\n const sz = readIndex(clusterSizes, cl, \"clusterSizes\");\n if (sz <= 0) continue;\n const mean = readIndex(sumsToClusters, cl, \"sumsToClusters\") / sz;\n if (mean < b) b = mean;\n }\n\n if (!Number.isFinite(b) || b === Infinity) {\n silhouettes[i] = 0;\n continue;\n }\n\n const denom = Math.max(a, b);\n silhouettes[i] = denom > 0 ? (b - a) / denom : 0;\n }\n\n return tensor(silhouettes);\n }\n\n throw new InvalidParameterError(\n `Unsupported metric: '${String(metric)}'. Must be 'euclidean' or 'precomputed'`,\n \"metric\",\n metric\n );\n}\n\n/**\n * Computes the Davies-Bouldin index.\n *\n * The Davies-Bouldin index measures the average similarity ratio of each cluster\n * with its most similar cluster. Lower values indicate better clustering.\n * Returns 0 when k < 2 or n_samples == 0.\n *\n * **Time Complexity**: O(n * d + k² * d) where n is samples, d is features, k is clusters\n * **Space Complexity**: O(k * d)\n *\n * @param X - Feature matrix of shape [n_samples, n_features]\n * @param labels - Cluster labels for each sample\n * @returns Davies-Bouldin index (lower is better, 0 is minimum)\n *\n * @throws {ShapeError} If labels length doesn't match samples, or X shape is invalid\n * @throws {DTypeError} If labels are string or X is non-numeric\n * @throws {DataValidationError} If X contains non-finite values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.davies_bouldin_score.html | Scikit-learn davies_bouldin_score}\n */\nexport function daviesBouldinScore(X: Tensor, labels: Tensor): number {\n const { data, nSamples, nFeatures, sampleStride, featureStride, offset } = getFeatureAccessor(X);\n if (nSamples === 0) return 0;\n\n if (labels.size !== nSamples) {\n throw new ShapeError(\"labels length must match number of samples\");\n }\n\n const enc = encodeLabels(labels, \"labels\");\n const codes = enc.codes;\n const k = enc.nClusters;\n if (k < 2) return 0;\n\n const centroids = new Array<Float64Array>(k);\n for (let c = 0; c < k; c++) centroids[c] = new Float64Array(nFeatures);\n\n const clusterSizes = new Int32Array(k);\n\n for (let i = 0; i < nSamples; i++) {\n const c = readIndex(codes, i, \"codes\");\n clusterSizes[c] = (clusterSizes[c] ?? 0) + 1;\n\n const base = offset + i * sampleStride;\n const centroid = readIndex(centroids, c, \"centroids\");\n for (let f = 0; f < nFeatures; f++) {\n const v = getNumericElement(data, base + f * featureStride);\n assertFiniteNumber(v, \"X\", `sample ${i}, feature ${f}`);\n centroid[f] = (centroid[f] ?? 0) + v;\n }\n }\n\n for (let c = 0; c < k; c++) {\n const sz = readIndex(clusterSizes, c, \"clusterSizes\");\n if (sz <= 0) continue;\n const centroid = readIndex(centroids, c, \"centroids\");\n for (let f = 0; f < nFeatures; f++) {\n centroid[f] = (centroid[f] ?? 0) / sz;\n }\n }\n\n const scatterSum = new Float64Array(k);\n\n for (let i = 0; i < nSamples; i++) {\n const c = readIndex(codes, i, \"codes\");\n const centroid = readIndex(centroids, c, \"centroids\");\n\n let distSq = 0;\n const base = offset + i * sampleStride;\n for (let f = 0; f < nFeatures; f++) {\n const v = getNumericElement(data, base + f * featureStride);\n assertFiniteNumber(v, \"X\", `sample ${i}, feature ${f}`);\n const d = v - (centroid[f] ?? 0);\n distSq += d * d;\n }\n\n scatterSum[c] = (scatterSum[c] ?? 0) + Math.sqrt(distSq);\n }\n\n const S = new Float64Array(k);\n for (let c = 0; c < k; c++) {\n const sz = readIndex(clusterSizes, c, \"clusterSizes\");\n const sc = readIndex(scatterSum, c, \"scatterSum\");\n S[c] = sz > 0 ? sc / sz : 0;\n }\n\n let db = 0;\n\n for (let i = 0; i < k; i++) {\n let maxRatio = Number.NEGATIVE_INFINITY;\n const ci = readIndex(centroids, i, \"centroids\");\n\n for (let j = 0; j < k; j++) {\n if (i === j) continue;\n const cj = readIndex(centroids, j, \"centroids\");\n\n let distSq = 0;\n for (let f = 0; f < nFeatures; f++) {\n const d = (ci[f] ?? 0) - (cj[f] ?? 0);\n distSq += d * d;\n }\n\n const dist = Math.sqrt(distSq);\n const si = readIndex(S, i, \"S\");\n const sj = readIndex(S, j, \"S\");\n const ratio = dist === 0 ? Number.POSITIVE_INFINITY : (si + sj) / dist;\n if (ratio > maxRatio) maxRatio = ratio;\n }\n\n db += maxRatio;\n }\n\n return db / k;\n}\n\n/**\n * Computes the Calinski-Harabasz index (Variance Ratio Criterion).\n *\n * The score is the ratio of between-cluster dispersion to within-cluster\n * dispersion. Higher values indicate better-defined clusters.\n * Returns 0 when k < 2, n_samples == 0, or within-group sum of squares is 0.\n *\n * **Time Complexity**: O(n * d) where n is samples and d is features\n * **Space Complexity**: O(k * d) where k is clusters\n *\n * @param X - Feature matrix of shape [n_samples, n_features]\n * @param labels - Cluster labels for each sample\n * @returns Calinski-Harabasz index (higher is better)\n *\n * @throws {ShapeError} If labels length doesn't match samples, or X shape is invalid\n * @throws {DTypeError} If labels are string or X is non-numeric\n * @throws {DataValidationError} If X contains non-finite values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.calinski_harabasz_score.html | Scikit-learn calinski_harabasz_score}\n */\nexport function calinskiHarabaszScore(X: Tensor, labels: Tensor): number {\n const { data, nSamples, nFeatures, sampleStride, featureStride, offset } = getFeatureAccessor(X);\n if (nSamples === 0) return 0;\n\n if (labels.size !== nSamples) {\n throw new ShapeError(\"labels length must match number of samples\");\n }\n\n const enc = encodeLabels(labels, \"labels\");\n const codes = enc.codes;\n const k = enc.nClusters;\n\n const overallMean = new Float64Array(nFeatures);\n\n for (let i = 0; i < nSamples; i++) {\n const base = offset + i * sampleStride;\n for (let f = 0; f < nFeatures; f++) {\n const v = getNumericElement(data, base + f * featureStride);\n assertFiniteNumber(v, \"X\", `sample ${i}, feature ${f}`);\n overallMean[f] = (overallMean[f] ?? 0) + v;\n }\n }\n for (let f = 0; f < nFeatures; f++) {\n overallMean[f] = (overallMean[f] ?? 0) / nSamples;\n }\n\n const centroids = new Array<Float64Array>(k);\n for (let c = 0; c < k; c++) centroids[c] = new Float64Array(nFeatures);\n const clusterSizes = new Int32Array(k);\n\n for (let i = 0; i < nSamples; i++) {\n const c = readIndex(codes, i, \"codes\");\n clusterSizes[c] = (clusterSizes[c] ?? 0) + 1;\n\n const base = offset + i * sampleStride;\n const centroid = readIndex(centroids, c, \"centroids\");\n for (let f = 0; f < nFeatures; f++) {\n const v = getNumericElement(data, base + f * featureStride);\n assertFiniteNumber(v, \"X\", `sample ${i}, feature ${f}`);\n centroid[f] = (centroid[f] ?? 0) + v;\n }\n }\n\n for (let c = 0; c < k; c++) {\n const sz = readIndex(clusterSizes, c, \"clusterSizes\");\n if (sz <= 0) continue;\n const centroid = readIndex(centroids, c, \"centroids\");\n for (let f = 0; f < nFeatures; f++) {\n centroid[f] = (centroid[f] ?? 0) / sz;\n }\n }\n\n let bgss = 0;\n for (let c = 0; c < k; c++) {\n const sz = readIndex(clusterSizes, c, \"clusterSizes\");\n if (sz <= 0) continue;\n\n const centroid = readIndex(centroids, c, \"centroids\");\n let distSq = 0;\n for (let f = 0; f < nFeatures; f++) {\n const d = (centroid[f] ?? 0) - (overallMean[f] ?? 0);\n distSq += d * d;\n }\n bgss += sz * distSq;\n }\n\n let wgss = 0;\n for (let i = 0; i < nSamples; i++) {\n const c = readIndex(codes, i, \"codes\");\n const centroid = readIndex(centroids, c, \"centroids\");\n\n const base = offset + i * sampleStride;\n for (let f = 0; f < nFeatures; f++) {\n const v = getNumericElement(data, base + f * featureStride);\n assertFiniteNumber(v, \"X\", `sample ${i}, feature ${f}`);\n const d = v - (centroid[f] ?? 0);\n wgss += d * d;\n }\n }\n\n if (k < 2 || wgss === 0) return 0;\n return bgss / (k - 1) / (wgss / (nSamples - k));\n}\n\n/**\n * Computes the Adjusted Rand Index (ARI).\n *\n * The ARI measures the similarity between two clusterings, adjusted for chance.\n * It ranges from -1 to 1, where 1 indicates perfect agreement, 0 indicates\n * random labeling, and negative values indicate worse than random.\n *\n * **Time Complexity**: O(n + k₁ * k₂) where k₁, k₂ are cluster counts\n * **Space Complexity**: O(k₁ * k₂)\n *\n * @param labelsTrue - Ground truth cluster labels\n * @param labelsPred - Predicted cluster labels\n * @returns Adjusted Rand Index in range [-1, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.adjusted_rand_score.html | Scikit-learn adjusted_rand_score}\n */\nexport function adjustedRandScore(labelsTrue: Tensor, labelsPred: Tensor): number {\n assertSameSize(labelsTrue, labelsPred, \"labelsTrue\", \"labelsPred\");\n\n const n = labelsTrue.size;\n if (n <= 1) return 1;\n\n const stats = buildContingencyStats(labelsTrue, labelsPred);\n const { contingencyDense, contingencySparse, trueCount, predCount } = stats;\n\n let sumComb = 0;\n\n if (contingencyDense) {\n for (let idx = 0; idx < contingencyDense.length; idx++) {\n const nij = readIndex(contingencyDense, idx, \"contingencyDense\");\n if (nij > 0) sumComb += comb2(nij);\n }\n } else if (contingencySparse) {\n for (const nij of contingencySparse.values()) {\n sumComb += comb2(nij);\n }\n }\n\n let sumCombTrue = 0;\n for (let i = 0; i < trueCount.length; i++) {\n sumCombTrue += comb2(readIndex(trueCount, i, \"trueCount\"));\n }\n\n let sumCombPred = 0;\n for (let j = 0; j < predCount.length; j++) {\n sumCombPred += comb2(readIndex(predCount, j, \"predCount\"));\n }\n\n const totalPairs = comb2(n);\n if (totalPairs === 0) return 1;\n\n const expectedIndex = (sumCombTrue * sumCombPred) / totalPairs;\n const maxIndex = (sumCombTrue + sumCombPred) / 2;\n\n const denom = maxIndex - expectedIndex;\n if (denom === 0) return 1;\n\n return (sumComb - expectedIndex) / denom;\n}\n\n/**\n * Computes the Adjusted Mutual Information (AMI) between two clusterings.\n *\n * AMI adjusts the Mutual Information score to account for chance, providing\n * a normalized measure of agreement between two clusterings.\n *\n * **Time Complexity**: O(n + k₁ * k₂ * min(k₁, k₂))\n * **Space Complexity**: O(k₁ * k₂ + n)\n *\n * @param labelsTrue - Ground truth cluster labels\n * @param labelsPred - Predicted cluster labels\n * @param averageMethod - Method to compute the normalizer: 'min', 'geometric', 'arithmetic' (default), or 'max'\n * @returns Adjusted Mutual Information score, typically in range [0, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.adjusted_mutual_info_score.html | Scikit-learn adjusted_mutual_info_score}\n */\nexport function adjustedMutualInfoScore(\n labelsTrue: Tensor,\n labelsPred: Tensor,\n averageMethod: AverageMethod = \"arithmetic\"\n): number {\n const stats = buildContingencyStats(labelsTrue, labelsPred);\n const { n, trueCount, predCount } = stats;\n if (n <= 1) return 1;\n\n const mi = mutualInformationFromContingency(stats);\n const hTrue = entropyFromCountArray(trueCount, n);\n const hPred = entropyFromCountArray(predCount, n);\n const emi = expectedMutualInformation(stats);\n\n const normalizer = averageEntropy(hTrue, hPred, averageMethod);\n if (Math.abs(normalizer) < 1e-15) return 1;\n\n const denom = normalizer - emi;\n if (Math.abs(denom) < 1e-15) return 0;\n\n const ami = (mi - emi) / denom;\n if (!Number.isFinite(ami)) return 0;\n if (ami > 1) return 1;\n if (ami < -1) return -1;\n return ami;\n}\n\n/**\n * Computes the Normalized Mutual Information (NMI) between two clusterings.\n *\n * NMI normalizes the Mutual Information score to scale between 0 and 1,\n * where 1 indicates perfect correlation between clusterings.\n *\n * **Time Complexity**: O(n + k₁ * k₂)\n * **Space Complexity**: O(k₁ * k₂)\n *\n * @param labelsTrue - Ground truth cluster labels\n * @param labelsPred - Predicted cluster labels\n * @param averageMethod - Method to compute the normalizer: 'min', 'geometric', 'arithmetic' (default), or 'max'\n * @returns Normalized Mutual Information score in range [0, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.normalized_mutual_info_score.html | Scikit-learn normalized_mutual_info_score}\n */\nexport function normalizedMutualInfoScore(\n labelsTrue: Tensor,\n labelsPred: Tensor,\n averageMethod: AverageMethod = \"arithmetic\"\n): number {\n const stats = buildContingencyStats(labelsTrue, labelsPred);\n const { n, trueCount, predCount } = stats;\n\n const mi = mutualInformationFromContingency(stats);\n const ht = entropyFromCountArray(trueCount, n);\n const hp = entropyFromCountArray(predCount, n);\n\n if (ht === 0 || hp === 0) {\n return ht === 0 && hp === 0 ? 1.0 : 0.0;\n }\n\n const normalizer = averageEntropy(ht, hp, averageMethod);\n if (normalizer === 0) return 0;\n\n const nmi = mi / normalizer;\n if (nmi > 1) return 1;\n if (nmi < 0) return 0;\n return nmi;\n}\n\n/**\n * Computes the Fowlkes-Mallows Index (FMI).\n *\n * The FMI is the geometric mean of pairwise precision and recall.\n * It ranges from 0 to 1, where 1 indicates perfect agreement.\n *\n * **Time Complexity**: O(n + k₁ * k₂)\n * **Space Complexity**: O(k₁ * k₂)\n *\n * @param labelsTrue - Ground truth cluster labels\n * @param labelsPred - Predicted cluster labels\n * @returns Fowlkes-Mallows score in range [0, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.fowlkes_mallows_score.html | Scikit-learn fowlkes_mallows_score}\n */\nexport function fowlkesMallowsScore(labelsTrue: Tensor, labelsPred: Tensor): number {\n const stats = buildContingencyStats(labelsTrue, labelsPred);\n const { contingencyDense, contingencySparse, trueCount, predCount, n } = stats;\n\n if (n === 0) return 1.0;\n\n let tk = 0;\n if (contingencyDense) {\n for (let idx = 0; idx < contingencyDense.length; idx++) {\n const nij = readIndex(contingencyDense, idx, \"contingencyDense\");\n if (nij > 0) tk += comb2(nij);\n }\n } else if (contingencySparse) {\n for (const nij of contingencySparse.values()) {\n tk += comb2(nij);\n }\n }\n\n let pk = 0;\n for (let i = 0; i < trueCount.length; i++) pk += comb2(readIndex(trueCount, i, \"trueCount\"));\n\n let qk = 0;\n for (let j = 0; j < predCount.length; j++) qk += comb2(readIndex(predCount, j, \"predCount\"));\n\n if (pk === 0 || qk === 0) return 0.0;\n return tk / Math.sqrt(pk * qk);\n}\n\n/**\n * Computes the homogeneity score of a clustering.\n *\n * A clustering result satisfies homogeneity if all of its clusters contain\n * only data points which are members of a single class. Score ranges from\n * 0 to 1, where 1 indicates perfectly homogeneous clustering.\n *\n * **Time Complexity**: O(n + k₁ * k₂)\n * **Space Complexity**: O(k₁ * k₂)\n *\n * @param labelsTrue - Ground truth class labels\n * @param labelsPred - Predicted cluster labels\n * @returns Homogeneity score in range [0, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.homogeneity_score.html | Scikit-learn homogeneity_score}\n */\nexport function homogeneityScore(labelsTrue: Tensor, labelsPred: Tensor): number {\n const stats = buildContingencyStats(labelsTrue, labelsPred);\n const { contingencyDense, contingencySparse, predCount, trueCount, nPred, n } = stats;\n\n if (n === 0) return 1.0;\n\n let hck = 0;\n\n if (contingencyDense) {\n for (let idx = 0; idx < contingencyDense.length; idx++) {\n const nij = readIndex(contingencyDense, idx, \"contingencyDense\");\n if (nij <= 0) continue;\n\n const p = idx - Math.floor(idx / nPred) * nPred;\n const nj = readIndex(predCount, p, \"predCount\");\n if (nj > 0) hck -= (nij / n) * Math.log(nij / nj);\n }\n } else if (contingencySparse) {\n for (const [key, nij] of contingencySparse) {\n if (nij <= 0) continue;\n\n const p = key - Math.floor(key / nPred) * nPred;\n const nj = readIndex(predCount, p, \"predCount\");\n if (nj > 0) hck -= (nij / n) * Math.log(nij / nj);\n }\n }\n\n const hc = entropyFromCountArray(trueCount, n);\n return hc === 0 ? 1.0 : 1.0 - hck / hc;\n}\n\n/**\n * Computes the completeness score of a clustering.\n *\n * A clustering result satisfies completeness if all data points that are\n * members of a given class are assigned to the same cluster. Score ranges\n * from 0 to 1, where 1 indicates perfectly complete clustering.\n *\n * **Time Complexity**: O(n + k₁ * k₂)\n * **Space Complexity**: O(k₁ * k₂)\n *\n * @param labelsTrue - Ground truth class labels\n * @param labelsPred - Predicted cluster labels\n * @returns Completeness score in range [0, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.completeness_score.html | Scikit-learn completeness_score}\n */\nexport function completenessScore(labelsTrue: Tensor, labelsPred: Tensor): number {\n const stats = buildContingencyStats(labelsTrue, labelsPred);\n const { contingencyDense, contingencySparse, trueCount, predCount, nPred, n } = stats;\n\n if (n === 0) return 1.0;\n\n let hkc = 0;\n\n if (contingencyDense) {\n for (let idx = 0; idx < contingencyDense.length; idx++) {\n const nij = readIndex(contingencyDense, idx, \"contingencyDense\");\n if (nij <= 0) continue;\n\n const t = Math.floor(idx / nPred);\n const ni = readIndex(trueCount, t, \"trueCount\");\n if (ni > 0) hkc -= (nij / n) * Math.log(nij / ni);\n }\n } else if (contingencySparse) {\n for (const [key, nij] of contingencySparse) {\n if (nij <= 0) continue;\n\n const t = Math.floor(key / nPred);\n const ni = readIndex(trueCount, t, \"trueCount\");\n if (ni > 0) hkc -= (nij / n) * Math.log(nij / ni);\n }\n }\n\n const hk = entropyFromCountArray(predCount, n);\n return hk === 0 ? 1.0 : 1.0 - hkc / hk;\n}\n\n/**\n * Computes the V-measure score of a clustering.\n *\n * V-measure is the harmonic mean of homogeneity and completeness, controlled\n * by the beta parameter. When beta > 1, completeness is weighted more; when\n * beta < 1, homogeneity is weighted more.\n *\n * **Formula**: v = (1 + beta) * h * c / (beta * h + c)\n *\n * **Time Complexity**: O(n + k₁ * k₂)\n * **Space Complexity**: O(k₁ * k₂)\n *\n * @param labelsTrue - Ground truth class labels\n * @param labelsPred - Predicted cluster labels\n * @param beta - Weight of homogeneity vs completeness (default: 1.0)\n * @returns V-measure score in range [0, 1]\n *\n * @throws {ShapeError} If labelsTrue and labelsPred have different sizes\n * @throws {DTypeError} If labels are string\n * @throws {InvalidParameterError} If beta is not a positive finite number\n * @throws {DataValidationError} If labels contain non-finite or non-integer values\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.v_measure_score.html | Scikit-learn v_measure_score}\n */\nexport function vMeasureScore(labelsTrue: Tensor, labelsPred: Tensor, beta = 1.0): number {\n if (!Number.isFinite(beta) || beta <= 0) {\n throw new InvalidParameterError(\"beta must be a positive finite number\", \"beta\", beta);\n }\n\n const h = homogeneityScore(labelsTrue, labelsPred);\n const c = completenessScore(labelsTrue, labelsPred);\n\n if (h + c === 0) return 0;\n return ((1 + beta) * h * c) / (beta * h + c);\n}\n","import {\n getNumericElement,\n isNumericTypedArray,\n isTypedArray,\n type NumericTypedArray,\n} from \"../core\";\nimport { DTypeError, InvalidParameterError } from \"../core/errors\";\nimport type { Tensor } from \"../ndarray\";\nimport {\n assertFiniteNumber,\n assertSameSizeVectors,\n createFlatOffsetter,\n type FlatOffsetter,\n} from \"./_internal\";\n\nfunction getNumericRegressionData(t: Tensor, name: string): NumericTypedArray {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${name} must be numeric tensors`);\n }\n if (t.dtype === \"int64\") {\n throw new DTypeError(`${name} must be numeric tensors (int64 not supported)`);\n }\n\n const data = t.data;\n if (!isTypedArray(data) || !isNumericTypedArray(data)) {\n throw new DTypeError(`${name} must be numeric tensors`);\n }\n\n return data;\n}\n\nfunction readNumeric(\n data: NumericTypedArray,\n offsetter: FlatOffsetter,\n index: number,\n name: string\n) {\n const value = getNumericElement(data, offsetter(index));\n assertFiniteNumber(value, name, `index ${index}`);\n return value;\n}\n\n/**\n * Calculate Mean Squared Error (MSE).\n *\n * Measures the average squared difference between predictions and actual values.\n * MSE is sensitive to outliers due to squaring the errors.\n *\n * **Formula**: MSE = (1/n) * Σ(y_true - y_pred)²\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns MSE value (always non-negative, 0 is perfect)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { mse, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const error = mse(yTrue, yPred); // 0.375\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html | Scikit-learn mean_squared_error}\n */\nexport function mse(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let sumSquaredError = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const diff =\n readNumeric(yTrueData, trueOffset, i, \"yTrue\") -\n readNumeric(yPredData, predOffset, i, \"yPred\");\n sumSquaredError += diff * diff;\n }\n\n return sumSquaredError / yTrue.size;\n}\n\n/**\n * Calculate Root Mean Squared Error (RMSE).\n *\n * Square root of MSE, expressed in the same units as the target variable.\n * RMSE is more interpretable than MSE as it's in the original scale.\n *\n * **Formula**: RMSE = √(MSE) = √((1/n) * Σ(y_true - y_pred)²)\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns RMSE value (always non-negative, 0 is perfect)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { rmse, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const error = rmse(yTrue, yPred); // √0.375 ≈ 0.612\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html | Scikit-learn mean_squared_error}\n */\nexport function rmse(yTrue: Tensor, yPred: Tensor): number {\n return Math.sqrt(mse(yTrue, yPred));\n}\n\n/**\n * Calculate Mean Absolute Error (MAE).\n *\n * Measures the average absolute difference between predictions and actual values.\n * MAE is more robust to outliers than MSE.\n *\n * **Formula**: MAE = (1/n) * Σ|y_true - y_pred|\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns MAE value (always non-negative, 0 is perfect)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { mae, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const error = mae(yTrue, yPred); // 0.5\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html | Scikit-learn mean_absolute_error}\n */\nexport function mae(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let sumAbsError = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const diff =\n readNumeric(yTrueData, trueOffset, i, \"yTrue\") -\n readNumeric(yPredData, predOffset, i, \"yPred\");\n sumAbsError += Math.abs(diff);\n }\n\n return sumAbsError / yTrue.size;\n}\n\n/**\n * Calculate R² (coefficient of determination) score.\n *\n * Represents the proportion of variance in the target variable that is\n * explained by the model. R² of 1 indicates perfect predictions, 0 indicates\n * the model is no better than predicting the mean, and negative values indicate\n * the model is worse than predicting the mean.\n *\n * **Formula**: R² = 1 - (SS_res / SS_tot)\n * - SS_res = Σ(y_true - y_pred)² (residual sum of squares)\n * - SS_tot = Σ(y_true - mean(y_true))² (total sum of squares)\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns R² score (1 is perfect, 0 is baseline, negative is worse than baseline)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {InvalidParameterError} If inputs are empty\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { r2Score, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const score = r2Score(yTrue, yPred); // Close to 1 for good fit\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html | Scikit-learn r2_score}\n */\nexport function r2Score(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n if (yTrue.size === 0) {\n throw new InvalidParameterError(\"r2Score requires at least one sample\", \"yTrue\", yTrue.size);\n }\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let sumTrue = 0;\n for (let i = 0; i < yTrue.size; i++) {\n sumTrue += readNumeric(yTrueData, trueOffset, i, \"yTrue\");\n }\n const mean = sumTrue / yTrue.size;\n\n let ssRes = 0;\n let ssTot = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumeric(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumeric(yPredData, predOffset, i, \"yPred\");\n ssRes += (trueVal - predVal) ** 2;\n ssTot += (trueVal - mean) ** 2;\n }\n\n // Handle constant targets (ssTot = 0)\n // When all true values are identical, return 0.0 (no variance to explain)\n if (ssTot === 0) {\n return ssRes === 0 ? 1.0 : 0.0;\n }\n\n return 1 - ssRes / ssTot;\n}\n\n/**\n * Calculate Adjusted R² score.\n *\n * R² adjusted for the number of features in the model. Penalizes the addition\n * of features that don't improve the model. More appropriate than R² when\n * comparing models with different numbers of features.\n *\n * **Formula**: Adjusted R² = 1 - ((1 - R²) * (n - 1)) / (n - p - 1)\n * - n = number of samples\n * - p = number of features\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * **Constraints**: Requires n > p + 1 (more samples than features + 1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @param nFeatures - Number of features (predictors) used in the model\n * @returns Adjusted R² score\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {InvalidParameterError} If nFeatures is not a non-negative integer, n <= p + 1, or inputs are empty\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { adjustedR2Score, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const score = adjustedR2Score(yTrue, yPred, 2); // Adjusted for 2 features\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Coefficient_of_determination#Adjusted_R2 | Wikipedia: Adjusted R²}\n */\nexport function adjustedR2Score(yTrue: Tensor, yPred: Tensor, nFeatures: number): number {\n if (!Number.isFinite(nFeatures) || !Number.isInteger(nFeatures) || nFeatures < 0) {\n throw new InvalidParameterError(\n \"nFeatures must be a non-negative integer\",\n \"nFeatures\",\n nFeatures\n );\n }\n\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const n = yTrue.size;\n const p = nFeatures;\n\n // Validate sufficient samples\n if (n <= p + 1) {\n throw new InvalidParameterError(\n `Adjusted R² requires n > p + 1 (samples > features + 1). Got n=${n}, p=${p}`,\n \"nFeatures\",\n nFeatures\n );\n }\n\n const r2 = r2Score(yTrue, yPred);\n\n return 1 - ((1 - r2) * (n - 1)) / (n - p - 1);\n}\n\n/**\n * Calculate Mean Absolute Percentage Error (MAPE).\n *\n * Measures the average absolute percentage difference between predictions\n * and actual values. Expressed as a percentage, making it scale-independent\n * and easy to interpret.\n *\n * **Formula**: MAPE = (100/m) * Σ|((y_true - y_pred) / y_true)|\n * where m is the number of non-zero targets.\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * **Important**: Zero values in yTrue are skipped. If all targets are zero,\n * this function returns 0.\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns MAPE value as percentage (0 is perfect, lower is better)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { mape, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const error = mape(yTrue, yPred); // Percentage error\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_percentage_error.html | Scikit-learn MAPE}\n */\nexport function mape(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n if (yTrue.size === 0) return 0;\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let sumPercentError = 0;\n let nonZeroCount = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumeric(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumeric(yPredData, predOffset, i, \"yPred\");\n if (trueVal !== 0) {\n sumPercentError += Math.abs((trueVal - predVal) / trueVal);\n nonZeroCount++;\n }\n }\n\n if (nonZeroCount === 0) {\n return 0;\n }\n\n return (sumPercentError / nonZeroCount) * 100;\n}\n\n/**\n * Calculate Median Absolute Error (MedAE).\n *\n * Measures the median of absolute differences between predictions and actual values.\n * More robust to outliers than MAE or MSE as it uses the median instead of mean.\n *\n * **Formula**: MedAE = median(|y_true - y_pred|)\n *\n * **Time Complexity**: O(n log n) due to sorting for median calculation\n * **Space Complexity**: O(n) for storing error array\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns Median absolute error (always non-negative, 0 is perfect)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { medianAbsoluteError, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const error = medianAbsoluteError(yTrue, yPred);\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.median_absolute_error.html | Scikit-learn median_absolute_error}\n */\nexport function medianAbsoluteError(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n\n if (yTrue.size === 0) return 0;\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n const errors: number[] = [];\n for (let i = 0; i < yTrue.size; i++) {\n const diff = Math.abs(\n readNumeric(yTrueData, trueOffset, i, \"yTrue\") -\n readNumeric(yPredData, predOffset, i, \"yPred\")\n );\n errors.push(diff);\n }\n\n errors.sort((a, b) => a - b);\n const mid = Math.floor(errors.length / 2);\n return errors.length % 2 !== 0\n ? (errors[mid] ?? 0)\n : ((errors[mid - 1] ?? 0) + (errors[mid] ?? 0)) / 2;\n}\n\n/**\n * Calculate maximum residual error.\n *\n * Returns the maximum absolute difference between predictions and actual values.\n * Useful for identifying the worst-case prediction error.\n *\n * **Formula**: max_error = max(|y_true - y_pred|)\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns Maximum absolute error (always non-negative, 0 is perfect)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { maxError, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const error = maxError(yTrue, yPred); // 1.0 (worst prediction)\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.max_error.html | Scikit-learn max_error}\n */\nexport function maxError(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let maxErr = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const diff = Math.abs(\n readNumeric(yTrueData, trueOffset, i, \"yTrue\") -\n readNumeric(yPredData, predOffset, i, \"yPred\")\n );\n maxErr = Math.max(maxErr, diff);\n }\n\n return maxErr;\n}\n\n/**\n * Calculate explained variance score.\n *\n * Measures the proportion of variance in the target variable that is explained\n * by the model. Similar to R² but uses variance instead of sum of squares.\n * Best possible score is 1.0, lower values are worse.\n *\n * **Formula**: explained_variance = 1 - Var(y_true - y_pred) / Var(y_true)\n *\n * **Time Complexity**: O(n) where n is the number of samples\n * **Space Complexity**: O(1)\n *\n * @param yTrue - Ground truth (correct) target values\n * @param yPred - Estimated target values\n * @returns Explained variance score (1.0 is perfect, lower is worse)\n *\n * @throws {ShapeError} If yTrue and yPred have different sizes or are not 1D/column vectors\n * @throws {DTypeError} If yTrue or yPred is non-numeric or int64\n * @throws {InvalidParameterError} If inputs are empty\n * @throws {DataValidationError} If inputs contain NaN or infinite values\n *\n * @example\n * ```ts\n * import { explainedVarianceScore, tensor } from 'deepbox/metrics';\n *\n * const yTrue = tensor([3, -0.5, 2, 7]);\n * const yPred = tensor([2.5, 0.0, 2, 8]);\n * const score = explainedVarianceScore(yTrue, yPred);\n * ```\n *\n * @see {@link https://scikit-learn.org/stable/modules/generated/sklearn.metrics.explained_variance_score.html | Scikit-learn explained_variance_score}\n */\nexport function explainedVarianceScore(yTrue: Tensor, yPred: Tensor): number {\n assertSameSizeVectors(yTrue, yPred, \"yTrue\", \"yPred\");\n const yTrueData = getNumericRegressionData(yTrue, \"yTrue\");\n const yPredData = getNumericRegressionData(yPred, \"yPred\");\n if (yTrue.size === 0) {\n throw new InvalidParameterError(\n \"explainedVarianceScore requires at least one sample\",\n \"yTrue\",\n yTrue.size\n );\n }\n\n const trueOffset = createFlatOffsetter(yTrue);\n const predOffset = createFlatOffsetter(yPred);\n\n let sumTrue = 0;\n let sumResidual = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumeric(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumeric(yPredData, predOffset, i, \"yPred\");\n sumTrue += trueVal;\n sumResidual += trueVal - predVal;\n }\n const meanTrue = sumTrue / yTrue.size;\n const meanResidual = sumResidual / yTrue.size;\n\n let varResidual = 0;\n let varTrue = 0;\n for (let i = 0; i < yTrue.size; i++) {\n const trueVal = readNumeric(yTrueData, trueOffset, i, \"yTrue\");\n const predVal = readNumeric(yPredData, predOffset, i, \"yPred\");\n const residual = trueVal - predVal;\n varResidual += (residual - meanResidual) ** 2;\n varTrue += (trueVal - meanTrue) ** 2;\n }\n\n // Handle constant targets (varTrue = 0)\n // When all true values are identical, return 0.0 (no variance to explain)\n if (varTrue === 0) {\n return varResidual === 0 ? 1.0 : 0.0;\n }\n\n return 1 - varResidual / varTrue;\n}\n"]}
|