{"version":3,"file":"druid.cjs","sources":["../src/metrics/bray_curtis.js","../src/metrics/canberra.js","../src/metrics/chebyshev.js","../src/metrics/cosine.js","../src/metrics/euclidean_squared.js","../src/metrics/euclidean.js","../src/metrics/goodman_kruskal.js","../src/metrics/hamming.js","../src/metrics/haversine.js","../src/metrics/jaccard.js","../src/metrics/manhattan.js","../src/metrics/sokal_michener.js","../src/metrics/wasserstein.js","../src/metrics/yule.js","../src/matrix/distance_matrix.js","../src/matrix/k_nearest_neighbors.js","../src/matrix/linspace.js","../src/linear_algebra/inner_product.js","../src/numerical/kahan_sum.js","../src/numerical/neumair_sum.js","../src/linear_algebra/qr.js","../src/linear_algebra/qr_householder.js","../src/util/max.js","../src/util/min.js","../src/util/randomizer.js","../src/linear_algebra/simultaneous_poweriteration.js","../src/matrix/Matrix.js","../src/matrix/norm.js","../src/matrix/normalize.js","../src/clustering/Clustering.js","../src/clustering/CURE.js","../src/clustering/Hierarchical_Clustering.js","../src/datastructure/DisjointSet.js","../src/datastructure/Heap.js","../src/clustering/KMeans.js","../src/clustering/KMedoids.js","../src/clustering/MeanShift.js","../src/clustering/OPTICS.js","../src/clustering/XMeans.js","../src/dimred/DR.js","../src/dimred/FASTMAP.js","../src/knn/KNN.js","../src/knn/Annoy.js","../src/knn/BallTree.js","../src/knn/HNSW.js","../src/knn/KDTree.js","../src/knn/LSH.js","../src/knn/NaiveKNN.js","../src/knn/NNDescent.js","../src/dimred/SMACOF.js","../src/dimred/ISOMAP.js","../src/dimred/LDA.js","../src/dimred/LLE.js","../src/dimred/MDS.js","../src/dimred/LSP.js","../src/dimred/LTSA.js","../src/dimred/PCA.js","../src/dimred/SAMMON.js","../src/dimred/SQDMDS.js","../src/dimred/TopoMap.js","../src/dimred/TriMap.js","../src/dimred/TSNE.js","../src/optimization/powell.js","../src/dimred/UMAP.js","../src/index.js"],"sourcesContent":["/**\n * Computes the Bray-Curtis distance between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The Bray-Curtis distance between `a` and `b`.\n * @see {@link https://en.wikipedia.org/wiki/Bray%E2%80%93Curtis_dissimilarity}\n */\nexport function bray_curtis(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    let sum_abs_diff = 0;\n    let sum_ab = 0;\n    for (let i = 0; i < a.length; ++i) {\n        sum_abs_diff += Math.abs(a[i] - b[i]);\n        sum_ab += a[i] + b[i];\n    }\n    return sum_abs_diff / sum_ab;\n}\n","/**\n * Computes the canberra distance between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The canberra distance between `a` and `b`.\n * @see {@link https://en.wikipedia.org/wiki/Canberra_distance}\n */\nexport function canberra(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let sum = 0;\n    for (let i = 0; i < n; ++i) {\n        sum += Math.abs(a[i] - b[i]) / (Math.abs(a[i]) + Math.abs(b[i]));\n    }\n    return sum;\n}\n","/**\n * Computes the chebyshev distance (L<sub>∞</sub>) between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The chebyshev distance between `a` and `b`.\n */\nexport function chebyshev(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    const res = [];\n    for (let i = 0; i < n; ++i) {\n        res.push(Math.abs(a[i] - b[i]));\n    }\n    return Math.max(...res);\n}\n","/**\n * Computes the cosine distance (not similarity) between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The cosine distance between `a` and `b`.\n * @example\n * import { cosine } from \"@saehrimnir/druidjs\";\n * const a = [1, 2, 3];\n * const b = [4, 5, 6];\n * const distance = cosine(a, b); // 0.9746318461970762\n */\nexport function cosine(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let sum = 0;\n    let sum_a = 0;\n    let sum_b = 0;\n    for (let i = 0; i < n; ++i) {\n        sum += a[i] * b[i];\n        sum_a += a[i] * a[i];\n        sum_b += b[i] * b[i];\n    }\n    return Math.acos(sum / (Math.sqrt(sum_a) * Math.sqrt(sum_b)));\n}\n","/**\n * Computes the squared euclidean distance (l_2^2) between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The squared euclidean distance between `a` and `b`.\n\n */\nexport function euclidean_squared(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let sum = 0;\n    for (let i = 0; i < n; ++i) {\n        const a_b = a[i] - b[i];\n        sum += a_b * a_b;\n    }\n    return sum;\n}\n","import { euclidean_squared } from \"../metrics/euclidean_squared.js\";\n\n/**\n * Computes the euclidean distance (`l_2`) between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The euclidean distance between `a` and `b`.\n */\nexport function euclidean(a, b) {\n    return Math.sqrt(euclidean_squared(a, b));\n}\n","/**\n * Computes the Goodman-Kruskal gamma coefficient for ordinal association.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a - First categorical/ordinal variable\n * @param {number[] | Float64Array} b - Second categorical/ordinal variable\n * @returns {number} The Goodman-Kruskal gamma coefficient between `a` and `b` (-1 to 1).\n * @see {@link https://en.wikipedia.org/wiki/Goodman_and_Kruskal%27s_gamma}\n */\nexport function goodman_kruskal(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    if (n < 2) return 0;\n\n    let concordant = 0;\n    let discordant = 0;\n    let tie_a = 0;\n    let tie_b = 0;\n\n    for (let i = 0; i < n; ++i) {\n        for (let j = i + 1; j < n; ++j) {\n            const a_diff = a[i] - a[j];\n            const b_diff = b[i] - b[j];\n            const a_tied = a_diff === 0;\n            const b_tied = b_diff === 0;\n\n            if (a_tied && b_tied) {\n            } else if (a_tied) {\n                tie_a++;\n            } else if (b_tied) {\n                tie_b++;\n            } else if (a_diff * b_diff > 0) {\n                concordant++;\n            } else {\n                discordant++;\n            }\n        }\n    }\n\n    const denominator = concordant + discordant + tie_a + tie_b;\n    if (denominator === 0) return 0;\n\n    const numerator = concordant + discordant;\n    if (numerator === 0) return 0;\n\n    return (concordant - discordant) / numerator;\n}\n","/**\n * Computes the hamming distance between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The hamming distance between `a` and `b`.\n */\nexport function hamming(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let disagree = 0;\n    for (let i = 0; i < n; ++i) {\n        const x = a[i];\n        const y = b[i];\n        disagree += x !== y ? 1 : 0;\n    }\n    return disagree / n;\n}\n","/**\n * Computes the Haversine distance between two points on a sphere of unit length 1. Multiply the result with the radius of the sphere. (For instance Earth's radius is 6371km)\n *\n * @category Metrics\n * @param {number[] | Float64Array} a - Point [lat1, lon1] in radians\n * @param {number[] | Float64Array} b - Point [lat2, lon2] in radians\n * @returns {number} The Haversine distance between `a` and `b`.\n * @see {@link https://en.wikipedia.org/wiki/Haversine_formula}\n */\nexport function haversine(a, b) {\n    if (a.length !== 2 || b.length !== 2)\n        throw new Error(\"Haversine distance requires exactly 2 coordinates [lat, lon] for each point!\");\n    const lat1 = a[0];\n    const lon1 = a[1];\n    const lat2 = b[0];\n    const lon2 = b[1];\n\n    const dlat = lat2 - lat1;\n    const dlon = lon2 - lon1;\n\n    const sin_dlat2 = Math.sin(dlat / 2);\n    const sin_dlon2 = Math.sin(dlon / 2);\n\n    const x = sin_dlat2 * sin_dlat2 + Math.cos(lat1) * Math.cos(lat2) * sin_dlon2 * sin_dlon2;\n    const c = 2 * Math.atan2(Math.sqrt(x), Math.sqrt(1 - x));\n\n    return c;\n}\n","/**\n * Computes the jaccard distance between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The jaccard distance between `a` and `b`.\n */\nexport function jaccard(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let num_non_zero = 0;\n    let num_equal = 0;\n    for (let i = 0; i < n; ++i) {\n        const x = a[i] !== 0;\n        const y = b[i] !== 0;\n        num_non_zero += x || y ? 1 : 0;\n        num_equal += x && y ? 1 : 0;\n    }\n    return (num_non_zero - num_equal) / num_non_zero;\n}\n","/**\n * Computes the manhattan distance (`l_1`) between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The manhattan distance between `a` and `b`.\n */\nexport function manhattan(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let sum = 0;\n    for (let i = 0; i < n; ++i) {\n        sum += Math.abs(a[i] - b[i]);\n    }\n    return sum;\n}\n","/**\n * Computes the Sokal-Michener distance between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The Sokal-Michener distance between `a` and `b`.\n\n */\nexport function sokal_michener(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let num_not_equal = 0;\n    for (let i = 0; i < n; ++i) {\n        const x = a[i] !== 0;\n        const y = b[i] !== 0;\n        num_not_equal += x !== y ? 1 : 0;\n    }\n    return (2 * num_not_equal) / (n + num_not_equal);\n}\n","/**\n * Computes the 1D Wasserstein distance (Earth Mover's Distance) between two distributions.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a - First distribution (histogram or probability mass)\n * @param {number[] | Float64Array} b - Second distribution (histogram or probability mass)\n * @returns {number} The Wasserstein/EMD distance between `a` and `b`.\n * @see {@link https://en.wikipedia.org/wiki/Wasserstein_metric}\n */\nexport function wasserstein(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let sumA = 0;\n    let sumB = 0;\n    for (let i = 0; i < n; i++) {\n        sumA += a[i];\n        sumB += b[i];\n    }\n\n    // Fallback if sums are 0\n    if (sumA === 0 && sumB === 0) return 0;\n    if (sumA === 0 || sumB === 0) return Infinity;\n\n    let distance = 0;\n    let cumA = 0;\n    let cumB = 0;\n    for (let i = 0; i < n; i++) {\n        cumA += a[i] / sumA;\n        cumB += b[i] / sumB;\n        distance += Math.abs(cumA - cumB);\n    }\n    return distance;\n}\n","/**\n * Computes the yule distance between `a` and `b`.\n *\n * @category Metrics\n * @param {number[] | Float64Array} a\n * @param {number[] | Float64Array} b\n * @returns {number} The yule distance between `a` and `b`.\n */\nexport function yule(a, b) {\n    if (a.length !== b.length) throw new Error(\"Vector a and b needs to be of the same length!\");\n    const n = a.length;\n    let num_true_true = 0;\n    let num_true_false = 0;\n    let num_false_true = 0;\n    for (let i = 0; i < n; ++i) {\n        const x = a[i] !== 0;\n        const y = b[i] !== 0;\n        num_true_true += x && y ? 1 : 0;\n        num_true_false += x && !y ? 1 : 0;\n        num_false_true += !x && y ? 1 : 0;\n    }\n    const num_false_false = n - num_true_true - num_true_false - num_false_true;\n    return num_true_false === 0 || num_false_true === 0\n        ? 0\n        : (2 * num_true_false * num_false_true) / (num_true_true * num_false_false + num_true_false * num_false_true);\n}\n","import { euclidean } from \"../metrics/index.js\";\nimport { Matrix } from \"./index.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n\n/**\n * @param {Matrix | Float64Array[] | number[][]} A\n * @returns {A is Matrix}\n */\nfunction isMatrix(A) {\n    return A instanceof Matrix;\n}\n\n/**\n * Computes the distance matrix of datamatrix `A`.\n *\n * @category Matrix\n * @param {Matrix | Float64Array[] | number[][]} A - Matrix.\n * @param {Metric} [metric=euclidean] - The diistance metric. Default is `euclidean`\n * @returns {Matrix} The distance matrix of `A`.\n */\nexport function distance_matrix(A, metric = euclidean) {\n    /** @type {number} */\n    const n = isMatrix(A) ? A.shape[0] : A.length;\n    const D = new Matrix(n, n);\n    for (let i = 0; i < n; ++i) {\n        const A_i = isMatrix(A) ? A.row(i) : A[i];\n        for (let j = i + 1; j < n; ++j) {\n            const dist = metric(A_i, isMatrix(A) ? A.row(j) : A[j]);\n            D.set_entry(i, j, dist);\n            D.set_entry(j, i, dist);\n        }\n    }\n    return D;\n}\n","//@ts-check\n\nimport { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n\n/**\n * Computes the k-nearest neighbors of each row of `A`.\n *\n * @category Matrix\n * @param {Matrix} A - Either the data matrix, or a distance matrix.\n * @param {number} k - The number of neighbors to compute.\n * @param {Metric | \"precomputed\"} [metric=euclidean] Default is `euclidean`\n * @returns {{ i: number; j: number; distance: number }[][]} The kNN graph.\n */\nexport function k_nearest_neighbors(A, k, metric = euclidean) {\n    A = A instanceof Matrix ? A : Matrix.from(A);\n    const rows = A.shape[0];\n    const D = metric === \"precomputed\" ? A : distance_matrix(A, metric);\n    /** @type {{ i: number; j: number; distance: number }[][]} */\n    const nN = [];\n    for (let row = 0; row < rows; ++row) {\n        const res = Array.from(D.row(row))\n            .map((distance, col) => {\n                return {\n                    i: row,\n                    j: col,\n                    distance: distance,\n                };\n            })\n            .sort((a, b) => a.distance - b.distance)\n            .slice(1, k + 1);\n        nN.push(res);\n    }\n    return nN;\n}\n","/**\n * Creates an Array containing `number` numbers from `start` to `end`. If `number = null`.\n *\n * @category Matrix\n * @param {number} start - Start value.\n * @param {number} end - End value.\n * @param {number} [number] - Number of number between `start` and `end`.\n * @returns {number[]} An array with `number` entries, beginning at `start` ending at `end`.\n */\nexport function linspace(start, end, number) {\n    if (number === undefined || number === null) {\n        number = Math.max(Math.round(end - start) + 1, 1);\n    }\n    if (number < 2) {\n        return number === 1 ? [start] : [];\n    }\n    const result = new Array(number);\n    number -= 1;\n    for (let i = number; i >= 0; --i) {\n        result[i] = (i * end + (number - i) * start) / number;\n    }\n    return result;\n}\n","/**\n * Computes the inner product between two arrays of the same length.\n *\n * @category Linear Algebra\n * @param {number[] | Float64Array} a - Array a.\n * @param {number[] | Float64Array} b - Array b.\n * @returns The inner product between `a` and `b`.\n */\nexport function inner_product(a, b) {\n    const N = a.length;\n    if (N !== b.length) {\n        throw new Error(\"Array a and b must have the same length!\");\n    }\n    let sum = 0;\n    for (let i = 0; i < N; ++i) {\n        sum += a[i] * b[i];\n    }\n    return sum;\n}\n","/**\n * Numerical stable summation with the Kahan summation algorithm.\n *\n * @category Numerical\n * @param {number[] | Float64Array} summands - Array of values to sum up.\n * @returns {number} The sum.\n * @see {@link https://en.wikipedia.org/wiki/Kahan_summation_algorithm}\n */\nexport function kahan_sum(summands) {\n    const n = summands.length;\n    let sum = 0;\n    let compensation = 0;\n    let y, t;\n\n    for (let i = 0; i < n; ++i) {\n        y = summands[i] - compensation;\n        t = sum + y;\n        compensation = t - sum - y;\n        sum = t;\n    }\n    return sum;\n}\n","/**\n * Numerical stable summation with the Neumair summation algorithm.\n *\n * @category Numerical\n * @param {number[] | Float64Array} summands - Array of values to sum up.\n * @returns {number} The sum.\n * @see {@link https://en.wikipedia.org/wiki/Kahan_summation_algorithm#Further_enhancements}\n */\nexport function neumair_sum(summands) {\n    const n = summands.length;\n    let sum = 0;\n    let compensation = 0;\n\n    for (let i = 0; i < n; ++i) {\n        const summand = summands[i];\n        const t = sum + summand;\n        if (Math.abs(sum) >= Math.abs(summand)) {\n            compensation += sum - t + summand;\n        } else {\n            compensation += summand - t + sum;\n        }\n        sum = t;\n    }\n    return sum + compensation;\n}\n","import { Matrix, norm } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { neumair_sum } from \"../numerical/index.js\";\n\n/**\n * Computes the QR Decomposition of the Matrix `A` using Gram-Schmidt process.\n *\n * @category Linear Algebra\n * @param {Matrix} A\n * @returns {{ R: Matrix; Q: Matrix }}\n * @see {@link https://en.wikipedia.org/wiki/QR_decomposition#Using_the_Gram%E2%80%93Schmidt_process}\n */\nexport function qr(A) {\n    const [rows, cols] = A.shape;\n    const Q = new Matrix(rows, cols, \"identity\");\n    const R = new Matrix(cols, cols, 0);\n\n    for (let j = 0; j < cols; ++j) {\n        const v = A.col(j);\n        for (let i = 0; i < j; ++i) {\n            const q = Q.col(i);\n            const q_dot_v = neumair_sum(q.map((q_, k) => q_ * v[k]));\n            for (let k = 0; k < rows; ++k) {\n                v[k] -= q_dot_v * q[k];\n            }\n            R.set_entry(i, j, q_dot_v);\n        }\n        const v_norm = norm(v, euclidean);\n        for (let k = 0; k < rows; ++k) {\n            Q.set_entry(k, j, v[k] / v_norm);\n        }\n        R.set_entry(j, j, v_norm);\n    }\n    return { R, Q };\n}\n","import { Matrix, norm } from \"../matrix/index.js\";\n\n/**\n * Computes the QR Decomposition of the Matrix `A` with householder transformations.\n *\n * @category Linear Algebra\n * @param {Matrix} A\n * @returns {{ R: Matrix; Q: Matrix }}\n * @see {@link https://en.wikipedia.org/wiki/QR_decomposition#Using_Householder_reflections}\n * @see {@link http://mlwiki.org/index.php/Householder_Transformation}\n */\nexport function qr_householder(A) {\n    const [rows, cols] = A.shape;\n    const Q = new Matrix(rows, rows, \"I\");\n    const R = A.clone();\n\n    for (let j = 0; j < cols; ++j) {\n        const x = Matrix.from_vector(R.col(j).slice(j), \"row\");\n        const x_norm = norm(x);\n        const x0 = x.entry(0, 0);\n        const rho = -Math.sign(x0);\n        const u1 = x0 - rho * x_norm;\n        const u = x.divide(u1).set_entry(0, 0, 1);\n        const beta = (-rho * u1) / x_norm;\n\n        const u_outer_u = u.outer(u);\n        const R_block = R.get_block(j, 0);\n        const new_R = R_block.sub(u_outer_u.dot(R_block).mult(beta));\n        const Q_block = Q.get_block(0, j);\n        const new_Q = Q_block.sub(Q_block.dot(u_outer_u).mult(beta));\n        R.set_block(j, 0, new_R);\n        Q.set_block(0, j, new_Q);\n    }\n    return { R, Q };\n}\n","/**\n * Returns maximum in Array `values`.\n *\n * @category Utils\n * @param {Iterable<number | null>} values\n * @returns {number}\n */\nexport function max(values) {\n    let max = -Infinity;\n    for (const value of values) {\n        if (value !== null && max < value) {\n            max = value;\n        }\n    }\n    return max;\n}\n","/**\n * Returns maximum in Array `values`.\n *\n * @category Utils\n * @param {Iterable<number | null>} values\n * @returns {number}\n */\nexport function min(values) {\n    let min = Infinity;\n    for (const value of values) {\n        if (value !== null && min > value) {\n            min = value;\n        }\n    }\n    return min;\n}\n","import { linspace } from \"../matrix/index.js\";\n\n/**\n * @category Utils\n * @class\n */\nexport class Randomizer {\n    _N = 624;\n    _M = 397;\n    _MATRIX_A = 0x9908b0df;\n    _UPPER_MASK = 0x80000000;\n    _LOWER_MASK = 0x7fffffff;\n\n    /** @type {number[]} */\n    _mt;\n    /** @type {number} */\n    _mti;\n    /** @type {number} */\n    _seed;\n\n    /**\n     * Mersenne Twister random number generator.\n     *\n     * @param {number} [_seed=new Date().getTime()] - The seed for the random number generator. If `_seed == null` then\n     *   the actual time gets used as seed. Default is `new Date().getTime()`\n     * @see https://github.com/bmurray7/mersenne-twister-examples/blob/master/javascript-mersenne-twister.js\n     */\n    constructor(_seed) {\n        this._mt = new Array(this._N);\n        this._mti = this._N + 1;\n        this._seed = _seed ?? Date.now();\n        this.seed = this._seed;\n    }\n\n    /** @type {number} seed */\n    set seed(_seed) {\n        this._seed = _seed;\n        const mt = this._mt;\n\n        mt[0] = _seed >>> 0;\n        for (this._mti = 1; this._mti < this._N; this._mti += 1) {\n            const mti = this._mti;\n            const s = mt[mti - 1] ^ (mt[mti - 1] >>> 30);\n            mt[mti] = ((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253 + mti;\n            mt[mti] >>>= 0;\n        }\n    }\n\n    /**\n     * Returns the seed of the random number generator.\n     *\n     * @returns {number} - The seed.\n     */\n    get seed() {\n        return this._seed;\n    }\n\n    /**\n     * Returns a float between 0 and 1.\n     *\n     * @returns {number} - A random number between [0, 1]\n     */\n    get random() {\n        return this.random_int * (1.0 / 4294967296.0);\n    }\n\n    /**\n     * Returns an integer between 0 and MAX_INTEGER.\n     *\n     * @returns {number} - A random integer.\n     */\n    get random_int() {\n        let y,\n            mag01 = [0x0, this._MATRIX_A];\n        if (this._mti >= this._N) {\n            let kk;\n\n            /* if (this._mti == this._N + 1) {\n                this.seed = 5489;\n            } */\n\n            const N_M = this._N - this._M;\n            const M_N = this._M - this._N;\n\n            for (kk = 0; kk < N_M; ++kk) {\n                y = (this._mt[kk] & this._UPPER_MASK) | (this._mt[kk + 1] & this._LOWER_MASK);\n                this._mt[kk] = this._mt[kk + this._M] ^ (y >>> 1) ^ mag01[y & 0x1];\n            }\n            for (; kk < this._N - 1; ++kk) {\n                y = (this._mt[kk] & this._UPPER_MASK) | (this._mt[kk + 1] & this._LOWER_MASK);\n                this._mt[kk] = this._mt[kk + M_N] ^ (y >>> 1) ^ mag01[y & 0x1];\n            }\n\n            y = (this._mt[this._N - 1] & this._UPPER_MASK) | (this._mt[0] & this._LOWER_MASK);\n            this._mt[this._N - 1] = this._mt[this._M - 1] ^ (y >>> 1) ^ mag01[y & 0x1];\n\n            this._mti = 0;\n        }\n        this._mti += 1;\n        y = this._mt[this._mti];\n        y ^= y >>> 11;\n        y ^= (y << 7) & 0x9d2c5680;\n        y ^= (y << 15) & 0xefc60000;\n        y ^= y >>> 18;\n\n        return y >>> 0;\n    }\n\n    gauss_random() {\n        let x, y, r;\n        if (this._val != null) {\n            x = this._val;\n            this._val = null;\n            return x;\n        } else\n            do {\n                x = 2 * this.random - 1;\n                y = 2 * this.random - 1;\n                r = x * x + y * y;\n            } while (!r || r > 1);\n        const c = Math.sqrt((-2 * Math.log(r)) / r);\n        this._val = y * c; // cache this for next function call for efficiency\n        return x * c;\n    }\n\n    /**\n     * @template T Returns samples from an input Matrix or Array.\n     * @param {T[]} A - The input Matrix or Array.\n     * @param {number} n - The number of samples.\n     * @returns {T[]} A random selection form `A` of `n` samples.\n     */\n    choice(A, n) {\n        if (!Array.isArray(A)) throw new Error(\"A must be an Array!\");\n        // if (A instanceof Matrix) {\n        //     let rows = A.shape[0];\n        //     if (n > rows) {\n        //         throw new Error(\"n bigger than A!\");\n        //     }\n        //     /** @type {number[]} */\n        //     let sample = new Array(n);\n        //     let index_list = linspace(0, rows - 1);\n        //     for (let i = 0, l = index_list.length; i < n; ++i, --l) {\n        //         let random_index = this.random_int % l;\n        //         sample[i] = index_list.splice(random_index, 1)[0];\n        //     }\n        //     return sample.map((d) => A.row(d));\n        // } else if (Array.isArray(A) || A instanceof Float64Array) {\n        const rows = A.length;\n        if (n > rows) {\n            throw new Error(\"n bigger than A!\");\n        }\n        const sample = new Array(n);\n        const index_list = linspace(0, rows - 1);\n        for (let i = 0, l = index_list.length; i < n; ++i, --l) {\n            const random_index = this.random_int % l;\n            sample[i] = index_list.splice(random_index, 1)[0];\n        }\n        return sample.map((d) => A[d]);\n        //} else {\n        //throw new Error(\"A must be of type Matrix or Float64Array or number[]!\");\n        // }\n    }\n\n    /**\n     * @template T Returns samples from an input Matrix or Array.\n     * @param {T[]} A - The input Matrix or Array.\n     * @param {number} n - The number of samples.\n     * @param {number} seed - The seed for the random number generator.\n     * @returns {T[]} - A random selection form `A` of `n` samples.\n     */\n    static choice(A, n, seed = 1212) {\n        const R = new Randomizer(seed);\n        return R.choice(A, n);\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean_squared } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { qr as qr_gramschmidt } from \"./index.js\";\n\n/** @import { EigenArgs } from \"./index.js\" */\n\n/**\n * Computes the `k` biggest Eigenvectors and Eigenvalues from Matrix `A` with the QR-Algorithm.\n *\n * @category Linear Algebra\n * @param {Matrix} A - The Matrix\n * @param {number} k - The number of eigenvectors and eigenvalues to compute.\n * @param {EigenArgs} parameters - Object containing parameterization of the simultanious\n *   poweriteration method.\n * @returns {{ eigenvalues: Float64Array; eigenvectors: Float64Array[] }} The `k` biggest eigenvectors and eigenvalues\n *   of Matrix `A`.\n */\nexport function simultaneous_poweriteration(\n    A,\n    k = 2,\n    { seed = 1212, max_iterations = 100, qr = qr_gramschmidt, tol = 1e-8 } = {},\n) {\n    const randomizer = seed instanceof Randomizer ? seed : new Randomizer(seed);\n    if (!(A instanceof Matrix)) A = Matrix.from(A);\n    const n = A.shape[0];\n    let { Q, R } = qr(new Matrix(n, k, () => (randomizer.random - 0.5) * 2));\n    while (max_iterations--) {\n        const oldQ = Q;\n        const Z = A.dot(Q);\n        const QR = qr(Z);\n        Q = QR.Q;\n        R = QR.R;\n        const error = euclidean_squared(Q.values, oldQ.values);\n        if (error < tol) {\n            break;\n        }\n    }\n\n    const eigenvalues = R.diag();\n    const eigenvectors = Q.transpose().to2dArray();\n    return { eigenvalues, eigenvectors };\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { neumair_sum } from \"../numerical/index.js\";\nimport { Randomizer } from \"../util/index.js\";\n\n/** @typedef {(i: number, j: number) => number} Accessor */\n\n/**\n * @class\n * @category Matrix\n */\nexport class Matrix {\n    /**\n     * Creates a new Matrix. Entries are stored in a Float64Array.\n     *\n     * @example let A = new Matrix(10, 10, () => Math.random()); //creates a 10 times 10 random matrix. let B = new\n     * Matrix(3, 3, \"I\"); // creates a 3 times 3 identity matrix.\n     *\n     * @param {number} rows - The amount of rows of the matrix.\n     * @param {number} cols - The amount of columns of the matrix.\n     * @param {Accessor | string | number} value - Can be a function with row and col as parameters, a number, or\n     *   \"zeros\", \"identity\" or \"I\", or \"center\".\n     *\n     *   - **function**: for each entry the function gets called with the parameters for the actual row and column.\n     *   - **string**: allowed are\n     *\n     *       - \"zero\", creates a zero matrix.\n     *       - \"identity\" or \"I\", creates an identity matrix.\n     *       - \"center\", creates an center matrix.\n     *   - **number**: create a matrix filled with the given value.\n     */\n    constructor(rows, cols, value = 0) {\n        /** @type {number} */ this._rows = rows;\n        /** @type {number} */ this._cols = cols;\n        /** @type {Float64Array} */ this._data;\n\n        if (rows && cols) {\n            if (!value) {\n                this._data = new Float64Array(rows * cols);\n            }\n            if (typeof value === \"function\") {\n                this._data = new Float64Array(rows * cols);\n                for (let row = 0; row < rows; ++row) {\n                    for (let col = 0; col < cols; ++col) {\n                        this._data[row * cols + col] = value(row, col);\n                    }\n                }\n            }\n            if (typeof value === \"string\") {\n                if (value === \"zeros\") {\n                    this._data = new Float64Array(rows * cols);\n                    for (let row = 0; row < rows; ++row) {\n                        for (let col = 0; col < cols; ++col) {\n                            this._data[row * cols + col] = 0;\n                        }\n                    }\n                }\n                if (value === \"identity\" || value === \"I\") {\n                    this._data = new Float64Array(rows * cols);\n                    for (let row = 0; row < rows; ++row) {\n                        this._data[row * cols + row] = 1;\n                    }\n                }\n                if (value === \"center\" && rows === cols) {\n                    this._data = new Float64Array(rows * cols);\n                    value = (i, j) => (i === j ? 1 : 0) - 1 / rows;\n                    for (let row = 0; row < rows; ++row) {\n                        for (let col = 0; col < cols; ++col) {\n                            this._data[row * cols + col] = value(row, col);\n                        }\n                    }\n                }\n            }\n            if (typeof value === \"number\") {\n                this._data = new Float64Array(rows * cols);\n                for (let row = 0; row < rows; ++row) {\n                    for (let col = 0; col < cols; ++col) {\n                        this._data[row * cols + col] = value;\n                    }\n                }\n            }\n            if (Array.isArray(value)) {\n                this._data = new Float64Array(rows * cols);\n                for (let row = 0; row < rows; ++row) {\n                    for (let col = 0; col < cols; ++col) {\n                        this._data[row * cols + col] = value[row][col];\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Creates a Matrix out of `A`.\n     * @param {Matrix | Float64Array[] | number[][]} A - The matrix, array, or number, which should converted to a Matrix.\n     * @returns {Matrix}\n     * @example\n     * let A = Matrix.from([ [1, 0], [0, 1], ]); //creates a two by two identity matrix.\n     */\n    static from(A) {\n        if (A instanceof Matrix) {\n            return A.clone();\n        }\n        if (Matrix.is2dArray(A)) {\n            const m = A.length;\n            const n = A[0].length;\n            for (let row = 0; row < m; ++row) {\n                if (A[row].length !== n) {\n                    throw new Error(\"various array lengths\");\n                }\n            }\n            return new Matrix(m, n, (i, j) => A[i][j]);\n        }\n        throw new Error(\"error\");\n    }\n\n    /**\n     * Creates a Matrix with the diagonal being the values of `v`.\n     *\n     * @example let S = Matrix.from_diag([1, 2, 3]); // creates [[1, 0, 0], [0, 2, 0], [0, 0, 3]]\n     *\n     * @param {number[] | Float64Array} v\n     * @returns {Matrix}\n     */\n    static from_diag(v) {\n        const N = v.length;\n        return new Matrix(N, N, (i, j) => (i === j ? v[i] : 0));\n    }\n\n    /**\n     * Creates a Matrix with the diagonal being the values of `v`.\n     *\n     * @example let S = Matrix.from_diag([1, 2, 3]); // creates [[1, 0, 0], [0, 2, 0], [0, 0, 3]]\n     *\n     * @param {number[] | Float64Array} v\n     * @param {\"col\" | \"row\"} type\n     * @returns {Matrix}\n     */\n    static from_vector(v, type) {\n        const N = v.length;\n        if (type === \"col\") {\n            return new Matrix(N, 1, (i, _) => v[i]);\n        } else {\n            return new Matrix(1, N, (_, j) => v[j]);\n        }\n    }\n\n    /**\n     * Returns the `row`<sup>th</sup> row from the Matrix.\n     *\n     * @param {number} row\n     * @returns {Float64Array}\n     */\n    row(row) {\n        const data = this.values;\n        const cols = this._cols;\n        return data.subarray(row * cols, (row + 1) * cols);\n    }\n\n    /**\n     * Returns an generator yielding each row of the Matrix.\n     *\n     * @yields {Float64Array}\n     */\n    *iterate_rows() {\n        const cols = this._cols;\n        const rows = this._rows;\n        const data = this.values;\n        for (let row = 0; row < rows; ++row) {\n            yield data.subarray(row * cols, (row + 1) * cols);\n        }\n    }\n\n    /**\n     * Makes a `Matrix` object an iterable object.\n     *\n     * @yields {Float64Array}\n     */\n    *[Symbol.iterator]() {\n        for (const row of this.iterate_rows()) {\n            yield row;\n        }\n    }\n\n    /**\n     * Sets the entries of `row`<sup>th</sup> row from the Matrix to the entries from `values`.\n     *\n     * @param {number} row\n     * @param {number[]} values\n     * @returns {Matrix}\n     */\n    set_row(row, values) {\n        const cols = this._cols;\n        if (Matrix.isArray(values) && values.length === cols) {\n            const offset = row * cols;\n            for (let col = 0; col < cols; ++col) {\n                this.values[offset + col] = values[col];\n            }\n        } else if (values instanceof Matrix && values.shape[1] === cols && values.shape[0] === 1) {\n            const offset = row * cols;\n            for (let col = 0; col < cols; ++col) {\n                this.values[offset + col] = values._data[col];\n            }\n        } else {\n            throw new Error(\"Values not valid! Needs to be either an Array, a Float64Array, or a fitting Matrix!\");\n        }\n        return this;\n    }\n\n    /**\n     * Swaps the rows `row1` and `row2` of the Matrix.\n     *\n     * @param {number} row1\n     * @param {number} row2\n     * @returns {Matrix}\n     */\n    swap_rows(row1, row2) {\n        const cols = this._cols;\n        const data = this.values;\n        for (let i = row1 * cols, j = row2 * cols, col = 0; col < cols; ++col, ++i, ++j) {\n            const t = data[i];\n            data[i] = data[j];\n            data[j] = t;\n        }\n        return this;\n    }\n\n    /**\n     * Returns the col<sup>th</sup> column from the Matrix.\n     *\n     * @param {number} col\n     * @returns {Float64Array}\n     */\n    col(col) {\n        const result_col = new Float64Array(this._rows);\n        for (let row = 0; row < this._rows; ++row) {\n            result_col[row] = this.values[row * this._cols + col];\n        }\n        return result_col;\n    }\n\n    /**\n     * Returns the `col`<sup>th</sup> entry from the `row`<sup>th</sup> row of the Matrix.\n     *\n     * @param {number} row\n     * @param {number} col\n     * @returns {number}\n     */\n    entry(row, col) {\n        return this.values[row * this._cols + col];\n    }\n\n    /**\n     * Sets the {@link col}<sup>th</sup> entry from the {@link row}<sup>th</sup> row of the Matrix to the given\n     * {@link value}.\n     *\n     * @param {number} row\n     * @param {number} col\n     * @param {number} value\n     * @returns {Matrix}\n     */\n    set_entry(row, col, value) {\n        this.values[row * this._cols + col] = value;\n        return this;\n    }\n\n    /**\n     * Adds a given {@link value} to the {@link col}<sup>th</sup> entry from the {@link row}<sup>th</sup> row of the\n     * Matrix.\n     *\n     * @param {number} row\n     * @param {number} col\n     * @param {number} value\n     * @returns {Matrix}\n     */\n    add_entry(row, col, value) {\n        this.values[row * this._cols + col] += value;\n        return this;\n    }\n\n    /**\n     * Subtracts a given {@link value} from the {@link col}<sup>th</sup> entry from the {@link row}<sup>th</sup> row of the\n     * Matrix.\n     *\n     * @param {number} row\n     * @param {number} col\n     * @param {number} value\n     * @returns {Matrix}\n     */\n    sub_entry(row, col, value) {\n        this.values[row * this._cols + col] -= value;\n        return this;\n    }\n\n    /**\n     * Returns a new transposed Matrix.\n     *\n     * @returns {Matrix}\n     */\n    transpose() {\n        const B = new Matrix(this._cols, this._rows, (row, col) => this.entry(col, row));\n        return B;\n    }\n\n    /**\n     * Returns a new transposed Matrix. Short-form of `transpose`.\n     *\n     * @returns {Matrix}\n     */\n    get T() {\n        return this.transpose();\n    }\n\n    /**\n     * Returns the inverse of the Matrix.\n     *\n     * @returns {Matrix}\n     */\n    inverse() {\n        const rows = this._rows;\n        const cols = this._cols;\n        const A = this.clone();\n        const B = new Matrix(rows, cols, \"I\");\n\n        // foreach column\n        for (let col = 0; col < cols; ++col) {\n            // Search for maximum in this column (pivot)\n            let max_idx = col;\n            let max_val = Math.abs(A.entry(col, col));\n            for (let row = col + 1; row < rows; ++row) {\n                const val = Math.abs(A.entry(row, col));\n                if (max_val < val) {\n                    max_idx = row;\n                    max_val = val;\n                }\n            }\n            if (max_val === 0) {\n                throw new Error(\"Cannot compute inverse of Matrix, determinant is zero\");\n            }\n            // Swap maximum row with current row\n            if (max_idx !== col) {\n                A.swap_rows(col, max_idx);\n                B.swap_rows(col, max_idx);\n            }\n\n            // eliminate non-zero values on the other rows at column c\n            const A_col = A.row(col);\n            const B_col = B.row(col);\n            for (let row = 0; row < rows; ++row) {\n                if (row !== col) {\n                    // eliminate value at column c and row r\n                    const A_row = A.row(row);\n                    const B_row = B.row(row);\n                    if (A_row[col] !== 0) {\n                        const f = A_row[col] / A_col[col];\n                        // sub (f * row c) from row r to eliminate the value at column c\n                        for (let s = col; s < cols; ++s) {\n                            A_row[s] -= f * A_col[s];\n                        }\n                        for (let s = 0; s < cols; ++s) {\n                            B_row[s] -= f * B_col[s];\n                        }\n                    }\n                } else {\n                    // normalize value at Acc to 1 (diagonal):\n                    // divide each value of row r=c by the value at Acc\n                    const f = A_col[col];\n                    for (let s = col; s < cols; ++s) {\n                        A_col[s] /= f;\n                    }\n                    for (let s = 0; s < cols; ++s) {\n                        B_col[s] /= f;\n                    }\n                }\n            }\n        }\n        return B;\n    }\n\n    /**\n     * Returns the dot product. If `B` is an Array or Float64Array then an Array gets returned. If `B` is a Matrix then\n     * a Matrix gets returned.\n     *\n     * @param {Matrix | number[] | Float64Array} B The right side\n     * @returns {Matrix}\n     */\n    dot(B) {\n        if (B instanceof Matrix) {\n            const [rows_A, cols_A] = this.shape;\n            const [rows_B, cols_B] = B.shape;\n            if (cols_A !== rows_B) {\n                throw new Error(`A.dot(B): A is a ${this.shape.join(\" ⨯ \")}-Matrix, B is a ${B.shape.join(\" ⨯ \")}-Matrix:\n                A has ${cols_A} cols and B ${rows_B} rows.\n                Must be equal!`);\n            }\n            const C = new Matrix(rows_A, cols_B, 0);\n            const A_val = this.values;\n            const B_val = B.values;\n            const C_val = C.values;\n\n            for (let i = 0; i < rows_A; ++i) {\n                const i_cols_A = i * cols_A;\n                const i_cols_B = i * cols_B;\n                for (let k = 0; k < cols_A; ++k) {\n                    const aik = A_val[i_cols_A + k];\n                    if (aik === 0) continue;\n                    const k_cols_B = k * cols_B;\n                    for (let j = 0; j < cols_B; ++j) {\n                        C_val[i_cols_B + j] += aik * B_val[k_cols_B + j];\n                    }\n                }\n            }\n            return C;\n        } else if (Matrix.isArray(B)) {\n            // TODO: create Matrix directly\n            const rows = this._rows;\n            if (B.length !== rows) {\n                throw new Error(`A.dot(B): A has ${rows} cols and B has ${B.length} rows. Must be equal!`);\n            }\n            const C = new Array(rows);\n            for (let row = 0; row < rows; ++row) {\n                C[row] = neumair_sum(this.row(row).map((e) => e * B[row]));\n            }\n            return Matrix.from(C);\n        } else {\n            throw new Error(`B must be Matrix or Array`);\n        }\n    }\n\n    /**\n     * Transposes the current matrix and returns the dot product with `B`. If `B` is an Array or Float64Array then an\n     * Array gets returned. If `B` is a Matrix then a Matrix gets returned.\n     *\n     * @param {Matrix | number[] | Float64Array} B The right side\n     * @returns {Matrix}\n     */\n    transDot(B) {\n        if (B instanceof Matrix) {\n            const [cols_A, rows_A] = this.shape; // transpose matrix\n            const [rows_B, cols_B] = B.shape;\n            if (cols_A !== rows_B) {\n                throw new Error(`A.dot(B): A is a ${[rows_A, cols_A].join(\" ⨯ \")}-Matrix, B is a ${B.shape.join(\" ⨯ \")}-Matrix:\n                A has ${cols_A} cols and B ${rows_B} rows, which must be equal!`);\n            }\n            // let B = new Matrix(this._cols, this._rows, (row, col) => this.entry(col, row));\n            // this.values[row * this._cols + col];\n            const C = new Matrix(rows_A, cols_B, 0);\n            const A_val = this.values; // A is rows_B x rows_A (transposed)\n            const B_val = B.values;\n            const C_val = C.values;\n\n            for (let k = 0; k < cols_A; ++k) {\n                // cols_A is rows_B\n                const k_rows_A = k * rows_A;\n                const k_cols_B = k * cols_B;\n                for (let i = 0; i < rows_A; ++i) {\n                    const aki = A_val[k_rows_A + i];\n                    if (aki === 0) continue;\n                    for (let j = 0; j < cols_B; ++j) {\n                        C_val[i * cols_B + j] += aki * B_val[k_cols_B + j];\n                    }\n                }\n            }\n            return C;\n        } else if (Matrix.isArray(B)) {\n            // TODO: create Matrix directly\n            const rows = this._cols;\n            if (B.length !== rows) {\n                throw new Error(`A.dot(B): A has ${rows} cols and B has ${B.length} rows. Must be equal!`);\n            }\n            const C = new Array(rows);\n            for (let row = 0; row < rows; ++row) {\n                C[row] = neumair_sum(this.col(row).map((e) => e * B[row]));\n            }\n            return Matrix.from(C);\n        } else {\n            throw new Error(`B must be Matrix or Array`);\n        }\n    }\n\n    /**\n     * Returns the dot product with the transposed version of `B`. If `B` is an Array or Float64Array then an Array gets\n     * returned. If `B` is a Matrix then a Matrix gets returned.\n     *\n     * @param {Matrix | number[] | Float64Array} B The right side\n     * @returns {Matrix}\n     */\n    dotTrans(B) {\n        if (B instanceof Matrix) {\n            const [rows_A, cols_A] = this.shape;\n            const [cols_B, rows_B] = B.shape;\n            if (cols_A !== rows_B) {\n                throw new Error(`A.dot(B): A is a ${this.shape.join(\" ⨯ \")}-Matrix, B is a ${[rows_B, cols_B].join(\" ⨯ \")}-Matrix:\n                A has ${cols_A} cols and B ${rows_B} rows, which must be equal!`);\n            }\n            const C = new Matrix(rows_A, cols_B, (row, col) => {\n                const A_i = this.row(row);\n                const B_i = B.row(col);\n                let sum = 0;\n                for (let i = 0; i < cols_A; ++i) {\n                    sum += A_i[i] * B_i[i];\n                }\n                return sum;\n            });\n            return C;\n        } else if (Matrix.isArray(B)) {\n            // TODO: create Matrix directly\n            const rows = this._rows;\n            if (B.length !== rows) {\n                throw new Error(`A.dot(B): A has ${rows} cols and B has ${B.length} rows. Must be equal!`);\n            }\n            const C = new Array(rows);\n            for (let row = 0; row < rows; ++row) {\n                C[row] = neumair_sum(this.row(row).map((e) => e * B[row]));\n            }\n            return Matrix.from(C);\n        } else {\n            throw new Error(`B must be Matrix or Array`);\n        }\n    }\n\n    /**\n     * Computes the outer product from `this` and `B`.\n     *\n     * @param {Matrix} B\n     * @returns {Matrix}\n     */\n    outer(B) {\n        const l = this._data.length;\n        const r = B._data.length;\n        if (l !== r) throw new Error(\"Matrix A and B needs to be of the same length!\");\n        const C = new Matrix(\n            l,\n            l,\n            /** @type {Accessor} */ (i, j) => {\n                if (i <= j) {\n                    return this._data[i] * B._data[j];\n                } else {\n                    return this.entry(j, i);\n                }\n            },\n        );\n\n        return C;\n    }\n\n    /**\n     * Appends matrix `B` to the matrix.\n     *\n     * @example let A = Matrix.from([ [1, 1], [1, 1], ]); // 2 by 2 matrix filled with ones. let B = Matrix.from([ [2,\n     * 2], [2, 2], ]); // 2 by 2 matrix filled with twos.\n     *\n     *     A.concat(B, \"horizontal\"); // 2 by 4 matrix. [[1, 1, 2, 2], [1, 1, 2, 2]]\n     *     A.concat(B, \"vertical\"); // 4 by 2 matrix. [[1, 1], [1, 1], [2, 2], [2, 2]]\n     *     A.concat(B, \"diag\"); // 4 by 4 matrix. [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 2, 2], [0, 0, 2, 2]]\n     *\n     * @param {Matrix} B - Matrix to append.\n     * @param {\"horizontal\" | \"vertical\" | \"diag\"} [type=\"horizontal\"] - Type of concatenation. Default is\n     *   `\"horizontal\"`\n     * @returns {Matrix}\n     */\n    concat(B, type = \"horizontal\") {\n        const [rows_A, cols_A] = this.shape;\n        const [rows_B, cols_B] = B.shape;\n        if (type === \"horizontal\") {\n            if (rows_A !== rows_B) {\n                throw new Error(\n                    `A.concat(B, \"horizontal\"): A and B need same number of rows, A has ${rows_A} rows, B has ${rows_B} rows.`,\n                );\n            }\n            const X = new Matrix(rows_A, cols_A + cols_B, \"zeros\");\n            X.set_block(0, 0, this);\n            X.set_block(0, cols_A, B);\n            return X;\n        } else if (type === \"vertical\") {\n            if (cols_A !== cols_B) {\n                throw new Error(\n                    `A.concat(B, \"vertical\"): A and B need same number of columns, A has ${cols_A} columns, B has ${cols_B} columns.`,\n                );\n            }\n            const X = new Matrix(rows_A + rows_B, cols_A, \"zeros\");\n            X.set_block(0, 0, this);\n            X.set_block(rows_A, 0, B);\n            return X;\n        } else if (type === \"diag\") {\n            const X = new Matrix(rows_A + rows_B, cols_A + cols_B, \"zeros\");\n            X.set_block(0, 0, this);\n            X.set_block(rows_A, cols_A, B);\n            return X;\n        } else {\n            throw new Error(`type must be \"horizontal\" or \"vertical\", but type is ${type}!`);\n        }\n    }\n\n    /**\n     * Writes the entries of B in A at an offset position given by `offset_row` and `offset_col`.\n     *\n     * @param {number} offset_row\n     * @param {number} offset_col\n     * @param {Matrix} B\n     * @returns {Matrix}\n     */\n    set_block(offset_row, offset_col, B) {\n        const rows = Math.min(this._rows - offset_row, B.shape[0]);\n        const cols = Math.min(this._cols - offset_col, B.shape[1]);\n        for (let row = 0; row < rows; ++row) {\n            for (let col = 0; col < cols; ++col) {\n                this.set_entry(row + offset_row, col + offset_col, B.entry(row, col));\n            }\n        }\n        return this;\n    }\n\n    /**\n     * Extracts the entries from the `start_row`<sup>th</sup> row to the `end_row`<sup>th</sup> row, the\n     * `start_col`<sup>th</sup> column to the `end_col`<sup>th</sup> column of the matrix. If `end_row` or `end_col` is\n     * empty, the respective value is set to `this.rows` or `this.cols`.\n     *\n     * @example let A = Matrix.from([ [1, 2, 3], [4, 5, 6], [7, 8, 9], ]); // a 3 by 3 matrix.\n     *\n     *     A.get_block(1, 1); // [[5, 6], [8, 9]]\n     *     A.get_block(0, 0, 1, 1); // [[1]]\n     *     A.get_block(1, 1, 2, 2); // [[5]]\n     *     A.get_block(0, 0, 2, 2); // [[1, 2], [4, 5]]\n     *\n     * @param {number} start_row\n     * @param {number} start_col\n     * @param {number | null} [end_row]\n     * @param {number | null} [end_col]\n     * @returns {Matrix} Returns a `end_row` - `start_row` times `end_col` - `start_col` matrix, with respective entries\n     *   from the matrix.\n     */\n    get_block(start_row, start_col, end_row, end_col) {\n        const [rows, cols] = this.shape;\n        end_row = end_row ?? rows;\n        end_col = end_col ?? cols;\n        if (end_row <= start_row || end_col <= start_col) {\n            throw new Error(`\n                end_row must be greater than start_row, and\n                end_col must be greater than start_col, but\n                end_row = ${end_row}, start_row = ${start_row}, end_col = ${end_col}, and start_col = ${start_col}!`);\n        }\n        const X = new Matrix(end_row - start_row, end_col - start_col, \"zeros\");\n        for (let row = start_row, new_row = 0; row < end_row; ++row, ++new_row) {\n            for (let col = start_col, new_col = 0; col < end_col; ++col, ++new_col) {\n                X.set_entry(new_row, new_col, this.entry(row, col));\n            }\n        }\n        return X;\n    }\n\n    /**\n     * Returns a new array gathering entries defined by the indices given by argument.\n     *\n     * @param {number[]} row_indices - Array consists of indices of rows for gathering entries of this matrix\n     * @param {number[]} col_indices - Array consists of indices of cols for gathering entries of this matrix\n     * @returns {Matrix}\n     */\n    gather(row_indices, col_indices) {\n        const N = row_indices.length;\n        const D = col_indices.length;\n\n        const R = new Matrix(N, D);\n        for (let i = 0; i < N; ++i) {\n            const row_index = row_indices[i];\n            for (let j = 0; j < D; ++j) {\n                const col_index = col_indices[j];\n                R.set_entry(i, j, this.entry(row_index, col_index));\n            }\n        }\n\n        return R;\n    }\n\n    /**\n     * Applies a function to each entry of the matrix.\n     *\n     * @private\n     * @param {(d: number, v: number) => number} f Function takes 2 parameters, the value of the actual entry and a\n     *   value given by the function `v`. The result of `f` gets writen to the Matrix.\n     * @param {Accessor} v Function takes 2 parameters for `row` and `col`, and returns a value witch should be applied\n     *   to the `col`<sup>th</sup> entry of the `row`<sup>th</sup> row of the matrix.\n     * @returns {Matrix}\n     */\n    _apply_array(f, v) {\n        const data = this.values;\n        const [rows, cols] = this.shape;\n        for (let i = 0, row = 0; row < rows; ++row) {\n            for (let col = 0; col < cols; ++col, ++i) {\n                data[i] = f(data[i], v(row, col));\n            }\n        }\n        return this;\n    }\n\n    /**\n     * @param {number[] | Float64Array} values\n     * @param {(d: number, v: number) => number} f\n     * @returns {Matrix}\n     */\n    _apply_rowwise_array(values, f) {\n        return this._apply_array(f, (_, j) => values[j]);\n    }\n    /**\n     * @param {number[] | Float64Array} values\n     * @param {(d: number, v: number) => number} f\n     * @returns {Matrix}\n     */\n    _apply_colwise_array(values, f) {\n        const data = this.values;\n        const [rows, cols] = this.shape;\n        for (let i = 0, row = 0; row < rows; ++row) {\n            const val = values[row];\n            for (let col = 0; col < cols; ++col, ++i) {\n                data[i] = f(data[i], val);\n            }\n        }\n        return this;\n    }\n\n    /**\n     * @param {Matrix | number[] | Float64Array | number} value\n     * @param {(d: number, v: number) => number} f\n     * @returns {Matrix}\n     */\n    _apply(value, f) {\n        const data = this.values;\n        const [rows, cols] = this.shape;\n        if (value instanceof Matrix) {\n            const values = value.values;\n            const [value_rows, value_cols] = value.shape;\n            if (value_rows === 1) {\n                if (cols !== value_cols) {\n                    throw new Error(`cols !== value_cols`);\n                }\n                for (let i = 0, row = 0; row < rows; ++row) {\n                    for (let col = 0; col < cols; ++col, ++i) {\n                        data[i] = f(data[i], values[col]);\n                    }\n                }\n            } else if (value_cols === 1) {\n                if (rows !== value_rows) {\n                    throw new Error(`rows !== value_rows`);\n                }\n                for (let i = 0, row = 0; row < rows; ++row) {\n                    const v = values[row];\n                    for (let col = 0; col < cols; ++col, ++i) {\n                        data[i] = f(data[i], v);\n                    }\n                }\n            } else if (rows === value_rows && cols === value_cols) {\n                for (let i = 0, n = rows * cols; i < n; ++i) {\n                    data[i] = f(data[i], values[i]);\n                }\n            } else {\n                throw new Error(`error`);\n            }\n        } else if (Matrix.isArray(value)) {\n            if (value.length === rows) {\n                for (let i = 0, row = 0; row < rows; ++row) {\n                    const v = value[row];\n                    for (let col = 0; col < cols; ++col, ++i) {\n                        data[i] = f(data[i], v);\n                    }\n                }\n            } else if (value.length === cols) {\n                for (let i = 0, row = 0; row < rows; ++row) {\n                    for (let col = 0; col < cols; ++col, ++i) {\n                        data[i] = f(data[i], value[col]);\n                    }\n                }\n            } else {\n                throw new Error(`error`);\n            }\n        } else {\n            // scalar value\n            for (let i = 0, n = rows * cols; i < n; ++i) {\n                data[i] = f(data[i], value);\n            }\n        }\n        return this;\n    }\n\n    /**\n     * Clones the Matrix.\n     *\n     * @returns {Matrix}\n     */\n    clone() {\n        const B = new Matrix(this._rows, this._cols);\n        //B._rows = this._rows;\n        //B._cols = this._cols;\n        if (this._data) {\n            B._data = this._data.slice(0);\n        }\n        return B;\n    }\n\n    /**\n     * Entrywise multiplication with `value`.\n     *\n     * @example let A = Matrix.from([ [1, 2], [3, 4], ]); // a 2 by 2 matrix. let B = A.clone(); // B == A;\n     *\n     *     A.mult(2); // [[2, 4], [6, 8]];\n     *     A.mult(B); // [[1, 4], [9, 16]];\n     *\n     * @param {Matrix | Float64Array | number[] | number} value\n     * @param {Object} [options]\n     * @param {boolean} [options.inline=false] - If true, applies multiplication to the element, otherwise it creates\n     *   first a copy and applies the multiplication on the copy. Default is `false`\n     * @returns {Matrix}\n     */\n    mult(value, { inline = false } = {}) {\n        const A = inline ? this : this.clone();\n        return A._apply(value, (a, b) => a * b);\n    }\n\n    /**\n     * Entrywise division with `value`.\n     *\n     * @example let A = Matrix.from([ [1, 2], [3, 4], ]); // a 2 by 2 matrix. let B = A.clone(); // B == A;\n     *\n     *     A.divide(2); // [[0.5, 1], [1.5, 2]];\n     *     A.divide(B); // [[1, 1], [1, 1]];\n     *\n     * @param {Matrix | Float64Array | number[] | number} value\n     * @param {Object} [options]\n     * @param {Boolean} [options.inline=false] - If true, applies division to the element, otherwise it creates first a\n     *   copy and applies the division on the copy. Default is `false`\n     * @returns {Matrix}\n     */\n    divide(value, { inline = false } = {}) {\n        const A = inline ? this : this.clone();\n        return A._apply(value, (a, b) => a / b);\n    }\n\n    /**\n     * Entrywise addition with `value`.\n     *\n     * @example let A = Matrix.from([ [1, 2], [3, 4], ]); // a 2 by 2 matrix. let B = A.clone(); // B == A;\n     *\n     *     A.add(2); // [[3, 4], [5, 6]];\n     *     A.add(B); // [[2, 4], [6, 8]];\n     *\n     * @param {Matrix | Float64Array | number[] | number} value\n     * @param {Object} [options]\n     * @param {boolean} [options.inline=false] - If true, applies addition to the element, otherwise it creates first a\n     *   copy and applies the addition on the copy. Default is `false`\n     * @returns {Matrix}\n     */\n    add(value, { inline = false } = {}) {\n        const A = inline ? this : this.clone();\n        return A._apply(value, (a, b) => a + b);\n    }\n\n    /**\n     * Entrywise subtraction with `value`.\n     *\n     * @example let A = Matrix.from([ [1, 2], [3, 4], ]); // a 2 by 2 matrix. let B = A.clone(); // B == A;\n     *\n     *     A.sub(2); // [[-1, 0], [1, 2]];\n     *     A.sub(B); // [[0, 0], [0, 0]];\n     *\n     * @param {Matrix | Float64Array | number[] | number} value\n     * @param {Object} [options]\n     * @param {boolean} [options.inline=false] - If true, applies subtraction to the element, otherwise it creates first\n     *   a copy and applies the subtraction on the copy. Default is `false`\n     * @returns {Matrix}\n     */\n    sub(value, { inline = false } = {}) {\n        const A = inline ? this : this.clone();\n        return A._apply(value, (a, b) => a - b);\n    }\n\n    /**\n     * Returns the number of rows and columns of the Matrix.\n     *\n     * @returns {number[]} An Array in the form [rows, columns].\n     */\n    get shape() {\n        return [this._rows, this._cols];\n    }\n\n    /**\n     * Returns the matrix in the given shape with the given function which returns values for the entries of the matrix.\n     *\n     * @param {[number, number, Accessor]} parameter - Takes an Array in the form [rows, cols, value], where rows and\n     *   cols are the number of rows and columns of the matrix, and value is a function which takes two parameters (row\n     *   and col) which has to return a value for the colth entry of the rowth row.\n     * @returns {Matrix}\n     */\n    set shape([rows, cols, value = () => 0]) {\n        this._rows = rows;\n        this._cols = cols;\n        this._data = new Float64Array(rows * cols);\n        for (let i = 0, row = 0; row < rows; ++row) {\n            for (let col = 0; col < cols; ++col, ++i) {\n                this._data[i] = value(row, col);\n            }\n        }\n    }\n\n    /**\n     * Returns the Matrix as a Array of Float64Arrays.\n     *\n     * @returns {Float64Array[]}\n     */\n    to2dArray() {\n        const result = [];\n        for (const row of this.iterate_rows()) {\n            result.push(row);\n        }\n        return result;\n    }\n\n    /**\n     * Returns the Matrix as a Array of Arrays.\n     *\n     * @returns {number[][]}\n     */\n    asArray() {\n        const result = [];\n        for (const row of this.iterate_rows()) {\n            result.push(Array.from(row));\n        }\n        return result;\n    }\n\n    /**\n     * Returns the diagonal of the Matrix.\n     *\n     * @returns {Float64Array}\n     */\n    diag() {\n        const rows = this._rows;\n        const cols = this._cols;\n        const min_row_col = Math.min(rows, cols);\n        const result = new Float64Array(min_row_col);\n        for (let i = 0; i < min_row_col; ++i) {\n            result[i] = this.entry(i, i);\n        }\n        return result;\n    }\n\n    /**\n     * Returns the mean of all entries of the Matrix.\n     *\n     * @returns {number}\n     */\n    mean() {\n        const sum = this.sum();\n        const n = this._rows * this._cols;\n        return sum / n;\n    }\n\n    /**\n     * Returns the sum oof all entries of the Matrix.\n     *\n     * @returns {number}\n     */\n    sum() {\n        const data = this.values;\n        return neumair_sum(data);\n    }\n\n    /**\n     * Returns the entries of the Matrix.\n     *\n     * @returns {Float64Array}\n     */\n    get values() {\n        const data = this._data;\n        return data;\n    }\n\n    /**\n     * Returns the mean of each row of the matrix.\n     *\n     * @returns {Float64Array}\n     */\n    meanRows() {\n        const data = this.values;\n        const rows = this._rows;\n        const cols = this._cols;\n        const result = Float64Array.from({ length: rows });\n        for (let i = 0, row = 0; row < rows; ++row) {\n            let sum = 0;\n            for (let col = 0; col < cols; ++col, ++i) {\n                sum += data[i];\n            }\n            result[row] = sum / cols;\n        }\n        return result;\n    }\n\n    /**\n     * Returns the mean of each column of the matrix.\n     *\n     * @returns {Float64Array}\n     */\n    meanCols() {\n        const data = this.values;\n        const rows = this._rows;\n        const cols = this._cols;\n        const result = Float64Array.from({ length: cols });\n        for (let col = 0; col < cols; ++col) {\n            let sum = 0;\n            for (let i = col, row = 0; row < rows; ++row, i += cols) {\n                sum += data[i];\n            }\n            result[col] = sum / rows;\n        }\n        return result;\n    }\n\n    /**\n     * Solves the equation `Ax = b` using the conjugate gradient method. Returns the result `x`.\n     *\n     * @param {Matrix} A - Matrix\n     * @param {Matrix} b - Matrix\n     * @param {Randomizer | null} [randomizer]\n     * @param {number} [tol=1e-3] Default is `1e-3`\n     * @returns {Matrix}\n     */\n    static solve_CG(A, b, randomizer, tol = 1e-3) {\n        if (!randomizer) {\n            randomizer = new Randomizer();\n        }\n        const rows = A.shape[0];\n        const cols = b.shape[1];\n        let result = new Matrix(rows, 0);\n        for (let i = 0; i < cols; ++i) {\n            const b_i = Matrix.from_vector(b.col(i), \"col\");\n            let x = new Matrix(rows, 1, () => randomizer.random);\n            let r = b_i.sub(A.dot(x));\n            let d = r.clone();\n            let iter = 0;\n            const max_iter = rows * 10; // Prevent infinite loops\n            do {\n                const z = A.dot(d);\n                const alpha = r.transDot(r).entry(0, 0) / d.transDot(z).entry(0, 0);\n                x = x.add(d.mult(alpha));\n                const r_next = r.sub(z.mult(alpha));\n                const beta = r_next.transDot(r_next).entry(0, 0) / r.transDot(r).entry(0, 0);\n                d = r_next.add(d.mult(beta));\n                r = r_next;\n                iter++;\n            } while (Math.abs(r.mean()) > tol && iter < max_iter);\n            result = result.concat(x, \"horizontal\");\n        }\n        return result;\n    }\n\n    /**\n     * Solves the equation `Ax = b`. Returns the result `x`.\n     *\n     * @param {Matrix | { L: Matrix; U: Matrix }} A - Matrix or LU Decomposition\n     * @param {Matrix} b - Matrix\n     * @returns {Matrix}\n     */\n    static solve(A, b) {\n        const { L, U } = \"L\" in A && \"U\" in A ? A : Matrix.LU(A);\n        const rows = L.shape[0];\n        const x = b.clone();\n\n        // forward\n        for (let row = 0; row < rows; ++row) {\n            for (let col = 0; col < row; ++col) {\n                x.sub_entry(0, row, L.entry(row, col) * x.entry(0, col));\n            }\n            x.set_entry(0, row, x.entry(0, row) / L.entry(row, row));\n        }\n\n        // backward\n        for (let row = rows - 1; row >= 0; --row) {\n            for (let col = rows - 1; col > row; --col) {\n                x.sub_entry(0, row, U.entry(row, col) * x.entry(0, col));\n            }\n            x.set_entry(0, row, x.entry(0, row) / U.entry(row, row));\n        }\n\n        return x;\n    }\n\n    /**\n     * `LU` decomposition of the Matrix `A`. Creates two matrices, so that the dot product `LU` equals `A`.\n     *\n     * @param {Matrix} A\n     * @returns {{ L: Matrix; U: Matrix }} The left triangle matrix `L` and the upper triangle matrix `U`.\n     */\n    static LU(A) {\n        const rows = A.shape[0];\n        const L = new Matrix(rows, rows, \"zeros\");\n        const U = new Matrix(rows, rows, \"identity\");\n\n        for (let j = 0; j < rows; ++j) {\n            for (let i = j; i < rows; ++i) {\n                let sum = 0;\n                for (let k = 0; k < j; ++k) {\n                    sum += L.entry(i, k) * U.entry(k, j);\n                }\n                L.set_entry(i, j, A.entry(i, j) - sum);\n            }\n            for (let i = j; i < rows; ++i) {\n                if (L.entry(j, j) === 0) {\n                    throw new Error(\"L's diagonal not supposed to be 0!\");\n                }\n                let sum = 0;\n                for (let k = 0; k < j; ++k) {\n                    sum += L.entry(j, k) * U.entry(k, i);\n                }\n                U.set_entry(j, i, (A.entry(j, i) - sum) / L.entry(j, j));\n            }\n        }\n\n        return { L, U };\n    }\n\n    /**\n     * Computes the determinante of `A`, by using the `LU` decomposition of `A`.\n     *\n     * @param {Matrix} A\n     * @returns {number} The determinate of the Matrix `A`.\n     */\n    static det(A) {\n        const [rows, cols] = A.shape;\n\n        if (rows === 2 && cols === 2) {\n            return A.entry(0, 0) * A.entry(1, 1) - A.entry(0, 1) * A.entry(1, 0);\n        }\n        if (rows === 3 && cols === 3) {\n            const a = A.entry(0, 0);\n            const b = A.entry(0, 1);\n            const c = A.entry(0, 2);\n            const d = A.entry(1, 0);\n            const e = A.entry(1, 1);\n            const f = A.entry(1, 2);\n            const g = A.entry(2, 0);\n            const h = A.entry(2, 1);\n            const i = A.entry(2, 2);\n            return a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);\n        }\n\n        const { L, U } = Matrix.LU(A);\n        const L_diag = L.diag();\n        const U_diag = U.diag();\n        let det = L_diag[0] * U_diag[0];\n        for (let row = 1; row < rows; ++row) {\n            det *= L_diag[row] * U_diag[row];\n        }\n        return det;\n    }\n\n    /**\n     * Computes the `k` components of the SVD decomposition of the matrix `M`.\n     *\n     * @param {Matrix} M\n     * @param {number} [k=2] Default is `2`\n     * @returns {{ U: Float64Array[]; Sigma: Float64Array; V: Float64Array[] }}\n     */\n    static SVD(M, k = 2) {\n        const MtM = M.transDot(M);\n        const MMt = M.dotTrans(M);\n        const { eigenvectors: V, eigenvalues: Sigma } = simultaneous_poweriteration(MtM, k);\n        const { eigenvectors: U } = simultaneous_poweriteration(MMt, k);\n        return { U: U, Sigma: Sigma.map((sigma) => Math.sqrt(sigma)), V: V };\n\n        //Algorithm 1a: Householder reduction to bidiagonal form:\n        /* const [m, n] = A.shape;\n        let U = new Matrix(m, n, (i, j) => i == j ? 1 : 0);\n        console.log(U.to2dArray)\n        let V = new Matrix(n, m, (i, j) => i == j ? 1 : 0);\n        console.log(V.to2dArray)\n        let B = Matrix.bidiagonal(A.clone(), U, V);\n        console.log(U,V,B)\n        return { U: U, \"Sigma\": B, V: V }; */\n    }\n\n    /**\n     * @param {unknown} A\n     * @returns {A is unknown[]|number[]|Float64Array|Float32Array}\n     */\n    static isArray(A) {\n        return Array.isArray(A) || A instanceof Float64Array || A instanceof Float32Array;\n    }\n\n    /**\n     * @param {any[]} A\n     * @returns {A is number[][]|Float64Array[]}\n     */\n    static is2dArray(A) {\n        if (!Array.isArray(A) || A.length === 0) {\n            return false;\n        }\n        const n = A[0].length;\n        for (let i = 0; i < A.length; ++i) {\n            if (!Array.isArray(A[i]) && !(A[i] instanceof Float64Array)) {\n                return false;\n            }\n            if (A[i].length !== n) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n\n/**\n * Computes the norm of a vector, by computing its distance to **0**.\n *\n * @category Matrix\n * @param {Matrix | number[] | Float64Array} v - Vector.\n * @param {Metric} [metric=euclidean] - Which metric should be used to compute the norm. Default is `euclidean`\n * @returns {number} - The norm of `v`.\n */\nexport function norm(v, metric = euclidean) {\n    let vector = null;\n    if (v instanceof Matrix) {\n        const [rows, cols] = v.shape;\n        if (rows === 1) vector = v.row(0);\n        else if (cols === 1) vector = v.col(0);\n        else throw new Error(\"Matrix must be 1d!\");\n    } else {\n        vector = v;\n    }\n    const n = vector.length;\n    const zeros = new Float64Array(n);\n    return metric(vector, zeros);\n}\n","import { euclidean } from \"../metrics/index.js\";\nimport { norm } from \"./index.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n\n/**\n * Normalizes Vector `v`.\n *\n * @category Matrix\n * @param {number[] | Float64Array} v - Vector\n * @param {Metric} metric\n * @returns {number[] | Float64Array} - The normalized vector with length 1.\n */\nexport function normalize(v, metric = euclidean) {\n    const v_norm = norm(v, metric);\n    return v.map((value) => value / v_norm);\n}\n","import { Matrix } from \"../matrix/index.js\";\n\n/** @import {InputType} from \"../index.js\" */\n\n/**\n * Base class for all clustering algorithms.\n * @template Para\n */\nexport class Clustering {\n    /** @type {InputType} */\n    _points;\n    /** @type {Para} */\n    _parameters;\n    /** @type {Matrix} */\n    _matrix;\n    /** @type {number} */\n    _N;\n    /** @type {number} */\n    _D;\n\n    /**\n     * Compute the respective Clustering with given parameters\n     * @param {InputType} points\n     * @param {Para} parameters\n     */\n    constructor(points, parameters) {\n        this._points = points;\n        this._parameters = parameters;\n\n        this._matrix = points instanceof Matrix ? points : Matrix.from(points);\n        const [N, D] = this._matrix.shape;\n        this._N = N;\n        this._D = D;\n    }\n\n    /**\n     * @abstract\n     * @param {...unknown} args\n     * @returns {number[][]} An array with the indices of the clusters.\n     */\n    get_clusters(...args) {\n        args;\n        throw new Error(\"The function get_clusters must be implemented!\");\n    }\n\n    /**\n     * @abstract\n     * @param {...unknown} args\n     * @returns {number[]} An array with the clusters id's for each point.\n     */\n    get_cluster_list(...args) {\n        args;\n        throw new Error(\"The function get_cluster_list must be implemented!\");\n    }\n}\n","import { euclidean } from \"../metrics/index.js\";\nimport { Clustering } from \"./Clustering.js\";\n\n/** @import { InputType } from \"../index.js\" */\n/** @import { ParametersCURE } from \"./index.js\" */\n\n/**\n * CURE (Clustering Using REpresentatives)\n *\n * An efficient clustering algorithm for large databases that is robust to outliers\n * and identifies clusters with non-spherical shapes and wide variances in size.\n *\n * @class\n * @extends Clustering<ParametersCURE>\n * @category Clustering\n */\nexport class CURE extends Clustering {\n    /** @type {number} */\n    _K;\n    /** @type {number} */\n    _num_representatives;\n    /** @type {number} */\n    _shrink_factor;\n    /**\n     * @private\n     * @type {CURECluster[]}\n     */\n    _clusters = [];\n    /** @type {number[]} */\n    _cluster_ids = [];\n\n    /**\n     * @param {InputType} points\n     * @param {Partial<ParametersCURE>} parameters\n     */\n    constructor(points, parameters = {}) {\n        super(\n            points,\n            /** @type {ParametersCURE} */ (\n                Object.assign(\n                    { K: 2, num_representatives: 5, shrink_factor: 0.5, metric: euclidean, seed: 1212 },\n                    parameters,\n                )\n            ),\n        );\n\n        this._K = this._parameters.K ?? 2;\n        this._num_representatives = this._parameters.num_representatives ?? 5;\n        this._shrink_factor = this._parameters.shrink_factor ?? 0.5;\n\n        // Initialize clusters\n        this._initialize_clusters();\n        // Run CURE algorithm\n        this._cure();\n    }\n\n    /**\n     * Initialize each point as its own cluster\n     * @private\n     */\n    _initialize_clusters() {\n        const N = this._N;\n        //const D = this._D;\n        this._clusters = [];\n\n        for (let i = 0; i < N; ++i) {\n            const point = this._matrix.row(i);\n            const centroid = new Float64Array(point);\n            // For single point, representative is the point itself\n            const representatives = [new Float64Array(point)];\n\n            this._clusters.push(new CURECluster([i], centroid, representatives));\n        }\n    }\n\n    /**\n     * Compute distance between two clusters using representative points\n     * @private\n     * @param {CURECluster} cluster1\n     * @param {CURECluster} cluster2\n     * @returns {number}\n     */\n    _cluster_distance(cluster1, cluster2) {\n        const reps1 = cluster1.representatives;\n        const reps2 = cluster2.representatives;\n        const metric = this._parameters.metric;\n\n        let min_dist = Infinity;\n        for (const r1 of reps1) {\n            for (const r2 of reps2) {\n                const dist = metric(r1, r2);\n                if (dist < min_dist) {\n                    min_dist = dist;\n                }\n            }\n        }\n        return min_dist;\n    }\n\n    /**\n     * Find the closest pair of clusters\n     * @private\n     * @returns {[number, number, number]} [index1, index2, distance]\n     */\n    _find_closest_clusters() {\n        let min_dist = Infinity;\n        let min_i = 0;\n        let min_j = 1;\n\n        for (let i = 0; i < this._clusters.length; ++i) {\n            for (let j = i + 1; j < this._clusters.length; ++j) {\n                const dist = this._cluster_distance(this._clusters[i], this._clusters[j]);\n                if (dist < min_dist) {\n                    min_dist = dist;\n                    min_i = i;\n                    min_j = j;\n                }\n            }\n        }\n\n        return [min_i, min_j, min_dist];\n    }\n\n    /**\n     * Merge two clusters\n     * @private\n     * @param {CURECluster} cluster1\n     * @param {CURECluster} cluster2\n     * @returns {CURECluster}\n     */\n    _merge_clusters(cluster1, cluster2) {\n        // Merge indices\n        const merged_indices = [...cluster1.indices, ...cluster2.indices];\n\n        // Calculate new centroid\n        const size1 = cluster1.indices.length;\n        const size2 = cluster2.indices.length;\n        const total_size = size1 + size2;\n        const D = this._D;\n        const new_centroid = new Float64Array(D);\n\n        for (let d = 0; d < D; ++d) {\n            new_centroid[d] = (size1 * cluster1.centroid[d] + size2 * cluster2.centroid[d]) / total_size;\n        }\n\n        // Collect all points from both clusters\n        /** @type {{index: number, point: Float64Array}[]} */\n        const all_points = [];\n        for (const idx of cluster1.indices) {\n            all_points.push({ index: idx, point: this._matrix.row(idx) });\n        }\n        for (const idx of cluster2.indices) {\n            all_points.push({ index: idx, point: this._matrix.row(idx) });\n        }\n\n        // Select representative points - pick points farthest from centroid\n        const num_reps = Math.min(this._num_representatives, all_points.length);\n        const metric = this._parameters.metric;\n\n        // Calculate distances from centroid for all points\n        const distances = all_points.map(({ point }) => metric(point, new_centroid));\n\n        // Select num_reps points with maximum distance (farthest from centroid)\n        const selected_indices = [];\n        const used = new Set();\n\n        for (let r = 0; r < num_reps; ++r) {\n            let max_dist = -1;\n            let max_idx = -1;\n\n            for (let i = 0; i < distances.length; ++i) {\n                if (!used.has(i) && distances[i] > max_dist) {\n                    max_dist = distances[i];\n                    max_idx = i;\n                }\n            }\n\n            if (max_idx >= 0) {\n                used.add(max_idx);\n                selected_indices.push(max_idx);\n            }\n        }\n\n        // Shrink representative points toward centroid\n        const new_representatives = selected_indices.map((idx) => {\n            const point = all_points[idx].point;\n            const shrunk = new Float64Array(D);\n            const alpha = this._shrink_factor;\n\n            for (let d = 0; d < D; ++d) {\n                shrunk[d] = point[d] + alpha * (new_centroid[d] - point[d]);\n            }\n\n            return shrunk;\n        });\n\n        return new CURECluster(merged_indices, new_centroid, new_representatives);\n    }\n\n    /**\n     * Run CURE clustering algorithm\n     * @private\n     */\n    _cure() {\n        // Merge clusters until we have K clusters\n        while (this._clusters.length > this._K) {\n            const [i, j] = this._find_closest_clusters();\n\n            // Merge clusters i and j\n            const merged = this._merge_clusters(this._clusters[i], this._clusters[j]);\n\n            // Remove the old clusters and add the merged one\n            // Remove larger index first to maintain correct indices\n            // min_i < min_j is always true from _find_closest_clusters\n            this._clusters.splice(j, 1);\n            this._clusters.splice(i, 1);\n\n            this._clusters.push(merged);\n        }\n\n        // Build cluster list for get_cluster_list\n        this._build_cluster_ids();\n    }\n\n    /**\n     * Build the cluster list (point -> cluster assignment)\n     * @private\n     */\n    _build_cluster_ids() {\n        const N = this._N;\n        this._cluster_ids = new Array(N).fill(-1);\n\n        for (let c = 0; c < this._clusters.length; ++c) {\n            for (const idx of this._clusters[c].indices) {\n                this._cluster_ids[idx] = c;\n            }\n        }\n    }\n\n    /**\n     * @returns {number[][]}\n     */\n    get_clusters() {\n        return this._clusters.map((cluster) => cluster.indices);\n    }\n\n    /**\n     * @returns {number[]}\n     */\n    get_cluster_list() {\n        return this._cluster_ids;\n    }\n}\n\n/**\n * @private\n * Represents a cluster in CURE algorithm\n */\nclass CURECluster {\n    /**\n     * @param {number[]} indices - Indices of points in the cluster\n     * @param {Float64Array} centroid - Centroid of the cluster\n     * @param {Float64Array[]} representatives - Representative points (shrunk toward centroid)\n     */\n    constructor(indices, centroid, representatives) {\n        /** @type {number[]} */\n        this.indices = indices;\n        /** @type {Float64Array} */\n        this.centroid = centroid;\n        /** @type {Float64Array[]} */\n        this.representatives = representatives;\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Clustering } from \"./Clustering.js\";\n\n/** @import { InputType } from \"../index.js\" */\n/** @import { ParametersHierarchicalClustering } from \"./index.js\" */\n\n/**\n * Hierarchical Clustering\n *\n * A bottom-up approach (agglomerative) to clustering that builds a tree of clusters (dendrogram).\n * Supports different linkage criteria: single, complete, and average.\n *\n * @class\n * @extends Clustering<ParametersHierarchicalClustering>\n * @category Clustering\n */\nexport class HierarchicalClustering extends Clustering {\n    /** @type {Cluster | null} */\n    root = null;\n\n    /**\n     * @param {InputType} points - Data or distance matrix if metric is 'precomputed'\n     * @param {Partial<ParametersHierarchicalClustering>} parameters\n     */\n    constructor(points, parameters = {}) {\n        super(\n            points,\n            /** @type {ParametersHierarchicalClustering} */ (\n                Object.assign({ linkage: \"complete\", metric: euclidean }, parameters)\n            ),\n        );\n        this._id = 0;\n        if (this._parameters.metric === \"precomputed\" && this._matrix.shape[0] !== this._matrix.shape[1]) {\n            throw new Error(\"If metric is 'precomputed', then matrix has to be square!\");\n        }\n\n        const metric = this._parameters.metric;\n        const A = this._matrix;\n        const N = this._N;\n        this._d_min = new Float64Array(N);\n        const d_min = this._d_min;\n        let distance_matrix;\n        if (metric !== \"precomputed\") {\n            distance_matrix = new Matrix(N, N, Infinity);\n            for (let i = 0; i < N; ++i) {\n                distance_matrix.set_entry(i, i, 0);\n                d_min[i] = i; // temporary\n                const Ai = A.row(i);\n                for (let j = i + 1; j < N; ++j) {\n                    const dist = metric(Ai, A.row(j));\n                    distance_matrix.set_entry(i, j, dist);\n                    distance_matrix.set_entry(j, i, dist);\n                }\n            }\n            for (let i = 0; i < N; i++) {\n                let min_j = 0;\n                let min_d = Infinity;\n                for (let j = 0; j < N; j++) {\n                    if (i === j) continue;\n                    const d = distance_matrix.entry(i, j);\n                    if (d < min_d) {\n                        min_d = d;\n                        min_j = j;\n                    }\n                }\n                d_min[i] = min_j;\n            }\n        } else {\n            distance_matrix = this._matrix.clone();\n            for (let i = 0; i < N; ++i) {\n                distance_matrix.set_entry(i, i, 0);\n                d_min[i] = i === 0 ? 1 : 0;\n                for (let j = 0; j < N; ++j) {\n                    if (i === j) continue;\n                    if (distance_matrix.entry(i, d_min[i]) > distance_matrix.entry(i, j)) {\n                        d_min[i] = j;\n                    }\n                }\n            }\n        }\n        this._distance_matrix = distance_matrix;\n        this._clusters = new Array(N);\n        const clusters = this._clusters;\n        this._c_size = new Uint16Array(N);\n        const c_size = this._c_size;\n        for (let i = 0; i < N; ++i) {\n            clusters[i] = [];\n            clusters[i][0] = new Cluster(this._id++, null, null, 0, A.row(i), i, 1, 0);\n            c_size[i] = 1;\n        }\n        const D = this._distance_matrix;\n        const linkage = this._parameters.linkage;\n        const p_max = N - 1;\n        for (let p = 0; p < p_max; ++p) {\n            let c1 = -1;\n            let min_dist = Infinity;\n            for (let i = 0; i < N; ++i) {\n                if (D.entry(i, i) === Infinity) continue;\n                const dist = D.entry(i, d_min[i]);\n                if (dist < min_dist) {\n                    min_dist = dist;\n                    c1 = i;\n                }\n            }\n            if (c1 === -1) break;\n\n            const c2 = d_min[c1];\n            const c1_cluster = clusters[c1][0];\n            const c2_cluster = clusters[c2][0];\n            const c1_cluster_indices = c1_cluster.isLeaf ? [c1_cluster.index] : c1_cluster.index;\n            const c2_cluster_indices = c2_cluster.isLeaf ? [c2_cluster.index] : c2_cluster.index;\n            const indices = c1_cluster_indices.concat(c2_cluster_indices);\n            const new_cluster = new Cluster(this._id++, c1_cluster, c2_cluster, D.entry(c1, c2), null, indices);\n            c1_cluster.parent = new_cluster;\n            c2_cluster.parent = new_cluster;\n            clusters[c1].unshift(new_cluster);\n\n            const size1 = c_size[c1];\n            const size2 = c_size[c2];\n            c_size[c1] += size2;\n\n            for (let j = 0; j < N; ++j) {\n                if (j === c1 || j === c2 || D.entry(j, j) === Infinity) continue;\n                const D_c1_j = D.entry(c1, j);\n                const D_c2_j = D.entry(c2, j);\n                let value;\n                switch (linkage) {\n                    case \"single\":\n                        value = Math.min(D_c1_j, D_c2_j);\n                        break;\n                    case \"complete\":\n                        value = Math.max(D_c1_j, D_c2_j);\n                        break;\n                    case \"average\":\n                        value = (size1 * D_c1_j + size2 * D_c2_j) / (size1 + size2);\n                        break;\n                }\n                D.set_entry(j, c1, value);\n                D.set_entry(c1, j, value);\n            }\n\n            D.set_entry(c2, c2, Infinity);\n            for (let i = 0; i < N; ++i) {\n                D.set_entry(i, c2, Infinity);\n                D.set_entry(c2, i, Infinity);\n            }\n\n            // Update d_min for all rows\n            for (let i = 0; i < N; i++) {\n                if (D.entry(i, i) === Infinity) continue;\n                if (d_min[i] === c1 || d_min[i] === c2 || i === c1) {\n                    let min_j = 0;\n                    let min_d = Infinity;\n                    for (let j = 0; j < N; j++) {\n                        if (i === j || D.entry(j, j) === Infinity) continue;\n                        const d = D.entry(i, j);\n                        if (d < min_d) {\n                            min_d = d;\n                            min_j = j;\n                        }\n                    }\n                    d_min[i] = min_j;\n                } else {\n                    if (D.entry(i, c1) < D.entry(i, d_min[i])) {\n                        d_min[i] = c1;\n                    }\n                }\n            }\n\n            this.root = new_cluster;\n        }\n    }\n\n    /**\n     * @param {number} value - Value where to cut the tree.\n     * @param {\"distance\" | \"depth\"} [type=\"distance\"] - Type of value. Default is `\"distance\"`\n     * @returns {Cluster[][]} - Array of clusters with the indices of the rows in given points.\n     */\n    get_clusters_raw(value, type = \"distance\") {\n        /** @type {Cluster[][]} */\n        const clusters = [];\n        /** @type {(d: {dist: number, depth: number}) => number} */\n        let accessor;\n        switch (type) {\n            case \"distance\":\n                accessor = (d) => d.dist;\n                break;\n            case \"depth\":\n                accessor = (d) => d.depth;\n                break;\n            default:\n                throw new Error(\"invalid type\");\n        }\n        this._traverse(/** @type {Cluster} */ (this.root), accessor, value, clusters);\n        return clusters;\n    }\n\n    /**\n     * @param {number} value - Value where to cut the tree.\n     * @param {\"distance\" | \"depth\"} [type=\"distance\"] - Type of value. Default is `\"distance\"`\n     * @returns {number[][]} - Array of clusters with the indices of the rows in given points.\n     */\n    get_clusters(value, type = \"distance\") {\n        /** @type {Cluster[][]} */\n        const clusters = [];\n        /** @type {(d: {dist: number, depth: number}) => number} */\n        let accessor;\n        switch (type) {\n            case \"distance\":\n                accessor = (d) => d.dist;\n                break;\n            case \"depth\":\n                accessor = (d) => d.depth;\n                break;\n            default:\n                throw new Error(\"invalid type\");\n        }\n        if (this.root) this._traverse(this.root, accessor, value, clusters);\n        return clusters.map((cluster) => cluster.map((d) => d.index));\n    }\n\n    /**\n     * @param {number} value - Value where to cut the tree.\n     * @param {\"distance\" | \"depth\"} [type=\"distance\"] - Type of value. Default is `\"distance\"`\n     * @returns {number[]} - Array of clusters with the indices of the rows in given points.\n     */\n    get_cluster_list(value, type = \"distance\") {\n        const clusters = this.get_clusters(value, type);\n        /** @type {number[]} */\n        const list = new Array(this._N).fill(0);\n        for (let i = 0; i < clusters.length; ++i) {\n            const cluster = clusters[i];\n            for (let j = 0; j < cluster.length; ++j) {\n                const index = cluster[j];\n                list[index] = i;\n            }\n        }\n        return list;\n    }\n\n    /**\n     * @private\n     * @param {Cluster} node\n     * @param {(d: {dist: number, depth: number}) => number} f\n     * @param {number} value\n     * @param {Cluster[][]} result\n     */\n    _traverse(node, f, value, result) {\n        if (f(node) <= value) {\n            result.push(node.leaves());\n        } else {\n            if (node.left) this._traverse(node.left, f, value, result);\n            if (node.right) this._traverse(node.right, f, value, result);\n        }\n    }\n}\n\n/** @private */\nclass Cluster {\n    /**@type {number} */\n    size;\n    /**@type {number} */\n    depth;\n    /**@type {Cluster | null} */\n    parent;\n\n    /**\n     *\n     * @param {number} id\n     * @param {Cluster?} left\n     * @param {Cluster?} right\n     * @param {number} dist\n     * @param {Float64Array?} centroid\n     * @param {number} index\n     * @param {number} [size]\n     * @param {number} [depth]\n     */\n    constructor(id, left, right, dist, centroid, index, size, depth) {\n        this.id = id;\n        this.left = left;\n        this.right = right;\n        this.dist = dist;\n        this.index = index;\n        if (size) {\n            this.size = size;\n        } else {\n            if (!left || !right) throw new Error(\"If size is not given, left & right cannot be null!\");\n            this.size = left.size + right.size;\n        }\n\n        if (depth !== undefined) {\n            this.depth = depth;\n        } else {\n            if (!left || !right) throw new Error(\"If depth is not given, left & right cannot be null!\");\n            this.depth = Math.max(left.depth, right.depth) + 1;\n        }\n\n        if (centroid !== undefined && centroid !== null) {\n            this.centroid = centroid;\n        } else {\n            if (!left || !right) throw new Error(\"If centroid is not given, left & right cannot be null!\");\n\n            this.centroid = this._calculate_centroid(left, right);\n        }\n\n        this.parent = null;\n    }\n\n    /**\n     *\n     * @param {Cluster} left\n     * @param {Cluster} right\n     * @returns {Float64Array}\n     */\n    _calculate_centroid(left, right) {\n        const l_size = left.size;\n        const r_size = right.size;\n        const l_centroid = left.centroid;\n        const r_centroid = right.centroid;\n        const size = this.size;\n        const n = left.centroid.length;\n        const new_centroid = new Float64Array(n);\n        for (let i = 0; i < n; ++i) {\n            new_centroid[i] = (l_size * l_centroid[i] + r_size * r_centroid[i]) / size;\n        }\n        return new_centroid;\n    }\n\n    get isLeaf() {\n        return this.depth === 0;\n    }\n\n    /**\n     *\n     * @returns {Cluster[]}\n     */\n    leaves() {\n        if (this.isLeaf) return [this];\n        const left = this.left;\n        const right = this.right;\n        return (left ? (left.isLeaf ? [left] : left.leaves()) : []).concat(\n            right ? (right.isLeaf ? [right] : right.leaves()) : [],\n        );\n    }\n\n    /**\n     *\n     * @returns {Cluster[]}\n     */\n    descendants() {\n        if (this.isLeaf) return [this];\n        const left_descendants = this.left ? this.left.descendants() : [];\n        const right_descendants = this.right ? this.right.descendants() : [];\n        return left_descendants.concat(right_descendants).concat([this]);\n    }\n}\n","/**\n * @template T\n * @typedef {Object} DisjointSetPayload\n * @property {T} parent\n * @property {Set<T>} children\n * @property {number} size\n */\n\n/**\n * @template T\n * @class\n * @category Data Structures\n * @see {@link https://en.wikipedia.org/wiki/Disjoint-set_data_structure}\n */\nexport class DisjointSet {\n    /**\n     * @param {T[]?} elements\n     */\n    constructor(elements = null) {\n        /**\n         * @private\n         * @type {Map<T, DisjointSetPayload<T>>}\n         */\n        this._list = new Map();\n        if (elements) {\n            for (const e of elements) {\n                this.make_set(e);\n            }\n        }\n    }\n\n    /**\n     * @private\n     * @param {T} x\n     * @returns {DisjointSet<T>}\n     */\n    make_set(x) {\n        const list = this._list;\n        if (!list.has(x)) {\n            list.set(x, { parent: x, children: new Set([x]), size: 1 });\n        }\n        return this;\n    }\n\n    /**\n     * @param {T} x\n     * @returns\n     */\n    find(x) {\n        const list = this._list;\n        const disjoint_set = list.get(x);\n        if (disjoint_set) {\n            if (disjoint_set.parent !== x) {\n                disjoint_set.children.add(x);\n                const new_parent = this.find(disjoint_set.parent);\n                if (!new_parent) throw new Error(\"should not happen!\");\n                disjoint_set.parent = new_parent;\n                return disjoint_set.parent;\n            } else {\n                return x;\n            }\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * @param {T} x\n     * @param {T} y\n     * @returns\n     */\n    union(x, y) {\n        let node_x = this.find(x);\n        let node_y = this.find(y);\n\n        if (!node_x || !node_y) throw new Error(\"x or y not found!\");\n\n        let disjoint_set_x = this._list.get(node_x);\n        let disjoint_set_y = this._list.get(node_y);\n\n        if (!disjoint_set_x || !disjoint_set_y) throw new Error(\"should not happen!\");\n\n        if (node_x === node_y) return this;\n        if (disjoint_set_x.size < disjoint_set_y.size) {\n            [node_x, node_y] = [node_y, node_x];\n            [disjoint_set_x, disjoint_set_y] = [disjoint_set_y, disjoint_set_x];\n        }\n\n        disjoint_set_y.parent = node_x;\n        // keep track of children\n        disjoint_set_y.children.forEach(disjoint_set_x.children.add, disjoint_set_x.children);\n        disjoint_set_x.size += disjoint_set_y.size;\n\n        return this;\n    }\n\n    /** @param {T} x */\n    get_children(x) {\n        const node = this._list.get(x);\n        if (node) {\n            return node.children;\n        } else {\n            return null;\n        }\n    }\n}\n","/** @import { Comparator } from \"./index.js\" */\n\n/**\n * @template T\n * @class\n * @category Data Structures\n */\nexport class Heap {\n    /** @type {{ element: T; value: number }[]} */\n    _container;\n\n    /** @type {Comparator} */\n    _comparator;\n\n    /**\n     * A heap is a datastructure holding its elements in a specific way, so that the top element would be the first\n     * entry of an ordered list.\n     *\n     * @param {T[]?} elements - Contains the elements for the Heap. `elements` can be null.\n     * @param {(d: T) => number} accessor - Function returns the value of the element.\n     * @param {\"min\" | \"max\" | Comparator} [comparator=\"min\"] - Function returning true or false\n     *   defining the wished order of the Heap, or String for predefined function. (\"min\" for a Min-Heap, \"max\" for a\n     *   Max_heap). Default is `\"min\"`\n     * @see {@link https://en.wikipedia.org/wiki/Binary_heap}\n     */\n    constructor(elements = null, accessor, comparator = \"min\") {\n        /** @type {(d: T) => number} */\n        this._accessor = accessor;\n        this._container = [];\n        if (comparator === \"min\") {\n            this._comparator = (a, b) => a < b;\n        } else if (comparator === \"max\") {\n            this._comparator = (a, b) => a > b;\n        } else {\n            this._comparator = comparator;\n        }\n        if (elements) {\n            this._container = [];\n            for (const e of elements) {\n                this._container.push({\n                    element: e,\n                    value: accessor(e),\n                });\n            }\n            for (let i = Math.floor(elements.length / 2 - 1); i >= 0; --i) {\n                this._heapify_down(i);\n            }\n        }\n    }\n\n    /**\n     * Creates a Heap from an Array\n     *\n     * @template T\n     * @param {T[]} elements - Contains the elements for the Heap.\n     * @param {(d: T) => number} accessor - Function returns the value of the element.\n     * @param {\"min\" | \"max\" | Comparator} [comparator=\"min\"] - Function returning true or false\n     *   defining the wished order of the Heap, or String for predefined function. (\"min\" for a Min-Heap, \"max\" for a\n     *   Max_heap). Default is `\"min\"`\n     * @returns {Heap<T>}\n     */\n    static heapify(elements, accessor, comparator = \"min\") {\n        const heap = new Heap(null, accessor, comparator);\n        const container = heap._container;\n        for (const e of elements) {\n            container.push({\n                element: e,\n                value: accessor(e),\n            });\n        }\n        for (let i = Math.floor(elements.length / 2 - 1); i >= 0; --i) {\n            heap._heapify_down(i);\n        }\n        return heap;\n    }\n\n    /**\n     * Swaps elements of container array.\n     *\n     * @private\n     * @param {number} index_a\n     * @param {number} index_b\n     */\n    _swap(index_a, index_b) {\n        const container = this._container;\n        [container[index_b], container[index_a]] = [container[index_a], container[index_b]];\n        return;\n    }\n\n    /** @private */\n    _heapify_up() {\n        const container = this._container;\n        let index = container.length - 1;\n        while (index > 0) {\n            const parentIndex = Math.floor((index - 1) / 2);\n            if (!this._comparator(container[index].value, container[parentIndex].value)) {\n                break;\n            } else {\n                this._swap(parentIndex, index);\n                index = parentIndex;\n            }\n        }\n    }\n\n    /**\n     * Pushes the element to the heap.\n     *\n     * @param {T} element\n     * @returns {Heap<T>}\n     */\n    push(element) {\n        const value = this._accessor(element);\n        //const node = new Node(element, value);\n        const node = { element: element, value: value };\n        this._container.push(node);\n        this._heapify_up();\n        return this;\n    }\n\n    /**\n     * @private\n     * @param {Number} [start_index=0] Default is `0`\n     */\n    _heapify_down(start_index = 0) {\n        const container = this._container;\n        const comparator = this._comparator;\n        const length = container.length;\n        const left = 2 * start_index + 1;\n        const right = 2 * start_index + 2;\n        let index = start_index;\n        if (index >= length) throw \"index higher than length\";\n        if (left < length && comparator(container[left].value, container[index].value)) {\n            index = left;\n        }\n        if (right < length && comparator(container[right].value, container[index].value)) {\n            index = right;\n        }\n        if (index !== start_index) {\n            this._swap(start_index, index);\n            this._heapify_down(index);\n        }\n    }\n\n    /**\n     * Removes and returns the top entry of the heap.\n     *\n     * @returns {{ element: T; value: number } | null} Object consists of the element and its value (computed by\n     *   `accessor`}).\n     */\n    pop() {\n        const container = this._container;\n        if (container.length === 0) {\n            return null;\n        } else if (container.length === 1) {\n            const item = container.pop();\n            if (!item) throw new Error(\"Cannot happen!\");\n            return item;\n        }\n        this._swap(0, container.length - 1);\n        const item = container.pop();\n        this._heapify_down();\n        return item ?? null;\n    }\n\n    /**\n     * Returns the top entry of the heap without removing it.\n     *\n     * @returns {{ element: T; value: number } | null} Object consists of the element and its value (computed by\n     *   `accessor`).\n     */\n    get first() {\n        return this._container.length > 0 ? this._container[0] : null;\n    }\n\n    /**\n     * Yields the raw data\n     *\n     * @yields {T} Object consists of the element and its value (computed by `accessor`}).\n     */\n    *iterate() {\n        for (let i = 0, n = this._container.length; i < n; ++i) {\n            yield this._container[i].element;\n        }\n    }\n\n    /**\n     * Returns the heap as ordered array.\n     *\n     * @returns {T[]} Array consisting the elements ordered by `comparator`.\n     */\n    toArray() {\n        return this._container.sort((a, b) => (this._comparator(a.value, b.value) ? -1 : 1)).map((d) => d.element);\n    }\n\n    /**\n     * Returns elements of container array.\n     *\n     * @returns {T[]} Array consisting the elements.\n     */\n    data() {\n        return this._container.map((d) => d.element);\n    }\n\n    /**\n     * Returns the container array.\n     *\n     * @returns {{ element: T; value: number }[]} The container array.\n     */\n    raw_data() {\n        return this._container;\n    }\n\n    /**\n     * The size of the heap.\n     *\n     * @returns {number}\n     */\n    get length() {\n        return this._container.length;\n    }\n\n    /**\n     * Returns false if the the heap has entries, true if the heap has no entries.\n     *\n     * @returns {boolean}\n     */\n    get empty() {\n        return this.length === 0;\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { linspace, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { Clustering } from \"./Clustering.js\";\n\n/** @import { InputType } from \"../index.js\" */\n/** @import { ParametersKMeans } from \"./index.js\" */\n/**\n * K-Means Clustering\n *\n * A popular clustering algorithm that partitions data into K clusters where each point\n * belongs to the cluster with the nearest mean (centroid).\n *\n * @class\n * @extends Clustering<ParametersKMeans>\n * @category Clustering\n * @see {@link KMedoids} for a more robust alternative\n *\n * @example\n * import * as druid from \"@saehrimnir/druidjs\";\n *\n * const points = [[1, 1], [1.5, 1.5], [5, 5], [5.5, 5.5]];\n * const kmeans = new druid.KMeans(points, { K: 2 });\n *\n * const clusters = kmeans.get_cluster_list(); // [0, 0, 1, 1]\n * const centroids = kmeans.centroids; // center points\n */\nexport class KMeans extends Clustering {\n    /**\n     * @param {InputType} points\n     * @param {Partial<ParametersKMeans>} parameters\n     */\n    constructor(points, parameters = {}) {\n        super(\n            points,\n            /** @type {ParametersKMeans} */ (Object.assign({ K: 4, metric: euclidean, seed: 1212 }, parameters)),\n        );\n\n        const K = this._parameters.K;\n        const seed = parameters.seed;\n\n        // Convert points to Matrix if needed\n        if (points instanceof Matrix) {\n            this._matrix = points;\n        } else {\n            this._matrix = Matrix.from(points);\n        }\n\n        const [N, D] = this._matrix.shape;\n        this._N = N;\n        this._D = D;\n\n        this._K = K > N ? N : K;\n        this._randomizer = new Randomizer(seed);\n\n        /** @type {number[]} */\n        this._clusters = new Array(N).fill(0);\n\n        this._cluster_centroids = parameters.initial_centroids\n            ? parameters.initial_centroids.map((c) => new Float64Array(c))\n            : this._get_random_centroids(this._K);\n        let cluster_centroids = this._cluster_centroids;\n        let iterations = 0;\n        const max_iterations = 300;\n        let clusters_changed = true;\n\n        while (clusters_changed && iterations < max_iterations) {\n            const iteration_result = this._iteration(cluster_centroids);\n            cluster_centroids = iteration_result.cluster_centroids;\n            clusters_changed = iteration_result.clusters_changed;\n            iterations++;\n        }\n\n        this._cluster_centroids = cluster_centroids;\n    }\n\n    /** @returns {number} The number of clusters */\n    get k() {\n        return this._K;\n    }\n\n    /** @returns {Float64Array[]} The cluster centroids */\n    get centroids() {\n        return this._cluster_centroids;\n    }\n\n    /** @returns {number[]} The cluster list */\n    get_cluster_list() {\n        return this._clusters;\n    }\n\n    /** @returns {number[][]} An Array of clusters with the indices of the points. */\n    get_clusters() {\n        const K = this._K;\n        const clusters = this._clusters;\n        /** @type {number[][]} */\n        const result = new Array(K).fill(0).map(() => []);\n        clusters.forEach((c, i) => {\n            if (c >= 0 && c < K) {\n                result[c].push(i);\n            }\n        });\n        return result;\n    }\n\n    /**\n     * @private\n     * @param {number[]} point_indices\n     * @param {number[]} candidates\n     * @returns {number}\n     */\n    _furthest_point(point_indices, candidates) {\n        const A = this._matrix;\n        const metric = this._parameters.metric;\n\n        if (point_indices.length === 0 || candidates.length === 0) {\n            return candidates[0] ?? 0;\n        }\n\n        const H = Heap.heapify(\n            candidates,\n            (d) => {\n                const Ad = A.row(d);\n                let sum = 0;\n                for (let j = 0; j < point_indices.length; ++j) {\n                    sum += metric(Ad, A.row(point_indices[j]));\n                }\n                return sum;\n            },\n            \"max\",\n        );\n\n        const furthest = H.pop();\n        if (!furthest) throw new Error(\"Should not happen!\");\n\n        return furthest.element;\n    }\n\n    /**\n     * @private\n     * @param {number} K\n     * @returns {Float64Array[]}\n     */\n    _get_random_centroids(K) {\n        const N = this._N;\n        const randomizer = this._randomizer;\n        const A = this._matrix;\n        /** @type {Float64Array[]} */\n        const cluster_centroids = new Array(K);\n        const indices = linspace(0, N - 1);\n\n        // First centroid: random selection\n        const random_point = randomizer.random_int % N;\n        cluster_centroids[0] = A.row(random_point);\n        const init_points = [random_point];\n\n        const sample_size = Math.max(1, Math.floor((N - K) / K));\n\n        for (let i = 1; i < K; ++i) {\n            const remaining = indices.filter((d) => !init_points.includes(d));\n            if (remaining.length === 0) break;\n\n            const sample = randomizer.choice(remaining, Math.min(sample_size, remaining.length));\n            const furthest_point = this._furthest_point(init_points, sample);\n\n            init_points.push(furthest_point);\n            cluster_centroids[i] = A.row(furthest_point);\n        }\n\n        return cluster_centroids;\n    }\n\n    /**\n     * @private\n     * @param {Float64Array[]} cluster_centroids\n     * @returns {{ clusters_changed: boolean; cluster_centroids: Float64Array[] }}\n     */\n    _iteration(cluster_centroids) {\n        const K = cluster_centroids.length;\n        const N = this._N;\n        const metric = this._parameters.metric;\n        const A = this._matrix;\n        const clusters = this._clusters;\n        let clusters_changed = false;\n\n        // Find nearest cluster centroid for each point\n        for (let i = 0; i < N; ++i) {\n            const Ai = A.row(i);\n            let min_dist = Infinity;\n            let min_cluster = 0;\n\n            for (let j = 0; j < K; ++j) {\n                const d = metric(cluster_centroids[j], Ai);\n                if (d < min_dist) {\n                    min_dist = d;\n                    min_cluster = j;\n                }\n            }\n\n            if (clusters[i] !== min_cluster) {\n                clusters_changed = true;\n                clusters[i] = min_cluster;\n            }\n        }\n\n        // Update cluster centroids\n        const new_centroids = this._compute_centroid(K);\n\n        return {\n            clusters_changed: clusters_changed,\n            cluster_centroids: new_centroids,\n        };\n    }\n\n    /**\n     * @private\n     * @param {number} K\n     * @returns {Float64Array[]}\n     */\n    _compute_centroid(K) {\n        const N = this._N;\n        const D = this._D;\n        const A = this._matrix;\n        const clusters = this._clusters;\n\n        // Initialize new centroids and counters\n        /** @type {Float64Array[]} */\n        const new_centroids = new Array(K);\n        const cluster_counter = new Array(K).fill(0);\n\n        for (let i = 0; i < K; ++i) {\n            new_centroids[i] = new Float64Array(D);\n        }\n\n        // Sum up all points in each cluster\n        for (let i = 0; i < N; ++i) {\n            const Ai = A.row(i);\n            const ci = clusters[i];\n            if (ci >= 0 && ci < K) {\n                cluster_counter[ci]++;\n                const centroid = new_centroids[ci];\n                for (let j = 0; j < D; ++j) {\n                    centroid[j] += Ai[j];\n                }\n            }\n        }\n\n        // Divide by count to get mean\n        for (let i = 0; i < K; ++i) {\n            const n = cluster_counter[i];\n            if (n > 0) {\n                const centroid = new_centroids[i];\n                for (let j = 0; j < D; ++j) {\n                    centroid[j] /= n;\n                }\n            }\n        }\n\n        return new_centroids;\n    }\n}\n","import { linspace, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { Clustering } from \"./Clustering.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import { ParametersKMedoids } from \"./index.js\" */\n\n/**\n * K-Medoids (PAM - Partitioning Around Medoids)\n *\n * A robust clustering algorithm similar to K-Means, but uses actual data points (medoids)\n * as cluster centers and can work with any distance metric.\n *\n * @class\n * @extends Clustering<ParametersKMedoids>\n * @category Clustering\n * @see {@link KMeans} for a faster but less robust alternative\n */\nexport class KMedoids extends Clustering {\n    /**\n     * @param {InputType} points - Data matrix\n     * @param {Partial<ParametersKMedoids>} parameters\n     * @see {@link https://link.springer.com/chapter/10.1007/978-3-030-32047-8_16} Faster k-Medoids Clustering: Improving the PAM, CLARA, and CLARANS Algorithms\n     */\n    constructor(points, parameters = {}) {\n        super(points, Object.assign({ K: 4, max_iter: null, metric: euclidean, seed: 1212 }, parameters));\n        this._A = this._matrix.to2dArray();\n        let K = this._parameters.K;\n        const N = this._N;\n        this._max_iter = this._parameters.max_iter ?? 10 * Math.log10(N);\n        this._distance_matrix = new Matrix(N, N, \"zeros\");\n\n        if (K > N) {\n            this._parameters.K = K = N;\n        }\n        this._randomizer = new Randomizer(this._parameters.seed);\n        this._clusters = new Array(N).fill(-1);\n        this._cluster_medoids = this._get_random_medoids(K);\n        this._is_initialized = false;\n    }\n\n    /** @returns {number[]} The cluster list */\n    get_cluster_list() {\n        if (!this._is_initialized) {\n            this.get_clusters();\n        }\n        return this._clusters;\n    }\n\n    /** @returns {number[][]} - Array of clusters with the indices of the rows in given points. */\n    get_clusters() {\n        const K = this._parameters.K;\n        const A = this._A;\n        const N = this._N;\n        if (!this._is_initialized) {\n            this.init(K, this._cluster_medoids);\n        }\n        /** @type {number[][]} */\n        const result = new Array(K).fill(0).map(() => []);\n        for (let j = 0; j < N; j++) {\n            const nearest = this._nearest_medoid(A[j], j);\n            const cluster_idx = nearest.index_nearest;\n            result[cluster_idx].push(j);\n            this._clusters[j] = cluster_idx;\n        }\n        return result;\n    }\n\n    /** @returns {number} */\n    get k() {\n        return this._parameters.K;\n    }\n\n    /** @returns {number[]} */\n    get medoids() {\n        return this.get_medoids();\n    }\n\n    /** @returns {number[]} */\n    get_medoids() {\n        const K = this._parameters.K;\n        if (!this._is_initialized) {\n            this.init(K, this._cluster_medoids);\n        }\n        return this._cluster_medoids;\n    }\n\n    async *generator() {\n        const max_iter = this._max_iter;\n        if (!this._is_initialized) {\n            this.get_clusters();\n        }\n        yield this.get_clusters();\n        let i = 0;\n        while (i < max_iter) {\n            const finish = this._iteration();\n            this._update_clusters();\n            yield this.get_clusters();\n            if (finish) break;\n            i++;\n        }\n    }\n\n    /** Algorithm 1. FastPAM1: Improved SWAP algorithm */\n    /* _iteration_1() {\n        const A = this._A;\n        const N = this._N;\n        const K = this._K;\n        const medoids = this._cluster_medoids;\n        let DeltaTD = 0;\n        let m0 = null;\n        let x0 = null;\n        A.forEach((x_j, j) => {\n            if (medoids.findIndex(m => m === j) < 0) {\n                const nearest_medoid = this._nearest_medoid(x_j, j);\n                const d_j = nearest_medoid.distance_nearest; // distance to current medoid\n                const deltaTD = new Array(K).fill(-d_j); // change if making j a medoid\n                A.forEach((x_o, o) => {\n                    // disance to new medoid\n                    const d_oj = this._get_distance(o, j, x_o, x_j);\n                    const {\n                        \"index_nearest\": n,\n                        \"distance_nearest\": d_n,\n                        \"distance_second\": d_s,\n                    } = this._nearest_medoid(x_o, o);\n                    this._clusters[o] = n; // cached values\n                    deltaTD[n] += Math.min(d_oj, d_s) - d_n; // loss change\n                    if (d_oj < d_n) { // reassignment check\n                        deltaTD.forEach((d_i, i) => {\n                            if (n !== i) {\n                                deltaTD[i] = d_i + d_oj - d_n; // update loss change\n                            }\n                        });\n                    }\n                });\n                // choose best medoid i;\n                const i = deltaTD\n                    .map((d, i) => [d, i])\n                    .sort((d1, d2) => d1[0] - d2[0])[0][1];\n                const deltaTD_i = deltaTD[i];\n                // store\n                if (deltaTD_i < DeltaTD) {\n                    DeltaTD = deltaTD_i;\n                    m0 = i;\n                    x0 = j;\n                }\n            }\n        });\n\n        if (DeltaTD >= 0) {\n            return true // break loop if DeltaTD >= 0\n        }\n        // swap roles of medoid m and non-medoid x;\n        medoids[m0] = x0;\n        this._cluster_medoids = medoids;\n        return false\n    } */\n\n    /** FastPAM1: One best swap per iteration */\n    _iteration() {\n        const A = this._A;\n        const K = this._parameters.K;\n        const medoids = this._cluster_medoids;\n        const N = this._N;\n\n        // Precompute nearest and second nearest medoid for all points\n        const cache = new Array(N);\n        for (let i = 0; i < N; i++) {\n            cache[i] = this._nearest_medoid(A[i], i);\n        }\n\n        let best_delta = 0;\n        let best_swap = null; // { m_idx: index in medoids, x_idx: index in A }\n\n        // For each non-medoid point j, evaluate swapping it with each medoid i\n        const medoid_set = new Set(medoids);\n        for (let j = 0; j < N; j++) {\n            if (medoid_set.has(j)) continue;\n\n            const x_j = A[j];\n            const d_j = cache[j].distance_nearest;\n\n            // deltaTD[i] will store the change in total distance if we swap medoid[i] with j\n            const deltaTD = new Array(K).fill(-d_j);\n\n            for (let o = 0; o < N; o++) {\n                if (o === j) continue;\n                const dist_o_j = this._get_distance(o, j, A[o], x_j);\n                const { index_nearest: n, distance_nearest: d_n, distance_second: d_s } = cache[o];\n\n                // If o is assigned to the current medoid being swapped out (n)\n                deltaTD[n] += Math.min(dist_o_j, d_s) - d_n;\n\n                // For all other medoids i != n, if j is closer to o than its current medoid\n                if (dist_o_j < d_n) {\n                    for (let i = 0; i < K; i++) {\n                        if (i !== n) {\n                            deltaTD[i] += dist_o_j - d_n;\n                        }\n                    }\n                }\n            }\n\n            // Find best medoid to swap with j\n            for (let i = 0; i < K; i++) {\n                if (deltaTD[i] < best_delta) {\n                    best_delta = deltaTD[i];\n                    best_swap = { m_idx: i, x_idx: j };\n                }\n            }\n        }\n\n        if (best_swap && best_delta < 0) {\n            medoids[best_swap.m_idx] = best_swap.x_idx;\n            this._cluster_medoids = medoids;\n            return false; // not finished\n        }\n\n        return true; // finished\n    }\n\n    /**\n     *\n     * @param {number} i\n     * @param {number} j\n     * @param {Float64Array?} x_i\n     * @param {Float64Array?} x_j\n     * @returns\n     */\n    _get_distance(i, j, x_i = null, x_j = null) {\n        if (i === j) return 0;\n        const D = this._distance_matrix;\n        const A = this._A;\n        const metric = this._parameters.metric;\n        let d_ij = D.entry(i, j);\n        if (d_ij === 0) {\n            d_ij = metric(x_i || A[i], x_j || A[j]);\n            D.set_entry(i, j, d_ij);\n            D.set_entry(j, i, d_ij);\n        }\n        return d_ij;\n    }\n\n    /**\n     *\n     * @param {Float64Array} x_j\n     * @param {number} j\n     * @returns\n     */\n    _nearest_medoid(x_j, j) {\n        const medoids = this._cluster_medoids;\n        const A = this._A;\n        if (medoids.length === 0) {\n            throw new Error(\"No medoids available. Initialization failed.\");\n        }\n\n        let d_n = Infinity;\n        let n = -1;\n        let d_s = Infinity;\n        let s = -1;\n\n        for (let i = 0; i < medoids.length; i++) {\n            const m = medoids[i];\n            const d = this._get_distance(j, m, x_j, A[m]);\n            if (d < d_n) {\n                d_s = d_n;\n                s = n;\n                d_n = d;\n                n = i;\n            } else if (d < d_s) {\n                d_s = d;\n                s = i;\n            }\n        }\n\n        if (s === -1) s = n;\n\n        return {\n            distance_nearest: d_n,\n            index_nearest: n,\n            distance_second: d_s,\n            index_second: s,\n        };\n    }\n\n    _update_clusters() {\n        const N = this._N;\n        const A = this._A;\n        for (let j = 0; j < N; j++) {\n            const nearest = this._nearest_medoid(A[j], j);\n            this._clusters[j] = nearest.index_nearest;\n        }\n    }\n\n    /**\n     * Computes `K` clusters out of the `matrix`.\n     * @param {number} K - Number of clusters.\n     * @param {number[]} cluster_medoids\n     */\n    init(K, cluster_medoids) {\n        if (!K) K = this._parameters.K;\n        if (!cluster_medoids) cluster_medoids = this._get_random_medoids(K);\n        this._cluster_medoids = cluster_medoids;\n        const max_iter = this._max_iter;\n        let finish = false;\n        let i = 0;\n        do {\n            finish = this._iteration();\n        } while (!finish && ++i < max_iter);\n        this._update_clusters();\n        this._is_initialized = true;\n        return this;\n    }\n\n    /**\n     * Algorithm 3. FastPAM LAB: Linear Approximate BUILD initialization.\n     *\n     * @param {number} K - Number of clusters\n     * @returns {number[]}\n     */\n    _get_random_medoids(K) {\n        const N = this._N;\n        const A = this._A;\n        const indices = linspace(0, N - 1);\n        const randomizer = this._randomizer;\n        const n = Math.min(N, 10 + Math.ceil(Math.sqrt(N)));\n\n        // Handle case where K >= N\n        if (K >= N) {\n            return indices.slice(0, N);\n        }\n\n        /** @type {number[]} */\n        const medoids = [];\n\n        // first medoid: select from a random sample of size n\n        let best_j = -1;\n        let min_td = Infinity;\n        let S = randomizer.choice(indices, n);\n        for (let j = 0; j < S.length; ++j) {\n            let td = 0;\n            const S_j = S[j];\n            const x_j = A[S_j];\n            for (let o = 0; o < S.length; ++o) {\n                if (o === j) continue;\n                td += this._get_distance(S_j, S[o], x_j, A[S[o]]);\n            }\n            if (td < min_td) {\n                min_td = td;\n                best_j = S_j;\n            }\n        }\n        medoids.push(best_j);\n\n        // other medoids: greedy additive selection (Algorithm LAB)\n        for (let i = 1; i < K; ++i) {\n            let best_idx = -1;\n            let best_delta = Infinity;\n\n            const remainingIndices = indices.filter((idx) => !medoids.includes(idx));\n            if (remainingIndices.length === 0) break;\n\n            S = randomizer.choice(remainingIndices, Math.min(n, remainingIndices.length));\n            for (let j = 0; j < S.length; ++j) {\n                let deltaTD = 0;\n                const S_j = S[j];\n                const x_j = A[S_j];\n\n                // Estimate TD reduction on the sample S\n                for (let o = 0; o < S.length; ++o) {\n                    if (o === j) continue;\n                    const S_o = S[o];\n                    const x_o = A[S_o];\n\n                    // Closest distance to current medoids\n                    let min_d_existing = Infinity;\n                    for (let m = 0; m < medoids.length; m++) {\n                        const d = this._get_distance(S_o, medoids[m], x_o, A[medoids[m]]);\n                        if (d < min_d_existing) min_d_existing = d;\n                    }\n\n                    const delta = this._get_distance(S_j, S_o, x_j, x_o) - min_d_existing;\n                    if (delta < 0) {\n                        deltaTD += delta;\n                    }\n                }\n\n                if (deltaTD < best_delta) {\n                    best_delta = deltaTD;\n                    best_idx = S_j;\n                }\n            }\n            if (best_idx !== -1) {\n                medoids.push(best_idx);\n            }\n        }\n        return medoids;\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Clustering } from \"./Clustering.js\";\n\n/** @import { ParametersMeanShift } from \"./index.js\" */\n/** @import { InputType } from \"../index.js\" */\n\n/**\n * Mean Shift Clustering\n *\n * A non-parametric clustering technique that does not require prior knowledge of the\n * number of clusters. It identifies centers of density in the data.\n *\n * @class\n * @extends Clustering<ParametersMeanShift>\n * @category Clustering\n */\nexport class MeanShift extends Clustering {\n    /** @type {number} */\n    _bandwidth;\n    /** @type {number} */\n    _max_iter;\n    /** @type {number} */\n    _tolerance;\n    /** @type {(dist: number) => number} */\n    _kernel;\n    /** @type {Matrix} */\n    _points;\n    /** @type {number[] | undefined} */\n    _clusters;\n    /** @type {number[][] | undefined} */\n    _cluster_list;\n    /**\n     *\n     * @param {InputType} points\n     * @param {Partial<ParametersMeanShift>} parameters\n     */\n    constructor(points, parameters = {}) {\n        super(\n            points,\n            /** @type {ParametersMeanShift} */ (\n                Object.assign({ seed: 1212, metric: euclidean, bandwidth: 0, kernel: \"gaussian\" }, parameters)\n            ),\n        );\n\n        // Ensure bandwidth is positive\n        this._bandwidth = parameters.bandwidth ?? this._compute_bandwidth(this._matrix);\n        this._max_iter = parameters.max_iter ?? Math.max(10, Math.floor(10 * Math.log10(this._N)));\n        this._tolerance = parameters.tolerance ?? 1e-3;\n        const kernel_param = parameters.kernel ?? \"gaussian\";\n        // If kernel is a string, map to function\n        if (typeof kernel_param === \"string\") {\n            if (kernel_param === \"flat\") {\n                this._kernel = (dist) => (dist <= this._bandwidth ? 1 : 0);\n            } else {\n                // gaussian (default)\n                this._kernel = (dist) => Math.exp(-(dist * dist) / (2 * this._bandwidth * this._bandwidth));\n            }\n        } else {\n            // custom function\n            this._kernel = kernel_param;\n        }\n\n        // Copy points to a mutable matrix\n        this._points = this._matrix.clone();\n\n        this._mean_shift();\n        this._assign_clusters();\n    }\n\n    // Helper to compute bandwidth if not provided\n    /**\n     * @param {Matrix} matrix\n     * @returns {number}\n     */\n    _compute_bandwidth(matrix) {\n        const N = matrix.shape[0];\n        //const D = matrix.shape[1];\n        // Compute average pairwise distance\n        let totalDist = 0;\n        for (let i = 0; i < N; ++i) {\n            const row_i = matrix.row(i);\n            for (let j = i + 1; j < N; ++j) {\n                const row_j = matrix.row(j);\n                const dist = this._parameters.metric(row_i, row_j);\n                totalDist += dist;\n            }\n        }\n        const avgDist = totalDist / ((N * (N - 1)) / 2);\n        // Use a fraction of avgDist as bandwidth\n        return avgDist / 2;\n    }\n\n    // Compute kernel weight\n    /**\n     * @param {number} dist\n     * @returns {number}\n     */\n    _kernel_weight(dist) {\n        return this._kernel(dist);\n    }\n\n    // Perform mean shift iterations\n    _mean_shift() {\n        const N = this._N;\n        const D = this._D;\n        const points = this._points;\n        const metric = this._parameters.metric;\n        //const bandwidth = this._bandwidth;\n        const kernel = this._kernel_weight.bind(this);\n        const tolerance = this._tolerance;\n\n        for (let iter = 0; iter < this._max_iter; ++iter) {\n            let max_shift = 0;\n            // For each point compute shift\n            for (let i = 0; i < N; ++i) {\n                const row_i = points.row(i);\n                let sum_weights = 0;\n                const weighted_sum = new Float64Array(D);\n                for (let j = 0; j < N; ++j) {\n                    const row_j = points.row(j);\n                    const dist = metric(row_i, row_j);\n                    const weight = kernel(dist);\n                    sum_weights += weight;\n                    for (let d = 0; d < D; ++d) {\n                        weighted_sum[d] += weight * row_j[d];\n                    }\n                }\n                if (sum_weights === 0) {\n                    // No neighbors within kernel, shift is zero\n                    //const shift = new Float64Array(D);\n                    // Compute shift magnitude\n                    const shift_norm = Math.sqrt(weighted_sum.reduce((acc, v) => acc + v * v, 0));\n                    max_shift = Math.max(max_shift, shift_norm);\n                } else {\n                    const shift = new Float64Array(D);\n                    for (let d = 0; d < D; ++d) {\n                        shift[d] = weighted_sum[d] / sum_weights - row_i[d];\n                    }\n                    const shift_norm = Math.sqrt(shift.reduce((acc, v) => acc + v * v, 0));\n                    max_shift = Math.max(max_shift, shift_norm);\n                    // Update point\n                    for (let d = 0; d < D; ++d) {\n                        row_i[d] += shift[d];\n                    }\n                }\n            }\n            if (max_shift < tolerance) {\n                // Converged\n                break;\n            }\n        }\n    }\n\n    // After convergence, assign clusters based on nearest mode\n    _assign_clusters() {\n        const N = this._N;\n        const metric = this._parameters.metric;\n        const bandwidth = this._bandwidth;\n\n        // Group points that converged to the same mode\n        // Two points are in the same mode if they're within bandwidth/2 of each other\n        const mode_threshold = bandwidth * 0.5;\n        /** @type {number[][]} */\n        const modes = []; // Each mode contains indices of points in that mode\n        const point_to_mode = new Array(N).fill(-1);\n\n        for (let i = 0; i < N; ++i) {\n            if (point_to_mode[i] !== -1) continue; // Already assigned to a mode\n\n            const row_i = this._points.row(i);\n            const mode = [i];\n            point_to_mode[i] = modes.length;\n\n            // Find all points close to this mode\n            for (let j = i + 1; j < N; ++j) {\n                if (point_to_mode[j] !== -1) continue;\n\n                const row_j = this._points.row(j);\n                const dist = metric(row_i, row_j);\n\n                if (dist < mode_threshold) {\n                    mode.push(j);\n                    point_to_mode[j] = modes.length;\n                }\n            }\n\n            modes.push(mode);\n        }\n\n        // Build final clusters - each mode becomes a cluster\n        /** @type {number[][]} */\n        const clusters = [];\n        const cluster_ids = new Array(N).fill(-1);\n\n        for (let mode_idx = 0; mode_idx < modes.length; ++mode_idx) {\n            const mode = modes[mode_idx];\n            clusters.push([...mode]);\n            for (const point_idx of mode) {\n                cluster_ids[point_idx] = mode_idx;\n            }\n        }\n\n        this._clusters = cluster_ids;\n        this._cluster_list = clusters;\n    }\n\n    /**\n     * @returns {number[][]}\n     */\n    get_clusters() {\n        // Ensure algorithm has been run\n        if (!this._cluster_list) {\n            this._mean_shift();\n            this._assign_clusters();\n        }\n        return /** @type {number[][]} */ (this._cluster_list);\n    }\n\n    /**\n     *\n     * @returns {number[]}\n     */\n    get_cluster_list() {\n        if (!this._clusters) {\n            this._mean_shift();\n            this._assign_clusters();\n        }\n        return /** @type {number[]} */ (this._clusters);\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Clustering } from \"./Clustering.js\";\n\n/** @import { InputType } from \"../index.js\" */\n/** @import { ParametersOptics } from \"./index.js\" */\n\n/** @typedef {Object} DBEntry\n * @property {Float64Array} element\n * @property {number} index\n * @property {number} [reachability_distance]\n * @property {boolean} processed\n * @property {DBEntry[]} [neighbors]\n */\n\n/**\n * OPTICS (Ordering Points To Identify the Clustering Structure)\n *\n * A density-based clustering algorithm that extends DBSCAN. It handles clusters of varying\n * densities and produces a reachability plot that can be used to extract clusters.\n *\n * @class\n * @extends Clustering<ParametersOptics>\n * @category Clustering\n */\nexport class OPTICS extends Clustering {\n    /**\n     * **O**rdering **P**oints **T**o **I**dentify the **C**lustering **S**tructure.\n     *\n     * @param {InputType} points - The data.\n     * @param {Partial<ParametersOptics>} [parameters={}]\n     * @see {@link https://www.dbs.ifi.lmu.de/Publikationen/Papers/OPTICS.pdf}\n     * @see {@link https://en.wikipedia.org/wiki/OPTICS_algorithm}\n     */\n    constructor(points, parameters = {}) {\n        super(\n            points,\n            /** @type {ParametersOptics} */ (\n                Object.assign({ epsilon: 1, min_points: 4, metric: euclidean }, parameters)\n            ),\n        );\n        const matrix = this._matrix;\n        /**\n         * @private\n         * @type {DBEntry[]}\n         */\n        this._ordered_list = [];\n        const ordered_list = this._ordered_list;\n        /** @type {number[][]} */\n        this._clusters = [];\n        const clusters = this._clusters;\n\n        const N = this._N;\n\n        /**\n         * @private\n         * @type {DBEntry[]}\n         */\n        this._DB = new Array(N).fill(0).map((_, i) => {\n            return {\n                element: matrix.row(i),\n                index: i,\n                reachability_distance: undefined,\n                processed: false,\n            };\n        });\n        const DB = this._DB;\n\n        this._cluster_index = 0;\n        let cluster_index = this._cluster_index;\n\n        for (const p of DB) {\n            if (p.processed) continue;\n            p.neighbors = this._get_neighbors(p);\n            p.processed = true;\n            clusters.push([p.index]);\n            cluster_index = clusters.length - 1;\n            ordered_list.push(p);\n            if (this._core_distance(p) !== undefined) {\n                const seeds = new Heap(null, (d) => d.reachability_distance, \"min\");\n                this._update(p, seeds);\n                this._expand_cluster(seeds, clusters[cluster_index]);\n            }\n        }\n    }\n\n    /**\n     * @private\n     * @param {DBEntry} p - A point of the data.\n     * @returns {DBEntry[]} An array consisting of the `epsilon`-neighborhood of `p`.\n     */\n    _get_neighbors(p) {\n        if (p?.neighbors) return p.neighbors;\n        const DB = this._DB;\n        const metric = this._parameters.metric;\n        const epsilon = this._parameters.epsilon;\n        const neighbors = [];\n        for (const q of DB) {\n            if (q.index === p.index) continue;\n            if (metric(p.element, q.element) <= epsilon) {\n                neighbors.push(q);\n            }\n        }\n        return neighbors;\n    }\n\n    /**\n     * @private\n     * @param {DBEntry} p - A point of `matrix`.\n     * @returns {number|undefined} The distance to the `min_points`-th nearest point of `p`, or undefined if the\n     *   `epsilon`-neighborhood has fewer elements than `min_points`.\n     */\n    _core_distance(p) {\n        const min_points = this._parameters.min_points;\n        const metric = this._parameters.metric;\n        // Need min_points - 1 other points plus the point itself\n        if (!p.neighbors || p.neighbors.length < min_points - 1) {\n            return undefined;\n        }\n        // Sort neighbors by distance to find the MinPts-th closest\n        const sortedNeighbors = p.neighbors.toSorted(\n            (a, b) => metric(p.element, a.element) - metric(p.element, b.element),\n        );\n        // MinPts-th closest is at index min_points - 2 (0-indexed, excluding p itself)\n        return metric(p.element, sortedNeighbors[min_points - 2].element);\n    }\n\n    /**\n     * Updates the reachability distance of the points.\n     *\n     * @private\n     * @param {DBEntry} p\n     * @param {Heap<DBEntry>} seeds\n     */\n    _update(p, seeds) {\n        const metric = this._parameters.metric;\n        const core_distance = this._core_distance(p);\n        // If p is not a core point, don't update seeds\n        if (core_distance === undefined) {\n            return;\n        }\n        const neighbors = this._get_neighbors(p); //p.neighbors;\n        for (const q of neighbors) {\n            if (q.processed) continue;\n            const new_reachability_distance = Math.max(core_distance, metric(p.element, q.element));\n            //if (q.reachability_distance == undefined) { // q is not in seeds\n            if (seeds.raw_data().findIndex((d) => d.element === q) < 0) {\n                q.reachability_distance = new_reachability_distance;\n                seeds.push(q);\n            } else {\n                // q is in seeds\n                if (new_reachability_distance < (q.reachability_distance ?? Infinity)) {\n                    q.reachability_distance = new_reachability_distance;\n                    seeds = Heap.heapify(seeds.data(), (d) => d.reachability_distance ?? Infinity, \"min\"); // seeds change key =/\n                }\n            }\n        }\n    }\n\n    /**\n     * Expands the `cluster` with points in `seeds`.\n     *\n     * @private\n     * @param {Heap<DBEntry>} seeds\n     * @param {number[]} cluster\n     */\n    _expand_cluster(seeds, cluster) {\n        const ordered_list = this._ordered_list;\n        while (!seeds.empty) {\n            const q = /** @type {{ element: DBEntry, value: number}} */ (seeds.pop()).element;\n            q.neighbors = this._get_neighbors(q);\n            q.processed = true;\n            cluster.push(q.index);\n            ordered_list.push(q);\n            if (this._core_distance(q) !== undefined) {\n                this._update(q, seeds);\n                // Recursive call removed - while loop handles iteration correctly\n            }\n        }\n    }\n\n    /**\n     * Returns an array of clusters.\n     *\n     * @returns {number[][]} Array of clusters with the indices of the rows in given `matrix`.\n     */\n    get_clusters() {\n        const clusters = [];\n        const outliers = [];\n        const min_points = this._parameters.min_points;\n        for (const cluster of this._clusters) {\n            if (cluster.length < min_points) {\n                outliers.push(...cluster);\n            } else {\n                clusters.push(cluster);\n            }\n        }\n        clusters.push(outliers);\n        return clusters;\n    }\n\n    /**\n     * @returns {number[]} Returns an array, where the ith entry defines the cluster affirmation of the ith point of\n     *   given data. (-1 stands for outlier)\n     */\n    get_cluster_list() {\n        const N = this._matrix.shape[0];\n        /** @type {number[]} */\n        const result = new Array(N).fill(0);\n        const clusters = this.get_clusters();\n        for (let i = 0, n = clusters.length; i < n; ++i) {\n            const cluster = clusters[i];\n            for (const index of cluster) {\n                result[index] = i < n - 1 ? i : -1;\n            }\n        }\n        return result;\n    }\n}\n","import { euclidean, euclidean_squared } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { Clustering } from \"./Clustering.js\";\nimport { KMeans } from \"./KMeans.js\";\n\n/** @import { InputType } from \"../index.js\" */\n/** @import { ParametersXMeans } from \"./index.js\" */\n\n/**\n * @typedef SplitResult\n * @property {number} index - Index of the cluster being split\n * @property {number} bic_parent - BIC score of the parent cluster\n * @property {number} bic_children - BIC score of the split children\n * @property {number[][]} child_clusters - Clusters after splitting\n * @property {Float64Array[]} child_centroids - Centroids of child clusters\n */\n\n/**\n * @typedef CandidateResult\n * @property {KMeans} kmeans - The KMeans instance for this K\n * @property {number} score - BIC score\n */\n\n/**\n * X-Means Clustering\n *\n * An extension of K-Means that automatically determines the number of clusters (K)\n * using the Bayesian Information Criterion (BIC).\n *\n * @class\n * @extends Clustering<ParametersXMeans>\n * @category Clustering\n */\nexport class XMeans extends Clustering {\n    /**\n     * XMeans clustering algorithm that automatically determines the optimal number of clusters.\n     *\n     * X-Means extends K-Means by starting with a minimum number of clusters and iteratively\n     * splitting clusters to improve the Bayesian Information Criterion (BIC).\n     *\n     * Algorithm:\n     * 1. Start with K_min clusters using KMeans\n     * 2. For each cluster, try splitting it into 2 sub-clusters\n     * 3. If BIC improves after splitting, keep the split\n     * 4. Run KMeans again with all (old + new) centroids\n     * 5. Repeat until K_max is reached or no more improvements\n     *\n     * @param {InputType} points - The data points to cluster\n     * @param {Partial<ParametersXMeans>} [parameters={}] - Configuration parameters\n     * @see {@link https://www.cs.cmu.edu/~dpelleg/download/xmeans.pdf}\n     * @see {@link https://github.com/annoviko/pyclustering/blob/master/pyclustering/cluster/xmeans.py}\n     * @see {@link https://github.com/haifengl/smile/blob/master/core/src/main/java/smile/clustering/XMeans.java}\n     */\n    constructor(points, parameters = {}) {\n        const defaults = {\n            K_max: 10,\n            K_min: 2,\n            metric: euclidean,\n            seed: 1212,\n            min_cluster_size: 35,\n            tolerance: 0.001,\n        };\n        super(points, /** @type {ParametersXMeans} */ (Object.assign(defaults, parameters)));\n        this._randomizer = new Randomizer(this._parameters.seed);\n\n        /** @type {KMeans | null} */\n        this._best_kmeans = null;\n\n        // Run XMeans algorithm\n        this._run();\n    }\n\n    /**\n     * Run the XMeans algorithm\n     *\n     * @private\n     */\n    _run() {\n        /** @type {Map<number, CandidateResult>} */\n        const candidates = new Map();\n        const A = this._matrix;\n\n        // Initialize with K_min clusters\n        let current_kmeans = new KMeans(this._points, {\n            K: this._parameters.K_min,\n            metric: this._parameters.metric,\n            seed: this._parameters.seed,\n        });\n\n        let K = this._parameters.K_min;\n\n        candidates.set(K, {\n            kmeans: current_kmeans,\n            score: -Infinity,\n        });\n\n        // Iteratively improve clustering\n        while (K < this._parameters.K_max) {\n            const clusters = current_kmeans.get_clusters();\n            const centroids = current_kmeans.centroids;\n\n            // Try splitting each cluster\n            /** @type {SplitResult[]} */\n            const split_results = [];\n\n            for (let j = 0; j < clusters.length; ++j) {\n                const cluster = clusters[j];\n\n                // Skip small clusters - need enough points for reliable BIC\n                if (cluster.length < this._parameters.min_cluster_size) {\n                    continue;\n                }\n\n                // Get subset data for this cluster\n                /** @type {number[][]} */\n                const subset_points = cluster.map((idx) => {\n                    const row = A.row(idx);\n                    return Array.from(row);\n                });\n\n                // Calculate BIC for parent (single cluster)\n                const parent_bic = this._bic([cluster], [centroids[j]]);\n\n                // Run KMeans with K=2 on subset\n                const subset_kmeans = new KMeans(subset_points, {\n                    K: 2,\n                    metric: this._parameters.metric,\n                    seed: this._randomizer.seed,\n                });\n\n                const child_clusters_local = subset_kmeans.get_clusters();\n                const child_centroids = subset_kmeans.centroids;\n\n                // Map local indices back to global indices\n                /** @type {number[][]} */\n                const child_clusters_global = child_clusters_local.map((local_cluster) =>\n                    local_cluster.map((local_idx) => cluster[local_idx]),\n                );\n\n                // Calculate BIC for children (split into 2 clusters)\n                const children_bic = this._bic(child_clusters_global, child_centroids);\n\n                split_results.push({\n                    index: j,\n                    bic_parent: parent_bic,\n                    bic_children: children_bic,\n                    child_clusters: child_clusters_global,\n                    child_centroids: child_centroids,\n                });\n            }\n\n            // Keep all splits that improve BIC (BIC_children > BIC_parent)\n            /** @type {SplitResult[]} */\n            const accepted_splits = split_results.filter((result) => result.bic_children > result.bic_parent);\n\n            // If no splits improve BIC, we're done\n            if (accepted_splits.length === 0) {\n                break;\n            }\n\n            // Build new centroids array: keep non-split centroids + add split centroids\n            /** @type {Float64Array[]} */\n            const new_centroids = [];\n            const split_indices = new Set();\n\n            // Sort accepted splits by improvement (descending)\n            accepted_splits.sort((a, b) => b.bic_children - b.bic_parent - (a.bic_children - a.bic_parent));\n\n            for (const split of accepted_splits) {\n                if (centroids.length + split_indices.size + 1 <= this._parameters.K_max) {\n                    split_indices.add(split.index);\n                } else {\n                    break;\n                }\n            }\n\n            for (let i = 0; i < centroids.length; ++i) {\n                if (split_indices.has(i)) {\n                    // This cluster was split - add both child centroids\n                    const split_result = accepted_splits.find((s) => s.index === i);\n                    if (split_result) {\n                        new_centroids.push(...split_result.child_centroids);\n                    }\n                } else {\n                    // This cluster wasn't split - keep its centroid\n                    new_centroids.push(centroids[i]);\n                }\n            }\n\n            // Run KMeans on full dataset with new centroids as initialization\n            // This is crucial - we need to reassign all points to all clusters\n            const newK = new_centroids.length;\n\n            // Create a new KMeans instance with K set to new number of clusters\n            current_kmeans = new KMeans(this._matrix, {\n                K: newK,\n                metric: this._parameters.metric,\n                seed: this._randomizer.seed,\n                initial_centroids: new_centroids,\n            });\n\n            // Store the candidate with the BIC of the FULL dataset\n            candidates.set(newK, {\n                kmeans: current_kmeans,\n                score: this._bic(current_kmeans.get_clusters(), current_kmeans.centroids),\n            });\n\n            K = newK;\n        }\n\n        // Select best candidate based on BIC score\n        this._best_kmeans = this._select_best_candidate(candidates);\n    }\n\n    /**\n     * Select the best candidate based on BIC score\n     *\n     * @private\n     * @param {Map<number, CandidateResult>} candidates\n     * @returns {KMeans}\n     */\n    _select_best_candidate(candidates) {\n        if (candidates.size === 0) {\n            throw new Error(\"No candidates found\");\n        }\n\n        const first_candidate = candidates.get(this._parameters.K_min);\n        if (!first_candidate) {\n            throw new Error(\"Missing initial candidate\");\n        }\n\n        let best_score = first_candidate.score;\n        /** @type {KMeans} */\n        let best_kmeans = first_candidate.kmeans;\n\n        for (const candidate of candidates.values()) {\n            if (candidate.score > best_score) {\n                best_score = candidate.score;\n                best_kmeans = candidate.kmeans;\n            }\n        }\n\n        return best_kmeans;\n    }\n\n    /**\n     * Calculate Bayesian Information Criterion for a set of clusters.\n     *\n     * Uses Kass's formula for BIC calculation:\n     * BIC(θ) = L(D) - 0.5 * p * ln(N)\n     *\n     * Where:\n     * - L(D) is the log-likelihood of the data\n     * - p is the number of free parameters: (K-1) + D*K + 1\n     * - N is the total number of points\n     *\n     * @private\n     * @param {number[][]} clusters - Array of clusters with point indices\n     * @param {Float64Array[]} centroids - Array of centroids\n     * @returns {number} BIC score (higher is better)\n     */\n    _bic(clusters, centroids) {\n        const A = this._matrix;\n        const D = this._D;\n        const K = centroids.length;\n\n        let total_variance = 0;\n        let N = 0;\n\n        // Calculate total variance (sum of squared distances)\n        for (let i = 0; i < K; ++i) {\n            const cluster = clusters[i];\n            const centroid = centroids[i];\n            N += cluster.length;\n\n            for (let j = 0; j < cluster.length; ++j) {\n                const point_idx = cluster[j];\n                const point = A.row(point_idx);\n                // Sum of squared distances (variance term)\n                total_variance += euclidean_squared(centroid, point);\n            }\n        }\n\n        // Not enough points for meaningful BIC\n        if (N <= K) {\n            return -Infinity;\n        }\n\n        // Estimate variance (ML estimate)\n        const variance = total_variance / (N - K);\n\n        // Handle case of zero variance (all points identical)\n        if (variance <= 0) {\n            return -Infinity;\n        }\n\n        // Number of free parameters: (K-1) cluster weights + K*D centroid coordinates + 1 variance\n        const p = K - 1 + D * K + 1;\n\n        // Calculate log-likelihood\n        let log_likelihood = 0;\n        const log_2pi = Math.log(2 * Math.PI);\n\n        for (let i = 0; i < K; ++i) {\n            const n = clusters[i].length;\n            if (n <= 1) continue;\n\n            // Log-likelihood for cluster i\n            const cluster_log_likelihood =\n                n * Math.log(n / N) - 0.5 * n * log_2pi - 0.5 * n * D * Math.log(variance) - 0.5 * (n - 1);\n\n            log_likelihood += cluster_log_likelihood;\n        }\n\n        // BIC = log_likelihood - 0.5 * p * ln(N)\n        return log_likelihood - 0.5 * p * Math.log(N);\n    }\n\n    /**\n     * Get the computed clusters\n     *\n     * @returns {number[][]} Array of clusters, each containing indices of points\n     */\n    get_clusters() {\n        if (!this._best_kmeans) {\n            throw new Error(\"XMeans has not been run\");\n        }\n        return this._best_kmeans.get_clusters();\n    }\n\n    /** @returns {number[]} The cluster list */\n    get_cluster_list() {\n        if (!this._best_kmeans) {\n            throw new Error(\"XMeans has not been run\");\n        }\n        return this._best_kmeans.get_cluster_list();\n    }\n\n    /**\n     * Get the final centroids\n     *\n     * @returns {Float64Array[]} Array of centroids\n     */\n    get centroids() {\n        if (!this._best_kmeans) {\n            throw new Error(\"XMeans has not been run\");\n        }\n        return this._best_kmeans.centroids;\n    }\n\n    /**\n     * Get the optimal number of clusters found\n     *\n     * @returns {number} The number of clusters\n     */\n    get k() {\n        if (!this._best_kmeans) {\n            throw new Error(\"XMeans has not been run\");\n        }\n        return this._best_kmeans.k;\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { Randomizer } from \"../util/index.js\";\n\n/** @import {InputType} from \"../index.js\" */\n\n/**\n * @abstract\n * @template {InputType} T\n * @template {{ seed?: number }} Para\n *\n * Base class for all Dimensionality Reduction (DR) algorithms.\n *\n * Provides a common interface for parameters management, data initialization,\n * and transformation (both synchronous and asynchronous).\n *\n * @class\n */\nexport class DR {\n    /** @type {number} */\n    _D;\n    /** @type {number} */\n    _N;\n    /** @type {Randomizer} */\n    _randomizer;\n    /** @type {boolean} */\n    _is_initialized;\n\n    /**\n     * Takes the default parameters and seals them, remembers the type of input `X`, and initializes the random number\n     * generator.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Para} default_parameters - Object containing default parameterization of the DR method.\n     * @param {Partial<Para>} parameters - Object containing parameterization of the DR method to override defaults.\n     */\n    constructor(X, default_parameters, parameters = {}) {\n        /** @type {T} */\n        this.__input = X;\n\n        /** @type {Para} */\n        this._parameters = /** @type {Para} */ Object.seal({\n            ...default_parameters,\n            ...parameters,\n        });\n        /** @type {\"array\" | \"matrix\" | \"typed\"} */\n        this._type;\n        /** @type {Matrix} */\n        this.X;\n        /** @type {Matrix} */\n        this.Y;\n\n        if (Array.isArray(X)) {\n            if (X[0] instanceof Float64Array) {\n                this._type = \"typed\";\n            } else {\n                this._type = \"array\";\n            }\n            this.X = Matrix.from(X);\n        } else if (X instanceof Matrix) {\n            this._type = \"matrix\";\n            this.X = X;\n        } else {\n            throw new Error(\"No valid type for X!\");\n        }\n        const [N, D] = this.X.shape;\n        this._N = N;\n        this._D = D;\n        this._randomizer = new Randomizer(this._parameters.seed);\n        this._is_initialized = false;\n    }\n\n    /**\n     * Get all Parameters.\n     * @overload\n     * @returns {Para}\n     */\n    /**\n     * Get value of given parameter.\n     * @template {keyof Para} K\n     * @overload\n     * @param {K} name - Name of the parameter.\n     * @returns {Para[K]}\n     */\n    /**\n     * Set value of given parameter.\n     * @template {keyof Para} K\n     * @overload\n     * @param {K} name - Name of the parameter.\n     * @param {Para[K]} value - Value of the parameter to set.\n     * @returns {this}\n     */\n    /**\n     * @param {keyof Para} [name] - Name of the parameter. If null, returns all parameters as an Object.\n     * @param {Para[keyof Para]} [value] - Value of the parameter to set. If name is set and value is not given, returns the\n     *   current value.\n     * @returns {Para | Para[keyof Para] | this} On setting a parameter, returns the DR object. If name is set and value is not\n     *   given, returns the parameter value. If name is null, returns all parameters. On setting a parameter, this\n     *   function returns the DR object. If `name` is set and `value == null` then return actual parameter value. If\n     *   `name` is not given, then returns all parameters as an Object.\n     * @example\n     * ```js\n     * const DR = new druid.TSNE(X, {d: 3}); // creates a new DR object, with parameter for `d = 3`.\n     * DR.parameter(\"d\"); // returns 3\n     * DR.parameter(\"d\", 2); // sets parameter `d` to 2 and returns `DR`.\n     * ```\n     *\n     */\n    parameter(name, value) {\n        if (name === undefined && value === undefined) {\n            return Object.assign({}, this._parameters);\n        }\n        if (name && !Object.hasOwn(this._parameters, name)) {\n            throw new Error(`${String(name)} is not a valid parameter!`);\n        }\n        if (name && value !== undefined) {\n            this._parameters[name] = value;\n            this._is_initialized = false;\n            return this;\n        } else if (name) {\n            return this._parameters[name];\n        }\n        throw new Error(\"Should not happen!\");\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @abstract\n     * @param {...unknown} args\n     * @returns {T} The projection.\n     */\n    transform(...args) {\n        args;\n        this.check_init();\n        return this.projection;\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @template {InputType} T\n     * @template {{ seed?: number }} Para\n     * @param {T} X\n     * @param {Para} parameters\n     * @param {...unknown} args - Takes the same arguments of the constructor of the respective DR method.\n     * @returns {T} The dimensionality reduced dataset.\n     */\n    static transform(X, parameters, ...args) {\n        args;\n        const dr = new DR(X, parameters, parameters);\n        return /** @type {T} */ (dr.transform());\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @abstract\n     * @param {...unknown} args\n     * @returns {Generator<T, T, void>} The intermediate steps of the projection.\n     */\n    *generator(...args) {\n        const R = this.transform(...args);\n        yield R;\n        return R;\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @template {{ seed?: number }} Para\n     * @param {InputType} X\n     * @param {Para} parameters\n     * @param {...unknown} args - Takes the same arguments of the constructor of the respective DR method.\n     * @returns {Generator<InputType, InputType, void>} A generator yielding the intermediate steps of the dimensionality\n     *   reduction method.\n     */\n    static *generator(X, parameters, ...args) {\n        const dr = new DR(X, parameters, parameters);\n        const generator = dr.generator(...args);\n        let result;\n        do {\n            result = generator.next();\n            yield result.value;\n        } while (!result.done);\n\n        return result.value;\n    }\n\n    /**\n     * @abstract\n     * @param {...unknown} args\n     */\n    init(...args) {\n        args;\n    }\n\n    /**\n     * If the respective DR method has an `init` function, call it before `transform`.\n     *\n     * @returns {DR<T, Para>}\n     */\n    check_init() {\n        if (!this._is_initialized && typeof this.init === \"function\") {\n            this.init();\n            this._is_initialized = true;\n        }\n        return this;\n    }\n\n    /** @returns {T} The projection in the type of input `X`. */\n    get projection() {\n        if (Object.hasOwn(this, \"Y\")) {\n            this.check_init();\n            //return this._type === \"matrix\" ? this.Y : this.Y.to2dArray();\n            if (this._type === \"matrix\") {\n                return /** @type {T} */ (/** @type {any} */ (this.Y));\n            } else if (this._type === \"typed\") {\n                return /** @type {T} */ (/** @type {any} */ (this.Y.to2dArray()));\n            } else {\n                return /** @type {T} */ (/** @type {any} */ (this.Y.asArray()));\n            }\n        } else {\n            throw new Error(\"The dataset is not transformed yet!\");\n        }\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @param {...unknown} args - Arguments the transform method of the respective DR method takes.\n     * @returns {Promise<T>} The dimensionality reduced dataset.\n     */\n    async transform_async(...args) {\n        return this.transform(...args);\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @template {{ seed?: number }} Para\n     * @param {InputType} X\n     * @param {Para} parameters\n     * @param {...unknown} args - Takes the same arguments of the constructor of the respective DR method.\n     * @returns {Promise<X>} A promise yielding the dimensionality reduced dataset.\n     */\n    static async transform_async(X, parameters, ...args) {\n        return DR.transform(X, parameters, ...args);\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import { InputType } from \"../index.js\" */\n/** @import { ParametersFASTMAP } from \"./index.js\"; */\n\n/**\n * FastMap algorithm for dimensionality reduction.\n *\n * A very fast algorithm for projecting high-dimensional data into a lower-dimensional\n * space while preserving pairwise distances. It works similarly to PCA but uses\n * only a subset of the data to find projection axes.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersFASTMAP>\n * @category Dimensionality Reduction\n */\nexport class FASTMAP extends DR {\n    /**\n     * FastMap: a fast algorithm for indexing, data-mining and visualization of traditional and multimedia datasets.\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersFASTMAP>} parameters - Object containing parameterization of the DR method.\n     * @see {@link https://doi.org/10.1145/223784.223812}\n     */\n    constructor(X, parameters) {\n        super(X, { d: 2, metric: euclidean, seed: 1212 }, parameters);\n    }\n\n    /**\n     * Chooses two points which are the most distant in the actual projection.\n     *\n     * @private\n     * @param {(a: number, b: number) => number} dist\n     * @returns {[number, number, number]} An array consisting of first index, second index, and distance between the\n     *   two points.\n     */\n    _choose_distant_objects(dist) {\n        const X = this.X;\n        const N = X.shape[0];\n        let a_index = this._randomizer.random_int % N;\n        /** @type {number | null} */\n        let b_index = null;\n        let max_dist = -Infinity;\n        for (let i = 0; i < N; ++i) {\n            const d_ai = dist(a_index, i);\n            if (d_ai > max_dist) {\n                max_dist = d_ai;\n                b_index = i;\n            }\n        }\n        if (b_index === null) throw new Error(\"should not happen!\");\n        max_dist = -Infinity;\n        for (let i = 0; i < N; ++i) {\n            const d_bi = dist(b_index, i);\n            if (d_bi > max_dist) {\n                max_dist = d_bi;\n                a_index = i;\n            }\n        }\n        return [a_index, b_index, max_dist];\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @returns {T} The `d`-dimensional projection of the data matrix `X`.\n     */\n    transform() {\n        const X = this.X;\n        const N = X.shape[0];\n        const d = /** @type {number} */ (this._parameters.d);\n        const metric = /** @type {typeof euclidean} */ (this._parameters.metric);\n        const Y = new Matrix(N, d, 0);\n        /** @type {(a: number, b: number) => number} */\n        let dist = (a, b) => metric(X.row(a), X.row(b));\n\n        for (let _col = 0; _col < d; ++_col) {\n            const old_dist = dist;\n            // choose pivot objects\n            const [a_index, b_index, d_ab] = this._choose_distant_objects(dist);\n            if (d_ab !== 0) {\n                // project the objects on the line (O_a, O_b)\n                for (let i = 0; i < N; ++i) {\n                    const d_ai = dist(a_index, i);\n                    const d_bi = dist(b_index, i);\n                    const y_i = (d_ai ** 2 + d_ab ** 2 - d_bi ** 2) / (2 * d_ab);\n                    Y.set_entry(i, _col, y_i);\n                }\n                // consider the projections of the objects on a\n                // hyperplane perpendicluar to the line (a, b);\n                // the distance function D'() between two\n                // projections is given by Eq.4\n                dist = (a, b) => Math.sqrt(old_dist(a, b) ** 2 - (Y.entry(a, _col) - Y.entry(b, _col)) ** 2);\n            }\n        }\n        // return embedding.\n        this.Y = Y;\n        return this.projection;\n    }\n\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersFASTMAP>} parameters\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new FASTMAP(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersFASTMAP>} parameters\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new FASTMAP(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersFASTMAP>} parameters\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new FASTMAP(X, parameters);\n        return dr.transform_async();\n    }\n}\n","/**\n * Base class for all K-Nearest Neighbors (KNN) search algorithms.\n *\n * Provides a common interface for elements management and search operations.\n *\n * @abstract\n * @category KNN\n * @template {number[] | Float64Array} T - Type of elements\n * @template {Object} Para - Type of parameters\n * @class\n */\nexport class KNN {\n    /** @type {T[]} */\n    _elements;\n    /** @type {Para} */\n    _parameters;\n    /** @type {\"typed\" | \"array\"} */\n    _type;\n\n    /**\n     * @param {T[]} elements\n     * @param {Para} parameters\n     */\n    constructor(elements, parameters) {\n        if (elements.length === 0) throw new Error(\"Elements needs to contain at least one element!\");\n        if (elements[0] instanceof Float64Array) {\n            this._type = \"typed\";\n        } else {\n            this._type = \"array\";\n        }\n        this._parameters = parameters;\n        this._elements = elements;\n    }\n\n    /**\n     * @abstract\n     * @param {T} t\n     * @param {number} k\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search(t, k) {\n        t;\n        k;\n        throw new Error(\"The function search must be implemented!\");\n    }\n\n    /**\n     * @abstract\n     * @param {number} i\n     * @param {number} k\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search_by_index(i, k) {\n        i;\n        k;\n        throw new Error(\"The function search_by_index must be implemented!\");\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n/** @import { ParametersAnnoy } from \"./index.js\" */\n\n/**\n * @template {number[] | Float64Array} T\n * @typedef {Object} AnnoyNode\n * @property {boolean} isLeaf - Whether this is a leaf node\n * @property {number[]} indices - Indices of points in this node (leaf) or children (internal)\n * @property {number[]} normal - Hyperplane normal vector (internal nodes only)\n * @property {number} offset - Hyperplane offset (internal nodes only)\n * @property {AnnoyNode<T> | null} left - Left child (internal nodes only)\n * @property {AnnoyNode<T> | null} right - Right child (internal nodes only)\n */\n\n/**\n * Annoy-style (Approximate Nearest Neighbors Oh Yeah) implementation using Random Projection Trees.\n *\n * This implementation builds multiple random projection trees where each tree randomly selects\n * two points and splits the space based on a hyperplane equidistant between them.\n *\n * Key features:\n * - Multiple random projection trees for better recall\n * - Each tree uses random hyperplanes for splitting\n * - Priority queue search for better recall\n * - Combines results from all trees\n *\n * Best suited for:\n * - High-dimensional data\n * - Approximate nearest neighbor search\n * - Large datasets\n * - When high recall is needed with approximate methods\n *\n * @class\n * @category KNN\n * @template {number[] | Float64Array} T\n * @extends KNN<T, ParametersAnnoy>\n * @see {@link https://github.com/spotify/annoy}\n * @see {@link https://erikbern.com/2015/09/24/nearest-neighbors-and-vector-models-epilogue-curse-of-dimensionality.html}\n */\nexport class Annoy extends KNN {\n    /**\n     * Creates a new Annoy-style index with random projection trees.\n     *\n     * @param {T[]} elements - Elements to index\n     * @param {ParametersAnnoy} [parameters={}] - Configuration parameters\n     */\n    constructor(\n        elements,\n        parameters = {\n            metric: euclidean,\n            numTrees: 10,\n            maxPointsPerLeaf: 10,\n            seed: 1212,\n        },\n    ) {\n        // Handle empty initialization - use dummy element\n        const hasElements = elements && elements.length > 0;\n        const firstElement = /** @type {T} */ (hasElements ? elements[0] : new Float64Array([0]));\n\n        super([firstElement], parameters);\n\n        this._metric = this._parameters.metric ?? euclidean;\n        this._numTrees = this._parameters.numTrees ?? 10;\n        this._maxPointsPerLeaf = this._parameters.maxPointsPerLeaf ?? 10;\n        this._seed = this._parameters.seed ?? 1212;\n        this._randomizer = new Randomizer(this._seed);\n\n        /**\n         * @private\n         * @type {AnnoyNode<T>[]}\n         */\n        this._trees = [];\n\n        // Build trees\n        if (hasElements) {\n            // Reset elements and rebuild properly\n            /** @type {T[]} */\n            this._elements = [];\n            this._trees = [];\n            this.add(elements);\n        }\n    }\n\n    /**\n     * Get the number of trees in the index.\n     * @returns {number}\n     */\n    get num_trees() {\n        return this._trees.length;\n    }\n\n    /**\n     * Get the total number of nodes in all trees.\n     * @returns {number}\n     */\n    get num_nodes() {\n        let total = 0;\n        for (const tree of this._trees) {\n            total += this._countNodes(tree);\n        }\n        return total;\n    }\n\n    /**\n     * @private\n     * @param {any} node\n     * @returns {number}\n     */\n    _countNodes(node) {\n        if (!node) return 0;\n        return 1 + this._countNodes(node.left) + this._countNodes(node.right);\n    }\n\n    /**\n     * Add elements to the Annoy index.\n     * @param {T[]} elements\n     * @returns {this}\n     */\n    add(elements) {\n        // Extend elements array\n        this._elements = this._elements.concat(elements);\n\n        // Rebuild all trees with new elements\n        this._trees = [];\n        this._buildTrees();\n\n        return this;\n    }\n\n    /**\n     * Build all random projection trees.\n     * @private\n     */\n    _buildTrees() {\n        const elements = this._elements;\n        const n = elements.length;\n\n        for (let t = 0; t < this._numTrees; t++) {\n            // Create index array for this tree\n            const indices = Array.from({ length: n }, (_, i) => i);\n            const tree = this._buildTreeRecursive(indices);\n            this._trees.push(tree);\n        }\n    }\n\n    /**\n     * Recursively build a random projection tree.\n     * @private\n     * @param {number[]} indices - Indices of elements to include\n     * @returns {AnnoyNode<T>}\n     */\n    _buildTreeRecursive(indices) {\n        const elements = this._elements;\n\n        // Base case: small enough to be a leaf\n        if (indices.length <= this._maxPointsPerLeaf) {\n            return {\n                isLeaf: true,\n                indices: indices,\n                normal: [],\n                offset: 0,\n                left: null,\n                right: null,\n            };\n        }\n\n        // Select two random points to define the splitting hyperplane\n        const idx1 = indices[Math.floor(this._randomizer.random * indices.length)];\n        const idx2 = indices[Math.floor(this._randomizer.random * indices.length)];\n\n        const point1 = elements[idx1];\n        const point2 = elements[idx2];\n\n        // Compute normal vector (point2 - point1)\n        const dim = point1.length;\n        /** @type {number[]} */\n        const normal = new Array(dim);\n        for (let i = 0; i < dim; i++) {\n            normal[i] = point2[i] - point1[i];\n        }\n\n        // Normalize\n        let norm = 0;\n        for (let i = 0; i < dim; i++) {\n            norm += normal[i] * normal[i];\n        }\n        norm = Math.sqrt(norm);\n\n        if (norm > 1e-10) {\n            for (let i = 0; i < dim; i++) {\n                normal[i] /= norm;\n            }\n        }\n\n        // Compute midpoint and offset\n        /** @type {number[]} */\n        const midpoint = new Array(dim);\n        for (let i = 0; i < dim; i++) {\n            midpoint[i] = (point1[i] + point2[i]) / 2;\n        }\n\n        // Compute offset: dot(normal, midpoint)\n        let offset = 0;\n        for (let i = 0; i < dim; i++) {\n            offset += normal[i] * midpoint[i];\n        }\n\n        // Split points based on which side of hyperplane they fall\n        const leftIndices = [];\n        const rightIndices = [];\n\n        for (const idx of indices) {\n            const point = elements[idx];\n            let dot = 0;\n            for (let i = 0; i < dim; i++) {\n                dot += normal[i] * point[i];\n            }\n\n            if (dot < offset) {\n                leftIndices.push(idx);\n            } else {\n                rightIndices.push(idx);\n            }\n        }\n\n        // Handle edge case where all points fall on one side\n        if (leftIndices.length === 0 || rightIndices.length === 0) {\n            return {\n                isLeaf: true,\n                indices: indices,\n                normal: [],\n                offset: 0,\n                left: null,\n                right: null,\n            };\n        }\n\n        // Recursively build subtrees\n        const left = this._buildTreeRecursive(leftIndices);\n        const right = this._buildTreeRecursive(rightIndices);\n\n        return {\n            isLeaf: false,\n            indices: [],\n            normal: normal,\n            offset: offset,\n            left: left,\n            right: right,\n        };\n    }\n\n    /**\n     * Compute distance from point to hyperplane.\n     * @private\n     * @param {T} point\n     * @param {number[]} normal\n     * @param {number} offset\n     * @returns {number} Signed distance (positive = right side, negative = left side)\n     */\n    _distanceToHyperplane(point, normal, offset) {\n        let dot = 0;\n        for (let i = 0; i < point.length; i++) {\n            dot += normal[i] * point[i];\n        }\n        return dot - offset;\n    }\n\n    /**\n     * Search for k approximate nearest neighbors.\n     * @param {T} query\n     * @param {number} [k=5]\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search(query, k = 5) {\n        const metric = this._metric;\n        const elements = this._elements;\n\n        if (elements.length === 0) return [];\n\n        // Collect candidates from all trees using priority queue\n        const candidates = new Set();\n\n        // Collect more candidates for better recall\n        // Search at least k * numTrees * 2 candidates\n        const minCandidates = Math.min(k * this._numTrees * 3, elements.length);\n\n        for (const tree of this._trees) {\n            this._searchTreePriority(tree, query, candidates, minCandidates);\n        }\n\n        // Compute exact distances for all candidates\n        /** @type {Heap<{ index: number; distance: number }>} */\n        const best = new Heap(null, (d) => d.distance, \"max\");\n\n        for (const idx of candidates) {\n            const element = elements[idx];\n            if (!element || element.length !== query.length) continue;\n\n            const dist = metric(query, element);\n\n            if (best.length < k) {\n                best.push({ index: idx, distance: dist });\n            } else if (dist < (best.first?.value ?? Infinity)) {\n                best.pop();\n                best.push({ index: idx, distance: dist });\n            }\n        }\n\n        // If we still don't have enough candidates, do a linear scan fallback\n        if (best.length < k) {\n            for (let i = 0; i < elements.length && best.length < k; i++) {\n                if (candidates.has(i)) continue;\n\n                const element = elements[i];\n                if (!element || element.length !== query.length) continue;\n\n                const dist = metric(query, element);\n                best.push({ index: i, distance: dist });\n            }\n        }\n\n        // Convert to result format\n        /** @type {{ element: T; index: number; distance: number }[]} */\n        const result = [];\n        while (best.length > 0) {\n            const item = /** @type {{ element: { index: number; distance: number }; value: number }} */ (best.pop());\n            result.push({\n                element: elements[item.element.index],\n                index: item.element.index,\n                distance: item.value,\n            });\n        }\n\n        return result.reverse();\n    }\n\n    /**\n     * Search tree using priority queue for better recall.\n     * Explores nodes in order of distance to hyperplane.\n     * @private\n     * @param {AnnoyNode<T>} node\n     * @param {T} query\n     * @param {Set<number>} candidates\n     * @param {number} maxCandidates\n     */\n    _searchTreePriority(node, query, candidates, maxCandidates) {\n        if (!node) return;\n\n        // Priority queue entry: { node, distance }\n        /** @type {Heap<{ node: AnnoyNode<T>; dist: number }>} */\n        const pq = new Heap(null, (d) => d.dist, \"min\");\n        pq.push({ node: node, dist: 0 });\n\n        while (!pq.empty && candidates.size < maxCandidates) {\n            const entry = pq.pop();\n            if (!entry) continue;\n\n            const currentNode = entry.element.node;\n\n            // Leaf node: add all points\n            if (currentNode.isLeaf) {\n                for (const idx of currentNode.indices) {\n                    candidates.add(idx);\n                    if (candidates.size >= maxCandidates) return;\n                }\n                continue;\n            }\n\n            // Internal node: compute distance to hyperplane\n            const dist = this._distanceToHyperplane(query, currentNode.normal, currentNode.offset);\n\n            // Determine which side is closer\n            const closerSide = dist < 0 ? currentNode.left : currentNode.right;\n            const fartherSide = dist < 0 ? currentNode.right : currentNode.left;\n\n            // Add closer side with priority 0 (explore first)\n            if (closerSide) {\n                pq.push({ node: closerSide, dist: 0 });\n            }\n\n            // Add farther side with priority = |dist| (explore later if needed)\n            if (fartherSide && candidates.size < maxCandidates) {\n                pq.push({ node: fartherSide, dist: Math.abs(dist) });\n            }\n        }\n    }\n\n    /**\n     * @param {number} i\n     * @param {number} [k=5]\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search_by_index(i, k = 5) {\n        if (i < 0 || i >= this._elements.length) return [];\n        return this.search(this._elements[i], k);\n    }\n\n    /**\n     * Alias for search_by_index for backward compatibility.\n     *\n     * @param {number} i - Index of the query element\n     * @param {number} [k=5] - Number of nearest neighbors to return\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search_index(i, k = 5) {\n        return this.search_by_index(i, k);\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n/** @import { ParametersBallTree } from \"./index.js\" */\n\n/**\n * @template {number[] | Float64Array} T\n * @typedef {Object} ElementWithIndex\n * @property {number} index\n * @property {T} element\n */\n\n/**\n * Ball Tree for efficient nearest neighbor search.\n *\n * A Ball Tree is a metric tree that partitions points into a nested set of\n * hyperspheres (balls). It is particularly effective for high-dimensional\n * data and supports any valid metric.\n *\n * @class\n * @category KNN\n * @template {number[] | Float64Array} T\n * @extends KNN<T, ParametersBallTree>\n */\nexport class BallTree extends KNN {\n    /**\n     * Generates a BallTree with given `elements`.\n     *\n     * @param {T[]} elements - Elements which should be added to the BallTree\n     * @param {ParametersBallTree} [parameters={metric: euclidean}] Default is `{metric: euclidean}`\n     * @see {@link https://en.wikipedia.org/wiki/Ball_tree}\n     * @see {@link https://github.com/invisal/noobjs/blob/master/src/tree/BallTree.js}\n     */\n    constructor(elements, parameters = { metric: euclidean, seed: 1212 }) {\n        super(elements, Object.assign({ seed: 1212 }, parameters));\n        /**\n         * @private\n         * @type {BallTreeNode<T> | BallTreeLeaf<T>}\n         */\n        this._root = this._construct(elements.map((element, index) => ({ index, element })));\n    }\n\n    /** @returns {Metric} */\n    get _metric() {\n        return this._parameters.metric;\n    }\n\n    /**\n     * @private\n     * @param {ElementWithIndex<T>[]} elements\n     * @returns {BallTreeNode<T> | BallTreeLeaf<T>} Root of balltree.\n     */\n    _construct(elements) {\n        if (elements.length === 1) {\n            return new BallTreeLeaf(elements);\n        } else {\n            const c = this._greatest_spread(elements);\n            const sorted_elements = elements.sort((a, b) => a.element[c] - b.element[c]);\n            const n = sorted_elements.length;\n            const p_index = Math.floor(n / 2);\n            const p = sorted_elements[p_index];\n            const L = sorted_elements.slice(0, p_index);\n            const R = sorted_elements.slice(p_index, n);\n            const radius = Math.max(...elements.map((d) => this._metric(p.element, d.element)));\n            let B;\n            if (L.length > 0 && R.length > 0) {\n                B = new BallTreeNode(p, this._construct(L), this._construct(R), radius);\n            } else {\n                B = new BallTreeLeaf(elements);\n            }\n            return B;\n        }\n    }\n\n    /**\n     * @private\n     * @param {ElementWithIndex<T>[]} B\n     * @returns {number}\n     */\n    _greatest_spread(B) {\n        const d = B[0].element.length;\n        const start = new Array(d);\n\n        for (let i = 0; i < d; ++i) {\n            start[i] = [Infinity, -Infinity];\n        }\n\n        let spread = B.reduce((acc, current) => {\n            for (let i = 0; i < d; ++i) {\n                acc[i][0] = Math.min(acc[i][0], current.element[i]);\n                acc[i][1] = Math.max(acc[i][1], current.element[i]);\n            }\n            return acc;\n        }, start);\n        spread = spread.map((d) => d[1] - d[0]);\n\n        let c = 0;\n        for (let i = 0; i < d; ++i) {\n            c = spread[i] > spread[c] ? i : c;\n        }\n        return c;\n    }\n\n    /**\n     * @param {number} i\n     * @param {number} k\n     */\n    search_by_index(i, k = 5) {\n        return this.search(this._elements[i], k);\n    }\n\n    /**\n     * @param {T} t - Query element.\n     * @param {number} [k=5] - Number of nearest neighbors to return. Default is `5`\n     * @returns {{ element: T; index: number; distance: number }[]} - List consists of the `k` nearest neighbors.\n     */\n    search(t, k = 5) {\n        /** @type {Heap<ElementWithIndex<T>>} */\n        const heap = new Heap(null, (d) => this._metric(d.element, t), \"max\");\n        this._search(t, k, heap, this._root);\n\n        // Convert heap to result array\n        /** @type {{ element: T; index: number; distance: number }[]} */\n        const result = [];\n        while (heap.length > 0) {\n            const item = /** @type {{ element: ElementWithIndex<T>; value: number }} */ (heap.pop());\n            result.push({\n                element: item.element.element,\n                index: item.element.index,\n                distance: item.value,\n            });\n        }\n        return result.reverse(); // Reverse to get closest first\n    }\n\n    /**\n     * @private\n     * @param {T} t - Query element.\n     * @param {number} k - Number of nearest neighbors to return.\n     * @param {Heap<ElementWithIndex<T>>} Q - Heap consists of the currently found `k` nearest neighbors.\n     * @param {BallTreeNode<T> | BallTreeLeaf<T>} B\n     */\n    _search(t, k, Q, B) {\n        if (!B) return;\n\n        if (B instanceof BallTreeNode) {\n            const dist_to_pivot = this._metric(t, B.pivot.element);\n            if (Q.length >= k && dist_to_pivot - B.radius >= (Q.first?.value ?? -Infinity)) {\n                return;\n            }\n\n            const c1 = B.child1;\n            const c2 = B.child2;\n\n            let d1 = Infinity;\n            let d2 = Infinity;\n\n            if (c1 instanceof BallTreeNode) d1 = this._metric(t, c1.pivot.element);\n            else if (c1 instanceof BallTreeLeaf) d1 = this._metric(t, c1.points[0].element);\n\n            if (c2 instanceof BallTreeNode) d2 = this._metric(t, c2.pivot.element);\n            else if (c2 instanceof BallTreeLeaf) d2 = this._metric(t, c2.points[0].element);\n\n            if (d1 < d2) {\n                if (c1) this._search(t, k, Q, c1);\n                if (c2) this._search(t, k, Q, c2);\n            } else {\n                if (c2) this._search(t, k, Q, c2);\n                if (c1) this._search(t, k, Q, c1);\n            }\n        } else if (B instanceof BallTreeLeaf) {\n            for (let i = 0, n = B.points.length; i < n; ++i) {\n                const p = B.points[i];\n                const dist = this._metric(p.element, t);\n                if (Q.length < k) {\n                    Q.push(p);\n                } else if (dist < (Q.first?.value ?? Infinity)) {\n                    Q.pop();\n                    Q.push(p);\n                }\n            }\n        }\n    }\n}\n\n/**\n * @private\n * @template {number[] | Float64Array} T\n */\nclass BallTreeNode {\n    /**\n     * @param {ElementWithIndex<T>} pivot\n     * @param {BallTreeNode<T> | BallTreeLeaf<T> | null} child1\n     * @param {BallTreeNode<T> | BallTreeLeaf<T> | null} child2\n     * @param {number} radius\n     */\n    constructor(pivot, child1 = null, child2 = null, radius = 0) {\n        this.pivot = pivot;\n        this.child1 = child1;\n        this.child2 = child2;\n        this.radius = radius;\n    }\n}\n\n/**\n * @private\n * @template {number[] | Float64Array} T\n */\nclass BallTreeLeaf {\n    /** @param {ElementWithIndex<T>[]} points */\n    constructor(points) {\n        this.points = points;\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n/** @import { ParametersHNSW } from \"./index.js\" */\n\n/**\n * @typedef {Object} Layer\n * @property {number} l_c - Layer number\n * @property {number[]} point_indices - Global indices of points in this layer\n * @property {Map<number, number[]>} edges - Global index -> array of connected global indices\n */\n\n/**\n * @template {number[] | Float64Array} T\n * @typedef {Object} Candidate\n * @property {T} element - The actual data point\n * @property {number} index - Global index in the dataset\n * @property {number} distance - Distance from query\n */\n\n/**\n * Hierarchical Navigable Small World (HNSW) graph for approximate nearest neighbor search.\n *\n * HNSW builds a multi-layer graph structure where each layer is a navigable small world graph.\n * The top layers serve as \"highways\" for fast traversal, while lower layers provide accuracy.\n * Each element is assigned to a random level, allowing logarithmic search complexity.\n *\n * Key parameters:\n * - `m`: Controls the number of connections per element (affects accuracy/memory)\n * - `ef_construction`: Controls the quality of the graph during construction (higher = better but slower)\n * - `ef`: Controls the quality of search (higher = better recall but slower)\n *\n * Based on:\n * - \"Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs\"\n *   by Malkov & Yashunin (2016)\n * - \"Approximate Nearest Neighbor Search on High Dimensional Data\"\n *   by Li et al. (2019)\n *\n * @class\n * @category KNN\n * @template {number[] | Float64Array} T\n * @extends KNN<T, ParametersHNSW>\n *\n * @example\n * import * as druid from \"@saehrimnir/druidjs\";\n *\n * const points = [[1, 2], [3, 4], [5, 6], [7, 8]];\n * const hnsw = new druid.HNSW(points, {\n *     metric: druid.euclidean,\n *     m: 16,\n *     ef_construction: 200\n * });\n *\n * const query = [2, 3];\n * const neighbors = hnsw.search(query, 2);\n * // [{ element: [1, 2], index: 0, distance: 1.41 }, ...]\n */\nexport class HNSW extends KNN {\n    /**\n     * Creates a new HNSW index.\n     *\n     * @param {T[]} points - Initial points to add to the index\n     * @param {ParametersHNSW} [parameters={}] - Configuration parameters\n     */\n    constructor(\n        points,\n        parameters = {\n            metric: euclidean,\n            heuristic: true,\n            m: 16,\n            ef_construction: 200,\n            m0: null,\n            mL: null,\n            seed: 1212,\n            ef: 50,\n        },\n    ) {\n        // Handle empty initialization - use dummy element\n        const hasElements = points && points.length > 0;\n        let firstElement = /** @type {T} */ (hasElements ? points[0] : new Float64Array([0]));\n\n        // Validate all points have consistent dimensions\n        if (hasElements) {\n            const expected_dim = firstElement.length;\n            for (let i = 1; i < points.length; i++) {\n                if (!points[i] || points[i].length !== expected_dim) {\n                    console.warn(\n                        `HNSW: Point ${i} has inconsistent dimensions (expected ${expected_dim}, got ${points[i]?.length})`,\n                    );\n                    // Remove invalid points\n                    points = points.filter((_, idx) => idx === 0 || points[idx]?.length === expected_dim);\n                    firstElement = points[0];\n                }\n            }\n        }\n\n        super([firstElement], parameters);\n\n        // Store reference to elements before clearing\n        const elementsToAdd = hasElements ? [...points] : [];\n        /** @type {T[]} */\n        this._elements = [];\n\n        /** @type {Metric} */\n        this._metric = this._parameters.metric || euclidean;\n\n        /** @type {Function} */\n        this._select = this._parameters.heuristic ? this._select_heuristic.bind(this) : this._select_simple.bind(this);\n\n        /**\n         * @private\n         * @type {Map<number, Layer>}\n         */\n        this._graph = new Map();\n\n        /** @type {number} */\n        this._next_index = 0;\n\n        // Validate and set parameters\n        const m_param = this._parameters.m ?? 16;\n        if (m_param <= 0 || !Number.isInteger(m_param)) {\n            throw new Error(\"HNSW: parameter 'm' must be a positive integer\");\n        }\n        /** @type {number} */\n        this._m = Math.max(2, m_param);\n\n        const ef_construction_param = this._parameters.ef_construction ?? 200;\n        if (ef_construction_param <= 0 || !Number.isInteger(ef_construction_param)) {\n            throw new Error(\"HNSW: parameter 'ef_construction' must be a positive integer\");\n        }\n        /** @type {number} */\n        this._ef_construction = ef_construction_param;\n\n        const ef_param = this._parameters.ef ?? 50;\n        if (ef_param <= 0 || !Number.isInteger(ef_param)) {\n            throw new Error(\"HNSW: parameter 'ef' must be a positive integer\");\n        }\n        /** @type {number} */\n        this._ef = ef_param;\n\n        const m0_param = this._parameters.m0 ?? 2 * this._m;\n        if (m0_param <= 0 || !Number.isInteger(m0_param)) {\n            throw new Error(\"HNSW: parameter 'm0' must be a positive integer\");\n        }\n        /** @type {number} */\n        this._m0 = m0_param;\n\n        /** @type {number} */\n        this._mL = this._parameters.mL ?? 1 / Math.log(this._m);\n\n        /** @type {Randomizer} */\n        this._randomizer = new Randomizer(this._parameters.seed);\n\n        /** @type {number} - Current maximum layer in the graph */\n        this._L = -1;\n\n        /** @type {number[] | null} - Entry point indices for search */\n        this._ep = null;\n\n        // Add initial points\n        if (elementsToAdd && elementsToAdd.length > 0) {\n            this.add(elementsToAdd);\n        }\n    }\n\n    /**\n     * Add a single element to the index.\n     *\n     * @param {T} element - Element to add\n     * @returns {HNSW<T>} This instance for chaining\n     */\n    addOne(element) {\n        return this.add([element]);\n    }\n\n    /**\n     * Add multiple elements to the index.\n     *\n     * @param {T[]} new_elements - Elements to add\n     * @returns {HNSW<T>} This instance for chaining\n     */\n    add(new_elements) {\n        // Handle empty array\n        if (!new_elements || new_elements.length === 0) {\n            return this;\n        }\n\n        const m = this._m;\n        const ef_construction = this._ef_construction;\n        const m0 = this._m0;\n        const mL = this._mL;\n        const randomizer = this._randomizer;\n        const graph = this._graph;\n\n        // Ensure _elements is a proper array that supports push\n        if (!Array.isArray(this._elements)) {\n            this._elements = Array.from(this._elements);\n        }\n        const elements = this._elements;\n\n        // Get expected dimension from first existing element or first new element\n        const expected_dim = elements.length > 0 ? elements[0].length : new_elements[0]?.length;\n\n        for (const element of new_elements) {\n            // Validate element\n            if (!element || (!Array.isArray(element) && !(element instanceof Float64Array))) {\n                console.warn(\"HNSW: Skipping invalid element (null, undefined, or not an array)\");\n                continue;\n            }\n\n            // Validate dimensions\n            if (element.length !== expected_dim) {\n                console.warn(\n                    `HNSW: Skipping element with wrong dimensions (expected ${expected_dim}, got ${element.length})`,\n                );\n                continue;\n            }\n\n            elements.push(element);\n            const global_index = elements.length - 1;\n\n            // Assign random level to the element\n            // Level is drawn from exponential distribution: l = floor(-ln(uniform(0,1)) * mL)\n            const rand = Math.max(randomizer.random, 1e-10); // Avoid log(0)\n            const l = Math.min(31, Math.floor(-Math.log(rand) * mL));\n\n            let ep_indices = this._ep ? [...this._ep] : null;\n            const L = this._L;\n\n            if (L >= 0) {\n                // Search from top layer down to min(L, l) + 1\n                // These are the layers where element will NOT be inserted\n                for (let l_c = L; l_c > l; --l_c) {\n                    const search_result = this._search_layer(element, ep_indices, 1, l_c);\n                    if (search_result.length > 0) {\n                        ep_indices = [search_result[0].index];\n                    }\n                }\n\n                // Insert element into layers l down to 0\n                for (let l_c = Math.min(L, l); l_c >= 0; --l_c) {\n                    const layer = graph.get(l_c);\n                    if (!layer) continue;\n\n                    layer.point_indices.push(global_index);\n\n                    // Search for ef_construction nearest neighbors\n                    let W = this._search_layer(element, ep_indices, ef_construction, l_c);\n\n                    // If graph search returns no results (e.g., graph is empty or disconnected),\n                    // fall back to linear search over all existing elements\n                    if (W.length === 0 && elements.length > 1) {\n                        const fallbackCandidates = [];\n                        for (let i = 0; i < elements.length - 1; i++) {\n                            const elem = elements[i];\n                            if (elem && elem.length === element.length) {\n                                fallbackCandidates.push({\n                                    element: elem,\n                                    index: i,\n                                    distance: this._metric(element, elem),\n                                });\n                            }\n                        }\n                        fallbackCandidates.sort((a, b) => a.distance - b.distance);\n                        W = fallbackCandidates.slice(0, ef_construction);\n                        // Update ep_indices for next layer based on fallback results\n                        if (l_c === Math.min(L, l)) {\n                            ep_indices = W.map((c) => c.index);\n                        }\n                    }\n\n                    // Select neighbors using heuristic or simple approach (respect heuristic setting on all layers)\n                    const neighbor_indices = this._select(element, W, l_c === 0 ? m0 : m, l_c);\n\n                    // Add bidirectional connections\n                    for (const neighbor_idx of neighbor_indices) {\n                        if (neighbor_idx === global_index) continue;\n\n                        // Add connection from element to neighbor\n                        if (!layer.edges.has(global_index)) {\n                            layer.edges.set(global_index, []);\n                        }\n                        layer.edges.get(global_index)?.push(neighbor_idx);\n\n                        // Add connection from neighbor to element\n                        if (!layer.edges.has(neighbor_idx)) {\n                            layer.edges.set(neighbor_idx, []);\n                        }\n                        const neighbor_edge_list = layer.edges.get(neighbor_idx);\n                        if (neighbor_edge_list && !neighbor_edge_list.includes(global_index)) {\n                            neighbor_edge_list.push(global_index);\n                        }\n\n                        // Prune connections if too many\n                        const max_conn = l_c === 0 ? m0 : m;\n                        const neighbor_edges = layer.edges.get(neighbor_idx);\n                        if (neighbor_edges && neighbor_edges.length > max_conn) {\n                            const neighbor_element = elements[neighbor_idx];\n                            // Filter out self-connections before pruning\n                            const valid_neighbor_edges = neighbor_edges.filter((idx) => idx !== neighbor_idx);\n                            const neighbor_candidates = valid_neighbor_edges.map((idx) => ({\n                                element: elements[idx],\n                                index: idx,\n                                distance: this._metric(neighbor_element, elements[idx]),\n                            }));\n                            const pruned =\n                                l_c === 0\n                                    ? this._select_simple(neighbor_element, neighbor_candidates, max_conn)\n                                    : this._select(neighbor_element, neighbor_candidates, max_conn, l_c);\n                            layer.edges.set(neighbor_idx, pruned);\n                        }\n                    }\n\n                    // Use closest neighbor as entry point for next layer (following HNSW paper)\n                    if (W.length > 0) {\n                        ep_indices = [W[0].index];\n                    }\n                }\n            }\n\n            // If element's level is higher than current max, create new layers\n            if (l > L) {\n                for (let i = L + 1; i <= l; ++i) {\n                    graph.set(i, {\n                        l_c: i,\n                        point_indices: [global_index],\n                        edges: new Map(),\n                    });\n                }\n                // Element becomes the new entry point\n                this._ep = [global_index];\n                this._L = l;\n            }\n\n            // Special case: if this is the first element (L was -1),\n            // we need to ensure layer 0 has proper structure for future insertions\n            if (L === -1) {\n                if (!graph.has(0)) {\n                    graph.set(0, {\n                        l_c: 0,\n                        point_indices: [global_index],\n                        edges: new Map(),\n                    });\n                }\n                const layer0 = graph.get(0);\n                if (layer0 && !layer0.edges.has(global_index)) {\n                    layer0.edges.set(global_index, []);\n                }\n            }\n        }\n\n        return this;\n    }\n\n    /**\n     * Select neighbors using the heuristic approach.\n     *\n     * The heuristic extends candidates with their neighbors and selects\n     * points that are closer to the query than to already selected points.\n     * This maintains graph connectivity better than simple selection.\n     *\n     * @private\n     * @param {T} q - Query element\n     * @param {Candidate<T>[]} candidates - Candidate elements with distances\n     * @param {number} M - Maximum number of neighbors to return\n     * @param {number} l_c - Layer number\n     * @param {boolean} [extend_candidates=true] - Whether to extend candidates with their neighbors\n     * @param {boolean} [keep_pruned_connections=true] - Whether to add pruned connections back if needed\n     * @returns {number[]} Selected neighbor indices\n     */\n    _select_heuristic(q, candidates, M, l_c, extend_candidates = true, keep_pruned_connections = true) {\n        if (l_c > this._L) {\n            return candidates.map((c) => c.index);\n        }\n\n        const metric = this._metric;\n        const layer = this._graph.get(l_c);\n        const elements = this._elements;\n\n        // Extend candidate set with neighbors of candidates\n        const W_set = new Set(candidates.map((c) => c.index));\n        if (extend_candidates) {\n            for (const c of candidates) {\n                const edges = layer?.edges.get(c.index);\n                if (edges) {\n                    for (const neighbor_idx of edges) {\n                        W_set.add(neighbor_idx);\n                    }\n                }\n            }\n        }\n\n        // Create extended candidates with distances\n        const W = [...W_set]\n            .map((idx) => ({\n                element: elements[idx],\n                index: idx,\n                distance: metric(elements[idx], q),\n            }))\n            .sort((a, b) => a.distance - b.distance);\n\n        const R = [];\n        const W_discarded = [];\n\n        // Select neighbors: prefer points closer to query than to already selected points\n        for (const e of W) {\n            if (R.length >= M) break;\n\n            let should_add = true;\n\n            // Check if e is closer to query than to any already selected point\n            for (const r of R) {\n                const dist_er = metric(e.element, r.element);\n                if (dist_er < e.distance) {\n                    should_add = false;\n                    break;\n                }\n            }\n\n            if (should_add) {\n                R.push(e);\n            } else {\n                W_discarded.push(e);\n            }\n        }\n\n        // Add discarded connections if we need more\n        if (keep_pruned_connections && R.length < M) {\n            for (const e of W_discarded) {\n                if (R.length >= M) break;\n                R.push(e);\n            }\n        }\n\n        return R.map((c) => c.index);\n    }\n\n    /**\n     * Select neighbors using simple distance-based selection.\n     *\n     * Simply returns the M closest candidates to the query.\n     *\n     * @private\n     * @param {T} q - Query element\n     * @param {Candidate<T>[]} C - Candidate elements with distances\n     * @param {number} M - Maximum number of neighbors to return\n     * @returns {number[]} M nearest candidate indices\n     */\n    _select_simple(q, C, M) {\n        if (C.length <= M) return C.map((c) => c.index);\n\n        // Candidates already have distance computed, use it directly\n        return C.slice()\n            .sort((a, b) => a.distance - b.distance)\n            .slice(0, M)\n            .map((c) => c.index);\n    }\n\n    /**\n     * Search a single layer for nearest neighbors.\n     *\n     * Implements the greedy search algorithm: start from entry points,\n     * always expand the closest unvisited candidate, maintain a list\n     * of the ef closest found neighbors.\n     *\n     * @private\n     * @param {T} q - Query element\n     * @param {number[] | null} ep_indices - Entry point indices\n     * @param {number} ef - Number of nearest neighbors to find\n     * @param {number} l_c - Layer number to search\n     * @returns {Candidate<T>[]} ef nearest neighbors found with their distances\n     */\n    _search_layer(q, ep_indices, ef, l_c) {\n        const metric = this._metric;\n        const layer = this._graph.get(l_c);\n        const elements = this._elements;\n\n        if (!layer || layer.edges.size === 0 || !ep_indices || ep_indices.length === 0) {\n            return [];\n        }\n\n        // Filter out invalid indices\n        const valid_ep_indices = ep_indices.filter((idx) => elements[idx] !== undefined);\n        if (valid_ep_indices.length === 0) {\n            return [];\n        }\n\n        // Visited set to avoid cycles\n        const visited = new Set(valid_ep_indices);\n\n        // Candidate set (min-heap): closest unvisited candidates to expand\n        const C = new Heap(\n            valid_ep_indices.map((idx) => ({\n                element: elements[idx],\n                index: idx,\n                distance: metric(elements[idx], q),\n            })),\n            (item) => item.distance,\n            \"min\",\n        );\n\n        // Result set (max-heap): ef closest found neighbors\n        const W = new Heap(\n            valid_ep_indices.map((idx) => ({\n                element: elements[idx],\n                index: idx,\n                distance: metric(elements[idx], q),\n            })),\n            (item) => item.distance,\n            \"max\",\n        );\n\n        // Algorithm 2 stops when the distance from query to the next candidate is greater\n        // than the distance to the furthest element in the result set W.\n        while (!C.empty) {\n            const c = C.pop();\n            if (!c) break;\n            const furthest_dist = W.first?.value ?? Infinity;\n\n            // Stop if current candidate is farther than furthest result\n            if (c.value > furthest_dist) {\n                break;\n            }\n\n            const edges = layer.edges.get(c.element.index);\n            if (!edges) continue;\n\n            for (const neighbor_idx of edges) {\n                if (!visited.has(neighbor_idx)) {\n                    const neighbor_element = elements[neighbor_idx];\n                    // Skip invalid elements or elements with different dimensions\n                    if (!neighbor_element || neighbor_element.length !== q.length) continue;\n\n                    // Skip self-connections\n                    if (neighbor_idx === c.element.index) continue;\n\n                    visited.add(neighbor_idx);\n                    const dist_e = metric(neighbor_element, q);\n\n                    const current_furthest = W.first?.value ?? Infinity;\n                    if (dist_e < current_furthest || W.length < ef) {\n                        C.push({\n                            element: neighbor_element,\n                            index: neighbor_idx,\n                            distance: dist_e,\n                        });\n                        W.push({\n                            element: neighbor_element,\n                            index: neighbor_idx,\n                            distance: dist_e,\n                        });\n\n                        if (W.length > ef) {\n                            W.pop();\n                        }\n                    }\n                }\n            }\n        }\n\n        // Return sorted results for consistent entry point selection\n        return W.data().sort((a, b) => a.distance - b.distance);\n    }\n\n    /**\n     * Searches for the K nearest neighbors to a query element in the HNSW graph.\n     *\n     * Performs a multi-layer search starting from the entry point and traversing\n     * each layer as entry points for the next.\n     *\n     * @param {T} q - Query element\n     * @param {number} K - Number of nearest neighbors to return\n     * @returns {Candidate<T>[]} K nearest neighbors with their distances\n     */\n    search(q, K) {\n        // Validate K\n        if (!Number.isInteger(K) || K <= 0) {\n            throw new Error(\"HNSW: parameter 'K' must be a positive integer\");\n        }\n\n        // Validate query dimensions\n        if (!q || (!Array.isArray(q) && !(q instanceof Float64Array))) {\n            throw new Error(\"HNSW: query must be an array\");\n        }\n\n        const search_ef = this._ef;\n\n        // Fallback to linear search if graph is not properly initialized\n        if (this._L < 0 || !this._ep || this._elements.length === 0) {\n            return this._linear_search(q, K);\n        }\n\n        let ep_indices = [...this._ep];\n\n        // Search from top layer down to layer 1\n        for (let l_c = this._L; l_c > 0; --l_c) {\n            const result = this._search_layer(q, ep_indices, 1, l_c);\n            if (result.length > 0) {\n                ep_indices = [result[0].index];\n            }\n        }\n\n        // Search layer 0 with ef candidates\n        const result = this._search_layer(q, ep_indices, Math.max(search_ef, K), 0);\n\n        // If graph search returns no results, fallback to linear search\n        if (result.length === 0) {\n            return this._linear_search(q, K);\n        }\n\n        // Return K closest\n        return result.slice(0, K);\n    }\n\n    /**\n     * Fallback linear search when graph search fails\n     * @private\n     * @param {T} q - Query element\n     * @param {number} K - Number of nearest neighbors to return\n     * @returns {Candidate<T>[]}\n     */\n    _linear_search(q, K) {\n        const metric = this._metric;\n        const elements = this._elements;\n        const N = elements.length;\n\n        if (N === 0) return [];\n\n        /** @type {Candidate<T>[]} */\n        const candidates = [];\n        for (let i = 0; i < N; i++) {\n            const element = elements[i];\n            // Skip elements with different dimensions (can happen with inconsistent data)\n            if (!element || element.length !== q.length) continue;\n\n            candidates.push({\n                element: element,\n                index: i,\n                distance: metric(q, element),\n            });\n        }\n\n        candidates.sort((a, b) => a.distance - b.distance);\n        return candidates.slice(0, K);\n    }\n\n    /**\n     * Iterator for searching the HNSW graph layer by layer.\n     *\n     * Yields intermediate results at each layer for debugging or visualization.\n     *\n     * @param {T} q - Query element\n     * @param {number} K - Number of nearest neighbors to return\n     * @param {number?} [ef] - Size of dynamic candidate list\n     * @yields {{layer: number, candidates: Candidate[]}}\n     */\n    *search_iter(q, K, ef = null) {\n        const search_ef = ef ?? this._ef;\n\n        if (this._L < 0 || !this._ep) {\n            return;\n        }\n\n        let ep_indices = [...this._ep];\n\n        // Yield entry points at top layer instead of query itself\n        const top_layer = this._graph.get(this._L);\n        if (top_layer && this._ep && this._ep.length > 0) {\n            const entry_candidates = this._ep\n                .filter((idx) => this._elements[idx] !== undefined)\n                .map((idx) => ({\n                    element: this._elements[idx],\n                    index: idx,\n                    distance: this._metric(this._elements[idx], q),\n                }));\n            yield {\n                layer: this._L,\n                candidates: entry_candidates,\n            };\n        }\n\n        for (let l_c = this._L; l_c > 0; --l_c) {\n            const result = this._search_layer(q, ep_indices, 1, l_c);\n            yield { layer: l_c, candidates: result };\n            // Use closest candidate as entry point for next layer (following HNSW paper)\n            ep_indices = result.length > 0 ? [result[0].index] : ep_indices;\n        }\n\n        const result = this._search_layer(q, ep_indices, Math.max(search_ef, K), 0);\n        yield { layer: 0, candidates: result };\n    }\n\n    /**\n     * Get the number of elements in the index.\n     *\n     * @returns {number} Number of elements\n     */\n    get size() {\n        return this._elements?.length ?? 0;\n    }\n\n    /**\n     * Get the number of layers in the graph.\n     *\n     * @returns {number} Number of layers\n     */\n    get num_layers() {\n        return this._L + 1;\n    }\n\n    /**\n     * Get an element by its index.\n     *\n     * @param {number} index - Element index\n     * @returns {T} The element at the given index\n     */\n    get_element(index) {\n        return this._elements[index];\n    }\n\n    /**\n     * Search for nearest neighbors using an element index as the query.\n     *\n     * @param {number} i - Index of the query element\n     * @param {number} [K=5] - Number of nearest neighbors to return\n     * @returns {Candidate<T>[]} K nearest neighbors\n     */\n    search_by_index(i, K = 5) {\n        const elements = this._elements;\n        if (i < 0 || i >= elements.length) return [];\n\n        const element = elements[i];\n        if (!element) return [];\n\n        return this.search(element, K);\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n/** @import { ParametersKDTree } from \"./index.js\" */\n\n/**\n * @template {number[] | Float64Array} T\n * @typedef {Object} ElementWithIndex\n * @property {number} index\n * @property {T} element\n */\n\n/**\n * KD-Tree (K-dimensional Tree) for efficient nearest neighbor search.\n *\n * KD-Trees partition k-dimensional space by recursively splitting along coordinate axes.\n * At each level, the tree splits points based on the median of the coordinate with the largest spread.\n * This creates a balanced binary tree structure that enables efficient O(log n) search on average.\n *\n * Best suited for:\n * - Low to moderate dimensional data (d < 20-30)\n * - When exact nearest neighbors are needed\n * - When dimensionality is not too high\n *\n * Performance degrades in high dimensions (curse of dimensionality) where approximate\n * methods like HNSW or LSH become more effective.\n *\n * @class\n * @category KNN\n * @template {number[] | Float64Array} T\n * @extends KNN<T, ParametersKDTree>\n * @see {@link https://en.wikipedia.org/wiki/K-d_tree}\n */\nexport class KDTree extends KNN {\n    /**\n     * Generates a KD-Tree with given `elements`.\n     *\n     * @param {T[]} elements - Elements which should be added to the KD-Tree\n     * @param {ParametersKDTree} [parameters={metric: euclidean}] Default is `{metric: euclidean}`\n     */\n    constructor(elements, parameters = { metric: euclidean, seed: 1212 }) {\n        super(elements, Object.assign({ seed: 1212 }, parameters));\n        /**\n         * @private\n         * @type {KDTreeNode<T> | KDTreeLeaf<T> | null}\n         */\n        this._root = this._construct(\n            elements.map((element, index) => ({ index, element })),\n            0,\n        );\n    }\n\n    /** @returns {Metric} */\n    get _metric() {\n        return this._parameters.metric;\n    }\n\n    /**\n     * @private\n     * @param {ElementWithIndex<T>[]} elements\n     * @param {number} depth - Current depth in the tree (determines splitting axis)\n     * @returns {KDTreeNode<T> | KDTreeLeaf<T> | null} Root of KD-Tree.\n     */\n    _construct(elements, depth) {\n        if (elements.length === 0) {\n            return null;\n        }\n\n        if (elements.length === 1) {\n            return new KDTreeLeaf(elements[0]);\n        }\n\n        const k = elements[0].element.length;\n        const axis = depth % k;\n\n        // Sort by the splitting axis and find median\n        elements.sort((a, b) => a.element[axis] - b.element[axis]);\n        const medianIndex = Math.floor(elements.length / 2);\n        const medianPoint = elements[medianIndex];\n\n        // Recursively build left and right subtrees\n        const leftElements = elements.slice(0, medianIndex);\n        const rightElements = elements.slice(medianIndex + 1);\n\n        const left = this._construct(leftElements, depth + 1);\n        const right = this._construct(rightElements, depth + 1);\n\n        return new KDTreeNode(medianPoint, axis, left, right);\n    }\n\n    /**\n     * @param {number} i\n     * @param {number} k\n     */\n    search_by_index(i, k = 5) {\n        return this.search(this._elements[i], k);\n    }\n\n    /**\n     * @param {T} t - Query element.\n     * @param {number} [k=5] - Number of nearest neighbors to return. Default is `5`\n     * @returns {{ element: T; index: number; distance: number }[]} - List consists of the `k` nearest neighbors.\n     */\n    search(t, k = 5) {\n        /** @type {Heap<{ point: ElementWithIndex<T>; distance: number }>} */\n        const best = new Heap(null, (d) => d.distance, \"max\");\n\n        this._search_recursive(t, k, this._root, best);\n\n        // Convert heap to result array (closest first)\n        /** @type {{ element: T; index: number; distance: number }[]} */\n        const result = [];\n        while (best.length > 0) {\n            const item = /** @type {{ element: { point: ElementWithIndex<T>; distance: number }; value: number }} */ (\n                best.pop()\n            );\n            result.push({\n                element: item.element.point.element,\n                index: item.element.point.index,\n                distance: item.value,\n            });\n        }\n        return result.reverse();\n    }\n\n    /**\n     * @private\n     * @param {T} target - Query element.\n     * @param {number} k - Number of nearest neighbors to return.\n     * @param {KDTreeNode<T> | KDTreeLeaf<T> | null} node - Current node.\n     * @param {Heap<{ point: ElementWithIndex<T>; distance: number }>} best - Heap of k best found so far.\n     */\n    _search_recursive(target, k, node, best) {\n        if (node === null) return;\n\n        if (node instanceof KDTreeLeaf) {\n            const dist = this._metric(target, node.point.element);\n            if (best.length < k) {\n                best.push({ point: node.point, distance: dist });\n            } else if (dist < (best.first?.value ?? Infinity)) {\n                best.pop();\n                best.push({ point: node.point, distance: dist });\n            }\n            return;\n        }\n\n        // Node is an internal node\n        const axis = node.axis;\n        const point = node.point;\n        const pointValue = point.element[axis];\n        const targetValue = target[axis];\n\n        // Determine which subtree to search first\n        const firstSubtree = targetValue < pointValue ? node.left : node.right;\n        const secondSubtree = targetValue < pointValue ? node.right : node.left;\n\n        // Search the nearer subtree\n        this._search_recursive(target, k, firstSubtree, best);\n\n        // Check if we need to search the other subtree\n        // The hyperplane could contain closer points\n        const distToHyperplane = Math.abs(targetValue - pointValue);\n        const currentMaxDist = best.first?.value ?? Infinity;\n\n        // Calculate distance to current point\n        const distToPoint = this._metric(target, point.element);\n        if (best.length < k) {\n            best.push({ point: point, distance: distToPoint });\n        } else if (distToPoint < currentMaxDist) {\n            best.pop();\n            best.push({ point: point, distance: distToPoint });\n        }\n\n        // Check if we need to explore the other side of the hyperplane\n        if (best.length < k || distToHyperplane < (best.first?.value ?? Infinity)) {\n            this._search_recursive(target, k, secondSubtree, best);\n        }\n    }\n}\n\n/**\n * @private\n * @template {number[] | Float64Array} T\n */\nclass KDTreeNode {\n    /**\n     * @param {ElementWithIndex<T>} point\n     * @param {number} axis - The splitting axis\n     * @param {KDTreeNode<T> | KDTreeLeaf<T> | null} left\n     * @param {KDTreeNode<T> | KDTreeLeaf<T> | null} right\n     */\n    constructor(point, axis, left = null, right = null) {\n        this.point = point;\n        this.axis = axis;\n        this.left = left;\n        this.right = right;\n    }\n}\n\n/**\n * @private\n * @template {number[] | Float64Array} T\n */\nclass KDTreeLeaf {\n    /**\n     * @param {ElementWithIndex<T>} point\n     */\n    constructor(point) {\n        this.point = point;\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n/** @import { ParametersLSH } from \"./index.js\" */\n\n/**\n * Locality Sensitive Hashing (LSH) for approximate nearest neighbor search.\n *\n * LSH uses hash functions that map similar items to the same buckets with high probability.\n * This implementation uses Random Projection hashing (SimHash-style) which works well for\n * cosine similarity and Euclidean distance.\n *\n * Key concepts:\n * - Multiple hash tables increase recall probability\n * - Each hash function projects data onto random hyperplanes\n * - Points on the same side of hyperplanes are hashed together\n * - Combines results from all tables for better accuracy\n *\n * Best suited for:\n * - High-dimensional data where exact methods fail\n * - Approximate nearest neighbor needs\n * - Large datasets where linear scan is too slow\n * - When some false positives/negatives are acceptable\n *\n * @class\n * @category KNN\n * @template {number[] | Float64Array} T\n * @extends KNN<T, ParametersLSH>\n * @see {@link https://en.wikipedia.org/wiki/Locality-sensitive_hashing}\n */\nexport class LSH extends KNN {\n    /**\n     * Creates a new LSH index.\n     *\n     * @param {T[]} elements - Elements to index\n     * @param {ParametersLSH} [parameters={}] - Configuration parameters\n     */\n    constructor(\n        elements,\n        parameters = {\n            metric: euclidean,\n            numHashTables: 10,\n            numHashFunctions: 10,\n            seed: 1212,\n        },\n    ) {\n        // Handle empty initialization - use dummy element\n        const hasElements = elements && elements.length > 0;\n        const firstElement = /** @type {T} */ (hasElements ? elements[0] : new Float64Array([0]));\n\n        super([firstElement], parameters);\n\n        this._metric = this._parameters.metric ?? euclidean;\n        this._numHashTables = this._parameters.numHashTables ?? 10;\n        this._numHashFunctions = this._parameters.numHashFunctions ?? 10;\n        this._seed = this._parameters.seed ?? 1212;\n        this._randomizer = new Randomizer(this._seed);\n\n        // Hash tables: array of Maps where key is hash bucket, value is array of element indices\n        /** @type {Map<string, number[]>[]} */\n        this._hashTables = [];\n\n        // Random projection vectors for each hash table and hash function\n        /** @type {Float64Array[][]} */\n        this._projections = [];\n\n        // Random offsets for each hash table and hash function (for quantization)\n        /** @type {number[][]} */\n        this._offsets = [];\n\n        // Store dimensionality for later\n        /** @type {number} */\n        this._dim = firstElement.length;\n\n        // Initialize hash functions\n        this._initializeHashFunctions();\n\n        // Reset elements if we were initialized with dummy\n        if (!hasElements) {\n            /** @type {T[]} */\n            this._elements = [];\n        } else {\n            // Clear and re-add elements properly\n            /** @type {T[]} */\n            this._elements = [];\n            this._hashTables = [];\n            this._projections = [];\n            this._offsets = [];\n            this._initializeHashFunctions();\n            this.add(elements);\n        }\n    }\n\n    /**\n     * Initialize random projection vectors for all hash tables.\n     * @private\n     */\n    _initializeHashFunctions() {\n        const dim = this._elements[0]?.length ?? 0;\n\n        for (let t = 0; t < this._numHashTables; t++) {\n            const tableProjections = [];\n            const tableOffsets = [];\n\n            for (let h = 0; h < this._numHashFunctions; h++) {\n                // Generate random projection vector (normalized)\n                const projection = new Float64Array(dim);\n                let norm = 0;\n                for (let i = 0; i < dim; i++) {\n                    // Box-Muller transform for normal distribution\n                    const u1 = this._randomizer.random;\n                    const u2 = this._randomizer.random;\n                    const z = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n                    projection[i] = z;\n                    norm += z * z;\n                }\n                // Normalize\n                norm = Math.sqrt(norm);\n                for (let i = 0; i < dim; i++) {\n                    projection[i] /= norm;\n                }\n\n                tableProjections.push(projection);\n                // Random offset for quantization buckets\n                tableOffsets.push(this._randomizer.random);\n            }\n\n            this._projections.push(tableProjections);\n            this._offsets.push(tableOffsets);\n            this._hashTables.push(new Map());\n        }\n    }\n\n    /**\n     * Compute hash signature for an element using random projections.\n     * @private\n     * @param {T} element\n     * @param {number} tableIndex\n     * @returns {string} Hash signature\n     */\n    _computeHash(element, tableIndex) {\n        const projections = this._projections[tableIndex];\n        const offsets = this._offsets[tableIndex];\n        const bits = [];\n\n        for (let i = 0; i < this._numHashFunctions; i++) {\n            // Compute dot product\n            let dot = 0;\n            const proj = projections[i];\n            for (let j = 0; j < element.length; j++) {\n                dot += element[j] * proj[j];\n            }\n            // Quantize with offset\n            const bucket = Math.floor(dot + offsets[i]);\n            bits.push(bucket);\n        }\n\n        return bits.join(\",\");\n    }\n\n    /**\n     * Add elements to the LSH index.\n     * @param {T[]} elements\n     * @returns {this}\n     */\n    add(elements) {\n        // Extend elements array\n        const startIndex = this._elements.length;\n        this._elements = this._elements.concat(elements);\n\n        // Hash each new element and add to tables\n        for (let i = 0; i < elements.length; i++) {\n            const globalIndex = startIndex + i;\n            const element = elements[i];\n\n            for (let t = 0; t < this._numHashTables; t++) {\n                const hash = this._computeHash(element, t);\n                const table = this._hashTables[t];\n\n                if (!table.has(hash)) {\n                    table.set(hash, []);\n                }\n                const bucket = table.get(hash);\n                if (bucket) {\n                    bucket.push(globalIndex);\n                }\n            }\n        }\n\n        return this;\n    }\n\n    /**\n     * Search for k approximate nearest neighbors.\n     * @param {T} query\n     * @param {number} [k=5]\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search(query, k = 5) {\n        const metric = this._metric;\n        const elements = this._elements;\n\n        if (elements.length === 0) return [];\n\n        // Collect candidate indices from all hash tables\n        const candidates = new Set();\n\n        for (let t = 0; t < this._numHashTables; t++) {\n            const hash = this._computeHash(query, t);\n            const table = this._hashTables[t];\n            const bucket = table.get(hash);\n\n            if (bucket) {\n                for (const idx of bucket) {\n                    if (idx !== undefined) {\n                        candidates.add(idx);\n                    }\n                }\n            }\n        }\n\n        // If insufficient candidates found, fall back to linear search\n        if (candidates.size < k) {\n            // Add more candidates from all buckets or entire dataset\n            //const needed = k - candidates.size;\n\n            // First, try to add from neighboring buckets (different hashes)\n            for (let t = 0; t < this._numHashTables && candidates.size < k; t++) {\n                const table = this._hashTables[t];\n                for (const [, bucket] of table) {\n                    for (const idx of bucket) {\n                        if (idx !== undefined) {\n                            candidates.add(idx);\n                            if (candidates.size >= k) break;\n                        }\n                    }\n                    if (candidates.size >= k) break;\n                }\n            }\n\n            // If still not enough, add from entire dataset\n            for (let i = 0; i < elements.length && candidates.size < k; i++) {\n                candidates.add(i);\n            }\n        }\n\n        // Compute exact distances for candidates\n        /** @type {Heap<{ index: number; distance: number }>} */\n        const best = new Heap(null, (d) => d.distance, \"max\");\n\n        for (const idx of candidates) {\n            const element = elements[idx];\n            if (!element || element.length !== query.length) continue;\n\n            const dist = metric(query, element);\n\n            if (best.length < k) {\n                best.push({ index: idx, distance: dist });\n            } else if (dist < (best.first?.value ?? Infinity)) {\n                best.pop();\n                best.push({ index: idx, distance: dist });\n            }\n        }\n\n        // Convert to result format\n        /** @type {{ element: T; index: number; distance: number }[]} */\n        const result = [];\n        while (best.length > 0) {\n            const item = /** @type {{ element: { index: number; distance: number }; value: number }} */ (best.pop());\n            result.push({\n                element: elements[item.element.index],\n                index: item.element.index,\n                distance: item.value,\n            });\n        }\n\n        return result.reverse();\n    }\n\n    /**\n     * @param {number} i\n     * @param {number} [k=5]\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search_by_index(i, k = 5) {\n        if (i < 0 || i >= this._elements.length) return [];\n        return this.search(this._elements[i], k);\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { ParametersNaiveKNN } from \"./index.js\" */\n\n/**\n * Naive KNN implementation using a distance matrix.\n *\n * This implementation pre-computes the entire distance matrix and performs\n * an exhaustive search. Best suited for small datasets or when a distance\n * matrix is already available.\n *\n * @template {number[] | Float64Array} T\n * @category KNN\n * @class\n * @extends KNN<T, ParametersNaiveKNN>\n */\nexport class NaiveKNN extends KNN {\n    /**\n     * Generates a KNN list with given `elements`.\n     *\n     * @param {T[]} elements - Elements which should be added to the KNN list\n     * @param {ParametersNaiveKNN} parameters\n     */\n    constructor(elements, parameters = {}) {\n        const params = Object.assign({ metric: euclidean, seed: 1212 }, parameters);\n        super(elements, params);\n        const N =\n            this._elements instanceof Matrix ? /** @type {any} */ (this._elements).shape[0] : this._elements.length;\n        if (this._parameters.metric === \"precomputed\") {\n            this._D = Matrix.from(/** @type {number[][] | Float64Array[]} */ (/** @type {any} */ (this._elements)));\n        } else {\n            this._D = distance_matrix(\n                /** @type {number[][] | Float64Array[]} */ (this._elements),\n                this._parameters.metric,\n            );\n        }\n\n        /** @type {Heap<{ value: number; index: number }>[]} */\n        this.KNN = [];\n        for (let row = 0; row < N; ++row) {\n            const distances = this._D.row(row);\n            /** @type {Heap<{ value: number; index: number }>} */\n            const H = new Heap(null, (d) => d.value, \"min\");\n            for (let j = 0; j < N; ++j) {\n                H.push({\n                    value: distances[j],\n                    index: j,\n                });\n            }\n            this.KNN.push(H);\n        }\n    }\n\n    /**\n     * @param {number} i\n     * @param {number} k\n     */\n    search_by_index(i, k = 5) {\n        if (this._parameters.metric === \"precomputed\") {\n            const H = this.KNN[i];\n            /** @type {{ element: T; index: number; distance: number }[]} */\n            const result = [];\n            const data = H.toArray(); // Get array representation\n            const temp_heap = new Heap(data, (d) => d.value, \"min\");\n            const N =\n                this._elements instanceof Matrix ? /** @type {any} */ (this._elements).shape[0] : this._elements.length;\n            for (let j = 0; j < Math.min(k, N); ++j) {\n                const node = temp_heap.pop();\n                if (!node) break;\n                result.push({\n                    element: /** @type {T} */ (\n                        this._elements instanceof Matrix\n                            ? /** @type {any} */ (this._elements).row(node.element.index)\n                            : this._elements[node.element.index]\n                    ),\n                    index: /** @type {number} */ (node.element.index),\n                    distance: /** @type {number} */ (node.value),\n                });\n            }\n            return result;\n        }\n        return this.search(\n            /** @type {T} */ (\n                this._elements instanceof Matrix ? /** @type {any} */ (this._elements).row(i) : this._elements[i]\n            ),\n            k,\n        );\n    }\n\n    /**\n     * @param {T} t - Query element.\n     * @param {number} [k=5] - Number of nearest neighbors to return. Default is `5`\n     * @returns {{ element: T; index: number; distance: number }[]} - List consists of the `k` nearest neighbors.\n     */\n    search(t, k = 5) {\n        if (this._parameters.metric === \"precomputed\") {\n            throw new Error(\"Search by query element is only possible when not using a precomputed distance matrix!\");\n        }\n        /** @type {import(\"../metrics/index.js\").Metric} */\n        const metric = /** @type {any} */ (this._parameters.metric);\n\n        const isMatrix = this._elements instanceof Matrix;\n        const elementsAny = /** @type {any} */ (this._elements);\n        const N = isMatrix ? elementsAny.shape[0] : this._elements.length;\n\n        // Compute distances from query to ALL points\n        const distances = [];\n        for (let i = 0; i < N; i++) {\n            const element = /** @type {T} */ (isMatrix ? elementsAny.row(i) : this._elements[i]);\n            distances.push({\n                element: element,\n                index: i,\n                distance: metric(t, element),\n            });\n        }\n\n        // Sort by distance and return k nearest\n        distances.sort((a, b) => a.distance - b.distance);\n        return distances.slice(0, k);\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import {ParametersNNDescent} from \"./index.js\" */\n/**\n *\n * @template {number[] | Float64Array} T\n * @typedef {Object} NNDescentElement\n * @property {T} value\n * @property {number} index\n * @property {boolean} flag\n */\n\n/**\n * @template {number[] | Float64Array} T\n * @typedef {Object} NNDescentNeighbor\n * @property {T} value\n * @property {number} index\n * @property {number} distance\n * @property {boolean} [flag]\n */\n\n/**\n * NN-Descent\n *\n * An efficient graph-based approximate nearest neighbor search algorithm.\n * It works by iteratively improving a neighbor graph using the fact that\n * \"neighbors of neighbors are likely to be neighbors\".\n *\n * @class\n * @category KNN\n * @template {number[] | Float64Array} T\n * @extends KNN<T, ParametersNNDescent>\n * @see {@link http://www.cs.princeton.edu/cass/papers/www11.pdf|NN-Descent Paper}\n */\nexport class NNDescent extends KNN {\n    /**\n     * @private\n     * @type {KNNHeap<T>[]}\n     */\n    _B = [];\n    /**\n     * @private\n     * @type {NNDescentNeighbor<T>[][]}\n     */\n    nn = [];\n\n    /**\n     * @param {T[]} elements - Called V in paper.\n     * @param {Partial<ParametersNNDescent>} parameters\n     * @see {@link http://www.cs.princeton.edu/cass/papers/www11.pdf}\n     */\n    constructor(elements, parameters = {}) {\n        super(\n            elements,\n            /** @type {ParametersNNDescent} */ (\n                Object.assign({ metric: euclidean, K: 10, rho: 1, delta: 1e-3, seed: 1212 }, parameters)\n            ),\n        );\n        this._N = elements.length;\n        this._randomizer = new Randomizer(this._parameters.seed);\n        this._sample_size = this._parameters.samples * this._parameters.rho;\n\n        this._nndescent_elements = elements.map((e, i) => {\n            return {\n                value: e,\n                index: i,\n                flag: true,\n            };\n        });\n\n        if (elements) {\n            this.add(elements);\n        }\n    }\n\n    /**\n     * Samples Array A with sample size.\n     *\n     * @private\n     * @template U\n     * @param {U[]} A\n     * @returns {U[]}\n     */\n    _sample(A) {\n        const n = A.length;\n        const sample_size = this._sample_size;\n        if (sample_size > n) {\n            return A;\n        } else {\n            const randomizer = this._randomizer;\n            return randomizer.choice(A, sample_size);\n        }\n    }\n\n    /**\n     * @private\n     * @param {KNNHeap<T>} B\n     * @param {NNDescentNeighbor<T>} u\n     * @returns {number}\n     */\n    _update(B, u) {\n        if (B.set.has(u.index)) return 0;\n\n        const worst = B.first;\n        if (worst && B.length >= this._parameters.samples) {\n            const dist = B._accessor(u);\n            const worst_dist = B._accessor(worst.element);\n            if (dist >= worst_dist) {\n                return 0; // u is worse than the worst neighbor\n            }\n        }\n\n        B.push(u);\n        u.flag = true;\n        if (B.length > this._parameters.samples) {\n            B.pop();\n        }\n        return 1;\n    }\n\n    /**\n     * @private\n     * @param {(KNNHeap<T> | null)[]} B\n     * @returns {NNDescentNeighbor<T>[][]}\n     */\n    _reverse(B) {\n        const N = this._N;\n        const R = new Array(N);\n        for (let i = 0; i < N; i++) {\n            R[i] = [];\n        }\n        for (let j = 0; j < N; j++) {\n            const Bi = B[j];\n            if (Bi) {\n                const Bjdata = Bi.data();\n                for (const neighbor of Bjdata) {\n                    const v = neighbor.index;\n                    R[v].push(neighbor);\n                }\n            }\n        }\n        return R;\n    }\n\n    /**\n     * @param {T[]} elements\n     * @returns {this}\n     */\n    add(elements) {\n        const randomizer = this._randomizer;\n        const metric = this._parameters.metric;\n        const K = this._parameters.samples;\n        const delta = this._parameters.delta;\n        const N = elements.length;\n        this._N = N;\n        /** @type {KNNHeap<T>[]} */\n        const B = [];\n        this._B = B;\n        for (let i = 0; i < N; i++) {\n            const e = elements[i];\n            const sample = randomizer\n                .choice(\n                    elements.map((el, idx) => ({ el, idx })),\n                    K,\n                )\n                .map((d) => {\n                    return { index: d.idx, distance: metric(d.el, e), value: d.el };\n                });\n            const Bi = new KNNHeap(sample, (d) => d.distance, \"max\");\n            B.push(Bi);\n        }\n\n        let c = Infinity;\n        let old_c = -Infinity;\n        while (c > delta * N * K && c !== old_c) {\n            const old_ = new Array(N);\n            const new_ = new Array(N);\n            for (let i = 0; i < N; i++) {\n                const Bi = B[i].data();\n                const falseBs = Bi.filter((d) => !d.flag);\n                const trueBs = this._sample(Bi.filter((d) => d.flag));\n                for (const d of trueBs) {\n                    d.flag = false;\n                }\n                old_[i] = new KNNHeap(falseBs, (d) => d.distance, \"max\");\n                new_[i] = new KNNHeap(trueBs, (d) => d.distance, \"max\");\n            }\n            const old_reverse = this._reverse(old_);\n            const new_reverse = this._reverse(new_);\n            old_c = c;\n            c = 0;\n            for (let i = 0; i < N; i++) {\n                for (const o of this._sample(old_reverse[i])) {\n                    old_[i].push(o);\n                }\n                for (const n of this._sample(new_reverse[i])) {\n                    new_[i].push(n);\n                }\n\n                const new_i = new_[i].data();\n                const old_i = old_[i].data();\n                const n1 = new_i.length;\n                const n2 = old_i.length;\n                for (let j = 0; j < n1; j++) {\n                    const u1 = new_i[j];\n                    const Bu1 = B[u1.index];\n                    for (let k = 0; k < n1; k++) {\n                        const u2 = new_i[k];\n                        if (u1.index === u2.index) continue;\n                        const Bu2 = B[u2.index];\n                        c += this._update(Bu2, u1);\n                        c += this._update(Bu1, u2);\n                    }\n                    for (let k = 0; k < n2; k++) {\n                        const u2 = old_i[k];\n                        if (u1.index === u2.index) continue;\n                        const Bu2 = B[u2.index];\n                        c += this._update(Bu2, u1);\n                        c += this._update(Bu1, u2);\n                    }\n                }\n            }\n        }\n        this.nn = this._B.map((heap) => heap.data());\n        return this;\n    }\n\n    /**\n     * @param {T} x\n     * @param {number} [k=5] Default is `5`\n     * @returns {{ element: T, index: number; distance: number }[]}\n     */\n    search(x, k = 5) {\n        const metric = this._parameters.metric;\n        const N = this._N;\n        const elements = this._elements;\n\n        if (N === 0) return [];\n        const xLength = x.length;\n\n        // Initialize candidate pool\n        const visited = new Set();\n        /** @type {{index: number, dist: number, evaluated: boolean}[]} */\n        let pool = [];\n\n        // Randomly pick initial candidates\n        const randomizer = this._randomizer;\n        for (let i = 0; i < Math.min(N, Math.max(k * 10, 50)); i++) {\n            let rnd;\n            do {\n                rnd = randomizer.random_int % N;\n            } while (visited.has(rnd));\n            visited.add(rnd);\n\n            const element = elements[rnd];\n            if (!element || element.length !== xLength) continue;\n\n            pool.push({\n                index: rnd,\n                dist: metric(x, element),\n                evaluated: false,\n            });\n        }\n\n        let searching = true;\n        while (searching) {\n            pool.sort((a, b) => a.dist - b.dist);\n            // keep the top subset for exploration\n            pool = pool.slice(0, Math.max(k * 5, 50));\n\n            searching = false;\n            for (let i = 0; i < pool.length; i++) {\n                const candidate = pool[i];\n                if (candidate.evaluated) continue;\n\n                candidate.evaluated = true;\n                searching = true;\n\n                // get neighbors of this candidate from graph\n                const neighbors = this.nn[candidate.index];\n                if (!neighbors) continue;\n\n                for (const neighbor of neighbors) {\n                    const n_idx = neighbor.index;\n                    if (!visited.has(n_idx)) {\n                        visited.add(n_idx);\n                        const element = elements[n_idx];\n                        if (element && element.length === xLength) {\n                            pool.push({\n                                index: n_idx,\n                                dist: metric(x, element),\n                                evaluated: false,\n                            });\n                        }\n                    }\n                }\n                // Don't break here! Look at more candidates per iteration for better convergence\n                // break;\n            }\n        }\n\n        pool.sort((a, b) => a.dist - b.dist);\n\n        /** @type {{ element: T, index: number; distance: number }[]} */\n        const result = [];\n        for (let i = 0; i < Math.min(k, pool.length); i++) {\n            const item = pool[i];\n            result.push({\n                element: elements[item.index],\n                index: item.index,\n                distance: item.dist,\n            });\n        }\n        return result;\n    }\n\n    /**\n     * @param {number} i\n     * @param {number} [k=5] Default is `5`\n     * @returns {{ element: T; index: number; distance: number }[]}\n     */\n    search_by_index(i, k = 5) {\n        // Use regular search with the element at index i\n        const elements = this._elements;\n        if (i < 0 || i >= elements.length) return [];\n\n        const element = elements[i];\n        if (!element) return [];\n\n        return this.search(element, k);\n    }\n}\n\n/**\n * @template {number[] | Float64Array} U\n * @typedef {Object} HeapEntry\n * @property {NNDescentNeighbor<U>} element\n * @property {number} value\n */\n\n/**\n * @template {number[] | Float64Array} U\n * @extends {Heap<NNDescentNeighbor<U>>}\n */\nclass KNNHeap extends Heap {\n    /** @type {Set<number>} */\n    set;\n\n    /**\n     * @param {NNDescentNeighbor<U>[]} elements\n     * @param {(d: NNDescentNeighbor<U>) => number} accessor\n     * @param {\"max\" | \"min\"} comparator\n     */\n    constructor(elements, accessor, comparator) {\n        super(null, accessor, comparator);\n        this.set = new Set();\n        if (elements) {\n            for (const element of elements) {\n                this.push(element);\n            }\n        }\n    }\n\n    /**\n     * @param {NNDescentNeighbor<U>} element\n     * @returns {KNNHeap<U>}\n     */\n    push(element) {\n        const set = this.set;\n        if (set.has(element.index)) {\n            return this;\n        } else {\n            set.add(element.index);\n            super.push(element);\n            return this;\n        }\n    }\n\n    /** @returns {{ element: NNDescentNeighbor<U>; value: number } | null} */\n    pop() {\n        const result = super.pop();\n        if (result?.element) {\n            this.set.delete(result.element.index);\n            return result;\n        }\n        return null;\n    }\n\n    /** @returns {NNDescentNeighbor<U>[]} */\n    data() {\n        return this._container.map((d) => d.element);\n    }\n}\n","import { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersSMACOF} from \"./index.js\" */\n\n/**\n * Metric Multidimensional Scaling (MDS) via SMACOF.\n *\n * SMACOF (Scaling by Majorizing a Complicated Function) is an iterative majorization\n * algorithm for solving metric multidimensional scaling problems, which aims to\n * minimize the stress function.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersSMACOF>\n * @category Dimensionality Reduction\n * @see {@link MDS} for the classical approach.\n */\nexport class SMACOF extends DR {\n    /**\n     * SMACOF for MDS.\n     *\n     * @param {T} X - The high-dimensional data or precomputed distance matrix.\n     * @param {Partial<ParametersSMACOF>} [parameters] - Object containing parameterization.\n     */\n    constructor(X, parameters = {}) {\n        super(X, { d: 2, metric: euclidean, seed: 1212, iterations: 300, epsilon: 1e-4 }, parameters);\n    }\n\n    /**\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        this.check_init();\n        const X = this.X;\n        const rows = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const metric = /** @type {typeof euclidean | \"precomputed\"} */ (this.parameter(\"metric\"));\n        const iterations = /** @type {number} */ (this.parameter(\"iterations\"));\n        const epsilon = /** @type {number} */ (this.parameter(\"epsilon\"));\n\n        const target_distances = metric === \"precomputed\" ? X : distance_matrix(X, metric);\n\n        let Z = new Matrix(rows, d, () => (this._randomizer.random - 0.5) * 2);\n\n        // Center Z\n        for (let j = 0; j < d; ++j) {\n            const col = Z.col(j);\n            const mean = col.reduce((a, b) => a + b, 0) / rows;\n            for (let i = 0; i < rows; ++i) {\n                Z.sub_entry(i, j, mean);\n            }\n        }\n\n        this.Y = /** @type {Matrix} */ (Z); // Initial state\n\n        let prev_stress = Infinity;\n\n        if (!(iterations > 0)) {\n            yield this.projection;\n            return this.projection;\n        }\n\n        for (let iter = 0; iter < iterations; ++iter) {\n            const B = new Matrix(rows, rows, 0);\n\n            for (let i = 0; i < rows; ++i) {\n                let bii = 0;\n                const z_i = Z.row(i);\n                for (let j = 0; j < rows; ++j) {\n                    if (i === j) continue;\n                    const z_j = Z.row(j);\n                    const dist_Z = euclidean(z_i, z_j);\n                    const dist_target = target_distances.entry(i, j);\n\n                    let bij = 0;\n                    if (dist_Z > 1e-12) {\n                        bij = -dist_target / dist_Z;\n                    }\n                    B.set_entry(i, j, bij);\n                    bii -= bij;\n                }\n                B.set_entry(i, i, bii);\n            }\n\n            // Z_new = 1/N * B(Z) * Z\n            const Z_new = B.dot(Z)._apply(rows, (val, n) => val / n);\n\n            this.Y = /** @type {Matrix} */ (Z_new);\n            Z = /** @type {Matrix} */ (Z_new);\n\n            // Calculate stress\n            let stress_num = 0;\n            let stress_den = 0;\n            for (let i = 0; i < rows; ++i) {\n                const z_i = Z.row(i);\n                for (let j = i + 1; j < rows; ++j) {\n                    const z_j = Z.row(j);\n                    const dist_Y = euclidean(z_i, z_j);\n                    const diff = target_distances.entry(i, j) - dist_Y;\n                    stress_num += diff * diff;\n                    stress_den += target_distances.entry(i, j) ** 2;\n                }\n            }\n            const current_stress = Math.sqrt(stress_num / Math.max(stress_den, 1e-12));\n\n            yield this.projection;\n\n            if (Math.abs(prev_stress - current_stress) < epsilon) {\n                break;\n            }\n            prev_stress = current_stress;\n        }\n        return this.projection;\n    }\n\n    /**\n     * @returns {T}\n     */\n    transform() {\n        const gen = this.generator();\n        let res = /** @type {T} */ (this.X);\n        for (const step of gen) {\n            res = step;\n        }\n        return res;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSMACOF>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new SMACOF(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSMACOF>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new SMACOF(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSMACOF>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new SMACOF(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { Heap } from \"../datastructure/index.js\";\nimport { BallTree } from \"../knn/index.js\";\nimport { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\nimport { SMACOF } from \"./SMACOF.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersISOMAP} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/**\n * Isomap (Isometric Mapping)\n *\n * A nonlinear dimensionality reduction algorithm that uses geodesic distances\n * between points on a manifold to perform embedding. It builds a neighborhood\n * graph and uses MDS on the shortest-path distances.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersISOMAP>\n * @category Dimensionality Reduction\n * @see {@link LLE} for another nonlinear alternative\n */\nexport class ISOMAP extends DR {\n    /**\n     * Isometric feature mapping (ISOMAP).\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersISOMAP>} [parameters] - Object containing parameterization of the DR method.\n     * @see {@link https://doi.org/10.1126/science.290.5500.2319}\n     */\n    constructor(X, parameters = {}) {\n        /** @type {ParametersISOMAP} */\n        const defaults = {\n            neighbors: -Infinity,\n            d: 2,\n            metric: euclidean,\n            seed: 1212,\n            project: \"MDS\",\n            eig_args: {},\n        };\n        super(X, defaults, parameters);\n\n        this.defaults = defaults;\n\n        if (this._parameters.neighbors === -Infinity) {\n            this.parameter(\"neighbors\", Math.min(Math.max(Math.floor(this.X.shape[0] / 10), 2), this._N - 1));\n        }\n\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        if (!Object.hasOwn(eig_args, \"seed\")) {\n            eig_args.seed = this._randomizer;\n        }\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * @returns {T}\n     */\n    transform() {\n        this.check_init();\n        const X = this.X;\n        const rows = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const metric = /** @type {typeof euclidean} */ (this.parameter(\"metric\"));\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        const neighbors = /** @type {number} */ (this.parameter(\"neighbors\"));\n        // TODO: make knn extern and parameter for constructor or transform?\n        const D = new Matrix(rows, rows, 0);\n        D.shape = [rows, rows, (i, j) => (i <= j ? metric(X.row(i), X.row(j)) : D.entry(j, i))];\n\n        /** @type {{ index: number; distance: number }[][]} */\n        const kNearestNeighbors = [];\n        const tree = new BallTree(X.to2dArray(), { metric, seed: /** @type {number} */ (this.parameter(\"seed\")) });\n        for (let i = 0; i < rows; ++i) {\n            // BallTree search returns elements including the queried point itself (at distance 0).\n            // Request neighbors + 1 and slice off the first one (which should be the query point).\n            const neighborsList = tree.search_by_index(i, neighbors + 1);\n            kNearestNeighbors.push(\n                neighborsList.slice(1).map((n) => ({\n                    index: n.index,\n                    distance: n.distance,\n                })),\n            );\n        }\n\n        // ISOMAP requires an undirected/symmetric nearest neighbor graph.\n        // If i is a nearest neighbor of j, then j should be connected to i as well.\n        for (let i = 0; i < rows; ++i) {\n            for (const neighbor of kNearestNeighbors[i]) {\n                const j = neighbor.index;\n                const d = neighbor.distance;\n                const reciprocal_edge = kNearestNeighbors[j].find((n) => n.index === i);\n                if (!reciprocal_edge) {\n                    kNearestNeighbors[j].push({ index: i, distance: d });\n                }\n            }\n        }\n\n        /*D = dijkstra(kNearestNeighbors);*/\n        // compute shortest paths using Dijkstra's algorithm\n        // TODO: make extern\n        const G = new Matrix(rows, rows, Infinity);\n\n        for (let i = 0; i < rows; ++i) {\n            G.set_entry(i, i, 0);\n            const H = new Heap([{ index: i, distance: 0 }], (d) => d.distance, \"min\");\n\n            while (!H.empty) {\n                const item = H.pop();\n                if (!item) break;\n\n                const u = item.element.index;\n                const dist_u = item.element.distance;\n\n                if (dist_u > G.entry(i, u)) continue;\n\n                for (const neighbor of kNearestNeighbors[u]) {\n                    const v = neighbor.index;\n                    const alt = dist_u + neighbor.distance;\n                    if (alt < G.entry(i, v)) {\n                        G.set_entry(i, v, alt);\n                        H.push({ index: v, distance: alt });\n                    }\n                }\n            }\n        }\n\n        let max_val = 0;\n        for (let i = 0; i < rows; i++) {\n            for (let j = 0; j < rows; j++) {\n                const val = G.entry(i, j);\n                if (val !== Infinity && val > max_val) max_val = val;\n            }\n        }\n        const big_val = max_val * 10;\n\n        const project = /** @type {\"MDS\" | \"SMACOF\"} */ (this.parameter(\"project\"));\n\n        if (project === \"SMACOF\") {\n            // Apply SMACOF metric MDS to the distance matrix directly\n            const D_matrix = new Matrix(rows, rows, (i, j) => {\n                const val = G.entry(i, j);\n                return val === Infinity ? big_val : val;\n            });\n            const smacof = new SMACOF(D_matrix, { metric: \"precomputed\", d, seed: this.parameter(\"seed\") });\n            smacof.transform();\n            this.Y = smacof.Y;\n        } else {\n            // \"MDS\" (Classical MDS) via Eigendecomposition of double-centered squared distance matrix\n            const D_sq = new Matrix(rows, rows, (i, j) => {\n                let val = G.entry(i, j);\n                if (val === Infinity) val = big_val;\n                return val * val;\n            });\n\n            const ai_ = D_sq.meanCols();\n            const a_j = D_sq.meanRows();\n            const a__ = D_sq.mean();\n            const B = new Matrix(rows, rows, (i, j) => -0.5 * (D_sq.entry(i, j) - ai_[i] - a_j[j] + a__));\n\n            // compute d eigenvectors\n            const { eigenvectors: V } = simultaneous_poweriteration(B, d, eig_args);\n            this.Y = Matrix.from(V).transpose();\n        }\n        // return embedding\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersISOMAP>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new ISOMAP(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersISOMAP>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new ISOMAP(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersISOMAP>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new ISOMAP(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { Matrix } from \"../matrix/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersLDA} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/**\n * Linear Discriminant Analysis (LDA)\n *\n * A supervised dimensionality reduction technique that finds the axes that\n * maximize the separation between multiple classes.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersLDA>\n * @category Dimensionality Reduction\n */\nexport class LDA extends DR {\n    /**\n     * Linear Discriminant Analysis.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersLDA> & { labels: any[] | Float64Array }} parameters - Object containing parameterization of the DR method.\n     * @see {@link https://onlinelibrary.wiley.com/doi/10.1111/j.1469-1809.1936.tb02137.x}\n     */\n    constructor(X, parameters) {\n        super(X, { labels: parameters.labels, d: 2, seed: 1212, eig_args: {} }, parameters);\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        if (!Object.hasOwn(eig_args, \"seed\")) {\n            eig_args.seed = this._randomizer;\n        }\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {T} - The projected data.\n     */\n    transform() {\n        const X = this.X;\n        const [rows, cols] = X.shape;\n        const { d, labels, eig_args } = this._parameters;\n        if (labels === null || labels.length !== rows) {\n            throw new Error(\"LDA needs parameter label to every datapoint to work!\");\n        }\n\n        /** @type {Record<string | number, { id: number; count: number; rows: Float64Array[] }>} */\n        const unique_labels = {};\n        let label_id = 0;\n        labels.forEach((l, i) => {\n            if (l in unique_labels) {\n                unique_labels[l].count++;\n                unique_labels[l].rows.push(X.row(i));\n            } else {\n                unique_labels[l] = {\n                    id: label_id++,\n                    count: 1,\n                    rows: [X.row(i)],\n                };\n            }\n        });\n\n        // create X_mean and vector means;\n        const X_mean = X.meanCols();\n        const V_mean = new Matrix(label_id, cols);\n        for (const label in unique_labels) {\n            const V = Matrix.from(unique_labels[label].rows);\n            const v_mean = V.meanCols();\n            for (let j = 0; j < cols; ++j) {\n                V_mean.set_entry(unique_labels[label].id, j, v_mean[j]);\n            }\n        }\n        // scatter_between\n        let S_b = new Matrix(cols, cols);\n        for (const label in unique_labels) {\n            const v = V_mean.row(unique_labels[label].id);\n            const m = Matrix.from([v]).sub(Matrix.from([X_mean]));\n            const N = unique_labels[label].count;\n            S_b = S_b.add(m.transDot(m).mult(N));\n        }\n\n        // scatter_within\n        let S_w = new Matrix(cols, cols);\n        for (const label in unique_labels) {\n            const v = V_mean.row(unique_labels[label].id);\n            const R = unique_labels[label].rows;\n            for (let i = 0, n = unique_labels[label].count; i < n; ++i) {\n                const row_v = Matrix.from([R[i]]).sub(Matrix.from([v]));\n                S_w = S_w.add(row_v.transDot(row_v));\n            }\n        }\n\n        const { eigenvectors: EV } = simultaneous_poweriteration(\n            S_w.inverse().dot(S_b),\n            d || Math.min(cols, label_id - 1),\n            eig_args,\n        );\n        const V = Matrix.from(EV).transpose();\n        this.Y = X.dot(V);\n\n        // return embedding\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @template {{ seed?: number }} Para\n     * @param {T} X\n     * @param {Para} parameters\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        // @ts-expect-error: LDA requires labels, but DR static transform doesn't\n        const dr = new LDA(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @template {{ seed?: number }} Para\n     * @param {T} X\n     * @param {Para} parameters\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        // @ts-expect-error: LDA requires labels, but DR static generator doesn't\n        const dr = new LDA(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @template {{ seed?: number }} Para\n     * @param {T} X\n     * @param {Para} parameters\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        // @ts-expect-error: LDA requires labels, but DR static transform doesn't\n        const dr = new LDA(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { k_nearest_neighbors, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { neumair_sum } from \"../numerical/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersLLE} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/**\n * Locally Linear Embedding (LLE)\n *\n * A nonlinear dimensionality reduction technique that preserves local\n * linear relationships between points. It represents each point as a linear\n * combination of its neighbors.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersLLE>\n * @category Dimensionality Reduction\n * @see {@link ISOMAP} for another nonlinear alternative\n */\nexport class LLE extends DR {\n    /**\n     * Locally Linear Embedding.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersLLE>} parameters - Object containing parameterization of the DR method.\n     * @see {@link https://doi.org/10.1126/science.290.5500.2323}\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                neighbors: -Infinity,\n                d: 2,\n                metric: euclidean,\n                seed: 1212,\n                eig_args: {},\n            },\n            parameters,\n        );\n        if (this._parameters.neighbors === -Infinity) {\n            this.parameter(\"neighbors\", Math.min(Math.max(Math.floor(this._N / 10), 2), this._N - 1));\n        }\n\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        if (!Object.hasOwn(eig_args, \"seed\")) {\n            eig_args.seed = this._randomizer;\n        }\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {T}\n     */\n    transform() {\n        const X = this.X;\n        const rows = this._N;\n        const cols = this._D;\n        const neighbors = /** @type {number} */ (this.parameter(\"neighbors\"));\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        const metric = /** @type {typeof euclidean} */ (this.parameter(\"metric\"));\n        const nN = k_nearest_neighbors(X, neighbors, metric);\n        const O = new Matrix(neighbors, 1, 1);\n        const W = new Matrix(rows, rows);\n\n        for (let row = 0; row < rows; ++row) {\n            const nN_row = nN[row];\n            const Z = new Matrix(neighbors, cols, (i, j) => X.entry(nN_row[i].j, j) - X.entry(row, j));\n            const C = Z.dotTrans(Z);\n            if (neighbors > cols) {\n                const C_trace = neumair_sum(C.diag()) / 1000;\n                for (let j = 0; j < neighbors; ++j) {\n                    C.add_entry(j, j, C_trace);\n                }\n            }\n            // reconstruct;\n            let w = Matrix.solve_CG(C, O, this._randomizer);\n            w = w.divide(w.sum());\n            for (let j = 0; j < neighbors; ++j) {\n                W.set_entry(row, nN_row[j].j, w.entry(j, 0));\n            }\n        }\n        // comp embedding\n        const I = new Matrix(rows, rows, \"identity\");\n        const IW = I.sub(W);\n        const M = IW.transDot(IW);\n\n        // M is symmetric positive semi-definite. Smallest eigenvalue is 0 (ones vector).\n        // To find smallest eigenvalues of M, we can find largest of (C*I - M)\n        // Upper bound for max eigenvalue: Frobenius norm or sum of absolute values\n        const C = M.mean() * rows * 2; // Safe upper bound for a sparse-ish M in LLE\n        const CI_M = new Matrix(rows, rows, (i, j) => (i === j ? C : 0) - M.entry(i, j));\n\n        const { eigenvectors: V } = simultaneous_poweriteration(CI_M, d + 1, eig_args);\n        // Skip the first eigenvector (the ones vector corresponding to eigenvalue C)\n        this.Y = Matrix.from(V.slice(1, 1 + d)).T;\n\n        // return embedding\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLLE>} parameters\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new LLE(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLLE>} parameters\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new LLE(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLLE>} parameters\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new LLE(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersMDS} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/**\n * Classical Multidimensional Scaling (MDS)\n *\n * A linear dimensionality reduction technique that seeks to preserve the\n * pairwise distances between points as much as possible in the lower-dimensional\n * space.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersMDS>\n * @category Dimensionality Reduction\n * @see {@link PCA} for another linear alternative\n */\nexport class MDS extends DR {\n    /**\n     * Classical MDS.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersMDS>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters = {}) {\n        super(X, { d: 2, metric: euclidean, seed: 1212, eig_args: {} }, parameters);\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        if (!Object.hasOwn(eig_args, \"seed\")) {\n            eig_args.seed = this._randomizer;\n        }\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {T}\n     */\n    transform() {\n        const X = this.X;\n        const rows = X.shape[0];\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const metric = /** @type {typeof euclidean | \"precomputed\"} */ (this.parameter(\"metric\"));\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        const A = metric === \"precomputed\" ? X : distance_matrix(X, metric);\n\n        const D_sq = new Matrix(rows, rows, (i, j) => {\n            const val = A.entry(i, j);\n            return val * val;\n        });\n\n        const ai_ = D_sq.meanCols();\n        const a_j = D_sq.meanRows();\n        const a__ = D_sq.mean();\n\n        this._d_X = A;\n        const B = new Matrix(rows, rows, (i, j) => -0.5 * (D_sq.entry(i, j) - ai_[i] - a_j[j] + a__));\n\n        const { eigenvectors: V } = simultaneous_poweriteration(B, d, eig_args);\n        this.Y = Matrix.from(V).transpose();\n\n        return this.projection;\n    }\n\n    /** @returns {number} - The stress of the projection. */\n    stress() {\n        const N = this.X.shape[0];\n        const Y = this.Y;\n        const d_X = this._d_X;\n        if (!d_X) throw new Error(\"First transform!\");\n\n        const d_Y = new Matrix(N, N, 0);\n        d_Y.shape = [\n            N,\n            N,\n            (i, j) => {\n                return i < j ? euclidean(Y.row(i), Y.row(j)) : d_Y.entry(j, i);\n            },\n        ];\n        let top_sum = 0;\n        let bottom_sum = 0;\n        for (let i = 0; i < N; ++i) {\n            for (let j = i + 1; j < N; ++j) {\n                top_sum += (d_X.entry(i, j) - d_Y.entry(i, j)) ** 2;\n                bottom_sum += d_X.entry(i, j) ** 2;\n            }\n        }\n        return Math.sqrt(top_sum / bottom_sum);\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersMDS>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new MDS(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersMDS>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new MDS(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersMDS>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new MDS(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { KMedoids } from \"../clustering/index.js\";\nimport { BallTree } from \"../knn/index.js\";\nimport { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\nimport { MDS } from \"./MDS.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersLSP} from \"./index.js\" */\n\n/**\n * Least Square Projection (LSP)\n *\n * A dimensionality reduction technique that uses a small set of control points\n * (projected with MDS) to define the projection for the rest of the data\n * using a Laplacian-based optimization.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersLSP>\n * @category Dimensionality Reduction\n */\nexport class LSP extends DR {\n    /**\n     * Least Squares Projection.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersLSP>} [parameters] - Object containing parameterization of the DR method.\n     * @see {@link https://ieeexplore.ieee.org/document/4378370}\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                neighbors: -Infinity,\n                control_points: -Infinity,\n                d: 2,\n                metric: euclidean,\n                seed: 1212,\n            },\n            parameters,\n        );\n        if (this.parameter(\"neighbors\") === -Infinity) {\n            this.parameter(\"neighbors\", Math.min(Math.max(Math.floor(this._N / 10), 2), this._N - 1));\n        }\n        if (this.parameter(\"control_points\") === -Infinity) {\n            this.parameter(\"control_points\", Math.min(Math.ceil(Math.sqrt(this._N)), this._N - 1));\n        }\n        this._is_initialized = false;\n    }\n\n    /**\n     * @returns {LSP<T>}\n     */\n    //\tinit(DR = MDS, DR_parameters = {}, KNN = BallTree) {\n    init() {\n        const DR = MDS;\n        let DR_parameters = {};\n        const KNN = BallTree;\n        if (this._is_initialized) return this;\n        const X = this.X;\n        const N = this._N;\n        const K = /** @type {number} */ (this.parameter(\"neighbors\"));\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const seed = /** @type {number} */ (this.parameter(\"seed\"));\n        const metric = /** @type {typeof euclidean} */ (this.parameter(\"metric\"));\n        DR_parameters = Object.assign({ d, metric, seed }, DR_parameters);\n        const nc = /** @type {number} */ (this.parameter(\"control_points\"));\n        const control_points = new KMedoids(X, { K: nc, metric }).get_medoids();\n        const C = new Matrix(nc, N, \"zeros\");\n        control_points.forEach((c_i, i) => {\n            C.set_entry(i, c_i, 1);\n        });\n\n        const control_points_matrix = Matrix.from(control_points.map((c_i) => X.row(c_i)));\n        const Y_C = new DR(control_points_matrix, DR_parameters).transform();\n\n        const XA = X.to2dArray();\n        const knn = new KNN(XA, { metric, seed });\n        const L = new Matrix(N, N, \"I\");\n        const alpha = -1 / K;\n        XA.forEach((x_i, i) => {\n            for (const { index: j } of knn.search(x_i, K)) {\n                if (i === j) continue;\n                L.set_entry(i, j, alpha);\n            }\n        });\n        const A = L.concat(C, \"vertical\");\n\n        const z = new Matrix(N, d, \"zeros\");\n        const b = z.concat(Y_C, \"vertical\");\n\n        this._A = A;\n        this._b = b;\n        this._is_initialized = true;\n        return this;\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @returns {T} Returns the projection.\n     */\n    transform() {\n        this.check_init();\n        const A = this._A;\n        const b = this._b;\n\n        if (!A || !b) throw new Error(\"Call init() first!\");\n        const ATA = A.transDot(A);\n        const ATb = A.transDot(b);\n        this.Y = Matrix.solve_CG(ATA, ATb, this._randomizer);\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLSP>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new LSP(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLSP>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new LSP(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLSP>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new LSP(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { k_nearest_neighbors, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersLTSA} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/**\n * Local Tangent Space Alignment (LTSA)\n *\n * A nonlinear dimensionality reduction algorithm that represents the local\n * geometry of the manifold by tangent spaces and then aligns them to reveal\n * the global structure.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersLTSA>\n * @category Dimensionality Reduction\n */\nexport class LTSA extends DR {\n    /**\n     * Local Tangent Space Alignment\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersLTSA>} parameters - Object containing parameterization of the DR method.\n     * @see {@link https://epubs.siam.org/doi/abs/10.1137/S1064827502419154}\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                neighbors: -Infinity,\n                d: 2,\n                metric: euclidean,\n                seed: 1212,\n                eig_args: {},\n            },\n            parameters,\n        );\n        if (this.parameter(\"neighbors\") === -Infinity) {\n            this.parameter(\"neighbors\", Math.min(Math.max(Math.floor(this._N / 10), 2), this._N - 1));\n        }\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        if (!Object.hasOwn(eig_args, \"seed\")) {\n            eig_args.seed = this._randomizer;\n        }\n\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        if (this._D <= d) {\n            throw new Error(\n                `Dimensionality of X (D = ${this._D}) must be greater than the required dimensionality of the result (d = ${d})!`,\n            );\n        }\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimenionality `d`.\n     *\n     * @returns {T}\n     */\n    transform() {\n        const X = this.X;\n        const [rows, D] = X.shape;\n        const neighbors = /** @type {number} */ (this.parameter(\"neighbors\"));\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        const metric = /** @type {typeof euclidean} */ (this.parameter(\"metric\"));\n        // 1.1 determine k nearest neighbors\n        const nN = k_nearest_neighbors(X, neighbors, metric);\n        // center matrix\n        const O = new Matrix(D, D, \"center\");\n        const B = new Matrix(rows, rows, 0);\n\n        for (let row = 0; row < rows; ++row) {\n            // 1.2 compute the d largest eigenvectors of the correlation matrix\n            const I_i = [row, ...nN[row].map((n) => n.j)];\n            let X_i = Matrix.from(I_i.map((n) => X.row(n)));\n            // center X_i\n            X_i = X_i.dot(O);\n            // correlation matrix\n            const C = X_i.dotTrans(X_i);\n            const { eigenvectors: g } = simultaneous_poweriteration(C, d, eig_args);\n            //g.push(linspace(0, k).map(_ => 1 / Math.sqrt(k + 1)));\n            const G_i_t = Matrix.from(g);\n            // 2. Constructing alignment matrix\n            const W_i = G_i_t.transDot(G_i_t).add(1 / Math.sqrt(neighbors + 1));\n            for (let i = 0; i < neighbors + 1; ++i) {\n                for (let j = 0; j < neighbors + 1; ++j) {\n                    B.add_entry(I_i[i], I_i[j], W_i.entry(i, j) - (i === j ? 1 : 0));\n                }\n            }\n        }\n\n        // 3. Aligning global coordinates\n        const { eigenvectors: Y } = simultaneous_poweriteration(B, d + 1, eig_args);\n        this.Y = Matrix.from(Y.slice(1)).transpose();\n\n        // return embedding\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLTSA>} parameters\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new LTSA(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLTSA>} parameters\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new LTSA(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLTSA>} parameters\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new LTSA(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { Matrix } from \"../matrix/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersPCA} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/**\n * Principal Component Analysis (PCA)\n *\n * A linear dimensionality reduction technique that identifies the axes (principal components)\n * along which the variance of the data is maximized.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersPCA>\n * @category Dimensionality Reduction\n * @see {@link MDS} for another linear alternative\n *\n * @example\n * import * as druid from \"@saehrimnir/druidjs\";\n *\n * const X = [[1, 2], [3, 4], [5, 6]];\n * const pca = new druid.PCA(X, { d: 2 });\n * const Y = pca.transform();\n * // [[x1, y1], [x2, y2], [x3, y3]]\n */\nexport class PCA extends DR {\n    /**\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersPCA>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters = {}) {\n        super(X, { d: 2, seed: 1212, eig_args: {} }, parameters);\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        if (!Object.hasOwn(eig_args, \"seed\")) {\n            eig_args.seed = this._randomizer;\n        }\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection.\n     */\n    *generator() {\n        yield this.transform();\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality `d`.\n     *\n     * @returns {T} - The projected data.\n     */\n    transform() {\n        const V = this.principal_components();\n        const X = this.X;\n        this.Y = X.dot(V);\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPCA>} parameters\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new PCA(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * Computes the `d` principal components of Matrix `X`.\n     *\n     * @returns {Matrix}\n     */\n    principal_components() {\n        if (this.V) {\n            return this.V;\n        }\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        const X = this.X;\n        const X_cent = X.sub(X.meanCols());\n        const C = X_cent.transDot(X_cent);\n        const { eigenvectors: V } = simultaneous_poweriteration(C, d, eig_args);\n        this.V = Matrix.from(V).transpose();\n        return this.V;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPCA>} parameters\n     * @returns {Matrix}\n     */\n    static principal_components(X, parameters) {\n        const dr = new PCA(X, parameters);\n        return dr.principal_components();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPCA>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new PCA(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPCA>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new PCA(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\nimport { MDS, PCA } from \"./index.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersPCA, ParametersMDS, ParametersSAMMON} from \"./index.js\" */\n/** @typedef {\"PCA\" | \"MDS\" | \"random\"} AvailableInit */\n\n/** @typedef {{ PCA: ParametersPCA; MDS: ParametersMDS; random: {} }} ChooseDR */\n\n/**\n * Sammon's Mapping\n *\n * A nonlinear dimensionality reduction technique that minimizes a stress\n * function based on the ratio of pairwise distances in high and low dimensional spaces.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersSAMMON<AvailableInit>>\n * @category Dimensionality Reduction\n */\nexport class SAMMON extends DR {\n    /** @type {Matrix | undefined} */\n    distance_matrix;\n\n    /**\n     * SAMMON's Mapping\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersSAMMON<AvailableInit>>} [parameters] - Object containing parameterization of the DR\n     *   method.\n     * @see {@link https://arxiv.org/pdf/2009.01512.pdf}\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                magic: 0.1,\n                d: 2,\n                metric: euclidean,\n                seed: 1212,\n                init_DR: \"random\",\n                init_parameters: {},\n            },\n            parameters,\n        );\n    }\n\n    /**\n     * Initializes the projection.\n     *\n     * @param {Matrix | undefined} D\n     * @returns {asserts D is Matrix}\n     */\n    init(D) {\n        const N = this.X.shape[0];\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const metric = /** @type {typeof euclidean | \"precomputed\"} */ (this.parameter(\"metric\"));\n        const init_DR = /** @type {AvailableInit} */ (this.parameter(\"init_DR\"));\n        const DR_parameters = this.parameter(\"init_parameters\");\n        if (init_DR === \"random\") {\n            const randomizer = this._randomizer;\n            this.Y = new Matrix(N, d, () => randomizer.random);\n        } else if (init_DR === \"PCA\") {\n            this.Y = Matrix.from(PCA.transform(this.X, /** @type {ParametersPCA} */ (DR_parameters)));\n        } else if (init_DR === \"MDS\") {\n            this.Y = Matrix.from(MDS.transform(this.X, /** @type {ParametersMDS} */ (DR_parameters)));\n        } else {\n            throw new Error('init_DR needs to be either \"random\" or a DR method!');\n        }\n        D = metric === \"precomputed\" ? Matrix.from(this.X) : distance_matrix(this.X, metric);\n        this.distance_matrix = D;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality 2.\n     *\n     * @param {number} [max_iter=200] - Maximum number of iteration steps. Default is `200`\n     * @returns {T} The projection of `X`.\n     */\n    transform(max_iter = 200) {\n        this.check_init();\n        if (!this.distance_matrix) this.init(this.distance_matrix);\n        for (let j = 0; j < max_iter; ++j) {\n            this._step();\n        }\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimenionality 2.\n     *\n     * @param {number} [max_iter=200] - Maximum number of iteration steps. Default is `200`\n     * @returns {Generator<T, T, void>} A generator yielding the intermediate steps of the projection of\n     *   `X`.\n     */\n    *generator(max_iter = 200) {\n        this.check_init();\n        if (!this.distance_matrix) this.init(this.distance_matrix);\n\n        for (let j = 0; j < max_iter; ++j) {\n            this._step();\n            yield this.projection;\n        }\n\n        return this.projection;\n    }\n\n    _step() {\n        if (!this.distance_matrix) this.init(this.distance_matrix);\n        const MAGIC = /** @type {number} */ (this.parameter(\"magic\"));\n        const D = /** @type {Matrix} */ (this.distance_matrix);\n        const N = this.X.shape[0];\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const Y = this.Y;\n\n        const G = new Matrix(N, d, 0);\n\n        const sum = new Float64Array(d);\n        for (let i = 0; i < N; ++i) {\n            const e1 = new Float64Array(d);\n            const e2 = new Float64Array(d);\n            const Yi = Y.row(i);\n            for (let j = 0; j < N; ++j) {\n                if (i === j) continue;\n                const dX = D.entry(i, j);\n                if (dX === 0) continue; // Skip identical points in high-dim\n\n                const Yj = Y.row(j);\n                const delta = new Float64Array(d);\n                for (let k = 0; k < d; ++k) {\n                    delta[k] = Yi[k] - Yj[k];\n                }\n                const dY = Math.max(euclidean(Yi, Yj), 1e-6);\n                const dq = dX - dY;\n                const dr = dX * dY;\n                for (let k = 0; k < d; ++k) {\n                    e1[k] += (delta[k] * dq) / dr;\n                    e2[k] += (dq - (delta[k] ** 2 * (1 + dq / dY)) / dY) / dr;\n                }\n            }\n            for (let k = 0; k < d; ++k) {\n                const val = Y.entry(i, k) + ((MAGIC * e1[k]) / Math.abs(e2[k]) || 0);\n                G.set_entry(i, k, val);\n                sum[k] += val;\n            }\n        }\n        for (let k = 0; k < d; ++k) {\n            sum[k] /= N;\n        }\n\n        for (let i = 0; i < N; ++i) {\n            for (let k = 0; k < d; ++k) {\n                Y.set_entry(i, k, G.entry(i, k) - sum[k]);\n            }\n        }\n        return Y;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSAMMON<AvailableInit>>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new SAMMON(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSAMMON<AvailableInit>>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new SAMMON(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSAMMON<AvailableInit>>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new SAMMON(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { linspace, Matrix, norm } from \"../matrix/index.js\";\nimport { euclidean, euclidean_squared } from \"../metrics/index.js\";\nimport { neumair_sum } from \"../numerical/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {Metric} from \"../metrics/index.js\" */\n/** @import {ParametersSQDMDS} from \"./index.js\" */\n\n/**\n * SQuadMDS (Stochastic Quartet MDS)\n *\n * A lean Stochastic Quartet MDS improving global structure preservation in\n * neighbor embedding like t-SNE and UMAP.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersSQDMDS>\n * @category Dimensionality Reduction\n */\nexport class SQDMDS extends DR {\n    /**\n     * SQuadMDS: a lean Stochastic Quartet MDS improving global structure preservation in neighbor embedding like t-SNE\n     * and UMAP.\n     *\n     * @param {T} X\n     * @param {Partial<ParametersSQDMDS>} [parameters]\n     * @see {@link https://arxiv.org/pdf/2202.12087.pdf}\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                d: 2,\n                metric: euclidean,\n                seed: 1212,\n                decay_start: 0.1,\n                decay_cte: 0.34, // 0.34\n            },\n            parameters,\n        );\n\n        this.init();\n        if (this.parameter(\"metric\") === \"precomputed\" && this.X.shape[0] !== this.X.shape[1]) {\n            throw new Error(\"SQDMDS input data must be a square Matrix\");\n        }\n    }\n\n    init() {\n        const N = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n\n        // initialize helpers.\n        this._add = this.__add(d);\n        this._sub_div = this.__sub_div(d);\n        this._minus = this.__minus(d);\n        this._mult = this.__mult(d);\n        this._LR_init = Math.max(2, 0.005 * N);\n        this._LR = this._LR_init;\n        const decay_cte = /** @type {number} */ (this.parameter(\"decay_cte\"));\n        this._offset = -Math.exp(-1 / decay_cte);\n        this._momentums = new Matrix(N, d, 0);\n        this._grads = new Matrix(N, d, 0);\n        this._indices = linspace(0, N - 1);\n        // initialize projection.\n        const R = this._randomizer;\n        this.Y = new Matrix(N, d, () => R.random - 0.5);\n\n        // preparing metric for optimization.\n        const this_metric = /** @type {Metric | \"precomputed\"} */ (this.parameter(\"metric\"));\n        if (this_metric === \"precomputed\") {\n            /** @type {(i: number, j: number, X: Matrix) => number} */\n            this._HD_metric = (i, j, X) => X.entry(i, j);\n            /** @type {(i: number, j: number, X: Matrix) => number} */\n            this._HD_metric_exaggeration = (i, j, X) => X.entry(i, j) ** 2;\n        } else {\n            this._HD_metric = (i, j, X) => this_metric(X.row(i), X.row(j));\n            if (this_metric === euclidean) {\n                this._HD_metric_exaggeration = (i, j, X) => euclidean_squared(X.row(i), X.row(j));\n            } else {\n                this._HD_metric_exaggeration = (i, j, X) => this_metric(X.row(i), X.row(j)) ** 2;\n            }\n        }\n        return;\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @param {number} [iterations=500] - Number of iterations. Default is `500`\n     * @returns {T} The projection.\n     */\n    transform(iterations = 500) {\n        this.check_init();\n        const decay_start = /** @type {number} */ (this.parameter(\"decay_start\"));\n        this._decay_start = Math.round(decay_start * iterations);\n        for (let i = 0; i < iterations; ++i) {\n            this._step(i, iterations);\n        }\n        return this.projection;\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @param {number} [iterations=500] - Number of iterations. Default is `500`\n     * @returns {Generator<T, T, void>} The intermediate steps of the projection.\n     */\n    *generator(iterations = 500) {\n        this.check_init();\n        const decay_start = /** @type {number} */ (this.parameter(\"decay_start\"));\n        this._decay_start = Math.round(decay_start * iterations);\n        for (let i = 0; i < iterations; ++i) {\n            this._step(i, iterations);\n            yield this.projection;\n        }\n\n        return this.projection;\n    }\n\n    /**\n     * Performs an optimization step.\n     *\n     * @private\n     * @param {number} i - Acutal iteration.\n     * @param {number} iterations - Number of iterations.\n     */\n    _step(i, iterations) {\n        if (this._LR_init === undefined || this._offset === undefined) throw new Error(\"Call init() first!\");\n\n        const decay_start = /** @type {number} */ (this.parameter(\"decay_start\"));\n        if (i > decay_start) {\n            const decay_cte = /** @type {number} */ (this.parameter(\"decay_cte\"));\n            const offset = this._offset;\n            const ratio = (i - decay_start) / (iterations - decay_start);\n            this._LR = this._LR_init * (Math.exp(-(ratio * ratio) / decay_cte) + offset);\n            this._distance_exaggeration = false;\n        } else {\n            this._distance_exaggeration = true;\n        }\n        this._nestrov_iteration(this._distance_exaggeration);\n    }\n\n    /**\n     * Creates quartets of non overlapping indices.\n     *\n     * @private\n     * @returns {Uint32Array[]}\n     */\n    __quartets() {\n        if (!this._indices) throw new Error(\"Call init() first!\");\n        if (this._offset === undefined) throw new Error(\"Call init() first!\");\n        const N = this._N;\n        const max_N = N - (N % 4);\n        const R = this._randomizer;\n        const shuffled_indices = R.choice(this._indices, max_N);\n        const result = [];\n        for (let i = 0; i < max_N; i += 4) {\n            result.push(\n                Uint32Array.of(\n                    shuffled_indices[i],\n                    shuffled_indices[i + 1],\n                    shuffled_indices[i + 2],\n                    shuffled_indices[i + 3],\n                ),\n            );\n        }\n        return result;\n    }\n\n    /**\n     * Computes and applies gradients, and updates momentum.\n     *\n     * @private\n     * @param {boolean} distance_exaggeration\n     */\n    _nestrov_iteration(distance_exaggeration) {\n        if (!this._momentums || !this._grads || this._LR === undefined) throw new Error(\"Call init() first!\");\n        const momentums = this._momentums.mult(0.99, { inline: true });\n        const LR = this._LR;\n        const grads = this._fill_MDS_grads(this.Y.add(momentums), this._grads, distance_exaggeration);\n        const [n, d] = momentums.shape;\n        for (let i = 0; i < n; ++i) {\n            const g_i = grads.row(i);\n            const g_i_norm = norm(g_i);\n            if (g_i_norm === 0) continue;\n            const mul = LR / g_i_norm;\n            const m_i = momentums.row(i);\n            for (let j = 0; j < d; ++j) {\n                m_i[j] -= mul * g_i[j];\n            }\n        } // momentums -= (LR / norm) * grads\n        this.Y.add(momentums, { inline: true });\n    }\n\n    /**\n     * Computes the gradients.\n     *\n     * @param {Matrix} Y - The Projection.\n     * @param {Matrix} grads - The gradients.\n     * @param {boolean} [exaggeration=false] - Whether or not to use early exaggeration. Default is `false`\n     * @param {boolean} [zero_grad=true] - Whether or not to reset the gradient in the beginning. Default is `true`\n     * @returns {Matrix} The gradients.\n     */\n    _fill_MDS_grads(Y, grads, exaggeration = false, zero_grad = true) {\n        if (!this._HD_metric || !this._HD_metric_exaggeration || !this._add) throw new Error(\"Call init() first!\");\n        if (zero_grad) {\n            // compute new gradients\n            grads.values.fill(0);\n        }\n        const add = this._add;\n        const X = this.X;\n        let HD_metric;\n        if (exaggeration === true) {\n            HD_metric = this._HD_metric_exaggeration;\n        } else {\n            HD_metric = this._HD_metric;\n        }\n\n        const D_quartet = new Float64Array(6);\n        const quartets = this.__quartets();\n        for (const [i, j, k, l] of quartets) {\n            // compute quartet's HD distances.\n            D_quartet[0] = HD_metric(i, j, X);\n            D_quartet[1] = HD_metric(i, k, X);\n            D_quartet[2] = HD_metric(i, l, X);\n            D_quartet[3] = HD_metric(j, k, X);\n            D_quartet[4] = HD_metric(j, l, X);\n            D_quartet[5] = HD_metric(k, l, X);\n\n            const D_quartet_sum = neumair_sum(D_quartet);\n\n            if (D_quartet_sum > 0) {\n                for (let i = 0; i < 6; ++i) {\n                    D_quartet[i] /= D_quartet_sum;\n                    D_quartet[i] += 1e-11;\n                }\n            }\n            const [gi, gj, gk, gl] = this._compute_quartet_grads(Y, [i, j, k, l], D_quartet);\n\n            // add is inline, row acces the matrix\n            add(grads.row(i), gi);\n            add(grads.row(j), gj);\n            add(grads.row(k), gk);\n            add(grads.row(l), gl);\n        }\n        return grads;\n    }\n\n    /**\n     * Quartet gradients for a projection.\n     *\n     * @private\n     * @param {Matrix} Y - The acutal projection.\n     * @param {number[]} quartet - The indices of the quartet.\n     * @param {Float64Array} D_hd - The high-dimensional distances of the quartet.\n     * @returns {Float64Array[]} The gradients for the quartet.\n     */\n    _compute_quartet_grads(Y, quartet, [p_ab, p_ac, p_ad, p_bc, p_bd, p_cd]) {\n        const [a, b, c, d] = quartet.map((index) => Y.row(index));\n        // LD distances, add a small number just in case\n        const d_ab = euclidean(a, b) + 1e-12;\n        const d_ac = euclidean(a, c) + 1e-12;\n        const d_ad = euclidean(a, d) + 1e-12;\n        const d_bc = euclidean(b, c) + 1e-12;\n        const d_bd = euclidean(b, d) + 1e-12;\n        const d_cd = euclidean(c, d) + 1e-12;\n        const sum_LD_dist = neumair_sum([d_ab, d_ac, d_ad, d_bc, d_bd, d_cd]);\n\n        // for each element of the sum: use the same gradient function and just permute the points given in input.\n        const [gA1, gB1, gC1, gD1] = this._ABCD_grads(\n            a,\n            b,\n            c,\n            d,\n            d_ab,\n            d_ac,\n            d_ad,\n            d_bc,\n            d_bd,\n            d_cd,\n            p_ab,\n            sum_LD_dist,\n        );\n        const [gA2, gC2, gB2, gD2] = this._ABCD_grads(\n            a,\n            c,\n            b,\n            d,\n            d_ac,\n            d_ab,\n            d_ad,\n            d_bc,\n            d_cd,\n            d_bd,\n            p_ac,\n            sum_LD_dist,\n        );\n        const [gA3, gD3, gC3, gB3] = this._ABCD_grads(\n            a,\n            d,\n            c,\n            b,\n            d_ad,\n            d_ac,\n            d_ab,\n            d_cd,\n            d_bd,\n            d_bc,\n            p_ad,\n            sum_LD_dist,\n        );\n        const [gB4, gC4, gA4, gD4] = this._ABCD_grads(\n            b,\n            c,\n            a,\n            d,\n            d_bc,\n            d_ab,\n            d_bd,\n            d_ac,\n            d_cd,\n            d_ad,\n            p_bc,\n            sum_LD_dist,\n        );\n        const [gB5, gD5, gA5, gC5] = this._ABCD_grads(\n            b,\n            d,\n            a,\n            c,\n            d_bd,\n            d_ab,\n            d_bc,\n            d_ad,\n            d_cd,\n            d_ac,\n            p_bd,\n            sum_LD_dist,\n        );\n        const [gC6, gD6, gA6, gB6] = this._ABCD_grads(\n            c,\n            d,\n            a,\n            b,\n            d_cd,\n            d_ac,\n            d_bc,\n            d_ad,\n            d_bd,\n            d_ab,\n            p_cd,\n            sum_LD_dist,\n        );\n\n        if (!this._add) throw new Error(\"Call init() first!\");\n        const add = this._add;\n        const gA = add(gA1, gA2, gA3, gA4, gA5, gA6);\n        const gB = add(gB1, gB2, gB3, gB4, gB5, gB6);\n        const gC = add(gC1, gC2, gC3, gC4, gC5, gC6);\n        const gD = add(gD1, gD2, gD3, gD4, gD5, gD6);\n\n        return [gA, gB, gC, gD];\n    }\n\n    /**\n     * Gradients for one element of the loss function's sum.\n     *\n     * @private\n     * @param {Float64Array} a\n     * @param {Float64Array} b\n     * @param {Float64Array} c\n     * @param {Float64Array} d\n     * @param {number} d_ab\n     * @param {number} d_ac\n     * @param {number} d_ad\n     * @param {number} d_bc\n     * @param {number} d_bd\n     * @param {number} d_cd\n     * @param {number} p_ab\n     * @param {number} sum_LD_dist\n     * @returns {Float64Array[]}\n     */\n    _ABCD_grads(a, b, c, d, d_ab, d_ac, d_ad, d_bc, d_bd, d_cd, p_ab, sum_LD_dist) {\n        if (!this._minus || !this._add || !this._mult || !this._sub_div) throw new Error(\"Call init() first!\");\n        const ratio = d_ab / sum_LD_dist;\n        const twice_ratio = 2 * ((p_ab - ratio) / sum_LD_dist);\n        const minus = this._minus;\n        const add = this._add;\n        const mult = this._mult;\n        const sub_div = this._sub_div;\n        // no side effects because sub_div creates new arrays, and the inline functions work on this new created arrays.\n        const gA = mult(\n            minus(mult(add(sub_div(a, b, d_ab), sub_div(a, c, d_ac), sub_div(a, d, d_ad)), ratio), sub_div(a, b, d_ab)),\n            twice_ratio,\n        );\n        const gB = mult(\n            minus(mult(add(sub_div(b, a, d_ab), sub_div(b, c, d_bc), sub_div(b, d, d_bd)), ratio), sub_div(b, a, d_ab)),\n            twice_ratio,\n        );\n        const gC = mult(add(sub_div(c, a, d_ac), sub_div(c, b, d_bc), sub_div(c, d, d_cd)), ratio * twice_ratio);\n        const gD = mult(add(sub_div(d, a, d_ad), sub_div(d, b, d_bd), sub_div(d, c, d_cd)), ratio * twice_ratio);\n        return [gA, gB, gC, gD];\n    }\n\n    /**\n     * Inline!\n     *\n     * @param {number} d\n     */\n    __minus(d) {\n        return /** @type {(a: Float64Array, b: Float64Array) => Float64Array} */ (a, b) => {\n            for (let i = 0; i < d; ++i) {\n                a[i] -= b[i];\n            }\n            return a;\n        };\n    }\n\n    /**\n     * Inline!\n     *\n     * @param {number} d\n     */\n    __add(d) {\n        return /** @type {(...summands: Float64Array[]) => Float64Array} */ (...summands) => {\n            const n = summands.length;\n            const s1 = summands[0];\n            for (let j = 1; j < n; ++j) {\n                const summand = summands[j];\n                for (let i = 0; i < d; ++i) {\n                    s1[i] += summand[i];\n                }\n            }\n            return s1;\n        };\n    }\n\n    /**\n     * Inline!\n     *\n     * @param {number} d\n     */\n    __mult(d) {\n        return /** @type {(a: Float64Array, v: number) => Float64Array} */ (a, v) => {\n            for (let i = 0; i < d; ++i) {\n                a[i] *= v;\n            }\n            return a;\n        };\n    }\n\n    /**\n     * Creates a new array `(x - y) / div`.\n     *\n     * @param {number} d\n     */\n    __sub_div(d) {\n        return /** @type {(x: Float64Array, y: Float64Array, div: number) => Float64Array} */ (x, y, div) => {\n            return Float64Array.from({ length: d }, (_, i) => (x[i] - y[i]) / div);\n        };\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSQDMDS>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new SQDMDS(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSQDMDS>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new SQDMDS(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersSQDMDS>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new SQDMDS(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { DisjointSet } from \"../datastructure/index.js\";\nimport { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersTopoMap} from \"./index.js\" */\n\n/**\n * TopoMap\n *\n * A 0-dimensional Homology Preserving Projection of High-Dimensional Data.\n * It aims to preserve the topological structure of the data by maintaining\n * the connectivity of a minimum spanning tree.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersTopoMap>\n * @category Dimensionality Reduction\n */\nexport class TopoMap extends DR {\n    /**\n     * TopoMap: A 0-dimensional Homology Preserving Projection of High-Dimensional Data.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersTopoMap>} parameters - Object containing parameterization of the DR method.\n     * @see {@link https://arxiv.org/pdf/2009.01512.pdf}\n     */\n    constructor(X, parameters) {\n        super(X, { metric: euclidean, seed: 1212 }, parameters);\n        [this._N, this._D] = this.X.shape;\n        this._distance_matrix = new Matrix(this._N, this._N, -1);\n    }\n\n    /**\n     * @private\n     * @param {number} i\n     * @param {number} j\n     * @param {import(\"../metrics/index.js\").Metric} metric\n     * @returns {number}\n     */\n    __lazy_distance_matrix(i, j, metric) {\n        const D = this._distance_matrix;\n        const X = this.X;\n        const D_ij = D.entry(i, j);\n        if (D_ij === -1 && i !== j) {\n            const dist = metric(X.row(i), X.row(j));\n            D.set_entry(i, j, dist);\n            D.set_entry(j, i, dist);\n            return dist;\n        }\n        return i === j ? 0 : D_ij;\n    }\n\n    /**\n     * Computes the minimum spanning tree, using a given metric\n     *\n     * @private\n     * @param {import(\"../metrics/index.js\").Metric} metric\n     * @see {@link https://en.wikipedia.org/wiki/Kruskal%27s_algorithm}\n     */\n    _make_minimum_spanning_tree(metric = euclidean) {\n        const N = this._N;\n        const X = [...this.X];\n\n        this._disjoint_set = new DisjointSet(X);\n        const disjoint_set = this._disjoint_set;\n        const F = [];\n        let E = [];\n        for (let i = 0; i < N; ++i) {\n            for (let j = i + 1; j < N; ++j) {\n                E.push([i, j, this.__lazy_distance_matrix(i, j, metric)]);\n            }\n        }\n        E = E.sort((a, b) => a[2] - b[2]);\n\n        for (const [u, v, w] of E) {\n            const set_u = disjoint_set.find(X[u]);\n            const set_v = disjoint_set.find(X[v]);\n            if (!set_u || !set_v) throw new Error(\"Should not happen!\");\n            if (set_u !== set_v) {\n                F.push([u, v, w]);\n                disjoint_set.union(set_u, set_v);\n            }\n        }\n\n        return F.sort((a, b) => a[2] - b[2]);\n    }\n\n    /** Initializes TopoMap. Sets all projcted points to zero, and computes a minimum spanning tree. */\n    init() {\n        const { metric } = this._parameters;\n        this.Y = new Matrix(this._N, 2, 0);\n        this._Emst = this._make_minimum_spanning_tree(metric);\n        this._is_initialized = true;\n        return this;\n    }\n\n    /**\n     * Returns true if Point C is left of line AB.\n     *\n     * @private\n     * @param {Float64Array} PointA - Point A of line AB\n     * @param {Float64Array} PointB - Point B of line AB\n     * @param {Float64Array} PointC - Point C\n     * @returns {boolean}\n     */\n    __hull_cross([ax, ay], [bx, by], [sx, sy]) {\n        return (bx - ax) * (sy - ay) - (by - ay) * (sx - ax) <= 0;\n    }\n\n    /**\n     * Computes the convex hull of the set of Points S\n     *\n     * @private\n     * @param {Float64Array[]} S - Set of Points.\n     * @returns {Float64Array[]} Convex hull of S. Starts at the bottom-most point and continues counter-clockwise.\n     * @see {@link https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain#JavaScript}\n     */\n    __hull(S) {\n        const points = S.sort(([x1, y1], [x2, y2]) => y1 - y2 || x1 - x2);\n        const N = points.length;\n        if (N <= 2) return points;\n\n        const lower = [];\n        for (let i = 0; i < N; ++i) {\n            while (\n                lower.length >= 2 &&\n                this.__hull_cross(lower[lower.length - 2], lower[lower.length - 1], points[i])\n            ) {\n                lower.pop();\n            }\n            lower.push(points[i]);\n        }\n        const upper = [];\n        for (let i = N - 1; i >= 0; --i) {\n            while (\n                upper.length >= 2 &&\n                this.__hull_cross(upper[upper.length - 2], upper[upper.length - 1], points[i])\n            ) {\n                upper.pop();\n            }\n            upper.push(points[i]);\n        }\n        upper.pop();\n        lower.pop();\n        return lower.concat(upper);\n    }\n\n    /**\n     * Finds the angle to rotate Point A and B to lie on a line parallel to the x-axis.\n     *\n     * @private\n     * @param {Float64Array} PointA\n     * @param {Float64Array} PointB\n     * @returns {{ sin: number; cos: number }} Object containing the sinus- and cosinus-values for a rotation.\n     */\n    __findAngle([p1x, p1y], [p2x, p2y]) {\n        const n = euclidean([p1x, p1y], [p2x, p2y]);\n        if (n === 0)\n            return {\n                sin: 0,\n                cos: 1,\n            };\n        const vec = [(p2x - p1x) / n, (p2y - p1y) / n];\n        const cos = vec[0];\n        let sin = Math.sqrt(1 - cos * cos);\n        sin = vec[1] >= 0 ? -sin : sin;\n        return {\n            sin: sin,\n            cos: cos,\n        };\n    }\n\n    /**\n     * @private\n     * @param {Float64Array[]} hull\n     * @param {Float64Array} p\n     * @param {boolean} topEdge\n     * @returns {{ sin: number; cos: number; tx: number; ty: number }}\n     */\n    __align_hull(hull, p, topEdge) {\n        let v = -1;\n        /** @type {number} */\n        let d2 = -Infinity;\n        for (let i = 0; i < hull.length; ++i) {\n            const d = euclidean(hull[i], p);\n            if (v === -1) {\n                d2 = d;\n                v = i;\n            } else {\n                if (d2 > d) {\n                    d2 = d;\n                    v = i;\n                }\n            }\n        }\n\n        const v1 = hull[v];\n        let v2;\n        if (topEdge) {\n            v2 = hull[(v + 1) % hull.length];\n        } else {\n            v2 = hull[(v - 1 + hull.length) % hull.length];\n        }\n\n        /** @type {{ sin?: number; cos?: number; tx: number; ty: number }} */\n        const transformation = {\n            tx: -v1[0],\n            ty: -v1[1],\n        };\n\n        if (hull.length >= 2) {\n            const { sin, cos } = this.__findAngle(v1, v2);\n            transformation.sin = sin;\n            transformation.cos = cos;\n        } else {\n            transformation.sin = 0;\n            transformation.cos = 1;\n        }\n\n        return /** @type {{ sin: number; cos: number; tx: number; ty: number }} */ (transformation);\n    }\n\n    /**\n     * @private\n     * @param {Float64Array} Point - The point which should get transformed.\n     * @param {{ sin: number; cos: number; tx: number; ty: number }} Transformation - Contains the values for\n     *   translation and rotation.\n     */\n    __transform([px, py], { tx, ty, sin, cos }) {\n        const x = px + tx;\n        const y = py + ty;\n        const xx = x * cos - y * sin;\n        const yy = x * sin + y * cos;\n        return [xx, yy];\n    }\n\n    /**\n     * Calls `__transform` for each point in Set C\n     *\n     * @private\n     * @param {Float64Array[]} C - Set of points.\n     * @param {{ sin: number; cos: number; tx: number; ty: number }} t - Transform object.\n     * @param {number} yOffset - Value to offset set C.\n     */\n    __transform_component(C, t, yOffset) {\n        const N = C.length;\n        for (let i = 0; i < N; ++i) {\n            const c = C[i];\n            const [cx, cy] = this.__transform(c, t);\n            c[0] = cx;\n            c[1] = cy + yOffset;\n        }\n    }\n\n    /**\n     * @private\n     * @param {Float64Array} root_u - Root of component u\n     * @param {Float64Array} root_v - Root of component v\n     * @param {Float64Array} p_u - Point u\n     * @param {Float64Array} p_v - Point v\n     * @param {number} w - Edge weight w\n     * @param {DisjointSet<Float64Array>} components - The disjoint set containing the components\n     */\n    __align_components(root_u, root_v, p_u, p_v, w, components) {\n        if (!components) throw new Error(\"components not provided!\");\n        const u_children = components.get_children(root_u);\n        const v_children = components.get_children(root_v);\n        if (!u_children || !v_children) throw new Error(\"should not happen!\");\n\n        const points_u = [...u_children];\n        const points_v = [...v_children];\n\n        const hull_u = this.__hull(points_u);\n        const hull_v = this.__hull(points_v);\n\n        const t_u = this.__align_hull(hull_u, p_u, false);\n        const t_v = this.__align_hull(hull_v, p_v, true);\n\n        this.__transform_component(points_u, t_u, 0);\n        this.__transform_component(points_v, t_v, w);\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality 2.\n     *\n     * @returns {T}\n     */\n    transform() {\n        if (!this._is_initialized) this.init();\n        if (!this._Emst) throw new Error(\"Call init() first!\");\n        const Emst = this._Emst;\n        const Y = this.Y.to2dArray();\n        /** @type {DisjointSet<Float64Array>} */\n        const components = new DisjointSet(\n            Y,\n            // Y.map((y, i) => {\n            //     y.i = i;\n            //     return y;\n            // }),\n        );\n\n        for (const [u, v, w] of Emst) {\n            const p_u = Y[u];\n            const p_v = Y[v];\n            const component_u = components.find(p_u);\n            const component_v = components.find(p_v);\n            if (!component_u || !component_v) throw new Error(\"Should not happen!\");\n            if (component_u === component_v) continue;\n            this.__align_components(component_u, component_v, p_u, p_v, w, components);\n            components.union(component_u, component_v);\n        }\n        return this.projection;\n    }\n\n    /**\n     * Transforms the inputdata `X` to dimensionality 2.\n     *\n     * @returns {Generator<T, T, void>}\n     */\n    *generator() {\n        if (!this._is_initialized) this.init();\n        if (!this._Emst) throw new Error(\"call init() first!\");\n        const Emst = this._Emst;\n        const Y = this.Y.to2dArray();\n        const components = new DisjointSet(\n            Y,\n            // Y.map((y, i) => {\n            //     y.i = i;\n            //     return y;\n            // }),\n        );\n\n        for (const [u, v, w] of Emst) {\n            const p_u = Y[u];\n            const p_v = Y[v];\n            const component_u = components.find(p_u);\n            const component_v = components.find(p_v);\n            if (!component_u || !component_v) throw new Error(\"should not happen!\");\n            if (component_u === component_v) continue;\n            this.__align_components(component_u, component_v, p_u, p_v, w, components);\n            components.union(component_u, component_v);\n            yield this.projection;\n        }\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTopoMap>} parameters\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new TopoMap(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTopoMap>} parameters\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new TopoMap(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTopoMap>} parameters\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new TopoMap(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { BallTree } from \"../knn/index.js\";\nimport { linspace, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\nimport { PCA } from \"./PCA.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {Metric} from \"../metrics/index.js\" */\n/** @import {ParametersTriMap} from \"./index.js\" */\n/** @import {KNN} from \"../knn/KNN.js\" */\n\n/**\n * TriMap\n *\n * A dimensionality reduction technique that preserves both local and global\n * structure using triplets. It is designed to be a more robust alternative\n * to t-SNE and UMAP.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersTriMap>\n * @category Dimensionality Reduction\n */\nexport class TriMap extends DR {\n    /**\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersTriMap>} [parameters] - Object containing parameterization of the DR method.\n     * @see {@link https://arxiv.org/pdf/1910.00204v1.pdf}\n     * @see {@link https://github.com/eamid/trimap}\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                weight_adj: 500,\n                n_inliers: 10,\n                n_outliers: 5,\n                n_random: 5,\n                d: 2,\n                metric: euclidean,\n                tol: 1e-8,\n                seed: 1212,\n            },\n            parameters,\n        );\n    }\n\n    /**\n     * @param {Matrix | null} [pca=null] - Initial Embedding (if null then PCA gets used). Default is `null`\n     * @param {import(\"../knn/KNN.js\").KNN<number[] | Float64Array, any> | null} [knn=null] - KNN Object (if null then BallTree gets used). Default is `null`\n     */\n    init(pca = null, knn = null) {\n        const X = this.X;\n        const N = X.shape[0];\n        //const c = /** @type {number} */ (this._parameters.c);\n        const d = /** @type {number} */ (this._parameters.d);\n        const metric = /** @type {Metric} */ (this._parameters.metric);\n        const seed = /** @type {number} */ (this._parameters.seed);\n        this.n_inliers = /** @type {number} */ (this._parameters.n_inliers);\n        this.n_outliers = /** @type {number} */ (this._parameters.n_outliers);\n        this.n_random = /** @type {number} */ (this._parameters.n_random);\n        this.Y = pca ?? PCA.transform(X, { d, seed });\n        this.knn = knn ?? new BallTree(X.to2dArray(), { metric, seed });\n        const { triplets, weights } = this._generate_triplets(this.n_inliers, this.n_outliers, this.n_random);\n        this.triplets = triplets;\n        this.weights = weights;\n        this.lr = (1000 * N) / triplets.shape[0];\n        this.C = Infinity;\n        this.vel = new Matrix(N, d, 0);\n        this.gain = new Matrix(N, d, 1);\n        return this;\n    }\n\n    /**\n     * Generates {@link n_inliers} x {@link n_outliers} x {@link n_random} triplets.\n     *\n     * @param {number} n_inliers\n     * @param {number} n_outliers\n     * @param {number} n_random\n     */\n    _generate_triplets(n_inliers, n_outliers, n_random) {\n        const metric = /** @type {Metric} */ (this._parameters.metric);\n        const weight_adj = /** @type {number} */ (this._parameters.weight_adj);\n        const X = this.X;\n        const N = X.shape[0];\n        const knn = this.knn;\n        if (!knn) throw new Error(\"Call init() first!\");\n        const n_extra = Math.min(n_inliers + 20, N);\n        const nbrs = new Matrix(N, n_extra);\n        const knn_distances = new Matrix(N, n_extra);\n        for (let i = 0; i < N; ++i) {\n            const results = knn\n                .search(X.row(i), n_extra + 1)\n                .filter((d) => d.distance !== 0)\n                .sort((a, b) => a.distance - b.distance);\n\n            results.forEach((d, j) => {\n                if (j < n_extra) {\n                    nbrs.set_entry(i, j, d.index);\n                    knn_distances.set_entry(i, j, d.distance);\n                }\n            });\n        }\n        // scale parameter\n        const sig = new Float64Array(N);\n        for (let i = 0; i < N; ++i) {\n            sig[i] = Math.max(\n                (knn_distances.entry(i, 3) + knn_distances.entry(i, 4) + knn_distances.entry(i, 5)) / 3,\n                1e-10,\n            );\n        }\n\n        const P = this._find_p(knn_distances, sig, nbrs);\n\n        let triplets = this._sample_knn_triplets(P, nbrs, n_inliers, n_outliers);\n        let n_triplets = triplets.shape[0];\n        const outlier_distances = new Float64Array(n_triplets);\n        for (let i = 0; i < n_triplets; ++i) {\n            const j = triplets.entry(i, 0);\n            const k = triplets.entry(i, 2);\n            outlier_distances[i] = metric(X.row(j), X.row(k));\n        }\n        let weights = this._find_weights(triplets, P, nbrs, outlier_distances, sig);\n\n        if (n_random > 0) {\n            const { random_triplets, random_weights } = this._sample_random_triplets(X, n_random, sig);\n            triplets = triplets.concat(random_triplets, \"vertical\");\n            weights = Float64Array.from([...weights, ...random_weights]);\n        }\n        n_triplets = triplets.shape[0];\n        let max_weight = -Infinity;\n        for (let i = 0; i < n_triplets; ++i) {\n            if (Number.isNaN(weights[i])) {\n                weights[i] = 0;\n            }\n            if (max_weight < weights[i]) max_weight = weights[i];\n        }\n        let max_weight_2 = -Infinity;\n        for (let i = 0; i < n_triplets; ++i) {\n            weights[i] /= max_weight;\n            weights[i] += 0.0001;\n            weights[i] = Math.log(1 + weight_adj * weights[i]);\n            if (max_weight_2 < weights[i]) max_weight_2 = weights[i];\n        }\n        for (let i = 0; i < n_triplets; ++i) {\n            weights[i] /= max_weight_2;\n        }\n        return {\n            triplets: triplets,\n            weights: weights,\n        };\n    }\n\n    /**\n     * Calculates the similarity matrix P\n     *\n     * @private\n     * @param {Matrix} knn_distances - Matrix of pairwise knn distances\n     * @param {Float64Array} sig - Scaling factor for the distances\n     * @param {Matrix} nbrs - Nearest neighbors\n     * @returns {Matrix} Pairwise similarity matrix\n     */\n    _find_p(knn_distances, sig, nbrs) {\n        const [N, n_neighbors] = knn_distances.shape;\n        return new Matrix(N, n_neighbors, (i, j) => {\n            return Math.exp(-(knn_distances.entry(i, j) ** 2 / sig[i] / sig[nbrs.entry(i, j)]));\n        });\n    }\n\n    /**\n     * Sample nearest neighbors triplets based on the similarity values given in P.\n     *\n     * @private\n     * @param {Matrix} P - Matrix of pairwise similarities between each point and its neighbors given in matrix nbrs.\n     * @param {Matrix} nbrs - Nearest neighbors indices for each point. The similarity values are given in matrix\n     *   {@link P}. Row i corresponds to the i-th point.\n     * @param {number} n_inliers - Number of inlier points.\n     * @param {number} n_outliers - Number of outlier points.\n     */\n    _sample_knn_triplets(P, nbrs, n_inliers, n_outliers) {\n        const N = nbrs.shape[0];\n        const triplets_list = [];\n        for (let i = 0; i < N; ++i) {\n            const sort_indices = this.__argsort(P.row(i));\n            for (let j = 0; j < n_inliers; ++j) {\n                const sim = nbrs.entry(i, sort_indices[sort_indices[j] === i ? j + 1 : j]);\n                const rejects = [i, ...Array.from(sort_indices.slice(0, j + 2)).map((idx) => nbrs.entry(i, idx))];\n                const samples = this._rejection_sample(n_outliers, N, rejects);\n                for (let k = 0; k < samples.length; ++k) {\n                    const out = samples[k];\n                    triplets_list.push([i, sim, out]);\n                }\n            }\n        }\n        const triplets = new Matrix(triplets_list.length, 3);\n        for (let t = 0; t < triplets_list.length; ++t) {\n            triplets.set_entry(t, 0, triplets_list[t][0]);\n            triplets.set_entry(t, 1, triplets_list[t][1]);\n            triplets.set_entry(t, 2, triplets_list[t][2]);\n        }\n        return triplets;\n    }\n\n    /**\n     * Should do the same as np.argsort()\n     *\n     * @private\n     * @param {Float64Array | number[]} A\n     */\n    __argsort(A) {\n        return linspace(0, A.length - 1).sort((i, j) => A[j] - A[i]);\n    }\n\n    /**\n     * Samples {@link n_samples} integers from a given interval [0, {@link max_int}] while rejection the values that are\n     * in the {@link rejects}.\n     *\n     * @private\n     * @param {number} n_samples\n     * @param {number} max_int\n     * @param {number[]} rejects\n     */\n    _rejection_sample(n_samples, max_int, rejects) {\n        const randomizer = this._randomizer;\n        const interval = linspace(0, max_int - 1).filter((d) => rejects.indexOf(d) < 0);\n        return randomizer.choice(interval, Math.min(n_samples, interval.length));\n    }\n\n    /**\n     * Calculates the weights for the sampled nearest neighbors triplets\n     *\n     * @private\n     * @param {Matrix} triplets - Sampled Triplets.\n     * @param {Matrix} P - Pairwise similarity matrix.\n     * @param {Matrix} nbrs - Nearest Neighbors\n     * @param {Float64Array} outlier_distances - Matrix of pairwise outlier distances\n     * @param {Float64Array} sig - Scaling factor for the distances.\n     */\n    _find_weights(triplets, P, nbrs, outlier_distances, sig) {\n        const n_triplets = triplets.shape[0];\n        const weights = new Float64Array(n_triplets);\n        for (let t = 0; t < n_triplets; ++t) {\n            const i = triplets.entry(t, 0);\n            const sim = nbrs.row(i).indexOf(triplets.entry(t, 1));\n            const p_sim = P.entry(i, sim);\n            let p_out = Math.exp(-(outlier_distances[t] ** 2 / (sig[i] * sig[triplets.entry(t, 2)])));\n            if (p_out < 1e-20) p_out = 1e-20;\n            weights[t] = p_sim / p_out;\n        }\n        return weights;\n    }\n\n    /**\n     * Sample uniformly ranom triplets\n     *\n     * @private\n     * @param {Matrix} X - Data matrix.\n     * @param {number} n_random - Number of random triplets per point\n     * @param {Float64Array} sig - Scaling factor for the distances\n     */\n    _sample_random_triplets(X, n_random, sig) {\n        const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n        const randomizer = this._randomizer;\n        const N = X.shape[0];\n        const random_triplets = new Matrix(N * n_random, 3);\n        const random_weights = new Float64Array(N * n_random);\n        for (let i = 0; i < N; ++i) {\n            const n_i = i * n_random;\n            const indices = Array.from({ length: N }, (_, idx) => idx).filter((idx) => idx !== i);\n            for (let j = 0; j < n_random; ++j) {\n                let [sim, out] = randomizer.choice(indices, 2);\n                let p_sim = Math.exp(-(metric(X.row(i), X.row(sim)) ** 2 / (sig[i] * sig[sim])));\n                if (p_sim < 1e-20) p_sim = 1e-20;\n                let p_out = Math.exp(-(metric(X.row(i), X.row(out)) ** 2 / (sig[i] * sig[out])));\n                if (p_out < 1e-20) p_out = 1e-20;\n\n                if (p_sim < p_out) {\n                    [sim, out] = [out, sim];\n                    [p_sim, p_out] = [p_out, p_sim];\n                }\n                const index = n_i + j;\n                random_triplets.set_entry(index, 0, i);\n                random_triplets.set_entry(index, 1, sim);\n                random_triplets.set_entry(index, 2, out);\n                random_weights[index] = 0.1 * (p_sim / p_out);\n            }\n        }\n        return {\n            random_triplets: random_triplets,\n            random_weights: random_weights,\n        };\n    }\n\n    /**\n     * Computes the gradient for updating the embedding.\n     *\n     * @param {Matrix} Y - The embedding\n     */\n    _grad(Y) {\n        const n_inliers = this.n_inliers;\n        const n_outliers = this.n_outliers;\n        const triplets = this.triplets;\n        const weights = this.weights;\n        if (!triplets || n_inliers === undefined || n_outliers === undefined || !weights)\n            throw new Error(\"Call init() first!\");\n        const [N, dim] = Y.shape;\n        const n_triplets = triplets.shape[0];\n        const grad = new Matrix(N, dim, 0);\n        const y_ij = new Float64Array(dim);\n        const y_ik = new Float64Array(dim);\n        let d_ij = 1;\n        let d_ik = 1;\n        let n_viol = 0;\n        let loss = 0;\n        const n_knn_triplets = N * n_inliers * n_outliers;\n\n        for (let t = 0; t < n_triplets; ++t) {\n            const [i, j, k] = triplets.row(t);\n            // update y_ij, y_ik, d_ij, d_ik\n            if (t % n_outliers === 0 || t >= n_knn_triplets) {\n                d_ij = 1;\n                d_ik = 1;\n                for (let d = 0; d < dim; ++d) {\n                    const Y_id = Y.entry(i, d);\n                    const Y_jd = Y.entry(j, d);\n                    const Y_kd = Y.entry(k, d);\n                    y_ij[d] = Y_id - Y_jd;\n                    y_ik[d] = Y_id - Y_kd;\n                    d_ij += y_ij[d] ** 2;\n                    d_ik += y_ik[d] ** 2;\n                }\n                // update y_ik and d_ik only\n            } else {\n                d_ik = 1;\n                for (let d = 0; d < dim; ++d) {\n                    const Y_id = Y.entry(i, d);\n                    const Y_kd = Y.entry(k, d);\n                    y_ik[d] = Y_id - Y_kd;\n                    d_ik += y_ik[d] ** 2;\n                }\n            }\n\n            if (d_ij > d_ik) ++n_viol;\n            loss += weights[t] / (1 + d_ik / d_ij);\n            const w = weights[t] / (d_ij + d_ik) ** 2;\n            for (let d = 0; d < dim; ++d) {\n                const gs = y_ij[d] * d_ik * w;\n                const go = y_ik[d] * d_ij * w;\n                grad.add_entry(i, d, gs - go);\n                grad.sub_entry(j, d, gs);\n                grad.add_entry(k, d, go);\n            }\n        }\n        return { grad, loss, n_viol };\n    }\n\n    /**\n     * @param {number} max_iteration\n     * @returns {T}\n     */\n    transform(max_iteration = 800) {\n        this.check_init();\n        for (let iter = 0; iter < max_iteration; ++iter) {\n            this._next(iter);\n        }\n        return this.projection;\n    }\n\n    /**\n     * @param {number} max_iteration\n     * @returns {Generator<T, T, void>}\n     */\n    *generator(max_iteration = 800) {\n        this.check_init();\n        for (let iter = 0; iter < max_iteration; ++iter) {\n            this._next(iter);\n            yield this.projection;\n        }\n        return this.projection;\n    }\n\n    /**\n     * Does the iteration step.\n     *\n     * @private\n     * @param {number} iter\n     */\n    _next(iter) {\n        const gamma = iter > 250 ? 0.5 : 0.3;\n        const old_C = this.C;\n        const vel = this.vel;\n        if (!vel || old_C === undefined || this.lr === undefined) throw new Error(\"Call init() first!\");\n        const Y = this.Y.add(vel.mult(gamma));\n        const { grad, loss } = this._grad(Y);\n        this.C = loss;\n        this.Y = this._update_embedding(Y, iter, grad);\n        const tol = /** @type {number} */ (this.parameter(\"tol\"));\n        this.lr *= old_C > loss + tol ? 1.01 : 0.9;\n        return this.Y;\n    }\n\n    /**\n     * Updates the embedding.\n     *\n     * @private\n     * @param {Matrix} Y\n     * @param {number} iter\n     * @param {Matrix} grad\n     */\n    _update_embedding(Y, iter, grad) {\n        const [N, dim] = Y.shape;\n        const gamma = iter > 250 ? 0.8 : 0.5; // moment parameter\n        const min_gain = 0.01;\n        const gain = this.gain;\n        const vel = this.vel;\n        const lr = this.lr;\n        if (!vel || !gain || lr === undefined) throw new Error(\"Call init() first!\");\n        for (let i = 0; i < N; ++i) {\n            for (let d = 0; d < dim; ++d) {\n                const new_gain =\n                    Math.sign(vel.entry(i, d)) !== Math.sign(grad.entry(i, d))\n                        ? gain.entry(i, d) + 0.2\n                        : Math.max(gain.entry(i, d) * 0.8, min_gain);\n                gain.set_entry(i, d, new_gain);\n                vel.set_entry(i, d, gamma * vel.entry(i, d) - lr * gain.entry(i, d) * grad.entry(i, d));\n                Y.set_entry(i, d, Y.entry(i, d) + vel.entry(i, d));\n            }\n        }\n        return Y;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTriMap>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new TriMap(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTriMap>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new TriMap(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTriMap>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new TriMap(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean_squared } from \"../metrics/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {Metric} from \"../metrics/index.js\" */\n/** @import {ParametersTSNE} from \"./index.js\" */\n/**\n * t-SNE (t-Distributed Stochastic Neighbor Embedding)\n *\n * A nonlinear dimensionality reduction technique particularly well-suited\n * for visualizing high-dimensional data in 2D or 3D. Preserves local\n * structure while revealing global patterns.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersTSNE>\n * @category Dimensionality Reduction\n * @see {@link https://lvdmaaten.github.io/tsne/|t-SNE Paper}\n * @see {@link UMAP} for faster alternative with similar results\n *\n * @example\n * import * as druid from \"@saehrimnir/druidjs\";\n *\n * const X = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]];\n * const tsne = new druid.TSNE(X, {\n *     perplexity: 30,\n *     epsilon: 10,\n *     d: 2,\n *     seed: 42\n * });\n *\n * const Y = tsne.transform(500); // 500 iterations\n * // [[x1, y1], [x2, y2], [x3, y3]]\n */\nexport class TSNE extends DR {\n    /**\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersTSNE>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                perplexity: 50,\n                epsilon: 10,\n                d: 2,\n                metric: euclidean_squared,\n                seed: 1212,\n            },\n            parameters,\n        );\n        [this._N, this._D] = this.X.shape;\n        this._iter = 0;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        this.Y = new Matrix(this._N, d, () => this._randomizer.gauss_random() * 1e-4);\n    }\n\n    init() {\n        // init\n        const perplexity = /** @type {number} */ (this.parameter(\"perplexity\"));\n        const Htarget = Math.log(perplexity);\n        const N = this._N;\n        const D = this._D;\n        const metric = /** @type {Metric | \"precomputed\"} */ (this._parameters.metric);\n        const X = this.X;\n        let Delta;\n        if (metric === \"precomputed\") {\n            Delta = Matrix.from(X);\n        } else {\n            Delta = new Matrix(N, N);\n            for (let i = 0; i < N; ++i) {\n                const X_i = X.row(i);\n                for (let j = i + 1; j < N; ++j) {\n                    const distance = metric(X_i, X.row(j));\n                    Delta.set_entry(i, j, distance);\n                    Delta.set_entry(j, i, distance);\n                }\n            }\n        }\n\n        const P = new Matrix(N, N, 0);\n\n        this._ystep = new Matrix(N, D, 0);\n        this._gains = new Matrix(N, D, 1);\n\n        // search for fitting sigma\n        const tol = 1e-4;\n        const maxtries = 50;\n        for (let i = 0; i < N; ++i) {\n            const dist_i = Delta.row(i);\n            const prow = P.row(i);\n            let betamin = -Infinity;\n            let betamax = Infinity;\n            let beta = 1;\n            let cnt = maxtries;\n            let done = false;\n            let psum = 0;\n\n            while (!done && cnt--) {\n                // compute entropy and kernel row with beta precision\n                psum = 0;\n                let dp_sum = 0;\n                for (let j = 0; j < N; ++j) {\n                    const dist = dist_i[j];\n                    const pj = i !== j ? Math.exp(-dist * beta) : 0;\n                    dp_sum += dist * pj;\n                    prow[j] = pj;\n                    psum += pj;\n                }\n                // compute entropy\n                const H = psum > 0 ? Math.log(psum) + (beta * dp_sum) / psum : 0;\n                if (H > Htarget) {\n                    betamin = beta;\n                    beta = betamax === Infinity ? beta * 2 : (beta + betamax) / 2;\n                } else {\n                    betamax = beta;\n                    beta = betamin === -Infinity ? beta / 2 : (beta + betamin) / 2;\n                }\n                done = Math.abs(H - Htarget) < tol;\n            }\n            // normalize p\n            for (let j = 0; j < N; ++j) {\n                prow[j] /= psum;\n            }\n        }\n\n        // compute probabilities\n        const N2 = N * 2;\n        for (let i = 0; i < N; ++i) {\n            for (let j = i; j < N; ++j) {\n                const p = Math.max((P.entry(i, j) + P.entry(j, i)) / N2, 1e-100);\n                P.set_entry(i, j, p);\n                P.set_entry(j, i, p);\n            }\n        }\n        this._P = P;\n        return this;\n    }\n\n    /**\n     * @param {number} [iterations=500] - Number of iterations. Default is `500`\n     * @returns {T} The projection.\n     */\n    transform(iterations = 500) {\n        this.check_init();\n        for (let i = 0; i < iterations; ++i) {\n            this.next();\n        }\n        return this.projection;\n    }\n\n    /**\n     * @param {number} [iterations=500] - Number of iterations. Default is `500`\n     * @returns {Generator<T, T, void>} - The projection.\n     */\n    *generator(iterations = 500) {\n        this.check_init();\n        for (let i = 0; i < iterations; ++i) {\n            this.next();\n            yield this.projection;\n        }\n        return this.projection;\n    }\n\n    /**\n     * Performs a optimization step\n     *\n     * @private\n     * @returns {Matrix}\n     */\n    next() {\n        const iter = ++this._iter;\n        if (!this._P || !this._ystep || !this._gains) throw new Error(\"Call init() first!\");\n        const P = this._P;\n        const ystep = this._ystep;\n        const gains = this._gains;\n        const N = this._N;\n        const dim = /** @type {number} */ (this._parameters.d);\n        const epsilon = /** @type {number} */ (this._parameters.epsilon);\n        const Y = this.Y;\n\n        //calc cost gradient;\n        const pmul = iter < 100 ? 4 : 1;\n\n        // compute Q dist (unnormalized)\n        const Qu = new Matrix(N, N, \"zeros\");\n        let qsum = 0;\n        for (let i = 0; i < N; ++i) {\n            for (let j = i + 1; j < N; ++j) {\n                let dsum = 0;\n                for (let d = 0; d < dim; ++d) {\n                    const dhere = Y.entry(i, d) - Y.entry(j, d);\n                    dsum += dhere * dhere;\n                }\n                const qu = 1 / (1 + dsum);\n                Qu.set_entry(i, j, qu);\n                Qu.set_entry(j, i, qu);\n                qsum += 2 * qu;\n            }\n        }\n\n        // normalize Q dist\n        const Q = new Matrix(N, N, 0);\n        for (let i = 0; i < N; ++i) {\n            for (let j = i + 1; j < N; ++j) {\n                const val = Math.max(Qu.entry(i, j) / qsum, 1e-100);\n                Q.set_entry(i, j, val);\n                Q.set_entry(j, i, val);\n            }\n        }\n\n        const grad = new Matrix(N, dim, \"zeros\");\n        for (let i = 0; i < N; ++i) {\n            for (let j = 0; j < N; ++j) {\n                const premult = 4 * (pmul * P.entry(i, j) - Q.entry(i, j)) * Qu.entry(i, j);\n                for (let d = 0; d < dim; ++d) {\n                    grad.add_entry(i, d, premult * (Y.entry(i, d) - Y.entry(j, d)));\n                }\n            }\n        }\n\n        // perform gradient step\n        const ymean = new Float64Array(dim);\n        for (let i = 0; i < N; ++i) {\n            for (let d = 0; d < dim; ++d) {\n                const gid = grad.entry(i, d);\n                const sid = ystep.entry(i, d);\n                const gainid = gains.entry(i, d);\n\n                let newgain = Math.sign(gid) === Math.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n                if (newgain < 0.01) newgain = 0.01;\n                gains.set_entry(i, d, newgain);\n\n                const momval = iter < 250 ? 0.5 : 0.8;\n                const newsid = momval * sid - epsilon * newgain * gid;\n                ystep.set_entry(i, d, newsid);\n\n                Y.add_entry(i, d, newsid);\n                ymean[d] += Y.entry(i, d);\n            }\n        }\n\n        for (let i = 0; i < N; ++i) {\n            for (let d = 0; d < dim; ++d) {\n                Y.sub_entry(i, d, ymean[d] / N);\n            }\n        }\n\n        return this.Y;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTSNE>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new TSNE(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTSNE>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new TSNE(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersTSNE>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new TSNE(X, parameters);\n        return dr.transform_async();\n    }\n}\n","/**\n * @template {Float64Array | number[]} T\n * @category Optimization\n * @param {(d: T) => number} f\n * @param {T} x0\n * @param {number} [max_iter=300] Default is `300`\n * @returns {T}\n * @see http://optimization-js.github.io/optimization-js/optimization.js.html#line438\n */\nexport function powell(f, x0, max_iter = 300) {\n    const epsilon = 1e-2;\n    const n = x0.length;\n    let alpha = 1e-3;\n    let pfx = 10000;\n    const x = /** @type {T} */ (x0.slice());\n    let fx = f(x);\n    let convergence = false;\n\n    while (max_iter-- >= 0 && !convergence) {\n        convergence = true;\n        for (let i = 0; i < n; ++i) {\n            x[i] += 1e-6;\n            const fxi = f(x);\n            x[i] -= 1e-6;\n            const dx = (fxi - fx) / 1e-6;\n            if (Math.abs(dx) > epsilon) {\n                convergence = false;\n            }\n            x[i] -= alpha * dx;\n            fx = f(x);\n        }\n        alpha *= pfx >= fx ? 1.05 : 0.4;\n        pfx = fx;\n    }\n    return x;\n}\n","import { BallTree, NaiveKNN } from \"../knn/index.js\";\nimport { linspace, Matrix } from \"../matrix/index.js\";\nimport { euclidean, euclidean_squared } from \"../metrics/index.js\";\nimport { neumair_sum } from \"../numerical/index.js\";\nimport { powell } from \"../optimization/index.js\";\nimport { max } from \"../util/index.js\";\nimport { DR } from \"./DR.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {Metric} from \"../metrics/index.js\" */\n/** @import {ParametersUMAP} from \"./index.js\" */\n\n/**\n * Uniform Manifold Approximation and Projection (UMAP)\n *\n * A novel manifold learning technique for dimensionality reduction. UMAP is constructed\n * from a theoretical framework based on Riemannian geometry and algebraic topology.\n * It is often faster than t-SNE while preserving more of the global structure.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersUMAP>\n * @category Dimensionality Reduction\n * @see {@link https://arxiv.org/abs/1802.03426|UMAP Paper}\n * @see {@link TSNE} for a similar visualization technique\n *\n * @example\n * import * as druid from \"@saehrimnir/druidjs\";\n *\n * const X = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]];\n * const umap = new druid.UMAP(X, {\n *     n_neighbors: 15,\n *     min_dist: 0.1,\n *     d: 2,\n *     seed: 42\n * });\n *\n * const Y = umap.transform(500); // 500 iterations\n * // [[x1, y1], [x2, y2], [x3, y3]]\n */\nexport class UMAP extends DR {\n    /**\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersUMAP>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            {\n                n_neighbors: 15,\n                local_connectivity: 1,\n                min_dist: 1,\n                d: 2,\n                metric: euclidean,\n                seed: 1212,\n                _spread: 1,\n                _set_op_mix_ratio: 1,\n                _repulsion_strength: 1,\n                _negative_sample_rate: 5,\n                _n_epochs: 350,\n                _initial_alpha: 1,\n            },\n            parameters,\n        );\n        [this._N, this._D] = this.X.shape;\n        const n_neighbors = /** @type {number} */ (this.parameter(\"n_neighbors\"));\n        const local_connectivity = /** @type {number} */ (this.parameter(\"local_connectivity\"));\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        /* let n_neighbors = Math.min(this._N - 1, parameters.n_neighbors);\n        this.parameter(\"n_neighbors\", n_neighbors);\n        this.parameter(\"local_connectivity\", Math.min(this.parameter(\"local_connectivity\"), n_neighbors - 1)); */\n        if (n_neighbors > this._N) {\n            throw new Error(\n                `Parameter n_neighbors (=${n_neighbors}) needs to be smaller than dataset size (N=${this._N})!`,\n            );\n        }\n        if (local_connectivity > n_neighbors) {\n            throw new Error(\n                `Parameter local_connectivity (=${local_connectivity}) needs to be smaller than parameter n_neighbors (=${n_neighbors})`,\n            );\n        }\n        this._iter = 0;\n        const randomizer = this._randomizer;\n        this.Y = new Matrix(this._N, d, () => randomizer.random);\n    }\n\n    /**\n     * @private\n     * @param {number} spread\n     * @param {number} min_dist\n     * @returns {number[]}\n     */\n    _find_ab_params(spread, min_dist) {\n        /** @type {(x: number, a: number, b: number) => number} */\n        const curve = (x, a, b) => 1 / (1 + a * x ** (2 * b));\n        const xv = linspace(0, spread * 3, 300);\n        const yv = linspace(0, spread * 3, 300);\n\n        for (let i = 0, n = xv.length; i < n; ++i) {\n            const xv_i = xv[i];\n            yv[i] = xv_i < min_dist ? 1 : Math.exp(-(xv_i - min_dist) / spread);\n        }\n\n        /** @type {(p: [number, number]) => number} */\n        const err = (p) => {\n            const error = linspace(1, 300).map((_, i) => yv[i] - curve(xv[i], p[0], p[1]));\n            return Math.sqrt(neumair_sum(error.map((e) => e * e)));\n        };\n\n        return powell(err, [1, 1]);\n    }\n\n    /**\n     * @private\n     * @param {{ element: Float64Array; index: number; distance: number }[][]} distances\n     * @param {number[]} sigmas\n     * @param {number[]} rhos\n     * @returns {{ element: Float64Array; index: number; distance: number }[][]}\n     */\n    _compute_membership_strengths(distances, sigmas, rhos) {\n        for (let i = 0, n = distances.length; i < n; ++i) {\n            const rho = rhos[i];\n            const curr_dist = distances[i];\n            for (let j = 0, m = curr_dist.length; j < m; ++j) {\n                const v = curr_dist[j].distance - rho;\n                curr_dist[j].distance = v > 0 ? Math.exp(-v / sigmas[i]) : 1.0;\n            }\n        }\n        return distances;\n    }\n\n    /**\n     * @private\n     * @param {NaiveKNN<Float64Array> | BallTree<Float64Array>} knn\n     * @param {number} k\n     * @returns {{\n     *     distances: { element: Float64Array; index: number; distance: number }[][];\n     *     sigmas: number[];\n     *     rhos: number[];\n     * }}\n     */\n    _smooth_knn_dist(knn, k) {\n        const SMOOTH_K_TOLERANCE = 1e-5;\n        const MIN_K_DIST_SCALE = 1e-3;\n        const n_iter = 64;\n        const local_connectivity = /** @type {number} */ (this._parameters.local_connectivity);\n        const metric = /** @type {Metric | \"precomputed\"} */ (this._parameters.metric);\n        const target = Math.log2(k);\n        const rhos = [];\n        const sigmas = [];\n        const X = this.X;\n        const N = X.shape[0];\n        //const distances = [...X].map(x_i => knn.search(x_i, k).raw_data().reverse());\n\n        /** @type {{ element: Float64Array; index: number; distance: number }[][]} */\n        const distances = [];\n        if (metric === \"precomputed\" || knn instanceof NaiveKNN) {\n            for (let i = 0; i < N; ++i) {\n                distances.push(knn.search_by_index(i, k).reverse());\n            }\n        } else {\n            for (const x_i of X) {\n                distances.push(knn.search(x_i, k).reverse());\n            }\n        }\n\n        const index = Math.floor(local_connectivity);\n        const interpolation = local_connectivity - index;\n        for (let i = 0; i < N; ++i) {\n            let lo = 0;\n            let hi = Infinity;\n            let mid = 1;\n            let rho = 0;\n\n            const search_result = distances[i];\n            const non_zero_dist = search_result.filter((d) => d.distance > 0);\n            const non_zero_dist_length = non_zero_dist.length;\n            if (non_zero_dist_length >= local_connectivity) {\n                if (index > 0) {\n                    rho = non_zero_dist[index - 1].distance;\n                    if (interpolation > SMOOTH_K_TOLERANCE) {\n                        rho += interpolation * (non_zero_dist[index].distance - non_zero_dist[index - 1].distance);\n                    }\n                } else {\n                    rho = interpolation * non_zero_dist[0].distance;\n                }\n            } else if (non_zero_dist_length > 0) {\n                rho = non_zero_dist[non_zero_dist_length - 1].distance;\n            }\n            for (let x = 0; x < n_iter; ++x) {\n                let psum = 0;\n                for (let j = 0; j < k; ++j) {\n                    const d = search_result[j].distance - rho;\n                    psum += d > 0 ? Math.exp(-(d / mid)) : 1;\n                }\n                if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n                    break;\n                }\n                if (psum > target) {\n                    [hi, mid] = [mid, (lo + hi) / 2];\n                } else {\n                    if (hi === Infinity) {\n                        [lo, mid] = [mid, mid * 2];\n                    } else {\n                        [lo, mid] = [mid, (lo + hi) / 2];\n                    }\n                }\n            }\n\n            //let mean_d = null;\n            if (rho > 0) {\n                const mean_ithd = search_result.reduce((a, b) => a + b.distance, 0) / search_result.length;\n                if (mid < MIN_K_DIST_SCALE * mean_ithd) {\n                    mid = MIN_K_DIST_SCALE * mean_ithd;\n                }\n            } else {\n                const mean_d = distances.reduce(\n                    (acc, res) => acc + res.reduce((a, b) => a + b.distance, 0) / res.length,\n                    0,\n                );\n                if (mid < MIN_K_DIST_SCALE * mean_d) {\n                    mid = MIN_K_DIST_SCALE * mean_d;\n                }\n            }\n            rhos[i] = rho;\n            sigmas[i] = mid;\n        }\n        return {\n            distances: distances,\n            sigmas: sigmas,\n            rhos: rhos,\n        };\n    }\n\n    /**\n     * @private\n     * @param {Matrix} X\n     * @param {number} n_neighbors\n     * @returns {Matrix}\n     */\n    _fuzzy_simplicial_set(X, n_neighbors) {\n        const N = X.shape[0];\n        const metric = /** @type {Metric | \"precomputed\"} */ (this._parameters.metric);\n        const _set_op_mix_ratio = /** @type {number} */ (this._parameters._set_op_mix_ratio);\n\n        const knn =\n            metric === \"precomputed\"\n                ? new NaiveKNN(X.to2dArray(), {\n                      metric: \"precomputed\",\n                      seed: /** @type {number} */ (this._parameters.seed),\n                  })\n                : new BallTree(X.to2dArray(), { metric, seed: /** @type {number} */ (this._parameters.seed) });\n        let { distances, sigmas, rhos } = this._smooth_knn_dist(knn, n_neighbors);\n        distances = this._compute_membership_strengths(distances, sigmas, rhos);\n        const result = new Matrix(N, N, \"zeros\");\n        for (let i = 0; i < N; ++i) {\n            const distances_i = distances[i];\n            for (let j = 0; j < distances_i.length; ++j) {\n                result.set_entry(i, distances_i[j].index, distances_i[j].distance);\n            }\n        }\n\n        const transposed_result = result.T;\n        const prod_matrix = result.mult(transposed_result);\n        return result\n            .add(transposed_result)\n            .sub(prod_matrix)\n            .mult(_set_op_mix_ratio)\n            .add(prod_matrix.mult(1 - _set_op_mix_ratio));\n    }\n\n    /**\n     * @private\n     * @param {number} n_epochs\n     * @returns {Float32Array}\n     */\n    _make_epochs_per_sample(n_epochs) {\n        if (!this._weights) throw new Error(\"Call init() first!\");\n        const weights = this._weights;\n        const result = new Float32Array(weights.length).fill(-1);\n        const weight_scl = n_epochs / max(weights);\n        weights.forEach((w, i) => {\n            const sample = w * weight_scl;\n            if (sample > 0) result[i] = Math.round(n_epochs / sample);\n        });\n        return result;\n    }\n\n    /**\n     * @private\n     * @param {Matrix} graph\n     * @returns {{ rows: number[]; cols: number[]; data: number[] }}\n     */\n    _tocoo(graph) {\n        const rows = [];\n        const cols = [];\n        const data = [];\n        const [rows_n, cols_n] = graph.shape;\n        for (let row = 0; row < rows_n; ++row) {\n            for (let col = 0; col < cols_n; ++col) {\n                const entry = graph.entry(row, col);\n                if (entry !== 0) {\n                    rows.push(row);\n                    cols.push(col);\n                    data.push(entry);\n                }\n            }\n        }\n        return {\n            rows: rows,\n            cols: cols,\n            data: data,\n        };\n    }\n\n    /**\n     * Computes all necessary\n     *\n     * @returns {UMAP<T>}\n     */\n    init() {\n        const _spread = /** @type {number} */ (this._parameters._spread);\n        const min_dist = /** @type {number} */ (this._parameters.min_dist);\n        const n_neighbors = /** @type {number} */ (this._parameters.n_neighbors);\n        const _n_epochs = /** @type {number} */ (this._parameters._n_epochs);\n        const _negative_sample_rate = /** @type {number} */ (this._parameters._negative_sample_rate);\n        const [a, b] = this._find_ab_params(_spread, min_dist);\n        this._a = a;\n        this._b = b;\n        this._graph = this._fuzzy_simplicial_set(this.X, n_neighbors);\n        const { rows, cols, data: weights } = this._tocoo(this._graph);\n        this._head = rows;\n        this._tail = cols;\n        this._weights = weights;\n        this._epochs_per_sample = this._make_epochs_per_sample(_n_epochs);\n        this._epochs_per_negative_sample = this._epochs_per_sample.map((d) => d * _negative_sample_rate);\n        this._epoch_of_next_sample = this._epochs_per_sample.slice();\n        this._epoch_of_next_negative_sample = this._epochs_per_negative_sample.slice();\n        return this;\n    }\n\n    graph() {\n        this.check_init();\n        return { cols: this._head, rows: this._tail, weights: this._weights };\n    }\n\n    /**\n     * @param {number} [iterations=350] - Number of iterations. Default is `350`\n     * @returns {T}\n     */\n    transform(iterations = 350) {\n        if (this.parameter(\"_n_epochs\") !== iterations) {\n            this.parameter(\"_n_epochs\", iterations);\n            this.init();\n        }\n        this.check_init();\n        for (let i = 0; i < iterations; ++i) {\n            this.next();\n        }\n        return this.projection;\n    }\n\n    /**\n     * @param {number} [iterations=350] - Number of iterations. Default is `350`\n     * @returns {Generator<T, T, void>}\n     */\n    *generator(iterations = 350) {\n        if (this.parameter(\"_n_epochs\") !== iterations) {\n            this.parameter(\"_n_epochs\", iterations);\n            this.init();\n        }\n        this.check_init();\n        for (let i = 0; i < iterations; ++i) {\n            this.next();\n            yield this.projection;\n        }\n        return this.projection;\n    }\n\n    /**\n     * @private\n     * @param {number} x\n     * @returns {number}\n     */\n    _clip(x) {\n        if (x > 4) return 4;\n        if (x < -4) return -4;\n        return x;\n    }\n\n    /**\n     * Performs the optimization step.\n     *\n     * @private\n     * @param {Matrix} head_embedding\n     * @param {Matrix} tail_embedding\n     * @param {number[]} head\n     * @param {number[]} tail\n     * @returns {Matrix}\n     */\n    _optimize_layout(head_embedding, tail_embedding, head, tail) {\n        const randomizer = this._randomizer;\n        const _repulsion_strength = /** @type {number} */ (this.parameter(\"_repulsion_strength\"));\n        const dim = /** @type {number} */ (this.parameter(\"d\"));\n        const {\n            _alpha: alpha,\n            _a: a,\n            _b: b,\n            _epochs_per_sample: epochs_per_sample,\n            _epochs_per_negative_sample: epochs_per_negative_sample,\n            _epoch_of_next_negative_sample: epoch_of_next_negative_sample,\n            _epoch_of_next_sample: epoch_of_next_sample,\n            _clip: clip,\n        } = this;\n        if (\n            alpha === undefined ||\n            a === undefined ||\n            b === undefined ||\n            epochs_per_sample === undefined ||\n            epochs_per_negative_sample === undefined ||\n            epoch_of_next_negative_sample === undefined ||\n            epoch_of_next_sample === undefined ||\n            clip === undefined\n        ) {\n            throw new Error(\"call init() first!\");\n        }\n        const tail_length = tail.length;\n\n        for (let i = 0, n = epochs_per_sample.length; i < n; ++i) {\n            if (epoch_of_next_sample[i] <= this._iter) {\n                const j = head[i];\n                const k = tail[i];\n                const current = head_embedding.row(j);\n                const other = tail_embedding.row(k);\n                const dist = euclidean_squared(current, other);\n                if (dist > 0) {\n                    const grad_coeff = (-2 * a * b * dist ** (b - 1)) / (a * dist ** b + 1);\n                    for (let d = 0; d < dim; ++d) {\n                        const grad_d = clip(grad_coeff * (current[d] - other[d])) * alpha;\n                        current[d] += grad_d;\n                        other[d] -= grad_d;\n                    }\n                }\n                epoch_of_next_sample[i] += epochs_per_sample[i];\n                const n_neg_samples = (this._iter - epoch_of_next_negative_sample[i]) / epochs_per_negative_sample[i];\n                for (let p = 0; p < n_neg_samples; ++p) {\n                    const k = randomizer.random_int % tail_length;\n                    const other = tail_embedding.row(tail[k]);\n                    const dist = euclidean_squared(current, other);\n                    if (dist > 0) {\n                        const grad_coeff = (2 * _repulsion_strength * b) / ((0.01 + dist) * (a * dist ** b + 1));\n                        for (let d = 0; d < dim; ++d) {\n                            const grad_d = clip(grad_coeff * (current[d] - other[d])) * alpha;\n                            current[d] += grad_d;\n                            other[d] -= grad_d;\n                        }\n                    } else if (j === k) {\n                    }\n                }\n                epoch_of_next_negative_sample[i] += n_neg_samples * epochs_per_negative_sample[i];\n            }\n        }\n        return head_embedding;\n    }\n\n    /**\n     * @private\n     * @returns {Matrix}\n     */\n    next() {\n        if (!this._head || !this._tail) throw new Error(\"Call init() first!\");\n        const iter = ++this._iter;\n        const Y = this.Y;\n        const _initial_alpha = /** @type {number} */ (this._parameters._initial_alpha);\n        const _n_epochs = /** @type {number} */ (this._parameters._n_epochs);\n        this._alpha = _initial_alpha * (1 - iter / _n_epochs);\n        this.Y = this._optimize_layout(Y, Y, this._head, this._tail);\n\n        return this.Y;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersUMAP>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new UMAP(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersUMAP>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new UMAP(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersUMAP>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new UMAP(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\n\nconst version = pkg.version;\nexport { version };\n\n/** @import {Matrix} from \"./matrix/index.js\" */\n/** @typedef {Matrix | Float64Array[] | number[][]} InputType*/\n\n//export { version } from \"../package.json\" with { type: \"json\" };\nexport * from \"./clustering/index.js\";\nexport * from \"./datastructure/index.js\";\nexport * from \"./dimred/index.js\";\nexport * from \"./knn/index.js\";\nexport * from \"./linear_algebra/index.js\";\nexport * from \"./matrix/index.js\";\nexport * from \"./metrics/index.js\";\nexport * from \"./numerical/index.js\";\nexport * from \"./optimization/index.js\";\nexport * from \"./util/index.js\";\n"],"names":["qr","qr_gramschmidt"],"mappings":"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"}