{"version":3,"file":"druid.cjs","sources":["../src/wasm/thresholds.js","../src/wasm/wasm_bytes.js","../src/wasm/index.js","../src/metrics/bray_curtis.wasm.js","../src/metrics/bray_curtis.js","../src/metrics/canberra.wasm.js","../src/metrics/canberra.js","../src/metrics/chebyshev.wasm.js","../src/metrics/chebyshev.js","../src/metrics/cosine.wasm.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.wasm.js","../src/metrics/manhattan.js","../src/metrics/sokal_michener.js","../src/metrics/wasserstein.js","../src/metrics/yule.js","../src/matrix/distance_matrix.wasm.js","../src/matrix/distance_matrix.js","../src/matrix/k_nearest_neighbors.js","../src/matrix/linspace.js","../src/linear_algebra/inner_product.wasm.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/datastructure/DisjointSet.js","../src/datastructure/Heap.js","../src/util/minimum_spanning_tree.js","../src/util/quickselect.js","../src/util/randomizer.js","../src/linear_algebra/simultaneous_poweriteration.js","../src/matrix/Matrix.wasm.js","../src/matrix/Matrix.js","../src/matrix/norm.wasm.js","../src/matrix/norm.js","../src/matrix/normalize.wasm.js","../src/matrix/normalize.js","../src/clustering/Clustering.js","../src/clustering/CURE.js","../src/clustering/Hierarchical_Clustering.js","../src/clustering/KMeans.wasm.js","../src/clustering/KMeans.js","../src/clustering/KMedoids.wasm.js","../src/clustering/KMedoids.js","../src/wasm/worker_pool.js","../src/clustering/MeanShift.wasm.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/knn/spatial_tree.js","../src/dimred/ISOMAP.wasm.js","../src/dimred/SMACOF.wasm.js","../src/dimred/SMACOF.js","../src/dimred/ISOMAP.js","../src/dimred/PCA.js","../src/dimred/StressMDS.wasm.js","../src/dimred/StressMDS.js","../src/dimred/KKMDS.js","../src/dimred/LDA.js","../src/dimred/LLE.js","../src/dimred/PaCMAP.js","../src/dimred/LocalMAP.js","../src/dimred/MDS.js","../src/dimred/LSP.js","../src/dimred/LTSA.js","../src/dimred/MINFOTree.js","../src/dimred/SAMMON.wasm.js","../src/dimred/SAMMON.js","../src/dimred/SQDMDS.wasm.js","../src/dimred/SQDMDS.js","../src/dimred/TopoMap.js","../src/dimred/TriMap.wasm.js","../src/dimred/TriMap.js","../src/dimred/TSNE.wasm.js","../src/dimred/TSNE.js","../src/optimization/powell.js","../src/dimred/UMAP.wasm.js","../src/dimred/UMAP.js","../src/index.js"],"sourcesContent":["/**\n * Problem-size thresholds below which the plain JS implementation is used instead of a WASM kernel.\n *\n * Crossing into WASM is not free: arguments are copied into linear memory and results copied back,\n * and a JIT-warm JS loop over a `Float64Array` is already fast. For small inputs the copy dominates\n * and the JS loop wins outright — a threshold set too low makes the library *slower*.\n *\n * The constants below are break-even points measured with `benchmark/wasm_threshold_calibration.js`\n * (Node 24, x64). Re-run it if the kernels change. Values are rounded up to a power of two so they\n * stay conservative across engines: too high only forgoes a modest speedup, too low costs real time\n * on every call.\n *\n * @module wasm/thresholds\n */\n\n/**\n * Minimum vector length for element-wise kernels that accumulate several running sums per element,\n * such as {@link cosine} (dot product plus both norms).\n *\n * More arithmetic per byte copied means the crossover comes earlier; measured break-even is ~512\n * elements, growing to roughly a 2× speedup by 16k.\n *\n * @type {number}\n */\nexport const WASM_MIN_VECTOR_LENGTH = 512;\n\n/**\n * Minimum vector length for single-accumulator reductions — `manhattan`, `chebyshev`, `canberra`,\n * `bray_curtis`, `norm`, `normalize`, `inner_product`.\n *\n * These do one multiply-add per element, so the copy is only amortised around ~1024 elements, and\n * even then the gain is modest (~1.3× at 16k).\n *\n * @type {number}\n */\nexport const WASM_MIN_SIMPLE_VECTOR_LENGTH = 1024;\n\n/**\n * Minimum number of rows for the row-wise kernels that touch every pair of points\n * (`distance_matrix`, k-means assignment, the t-SNE/SMACOF/SAMMON iteration steps).\n *\n * These do O(N²) work for a single O(N·D) copy, so the crossover sits low — measured at ~8 rows.\n *\n * @type {number}\n */\nexport const WASM_MIN_ROWS = 16;\n\n/**\n * Minimum number of scalar multiply-accumulates (`rows_A * cols_A * cols_B`) for the matrix-product\n * kernels (`dot`, `transDot`, `dotTrans`, `outer`).\n *\n * Measured break-even is ~512 operations (an 8 ⨯ 8 product); beyond it the kernel pulls away fast,\n * reaching ~4× at 32 ⨯ 32.\n *\n * @type {number}\n */\nexport const WASM_MIN_MATMUL_OPS = 512;\n\n/**\n * Minimum row count before a range kernel is split across the worker pool.\n *\n * Starting the pool costs roughly 100 ms — every worker instantiates its own copy of the module —\n * and a method that dispatches once, such as ISOMAP's geodesic step, cannot amortize that. Measured\n * end to end including start-up, parallel Dijkstra is 0.37× at 200 rows, breaks even near 500, and\n * reaches 1.76× at 1024, 3.99× at 2000 and 5.49× at 4000. Once the pool is warm the speedup is\n * 5-6× from a few hundred rows upward, so this bound is set by start-up, not by the kernel.\n *\n * @type {number}\n */\nexport const WASM_MIN_PARALLEL_ROWS = 1024;\n\n/**\n * Minimum edge count for the UMAP SGD epoch kernel.\n *\n * Each epoch copies the embedding and four edge-length arrays in and three back out, so tiny graphs\n * are dominated by the transfer.\n *\n * @type {number}\n */\nexport const WASM_MIN_UMAP_EDGES = 512;\n","// Auto-generated by scripts/build-wasm.js. Do not edit directly.\nexport const WASM_BASE64 = \"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IAZQDQIaRAAAAAAAAPh/IAJCgICAgICAgPg/UQ0CGiAAIAGgIAZCgICAgICAgHBWIAJCAYYiAkKAgICAgICAcFZyDQIaRAAAAAAAAPh/IAJCgICAgICAgPD/AFENAhpEAAAAAAAAAAAgBUI/iFAgAkKAgICAgICA8P8AVEYNAhogASABogwCCyACQgGGQgF9Qv////////9vWgRARAAAAAAAAPA/IAAgAKIiAJogACACQj+IpwR/An9BACAFQjSIQv8PgyICQv8HVA0AGkECIAJCswhWDQAaQQAgBUIBQrMIIAJ9hiICQgF9g0IAUg0AGkEBIAIgBYNCAFINABpBAgtBAUYFQQALGyIAoyAAIAVCAFMbDAILIAJCAFMEQAJ/QQAgBUI0iEL/D4MiBkL/B1QNABpBAiAGQrMIVg0AGkEAIAVCAUKzCCAGfYYiBkIBfYNCAFINABpBASAFIAaDQgBSDQAaQQILIgdFBEAgACAAoSIAIACjDAMLIANC/w+DIQNBgIAQQQAgB0EBRhshCCACQv///////////wCDIQILIARC/w+DIgZCvgd9QoABWgRARAAAAAAAAPA/IAJCgICAgICAgPg/UQ0CGkQAAAAAAADwPyAGQr4HVA0CGkQAAAAAAADwf0QAAAAAAAAAACAEQoAQVCACQoCAgICAgID4P1ZGGwwCCyADUARAIABEAAAAAAAAMEOivUL///////////8Ag0KAgICAgICAoAN9IQILCyACIAJCgICAgNCqpfM/fSICQoCAgICAgIB4g30iA0KAgICACHxCgICAgHCDvyIKIAJCLYhC/wCDp0EFdEGQCWoiBysDACILokQAAAAAAADwv6AhDCACQjSHuSIORAA4+v5CLuY/oiAHKwMQoCIAIAwgA78gCqEgC6IiCqAiD6AhECAPIA9EAAAAAAAA4L+iIguiIREgECAMIAxEAAAAAAAA4L+iIhKiIgygIg0gDSAORDBnx5NX8y49oiAHKwMYoCAAIBChIA+goCAKIAsgEqCioCAQIA2hIAygoCAPIBGiIA9EBgAAAAAA4D+iRGBVVVVVVeW/oCARIA9EeqQpVVVV5b+iRE5VWZmZmek/oCARIA9Ewz8miysA8D+iROlFSJtbSfK/oKKgoqCioCIAoCIKoSAAoCQBIAVCgICAQIO/IgAgCr1CgICAQIO/Igui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\";\n","import { WASM_BASE64 } from \"./wasm_bytes.js\";\n\n/** @type {WebAssembly.Instance | null} */\nlet wasmInstance = null;\n\n/**\n * Set once the module traps. An AssemblyScript `abort` unwinds straight back to the JS caller and\n * leaves the instance in an undefined state, so it must never be used again — every kernel then\n * reports failure and the caller falls back to its JS implementation.\n *\n * @type {boolean}\n */\nlet wasmAborted = false;\n\n/**\n * Opt-out switch, see {@link setWasmEnabled}. Reads `DRUID_DISABLE_WASM` from the environment so\n * the JS paths can be exercised without changing any code.\n *\n * @type {boolean}\n */\nlet wasmEnabled = !read_env_flag(\"DRUID_DISABLE_WASM\");\n\n/**\n * Reads a boolean flag from `process.env`, tolerating environments without a `process` global.\n *\n * @param {string} name\n * @returns {boolean}\n */\nfunction read_env_flag(name) {\n    try {\n        const env = /** @type {any} */ (globalThis).process?.env;\n        const value = env?.[name];\n        return value !== undefined && value !== \"\" && value !== \"0\" && value !== \"false\";\n    } catch {\n        return false;\n    }\n}\n\n/**\n * Enables or disables WASM acceleration at runtime.\n *\n * With WASM disabled every accelerated function takes its JS fallback path. This exists so the two\n * implementations can be compared in tests and benchmarks.\n *\n * For most of the library the two paths agree to within floating point tolerance — the kernels\n * accumulate in a different order than the scalar loops, and `Math.pow`/`Math.exp` are only\n * \"implementation-approximated\" in ECMAScript, so the last bit may differ. `PCA`, `MDS`, `TSNE` and\n * `TriMap` come out bit-identical in practice.\n *\n * {@link UMAP} and {@link SAMMON} are the exception: their optimisers are chaotic, so a last-bit\n * difference grows into a visibly different (though equally valid) layout. See the note on\n * reproducibility in those classes.\n *\n * @param {boolean} enabled - Whether kernels may run in WASM.\n * @returns {boolean} The new state.\n * @example\n * import { setWasmEnabled } from \"@saehrimnir/druidjs\";\n * setWasmEnabled(false); // force the pure JS implementations\n */\nexport function setWasmEnabled(enabled) {\n    wasmEnabled = Boolean(enabled);\n    return wasmEnabled;\n}\n\n/**\n * Reads an AssemblyScript string out of linear memory, for the abort handler.\n *\n * AssemblyScript strings are UTF-16 with their byte length in the header word immediately before\n * the payload. A null pointer is normal — `assert(cond)` without a message aborts with one.\n *\n * @private\n * @param {number} ptr\n * @returns {string | null} The string, or null if there is nothing readable there.\n */\nfunction read_wasm_string(ptr) {\n    if (!ptr) return null;\n    try {\n        const memory = /** @type {any} */ (wasmInstance).exports.memory;\n        const length = new Uint32Array(memory.buffer, ptr - 4, 1)[0] >>> 1;\n        return String.fromCharCode(...new Uint16Array(memory.buffer, ptr, length));\n    } catch {\n        // Reporting the abort matters more than decorating it.\n        return null;\n    }\n}\n\nexport function initWasm() {\n    if (!wasmEnabled || wasmAborted) return null;\n    if (wasmInstance) return wasmInstance;\n    try {\n        if (typeof WebAssembly === \"undefined\") return null;\n        let binaryString = \"\";\n        const g = /** @type {any} */ (globalThis);\n        if (typeof atob === \"function\") {\n            binaryString = atob(WASM_BASE64);\n        } else if (g?.Buffer) {\n            binaryString = g.Buffer.from(WASM_BASE64, \"base64\").toString(\"binary\");\n        } else {\n            return null;\n        }\n        const bytes = new Uint8Array(binaryString.length);\n        for (let i = 0; i < binaryString.length; i++) {\n            bytes[i] = binaryString.charCodeAt(i);\n        }\n        const module = new WebAssembly.Module(bytes);\n        wasmInstance = new WebAssembly.Instance(module, {\n            env: {\n                abort: (\n                    /** @type {number} */ msg,\n                    /** @type {number} */ _file,\n                    /** @type {number} */ line,\n                    /** @type {number} */ column,\n                ) => {\n                    // The instance cannot be trusted after a trap; retire it and fall back to JS.\n                    // The location is worth decoding: a bare `assert` passes a null message, so\n                    // \"~lib/rt/tlsf.ts\" is the only thing distinguishing heap corruption caused by\n                    // a bad buffer size from an ordinary kernel bug.\n                    // Read the location out of the still-live memory before retiring the instance.\n                    const where = read_wasm_string(_file) ?? \"kernel\";\n                    const reason = read_wasm_string(msg);\n                    retire_instance();\n                    console.error(\n                        `DruidJS: WASM aborted in ${where} at ${line}:${column}${reason ? `: ${reason}` : \"\"}, falling back to JS.`,\n                    );\n                },\n            },\n        });\n        return wasmInstance;\n    } catch (_e) {\n        return null;\n    }\n}\n\n/**\n * Returns whether WASM acceleration is available in current environment.\n * @returns {boolean}\n */\nexport function isWasmAvailable() {\n    return initWasm() !== null;\n}\n\n/**\n * Returns whether SharedArrayBuffer and WASM multi-threading is supported in current environment (Node.js, Bun, Deno, or Web Browser with COOP/COEP headers).\n * @returns {boolean}\n */\nexport function isWasmThreadsSupported() {\n    try {\n        if (typeof SharedArrayBuffer === \"undefined\") return false;\n        const mem = new WebAssembly.Memory({ initial: 1, maximum: 1, shared: true });\n        return mem.buffer instanceof SharedArrayBuffer;\n    } catch {\n        return false;\n    }\n}\n\n/**\n * Allocates a buffer in the WASM heap and records the pointer in `ptrs`.\n *\n * Every kernel allocates through this and releases through {@link free_all} in a `finally`, so that\n * a failing allocation part-way through a list still frees the ones that already succeeded — WASM\n * linear memory is never reclaimed by the garbage collector, so a leaked pointer is permanent.\n *\n * @private\n * @param {any} exports - The WASM instance exports.\n * @param {number[]} ptrs - Accumulator holding every pointer allocated so far.\n * @param {number} size - Size in bytes.\n * @returns {number} Pointer to the allocated buffer.\n */\nexport function alloc(exports, ptrs, size) {\n    const ptr = exports.allocate(size);\n    ptrs.push(ptr);\n    return ptr;\n}\n\n/**\n * Frees every pointer collected by {@link alloc}.\n *\n * @private\n * @param {any} exports - The WASM instance exports.\n * @param {number[]} ptrs - Pointers to release.\n */\nexport function free_all(exports, ptrs) {\n    for (let i = 0; i < ptrs.length; ++i) {\n        exports.free(ptrs[i]);\n    }\n    ptrs.length = 0;\n}\n\n/**\n * Builds the wrapper for a kernel that reduces one vector to a single number.\n *\n * The vector metrics and reductions all wrap the same way — copy the operands in, call, free in a\n * `finally` — and differ only in which kernel they name. Building them from one definition is what\n * keeps a fix to the allocation discipline from having to be made nine times.\n *\n * @private\n * @param {string} kernel - Name of the exported kernel, which must take `(ptr, len)`.\n * @returns {(V: Float64Array | number[]) => number | null} The wrapper, returning null when WASM is\n *   unavailable so the caller falls back to its JS implementation.\n */\nexport function vector_reduction(kernel) {\n    return (V) => {\n        const inst = initWasm();\n        if (!inst) return null;\n\n        /** @type {any} */\n        const exports = inst.exports;\n        const len = V.length;\n\n        /** @type {number[]} */\n        const ptrs = [];\n        try {\n            const ptr = alloc(exports, ptrs, len * 8);\n            new Float64Array(exports.memory.buffer, ptr, len).set(V);\n            return exports[kernel](ptr, len);\n        } finally {\n            free_all(exports, ptrs);\n        }\n    };\n}\n\n/**\n * Builds the wrapper for a kernel that reduces two vectors to a single number.\n *\n * The length is taken from `A`, matching every caller: these are the vector metrics, which are only\n * ever handed two rows of the same matrix.\n *\n * @private\n * @param {string} kernel - Name of the exported kernel, which must take `(a_ptr, b_ptr, len)`.\n * @returns {(A: Float64Array | number[], B: Float64Array | number[]) => number | null} The wrapper,\n *   returning null when WASM is unavailable so the caller falls back to its JS implementation.\n */\nexport function vector_pair_reduction(kernel) {\n    return (A, B) => {\n        const inst = initWasm();\n        if (!inst) return null;\n\n        /** @type {any} */\n        const exports = inst.exports;\n        const memory = exports.memory;\n        const len = A.length;\n\n        /** @type {number[]} */\n        const ptrs = [];\n        try {\n            const ptrA = alloc(exports, ptrs, len * 8);\n            const ptrB = alloc(exports, ptrs, len * 8);\n            new Float64Array(memory.buffer, ptrA, len).set(A);\n            new Float64Array(memory.buffer, ptrB, len).set(B);\n            return exports[kernel](ptrA, ptrB, len);\n        } finally {\n            free_all(exports, ptrs);\n        }\n    };\n}\n\n/**\n * Buffers held across calls to an iterative kernel.\n *\n * The optimisers call their kernel once per iteration with operands that mostly do not change.\n * t-SNE is the clearest case: `P`, the joint probability matrix, is built once by `init()` and read\n * by all 500 iterations, and the N ⨯ N scratch matrices are never read from JS at all. Allocating\n * and copying those per call moves roughly 15 GB over a run at N = 2000 to no purpose.\n *\n * A session keeps the pointers alive and re-copies an operand only when the caller hands over a\n * different array. Held buffers are not garbage: WASM linear memory is never reclaimed, so a\n * session is released when the shape changes, and {@link release_wasm_buffers} exists for callers\n * that want the memory back before then.\n *\n * One slot per key rather than one slot overall: SQDMDS calls two kernels per iteration and shares\n * `grads` between them, so a single slot would have them evicting each other every iteration and\n * end up slower than copying.\n *\n * @private\n * @type {Map<string, { inst: object, ptrs: Record<string, number>, sizes: Record<string, number>, sources: Record<string, Float64Array | null> }>}\n */\nconst sessions = new Map();\n\n/**\n * Retires the current instance after a trap and drops everything that references it.\n *\n * The abort handler calls this the moment a kernel traps; it is also the state a test needs to\n * reach without corrupting the heap, so it is exported (privately) rather than inlined.\n *\n * Clearing `sessions` is the part that is easy to forget and expensive to omit. Every session entry\n * holds `inst`, so leaving them in the Map would pin the dead instance's whole linear memory — tens\n * to hundreds of MB after a large run — for the life of the process: once `wasmAborted` is set,\n * `initWasm` returns null and no later kernel call ever reaches `get_session`/`release_sessions` to\n * clear them. The pointers are deliberately not freed — the heap they came from dies with the\n * instance.\n *\n * @private\n * @returns {void}\n */\nexport function retire_instance() {\n    wasmAborted = true;\n    wasmInstance = null;\n    sessions.clear();\n}\n\n/**\n * Returns the session for `key`, allocating it if the shape changed or nothing is cached yet.\n *\n * The session is tied to the instance it was allocated from. A kernel trap retires the instance, so\n * comparing identity is what stops a pointer from a dead instance ever being reused — in that case\n * the old buffers are dropped rather than freed, since the heap they came from is gone with it.\n *\n * @private\n * @param {object} inst - The WASM instance the buffers belong to.\n * @param {any} exports - The WASM instance exports.\n * @param {string} key - Identifies the kernel and its operand shape.\n * @param {Record<string, number>} sizes - Byte size per buffer name.\n * @returns {{ ptrs: Record<string, number>, sources: Record<string, Float64Array | null> }}\n */\nexport function get_session(inst, exports, key, sizes) {\n    // Every byte size is compared, not just the `key`. Sizing a buffer from anything other than the\n    // array that will be copied into it is how this went wrong once already: t-SNE's `ystep` and\n    // `gains` are N ⨯ D in the *input* dimensionality, not the N ⨯ dim the kernel indexes, so a\n    // buffer sized from `n * dim` took a view sized from `ystep.length` and wrote through the next\n    // TLSF block header. Reusing a buffer only when its size is unchanged makes that unrepresentable.\n    const names = Object.keys(sizes);\n    const existing = sessions.get(key);\n    if (existing && existing.inst === inst) {\n        let fits = Object.keys(existing.sizes).length === names.length;\n        if (fits) {\n            for (const name of names) {\n                if (existing.sizes[name] !== sizes[name]) {\n                    fits = false;\n                    break;\n                }\n            }\n        }\n        if (fits) return existing;\n    }\n\n    if (existing) {\n        // Only free when the buffers came from the instance still in use.\n        if (existing.inst === inst) {\n            for (const name of Object.keys(existing.ptrs)) exports.free(existing.ptrs[name]);\n        }\n        sessions.delete(key);\n    }\n\n    /** @type {Record<string, number>} */\n    const ptrs = {};\n    for (const name of names) ptrs[name] = exports.allocate(sizes[name]);\n    const created = { inst, ptrs, sizes: { ...sizes }, sources: {} };\n    sessions.set(key, created);\n    return created;\n}\n\n/**\n * Copies `source` into the session buffer `name`, unless the same array is already there.\n *\n * Identity, not contents, is the test: the iterative callers build an operand once and hand over\n * the same `Float64Array` every iteration, and a caller that rebuilds it produces a new array. An\n * operand mutated in place behind a stable identity would be missed, so this is only used for\n * operands the callers treat as constant for the run.\n *\n * The view is built from the source's own constructor, so this works for the `Int32Array` and\n * `Float32Array` operands too — UMAP's constant edge arrays are of all three kinds.\n *\n * @private\n * @param {any} exports - The WASM instance exports.\n * @param {{ ptrs: Record<string, number>, sources: Record<string, any> }} s\n * @param {string} name\n * @param {Float64Array | Float32Array | Int32Array | Uint32Array} source\n */\nexport function copy_once(exports, s, name, source) {\n    if (s.sources[name] === source) return;\n    const View = /** @type {any} */ (source.constructor);\n    new View(exports.memory.buffer, s.ptrs[name], source.length).set(source);\n    s.sources[name] = source;\n}\n\n/**\n * Releases the named sessions, if they are still held.\n *\n * The optimisers call this from a `finally` when a run ends, which is what keeps the retained\n * buffers — around 96 MB for t-SNE at N = 2000 — from outliving the projection that needed them.\n * Freeing a session is never a correctness matter: the next call simply reallocates.\n *\n * @private\n * @param {string[]} keys\n * @returns {void}\n */\nexport function release_sessions(keys) {\n    const inst = /** @type {any} */ (wasmInstance);\n    for (const key of keys) {\n        const held = sessions.get(key);\n        if (!held) continue;\n        if (inst && held.inst === inst) {\n            for (const name of Object.keys(held.ptrs)) inst.exports.free(held.ptrs[name]);\n        }\n        sessions.delete(key);\n    }\n}\n\n/**\n * How many buffer sessions are currently held.\n *\n * Internal, and only used by the tests: that the optimisers release their buffers when a run ends\n * is otherwise invisible from outside, and an unreleased session is a leak rather than a failure.\n *\n * @private\n * @returns {number}\n */\nexport function held_session_count() {\n    return sessions.size;\n}\n\n/**\n * Releases every session.\n *\n * Internal: the optimisers release their own sessions when a run ends, so nothing outside needs\n * this. It remains for tests and for the rare caller driving `next()` by hand.\n *\n * @private\n * @returns {void}\n */\nexport function release_wasm_buffers() {\n    const inst = /** @type {any} */ (wasmInstance);\n    for (const held of sessions.values()) {\n        if (inst && held.inst === inst) {\n            for (const name of Object.keys(held.ptrs)) inst.exports.free(held.ptrs[name]);\n        }\n    }\n    sessions.clear();\n}\n","/**\n * WASM wrapper for the `bray_curtis` kernel.\n *\n * The copy in, the call and the release are the same for every vector metric, so the wrapper is\n * built by `vector_pair_reduction` rather than written out. The shared runtime -- instance setup,\n * allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_pair_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes Bray-Curtis distance between two 1D vectors A and B.\n *\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmBrayCurtisDistance = vector_pair_reduction(\"bray_curtis_distance_f64\");\n","import { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmBrayCurtisDistance } from \"./bray_curtis.wasm.js\";\n\n/**\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    if (a.length >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const wasmRes = wasmBrayCurtisDistance(a, b);\n        if (wasmRes !== null) {\n            return wasmRes;\n        }\n    }\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 * WASM wrapper for the `canberra` kernel.\n *\n * The copy in, the call and the release are the same for every vector metric, so the wrapper is\n * built by `vector_pair_reduction` rather than written out. The shared runtime -- instance setup,\n * allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_pair_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes Canberra distance between two 1D vectors A and B.\n *\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmCanberraDistance = vector_pair_reduction(\"canberra_distance_f64\");\n","import { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmCanberraDistance } from \"./canberra.wasm.js\";\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    if (a.length >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const wasmRes = wasmCanberraDistance(a, b);\n        if (wasmRes !== null) {\n            return wasmRes;\n        }\n    }\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 * WASM wrapper for the `chebyshev` kernel.\n *\n * The copy in, the call and the release are the same for every vector metric, so the wrapper is\n * built by `vector_pair_reduction` rather than written out. The shared runtime -- instance setup,\n * allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_pair_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes Chebyshev (L_infinity) distance between two 1D vectors A and B.\n *\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmChebyshevDistance = vector_pair_reduction(\"chebyshev_distance_f64\");\n","import { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmChebyshevDistance } from \"./chebyshev.wasm.js\";\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\n    if (n >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const wasmRes = wasmChebyshevDistance(a, b);\n        if (wasmRes !== null) {\n            return wasmRes;\n        }\n    }\n\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 * WASM wrapper for the `cosine` kernel.\n *\n * The copy in, the call and the release are the same for every vector metric, so the wrapper is\n * built by `vector_pair_reduction` rather than written out. The shared runtime -- instance setup,\n * allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_pair_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes cosine distance between two 1D vectors A and B.\n *\n * A vector with no direction comes back as 1.0, which the caller reports as orthogonal.\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmCosineDistance = vector_pair_reduction(\"cosine_distance_f64\");\n","import { WASM_MIN_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmCosineDistance } from \"./cosine.wasm.js\";\n\n/**\n * Turns a cosine similarity into an angular distance.\n *\n * The similarity is clamped to `[-1, 1]` before taking the arc cosine: floating point rounding\n * lets the ratio drift marginally outside that range (e.g. `1.0000000000000002` for two identical\n * vectors), which would otherwise make `Math.acos` return `NaN`.\n *\n * A vector of length zero has no direction, so the angle to it is undefined. Rather than\n * propagating `NaN` through a whole embedding, both the JS and the WASM path report such pairs as\n * orthogonal (`π / 2`).\n *\n * @private\n * @param {number} similarity - The cosine similarity, nominally in `[-1, 1]`.\n * @returns {number} The angle in radians.\n */\nfunction angle_from_similarity(similarity) {\n    if (!Number.isFinite(similarity)) return Math.PI / 2;\n    return Math.acos(Math.min(1, Math.max(-1, similarity)));\n}\n\n/**\n * Computes the cosine distance (not similarity) between `a` and `b`.\n *\n * Identical vectors yield exactly `0`, and pairs involving a zero vector yield `π / 2`.\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\n    if (n >= WASM_MIN_VECTOR_LENGTH) {\n        const wasmRes = wasmCosineDistance(a, b);\n        if (wasmRes !== null) {\n            return angle_from_similarity(1.0 - wasmRes);\n        }\n    }\n\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    if (sum_a === 0 || sum_b === 0) return Math.PI / 2;\n    // One square root of the product, not the product of two square roots: `Math.sqrt(s) *\n    // Math.sqrt(s)` rounds twice and lands either side of `s`, so identical vectors would yield a\n    // similarity a few ulps off 1 and an angle of ~1e-8 instead of 0.\n    return angle_from_similarity(sum / Math.sqrt(sum_a * 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 * WASM wrapper for the `manhattan` kernel.\n *\n * The copy in, the call and the release are the same for every vector metric, so the wrapper is\n * built by `vector_pair_reduction` rather than written out. The shared runtime -- instance setup,\n * allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_pair_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes Manhattan (L1) distance between two 1D vectors A and B.\n *\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmManhattanDistance = vector_pair_reduction(\"manhattan_distance_f64\");\n","import { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmManhattanDistance } from \"./manhattan.wasm.js\";\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\n    if (n >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const wasmRes = wasmManhattanDistance(a, b);\n        if (wasmRes !== null) {\n            return wasmRes;\n        }\n    }\n\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","/**\n * WASM wrappers for the `distance_matrix` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `distance_matrix.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * Computes Pairwise Euclidean Distance Matrix using WASM SIMD.\n *\n * @param {Float64Array} X_val\n * @param {number} n\n * @param {number} d\n * @param {Float64Array} D_val\n * @returns {boolean}\n */\nexport function wasmDistanceMatrix(X_val, n, d, D_val) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrX = alloc(exports, ptrs, X_val.byteLength);\n        const ptrD = alloc(exports, ptrs, D_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrX, X_val.length).set(X_val);\n\n        exports.euclidean_distance_matrix_f64(ptrX, ptrD, n, d);\n\n        D_val.set(new Float64Array(memory.buffer, ptrD, D_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Exact k-nearest neighbors for rows `[start_row, end_row)` using WASM SIMD.\n *\n * Selection happens inside the kernel, so the copy back is `k` entries per row rather than `n`, and\n * the caller can block the search without ever materializing an n ⨯ n distance matrix.\n *\n * @param {Float64Array} X_val - Row-major `n` ⨯ `d` input.\n * @param {number} n\n * @param {number} d\n * @param {number} k - Neighbors per row, excluding the row itself.\n * @param {Float64Array} out_val - `n` ⨯ `2k`: `k` ascending distances then their `k` indices.\n *   Rows outside the range are left untouched.\n * @param {number} start_row\n * @param {number} end_row\n * @returns {boolean} False if WASM is unavailable and the caller must fall back to JS.\n */\nexport function wasmKnnBlock(X_val, n, d, k, out_val, start_row, end_row) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrX = alloc(exports, ptrs, X_val.byteLength);\n        const ptrOut = alloc(exports, ptrs, out_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrX, X_val.length).set(X_val);\n\n        exports.euclidean_knn_block_f64(ptrX, ptrOut, n, d, k, start_row, end_row);\n\n        // Slice only, so concurrent workers sharing `out_val` do not clobber each other's rows.\n        const row_len = 2 * k;\n        const offset = start_row * row_len;\n        const count = (end_row - start_row) * row_len;\n        out_val.set(new Float64Array(memory.buffer, ptrOut + offset * 8, count), offset);\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n","import { euclidean } from \"../metrics/index.js\";\nimport { WASM_MIN_ROWS } from \"../wasm/thresholds.js\";\nimport { wasmDistanceMatrix } from \"./distance_matrix.wasm.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    const mat = isMatrix(A) ? A : Matrix.from(A);\n    const [n, d] = mat.shape;\n    const D = new Matrix(n, n);\n\n    if (metric === euclidean && n >= WASM_MIN_ROWS) {\n        if (wasmDistanceMatrix(mat.values, n, d, D.values)) {\n            return D;\n        }\n    }\n\n    for (let i = 0; i < n; ++i) {\n        const A_i = mat.row(i);\n        for (let j = i + 1; j < n; ++j) {\n            const dist = metric(A_i, mat.row(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 * WASM wrapper for the `inner_product` kernel.\n *\n * The copy in, the call and the release are the same for every two-vector reduction, so the wrapper\n * is built by `vector_pair_reduction` rather than written out. The shared runtime -- instance setup,\n * allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_pair_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes Inner Product <A, B> using WASM SIMD.\n *\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmInnerProduct = vector_pair_reduction(\"inner_product_f64\");\n","import { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmInnerProduct } from \"./inner_product.wasm.js\";\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    if (N >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const wasmRes = wasmInnerProduct(a, b);\n        if (wasmRes !== null) {\n            return wasmRes;\n        }\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 * Deliberately not WASM accelerated: the compensation term makes each step depend on the previous\n * one, so the kernel cannot vectorise, and it measured slower than this loop at every input size —\n * the argument copy is pure overhead. A `neumair_sum_f64` kernel existed on that basis alone, never\n * called by anything; it and its benchmark row were removed once the measurement had been made.\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    // On overflow the compensation is `Infinity - Infinity`, so adding it turns a correct `Infinity`\n    // into `NaN`. There is nothing to compensate once the running sum has left the representable\n    // range, so it is returned as is.\n    return Number.isFinite(sum) ? sum + compensation : sum;\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","/**\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                // `== null` rather than a falsy test: elements may legitimately be `0`, which every\n                // index-keyed caller starts at.\n                if (new_parent == null) 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        // `== null` rather than a falsy test: `0` is a valid element, see `find`.\n        if (node_x == null || node_y == null) 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        const temp = container[index_a];\n        container[index_a] = container[index_b];\n        container[index_b] = temp;\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 = { element: element, value: value };\n        this._container.push(node);\n        this._heapify_up();\n        return this;\n    }\n\n    /**\n     * Non-recursive sift-down implementation.\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        if (start_index >= length) return;\n\n        let index = start_index;\n        while (true) {\n            let smallest = index;\n            const left = 2 * index + 1;\n            const right = 2 * index + 2;\n\n            if (left < length && comparator(container[left].value, container[smallest].value)) {\n                smallest = left;\n            }\n            if (right < length && comparator(container[right].value, container[smallest].value)) {\n                smallest = right;\n            }\n\n            if (smallest !== index) {\n                this._swap(index, smallest);\n                index = smallest;\n            } else {\n                break;\n            }\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 { DisjointSet } from \"../datastructure/index.js\";\n\n/**\n * @typedef {[number, number, number]} WeightedEdge An edge `[u, v, weight]` between the vertices with\n *   index `u` and `v`.\n */\n\n/**\n * Computes a minimum spanning tree of a weighted graph with Kruskal's algorithm.\n *\n * The graph is given as an edge list over vertices `0 … N-1`, so a caller holding a sparse structure\n * (a k-nearest-neighbor graph, say) never has to materialize the `N ⨯ N` matrix. Edges are treated as\n * undirected; passing both `[u, v, w]` and `[v, u, w]` is harmless, the second one is skipped as a\n * cycle.\n *\n * If the graph is disconnected the result is a minimum spanning *forest* — one tree per connected\n * component, and fewer than `N - 1` edges. Callers that need a connected result must guarantee a\n * connected input.\n *\n * @param {WeightedEdge[]} edges - The edges of the graph. Not mutated.\n * @param {number} N - The number of vertices. Vertex indices must be in `[0, N)`.\n * @returns {WeightedEdge[]} The edges of the minimum spanning tree, ascending by weight.\n * @see {@link https://en.wikipedia.org/wiki/Kruskal%27s_algorithm}\n */\nexport function minimum_spanning_tree(edges, N) {\n    /** @type {WeightedEdge[]} */\n    const F = [];\n    if (N <= 1) return F;\n\n    /** @type {DisjointSet<number>} */\n    const disjoint_set = new DisjointSet(Array.from({ length: N }, (_, i) => i));\n    // Sorting a copy keeps the caller's array intact, which matters because the information graph in\n    // MINFOTree is reused after the tree is extracted.\n    const sorted = edges.slice().sort((a, b) => a[2] - b[2]);\n\n    for (const edge of sorted) {\n        const set_u = disjoint_set.find(edge[0]);\n        const set_v = disjoint_set.find(edge[1]);\n        if (set_u === null || set_v === null) throw new Error(\"Edge refers to a vertex outside [0, N)!\");\n        if (set_u !== set_v) {\n            F.push(edge);\n            disjoint_set.union(set_u, set_v);\n            if (F.length === N - 1) break;\n        }\n    }\n\n    return F;\n}\n","/**\n * QuickSelect module providing O(N) average selection and median partitioning.\n *\n * The pivot is drawn from a caller-supplied seeded {@link Randomizer} rather than `Math.random`.\n * A random pivot keeps the expected runtime linear on any input, including the sorted and organ-pipe\n * arrangements that defeat a fixed pivot rule, while seeding keeps every result reproducible — the\n * rest of the library derives all randomness from a `Randomizer` and nothing may depend on\n * `Math.random`.\n *\n * Partitioning is three-way (Dutch national flag), which keeps the runtime linear on inputs with\n * many duplicate keys instead of degrading to O(N²).\n *\n * @module util/quickselect\n */\n\n/** @import { Randomizer } from \"./randomizer.js\" */\n\n/**\n * Default numeric compare helper.\n * @param {any} a\n * @param {any} b\n * @returns {number}\n */\nfunction defaultCompare(a, b) {\n    return Number(a) - Number(b);\n}\n\n/**\n * In-place QuickSelect algorithm to partition an array around the k-th smallest element.\n * Runs in O(N) average time complexity (compared to O(N log N) for full Array.prototype.sort).\n *\n * After the call `arr[k]` holds the k-th smallest element, every element left of `k` compares\n * less than or equal to it, and every element right of `k` compares greater than or equal to it.\n *\n * @template T\n * @param {T[]} arr - Array to partition in-place\n * @param {Randomizer} randomizer - Seeded source of randomness for pivot selection.\n * @param {number} k - Target 0-indexed rank to select\n * @param {(a: T, b: T) => number} [compareFn] - Comparison function\n * @param {number} [start_left] - Start index (inclusive)\n * @param {number} [start_right] - End index (inclusive)\n * @returns {T} The k-th smallest element in the array\n */\nexport function quickselect(\n    arr,\n    randomizer,\n    k,\n    compareFn = defaultCompare,\n    start_left = 0,\n    start_right = arr.length - 1,\n) {\n    if (arr.length === 0 || k < 0 || k >= arr.length) {\n        return arr[k];\n    }\n\n    let left = start_left;\n    let right = start_right;\n\n    while (left < right) {\n        const pivot = arr[left + Math.floor(randomizer.random * (right - left + 1))];\n        const [lt, gt] = partition(arr, left, right, pivot, compareFn);\n        if (k < lt) {\n            right = lt - 1;\n        } else if (k > gt) {\n            left = gt + 1;\n        } else {\n            // arr[lt..gt] all compare equal to the pivot, so arr[k] is already in place.\n            return arr[k];\n        }\n    }\n    return arr[k];\n}\n\n/**\n * QuickSelect by specific dimension axis for spatial trees (KDTree, BallTree).\n * Partitions array in-place along `arr[i].element[axis]`.\n *\n * @template {{ element: number[] | Float64Array }} T\n * @param {T[]} arr - Array to partition in-place\n * @param {Randomizer} randomizer - Seeded source of randomness for pivot selection.\n * @param {number} k - Target 0-indexed rank to select\n * @param {number} axis - Dimension coordinate index\n * @param {number} [start_left] - Start index (inclusive)\n * @param {number} [start_right] - End index (inclusive)\n * @returns {T} The k-th element along specified axis\n */\nexport function quickselectByAxis(arr, randomizer, k, axis, start_left = 0, start_right = arr.length - 1) {\n    return quickselect(arr, randomizer, k, (a, b) => a.element[axis] - b.element[axis], start_left, start_right);\n}\n\n/**\n * In-place three-way partition (Dutch national flag) around `pivot`.\n *\n * @private\n * @template T\n * @param {T[]} arr\n * @param {number} left\n * @param {number} right\n * @param {T} pivot - The pivot element to partition around.\n * @param {(a: T, b: T) => number} compareFn\n * @returns {[number, number]} `[lt, gt]` such that `arr[lt..gt]` all compare equal to `pivot`.\n */\nfunction partition(arr, left, right, pivot, compareFn) {\n    let lt = left;\n    let i = left;\n    let gt = right;\n\n    while (i <= gt) {\n        const cmp = compareFn(arr[i], pivot);\n        if (cmp < 0) {\n            swap(arr, i, lt);\n            ++lt;\n            ++i;\n        } else if (cmp > 0) {\n            swap(arr, i, gt);\n            --gt;\n        } else {\n            ++i;\n        }\n    }\n\n    return [lt, gt];\n}\n\n/**\n * Swaps two entries of an array in-place.\n *\n * @private\n * @template T\n * @param {T[]} arr\n * @param {number} a\n * @param {number} b\n */\nfunction swap(arr, a, b) {\n    const temp = arr[a];\n    arr[a] = arr[b];\n    arr[b] = temp;\n}\n","/**\n * Expands a single 32-bit seed into a well-mixed sequence, used to fill the generator state.\n *\n * A generator seeded with a small integer (1, 2, 42 …) must not start in a state correlated with\n * that integer, or nearby seeds would produce correlated streams. splitmix32 decorrelates them.\n *\n * @private\n * @param {number} seed\n * @returns {() => number} Successive 32-bit values.\n */\nfunction splitmix32(seed) {\n    let a = seed | 0;\n    return () => {\n        a = (a + 0x9e3779b9) | 0;\n        let t = a ^ (a >>> 16);\n        t = Math.imul(t, 0x21f0aaad);\n        t = t ^ (t >>> 15);\n        t = Math.imul(t, 0x735a2d97);\n        t = t ^ (t >>> 15);\n        return t >>> 0;\n    };\n}\n\n/**\n * Seeded pseudo-random number generator.\n *\n * Implements **sfc32** (Small Fast Counting, Doty-Humphrey), a 128-bit-state counter-based\n * generator that passes TestU01 BigCrush. It is preferred here over the more familiar Mersenne\n * Twister, which needs a 2.5 KB state, is markedly slower to seed, and whose GF(2)-linear output\n * fails BigCrush's matrix-rank and linear-complexity tests.\n *\n * Every operation is 32-bit integer arithmetic (`^ << >>> +` and `Math.imul`), all of which\n * ECMAScript specifies exactly. The stream is therefore identical on every engine for a given seed —\n * unlike floating point transcendentals, which are only \"implementation-approximated\". See\n * {@link DR} for what that does and does not guarantee about the output of an algorithm.\n *\n * @category Utils\n * @class\n * @see {@link https://pracrand.sourceforge.net/|PractRand, where sfc32 originates}\n * @example\n * const R = new Randomizer(1212);\n * R.random;      // float in [0, 1)\n * R.random_int;  // uint32\n */\nexport class Randomizer {\n    /** @type {number} */\n    _a = 0;\n    /** @type {number} */\n    _b = 0;\n    /** @type {number} */\n    _c = 0;\n    /** @type {number} */\n    _d = 0;\n    /** @type {number} */\n    _seed;\n    /** @type {number | null} */\n    _val = null;\n\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     */\n    constructor(_seed) {\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 mix = splitmix32(_seed);\n        this._a = mix();\n        this._b = mix();\n        this._c = mix();\n        this._d = mix();\n        this._val = null;\n        // sfc32 needs a short run-in before its output is well distributed.\n        for (let i = 0; i < 12; ++i) this.random_int;\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        const a = this._a | 0;\n        const b = this._b | 0;\n        const c = this._c | 0;\n        const d = this._d | 0;\n\n        const t = (((a + b) | 0) + d) | 0;\n        this._d = (d + 1) | 0;\n        this._a = b ^ (b >>> 9);\n        this._b = (c + (c << 3)) | 0;\n        this._c = ((((c << 21) | (c >>> 11)) + t) | 0) >>> 0;\n\n        return t >>> 0;\n    }\n\n    /**\n     * Returns a normally distributed number with mean 0 and standard deviation 1.\n     *\n     * Uses the Marsaglia polar method, which yields two values per iteration; the spare is cached\n     * and returned by the following call.\n     *\n     * @returns {number} A standard normal variate.\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     * Returns `n` samples drawn from `A` without replacement.\n     *\n     * Uses a partial Fisher-Yates shuffle over a scratch index array, which runs in O(n): `A` itself\n     * is never touched, and exactly `n` random values are consumed. Removing each picked index with\n     * `Array.prototype.splice` instead would shift the tail on every draw and make the call O(n²) —\n     * measurably worse from a few hundred elements upward, and 27× slower at n = 4000.\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        const rows = A.length;\n        // Guard explicitly: `new Array(n)` below turns a non-numeric `n` into a one-element array\n        // of `undefined` rather than failing, which would hand the caller silent garbage.\n        if (!Number.isInteger(n) || n < 0) {\n            throw new Error(\"n must be a non-negative integer!\");\n        }\n        if (n > rows) {\n            throw new Error(\"n bigger than A!\");\n        }\n        const index_list = new Array(rows);\n        for (let i = 0; i < rows; ++i) index_list[i] = i;\n\n        const sample = new Array(n);\n        for (let i = 0; i < n; ++i) {\n            const j = i + (this.random_int % (rows - i));\n            const swap = index_list[i];\n            index_list[i] = index_list[j];\n            index_list[j] = swap;\n            sample[i] = A[index_list[i]];\n        }\n        return sample;\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","/**\n * WASM wrappers for the `Matrix` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `Matrix.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * Computes C = A * B using WASM SIMD.\n * A is (rows_A x cols_A), B is (cols_A x cols_B), out_data is (rows_A x cols_B).\n *\n * @param {Float64Array} A_val\n * @param {number} rows_A\n * @param {number} cols_A\n * @param {Float64Array} B_val\n * @param {number} cols_B\n * @param {Float64Array} C_val\n * @returns {boolean} True if successfully executed via WASM.\n */\nexport function wasmMatMul(A_val, rows_A, cols_A, B_val, cols_B, C_val) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    const sizeA = A_val.byteLength;\n    const sizeB = B_val.byteLength;\n    const sizeC = C_val.byteLength;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrA = alloc(exports, ptrs, sizeA);\n        const ptrB = alloc(exports, ptrs, sizeB);\n        const ptrC = alloc(exports, ptrs, sizeC);\n\n        const memA = new Float64Array(memory.buffer, ptrA, A_val.length);\n        memA.set(A_val);\n\n        const memB = new Float64Array(memory.buffer, ptrB, B_val.length);\n        memB.set(B_val);\n\n        exports.matmul_f64(ptrA, ptrB, ptrC, rows_A, cols_A, cols_B);\n\n        C_val.set(new Float64Array(memory.buffer, ptrC, C_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Range-based Parallel Matrix Multiplication for worker thread execution.\n *\n * @param {Float64Array} A_val\n * @param {number} rows_A\n * @param {number} cols_A\n * @param {Float64Array} B_val\n * @param {number} cols_B\n * @param {Float64Array} C_val\n * @param {number} start_row\n * @param {number} end_row\n * @returns {boolean}\n */\nexport function wasmMatMulRange(A_val, rows_A, cols_A, B_val, cols_B, C_val, start_row, end_row) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrA = alloc(exports, ptrs, A_val.byteLength);\n        const ptrB = alloc(exports, ptrs, B_val.byteLength);\n        const ptrC = alloc(exports, ptrs, C_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrA, A_val.length).set(A_val);\n        new Float64Array(memory.buffer, ptrB, B_val.length).set(B_val);\n\n        exports.matmul_range_f64(ptrA, ptrB, ptrC, rows_A, cols_A, cols_B, start_row, end_row);\n\n        // Slice only, so concurrent workers sharing `C_val` do not clobber each other's rows.\n        const offset = start_row * cols_B;\n        const count = (end_row - start_row) * cols_B;\n        C_val.set(new Float64Array(memory.buffer, ptrC + offset * 8, count), offset);\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Computes C = A^T * B using WASM SIMD.\n * A is (cols_A x rows_A), B is (cols_A x cols_B), out_data is (rows_A x cols_B).\n *\n * @param {Float64Array} A_val\n * @param {number} cols_A\n * @param {number} rows_A\n * @param {Float64Array} B_val\n * @param {number} cols_B\n * @param {Float64Array} C_val\n * @returns {boolean} True if successfully executed via WASM.\n */\nexport function wasmTransDot(A_val, cols_A, rows_A, B_val, cols_B, C_val) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrA = alloc(exports, ptrs, A_val.byteLength);\n        const ptrB = alloc(exports, ptrs, B_val.byteLength);\n        const ptrC = alloc(exports, ptrs, C_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrA, A_val.length).set(A_val);\n        new Float64Array(memory.buffer, ptrB, B_val.length).set(B_val);\n\n        exports.transDot_f64(ptrA, ptrB, ptrC, cols_A, rows_A, cols_B);\n\n        C_val.set(new Float64Array(memory.buffer, ptrC, C_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Computes C = A * B^T using WASM SIMD.\n * A is (rows_A x cols_A), B is (cols_B x cols_A), out_data is (rows_A x cols_B).\n *\n * @param {Float64Array} A_val\n * @param {number} rows_A\n * @param {number} cols_A\n * @param {Float64Array} B_val\n * @param {number} cols_B\n * @param {Float64Array} C_val\n * @returns {boolean} True if successfully executed via WASM.\n */\nexport function wasmDotTrans(A_val, rows_A, cols_A, B_val, cols_B, C_val) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrA = alloc(exports, ptrs, A_val.byteLength);\n        const ptrB = alloc(exports, ptrs, B_val.byteLength);\n        const ptrC = alloc(exports, ptrs, C_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrA, A_val.length).set(A_val);\n        new Float64Array(memory.buffer, ptrB, B_val.length).set(B_val);\n\n        exports.dotTrans_f64(ptrA, ptrB, ptrC, rows_A, cols_A, cols_B);\n\n        C_val.set(new Float64Array(memory.buffer, ptrC, C_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Computes outer product C = A x B using WASM SIMD.\n *\n * @param {Float64Array} A_val\n * @param {Float64Array} B_val\n * @param {Float64Array} C_val\n * @param {number} len\n * @returns {boolean} True if successfully executed via WASM.\n */\nexport function wasmOuter(A_val, B_val, C_val, len) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrA = alloc(exports, ptrs, A_val.byteLength);\n        const ptrB = alloc(exports, ptrs, B_val.byteLength);\n        const ptrC = alloc(exports, ptrs, C_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrA, A_val.length).set(A_val);\n        new Float64Array(memory.buffer, ptrB, B_val.length).set(B_val);\n\n        exports.outer_f64(ptrA, ptrB, ptrC, len);\n\n        C_val.set(new Float64Array(memory.buffer, ptrC, C_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Computes Y = A * X using WASM SIMD.\n *\n * @param {Float64Array} A_val\n * @param {Float64Array} X_val\n * @param {Float64Array} Y_val\n * @param {number} rows\n * @param {number} cols\n * @returns {boolean}\n */\nexport function wasmMatVecMul(A_val, X_val, Y_val, rows, cols) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrA = alloc(exports, ptrs, A_val.byteLength);\n        const ptrX = alloc(exports, ptrs, X_val.byteLength);\n        const ptrY = alloc(exports, ptrs, Y_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrA, A_val.length).set(A_val);\n        new Float64Array(memory.buffer, ptrX, X_val.length).set(X_val);\n\n        exports.mat_vec_mul_f64(ptrA, ptrX, ptrY, rows, cols);\n\n        Y_val.set(new Float64Array(memory.buffer, ptrY, Y_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n","import { simultaneous_poweriteration } from \"../linear_algebra/index.js\";\nimport { neumair_sum } from \"../numerical/index.js\";\nimport { Randomizer } from \"../util/index.js\";\nimport { WASM_MIN_MATMUL_OPS } from \"../wasm/thresholds.js\";\nimport { wasmDotTrans, wasmMatMul, wasmMatVecMul, wasmOuter, wasmTransDot } from \"./Matrix.wasm.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            if (rows_A * cols_A * cols_B >= WASM_MIN_MATMUL_OPS) {\n                if (wasmMatMul(A_val, rows_A, cols_A, B_val, cols_B, C_val)) {\n                    return C;\n                }\n            }\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            const [rows, cols] = this.shape;\n            if (B.length !== cols) {\n                throw new Error(\n                    `A.dot(B): A is a ${rows} ⨯ ${cols}-Matrix and B has ${B.length} entries. A's cols and B's length must be equal!`,\n                );\n            }\n            const C = new Matrix(rows, 1, 0);\n            const x = B instanceof Float64Array ? B : Float64Array.from(B);\n\n            if (rows * cols >= WASM_MIN_MATMUL_OPS) {\n                if (wasmMatVecMul(this.values, x, C.values, rows, cols)) {\n                    return C;\n                }\n            }\n\n            const A_val = this.values;\n            const C_val = C.values;\n            // Allocated once rather than per row: `neumair_sum` needs the products materialized, and\n            // the previous `row(i).map(…)` built a fresh array on every iteration.\n            const products = new Float64Array(cols);\n            for (let i = 0; i < rows; ++i) {\n                const i_cols = i * cols;\n                for (let j = 0; j < cols; ++j) {\n                    products[j] = A_val[i_cols + j] * x[j];\n                }\n                C_val[i] = neumair_sum(products);\n            }\n            return 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            if (cols_A * rows_A * cols_B >= WASM_MIN_MATMUL_OPS) {\n                if (wasmTransDot(A_val, cols_A, rows_A, B_val, cols_B, C_val)) {\n                    return C;\n                }\n            }\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, cols] = this.shape;\n            if (B.length !== rows) {\n                throw new Error(\n                    `A.transDot(B): Aᵀ is a ${cols} ⨯ ${rows}-Matrix and B has ${B.length} entries. Aᵀ's cols and B's length must be equal!`,\n                );\n            }\n            const C = new Matrix(cols, 1, 0);\n            const A_val = this.values;\n            const C_val = C.values;\n            const products = new Float64Array(rows);\n            for (let i = 0; i < cols; ++i) {\n                for (let j = 0; j < rows; ++j) {\n                    products[j] = A_val[j * cols + i] * B[j];\n                }\n                C_val[i] = neumair_sum(products);\n            }\n            return 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\n            const C = new Matrix(rows_A, cols_B, 0);\n            if (rows_A * cols_A * cols_B >= WASM_MIN_MATMUL_OPS) {\n                if (wasmDotTrans(this.values, rows_A, cols_A, B.values, cols_B, C.values)) {\n                    return C;\n                }\n            }\n\n            for (let i = 0; i < rows_A; ++i) {\n                const A_i = this.row(i);\n                for (let j = 0; j < cols_B; ++j) {\n                    const B_j = B.row(j);\n                    let sum = 0;\n                    for (let k = 0; k < cols_A; ++k) {\n                        sum += A_i[k] * B_j[k];\n                    }\n                    C.set_entry(i, j, sum);\n                }\n            }\n            return C;\n        } else if (Matrix.isArray(B)) {\n            // TODO: create Matrix directly\n            // `B` is the row vector, so `Bᵀ` is a column and the contract matches `dot`.\n            const [rows, cols] = this.shape;\n            if (B.length !== cols) {\n                throw new Error(\n                    `A.dotTrans(B): A is a ${rows} ⨯ ${cols}-Matrix and Bᵀ has ${B.length} entries. A's cols and Bᵀ's length must be equal!`,\n                );\n            }\n            const C = new Matrix(rows, 1, 0);\n            const A_val = this.values;\n            const C_val = C.values;\n            const products = new Float64Array(cols);\n            for (let i = 0; i < rows; ++i) {\n                const i_cols = i * cols;\n                for (let j = 0; j < cols; ++j) {\n                    products[j] = A_val[i_cols + j] * B[j];\n                }\n                C_val[i] = neumair_sum(products);\n            }\n            return 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\n        const C = new Matrix(l, l);\n        if (l * l >= WASM_MIN_MATMUL_OPS) {\n            if (wasmOuter(this.values, B.values, C.values, l)) {\n                return C;\n            }\n        }\n\n        for (let i = 0; i < l; ++i) {\n            for (let j = 0; j < l; ++j) {\n                if (i <= j) {\n                    C.set_entry(i, j, this._data[i] * B._data[j]);\n                } else {\n                    C.set_entry(i, j, C.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     */\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(1212);\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 = Math.max(rows * 20, 100); // Robust convergence limit\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","/**\n * WASM wrapper for the `norm` kernel.\n *\n * The copy in, the call and the release are the same for every single-vector reduction, so the\n * wrapper is built by `vector_reduction` rather than written out. The shared runtime -- instance\n * setup, allocation and the persistent buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { vector_reduction } from \"../wasm/index.js\";\n\n/**\n * Computes L2 Norm using WASM SIMD.\n *\n * Returns null if WASM is unavailable, so the caller falls back to its JS implementation.\n */\nexport const wasmNorm = vector_reduction(\"norm_f64\");\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { wasmNorm } from \"./norm.wasm.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\n    if (metric === euclidean && vector.length >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const wasmRes = wasmNorm(vector);\n        if (wasmRes !== null) {\n            return wasmRes;\n        }\n    }\n\n    const n = vector.length;\n    const zeros = new Float64Array(n);\n    return metric(vector, zeros);\n}\n","/**\n * WASM wrappers for the `normalize` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `normalize.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * In-place Vector Normalization using WASM SIMD.\n *\n * @param {Float64Array} V_val\n * @returns {boolean} True if executed via WASM.\n */\nexport function wasmNormalize(V_val) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n    const len = V_val.length;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrV = alloc(exports, ptrs, V_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrV, len).set(V_val);\n        exports.normalize_f64(ptrV, len);\n        V_val.set(new Float64Array(memory.buffer, ptrV, len));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n","import { euclidean } from \"../metrics/index.js\";\nimport { WASM_MIN_SIMPLE_VECTOR_LENGTH } from \"../wasm/thresholds.js\";\nimport { norm } from \"./index.js\";\nimport { wasmNormalize } from \"./normalize.wasm.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    if (v instanceof Float64Array && metric === euclidean && v.length >= WASM_MIN_SIMPLE_VECTOR_LENGTH) {\n        const copy = new Float64Array(v);\n        if (wasmNormalize(copy)) {\n            return copy;\n        }\n    }\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, average, and ward.\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            // Ward reaches back to the distance between the two clusters being merged, which the\n            // loop below never overwrites — but read it first so the dependency is explicit.\n            const D_c1_c2 = D.entry(c1, 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                    case \"ward\": {\n                        // Lance-Williams recurrence for Ward's minimum-variance criterion. It is\n                        // stated over *squared* distances, so square on the way in and take the root\n                        // on the way out to keep `D` in the same units as the other linkages.\n                        const size_j = c_size[j];\n                        const total = size1 + size2 + size_j;\n                        value = Math.sqrt(\n                            Math.max(\n                                0,\n                                ((size1 + size_j) * D_c1_j * D_c1_j +\n                                    (size2 + size_j) * D_c2_j * D_c2_j -\n                                    size_j * D_c1_c2 * D_c1_c2) /\n                                    total,\n                            ),\n                        );\n                        break;\n                    }\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 * WASM wrappers for the `KMeans` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `KMeans.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * Assigns points to nearest centroids in k-Means.\n *\n * @param {Float64Array} X_val\n * @param {Float64Array} C_val\n * @param {Int32Array} assignments\n * @param {number} n\n * @param {number} k\n * @param {number} d\n * @returns {boolean} True if executed successfully via WASM.\n */\nexport function wasmKMeansAssign(X_val, C_val, assignments, n, k, d) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrX = alloc(exports, ptrs, X_val.byteLength);\n        const ptrC = alloc(exports, ptrs, C_val.byteLength);\n        const ptrA = alloc(exports, ptrs, assignments.byteLength);\n\n        const memX = new Float64Array(memory.buffer, ptrX, X_val.length);\n        const memC = new Float64Array(memory.buffer, ptrC, C_val.length);\n        memX.set(X_val);\n        memC.set(C_val);\n\n        exports.kmeans_assign_f64(ptrX, ptrC, ptrA, n, k, d);\n\n        const memA = new Int32Array(memory.buffer, ptrA, assignments.length);\n        assignments.set(memA);\n        return true;\n    } finally {\n        free_all(exports, ptrs);\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 { WASM_MIN_ROWS } from \"../wasm/thresholds.js\";\nimport { Clustering } from \"./Clustering.js\";\nimport { wasmKMeansAssign } from \"./KMeans.wasm.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        if (metric === euclidean && N >= WASM_MIN_ROWS) {\n            const D = this._D;\n            const C_flat = new Float64Array(K * D);\n            for (let j = 0; j < K; ++j) {\n                C_flat.set(cluster_centroids[j], j * D);\n            }\n            const assignments = new Int32Array(N);\n            if (wasmKMeansAssign(A.values, C_flat, assignments, N, K, D)) {\n                for (let i = 0; i < N; ++i) {\n                    if (clusters[i] !== assignments[i]) {\n                        clusters_changed = true;\n                        clusters[i] = assignments[i];\n                    }\n                }\n                const new_centroids = this._compute_centroid(K);\n                return {\n                    clusters_changed: clusters_changed,\n                    cluster_centroids: new_centroids,\n                };\n            }\n        }\n\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","/**\n * WASM wrappers for the `KMedoids` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `KMedoids.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * Assigns points to nearest medoids in k-Medoids.\n *\n * Deliberately *not* on a persistent buffer session, despite copying an N ⨯ N distance matrix to do\n * only O(n·k) work. `init()` runs the PAM loop through `_iteration()` and calls this once at the\n * end, so there is no repeat copy to save — only the async `generator()` calls it per iteration. A\n * session here would retain an N ⨯ N buffer for the life of the process and buy nothing.\n *\n * @param {Float64Array} D_val\n * @param {Int32Array} medoids\n * @param {Int32Array} assignments\n * @param {number} n\n * @param {number} k\n * @returns {boolean}\n */\nexport function wasmKMedoidsAssign(D_val, medoids, assignments, n, k) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrD = alloc(exports, ptrs, D_val.byteLength);\n        const ptrM = alloc(exports, ptrs, medoids.byteLength);\n        const ptrA = alloc(exports, ptrs, assignments.byteLength);\n\n        new Float64Array(memory.buffer, ptrD, D_val.length).set(D_val);\n        new Int32Array(memory.buffer, ptrM, medoids.length).set(medoids);\n\n        exports.kmedoids_assign_f64(ptrD, ptrM, ptrA, n, k);\n\n        assignments.set(new Int32Array(memory.buffer, ptrA, assignments.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\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\";\nimport { wasmKMedoidsAssign } from \"./KMedoids.wasm.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    /**\n     * FastPAM1: One best swap per iteration\n     * @private\n     * @returns {boolean}\n     */\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     * @private\n     * Get distance between two points\n     * @param {number} i\n     * @param {number} j\n     * @param {Float64Array?} x_i\n     * @param {Float64Array?} x_j\n     * @returns {number}\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     * @private\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    /**\n     * @private\n     */\n    _update_clusters() {\n        const N = this._N;\n        const A = this._A;\n        const K = this._parameters.K;\n        const medoids = this._cluster_medoids;\n\n        if (this._distance_matrix && medoids && medoids.length > 0) {\n            const medoidsArr = new Int32Array(medoids);\n            const assignArr = new Int32Array(N);\n            if (wasmKMedoidsAssign(this._distance_matrix.values, medoidsArr, assignArr, N, K)) {\n                for (let j = 0; j < N; j++) {\n                    this._clusters[j] = assignArr[j];\n                }\n                return;\n            }\n        }\n\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     * @private\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 { WASM_BASE64 } from \"./wasm_bytes.js\";\n\n/**\n * Worker pool that splits a row-range kernel across CPU cores.\n *\n * Only Node is supported. Blocking a caller until the workers finish needs `Atomics.wait`, which\n * throws on a browser main thread, and the shared output needs `SharedArrayBuffer`, which browsers\n * gate behind COOP/COEP headers. {@link parallel_available} reports false there and every caller\n * falls back to its single-threaded path.\n *\n * Two things about the protocol decide whether splitting a kernel is worth it, and both have caught\n * out attempts to add callers:\n *\n * 1. **Every input is copied into every worker**, so a kernel whose inputs are large relative to its\n *    arithmetic loses outright. Parallel `(n x n) * (n x 2)` measures ~0.1x for this reason.\n * 2. **Each worker allocates the whole output**, not just its rows, and the caller then copies the\n *    shared buffer into its own. A kernel with an `n * n` output pays that twice over -- the\n *    parallel distance matrix came out slower than the triangular kernel at every size tried, and\n *    was removed.\n *\n * So the kernels that pay are the ones with small inputs and outputs relative to their work, run\n * repeatedly enough to amortise the ~50ms start-up: `meanshift_step_range_f64` and\n * `dijkstra_apsp_range_f64` are the two that qualify today. Fixing either point above -- sharing one\n * input mapping, or having workers own only their rows -- would widen that set considerably.\n *\n * @module wasm/worker_pool\n */\n\n/**\n * Runs inside each worker. Kept as a string with no imports so that bundling the library does not\n * have to emit a separate worker chunk — the source travels inside the bundle and is spawned with\n * `eval: true`.\n *\n * @type {string}\n */\nconst WORKER_SOURCE = `\nimport { parentPort, workerData } from \"node:worker_threads\";\n\nconst { wasm_base64, control } = workerData;\nconst flags = new Int32Array(control);\n\nconst binary = Uint8Array.from(atob(wasm_base64), (c) => c.charCodeAt(0));\nconst instance = new WebAssembly.Instance(new WebAssembly.Module(binary), {\n    env: { abort: () => { throw new Error(\"wasm abort\"); } },\n});\nconst exports = instance.exports;\n\nparentPort.on(\"message\", (task) => {\n    const ptrs = [];\n    try {\n        const memory = exports.memory;\n        const args = [];\n        for (const input of task.inputs) {\n            const ptr = exports.allocate(input.data.byteLength);\n            ptrs.push(ptr);\n            if (input.kind === \"i32\") {\n                new Int32Array(memory.buffer, ptr, input.data.length).set(input.data);\n            } else {\n                new Float64Array(memory.buffer, ptr, input.data.length).set(input.data);\n            }\n            args.push(ptr);\n        }\n\n        const out_ptr = exports.allocate(task.out_bytes);\n        ptrs.push(out_ptr);\n        args.push(out_ptr);\n\n        const returned = exports[task.kernel](...args, ...task.scalars, task.start, task.end);\n\n        // Only this worker's rows: the shared output is written by every worker at once.\n        const offset = task.start * task.row_length;\n        const count = (task.end - task.start) * task.row_length;\n        new Float64Array(task.out).set(new Float64Array(memory.buffer, out_ptr + offset * 8, count), offset);\n\n        // Kernels that reduce (a max shift, a loss) hand their partial result back per slot.\n        if (task.returns) new Float64Array(task.returns)[task.slot] = typeof returned === \"number\" ? returned : 0;\n    } catch (error) {\n        Atomics.store(flags, 1, 1);\n        parentPort.postMessage(String(error));\n    } finally {\n        for (const ptr of ptrs) exports.free(ptr);\n        Atomics.add(flags, 0, 1);\n        Atomics.notify(flags, 0);\n    }\n});\n\nAtomics.add(flags, 2, 1);\nAtomics.notify(flags, 2);\n`;\n\n/** @type {any[] | null} */\nlet workers = null;\n/** @type {Int32Array | null} */\nlet control = null;\n/** @type {boolean} */\nlet unavailable = false;\n\n/**\n * Number of workers the pool will start.\n *\n * @returns {number}\n */\nfunction worker_count() {\n    try {\n        const os = /** @type {any} */ (globalThis).process?.getBuiltinModule?.(\"node:os\");\n        // One worker per core minus the caller's own thread, which blocks rather than computing.\n        return Math.max(1, Math.min(8, (os?.availableParallelism?.() ?? 4) - 1));\n    } catch {\n        return 4;\n    }\n}\n\n/**\n * Whether row-range kernels can be split across workers in this environment.\n *\n * @returns {boolean} True only on Node, where `Atomics.wait` may block the calling thread.\n * @example\n * import { parallel_available } from \"@saehrimnir/druidjs\";\n * parallel_available(); // false in a browser\n */\nexport function parallel_available() {\n    if (unavailable) return false;\n    try {\n        const p = /** @type {any} */ (globalThis).process;\n        if (!p?.versions?.node || typeof SharedArrayBuffer === \"undefined\") return false;\n        // Opt-out, so the single-threaded path can be exercised without changing any code.\n        const off = p.env?.DRUID_DISABLE_PARALLEL;\n        if (off !== undefined && off !== \"\" && off !== \"0\" && off !== \"false\") return false;\n        // `Atomics.wait` throws on a browser main thread; the pool has no way to block there.\n        return p.getBuiltinModule(\"node:worker_threads\").isMainThread === true;\n    } catch {\n        return false;\n    }\n}\n\n/**\n * Starts the workers, or returns the running ones. Blocks until every worker has instantiated its\n * own copy of the module, so the first task does not pay for start-up.\n *\n * @private\n * @returns {any[] | null} The workers, or null if the pool could not start.\n */\nfunction ensure_pool() {\n    if (workers) return workers;\n    if (!parallel_available()) return null;\n\n    try {\n        const { Worker } = /** @type {any} */ (globalThis).process.getBuiltinModule(\"node:worker_threads\");\n        const n = worker_count();\n        control = new Int32Array(new SharedArrayBuffer(12));\n\n        const started = [];\n        for (let i = 0; i < n; ++i) {\n            started.push(\n                new Worker(WORKER_SOURCE, {\n                    eval: true,\n                    workerData: { wasm_base64: WASM_BASE64, control: control.buffer },\n                }),\n            );\n        }\n\n        // Wait for every worker to report ready, so start-up is not billed to the first task.\n        const deadline = Date.now() + 10000;\n        while (Atomics.load(control, 2) < n) {\n            if (Date.now() > deadline) {\n                for (const w of started) w.terminate();\n                unavailable = true;\n                return null;\n            }\n            Atomics.wait(control, 2, Atomics.load(control, 2), 50);\n        }\n\n        for (const w of started) w.unref();\n        workers = started;\n        return workers;\n    } catch {\n        unavailable = true;\n        return null;\n    }\n}\n\n/**\n * Splits a row-range kernel across the pool and blocks until every worker is done.\n *\n * The kernel is called as `(...input_ptrs, out_ptr, ...scalars, start, end)`, and each worker copies\n * back only the rows it produced. `out` must be backed by a `SharedArrayBuffer` so the workers write\n * into the caller's memory.\n *\n * @param {string} kernel - Name of the exported range kernel.\n * @param {{ data: Float64Array | Int32Array; kind: \"f64\" | \"i32\" }[]} inputs - Copied into each worker.\n * @param {Float64Array} out - Shared output, `total_rows * row_length` long.\n * @param {number[]} scalars - Kernel arguments between the output pointer and the row range.\n * @param {number} total_rows - Rows to divide between workers.\n * @param {number} row_length - Output entries per row.\n * @param {Float64Array} [returns] - Shared, one slot per worker, for kernels that return a value.\n * @returns {boolean} True if the pool ran the kernel; false if the caller must fall back to JS.\n */\nexport function run_row_range(kernel, inputs, out, scalars, total_rows, row_length, returns) {\n    const pool = ensure_pool();\n    if (!pool || !control) return false;\n    if (!(out.buffer instanceof SharedArrayBuffer)) return false;\n\n    const n = Math.min(pool.length, total_rows);\n    if (n < 1) return false;\n\n    Atomics.store(control, 0, 0);\n    Atomics.store(control, 1, 0);\n\n    const chunk = Math.ceil(total_rows / n);\n    let dispatched = 0;\n    for (let i = 0; i < n; ++i) {\n        const start = i * chunk;\n        const end = Math.min((i + 1) * chunk, total_rows);\n        if (start >= end) break;\n        pool[i].postMessage({\n            kernel,\n            inputs,\n            out: out.buffer,\n            out_bytes: out.byteLength,\n            scalars,\n            start,\n            end,\n            row_length,\n            returns: returns?.buffer,\n            slot: i,\n        });\n        ++dispatched;\n    }\n\n    const deadline = Date.now() + 120000;\n    while (Atomics.load(control, 0) < dispatched) {\n        if (Date.now() > deadline) return false;\n        Atomics.wait(control, 0, Atomics.load(control, 0), 100);\n    }\n\n    return Atomics.load(control, 1) === 0;\n}\n\n/**\n * Stops the workers. They are unreferenced, so this is only needed to release them early.\n *\n * @returns {void}\n */\nexport function terminate_pool() {\n    if (workers) {\n        for (const w of workers) w.terminate();\n        workers = null;\n        control = null;\n    }\n}\n","/**\n * WASM wrappers for the `MeanShift` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `MeanShift.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * Computes a single MeanShift iteration step in WASM SIMD.\n *\n * @param {Float64Array} points_val\n * @param {Float64Array} out_points_val\n * @param {number} n\n * @param {number} d\n * @param {number} bandwidth\n * @param {boolean} use_gaussian\n * @returns {number | null} Max shift magnitude, or null if WASM is unavailable.\n */\nexport function wasmMeanShiftStep(points_val, out_points_val, n, d, bandwidth, use_gaussian) {\n    const inst = initWasm();\n    if (!inst) return null;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrIn = alloc(exports, ptrs, points_val.byteLength);\n        const ptrOut = alloc(exports, ptrs, out_points_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrIn, points_val.length).set(points_val);\n\n        const max_shift = exports.meanshift_step_f64(ptrIn, ptrOut, n, d, bandwidth, use_gaussian);\n\n        out_points_val.set(new Float64Array(memory.buffer, ptrOut, out_points_val.length));\n        return max_shift;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Range-based MeanShift iteration step for multi-threaded worker execution.\n *\n * @param {Float64Array} points_val\n * @param {Float64Array} out_points_val\n * @param {number} n\n * @param {number} d\n * @param {number} bandwidth\n * @param {boolean} use_gaussian\n * @param {number} start_i\n * @param {number} end_i\n * @returns {number | null}\n */\nexport function wasmMeanShiftStepRange(points_val, out_points_val, n, d, bandwidth, use_gaussian, start_i, end_i) {\n    const inst = initWasm();\n    if (!inst) return null;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrIn = alloc(exports, ptrs, points_val.byteLength);\n        const ptrOut = alloc(exports, ptrs, out_points_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrIn, points_val.length).set(points_val);\n\n        const max_shift = exports.meanshift_step_range_f64(\n            ptrIn,\n            ptrOut,\n            n,\n            d,\n            bandwidth,\n            use_gaussian,\n            start_i,\n            end_i,\n        );\n\n        // Slice only, so concurrent workers sharing `out_points_val` do not clobber each other.\n        const offset = start_i * d;\n        const count = (end_i - start_i) * d;\n        out_points_val.set(new Float64Array(memory.buffer, ptrOut + offset * 8, count), offset);\n        return max_shift;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { WASM_MIN_PARALLEL_ROWS } from \"../wasm/thresholds.js\";\nimport { parallel_available, run_row_range } from \"../wasm/worker_pool.js\";\nimport { Clustering } from \"./Clustering.js\";\nimport { wasmMeanShiftStep } from \"./MeanShift.wasm.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    /**\n     * @private\n     * @type {number}\n     */\n    _bandwidth;\n    /**\n     * @private\n     * @type {number}\n     */\n    _max_iter;\n    /**\n     * @private\n     * @type {number}\n     */\n    _tolerance;\n    /**\n     * @private\n     * @type {(dist: number) => number}\n     */\n    _kernel;\n    /**\n     * @type {Matrix}\n     */\n    _points;\n    /**\n     * @private\n     * @type {number[] | undefined}\n     */\n    _clusters;\n    /**\n     * @private\n     * @type {number[][] | undefined}\n     */\n    _cluster_list;\n\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    /**\n     * Helper to compute bandwidth if not provided\n     * @private\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    /**\n     * Compute kernel weight\n     * @private\n     * @param {number} dist\n     * @returns {number}\n     */\n    _kernel_weight(dist) {\n        return this._kernel(dist);\n    }\n\n    /**\n     * Runs one mean shift step across the worker pool, updating `_points` in place.\n     *\n     * @private\n     * @param {number} N\n     * @param {number} D\n     * @param {boolean} use_gaussian\n     * @returns {number | null} The largest shift of the step, or null if the pool did not run it.\n     */\n    _mean_shift_parallel(N, D, use_gaussian) {\n        if (N < WASM_MIN_PARALLEL_ROWS || !parallel_available()) return null;\n        try {\n            const points = this._points;\n            const shared = new Float64Array(new SharedArrayBuffer(N * D * 8));\n            const shifts = new Float64Array(new SharedArrayBuffer(64));\n            const inputs = /** @type {{ data: Float64Array | Int32Array; kind: \"f64\" | \"i32\" }[]} */ ([\n                { data: points.values, kind: \"f64\" },\n            ]);\n            const ran = run_row_range(\n                \"meanshift_step_range_f64\",\n                inputs,\n                shared,\n                [N, D, this._bandwidth, use_gaussian ? 1 : 0],\n                N,\n                D,\n                shifts,\n            );\n            if (!ran) return null;\n            points.values.set(shared);\n            // Each worker reports the largest shift over its own rows.\n            let max_shift = 0;\n            for (let i = 0; i < shifts.length; ++i) {\n                if (shifts[i] > max_shift) max_shift = shifts[i];\n            }\n            return max_shift;\n        } catch {\n            return null;\n        }\n    }\n\n    /**\n     * Perform mean shift iterations\n     * @private\n     */\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 tolerance = this._tolerance;\n        const use_gaussian = this._parameters.kernel !== \"flat\";\n        const is_euclidean = metric === euclidean;\n\n        for (let iter = 0; iter < this._max_iter; ++iter) {\n            if (is_euclidean) {\n                const parallel_shift = this._mean_shift_parallel(N, D, use_gaussian);\n                if (parallel_shift !== null) {\n                    if (parallel_shift < tolerance) break;\n                    continue;\n                }\n                const nextPoints = new Float64Array(N * D);\n                const max_shift = wasmMeanShiftStep(points.values, nextPoints, N, D, this._bandwidth, use_gaussian);\n                if (max_shift !== null) {\n                    points.values.set(nextPoints);\n                    if (max_shift < tolerance) break;\n                    continue;\n                }\n            }\n\n            let max_shift = 0;\n            const kernel = this._kernel_weight.bind(this);\n            // The sweep is synchronous: every point shifts from the positions held at the start of\n            // the iteration. `Matrix.row` hands out a live subarray, so accumulating into `points`\n            // would let point `i` see the already-shifted `0..i-1` and make the result depend on\n            // the order the rows happen to be in — and diverge from `meanshift_step_range_f64`,\n            // which reads all of its neighbours from the untouched input buffer.\n            const next_points = new Float64Array(N * D);\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                    const shift_norm = Math.sqrt(weighted_sum.reduce((acc, v) => acc + v * v, 0));\n                    max_shift = Math.max(max_shift, shift_norm);\n                    next_points.set(row_i, i * D);\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                    for (let d = 0; d < D; ++d) {\n                        next_points[i * D + d] = row_i[d] + shift[d];\n                    }\n                }\n            }\n            points.values.set(next_points);\n            if (max_shift < tolerance) {\n                break;\n            }\n        }\n    }\n\n    /**\n     * After convergence, assign clusters based on nearest mode\n     * @private\n     */\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 { quickselect, Randomizer } from \"../util/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, seed: 1212 }, parameters)\n            ),\n        );\n        /**\n         * Feeds the quickselect used to find core distances, so that seed alone determines the run.\n         *\n         * @private\n         * @type {Randomizer}\n         */\n        this._randomizer = new Randomizer(this._parameters.seed);\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        // Use O(K) QuickSelect to find the MinPts-th closest neighbor\n        const targetIndex = min_points - 2;\n        const neighborCopies = p.neighbors.slice();\n        const kthNeighbor = quickselect(\n            neighborCopies,\n            this._randomizer,\n            targetIndex,\n            (a, b) => metric(p.element, a.element) - metric(p.element, b.element),\n        );\n        return metric(p.element, kthNeighbor.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\";\nimport { release_sessions } from \"../wasm/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 * Randomness always comes from a seeded {@link Randomizer}, never from `Math.random`, so the same\n * `seed` reproduces a result exactly within one engine and library build. Across engines it does\n * not: ECMAScript leaves `Math.pow`, `Math.exp` and `Math.log` *implementation-approximated*, so\n * two engines — or a WASM kernel and its JS fallback (see {@link setWasmEnabled}) — may differ in\n * the last bit. That is invisible for most methods, but {@link UMAP} and {@link SAMMON} are chaotic\n * enough to turn it into a visibly different, equally valid layout.\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    /**\n     * WASM buffer sessions this method keeps alive between iterations, released when a run ends.\n     *\n     * Empty for methods with no accelerated iteration step, which is most of them. The accelerated\n     * optimisers override it — see {@link TSNE}.\n     *\n     * @protected\n     * @returns {string[]}\n     */\n    get _wasm_session_keys() {\n        return [];\n    }\n\n    /**\n     * Releases the WASM buffers this run is holding.\n     *\n     * Called from a `finally` around every iteration loop, so the memory does not outlive the\n     * projection. Freeing early is never a correctness problem — the next call reallocates — so\n     * this is safe to call at any point, including when WASM never ran.\n     *\n     * @protected\n     * @returns {void}\n     */\n    _release_wasm() {\n        const keys = this._wasm_session_keys;\n        if (keys.length > 0) release_sessions(keys);\n    }\n\n    /**\n     * Hands back the WASM buffers this instance is holding.\n     *\n     * Only needed after driving `generator()` by hand and stopping early — a plain `transform()`,\n     * or a `for…of` over `generator()` (including one you `break`), already releases when it ends.\n     * It frees only this method's buffers, never another running instance's, and the next run simply\n     * reallocates, so it is safe to call at any time, more than once, and while other instances are\n     * mid-run.\n     *\n     * @returns {this}\n     * @example\n     * const tsne = new TSNE(X, { d: 2 });\n     * const steps = tsne.generator(500);\n     * steps.next();\n     * tsne.release(); // stop early and give the buffers back\n     */\n    release() {\n        this._release_wasm();\n        return this;\n    }\n\n    /**\n     * Alias of {@link release} for the `using` declaration, so a hand-driven run frees its buffers\n     * when the block exits. Note that {@link transform} and a completed or `break`-ed `generator()`\n     * already release on their own — this only matters for a generator abandoned part way.\n     *\n     * ```js\n     * using tsne = new TSNE(X, { d: 2 });\n     * const steps = tsne.generator(500);\n     * steps.next(); // buffers released when the enclosing block exits\n     * ```\n     *\n     * @returns {void}\n     */\n    [Symbol.dispose]() {\n        this.release();\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","import { Randomizer } from \"../util/index.js\";\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     * Seeded source of randomness shared by every index. Construction is randomized — the trees\n     * pick quickselect pivots from it — so the `seed` parameter is what makes a built index, and\n     * therefore its query results, reproducible.\n     *\n     * @type {Randomizer}\n     */\n    _randomizer;\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        this._randomizer = new Randomizer(/** @type {{ seed?: number } | undefined} */ (parameters)?.seed ?? 1212);\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     * Searches the `k` nearest neighbors of the element stored at index `i`.\n     *\n     * The queried element is never part of the result. It is trivially its own closest neighbor at\n     * distance 0, which is never what a caller asking \"what is this point near?\" wants, so every\n     * caller used to strip it back out — each in its own, subtly different way. Note the asymmetry\n     * with `search`: an arbitrary query point has no \"self\" to exclude, so there `k` means\n     * \"k results\", while here it means \"k neighbors\".\n     *\n     * The self match is removed **by index** — not by position, and not by looking for a zero\n     * distance. Position is wrong because an approximate index may order ties differently or miss\n     * the element altogether (one extra candidate is requested to cover that), and a zero distance\n     * is wrong because genuine duplicate points share it and must survive.\n     *\n     * @param {number} i - Index of the query element.\n     * @param {number} [k=5] - Number of neighbors to return. Default is `5`\n     * @returns {{ element: T; index: number; distance: number }[]} The `k` nearest *other* elements,\n     *   closest first. Empty when `i` is out of range.\n     */\n    search_by_index(i, k = 5) {\n        const elements = this._elements;\n        if (i < 0 || i >= elements.length) return [];\n        const element = elements[i];\n        if (!element) return [];\n        return this.search(element, k + 1)\n            .filter((neighbor) => neighbor.index !== i)\n            .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 { 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 {Partial<ParametersAnnoy>} [parameters={}] - Anything left out falls back to the\n     *   documented default.\n     */\n    constructor(elements, parameters = {}) {\n        // `KNN` rejects an empty element list, so an index built empty and filled later via\n        // `add()` hands it a dummy element to get past that check. The dummy must not survive\n        // into `this._elements` — it would sit at index 0, shift every real element's index by\n        // one, and be returned by `search` as a phantom point at the origin.\n        const hasElements = elements && elements.length > 0;\n        const firstElement = /** @type {T} */ (hasElements ? elements[0] : new Float64Array([0]));\n\n        // `KNN` keeps the parameter object as handed to it, so defaults are merged here rather\n        // than left to a default argument, which would only apply when `parameters` is omitted\n        // entirely and drop every unspecified default for `new Annoy(elements, { numTrees: 20 })`.\n        super(\n            [firstElement],\n            Object.assign({ metric: euclidean, numTrees: 10, maxPointsPerLeaf: 10, seed: 1212 }, parameters),\n        );\n\n        // Drop the element `super` was given, dummy or real: `add` below is what populates the\n        // index, and it appends.\n        /** @type {T[]} */\n        this._elements = [];\n\n        this._metric = this._parameters.metric;\n        this._numTrees = this._parameters.numTrees;\n        this._maxPointsPerLeaf = this._parameters.maxPointsPerLeaf;\n        this._seed = this._parameters.seed;\n        this._randomizer = new Randomizer(this._seed);\n\n        /**\n         * @private\n         * @type {AnnoyNode<T>[]}\n         */\n        this._trees = [];\n\n        if (hasElements) {\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     * 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 { max, quickselectByAxis } from \"../util/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 * Every ball stores a center and the distance from it to its furthest member, which bounds the\n * subtree from below by `d(t, center) - radius`. That bound holds for any metric by the triangle\n * inequality, so the center does not need to be one of the indexed points — it is the centroid,\n * which keeps radii tighter than an arbitrary member would.\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 {Partial<ParametersBallTree>} [parameters={}] - Anything left out falls back to the\n     *   documented default.\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 = {}) {\n        super(elements, Object.assign({ metric: euclidean, leaf_size: 32, 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 {Float64Array} Componentwise mean of `elements`.\n     */\n    _centroid(elements) {\n        const d = elements[0].element.length;\n        const n = elements.length;\n        const center = new Float64Array(d);\n        for (let i = 0; i < n; ++i) {\n            const element = elements[i].element;\n            for (let j = 0; j < d; ++j) center[j] += element[j];\n        }\n        for (let j = 0; j < d; ++j) center[j] /= n;\n        return center;\n    }\n\n    /**\n     * @private\n     * @param {ElementWithIndex<T>[]} elements\n     * @returns {BallTreeNode<T> | BallTreeLeaf<T>} Root of balltree.\n     */\n    _construct(elements) {\n        const center = this._centroid(elements);\n        // `max` from utils rather than `Math.max(...array)`: spreading the array blew the argument\n        // limit and threw `Maximum call stack size exceeded` from roughly 125k elements upward.\n        const radius = max(elements.map((d) => this._metric(center, d.element)));\n\n        if (elements.length <= this._parameters.leaf_size) {\n            return new BallTreeLeaf(center, radius, elements);\n        }\n\n        const c = this._greatest_spread(elements);\n        const p_index = elements.length >> 1;\n        quickselectByAxis(elements, this._randomizer, p_index, c);\n        // Split at `p_index`, so each element lands on exactly one side. Keeping a separate pivot\n        // element and leaving it in the right half stored every interior point twice, which made a\n        // full traversal cost 2N distance evaluations.\n        const L = elements.slice(0, p_index);\n        const R = elements.slice(p_index);\n        return new BallTreeNode(center, radius, this._construct(L), this._construct(R));\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 {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        // The accessor reads the distance the traversal already computed. Recomputing the metric\n        // here made every heap insertion cost a second distance evaluation of the same pair.\n        /** @type {Heap<{ point: ElementWithIndex<T>; distance: number }>} */\n        const heap = new Heap(null, (d) => d.distance, \"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: { point: ElementWithIndex<T> }; value: number }} */ (heap.pop());\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(); // 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<{ point: ElementWithIndex<T>; distance: number }>} Q - Heap consists of the currently found `k`\n     *   nearest neighbors.\n     * @param {BallTreeNode<T> | BallTreeLeaf<T> | null} B\n     * @param {number} [known_distance] - Distance from `t` to this ball's center, when the caller\n     *   already measured it while ordering its children.\n     */\n    _search(t, k, Q, B, known_distance) {\n        if (!B) return;\n\n        // Applies to leaves too, which previously scanned every member unconditionally.\n        const distance = known_distance ?? this._metric(t, B.center);\n        if (Q.length >= k && distance - B.radius >= (Q.first?.value ?? -Infinity)) {\n            return;\n        }\n\n        if (B instanceof BallTreeLeaf) {\n            const points = B.points;\n            for (let i = 0, n = points.length; i < n; ++i) {\n                const p = points[i];\n                const dist = this._metric(p.element, t);\n                if (Q.length < k) {\n                    Q.push({ point: p, distance: dist });\n                } else if (dist < (Q.first?.value ?? Infinity)) {\n                    Q.pop();\n                    Q.push({ point: p, distance: dist });\n                }\n            }\n            return;\n        }\n\n        const c1 = B.child1;\n        const c2 = B.child2;\n\n        // Measured once here and handed to the recursive call, which would otherwise repeat it.\n        const d1 = c1 ? this._metric(t, c1.center) : Infinity;\n        const d2 = c2 ? this._metric(t, c2.center) : Infinity;\n\n        if (d1 < d2) {\n            this._search(t, k, Q, c1, d1);\n            this._search(t, k, Q, c2, d2);\n        } else {\n            this._search(t, k, Q, c2, d2);\n            this._search(t, k, Q, c1, d1);\n        }\n    }\n}\n\n/**\n * @private\n * @template {number[] | Float64Array} T\n */\nclass BallTreeNode {\n    /**\n     * @param {Float64Array} center\n     * @param {number} radius\n     * @param {BallTreeNode<T> | BallTreeLeaf<T> | null} child1\n     * @param {BallTreeNode<T> | BallTreeLeaf<T> | null} child2\n     */\n    constructor(center, radius, child1 = null, child2 = null) {\n        this.center = center;\n        this.radius = radius;\n        this.child1 = child1;\n        this.child2 = child2;\n    }\n}\n\n/**\n * @private\n * @template {number[] | Float64Array} T\n */\nclass BallTreeLeaf {\n    /**\n     * @param {Float64Array} center\n     * @param {number} radius\n     * @param {ElementWithIndex<T>[]} points\n     */\n    constructor(center, radius, points) {\n        this.center = center;\n        this.radius = radius;\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 * This is an *approximate* index. Recall above 95% is expected for any `m`; raise `ef` or\n * `ef_construction` if a dataset needs more. Queries overtake the exact {@link KDTree} at around\n * 10 000 points, so below a few thousand prefer {@link spatial_tree}, which is exact and quicker.\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 {Partial<ParametersHNSW>} [parameters={}] - Anything left out falls back to the\n     *   documented default.\n     */\n    constructor(points, parameters = {}) {\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        // `KNN` keeps the parameter object as handed to it, so defaults are merged here rather\n        // than left to a default argument, which would only apply when `parameters` is omitted\n        // entirely and drop every unspecified default for `new HNSW(points, { m: 8 })`.\n        const merged = Object.assign(\n            {\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            parameters,\n        );\n\n        super([firstElement], merged);\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        /** @private @type {number} */\n        this._search_id = 1;\n\n        /** @private @type {Uint32Array} */\n        this._visited_stamps = new Uint32Array(1024);\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            // Phase 1: greedy descent through the layers the element does not join, narrowing the\n            // entry point one layer at a time.\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            // Phase 2: join every layer from min(L, 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                if (!layer.edges.has(global_index)) {\n                    layer.edges.set(global_index, []);\n                }\n\n                // Candidates are always members of this layer. Deliberately no fallback to a scan\n                // over the whole dataset: that would link the element to points not on this layer.\n                const W = this._search_layer(element, ep_indices, ef_construction, l_c).filter(\n                    (c) => c.index !== global_index,\n                );\n                if (W.length === 0) continue;\n\n                // The element gets `m` links of its own on every layer, layer 0 included. `m0` is\n                // not a second budget for it, but the cap enforced once reverse links accumulate.\n                const neighbor_indices = this._select(element, W, m, l_c);\n                layer.edges.set(global_index, neighbor_indices.slice());\n\n                const max_conn = l_c === 0 ? m0 : m;\n                for (const neighbor_idx of neighbor_indices) {\n                    if (neighbor_idx === global_index) continue;\n\n                    // Add the reverse connection from neighbor to element.\n                    let neighbor_edges = layer.edges.get(neighbor_idx);\n                    if (!neighbor_edges) {\n                        neighbor_edges = [];\n                        layer.edges.set(neighbor_idx, neighbor_edges);\n                    }\n                    if (!neighbor_edges.includes(global_index)) {\n                        neighbor_edges.push(global_index);\n                    }\n\n                    // Prune with the same selector used to build the graph; plain nearest-M would\n                    // drop the long-range links that keep the layer navigable.\n                    if (neighbor_edges.length > max_conn) {\n                        const neighbor_element = elements[neighbor_idx];\n                        const neighbor_candidates = neighbor_edges\n                            .filter((idx) => idx !== neighbor_idx)\n                            .map((idx) => ({\n                                element: elements[idx],\n                                index: idx,\n                                distance: this._metric(neighbor_element, elements[idx]),\n                            }));\n                        layer.edges.set(\n                            neighbor_idx,\n                            this._select(neighbor_element, neighbor_candidates, max_conn, l_c),\n                        );\n                    }\n                }\n\n                // Descend from the closest neighbor actually linked on this layer.\n                ep_indices = [neighbor_indices.length > 0 ? neighbor_indices[0] : W[0].index];\n            }\n\n            // Layers above the previous maximum: the element is their only member and becomes the\n            // new entry point. Also covers the first insertion, where `L` is -1.\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([[global_index, []]]),\n                    });\n                }\n                this._ep = [global_index];\n                this._L = l;\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=false] - Whether to extend candidates with their neighbors\n     * @param {boolean} [keep_pruned_connections=false] - Whether to add pruned connections back if needed\n     * @returns {number[]} Selected neighbor indices, nearest first\n     */\n    _select_heuristic(q, candidates, M, l_c, extend_candidates = false, keep_pruned_connections = false) {\n        const metric = this._metric;\n        const elements = this._elements;\n\n        const dist_map = new Map();\n        const pool = [];\n        for (let i = 0; i < candidates.length; ++i) {\n            const c = candidates[i];\n            if (dist_map.has(c.index)) continue;\n            dist_map.set(c.index, c.distance);\n            pool.push(c.index);\n        }\n\n        if (extend_candidates) {\n            const layer = this._graph.get(l_c);\n            if (layer) {\n                for (let i = 0; i < candidates.length; ++i) {\n                    const edges = layer.edges.get(candidates[i].index) ?? [];\n                    for (let j = 0; j < edges.length; ++j) {\n                        const idx = edges[j];\n                        if (dist_map.has(idx)) continue;\n                        const elem = elements[idx];\n                        if (!elem || elem.length !== q.length) continue;\n                        dist_map.set(idx, metric(elem, q));\n                        pool.push(idx);\n                    }\n                }\n            }\n        }\n\n        pool.sort((a, b) => dist_map.get(a) - dist_map.get(b));\n\n        // Nothing to choose between: keep everything rather than thinning an already small\n        // neighborhood.\n        if (pool.length < M) return pool;\n\n        /** @type {number[]} */\n        const R = [];\n        /** @type {number[]} */\n        const discarded = [];\n\n        // Keep `e` only if the query is closer to it than any already-selected neighbor is. This\n        // spreads links across directions rather than letting them collapse onto the nearest\n        // cluster, which is what makes the layer navigable and not merely a k-nearest-neighbor graph.\n        for (let i = 0; i < pool.length; ++i) {\n            if (R.length >= M) break;\n            const idx = pool[i];\n            const dist_to_q = dist_map.get(idx);\n            const e = elements[idx];\n\n            let should_add = true;\n            for (let j = 0; j < R.length; ++j) {\n                if (metric(e, elements[R[j]]) < dist_to_q) {\n                    should_add = false;\n                    break;\n                }\n            }\n\n            if (should_add) {\n                R.push(idx);\n            } else {\n                discarded.push(idx);\n            }\n        }\n\n        // Off by default: refilling to `M` with the nearest rejected candidates undoes the spread\n        // above and turns the result back into plain nearest-M.\n        if (keep_pruned_connections) {\n            for (let i = 0; i < discarded.length && R.length < M; ++i) {\n                R.push(discarded[i]);\n            }\n        }\n\n        return R;\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        // A layer whose members carry no edges yet is not a failure: the entry points are still the\n        // best answer it can give.\n        if (!layer || !ep_indices || ep_indices.length === 0) {\n            return [];\n        }\n\n        const numElements = elements.length;\n        if (this._visited_stamps.length < numElements) {\n            const nextCap = Math.max(numElements * 2, 1024);\n            const old = this._visited_stamps;\n            this._visited_stamps = new Uint32Array(nextCap);\n            this._visited_stamps.set(old);\n        }\n\n        const search_id = ++this._search_id;\n        const stamps = this._visited_stamps;\n\n        const init_candidates = [];\n        for (let i = 0; i < ep_indices.length; ++i) {\n            const idx = ep_indices[i];\n            const elem = elements[idx];\n            if (elem !== undefined) {\n                stamps[idx] = search_id;\n                init_candidates.push({\n                    element: elem,\n                    index: idx,\n                    distance: metric(elem, q),\n                });\n            }\n        }\n\n        if (init_candidates.length === 0) {\n            return [];\n        }\n\n        const C = new Heap(init_candidates, (item) => item.distance, \"min\");\n        const W = new Heap(init_candidates, (item) => item.distance, \"max\");\n\n        while (!C.empty) {\n            const c = C.pop();\n            if (!c) break;\n            const furthest_dist = W.first?.value ?? Infinity;\n\n            if (c.value > furthest_dist) {\n                break;\n            }\n\n            const edges = layer.edges.get(c.element.index) ?? [];\n\n            for (let i = 0; i < edges.length; ++i) {\n                const neighbor_idx = edges[i];\n                if (stamps[neighbor_idx] !== search_id) {\n                    stamps[neighbor_idx] = search_id;\n                    const neighbor_element = elements[neighbor_idx];\n                    if (!neighbor_element || neighbor_element.length !== q.length) continue;\n                    if (neighbor_idx === c.element.index) continue;\n\n                    const dist_e = metric(neighbor_element, q);\n                    const current_furthest = W.first?.value ?? Infinity;\n\n                    if (dist_e < current_furthest || W.length < ef) {\n                        const candidateNode = {\n                            element: neighbor_element,\n                            index: neighbor_idx,\n                            distance: dist_e,\n                        };\n                        C.push(candidateNode);\n                        W.push(candidateNode);\n\n                        if (W.length > ef) {\n                            W.pop();\n                        }\n                    }\n                }\n            }\n        }\n\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","import { Heap } from \"../datastructure/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { quickselectByAxis } from \"../util/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 {Partial<ParametersKDTree>} [parameters={}] - Anything left out falls back to the\n     *   documented default.\n     */\n    constructor(elements, parameters = {}) {\n        super(elements, Object.assign({ metric: euclidean, 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        // In-place QuickSelect partition around median index O(N)\n        const medianIndex = Math.floor(elements.length / 2);\n        quickselectByAxis(elements, this._randomizer, medianIndex, axis);\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 {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 the p-stable scheme of Datar et al. for Euclidean distance: each hash\n * projects onto a Gaussian random vector and quantizes the result into buckets of width w.\n *\n * Key concepts:\n * - Multiple hash tables increase recall probability\n * - Each hash function projects data onto a random Gaussian direction\n * - Points landing in the same quantization bucket 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 {Partial<ParametersLSH>} [parameters={}] - Anything left out falls back to the\n     *   documented default.\n     */\n    constructor(elements, parameters = {}) {\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        // `KNN` keeps the parameter object as handed to it, so defaults are merged here rather\n        // than left to a default argument, which would only apply when `parameters` is omitted\n        // entirely and drop every unspecified default for `new LSH(elements, { seed: 5 })`.\n        super(\n            [firstElement],\n            Object.assign(\n                { metric: euclidean, numHashTables: 10, numHashFunctions: 10, bucketWidth: null, seed: 1212 },\n                parameters,\n            ),\n        );\n\n        this._metric = this._parameters.metric;\n        this._numHashTables = this._parameters.numHashTables;\n        this._numHashFunctions = this._parameters.numHashFunctions;\n        this._seed = this._parameters.seed;\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        // Bucket width w, estimated from the data when not supplied\n        /** @type {number} */\n        this._bucketWidth = this._parameters.bucketWidth ?? this._estimateBucketWidth(hasElements ? elements : []);\n\n        /**\n         * Whether the projection geometry still has to be derived from real data.\n         *\n         * Both things the hash depends on — `_dim` and the bucket width — come from the elements,\n         * and an index built empty has none yet. Building hash functions against the placeholder\n         * would fix `_dim` at 1 and the width at the `n < 2` fallback, giving one-element projection\n         * vectors; `_computeHash` then walks `element.length` components against them, reads past\n         * the end, and every real point added later hashes to `\"NaN,NaN,…\"`. That lands the whole\n         * dataset in a single bucket per table and turns every query into a full scan — right\n         * answers, no index. So the hash functions wait for `add` to supply real data.\n         *\n         * @private\n         * @type {boolean}\n         */\n        this._awaiting_data = !hasElements;\n\n        // The element `super` was given is a placeholder when the index was built empty, and is\n        // re-added below when it was not. Either way it must not survive into the index.\n        /** @type {T[]} */\n        this._elements = [];\n\n        if (hasElements) {\n            this._initializeHashFunctions();\n            this.add(elements);\n        }\n    }\n\n    /**\n     * Estimates a bucket width from the spread of the data.\n     *\n     * Projected gaps are distributed as `N(0, ||u - v||^2)`, so w must sit near the scale of\n     * nearby-point distances: much larger and everything collides, much smaller and nothing does.\n     *\n     * @private\n     * @param {T[]} elements\n     * @returns {number} Bucket width, always positive.\n     */\n    _estimateBucketWidth(elements) {\n        const n = elements.length;\n        if (n < 2) return 1;\n\n        const neighbor_rank = Math.min(10, n - 1);\n        const step = Math.max(1, Math.floor(n / Math.min(n, 32)));\n\n        const scales = [];\n        for (let i = 0; i < n; i += step) {\n            const distances = new Array(n);\n            for (let j = 0; j < n; ++j) distances[j] = this._metric(elements[i], elements[j]);\n            distances.sort((a, b) => a - b);\n            scales.push(distances[neighbor_rank]);\n        }\n\n        scales.sort((a, b) => a - b);\n        const scale = scales[scales.length >> 1];\n        // Several times the near-neighbor distance: `numHashFunctions` hashes are ANDed per table,\n        // so the per-hash collision probability is raised to that power and has to stay high.\n        return scale > 0 ? 4 * scale : 1;\n    }\n\n    /**\n     * Initialize random projection vectors for all hash tables.\n     * @private\n     */\n    _initializeHashFunctions() {\n        // From `_dim`, not `_elements`: the constructor clears `_elements` before re-initializing\n        const dim = this._dim;\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                // Raw N(0, 1); normalizing to unit length would break p-stability\n                const projection = new Float64Array(dim);\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                    projection[i] = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n                }\n\n                tableProjections.push(projection);\n                // Offset b, drawn uniformly from [0, w) as the scheme requires.\n                tableOffsets.push(this._randomizer.random * this._bucketWidth);\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 into buckets of width w\n            bits.push(Math.floor((dot + offsets[i]) / this._bucketWidth));\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        // First real data an empty-constructed index has seen: derive the projection geometry from\n        // it now. The draw sequence matches direct construction — one throwaway round in the\n        // constructor, then the round that counts — so both routes build the same index.\n        if (this._awaiting_data && elements.length > 0) {\n            this._dim = elements[0].length;\n            if (this._parameters.bucketWidth == null) {\n                this._bucketWidth = this._estimateBucketWidth(elements);\n            }\n            this._hashTables = [];\n            this._projections = [];\n            this._offsets = [];\n            this._initializeHashFunctions();\n            this._awaiting_data = false;\n        }\n\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","import { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { quickselect } from \"../util/index.js\";\nimport { KNN } from \"./KNN.js\";\n\n/** @import { ParametersNaiveKNN } from \"./index.js\" */\n/** @import { Metric } from \"../metrics/index.js\" */\n\n/**\n * Naive KNN implementation performing an exhaustive scan.\n *\n * Every query measures the distance to all `N` elements and then selects the `k` smallest with\n * {@link quickselect}, which is O(N) on average — cheaper than sorting all `N` and far cheaper than\n * the N heaps of N entries this class used to build up front.\n *\n * The N x N distance matrix is only materialized when it actually pays off: a `\"precomputed\"` index\n * is handed one directly, and {@link NaiveKNN#search_by_index} builds one lazily on first use so\n * that building a whole kNN graph costs a single pass over the pairs instead of one per query.\n * Callers that only ever use {@link NaiveKNN#search} never allocate it.\n *\n * Best suited for small datasets, or when a distance matrix is already available. For larger `N`\n * prefer an approximate index such as {@link HNSW}, {@link Annoy}, or {@link NNDescent}.\n *\n * @template {number[] | Float64Array} T\n * @category KNN\n * @class\n * @extends KNN<T, ParametersNaiveKNN>\n */\nexport class NaiveKNN extends KNN {\n    /**\n     * Number of indexed elements.\n     *\n     * @type {number}\n     */\n    _N;\n    /**\n     * Pairwise distances. Supplied by the caller when `metric` is `\"precomputed\"`, built on demand\n     * by {@link NaiveKNN#search_by_index} otherwise, and `null` until then.\n     *\n     * @type {Matrix | null}\n     */\n    _D;\n\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 {Partial<ParametersNaiveKNN>} [parameters={}] - Anything left out falls back to the\n     *   documented default.\n     */\n    constructor(elements, parameters = {}) {\n        const params = Object.assign({ metric: euclidean, seed: 1212 }, parameters);\n        super(elements, params);\n        const elements_any = /** @type {any} */ (this._elements);\n        this._N = elements_any instanceof Matrix ? elements_any.shape[0] : this._elements.length;\n        this._D =\n            this._parameters.metric === \"precomputed\"\n                ? Matrix.from(/** @type {number[][] | Float64Array[]} */ (elements_any))\n                : null;\n    }\n\n    /**\n     * Reads the element stored at `i`, which may live in a `Matrix` or a plain array.\n     *\n     * @private\n     * @param {number} i\n     * @returns {T}\n     */\n    _element_at(i) {\n        const elements = /** @type {any} */ (this._elements);\n        return /** @type {T} */ (elements instanceof Matrix ? elements.row(i) : elements[i]);\n    }\n\n    /**\n     * Selects the `k` elements closest to a query from its distances to every element.\n     *\n     * QuickSelect partitions in O(N) average time, after which only the `k` selected entries are\n     * sorted. Ties break on the element index so the result never depends on the pivots drawn.\n     *\n     * @private\n     * @param {ArrayLike<number>} distances - Distance from the query to each element, by index.\n     * @param {number} k - Number of neighbors to return.\n     * @param {number} [exclude=-1] - Index to leave out, or `-1` to keep every element. Default is `-1`\n     * @returns {{ element: T; index: number; distance: number }[]} The `k` nearest, closest first.\n     */\n    _k_smallest(distances, k, exclude = -1) {\n        const N = this._N;\n        const pool = exclude >= 0 && exclude < N ? N - 1 : N;\n        const size = Math.min(Math.max(Math.floor(k), 0), pool);\n        if (size === 0) return [];\n\n        /** @type {(a: number, b: number) => number} */\n        const compare = (a, b) => distances[a] - distances[b] || a - b;\n        /** @type {number[]} */\n        const indices = new Array(pool);\n        for (let i = 0, at = 0; i < N; ++i) {\n            if (i !== exclude) indices[at++] = i;\n        }\n        if (size < pool) {\n            // Leaves the `size` smallest in indices[0..size-1], in no particular order.\n            quickselect(indices, this._randomizer, size - 1, compare);\n            indices.length = size;\n        }\n        indices.sort(compare);\n\n        return indices.map((index) => ({\n            element: this._element_at(index),\n            index,\n            distance: distances[index],\n        }));\n    }\n\n    /**\n     * Returns the pairwise distance matrix, computing it once on first use.\n     *\n     * @private\n     * @returns {Matrix}\n     */\n    _distance_matrix() {\n        if (this._D === null) {\n            this._D = distance_matrix(\n                /** @type {number[][] | Float64Array[]} */ (/** @type {any} */ (this._elements)),\n                /** @type {Metric} */ (this._parameters.metric),\n            );\n        }\n        return this._D;\n    }\n\n    /**\n     * Overrides the base `search_by_index`, which reaches the elements through {@link NaiveKNN#search}.\n     * That is not available on a `\"precomputed\"` index, and it would also throw away the distance\n     * matrix this class already holds. The self-exclusion contract is identical.\n     *\n     * @param {number} i - Index of the query element.\n     * @param {number} [k=5] - Number of nearest neighbors to return. Default is `5`\n     * @returns {{ element: T; index: number; distance: number }[]} - The `k` nearest *other*\n     *   elements, closest first. Empty when `i` is out of range.\n     */\n    search_by_index(i, k = 5) {\n        if (i < 0 || i >= this._N) return [];\n        return this._k_smallest(this._distance_matrix().row(i), k, i);\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        const metric = /** @type {Metric} */ (this._parameters.metric);\n        const N = this._N;\n        const distances = new Float64Array(N);\n        for (let i = 0; i < N; ++i) {\n            distances[i] = metric(t, this._element_at(i));\n        }\n        return this._k_smallest(distances, 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={}] - Anything left out falls back to the\n     *   documented default.\n     * @see {@link http://www.cs.princeton.edu/cass/papers/www11.pdf}\n     */\n    constructor(elements, parameters = {}) {\n        super(\n            elements,\n            // The neighborhood size is called `samples`; the default was previously keyed as `K`,\n            // which nothing reads, so constructing without one left it `undefined`.\n            /** @type {ParametersNNDescent} */ (\n                Object.assign({ metric: euclidean, samples: 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     * Offers each of `u1`, `u2` to the other's neighborhood, under the distance between them.\n     *\n     * The distance has to be computed here. A neighbor object carries the distance to the point\n     * whose list it came from, which says nothing about how far apart `u1` and `u2` are; reusing it\n     * meant no new distance was ever evaluated and the heaps were ordered by unrelated values.\n     *\n     * @private\n     * @param {KNNHeap<T>[]} B\n     * @param {NNDescentNeighbor<T>} u1\n     * @param {NNDescentNeighbor<T>} u2\n     * @returns {number} How many neighborhoods changed.\n     */\n    _join(B, u1, u2) {\n        if (u1.index === u2.index) return 0;\n        const distance = this._parameters.metric(u1.value, u2.value);\n        return (\n            this._update(B[u1.index], { index: u2.index, value: u2.value, distance, flag: true }) +\n            this._update(B[u2.index], { index: u1.index, value: u1.value, distance, flag: true })\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        // Hoisted: rebuilding this per point allocated N arrays of N objects.\n        const indexed = elements.map((el, idx) => ({ el, idx }));\n        for (let i = 0; i < N; i++) {\n            const e = elements[i];\n            // `flag: true` marks the entry as new. Without it nothing is ever eligible for the\n            // local join below, so the graph stays at its random initialization.\n            const sample = randomizer.choice(indexed, K).map((d) => {\n                return { index: d.idx, distance: metric(d.el, e), value: d.el, flag: true };\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                    // new x new is unordered, so start at j + 1 rather than joining each pair twice\n                    for (let k = j + 1; k < n1; k++) {\n                        c += this._join(B, u1, new_i[k]);\n                    }\n                    for (let k = 0; k < n2; k++) {\n                        c += this._join(B, u1, old_i[k]);\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)); 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 * 2, 32));\n\n            searching = false;\n            // Bounded by the pool as it stands now: expansion appends to `pool`, and re-reading\n            // `pool.length` here would walk those additions in the same pass, so the cap above\n            // never applied and the walk degenerated into a scan of the whole graph.\n            const frontier = pool.length;\n            for (let i = 0; i < frontier; 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/**\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 { chebyshev, euclidean, manhattan } from \"../metrics/index.js\";\nimport { BallTree } from \"./BallTree.js\";\nimport { KDTree } from \"./KDTree.js\";\n\n/** @import { Metric } from \"../metrics/index.js\" */\n\n/**\n * Metrics for which a KD-Tree may prune soundly.\n *\n * `KDTree` discards a subtree when the distance to the splitting hyperplane, `|a[axis] - b[axis]|`,\n * already exceeds the current k-th best distance. That is only valid for metrics which are bounded\n * below by the per-coordinate difference — true for the L_p family, but false for e.g. `cosine`,\n * `canberra`, `haversine`, or `euclidean_squared`, where it silently drops true neighbors.\n *\n * @type {Set<Metric>}\n */\nconst KDTREE_SAFE_METRICS = new Set([euclidean, manhattan, chebyshev]);\n\n/**\n * Picks the fastest spatial index that is still correct for the given metric.\n *\n * Returns a {@link KDTree} for metrics it can prune soundly, and a {@link BallTree} — which only\n * relies on the triangle inequality and therefore works for any metric — otherwise.\n *\n * @template {number[] | Float64Array} T\n * @param {T[]} elements - Elements to index.\n * @param {{ metric: Metric; seed: number }} parameters - Metric and seed for the tree.\n * @returns {KDTree<T> | BallTree<T>} The constructed index.\n */\nexport function spatial_tree(elements, parameters) {\n    if (KDTREE_SAFE_METRICS.has(parameters.metric)) {\n        return new KDTree(elements, parameters);\n    }\n    return new BallTree(elements, parameters);\n}\n","/**\n * WASM wrappers for the `ISOMAP` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `ISOMAP.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, free_all, initWasm } from \"../wasm/index.js\";\n\n/**\n * Computes All-Pairs Shortest Path geodesic distances for ISOMAP using WASM Min-Heap Repeated Dijkstra.\n *\n * @param {Int32Array} neighbors_val\n * @param {Float64Array} distances_val\n * @param {Float64Array} out_d_val\n * @param {number} n\n * @param {number} k\n * @returns {boolean} True if successfully executed via WASM.\n */\nexport function wasmDijkstraAPSP(neighbors_val, distances_val, out_d_val, n, k) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrN = alloc(exports, ptrs, neighbors_val.byteLength);\n        const ptrDist = alloc(exports, ptrs, distances_val.byteLength);\n        const ptrOut = alloc(exports, ptrs, out_d_val.byteLength);\n\n        new Int32Array(memory.buffer, ptrN, neighbors_val.length).set(neighbors_val);\n        new Float64Array(memory.buffer, ptrDist, distances_val.length).set(distances_val);\n\n        exports.dijkstra_apsp_f64(ptrN, ptrDist, ptrOut, n, k);\n\n        out_d_val.set(new Float64Array(memory.buffer, ptrOut, out_d_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Range-based All-Pairs Shortest Path calculation for worker thread execution.\n *\n * @param {Int32Array} neighbors_val\n * @param {Float64Array} distances_val\n * @param {Float64Array} out_d_val\n * @param {number} n\n * @param {number} k\n * @param {number} start_src\n * @param {number} end_src\n * @returns {boolean}\n */\nexport function wasmDijkstraAPSPRange(neighbors_val, distances_val, out_d_val, n, k, start_src, end_src) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrN = alloc(exports, ptrs, neighbors_val.byteLength);\n        const ptrDist = alloc(exports, ptrs, distances_val.byteLength);\n        const ptrOut = alloc(exports, ptrs, out_d_val.byteLength);\n\n        new Int32Array(memory.buffer, ptrN, neighbors_val.length).set(neighbors_val);\n        new Float64Array(memory.buffer, ptrDist, distances_val.length).set(distances_val);\n\n        exports.dijkstra_apsp_range_f64(ptrN, ptrDist, ptrOut, n, k, start_src, end_src);\n\n        // Only rows `[start_src, end_src)` were computed. Copying the whole buffer back would\n        // overwrite the rows other workers wrote into the same shared output with this instance's\n        // untouched (zero) memory.\n        const offset = start_src * n;\n        const count = (end_src - start_src) * n;\n        out_d_val.set(new Float64Array(memory.buffer, ptrOut + offset * 8, count), offset);\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n","/**\n * WASM wrappers for the `SMACOF` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `SMACOF.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { copy_once, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Executes a single SMACOF Guttman Transform iteration step in WASM.\n *\n * @param {Float64Array} Z_val\n * @param {Float64Array} TargetD_val\n * @param {Float64Array} ZNew_val\n * @param {number} n\n * @param {number} d\n * @returns {number | null} Computed stress value, or null if WASM is unavailable.\n */\nexport function wasmSmacofStep(Z_val, TargetD_val, ZNew_val, n, d) {\n    const inst = initWasm();\n    if (!inst) return null;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    const s = get_session(inst, exports, \"smacof\", {\n        Z: Z_val.byteLength,\n        TargetD: TargetD_val.byteLength,\n        ZNew: ZNew_val.byteLength,\n    });\n    const { Z, TargetD, ZNew } = s.ptrs;\n\n    // The target distances are fixed for the whole run; only the configuration changes per step.\n    copy_once(exports, s, \"TargetD\", TargetD_val);\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Z, Z_val.length).set(Z_val);\n\n    const stress = exports.smacof_step_f64(Z, TargetD, ZNew, n, d);\n\n    ZNew_val.set(new Float64Array(memory.buffer, ZNew, ZNew_val.length));\n    return stress;\n}\n","import { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { WASM_MIN_ROWS } from \"../wasm/thresholds.js\";\nimport { DR } from \"./DR.js\";\nimport { wasmSmacofStep } from \"./SMACOF.wasm.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    /** @protected */\n    get _wasm_session_keys() {\n        return [\"smacof\"];\n    }\n\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        try {\n            for (let iter = 0; iter < iterations; ++iter) {\n                const Z_new = new Matrix(rows, d);\n                let current_stress = null;\n\n                if (rows >= WASM_MIN_ROWS) {\n                    current_stress = wasmSmacofStep(Z.values, target_distances.values, Z_new.values, rows, d);\n                }\n\n                if (current_stress === null) {\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_js = B.dot(Z)._apply(rows, (val, n) => val / n);\n                    Z_new.values.set(Z_new_js.values);\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_new.row(i);\n                        for (let j = i + 1; j < rows; ++j) {\n                            const z_j = Z_new.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                    current_stress = Math.sqrt(stress_num / Math.max(stress_den, 1e-12));\n                }\n\n                this.Y = Z_new;\n                Z = Z_new;\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        } finally {\n            this._release_wasm();\n        }\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 { spatial_tree } 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 { WASM_MIN_PARALLEL_ROWS } from \"../wasm/thresholds.js\";\nimport { parallel_available, run_row_range } from \"../wasm/worker_pool.js\";\nimport { DR } from \"./DR.js\";\nimport { wasmDijkstraAPSP } from \"./ISOMAP.wasm.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     * Runs the all-pairs geodesic step across the worker pool.\n     *\n     * The pool needs a `SharedArrayBuffer` to write into, so the result is copied into `out` rather\n     * than computed in place. That copy is far cheaper than the Dijkstra runs it parallelizes.\n     *\n     * @private\n     * @param {Int32Array} neighbors\n     * @param {Float64Array} distances\n     * @param {Float64Array} out\n     * @param {number} rows\n     * @param {number} maxK\n     * @returns {boolean} True if the pool produced the distances.\n     */\n    _dijkstra_parallel(neighbors, distances, out, rows, maxK) {\n        if (rows < WASM_MIN_PARALLEL_ROWS || !parallel_available()) return false;\n        try {\n            const shared = new Float64Array(new SharedArrayBuffer(rows * rows * 8));\n            const inputs = /** @type {{ data: Float64Array | Int32Array; kind: \"f64\" | \"i32\" }[]} */ ([\n                { data: neighbors, kind: \"i32\" },\n                { data: distances, kind: \"f64\" },\n            ]);\n            if (!run_row_range(\"dijkstra_apsp_range_f64\", inputs, shared, [rows, maxK], rows, rows)) return false;\n            out.set(shared);\n            return true;\n        } catch {\n            return false;\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 = spatial_tree(X.to2dArray(), {\n            metric,\n            seed: /** @type {number} */ (this.parameter(\"seed\")),\n        });\n        for (let i = 0; i < rows; ++i) {\n            kNearestNeighbors.push(\n                tree.search_by_index(i, neighbors).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        // Convert kNearestNeighbors list into flattened arrays for WASM Dijkstra execution\n        let maxK = 0;\n        for (let i = 0; i < rows; ++i) {\n            if (kNearestNeighbors[i].length > maxK) maxK = kNearestNeighbors[i].length;\n        }\n\n        const flatNeighbors = new Int32Array(rows * maxK).fill(-1);\n        const flatDistances = new Float64Array(rows * maxK).fill(Infinity);\n        for (let i = 0; i < rows; ++i) {\n            const list = kNearestNeighbors[i];\n            const i_k = i * maxK;\n            for (let idx = 0; idx < list.length; ++idx) {\n                flatNeighbors[i_k + idx] = list[idx].index;\n                flatDistances[i_k + idx] = list[idx].distance;\n            }\n        }\n\n        if (\n            !this._dijkstra_parallel(flatNeighbors, flatDistances, G.values, rows, maxK) &&\n            !wasmDijkstraAPSP(flatNeighbors, flatDistances, G.values, rows, maxK)\n        ) {\n            // JS fallback using Heap\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\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, {\n                metric: \"precomputed\",\n                d,\n                seed: this.parameter(\"seed\"),\n            });\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 {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        // The cache is only valid for the parameters it was computed from. `parameter()` clears\n        // `_is_initialized` on every set, so gating on it here is what makes `pca.parameter(\"d\", 2)`\n        // after a `transform()` recompute instead of handing back the components for the old `d`.\n        if (this.V && this._is_initialized) {\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        // Marks the cache valid for the current parameters, so repeated calls still hit it.\n        this.check_init();\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","/**\n * WASM wrappers for the {@link StressMDS} kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from `StressMDS.as.ts`,\n * and copies the result back, reporting failure so the caller can fall back to its JS\n * implementation. The shared runtime -- instance setup, allocation and the persistent buffer\n * sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { copy_once, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Session buffer sizes. Both kernels share one session, so the shapes must agree between them.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} D_val\n * @returns {Record<string, number>}\n */\nfunction sizes(Y_val, D_val) {\n    return {\n        Y: Y_val.byteLength,\n        D: D_val.byteLength,\n        W: D_val.byteLength,\n        G: Y_val.byteLength,\n        Trial: Y_val.byteLength,\n        Out: 16,\n    };\n}\n\n/**\n * Runs one weighted-stress iteration -- preconditioned gradient, line search and update -- in WASM.\n *\n * `Y_val` is updated in place when the step is accepted. The distances, weights, gradient and trial\n * scratch stay in the session between iterations, so a run copies the embedding in and out once per\n * iteration rather than once per line-search trial.\n *\n * @param {Float64Array} Y_val - N ⨯ d embedding, updated in place on an accepted step.\n * @param {Float64Array} D_val - N ⨯ N target distances. Constant for a run.\n * @param {Float64Array} W_val - N ⨯ N weights. Constant for a run.\n * @param {number} n\n * @param {number} d\n * @param {number} step - Current step size.\n * @param {number} energy_current - Energy of `Y_val` on entry.\n * @returns {{ energy: number; step: number; accepted: boolean } | null} The new state, or null if\n *   WASM is unavailable.\n */\nexport function wasmStressMDSStep(Y_val, D_val, W_val, n, d, step, energy_current) {\n    const inst = initWasm();\n    if (!inst) return null;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    const s = get_session(inst, exports, \"stress_mds\", sizes(Y_val, D_val));\n    const { Y, D, W, G, Trial, Out } = s.ptrs;\n\n    // Distances and weights are fixed for the whole run; only the configuration changes per step.\n    copy_once(exports, s, \"D\", D_val);\n    copy_once(exports, s, \"W\", W_val);\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n\n    const energy = exports.stress_mds_step_f64(Y, D, W, G, Trial, n, d, step, energy_current, Out);\n\n    const out = new Float64Array(memory.buffer, Out, 2);\n    const accepted = out[1] === 1;\n    if (accepted) {\n        Y_val.set(new Float64Array(memory.buffer, Y, Y_val.length));\n    }\n    return { energy, step: out[0], accepted };\n}\n\n/**\n * Computes the weighted stress of a configuration in WASM.\n *\n * Called once to seed the iteration loop; later values come back from {@link wasmStressMDSStep}.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} D_val\n * @param {Float64Array} W_val\n * @param {number} n\n * @param {number} d\n * @returns {number | null} The stress, or null if WASM is unavailable.\n */\nexport function wasmStressMDSEnergy(Y_val, D_val, W_val, n, d) {\n    const inst = initWasm();\n    if (!inst) return null;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    const s = get_session(inst, exports, \"stress_mds\", sizes(Y_val, D_val));\n    const { Y, D, W } = s.ptrs;\n\n    copy_once(exports, s, \"D\", D_val);\n    copy_once(exports, s, \"W\", W_val);\n    new Float64Array(exports.memory.buffer, Y, Y_val.length).set(Y_val);\n\n    return exports.stress_mds_energy_f64(Y, D, W, n, d);\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 { WASM_MIN_ROWS } from \"../wasm/thresholds.js\";\nimport { DR } from \"./DR.js\";\nimport { PCA } from \"./PCA.js\";\nimport { wasmStressMDSEnergy, wasmStressMDSStep } from \"./StressMDS.wasm.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersStressMDS, WeightSpec} from \"./index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n\n/** @typedef {\"MDS\" | \"PCA\" | \"random\"} AvailableInit */\n\n/** Raw stress: every pair counts equally. Recovers the objective {@link SMACOF} minimises. */\nexport const WEIGHTS_UNIFORM = 0;\n/** Sammon stress. Recovers the objective {@link SAMMON} minimises, up to a constant factor. */\nexport const WEIGHTS_SAMMON = -1;\n/** Elastic scaling, also known as the Kamada-Kawai energy. See {@link KKMDS}. */\nexport const WEIGHTS_ELASTIC = -2;\n\n/**\n * Weighted metric MDS (stress majorization family)\n *\n * Minimises `σ(Y) = Σ_{i<j} w_ij ⋅ (‖y_i - y_j‖ - d_ij)²` for a weighting you choose. An exponent\n * `q` gives `w_ij = d_ij^q`, recovering the classical family: `0` is raw stress ({@link SMACOF}'s\n * objective), `-1` Sammon stress ({@link SAMMON}'s), `-2` elastic scaling ({@link KKMDS}). A matrix\n * or a function works too, where a zero weight drops the pair from the objective — the usual way to\n * express missing dissimilarities.\n *\n * It does not replace {@link SMACOF} or {@link SAMMON}: those minimise the same objectives with\n * their own historical algorithms and reach different local minima.\n *\n * Optimised by Jacobi-preconditioned gradient descent with a backtracking line search, warm-started\n * from classical MDS. O(N²·d) per iteration.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersStressMDS>\n * @category Dimensionality Reduction\n * @see {@link KKMDS} for the `weights: -2` preset.\n * @example\n * // Sammon stress, converged further than SAMMON's own optimizer takes it\n * const Y = new StressMDS(X, { weights: -1 }).transform();\n * @example\n * // Ignore pairs whose dissimilarity was never measured\n * const W = new Matrix(N, N, (i, j) => (observed(i, j) ? 1 : 0));\n * const Y = new StressMDS(D, { metric: \"precomputed\", weights: W }).transform();\n */\nexport class StressMDS extends DR {\n    /**\n     * The target distances. Named apart from the base class's `_D`, which is the *input*\n     * dimensionality of `X`, not a matrix.\n     *\n     * @type {Matrix | undefined}\n     */\n    _target_distances;\n\n    /** @type {Matrix | undefined} */\n    _weights;\n\n    /** @type {number} */\n    _energy = Infinity;\n\n    /** @protected */\n    get _wasm_session_keys() {\n        return [\"stress_mds\"];\n    }\n\n    /**\n     * Weighted metric MDS.\n     *\n     * @param {T} X - The high-dimensional data, or a precomputed distance matrix.\n     * @param {Partial<ParametersStressMDS>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters = {}) {\n        super(\n            X,\n            {\n                d: 2,\n                metric: euclidean,\n                weights: WEIGHTS_ELASTIC,\n                iterations: 300,\n                epsilon: 1e-6,\n                learning_rate: 0.1,\n                init_DR: \"MDS\",\n                seed: 1212,\n                eig_args: {},\n            },\n            parameters,\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     * The weighted stress `σ(Y)` of the current embedding.\n     *\n     * @returns {number}\n     */\n    get energy() {\n        this.check_init();\n        return /** @type {number} */ (this._energy);\n    }\n\n    /**\n     * The weight matrix actually in use, whatever form `weights` was given in.\n     *\n     * @returns {Matrix}\n     */\n    get weights() {\n        this.check_init();\n        return /** @type {Matrix} */ (this._weights);\n    }\n\n    /**\n     * Materialises `weights` into an N ⨯ N matrix.\n     *\n     * Non-positive and non-finite weights are normalised to exactly 0, which is the kernel's \"skip\n     * this pair\" signal. That is what makes a zero distance harmless under a negative exponent: `0^-2`\n     * is `Infinity`, and coincident rows are ordinary in real data, so the pair is dropped rather\n     * than given infinite stiffness.\n     *\n     * @private\n     * @param {Matrix} D\n     * @returns {Matrix}\n     */\n    _build_weights(D) {\n        const N = this._N;\n        const spec = /** @type {WeightSpec} */ (this.parameter(\"weights\"));\n\n        /** @type {(i: number, j: number) => number} */\n        let weight_of;\n        if (typeof spec === \"number\") {\n            const q = spec;\n            weight_of = q === 0 ? () => 1 : (i, j) => D.entry(i, j) ** q;\n        } else if (typeof spec === \"function\") {\n            weight_of = (i, j) => spec(D.entry(i, j), i, j);\n        } else if (spec instanceof Matrix || Array.isArray(spec)) {\n            const W = spec instanceof Matrix ? spec : Matrix.from(spec);\n            const [rows, cols] = W.shape;\n            if (rows !== N || cols !== N) {\n                throw new Error(`weights matrix is ${rows}⨯${cols}, but X has ${N} rows!`);\n            }\n            weight_of = (i, j) => W.entry(i, j);\n        } else {\n            throw new Error(\"weights must be a number, a matrix, or a function!\");\n        }\n\n        return new Matrix(N, N, (i, j) => {\n            if (i === j) return 0;\n            const w = weight_of(i, j);\n            return Number.isFinite(w) && w > 0 ? w : 0;\n        });\n    }\n\n    /**\n     * Classical MDS on the target distances, scaled by the square roots of the eigenvalues.\n     *\n     * The scaling matters: the descent starts from here, and an unscaled eigenvector basis would put\n     * the configuration at a completely different magnitude from `d_ij`, so the first steps would be\n     * spent on scale rather than structure.\n     *\n     * @private\n     * @param {Matrix} D\n     * @param {number} d\n     * @returns {Matrix}\n     */\n    _classical_mds(D, d) {\n        const N = this._N;\n        const eig_args = /** @type {Partial<EigenArgs>} */ (this.parameter(\"eig_args\"));\n        const D_sq = new Matrix(N, N, (i, j) => D.entry(i, j) ** 2);\n        const ai_ = D_sq.meanCols();\n        const a_j = D_sq.meanRows();\n        const a__ = D_sq.mean();\n        const B = new Matrix(N, N, (i, j) => -0.5 * (D_sq.entry(i, j) - ai_[i] - a_j[j] + a__));\n\n        const { eigenvalues, eigenvectors } = simultaneous_poweriteration(B, d, eig_args);\n        const scales = Array.from({ length: d }, (_, k) => Math.sqrt(Math.max(eigenvalues[k], 0)));\n        return new Matrix(N, d, (i, k) => eigenvectors[k][i] * scales[k]);\n    }\n\n    /** Computes the target distances, the weights, and the starting configuration. */\n    init() {\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\n        this._target_distances = metric === \"precomputed\" ? Matrix.from(this.X) : distance_matrix(this.X, metric);\n        const D = this._target_distances;\n        this._weights = this._build_weights(D);\n\n        if (init_DR === \"random\") {\n            const randomizer = this._randomizer;\n            // Scaled to the target distances so the descent does not start by fixing magnitude.\n            let scale = 0;\n            for (let i = 0; i < this._N; ++i) {\n                for (let j = i + 1; j < this._N; ++j) {\n                    const value = D.entry(i, j);\n                    if (Number.isFinite(value) && value > scale) scale = value;\n                }\n            }\n            if (scale === 0) scale = 1;\n            this.Y = new Matrix(this._N, d, () => (randomizer.random - 0.5) * scale);\n        } else if (init_DR === \"PCA\") {\n            if (metric === \"precomputed\") {\n                throw new Error('init_DR \"PCA\" needs the original data, not a precomputed distance matrix!');\n            }\n            this.Y = Matrix.from(PCA.transform(this.X, { d, seed: this.parameter(\"seed\") }));\n        } else if (init_DR === \"MDS\") {\n            this.Y = this._classical_mds(D, d);\n        } else {\n            throw new Error('init_DR needs to be \"MDS\", \"PCA\" or \"random\"!');\n        }\n\n        this._energy = this._compute_energy(this.Y, D, this._weights);\n        this._is_initialized = true;\n        return this;\n    }\n\n    /**\n     * @private\n     * @param {Matrix} Y\n     * @param {Matrix} D\n     * @param {Matrix} W\n     * @returns {number}\n     */\n    _compute_energy(Y, D, W) {\n        const N = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n\n        if (N >= WASM_MIN_ROWS) {\n            const energy = wasmStressMDSEnergy(Y.values, D.values, W.values, N, d);\n            if (energy !== null) return energy;\n        }\n\n        let energy = 0;\n        for (let i = 0; i < N; ++i) {\n            for (let j = i + 1; j < N; ++j) {\n                const w_ij = W.entry(i, j);\n                if (!(w_ij > 0)) continue;\n                let sum_sq = 0;\n                for (let k = 0; k < d; ++k) {\n                    const diff = Y.entry(i, k) - Y.entry(j, k);\n                    sum_sq += diff * diff;\n                }\n                const residual = Math.sqrt(sum_sq) - D.entry(i, j);\n                energy += w_ij * residual * residual;\n            }\n        }\n        return energy;\n    }\n\n    /**\n     * One preconditioned gradient step with a backtracking line search, in JS.\n     *\n     * Mirrors `stress_mds_step_f64` in `StressMDS.as.ts` loop for loop, so the two paths agree to\n     * floating point tolerance. See that file for why the gradient is divided by the weighted degree.\n     *\n     * @private\n     * @param {Matrix} Y - Updated in place on an accepted step.\n     * @param {Matrix} D\n     * @param {Matrix} W\n     * @param {Float64Array} G - Gradient scratch, `N * d`.\n     * @param {number} step\n     * @param {number} energy_current\n     * @returns {{ energy: number; step: number; accepted: boolean }}\n     */\n    _step_js(Y, D, W, G, step, energy_current) {\n        const N = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        G.fill(0);\n\n        for (let i = 0; i < N; ++i) {\n            let degree = 0;\n            for (let j = 0; j < N; ++j) {\n                if (i === j) continue;\n                const w_ij = W.entry(i, j);\n                if (!(w_ij > 0)) continue;\n                degree += w_ij;\n                let sum_sq = 0;\n                for (let k = 0; k < d; ++k) {\n                    const diff = Y.entry(i, k) - Y.entry(j, k);\n                    sum_sq += diff * diff;\n                }\n                const dist = Math.sqrt(sum_sq);\n                if (dist < 1e-12) continue;\n                const coeff = (2 * w_ij * (dist - D.entry(i, j))) / dist;\n                for (let k = 0; k < d; ++k) {\n                    G[i * d + k] += coeff * (Y.entry(i, k) - Y.entry(j, k));\n                }\n            }\n            if (degree > 0) {\n                const inv_degree = 1 / degree;\n                for (let k = 0; k < d; ++k) G[i * d + k] *= inv_degree;\n            }\n        }\n\n        let g_norm = 0;\n        for (let idx = 0; idx < G.length; ++idx) g_norm += G[idx] * G[idx];\n        g_norm = Math.sqrt(g_norm);\n        if (g_norm < 1e-12) return { energy: energy_current, step, accepted: false };\n\n        const trial = new Matrix(N, d);\n        for (let attempt = 0; attempt < 12; ++attempt) {\n            for (let idx = 0; idx < G.length; ++idx) {\n                trial.values[idx] = Y.values[idx] - step * G[idx];\n            }\n            const energy = this._compute_energy(trial, D, W);\n            if (energy < energy_current) {\n                Y.values.set(trial.values);\n                return { energy, step: step * 1.2, accepted: true };\n            }\n            step *= 0.5;\n        }\n        return { energy: energy_current, step, accepted: false };\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        this.check_init();\n        const N = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const iterations = /** @type {number} */ (this.parameter(\"iterations\"));\n        const epsilon = /** @type {number} */ (this.parameter(\"epsilon\"));\n        const learning_rate = /** @type {number} */ (this.parameter(\"learning_rate\"));\n        const D = /** @type {Matrix} */ (this._target_distances);\n        const W = /** @type {Matrix} */ (this._weights);\n        const Y = this.Y;\n\n        // The warm start is a meaningful configuration in its own right, and yielding it here is\n        // what guarantees the generator produces at least one value: the line search can reject the\n        // very first step — on an input classical MDS already solves, it usually does — and a\n        // consumer that saw nothing at all would have no projection to fall back on.\n        yield this.projection;\n\n        if (N < 2 || !(iterations > 0)) {\n            return this.projection;\n        }\n\n        // Dimensionless: the preconditioned gradient is already in configuration units, so\n        // `learning_rate` means the same thing whether the distances run 0-1 or 0-1000, and across\n        // weightings. A value of 1 takes the full preconditioned step.\n        let step = learning_rate;\n        let energy = /** @type {number} */ (this._energy);\n        const G = new Float64Array(N * d);\n\n        try {\n            for (let iter = 0; iter < iterations; ++iter) {\n                /** @type {{ energy: number; step: number; accepted: boolean } | null} */\n                let result = null;\n                if (N >= WASM_MIN_ROWS) {\n                    result = wasmStressMDSStep(Y.values, D.values, W.values, N, d, step, energy);\n                }\n                if (result === null) {\n                    result = this._step_js(Y, D, W, G, step, energy);\n                }\n\n                step = result.step;\n                if (!result.accepted) break;\n\n                const improvement = (energy - result.energy) / Math.max(energy, 1e-12);\n                energy = result.energy;\n                this._energy = energy;\n                yield this.projection;\n\n                if (improvement < epsilon) break;\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @returns {T}\n     */\n    transform() {\n        // Drained for its effect on `Y`, and the projection read back afterwards rather than taken\n        // from the last yielded value — the loop body must never decide what `transform` returns.\n        for (const _ of this.generator()) {\n            // no-op\n        }\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersStressMDS>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new StressMDS(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersStressMDS>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new StressMDS(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersStressMDS>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new StressMDS(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { StressMDS, WEIGHTS_ELASTIC } from \"./StressMDS.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersKKMDS} from \"./index.js\" */\n\n/**\n * Kamada-Kawai Multidimensional Scaling (KKMDS)\n *\n * {@link StressMDS} fixed at `weights: -2`, weighting each pair by `1 / d_ij²`. That is the\n * Kamada-Kawai energy from graph drawing, known in the MDS literature as *elastic scaling*.\n *\n * Its classic use is laying out a graph from its shortest-path distances — pass those as a\n * `\"precomputed\"` matrix, as {@link MINFOTree} does.\n *\n * @class\n * @template {InputType} T\n * @extends StressMDS<T>\n * @category Dimensionality Reduction\n * @see {@link https://doi.org/10.1016/0020-0190(89)90102-6}\n * @see {@link StressMDS} for other weightings.\n */\nexport class KKMDS extends StressMDS {\n    /**\n     * Kamada-Kawai weighted MDS.\n     *\n     * @param {T} X - The high-dimensional data, or a precomputed distance matrix.\n     * @param {Partial<ParametersKKMDS>} [parameters] - Object containing parameterization of the DR\n     *   method. `weights` is not among them; it is fixed at `-2`.\n     */\n    constructor(X, parameters = {}) {\n        super(X, { ...parameters, weights: WEIGHTS_ELASTIC });\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersKKMDS>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new KKMDS(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersKKMDS>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new KKMDS(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersKKMDS>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new KKMDS(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 { spatial_tree } 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 { 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 {KNN} from \"../knn/KNN.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                knn: null,\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 knn =\n            /** @type {KNN<number[] | Float64Array, any> | null} */ (this.parameter(\"knn\")) ??\n            spatial_tree(X.to2dArray(), { metric, seed: /** @type {number} */ (this.parameter(\"seed\")) });\n        const nN = [];\n        for (let row = 0; row < rows; ++row) {\n            const found = knn.search_by_index(row, neighbors);\n            if (found.length < neighbors) {\n                throw new Error(\n                    `The KNN index returned only ${found.length} of the ${neighbors} requested neighbors for element ${row}. ` +\n                        `Lower \"neighbors\", or use an index that recalls more candidates.`,\n                );\n            }\n            nN.push(found);\n        }\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].index, 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].index, 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 { wasmKnnBlock } from \"../matrix/distance_matrix.wasm.js\";\nimport { 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 {KNN} from \"../knn/KNN.js\" */\n/** @import {ParametersPaCMAP} from \"./index.js\" */\n\n/** Rows per block of the exact neighbour search, chosen so one block stays cache-resident. */\nconst KNN_BLOCK_ROWS = 512;\n\n/** Shared empty rejection list, so sampling with nothing to reject allocates no subarray. */\nconst EMPTY = new Int32Array(0);\n\n/**\n * Pairwise Controlled Manifold Approximation Projection (PaCMAP)\n *\n * A dimensionality reduction technique that uses three types of point pairs — nearest neighbor\n * (NN), mid-near (MN), and further (FP) pairs — with a dynamic three-phase weight schedule and\n * Adam optimization to preserve both local and global structure. Neighbours are scaled by a local\n * density estimate before selection, which is what separates the NN set from a plain KNN graph.\n *\n * @class\n * @template {InputType} T\n * @template {ParametersPaCMAP} [P=ParametersPaCMAP] - Widened by {@link LocalMAP}, which adds a parameter.\n * @extends DR<T, P>\n * @category Dimensionality Reduction\n * @see {@link https://arxiv.org/abs/2012.04456|PaCMAP Paper}\n * @see {@link https://github.com/YingfanWang/PaCMAP|PaCMAP GitHub}\n * @see {@link UMAP} for a related graph-based technique\n * @see {@link LocalMAP} for the local-refinement variant\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 pacmap = new druid.PaCMAP(X, {\n *     n_neighbors: 10,\n *     MN_ratio: 0.5,\n *     FP_ratio: 2.0,\n *     seed: 42\n * });\n *\n * const Y = pacmap.transform(); // 450 iterations (default)\n * // [[x1, y1], [x2, y2], [x3, y3]]\n */\nexport class PaCMAP extends DR {\n    /**\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<P>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters) {\n        super(\n            X,\n            /** @type {P} */ ({\n                n_neighbors: 10,\n                MN_ratio: 0.5,\n                FP_ratio: 2.0,\n                d: 2,\n                metric: euclidean,\n                lr: 1.0,\n                num_iters: [100, 100, 250],\n                knn: null,\n                apply_pca: true,\n                seed: 1212,\n            }),\n            parameters,\n        );\n        [this._N, this._D] = this.X.shape;\n        const n_neighbors = /** @type {number} */ (this.parameter(\"n_neighbors\"));\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        this._iter = 0;\n    }\n\n    /**\n     * Finds the `n_candidates` nearest neighbors of every point.\n     *\n     * The reference over-fetches 50 beyond `n_neighbors` so that the density rescaling in\n     * {@link _scaled_neighbors} has something to re-rank, which makes this the most expensive part\n     * of a run — asking an approximate index for 60 neighbors instead of 10 costs it far more than\n     * the extra 50 suggests. The default path is therefore an exact blocked search whose selection\n     * happens inside the WASM kernel; it beats a tree at these widths and matches the exact search\n     * the reference performs. A `knn` index is used instead when one is supplied.\n     *\n     * @protected\n     * @param {Matrix} X - The matrix to search, already reduced if PCA was applied.\n     * @param {number} n_candidates\n     * @returns {{ dist: Float64Array; idx: Int32Array }} Row-major `N` ⨯ `n_candidates`, ascending.\n     */\n    _find_candidates(X, n_candidates) {\n        const N = this._N;\n        const D = X.shape[1];\n        const knn = /** @type {KNN<number[] | Float64Array, any> | null} */ (this.parameter(\"knn\"));\n        const dist = new Float64Array(N * n_candidates);\n        const idx = new Int32Array(N * n_candidates);\n\n        if (knn) {\n            for (let i = 0; i < N; ++i) {\n                const found = knn.search_by_index(i, n_candidates);\n                if (found.length < n_candidates) {\n                    throw new Error(\n                        `The KNN index returned only ${found.length} of the ${n_candidates} requested neighbors for element ${i}. ` +\n                            `Lower \"n_neighbors\", or use an index that recalls more candidates.`,\n                    );\n                }\n                for (let c = 0; c < n_candidates; ++c) {\n                    dist[i * n_candidates + c] = found[c].distance;\n                    idx[i * n_candidates + c] = found[c].index;\n                }\n            }\n            return { dist, idx };\n        }\n\n        // The kernel is euclidean-only, so anything else falls back to the JS search below.\n        const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n        if (metric === euclidean) {\n            const row_len = 2 * n_candidates;\n            const out = new Float64Array(N * row_len);\n            let ok = true;\n            for (let start = 0; start < N && ok; start += KNN_BLOCK_ROWS) {\n                const end = Math.min(start + KNN_BLOCK_ROWS, N);\n                ok = wasmKnnBlock(X.values, N, D, n_candidates, out, start, end);\n            }\n            if (ok) {\n                for (let i = 0; i < N; ++i) {\n                    for (let c = 0; c < n_candidates; ++c) {\n                        dist[i * n_candidates + c] = out[i * row_len + c];\n                        idx[i * n_candidates + c] = out[i * row_len + n_candidates + c];\n                    }\n                }\n                return { dist, idx };\n            }\n        }\n\n        return this._find_candidates_js(X, n_candidates);\n    }\n\n    /**\n     * Exact neighbour search in JS, for a non-euclidean metric or when WASM is unavailable.\n     *\n     * @protected\n     * @param {Matrix} X\n     * @param {number} n_candidates\n     * @returns {{ dist: Float64Array; idx: Int32Array }}\n     */\n    _find_candidates_js(X, n_candidates) {\n        const N = this._N;\n        const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n        const dist = new Float64Array(N * n_candidates);\n        const idx = new Int32Array(N * n_candidates);\n        // Bounded max-heap, so the scan stays O(N log k) per row instead of sorting all of N.\n        const hd = new Float64Array(n_candidates);\n        const hi = new Int32Array(n_candidates);\n\n        for (let i = 0; i < N; ++i) {\n            const x_i = X.row(i);\n            let size = 0;\n            for (let j = 0; j < N; ++j) {\n                if (j === i) continue;\n                const v = metric(x_i, X.row(j));\n                if (size < n_candidates) {\n                    hd[size] = v;\n                    hi[size] = j;\n                    let c = size++;\n                    while (c > 0) {\n                        const p = (c - 1) >> 1;\n                        if (hd[p] >= hd[c]) break;\n                        const t = hd[p];\n                        hd[p] = hd[c];\n                        hd[c] = t;\n                        const u = hi[p];\n                        hi[p] = hi[c];\n                        hi[c] = u;\n                        c = p;\n                    }\n                } else if (v < hd[0]) {\n                    hd[0] = v;\n                    hi[0] = j;\n                    let p = 0;\n                    for (;;) {\n                        const l = 2 * p + 1;\n                        const r = l + 1;\n                        let m = p;\n                        if (l < n_candidates && hd[l] > hd[m]) m = l;\n                        if (r < n_candidates && hd[r] > hd[m]) m = r;\n                        if (m === p) break;\n                        const t = hd[p];\n                        hd[p] = hd[m];\n                        hd[m] = t;\n                        const u = hi[p];\n                        hi[p] = hi[m];\n                        hi[m] = u;\n                        p = m;\n                    }\n                }\n            }\n            if (size < n_candidates) {\n                throw new Error(\n                    `Only ${size} of the ${n_candidates} requested neighbors exist for element ${i}. ` +\n                        `Lower \"n_neighbors\".`,\n                );\n            }\n            const order = Array.from({ length: size }, (_, c) => c).sort((a, b) => hd[a] - hd[b]);\n            for (let c = 0; c < size; ++c) {\n                dist[i * n_candidates + c] = hd[order[c]];\n                idx[i * n_candidates + c] = hi[order[c]];\n            }\n        }\n        return { dist, idx };\n    }\n\n    /**\n     * Selects the NN pairs by rescaled distance.\n     *\n     * Each candidate distance is divided by the local scale of both endpoints — the mean distance\n     * to their 4th to 6th neighbors — before the top `n_neighbors` are taken. Without this the NN\n     * set is an ordinary KNN graph and dense regions dominate the attractive term.\n     *\n     * @protected\n     * @param {{ dist: Float64Array; idx: Int32Array }} candidates\n     * @param {number} n_candidates\n     * @param {number} n_neighbors\n     * @returns {Int32Array} Flat `[i, j, ...]` pairs.\n     */\n    _scaled_neighbors(candidates, n_candidates, n_neighbors) {\n        const N = this._N;\n        const { dist, idx } = candidates;\n\n        // sig is floored: coincident points otherwise give a zero scale and NaN distances.\n        const sig = new Float64Array(N);\n        for (let i = 0; i < N; ++i) {\n            const base = i * n_candidates;\n            let sum = 0;\n            let count = 0;\n            for (let c = 3; c < 6 && c < n_candidates; ++c) {\n                sum += dist[base + c];\n                ++count;\n            }\n            sig[i] = Math.max(count > 0 ? sum / count : 0, 1e-10);\n        }\n\n        const pairs = new Int32Array(N * n_neighbors * 2);\n        const scaled = new Float64Array(n_candidates);\n        const order = new Int32Array(n_candidates);\n        let p = 0;\n\n        for (let i = 0; i < N; ++i) {\n            const base = i * n_candidates;\n            for (let c = 0; c < n_candidates; ++c) {\n                const j = idx[base + c];\n                const dv = dist[base + c];\n                scaled[c] = (dv * dv) / (sig[i] * sig[j]);\n                order[c] = c;\n            }\n            order.sort((a, b) => scaled[a] - scaled[b]);\n            for (let c = 0; c < n_neighbors; ++c) {\n                pairs[p++] = i;\n                pairs[p++] = idx[base + order[c]];\n            }\n        }\n        return pairs;\n    }\n\n    /**\n     * Draws `n_samples` distinct indices, excluding `self` and everything in `reject`.\n     *\n     * @protected\n     * @param {number} n_samples\n     * @param {number} self\n     * @param {Int32Array | number[]} reject\n     * @param {Int32Array} out - Receives the sample; must hold `n_samples`.\n     * @returns {number} How many were drawn, short of `n_samples` only if the pool is exhausted.\n     */\n    _sample_excluding(n_samples, self, reject, out) {\n        const N = this._N;\n        const randomizer = this._randomizer;\n        let count = 0;\n        for (let s = 0; s < n_samples; ++s) {\n            // The reference retries without limit, which hangs if the pool cannot supply enough\n            // distinct points. Bounded here and reported short instead; callers use what they get.\n            let attempts = 0;\n            for (; attempts < 1000; ++attempts) {\n                const j = Math.floor(randomizer.random * N);\n                if (j === self || j >= N) continue;\n                let taken = false;\n                for (let c = 0; c < count && !taken; ++c) if (out[c] === j) taken = true;\n                for (let c = 0; c < reject.length && !taken; ++c) if (reject[c] === j) taken = true;\n                if (taken) continue;\n                out[count++] = j;\n                break;\n            }\n            if (attempts >= 1000) break;\n        }\n        return count;\n    }\n\n    /**\n     * Samples mid-near pairs: for each point, six random draws from the whole dataset, of which the\n     * second closest is kept. Sampling globally rather than from the neighbour list is what makes\n     * these pairs \"mid-near\" and is the mechanism behind PaCMAP's global structure in phase 1.\n     *\n     * @protected\n     * @param {Matrix} X\n     * @param {number} n_MN\n     * @returns {Int32Array} Flat `[i, j, ...]` pairs.\n     */\n    _sample_mn_pairs(X, n_MN) {\n        const N = this._N;\n        const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n        const pairs = new Int32Array(N * n_MN * 2);\n        const picked = new Int32Array(n_MN);\n        const sampled = new Int32Array(6);\n        const dists = new Float64Array(6);\n        let p = 0;\n\n        for (let i = 0; i < N; ++i) {\n            const x_i = X.row(i);\n            let n_picked = 0;\n            for (let m = 0; m < n_MN; ++m) {\n                const reject = n_picked > 0 ? picked.subarray(0, n_picked) : EMPTY;\n                const got = this._sample_excluding(6, i, reject, sampled);\n                if (got < 2) continue;\n                for (let c = 0; c < got; ++c) dists[c] = metric(x_i, X.row(sampled[c]));\n                // Second closest of the draw: drop the nearest, take the nearest of the rest.\n                let best = 0;\n                for (let c = 1; c < got; ++c) if (dists[c] < dists[best]) best = c;\n                let second = -1;\n                for (let c = 0; c < got; ++c) {\n                    if (c === best) continue;\n                    if (second < 0 || dists[c] < dists[second]) second = c;\n                }\n                picked[n_picked++] = sampled[second];\n                pairs[p++] = i;\n                pairs[p++] = sampled[second];\n            }\n        }\n        return pairs.slice(0, p);\n    }\n\n    /**\n     * Samples further pairs: random points that are not among `i`'s neighbors.\n     *\n     * @protected\n     * @param {Int32Array} nn_pairs\n     * @param {number} n_neighbors\n     * @param {number} n_FP\n     * @returns {Int32Array} Flat `[i, j, ...]` pairs.\n     */\n    _sample_fp_pairs(nn_pairs, n_neighbors, n_FP) {\n        const N = this._N;\n        const pairs = new Int32Array(N * n_FP * 2);\n        const reject = new Int32Array(n_neighbors);\n        const drawn = new Int32Array(n_FP);\n        let p = 0;\n\n        for (let i = 0; i < N; ++i) {\n            for (let c = 0; c < n_neighbors; ++c) reject[c] = nn_pairs[(i * n_neighbors + c) * 2 + 1];\n            const got = this._sample_excluding(n_FP, i, reject, drawn);\n            for (let c = 0; c < got; ++c) {\n                pairs[p++] = i;\n                pairs[p++] = drawn[c];\n            }\n        }\n        return pairs.slice(0, p);\n    }\n\n    /**\n     * Accumulates the gradient of one pair type into `grad_flat`.\n     *\n     * All three losses share the form `w * f(d_ij)` with `d_ij = 1 + ||y_i - y_j||²`, so one loop\n     * covers them: the attractive pairs use `d_ij / (a + d_ij)` and the repulsive ones\n     * `1 / (1 + d_ij)`, which is the same denominator with `a = 1` and the sign flipped.\n     *\n     * `Y` is indexed flat rather than through `Matrix.row`, which would allocate a subarray per\n     * endpoint — two per pair, tens of millions per run, and by far the dominant cost of a step.\n     *\n     * @protected\n     * @param {Float64Array} grad_flat - Flat N ⨯ d gradient accumulator, modified in place.\n     * @param {Int32Array} pairs - Flat `[i, j, ...]` pair array.\n     * @param {number} w - Weight for this pair type.\n     * @param {number} a - Denominator constant: 10 for NN, 10000 for MN, 1 for FP.\n     * @param {boolean} repulsive\n     */\n    _accumulate_gradients(grad_flat, pairs, w, a, repulsive) {\n        if (w === 0) return;\n        const Yv = this.Y.values;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const n_pairs = pairs.length / 2;\n        const sign = repulsive ? -1 : 1;\n\n        for (let p = 0; p < n_pairs; ++p) {\n            const base_i = pairs[p * 2] * d;\n            const base_j = pairs[p * 2 + 1] * d;\n\n            let sq_dist = 0;\n            for (let k = 0; k < d; ++k) {\n                const diff = Yv[base_i + k] - Yv[base_j + k];\n                sq_dist += diff * diff;\n            }\n            const denom = a + 1 + sq_dist;\n            const coeff = (sign * w * 2 * a) / (denom * denom);\n\n            for (let k = 0; k < d; ++k) {\n                const g = coeff * (Yv[base_i + k] - Yv[base_j + k]);\n                grad_flat[base_i + k] += g;\n                grad_flat[base_j + k] -= g;\n            }\n        }\n    }\n\n    /**\n     * Returns the weight schedule for the current iteration.\n     *\n     * @protected\n     * @param {number} iter - Current iteration (0-indexed)\n     * @returns {{ w_nn: number; w_mn: number; w_fp: number }}\n     */\n    _get_weights(iter) {\n        const num_iters = /** @type {number[]} */ (this.parameter(\"num_iters\"));\n        const [p1, p2] = num_iters;\n        if (iter < p1) {\n            // Phase 1: MN weight linearly decays from 1000 to 3\n            const t = iter / p1;\n            return { w_nn: 2.0, w_mn: 1000.0 * (1 - t) + 3.0 * t, w_fp: 1.0 };\n        } else if (iter < p1 + p2) {\n            // Phase 2: fixed weights\n            return { w_nn: 3.0, w_mn: 3.0, w_fp: 1.0 };\n        } else {\n            // Phase 3: MN disabled\n            return { w_nn: 1.0, w_mn: 0.0, w_fp: 1.0 };\n        }\n    }\n\n    /**\n     * Applies Adam optimizer update to Y using accumulated gradients.\n     *\n     * @protected\n     * @param {Float64Array} grad_flat - Flat N ⨯ d gradient\n     */\n    _adam_update(grad_flat) {\n        const lr = /** @type {number} */ (this.parameter(\"lr\"));\n        const total = this._N * /** @type {number} */ (this.parameter(\"d\"));\n        const beta1 = 0.9;\n        const beta2 = 0.999;\n        this._adam_t = (this._adam_t ?? 0) + 1;\n        const t = /** @type {number} */ (this._adam_t);\n        // Bias correction folded into the step size, as in the reference, so `eps` keeps the same\n        // weight relative to `sqrt(v)` on every iteration.\n        const lr_t = (lr * Math.sqrt(1 - beta2 ** t)) / (1 - beta1 ** t);\n        const Yv = this.Y.values;\n        const m = /** @type {Float64Array} */ (this._adam_m);\n        const v = /** @type {Float64Array} */ (this._adam_v);\n\n        for (let i = 0; i < total; ++i) {\n            const g = grad_flat[i];\n            m[i] += (1 - beta1) * (g - m[i]);\n            v[i] += (1 - beta2) * (g * g - v[i]);\n            Yv[i] -= (lr_t * m[i]) / (Math.sqrt(v[i]) + 1e-7);\n        }\n    }\n\n    /**\n     * Initializes PaCMAP: preprocessing, PCA embedding, NN, MN and FP pairs, and Adam state.\n     *\n     * @returns {this}\n     */\n    init() {\n        const N = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const seed = /** @type {number} */ (this.parameter(\"seed\"));\n        const n_neighbors = /** @type {number} */ (this.parameter(\"n_neighbors\"));\n        const MN_ratio = /** @type {number} */ (this.parameter(\"MN_ratio\"));\n        const FP_ratio = /** @type {number} */ (this.parameter(\"FP_ratio\"));\n        const apply_pca = /** @type {boolean} */ (this.parameter(\"apply_pca\"));\n\n        // 1. Preprocessing. Above 100 dimensions the reference centers and reduces to 100; below it\n        // rescales to the unit range and centers. Neither is cosmetic: the loss constants 10, 10000\n        // and 1 are absolute, so an unnormalized input silently changes what \"near\" means.\n        let X_knn;\n        let pca_solution = false;\n        if (this._D > 100 && apply_pca) {\n            X_knn = /** @type {Matrix} */ (PCA.transform(this.X, { d: 100, seed }));\n            pca_solution = true;\n        } else {\n            X_knn = this.X.clone();\n            const v = X_knn.values;\n            let min = Infinity;\n            let max = -Infinity;\n            for (let i = 0; i < v.length; ++i) {\n                if (v[i] < min) min = v[i];\n                if (v[i] > max) max = v[i];\n            }\n            const range = max - min;\n            const scale = range > 0 ? 1 / range : 1;\n            for (let i = 0; i < v.length; ++i) v[i] = (v[i] - min) * scale;\n            const D = this._D;\n            for (let j = 0; j < D; ++j) {\n                let mean = 0;\n                for (let i = 0; i < N; ++i) mean += v[i * D + j];\n                mean /= N;\n                for (let i = 0; i < N; ++i) v[i * D + j] -= mean;\n            }\n        }\n        this._X_knn = X_knn;\n\n        // 2. PCA initialization scaled by 0.01.\n        const init_source = pca_solution ? X_knn : /** @type {Matrix} */ (PCA.transform(X_knn, { d, seed }));\n        this.Y = new Matrix(N, d, (i, j) => init_source.entry(i, j) * 0.01);\n\n        // 3. Pair construction. The 50 extra candidates are what the density rescaling re-ranks.\n        const n_candidates = Math.min(n_neighbors + 50, N - 1);\n        const candidates = this._find_candidates(X_knn, n_candidates);\n        this._nn_pairs = this._scaled_neighbors(candidates, n_candidates, n_neighbors);\n\n        const n_MN = Math.max(1, Math.round(n_neighbors * MN_ratio));\n        const n_FP = Math.max(1, Math.round(n_neighbors * FP_ratio));\n        this._mn_pairs = this._sample_mn_pairs(X_knn, n_MN);\n        this._fp_pairs = this._sample_fp_pairs(this._nn_pairs, n_neighbors, n_FP);\n\n        // 4. Adam optimizer state.\n        this._adam_m = new Float64Array(N * d);\n        this._adam_v = new Float64Array(N * d);\n        this._adam_t = 0;\n        this._grad = new Float64Array(N * d);\n\n        this._iter = 0;\n        this._is_initialized = true;\n        return this;\n    }\n\n    /**\n     * Accumulates the nearest-neighbor gradient for the current step.\n     *\n     * Split out from {@link next} because it is the only part of a step {@link LocalMAP} changes,\n     * and only in phase 3. Everything else — the mid-near and further terms, the Adam update, the\n     * iteration bookkeeping — is shared.\n     *\n     * @protected\n     * @param {Float64Array} grad_flat - Flat N ⨯ d gradient accumulator, modified in place.\n     * @param {number} w_nn\n     */\n    _accumulate_nn_gradients(grad_flat, w_nn) {\n        this._accumulate_gradients(grad_flat, /** @type {Int32Array} */ (this._nn_pairs), w_nn, 10, false);\n    }\n\n    /**\n     * Hook run after the embedding has been updated, with the iteration that just finished.\n     *\n     * Nothing to do here; {@link LocalMAP} redraws its further pairs from it.\n     *\n     * @protected\n     * @param {number} iter - The 0-indexed iteration that just completed.\n     */\n    _after_step(iter) {\n        void iter;\n    }\n\n    /**\n     * Performs one optimization step.\n     *\n     * @returns {Matrix}\n     */\n    next() {\n        if (!this._nn_pairs) throw new Error(\"Call init() first!\");\n        const iter = this._iter;\n        const { w_nn, w_mn, w_fp } = this._get_weights(iter);\n\n        const grad_flat = /** @type {Float64Array} */ (this._grad);\n        grad_flat.fill(0);\n        this._accumulate_nn_gradients(grad_flat, w_nn);\n        this._accumulate_gradients(grad_flat, /** @type {Int32Array} */ (this._mn_pairs), w_mn, 10000, false);\n        this._accumulate_gradients(grad_flat, /** @type {Int32Array} */ (this._fp_pairs), w_fp, 1, true);\n        this._adam_update(grad_flat);\n\n        this._iter++;\n        this._after_step(iter);\n        return this.Y;\n    }\n\n    /**\n     * @param {number} [iterations] - Total number of iterations. Defaults to sum of `num_iters`.\n     * @returns {T}\n     */\n    transform(iterations) {\n        const num_iters = /** @type {number[]} */ (this.parameter(\"num_iters\"));\n        const total = iterations ?? num_iters.reduce((a, b) => a + b, 0);\n        this.check_init();\n        for (let i = 0; i < total; ++i) {\n            this.next();\n        }\n        return this.projection;\n    }\n\n    /**\n     * @param {number} [iterations] - Total number of iterations. Defaults to sum of `num_iters`.\n     * @returns {Generator<T, T, void>}\n     */\n    *generator(iterations) {\n        const num_iters = /** @type {number[]} */ (this.parameter(\"num_iters\"));\n        const total = iterations ?? num_iters.reduce((a, b) => a + b, 0);\n        this.check_init();\n        for (let i = 0; i < total; ++i) {\n            this.next();\n            yield this.projection;\n        }\n        return this.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPaCMAP>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new PaCMAP(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPaCMAP>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new PaCMAP(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersPaCMAP>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new PaCMAP(X, parameters);\n        return dr.transform_async();\n    }\n}\n","import { PaCMAP } from \"./PaCMAP.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {Matrix} from \"../matrix/index.js\" */\n/** @import {ParametersLocalMAP} from \"./index.js\" */\n\n/**\n * LocalMAP\n *\n * A variant of {@link PaCMAP} that sharpens local cluster separation in phase 3. Attraction on the\n * nearest-neighbor pairs is scaled by `low_dist_thres / (2 * sqrt(d_ij))`, which strengthens it for\n * pairs already close in the embedding and weakens it for far ones, and the further pairs are\n * periodically redrawn from points that are *near* in the current embedding rather than staying the\n * random set chosen at initialization.\n *\n * @class\n * @template {InputType} T\n * @extends PaCMAP<T, ParametersLocalMAP>\n * @category Dimensionality Reduction\n * @see {@link https://arxiv.org/abs/2012.04456|PaCMAP Paper}\n * @see {@link PaCMAP} for the base algorithm\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 localmap = new druid.LocalMAP(X, {\n *     n_neighbors: 10,\n *     low_dist_thres: 10,\n *     seed: 42\n * });\n *\n * const Y = localmap.transform(); // 450 iterations (default)\n * // [[x1, y1], [x2, y2], [x3, y3]]\n */\nexport class LocalMAP extends PaCMAP {\n    /**\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersLocalMAP>} [parameters] - Object containing parameterization of the DR method.\n     */\n    constructor(X, parameters = {}) {\n        // `DR` seals `{ ...defaults, ...parameters }`, so the extra key has to be present here to\n        // survive; it cannot be added to the sealed object afterwards.\n        super(X, { low_dist_thres: 10, ...parameters });\n    }\n\n    /**\n     * The first iteration of phase 3, past which LocalMAP diverges from PaCMAP.\n     *\n     * The reference tests `itr > phase_1 + phase_2`, so the first phase 3 step still runs plain\n     * PaCMAP; this is that boundary, and \"after\" means strictly greater.\n     *\n     * @private\n     * @returns {number}\n     */\n    get _phase3_start() {\n        const num_iters = /** @type {number[]} */ (this.parameter(\"num_iters\"));\n        return num_iters[0] + num_iters[1];\n    }\n\n    /**\n     * Phases 1 and 2 attract exactly as PaCMAP does; phase 3 applies the local scaling.\n     *\n     * @protected\n     * @param {Float64Array} grad_flat\n     * @param {number} w_nn\n     */\n    _accumulate_nn_gradients(grad_flat, w_nn) {\n        if (this._iter <= this._phase3_start) return super._accumulate_nn_gradients(grad_flat, w_nn);\n        const low_dist_thres = /** @type {number} */ (this.parameter(\"low_dist_thres\"));\n        this._accumulate_gradients_local_nn(\n            grad_flat,\n            /** @type {Int32Array} */ (this._nn_pairs),\n            w_nn,\n            low_dist_thres / 2,\n        );\n    }\n\n    /**\n     * Redraws the further pairs every tenth iteration of phase 3.\n     *\n     * Runs after the embedding update, so the redraw sees the layout the step just produced, and\n     * is keyed on the iteration that finished — `itr % 10` in the reference is the loop variable,\n     * not the next one.\n     *\n     * @protected\n     * @param {number} iter\n     */\n    _after_step(iter) {\n        if (iter > this._phase3_start && iter % 10 === 0) {\n            this._resample_local_fp_pairs(/** @type {number} */ (this.parameter(\"low_dist_thres\")));\n        }\n    }\n\n    /**\n     * Accumulates NN gradients with LocalMAP's local scaling, `nn_scale / sqrt(d_ij)`.\n     *\n     * @protected\n     * @param {Float64Array} grad_flat - Flat N ⨯ d gradient accumulator, modified in place.\n     * @param {Int32Array} pairs - Flat `[i, j, ...]` pair array.\n     * @param {number} w_nn - NN weight.\n     * @param {number} nn_scale - `low_dist_thres / 2`.\n     */\n    _accumulate_gradients_local_nn(grad_flat, pairs, w_nn, nn_scale) {\n        if (w_nn === 0) return;\n        const Yv = this.Y.values;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const n_pairs = pairs.length / 2;\n\n        for (let p = 0; p < n_pairs; ++p) {\n            const base_i = pairs[p * 2] * d;\n            const base_j = pairs[p * 2 + 1] * d;\n\n            let sq_dist = 0;\n            for (let k = 0; k < d; ++k) {\n                const diff = Yv[base_i + k] - Yv[base_j + k];\n                sq_dist += diff * diff;\n            }\n            const d_ij = 1 + sq_dist;\n            const denom = 10 + d_ij;\n            const coeff = (w_nn * 20 * nn_scale) / (denom * denom * Math.sqrt(d_ij));\n\n            for (let k = 0; k < d; ++k) {\n                const g = coeff * (Yv[base_i + k] - Yv[base_j + k]);\n                grad_flat[base_i + k] += g;\n                grad_flat[base_j + k] -= g;\n            }\n        }\n    }\n\n    /**\n     * Redraws the further pairs from points within `low_dist_thres` of `i` in the embedding.\n     *\n     * A point that is far in the input but has drifted close in the embedding is exactly what the\n     * repulsive term needs to push apart, so sampling from the current layout rather than the\n     * original random set is what sharpens the cluster boundaries. Candidates that are already\n     * neighbors are rejected, and a row that finds nothing within the threshold keeps its old\n     * partner.\n     *\n     * @protected\n     * @param {number} low_dist_thres\n     */\n    _resample_local_fp_pairs(low_dist_thres) {\n        const N = this._N;\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const n_neighbors = /** @type {number} */ (this.parameter(\"n_neighbors\"));\n        const threshold_sq = low_dist_thres * low_dist_thres;\n        const nn_pairs = /** @type {Int32Array} */ (this._nn_pairs);\n        const fp_pairs = /** @type {Int32Array} */ (this._fp_pairs);\n        const n_FP = fp_pairs.length / 2 / N;\n        const Yv = this.Y.values;\n        const randomizer = this._randomizer;\n        const drawn = new Int32Array(n_FP);\n\n        for (let i = 0; i < N; ++i) {\n            const base_i = i * d;\n            for (let s = 0; s < n_FP; ++s) {\n                // -1 marks \"gave up\", and stays -1 through the rest of the row: the old partner\n                // that replaces it is substituted at write-out and so never blocks a later draw,\n                // which is what the reference's sentinel does.\n                drawn[s] = -1;\n                // Deliberate deviation: the reference's give-up counter is only reached by\n                // duplicate and neighbor rejections — a candidate rejected for being too far\n                // `continue`s past the check — so a point with nothing inside the threshold retries\n                // until it happens to draw 100 duplicates, which is unbounded work as N grows.\n                // Every draw counts here instead. Measured against the reference across\n                // low_dist_thres 1 to 40 on IRIS, the difference is under 3% on cluster separation.\n                for (let attempt = 0; attempt < 100; ++attempt) {\n                    const j = Math.floor(randomizer.random * N);\n                    if (j === i || j >= N) continue;\n\n                    let taken = false;\n                    for (let c = 0; c < s && !taken; ++c) if (drawn[c] === j) taken = true;\n                    for (let c = 0; c < n_neighbors && !taken; ++c) {\n                        if (nn_pairs[(i * n_neighbors + c) * 2 + 1] === j) taken = true;\n                    }\n                    if (taken) continue;\n\n                    const base_j = j * d;\n                    let sq_dist = 0;\n                    for (let k = 0; k < d; ++k) {\n                        const diff = Yv[base_i + k] - Yv[base_j + k];\n                        sq_dist += diff * diff;\n                    }\n                    if (sq_dist > threshold_sq) continue;\n\n                    drawn[s] = j;\n                    break;\n                }\n            }\n            for (let s = 0; s < n_FP; ++s) {\n                if (drawn[s] >= 0) fp_pairs[(i * n_FP + s) * 2 + 1] = drawn[s];\n            }\n        }\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLocalMAP>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new LocalMAP(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLocalMAP>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new LocalMAP(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersLocalMAP>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new LocalMAP(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 { spatial_tree } 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 = {}) {\n    init() {\n        const DR = MDS;\n        let DR_parameters = {};\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 = spatial_tree(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_by_index(i, K)) {\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 { spatial_tree } 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\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {ParametersLTSA} from \"./index.js\" */\n/** @import {KNN} from \"../knn/KNN.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                knn: null,\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 knn =\n            /** @type {KNN<number[] | Float64Array, any> | null} */ (this.parameter(\"knn\")) ??\n            spatial_tree(X.to2dArray(), { metric, seed: /** @type {number} */ (this.parameter(\"seed\")) });\n        const nN = [];\n        for (let row = 0; row < rows; ++row) {\n            const found = knn.search_by_index(row, neighbors);\n            if (found.length < neighbors) {\n                throw new Error(\n                    `The KNN index returned only ${found.length} of the ${neighbors} requested neighbors for element ${row}. ` +\n                        `Lower \"neighbors\", or use an index that recalls more candidates.`,\n                );\n            }\n            nN.push(found);\n        }\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.index)];\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 { HierarchicalClustering, KMeans } from \"../clustering/index.js\";\nimport { DisjointSet } from \"../datastructure/index.js\";\nimport { spatial_tree } 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 { minimum_spanning_tree } from \"../util/index.js\";\nimport { DR } from \"./DR.js\";\nimport { KKMDS } from \"./KKMDS.js\";\n\n/** @import {InputType} from \"../index.js\" */\n/** @import {Metric} from \"../metrics/index.js\" */\n/** @import {EigenArgs} from \"../linear_algebra/index.js\" */\n/** @import {ParametersMINFOTree} from \"./index.js\" */\n/** @import {WeightedEdge} from \"../util/minimum_spanning_tree.js\" */\n\n/** The golden ratio conjugate, the paper's shrinkage factor for intra-cluster edges. */\nconst ALPHA_GOLDEN = (Math.sqrt(5) - 1) / 2;\n\n/**\n * Minimum Information Trees (MINFO Trees)\n *\n * A visualization method for clustered high-dimensional data. It reads the cluster labels on a\n * k-nearest-neighbor graph as a q-state Potts model, weights the edges by an information-geometric\n * curvature derived from it, and keeps the minimum spanning tree of that weighted graph.\n *\n * {@link projection} returns 2D coordinates like any other method here, but the tree is the actual\n * output — read {@link edges} to draw it.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersMINFOTree>\n * @category Dimensionality Reduction\n * @see {@link https://doi.org/10.1109/ACCESS.2025.3602730}\n * @see {@link TopoMap} for another spanning-tree-based projection.\n */\nexport class MINFOTree extends DR {\n    /**\n     * Minimum Information Trees.\n     *\n     * @param {T} X - The high-dimensional data.\n     * @param {Partial<ParametersMINFOTree>} [parameters] - Object containing parameterization of the DR method.\n     * @see {@link https://doi.org/10.1109/ACCESS.2025.3602730}\n     */\n    constructor(X, parameters = {}) {\n        /** @type {ParametersMINFOTree} */\n        const defaults = {\n            k: -Infinity,\n            d: 2,\n            metric: euclidean,\n            clusters: -Infinity,\n            clustering: \"hierarchical\",\n            labels: null,\n            alpha: ALPHA_GOLDEN,\n            epsilon: 1e-3,\n            layout: \"kamada_kawai\",\n            iterations: 300,\n            seed: 1212,\n            eig_args: {},\n        };\n        super(X, defaults, parameters);\n\n        if (this._parameters.k === -Infinity) {\n            // k = ln(n), as in the paper's experiments and the author's reference implementation.\n            this.parameter(\"k\", Math.min(Math.max(2, Math.round(Math.log(this._N))), 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     * The edges of the Minimum Information Tree, as `[u, v, weight]` over row indices of `X`,\n     * ascending by weight. This is the method's real output — {@link projection} is one drawing of\n     * it.\n     *\n     * @returns {WeightedEdge[]}\n     */\n    get edges() {\n        this.check_init();\n        return /** @type {WeightedEdge[]} */ (this._edges);\n    }\n\n    /**\n     * The cluster label per point, whether supplied or computed in step 1.\n     *\n     * @returns {Int32Array} Labels, remapped to `0 … q-1`.\n     */\n    get labels() {\n        this.check_init();\n        return /** @type {Int32Array} */ (this._labels);\n    }\n\n    /**\n     * The information curvature `S_i` per point, normalised as the edge weighting uses it.\n     *\n     * @returns {Float64Array}\n     */\n    get curvature() {\n        this.check_init();\n        return /** @type {Float64Array} */ (this._curvature);\n    }\n\n    /**\n     * The maximum pseudo-likelihood estimate of the Potts inverse temperature.\n     *\n     * @returns {number}\n     */\n    get beta() {\n        this.check_init();\n        return /** @type {number} */ (this._beta);\n    }\n\n    /**\n     * Resolves the labels field: either the caller's, or the outcome of clustering `X`.\n     *\n     * Labels are remapped to a dense `0 … q-1` so they can index the Potts state vectors directly.\n     *\n     * @private\n     * @returns {Int32Array}\n     */\n    _make_labels() {\n        const N = this._N;\n        const supplied = this.parameter(\"labels\");\n        /** @type {ArrayLike<any>} */\n        let raw;\n\n        if (supplied != null) {\n            raw = /** @type {ArrayLike<any>} */ (supplied);\n            if (raw.length !== N) {\n                throw new Error(`labels has length ${raw.length}, but X has ${N} rows!`);\n            }\n        } else {\n            const clusters = /** @type {number} */ (this.parameter(\"clusters\"));\n            if (!(clusters >= 2)) {\n                // No default is defensible here. The paper's own limitations section stresses that\n                // the tree inherits whatever the clustering got wrong, so silently inventing a\n                // cluster count would bury the single most consequential choice in the method.\n                throw new Error(\n                    \"MINFOTree needs a labels field: pass `clusters` (>= 2) to cluster X, or `labels` to supply your own.\",\n                );\n            }\n            const clustering = /** @type {\"hierarchical\" | \"kmeans\"} */ (this.parameter(\"clustering\"));\n            const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n            if (clustering === \"kmeans\") {\n                const km = new KMeans(this.X, { K: clusters, metric, seed: this.parameter(\"seed\") });\n                raw = km.get_cluster_list();\n            } else {\n                // Ward is what the paper's experiments use.\n                const hc = new HierarchicalClustering(this.X, { linkage: \"ward\", metric });\n                raw = hc.get_cluster_list(this._dendrogram_cut(hc, clusters));\n            }\n        }\n\n        /** @type {Map<any, number>} */\n        const lookup = new Map();\n        const labels = new Int32Array(N);\n        for (let i = 0; i < N; ++i) {\n            const key = raw[i];\n            let id = lookup.get(key);\n            if (id === undefined) {\n                id = lookup.size;\n                lookup.set(key, id);\n            }\n            labels[i] = id;\n        }\n        this._q = lookup.size;\n        return labels;\n    }\n\n    /**\n     * Finds the distance threshold that cuts a dendrogram into exactly `k` clusters.\n     *\n     * {@link HierarchicalClustering.get_cluster_list} cuts at a height, not at a cluster count, so\n     * the height has to be recovered: breaking the `k - 1` tallest merges leaves `k` components, and\n     * any threshold between the `k`-th and `(k-1)`-th tallest does that. The midpoint is used so\n     * ties on either side cannot land the cut on the wrong number.\n     *\n     * Only `2 … N-1` is reachable this way. A dendrogram has `N-1` merges, and the traversal emits a\n     * cluster per subtree it stops at, never a bare leaf — so there is no height that separates all\n     * `N` points. Asking for more is rejected rather than approximated: cutting below every merge\n     * silently yields *one* cluster, the opposite of what was asked for.\n     *\n     * @private\n     * @param {HierarchicalClustering} hc\n     * @param {number} k - At least 2; {@link _make_labels} rejects anything smaller before this runs.\n     * @returns {number}\n     */\n    _dendrogram_cut(hc, k) {\n        if (!hc.root) throw new Error(\"Hierarchical clustering produced no dendrogram!\");\n        const heights = hc.root\n            .descendants()\n            .filter((node) => !node.isLeaf)\n            .map((node) => node.dist)\n            .sort((a, b) => a - b);\n        const M = heights.length;\n        if (k > M) {\n            throw new Error(\n                `clusters must be at most ${M} for ${this._N} points with hierarchical clustering; got ${k}. ` +\n                    `Use \\`clustering: \"kmeans\"\\` or pass \\`labels\\` for finer partitions.`,\n            );\n        }\n        return (heights[M - k] + heights[M - k + 1]) / 2;\n    }\n\n    /**\n     * Builds the symmetric k-nearest-neighbor graph, connected.\n     *\n     * The Potts model is defined over a neighborhood system and the layout needs finite pairwise\n     * distances, so a k-NNG that falls into several components would break both. When that happens\n     * the components are stitched together with the shortest edge between each pair, which is what\n     * the author's reference implementation achieves by unioning in a spanning tree of the complete\n     * graph.\n     *\n     * @private\n     * @returns {number[][]} Adjacency list.\n     */\n    _make_knn_graph() {\n        const N = this._N;\n        const k = /** @type {number} */ (this.parameter(\"k\"));\n        const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n        const tree = spatial_tree(this.X.to2dArray(), {\n            metric,\n            seed: /** @type {number} */ (this.parameter(\"seed\")),\n        });\n\n        /** @type {Set<number>[]} */\n        const adjacency = Array.from({ length: N }, () => new Set());\n        for (let i = 0; i < N; ++i) {\n            for (const neighbor of tree.search_by_index(i, k)) {\n                const j = neighbor.index;\n                if (j === i) continue;\n                adjacency[i].add(j);\n                adjacency[j].add(i);\n            }\n        }\n\n        this._connect_components(adjacency);\n        return adjacency.map((set) => [...set]);\n    }\n\n    /**\n     * Adds the fewest edges needed to make `adjacency` connected, preferring short ones.\n     *\n     * @private\n     * @param {Set<number>[]} adjacency - Mutated in place.\n     */\n    _connect_components(adjacency) {\n        const N = this._N;\n        const metric = /** @type {Metric} */ (this.parameter(\"metric\"));\n        /** @type {DisjointSet<number>} */\n        const components = new DisjointSet(Array.from({ length: N }, (_, i) => i));\n        for (let i = 0; i < N; ++i) {\n            for (const j of adjacency[i]) components.union(i, j);\n        }\n\n        const roots = new Set();\n        for (let i = 0; i < N; ++i) roots.add(components.find(i));\n        if (roots.size <= 1) return;\n\n        // Only now is the O(N²) scan worth it: find the closest pair of points between every two\n        // components, then span the components with those edges.\n        /** @type {Map<string, WeightedEdge>} */\n        const best = new Map();\n        for (let i = 0; i < N; ++i) {\n            const root_i = /** @type {number} */ (components.find(i));\n            const x_i = this.X.row(i);\n            for (let j = i + 1; j < N; ++j) {\n                const root_j = /** @type {number} */ (components.find(j));\n                if (root_i === root_j) continue;\n                const key = root_i < root_j ? `${root_i},${root_j}` : `${root_j},${root_i}`;\n                const dist = metric(x_i, this.X.row(j));\n                const current = best.get(key);\n                if (current === undefined || dist < current[2]) best.set(key, [i, j, dist]);\n            }\n        }\n\n        for (const [u, v] of minimum_spanning_tree([...best.values()], N)) {\n            adjacency[u].add(v);\n            adjacency[v].add(u);\n        }\n    }\n\n    /**\n     * Counts, for every vertex, how many of its neighbors carry each of the `q` labels.\n     *\n     * `U[i * q + l]` is `U_i(l)` in the paper.\n     *\n     * @private\n     * @param {number[][]} adjacency\n     * @returns {Float64Array}\n     */\n    _neighbor_counts(adjacency) {\n        const N = this._N;\n        const q = /** @type {number} */ (this._q);\n        const labels = /** @type {Int32Array} */ (this._labels);\n        const U = new Float64Array(N * q);\n        for (let i = 0; i < N; ++i) {\n            const offset = i * q;\n            for (const j of adjacency[i]) U[offset + labels[j]] += 1;\n        }\n        return U;\n    }\n\n    /**\n     * Gibbs weights `w_i(l) = exp(β ⋅ U_i(l))`, shifted to avoid overflow.\n     *\n     * Every quantity built from `w` here is a ratio of equally-weighted sums, so scaling the whole\n     * vector by `exp(-β ⋅ max_l U_i(l))` leaves φ and ψ untouched while keeping `exp` in range even\n     * for a large β on a dense neighborhood.\n     *\n     * @private\n     * @param {Float64Array} U\n     * @param {number} offset - Start of vertex `i`'s counts in `U`.\n     * @param {number} q\n     * @param {number} beta\n     * @param {Float64Array} out - Length `q` scratch buffer.\n     */\n    _gibbs_weights(U, offset, q, beta, out) {\n        let max_U = -Infinity;\n        for (let l = 0; l < q; ++l) {\n            if (U[offset + l] > max_U) max_U = U[offset + l];\n        }\n        for (let l = 0; l < q; ++l) out[l] = Math.exp(beta * (U[offset + l] - max_U));\n    }\n\n    /**\n     * Maximum pseudo-likelihood estimate of the inverse temperature β.\n     *\n     * Solves the pseudo-likelihood equation (3), which sets the observed energy equal to the\n     * expected energy:\n     *\n     * ```\n     * f(β) = Σ_i U_i(x_i) - Σ_i E_β[U_i] = 0\n     * ```\n     *\n     * `f` is the negative of a sum of variances, hence non-increasing, so plain bisection is enough\n     * and needs no derivatives — the same role Brent's method plays in the paper, without the extra\n     * machinery. `f(0) <= 0` means the labels agree with their neighborhoods no better than chance,\n     * which leaves β = 0 as the estimate.\n     *\n     * @private\n     * @param {Float64Array} U\n     * @returns {number}\n     */\n    _estimate_beta(U) {\n        const N = this._N;\n        const q = /** @type {number} */ (this._q);\n        const labels = /** @type {Int32Array} */ (this._labels);\n        const w = new Float64Array(q);\n\n        let observed = 0;\n        for (let i = 0; i < N; ++i) observed += U[i * q + labels[i]];\n\n        /** @param {number} beta */\n        const f = (beta) => {\n            let expected = 0;\n            for (let i = 0; i < N; ++i) {\n                const offset = i * q;\n                this._gibbs_weights(U, offset, q, beta, w);\n                let sum_w = 0;\n                let sum_Uw = 0;\n                for (let l = 0; l < q; ++l) {\n                    sum_w += w[l];\n                    sum_Uw += U[offset + l] * w[l];\n                }\n                expected += sum_Uw / sum_w;\n            }\n            return observed - expected;\n        };\n\n        let lower = 0;\n        if (f(lower) <= 0) return lower;\n\n        let upper = 1;\n        // β above ~30 is numerically indistinguishable from the zero-temperature limit here.\n        while (upper < 32 && f(upper) > 0) upper *= 2;\n        if (f(upper) > 0) return upper;\n\n        for (let iter = 0; iter < 64; ++iter) {\n            const mid = (lower + upper) / 2;\n            if (f(mid) > 0) {\n                lower = mid;\n            } else {\n                upper = mid;\n            }\n            if (upper - lower < 1e-8) break;\n        }\n        return (lower + upper) / 2;\n    }\n\n    /**\n     * Information curvature `S_i = -ψ_i / φ_i` at every vertex, normalised to `(0, 1]`.\n     *\n     * The paper states φ (17) and ψ (23) as Kronecker products over `q ⨯ q` matrices, but both\n     * collapse: since summing every entry of `a ⊗ aᵀ` is just `(Σa)²`, the double sums reduce to\n     *\n     * ```\n     * φ_i = (Σ_l v_l w_l / Σ_l w_l)²                                  — squared observed/expected energy gap\n     * ψ_i = [(Σ_l U_l² w_l)(Σ_l w_l) - (Σ_l U_l w_l)²] / (Σ_l w_l)²   — the variance of U under w\n     * ```\n     *\n     * which is O(q) per vertex instead of O(q²), and allocates nothing.\n     *\n     * `epsilon` floors the denominator, following the author's reference implementation. It is load\n     * bearing: both φ and ψ vanish for an interior point as β grows, and by β ≈ 8 ψ has underflowed\n     * to exactly 0, so `S` is pinned at the top of the range rather than the bottom. That inverts the\n     * interior/boundary reading in §VI-C for anything above β ≈ 2, which well-separated clusters\n     * comfortably exceed. The formulas are implemented as published in either regime; see\n     * `docs/dimred/minfotree.md` for the measurements.\n     *\n     * @private\n     * @param {Float64Array} U\n     * @param {number} beta\n     * @returns {Float64Array}\n     */\n    _information_curvature(U, beta) {\n        const N = this._N;\n        const q = /** @type {number} */ (this._q);\n        const labels = /** @type {Int32Array} */ (this._labels);\n        const w = new Float64Array(q);\n        const S = new Float64Array(N);\n        const EPSILON = /** @type {number} */ (this.parameter(\"epsilon\"));\n\n        for (let i = 0; i < N; ++i) {\n            const offset = i * q;\n            this._gibbs_weights(U, offset, q, beta, w);\n\n            const U_xi = U[offset + labels[i]];\n            let sum_w = 0;\n            let sum_Uw = 0;\n            let sum_UUw = 0;\n            let sum_vw = 0;\n            for (let l = 0; l < q; ++l) {\n                const U_l = U[offset + l];\n                const w_l = w[l];\n                sum_w += w_l;\n                sum_Uw += U_l * w_l;\n                sum_UUw += U_l * U_l * w_l;\n                sum_vw += (U_xi - U_l) * w_l;\n            }\n\n            const mean_v = sum_vw / sum_w;\n            const phi = mean_v * mean_v;\n            const psi = (sum_UUw * sum_w - sum_Uw * sum_Uw) / (sum_w * sum_w);\n            S[i] = -psi / (phi + EPSILON);\n        }\n\n        let min = Infinity;\n        let max = -Infinity;\n        for (let i = 0; i < N; ++i) {\n            if (S[i] < min) min = S[i];\n            if (S[i] > max) max = S[i];\n        }\n        const range = max - min;\n        for (let i = 0; i < N; ++i) {\n            S[i] = range > 0 ? EPSILON + (S[i] - min) / range : EPSILON;\n        }\n        return S;\n    }\n\n    /**\n     * All-pairs shortest paths over the Minimum Information Tree.\n     *\n     * A tree has exactly one path between any two vertices, so a depth-first walk from each source\n     * settles every distance in O(N) — no priority queue and no relaxation, unlike the Dijkstra\n     * {@link ISOMAP} needs on its general k-NNG.\n     *\n     * @private\n     * @param {WeightedEdge[]} edges\n     * @returns {Matrix}\n     */\n    _tree_distances(edges) {\n        const N = this._N;\n        /** @type {[number, number][][]} */\n        const adjacency = Array.from({ length: N }, () => []);\n        for (const [u, v, weight] of edges) {\n            adjacency[u].push([v, weight]);\n            adjacency[v].push([u, weight]);\n        }\n\n        const D = new Matrix(N, N, 0);\n        const stack = new Int32Array(N);\n        const visited = new Uint8Array(N);\n        for (let source = 0; source < N; ++source) {\n            visited.fill(0);\n            visited[source] = 1;\n            stack[0] = source;\n            let top = 1;\n            while (top > 0) {\n                const u = stack[--top];\n                const dist_u = D.entry(source, u);\n                for (const [v, weight] of adjacency[u]) {\n                    if (visited[v]) continue;\n                    visited[v] = 1;\n                    D.set_entry(source, v, dist_u + weight);\n                    stack[top++] = v;\n                }\n            }\n        }\n        return D;\n    }\n\n    /** Runs steps 1-5: labels, k-NNG, β, curvature, information graph and its spanning tree. */\n    init() {\n        const alpha = /** @type {number} */ (this.parameter(\"alpha\"));\n\n        this._labels = this._make_labels();\n        const adjacency = this._make_knn_graph();\n        const U = this._neighbor_counts(adjacency);\n        this._beta = this._estimate_beta(U);\n        this._curvature = this._information_curvature(U, this._beta);\n\n        const S = this._curvature;\n        const labels = this._labels;\n        /** @type {WeightedEdge[]} */\n        const information_graph = [];\n        for (let u = 0; u < this._N; ++u) {\n            for (const v of adjacency[u]) {\n                if (v <= u) continue;\n                const weight = S[u] + S[v];\n                information_graph.push([u, v, labels[u] === labels[v] ? alpha * weight : weight]);\n            }\n        }\n\n        this._edges = minimum_spanning_tree(information_graph, this._N);\n        this._is_initialized = true;\n        return this;\n    }\n\n    /**\n     * Computes the projection.\n     *\n     * @returns {T}\n     */\n    transform() {\n        this.check_init();\n        const d = /** @type {number} */ (this.parameter(\"d\"));\n        const layout = /** @type {\"kamada_kawai\" | \"MDS\"} */ (this.parameter(\"layout\"));\n\n        const D = this._tree_distances(/** @type {WeightedEdge[]} */ (this._edges));\n        const kkmds = new KKMDS(D, {\n            d,\n            metric: \"precomputed\",\n            init_DR: \"MDS\",\n            // `layout: \"MDS\"` stops at the classical-MDS warm start, which is what zero gradient\n            // steps leaves behind.\n            iterations: layout === \"MDS\" ? 0 : /** @type {number} */ (this.parameter(\"iterations\")),\n            seed: /** @type {number} */ (this.parameter(\"seed\")),\n        });\n        kkmds.transform();\n        this.Y = kkmds.Y;\n\n        return this.projection;\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     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersMINFOTree>} [parameters]\n     * @returns {T}\n     */\n    static transform(X, parameters) {\n        const dr = new MINFOTree(X, parameters);\n        return dr.transform();\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersMINFOTree>} [parameters]\n     * @returns {Generator<T, T, void>}\n     */\n    static *generator(X, parameters) {\n        const dr = new MINFOTree(X, parameters);\n        yield* dr.generator();\n        return dr.projection;\n    }\n\n    /**\n     * @template {InputType} T\n     * @param {T} X\n     * @param {Partial<ParametersMINFOTree>} [parameters]\n     * @returns {Promise<T>}\n     */\n    static async transform_async(X, parameters) {\n        const dr = new MINFOTree(X, parameters);\n        return dr.transform_async();\n    }\n}\n","/**\n * WASM wrappers for the `SAMMON` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `SAMMON.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { copy_once, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Sammon mapping single iteration gradient step using WASM SIMD.\n *\n * Buffers persist across calls, so the N ⨯ N distance matrix is copied in only on the first\n * iteration of a run. The caller must pass the same `D_val` array every iteration; see\n * {@link copy_once}. The gradient buffer is scratch the kernel fills before reading, so JS neither\n * provides nor receives it.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} D_val - Constant for the run; copied on first use only.\n * @param {number} n\n * @param {number} dim\n * @param {number} magic\n * @returns {boolean}\n */\nexport function wasmSammonStep(Y_val, D_val, n, dim, magic) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    const s = get_session(inst, exports, \"sammon\", {\n        Y: Y_val.byteLength,\n        D: D_val.byteLength,\n        grad: n * dim * 8,\n    });\n    const { Y, D, grad } = s.ptrs;\n\n    copy_once(exports, s, \"D\", D_val);\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n\n    exports.sammon_step_f64(Y, D, grad, n, dim, magic);\n\n    Y_val.set(new Float64Array(memory.buffer, Y, Y_val.length));\n    return true;\n}\n","import { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { WASM_MIN_ROWS } from \"../wasm/thresholds.js\";\nimport { DR } from \"./DR.js\";\nimport { MDS, PCA } from \"./index.js\";\nimport { wasmSammonStep } from \"./SAMMON.wasm.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 * A given `seed` reproduces a layout exactly within one engine and library build, but not across\n * browsers or Node versions: the gradient step is chaotic, so a last-bit difference grows into a\n * visibly different — though equally valid — layout. See {@link DR} for why, and {@link SMACOF}\n * for a stable alternative.\n *\n * @class\n * @template {InputType} T\n * @extends DR<T, ParametersSAMMON<AvailableInit>>\n * @category Dimensionality Reduction\n */\nexport class SAMMON extends DR {\n    /** @protected */\n    get _wasm_session_keys() {\n        return [\"sammon\"];\n    }\n\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        try {\n            for (let j = 0; j < max_iter; ++j) {\n                this._step();\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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        try {\n            for (let j = 0; j < max_iter; ++j) {\n                this._step();\n                yield this.projection;\n            }\n\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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        // The kernel holds its own gradient scratch between iterations, so `G` is built only for\n        // the JS path below rather than allocated per iteration regardless of which path runs.\n        if (N >= WASM_MIN_ROWS) {\n            if (wasmSammonStep(Y.values, D.values, N, d, MAGIC)) {\n                return Y;\n            }\n        }\n\n        const G = new Matrix(N, d, 0);\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","/**\n * WASM wrappers for the `SQDMDS` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `SQDMDS.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { alloc, copy_once, free_all, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Computes SQDMDS quartet gradients in WASM SIMD.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} X_val\n * @param {Uint32Array} quartets_val\n * @param {Float64Array} grads_val\n * @param {number} n\n * @param {number} d_ld\n * @param {number} d_hd\n * @param {boolean} use_exaggeration\n * @param {boolean} is_precomputed\n * @returns {boolean}\n */\nexport function wasmSqdmdsFillGrads(\n    Y_val,\n    X_val,\n    quartets_val,\n    grads_val,\n    n,\n    d_ld,\n    d_hd,\n    use_exaggeration,\n    is_precomputed,\n) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    const num_quartets = quartets_val.length / 4;\n\n    const s = get_session(inst, exports, \"sqdmds_fill_grads\", {\n        Y: Y_val.byteLength,\n        X: X_val.byteLength,\n        quartets: quartets_val.byteLength,\n        grads: grads_val.byteLength,\n    });\n    const { Y, X, quartets, grads } = s.ptrs;\n\n    // The high-dimensional data is fixed for the run; the quartets are resampled every iteration.\n    copy_once(exports, s, \"X\", X_val);\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n    new Int32Array(memory.buffer, quartets, quartets_val.length).set(quartets_val);\n\n    exports.sqdmds_fill_grads_f64(Y, X, quartets, num_quartets, grads, n, d_ld, d_hd, use_exaggeration, is_precomputed);\n\n    grads_val.set(new Float64Array(memory.buffer, grads, grads_val.length));\n    return true;\n}\n\n/**\n * Range-based SQDMDS quartet gradient calculation for multi-threaded worker execution.\n *\n * Unlike the other range kernels, a quartet range does not map to a slice of the output: each\n * quartet scatters gradient into the four arbitrary rows it names, so two ranges generally touch\n * overlapping rows. They therefore cannot share one output buffer the way `wasmMatMulRange` and\n * friends do. `grads_val` instead receives the *whole* gradient produced by quartets\n * `[start_q, end_q)` alone, and a caller splitting the quartets across workers sums the partials\n * elementwise — which is exact, since the gradient is a sum over quartets to begin with.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} X_val\n * @param {Uint32Array} quartets_val\n * @param {Float64Array} grads_val - Receives the partial gradient over `[start_q, end_q)`.\n * @param {number} n\n * @param {number} d_ld\n * @param {number} d_hd\n * @param {boolean} use_exaggeration\n * @param {boolean} is_precomputed\n * @param {number} start_q\n * @param {number} end_q\n * @returns {boolean}\n */\nexport function wasmSqdmdsFillGradsRange(\n    Y_val,\n    X_val,\n    quartets_val,\n    grads_val,\n    n,\n    d_ld,\n    d_hd,\n    use_exaggeration,\n    is_precomputed,\n    start_q,\n    end_q,\n) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n    const memory = exports.memory;\n\n    const num_quartets = quartets_val.length / 4;\n\n    /** @type {number[]} */\n    const ptrs = [];\n    try {\n        const ptrY = alloc(exports, ptrs, Y_val.byteLength);\n        const ptrX = alloc(exports, ptrs, X_val.byteLength);\n        const ptrQ = alloc(exports, ptrs, quartets_val.byteLength);\n        const ptrG = alloc(exports, ptrs, grads_val.byteLength);\n\n        new Float64Array(memory.buffer, ptrY, Y_val.length).set(Y_val);\n        new Float64Array(memory.buffer, ptrX, X_val.length).set(X_val);\n        new Int32Array(memory.buffer, ptrQ, quartets_val.length).set(quartets_val);\n        // `sqdmds_fill_grads_range_f64` accumulates into `ptrG` without zeroing it first — that is\n        // deliberate, so several ranges can build one gradient — which makes zeroing the caller's\n        // job. `sqdmds_fill_grads_f64` does it inside WASM before delegating here; on this path the\n        // wrapper is the caller and owns it. `allocate` is `heap.alloc`, which hands back recycled\n        // blocks as-is, so without this the partial carries whatever the last allocation left.\n        new Float64Array(memory.buffer, ptrG, grads_val.length).fill(0);\n\n        exports.sqdmds_fill_grads_range_f64(\n            ptrY,\n            ptrX,\n            ptrQ,\n            num_quartets,\n            ptrG,\n            n,\n            d_ld,\n            d_hd,\n            use_exaggeration,\n            is_precomputed,\n            start_q,\n            end_q,\n        );\n\n        grads_val.set(new Float64Array(memory.buffer, ptrG, grads_val.length));\n        return true;\n    } finally {\n        free_all(exports, ptrs);\n    }\n}\n\n/**\n * Applies SQDMDS Nesterov momentum update and updates embedding Y in WASM SIMD.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} M_val\n * @param {Float64Array} Grads_val\n * @param {number} n\n * @param {number} d\n * @param {number} lr\n * @returns {boolean}\n */\nexport function wasmSqdmdsNestrovStep(Y_val, M_val, Grads_val, n, d, lr) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    // Every operand here is per-iteration state and all of it is N ⨯ d, so nothing can be skipped;\n    // the session only saves the allocate/free pair on each of the three buffers.\n    const s = get_session(inst, exports, \"sqdmds_nestrov\", {\n        Y: Y_val.byteLength,\n        M: M_val.byteLength,\n        grads: Grads_val.byteLength,\n    });\n    const { Y, M, grads } = s.ptrs;\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n    new Float64Array(memory.buffer, M, M_val.length).set(M_val);\n    new Float64Array(memory.buffer, grads, Grads_val.length).set(Grads_val);\n\n    exports.sqdmds_nestrov_step_f64(Y, M, grads, n, d, lr);\n\n    Y_val.set(new Float64Array(memory.buffer, Y, Y_val.length));\n    M_val.set(new Float64Array(memory.buffer, M, M_val.length));\n    return true;\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\";\nimport { wasmSqdmdsFillGrads, wasmSqdmdsNestrovStep } from \"./SQDMDS.wasm.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    /** @protected */\n    get _wasm_session_keys() {\n        return [\"sqdmds_fill_grads\", \"sqdmds_nestrov\"];\n    }\n\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        // Scratch buffer handed to the WASM kernel. The quartet count only depends on `N`, so it is\n        // allocated once here rather than per iteration.\n        /** @type {Uint32Array} */\n        this._flat_quartets = new Uint32Array(N - (N % 4));\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        try {\n            for (let i = 0; i < iterations; ++i) {\n                this._step(i, iterations);\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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        try {\n            for (let i = 0; i < iterations; ++i) {\n                this._step(i, iterations);\n                yield this.projection;\n            }\n\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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 || !this._flat_quartets)\n            throw new Error(\"Call init() first!\");\n        const LR = this._LR;\n        const [n, d] = this.Y.shape;\n        const d_hd = this.X.shape[1];\n        const is_precomputed = this.parameter(\"metric\") === \"precomputed\";\n\n        // Drawn exactly once per iteration. `__quartets` consumes the seeded randomizer, so drawing\n        // separately for the WASM and the JS path would advance the RNG at different rates and make\n        // the two paths diverge for the same seed.\n        const quartets = this.__quartets();\n        const flatQuartets = this._flat_quartets;\n        for (let q = 0; q < quartets.length; ++q) {\n            flatQuartets.set(quartets[q], q * 4);\n        }\n\n        // Try WASM Nesterov iteration\n        const Y_next = this.Y.add(this._momentums.mult(0.99, { inline: true }));\n        if (\n            wasmSqdmdsFillGrads(\n                Y_next.values,\n                this.X.values,\n                flatQuartets,\n                this._grads.values,\n                n,\n                d,\n                d_hd,\n                distance_exaggeration,\n                is_precomputed,\n            ) &&\n            wasmSqdmdsNestrovStep(this.Y.values, this._momentums.values, this._grads.values, n, d, LR)\n        ) {\n            return;\n        }\n\n        // JS fallback\n        const momentums = this._momentums;\n        const grads = this._fill_MDS_grads(Y_next, this._grads, distance_exaggeration, true, quartets);\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        }\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     * @param {Uint32Array[]} [quartets] - Quartets to accumulate over. Pass the ones already drawn for this\n     *   iteration; omitting them draws a fresh set, which advances the seeded randomizer.\n     * @returns {Matrix} The gradients.\n     */\n    _fill_MDS_grads(Y, grads, exaggeration = false, zero_grad = true, quartets = this.__quartets()) {\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        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 { distance_matrix, Matrix } from \"../matrix/index.js\";\nimport { euclidean } from \"../metrics/index.js\";\nimport { minimum_spanning_tree } 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 {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    }\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        // Local to the spanning tree construction: the N ⨯ N distances are only needed to weight the\n        // edges below, so they are not kept alive on the instance after `transform` returns.\n        const D =\n            /** @type {any} */ (metric) === \"precomputed\"\n                ? Matrix.from(this.X)\n                : distance_matrix(this.X, /** @type {Metric} */ (metric));\n\n        /** @type {[number, number, number][]} */\n        const E = [];\n        for (let i = 0; i < N; ++i) {\n            for (let j = i + 1; j < N; ++j) {\n                E.push([i, j, D.entry(i, j)]);\n            }\n        }\n\n        return minimum_spanning_tree(E, N);\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","/**\n * WASM wrappers for the `TriMap` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `TriMap.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { copy_once, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Computes TriMap triplet gradients in WASM SIMD.\n *\n * Buffers persist across calls, so the triplet list and their weights are copied in only once per\n * run. They are the largest operands here — there are far more triplets than points — and `init()`\n * builds both once, so the caller must pass the same arrays every iteration; see {@link copy_once}.\n * `Y` and `grad` are rebuilt by the caller each iteration and are copied as before.\n *\n * @param {Float64Array} Y_val\n * @param {Int32Array} triplets_val - Constant for the run; copied on first use only.\n * @param {Float64Array} weights_val - Constant for the run; copied on first use only.\n * @param {Float64Array} grad_val\n * @param {number} n\n * @param {number} dim\n * @param {number} n_inliers\n * @param {number} n_outliers\n * @returns {number | null} Computed loss, or null if WASM is unavailable.\n */\nexport function wasmTriMapGrad(Y_val, triplets_val, weights_val, grad_val, n, dim, n_inliers, n_outliers) {\n    const inst = initWasm();\n    if (!inst) return null;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    const num_triplets = triplets_val.length / 3;\n\n    const s = get_session(inst, exports, \"trimap_grad\", {\n        Y: Y_val.byteLength,\n        triplets: triplets_val.byteLength,\n        weights: weights_val.byteLength,\n        grad: grad_val.byteLength,\n    });\n    const { Y, triplets, weights, grad } = s.ptrs;\n\n    copy_once(exports, s, \"triplets\", triplets_val);\n    copy_once(exports, s, \"weights\", weights_val);\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n\n    const loss = exports.trimap_grad_f64(Y, triplets, weights, grad, n, dim, num_triplets, n_inliers, n_outliers);\n\n    grad_val.set(new Float64Array(memory.buffer, grad, grad_val.length));\n    return loss;\n}\n\n/**\n * Applies TriMap embedding update in WASM SIMD.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} grad_val\n * @param {Float64Array} vel_val\n * @param {Float64Array} gain_val\n * @param {number} n\n * @param {number} dim\n * @param {number} gamma\n * @param {number} lr\n * @returns {boolean}\n */\nexport function wasmTriMapUpdate(Y_val, grad_val, vel_val, gain_val, n, dim, gamma, lr) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    // All four operands are per-iteration state and all are N ⨯ dim, so nothing can be skipped here;\n    // the session only saves the allocate/free pair on each buffer.\n    const s = get_session(inst, exports, \"trimap_update\", {\n        Y: Y_val.byteLength,\n        grad: grad_val.byteLength,\n        vel: vel_val.byteLength,\n        gain: gain_val.byteLength,\n    });\n    const { Y, grad, vel, gain } = s.ptrs;\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n    new Float64Array(memory.buffer, grad, grad_val.length).set(grad_val);\n    new Float64Array(memory.buffer, vel, vel_val.length).set(vel_val);\n    new Float64Array(memory.buffer, gain, gain_val.length).set(gain_val);\n\n    exports.trimap_update_f64(Y, grad, vel, gain, n, dim, gamma, lr);\n\n    Y_val.set(new Float64Array(memory.buffer, Y, Y_val.length));\n    vel_val.set(new Float64Array(memory.buffer, vel, vel_val.length));\n    gain_val.set(new Float64Array(memory.buffer, gain, gain_val.length));\n    return true;\n}\n","import { spatial_tree } 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\";\nimport { wasmTriMapGrad, wasmTriMapUpdate } from \"./TriMap.wasm.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 * The embedding starts as a heavily shrunk PCA projection. Every squared distance in the loss is\n * offset by 1, so an unscaled projection would swamp that term and flatten the gradients.\n */\nconst INIT_PCA_SCALE = 0.01;\n/** Random triplets carry a tenth of the weight of the neighbour-derived ones. */\nconst RAND_WEIGHT_SCALE = 0.1;\n/** Neighbours ranked beyond `n_inliers` that are still considered when sampling. */\nconst NUM_EXTRA_KNN = 50;\n/** Iteration after which the momentum switches from `INIT_MOMENTUM` to `FINAL_MOMENTUM`. */\nconst SWITCH_ITER_MOMENTUM = 250;\nconst INIT_MOMENTUM = 0.5;\nconst FINAL_MOMENTUM = 0.8;\n\n/**\n * Tempered logarithm with temperature `t`, which degrades to `Math.log` as `t` approaches 1.\n *\n * @param {number} x\n * @param {number} t - Temperature.\n * @returns {number}\n */\nfunction tempered_log(x, t) {\n    if (Math.abs(t - 1) < 1e-5) return Math.log(x);\n    return (1 / (1 - t)) * (x ** (1 - t) - 1);\n}\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    /** @protected */\n    get _wasm_session_keys() {\n        return [\"trimap_grad\", \"trimap_update\"];\n    }\n\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_temp: 0.5,\n                n_inliers: 12,\n                n_outliers: 4,\n                n_random: 3,\n                d: 2,\n                metric: euclidean,\n                lr: 0.1,\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 a KDTree or BallTree gets used, depending on the metric). 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 ?? /** @type {Matrix} */ (PCA.transform(X, { d, seed })).mult(INIT_PCA_SCALE);\n        this.knn = knn ?? spatial_tree(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        // Triplets are point indices held in a Float64 Matrix; the WASM kernel wants them as i32.\n        // They never change after init, so convert once instead of on every gradient step.\n        /** @type {Int32Array} */\n        this._triplets_int32 = Int32Array.from(triplets.values);\n        this.lr = /** @type {number} */ (this.parameter(\"lr\"));\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_temp = /** @type {number} */ (this._parameters.weight_temp);\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 + NUM_EXTRA_KNN, 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            // Excludes `i` itself and comes back closest first. Filtering on a zero distance instead\n            // would also drop genuine duplicates of `i`, which shifts every column that `sig` reads.\n            knn.search_by_index(i, n_extra).forEach((d, j) => {\n                nbrs.set_entry(i, j, d.index);\n                knn_distances.set_entry(i, j, d.distance);\n            });\n        }\n        // Scale parameter: the mean distance to the 3rd, 4th and 5th nearest neighbour. The\n        // reference reads columns 3..5 of a row that begins with the point itself at distance 0;\n        // these rows exclude it, so the same three neighbours sit one column earlier.\n        const sig = new Float64Array(N);\n        for (let i = 0; i < N; ++i) {\n            sig[i] = Math.max(\n                (knn_distances.entry(i, 2) + knn_distances.entry(i, 3) + knn_distances.entry(i, 4)) / 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.map((w) => RAND_WEIGHT_SCALE * w)]);\n        }\n        n_triplets = triplets.shape[0];\n\n        // Weights are log-ratios, so they are shifted to be non-negative rather than divided by\n        // their maximum, and then compressed with a tempered log.\n        let min_weight = Infinity;\n        for (let i = 0; i < n_triplets; ++i) {\n            if (Number.isNaN(weights[i])) weights[i] = 0;\n            if (weights[i] < min_weight) min_weight = weights[i];\n        }\n        for (let i = 0; i < n_triplets; ++i) {\n            weights[i] = tempered_log(1 + (weights[i] - min_weight), weight_temp);\n        }\n        return {\n            triplets: triplets,\n            weights: weights,\n        };\n    }\n\n    /**\n     * Calculates the log-similarity matrix P.\n     *\n     * Kept in log space: exponentiating here underflows to zero for anything but the closest\n     * neighbours, and every consumer either compares entries or takes their difference, both of\n     * which are order-preserving under the logarithm.\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 log-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 -(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                // `sort_indices` holds column offsets into `nbrs`, which already excludes `i`, so\n                // the j-th most similar neighbour is taken directly.\n                const sim = nbrs.entry(i, sort_indices[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            const p_out = -(outlier_distances[t] ** 2) / (sig[i] * sig[triplets.entry(t, 2)]);\n            // Both are log-similarities, so their ratio is the difference.\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 = -(metric(X.row(i), X.row(sim)) ** 2) / (sig[i] * sig[sim]);\n                let p_out = -(metric(X.row(i), X.row(out)) ** 2) / (sig[i] * sig[out]);\n\n                // The nearer of the pair has to play the inlier; comparing the logs orders them\n                // the same way comparing the similarities would.\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] = 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     * @returns {{ grad: Matrix; loss: number }} The gradient and the current loss.\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 || !this._triplets_int32)\n            throw new Error(\"Call init() first!\");\n        const [N, dim] = Y.shape;\n\n        const grad = new Matrix(N, dim, 0);\n        const loss = wasmTriMapGrad(\n            Y.values,\n            this._triplets_int32,\n            weights,\n            grad.values,\n            N,\n            dim,\n            n_inliers,\n            n_outliers,\n        );\n\n        if (loss !== null) {\n            return { grad, loss };\n        }\n\n        const n_triplets = triplets.shape[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 js_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            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            } 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            js_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: js_loss };\n    }\n\n    /**\n     * @param {number} max_iteration\n     * @returns {T}\n     */\n    transform(max_iteration = 400) {\n        this.check_init();\n        try {\n            for (let iter = 0; iter < max_iteration; ++iter) {\n                this._next(iter);\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\n    }\n\n    /**\n     * @param {number} max_iteration\n     * @returns {Generator<T, T, void>}\n     */\n    *generator(max_iteration = 400) {\n        this.check_init();\n        try {\n            for (let iter = 0; iter < max_iteration; ++iter) {\n                this._next(iter);\n                yield this.projection;\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\n    }\n\n    /**\n     * Does the iteration step.\n     *\n     * @private\n     * @param {number} iter\n     */\n    _next(iter) {\n        const gamma = iter > SWITCH_ITER_MOMENTUM ? FINAL_MOMENTUM : INIT_MOMENTUM;\n        const vel = this.vel;\n        const triplets = this.triplets;\n        if (!vel || !triplets || 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        // Reported per triplet, so the value does not scale with the triplet count.\n        this.C = loss / triplets.shape[0];\n        this.Y = this._update_embedding(Y, iter, grad);\n        // The delta-bar-delta optimizer adapts a per-coordinate gain, so the global learning rate\n        // is left alone; only the plain gradient-descent variants anneal it.\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 > SWITCH_ITER_MOMENTUM ? FINAL_MOMENTUM : INIT_MOMENTUM;\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\n        if (wasmTriMapUpdate(Y.values, grad.values, vel.values, gain.values, N, dim, gamma, lr)) {\n            return Y;\n        }\n\n        const min_gain = 0.01;\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","/**\n * WASM wrappers for the `TSNE` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `TSNE.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { copy_once, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Performs a single t-SNE iteration gradient and position update step via WASM.\n *\n * Buffers persist across calls, so `P` is copied in only on the first iteration of a run and the\n * N ⨯ N scratch buffers — which JS neither writes nor reads — are never copied at all. The caller\n * must therefore pass the same `P_val` array every iteration; a different array is detected and\n * recopied, but mutating one in place behind a stable identity is not. See {@link copy_once}.\n *\n * `Y`, `ystep` and `gains` are N ⨯ dim, small next to the N ⨯ N operands, and are still copied both\n * ways each call so that interleaved runs of the same size cannot read each other's state.\n *\n * @param {Float64Array} Y_val\n * @param {Float64Array} P_val - Constant for the run; copied on first use only.\n * @param {Float64Array} ystep_val\n * @param {Float64Array} gains_val\n * @param {number} n\n * @param {number} dim\n * @param {number} pmul\n * @param {number} epsilon\n * @param {number} momval\n * @returns {boolean} True if executed successfully via WASM.\n */\nexport function wasmTsneStep(Y_val, P_val, ystep_val, gains_val, n, dim, pmul, epsilon, momval) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    // Buffers backed by a JS array are sized from that array; only the pure scratch, which JS never\n    // sees, is sized from the kernel's own indexing.\n    const s = get_session(inst, exports, \"tsne\", {\n        Y: Y_val.byteLength,\n        P: P_val.byteLength,\n        Qu: n * n * 8,\n        Q: n * n * 8,\n        grad: n * dim * 8,\n        ystep: ystep_val.byteLength,\n        gains: gains_val.byteLength,\n    });\n    const { Y, P, Qu, Q, grad, ystep, gains } = s.ptrs;\n\n    copy_once(exports, s, \"P\", P_val);\n\n    // `memory.buffer` is re-read after the copies above: allocating can grow linear memory, which\n    // replaces the buffer and detaches every view onto the old one.\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, Y_val.length).set(Y_val);\n    new Float64Array(memory.buffer, ystep, ystep_val.length).set(ystep_val);\n    new Float64Array(memory.buffer, gains, gains_val.length).set(gains_val);\n\n    exports.tsne_step_f64(Y, P, Qu, Q, grad, ystep, gains, n, dim, pmul, epsilon, momval);\n\n    Y_val.set(new Float64Array(memory.buffer, Y, Y_val.length));\n    ystep_val.set(new Float64Array(memory.buffer, ystep, ystep_val.length));\n    gains_val.set(new Float64Array(memory.buffer, gains, gains_val.length));\n    return true;\n}\n","import { Matrix } from \"../matrix/index.js\";\nimport { euclidean_squared } from \"../metrics/index.js\";\nimport { isWasmAvailable } from \"../wasm/index.js\";\nimport { WASM_MIN_ROWS } from \"../wasm/thresholds.js\";\nimport { DR } from \"./DR.js\";\nimport { wasmTsneStep } from \"./TSNE.wasm.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    /** @protected */\n    get _wasm_session_keys() {\n        return [\"tsne\"];\n    }\n\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        try {\n            for (let i = 0; i < iterations; ++i) {\n                this.next();\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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        try {\n            for (let i = 0; i < iterations; ++i) {\n                this.next();\n                yield this.projection;\n            }\n            return this.projection;\n        } finally {\n            // Runs on completion and on early `return()` — which `for…of` issues when the consumer\n            // breaks. A consumer abandoning manual `next()` calls keeps the buffers, as before.\n            this._release_wasm();\n        }\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        const momval = iter < 250 ? 0.5 : 0.8;\n\n        // The kernel holds its own N ⨯ N scratch between iterations and never reads it from JS, so\n        // the WASM path allocates nothing here. It used to build two N ⨯ N matrices per iteration\n        // purely to hand over their sizes.\n        if (N >= WASM_MIN_ROWS && isWasmAvailable()) {\n            if (wasmTsneStep(Y.values, P.values, ystep.values, gains.values, N, dim, pmul, epsilon, momval)) {\n                return this.Y;\n            }\n        }\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","/**\n * WASM wrappers for the `UMAP` kernels.\n *\n * Each one copies its operands into linear memory, calls the kernel compiled from\n * `UMAP.as.ts`, and copies the result back, reporting failure so the caller can fall back to\n * its JS implementation. The shared runtime -- instance setup, allocation and the persistent\n * buffer sessions -- lives in `src/wasm/index.js`.\n *\n * @module\n */\n\nimport { copy_once, get_session, initWasm } from \"../wasm/index.js\";\n\n/**\n * Runs one UMAP SGD epoch: attractive forces over the active edges plus repulsive forces over their\n * negative samples.\n *\n * `negative_samples` holds the node indices drawn by the caller's seeded randomizer, in edge order —\n * the RNG stays in JS so both paths consume the identical sequence. `embedding`, `epoch_of_next_sample`\n * and `epoch_of_next_negative_sample` are updated in place.\n *\n * @param {Float64Array} embedding - The `n_points ⨯ dim` embedding, mutated in place.\n * @param {Int32Array} head - Edge source indices.\n * @param {Int32Array} tail - Edge target indices.\n * @param {Float32Array} epochs_per_sample\n * @param {Float32Array} epoch_of_next_sample - Mutated in place.\n * @param {Float32Array} epochs_per_negative_sample\n * @param {Float32Array} epoch_of_next_negative_sample - Mutated in place.\n * @param {Int32Array} negative_samples - Pre-drawn negative sample node indices.\n * @param {number} dim\n * @param {number} iter - Current epoch.\n * @param {number} a\n * @param {number} b\n * @param {number} gamma - Repulsion strength.\n * @param {number} alpha - Current learning rate.\n * @returns {boolean} True if successfully executed via WASM.\n */\nexport function wasmUmapOptimizeEpoch(\n    embedding,\n    head,\n    tail,\n    epochs_per_sample,\n    epoch_of_next_sample,\n    epochs_per_negative_sample,\n    epoch_of_next_negative_sample,\n    negative_samples,\n    dim,\n    iter,\n    a,\n    b,\n    gamma,\n    alpha,\n) {\n    const inst = initWasm();\n    if (!inst) return false;\n\n    /** @type {any} */\n    const exports = inst.exports;\n\n    // The edge list and the two per-sample schedules never change after `init()`, so they are copied\n    // once per run rather than once per epoch — four edge-sized arrays out of the eight.\n    // `epoch_of_next_*` cannot join them: the caller reads both every epoch to draw its negative\n    // samples, so they have to come back out.\n    const s = get_session(inst, exports, \"umap_epoch\", {\n        Y: embedding.byteLength,\n        head: head.byteLength,\n        tail: tail.byteLength,\n        eps: epochs_per_sample.byteLength,\n        eons: epoch_of_next_sample.byteLength,\n        epns: epochs_per_negative_sample.byteLength,\n        eonns: epoch_of_next_negative_sample.byteLength,\n    });\n    const { Y, head: ptrHead, tail: ptrTail, eps, eons, epns, eonns } = s.ptrs;\n\n    copy_once(exports, s, \"head\", head);\n    copy_once(exports, s, \"tail\", tail);\n    copy_once(exports, s, \"eps\", epochs_per_sample);\n    copy_once(exports, s, \"epns\", epochs_per_negative_sample);\n\n    // The negative sample count varies from epoch to epoch, so it gets its own slot: sharing one\n    // would resize the session every epoch and evict the four constants above. Capacity is rounded\n    // up to a power of two so the reallocation stops happening after the first few epochs.\n    const neg_bytes = Math.max(negative_samples.byteLength, 4);\n    const neg_capacity = 2 ** Math.ceil(Math.log2(neg_bytes));\n    const neg_session = get_session(inst, exports, \"umap_neg\", { neg: neg_capacity });\n    const ptrNeg = neg_session.ptrs.neg;\n\n    const memory = exports.memory;\n    new Float64Array(memory.buffer, Y, embedding.length).set(embedding);\n    new Float32Array(memory.buffer, eons, epoch_of_next_sample.length).set(epoch_of_next_sample);\n    new Float32Array(memory.buffer, eonns, epoch_of_next_negative_sample.length).set(epoch_of_next_negative_sample);\n    if (negative_samples.length > 0) {\n        new Int32Array(memory.buffer, ptrNeg, negative_samples.length).set(negative_samples);\n    }\n\n    exports.umap_optimize_epoch_f64(\n        Y,\n        ptrHead,\n        ptrTail,\n        eps,\n        eons,\n        epns,\n        eonns,\n        ptrNeg,\n        head.length,\n        negative_samples.length,\n        dim,\n        iter,\n        a,\n        b,\n        gamma,\n        alpha,\n    );\n\n    embedding.set(new Float64Array(memory.buffer, Y, embedding.length));\n    epoch_of_next_sample.set(new Float32Array(memory.buffer, eons, epoch_of_next_sample.length));\n    epoch_of_next_negative_sample.set(new Float32Array(memory.buffer, eonns, epoch_of_next_negative_sample.length));\n    return true;\n}\n","import { BallTree, KDTree, NaiveKNN, spatial_tree } 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 { isWasmAvailable } from \"../wasm/index.js\";\nimport { WASM_MIN_UMAP_EDGES } from \"../wasm/thresholds.js\";\nimport { DR } from \"./DR.js\";\nimport { wasmUmapOptimizeEpoch } from \"./UMAP.wasm.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 * A given `seed` reproduces an embedding exactly within one engine and library build, but not\n * across browsers or Node versions: the gradient descent is chaotic, so a last-bit difference\n * grows into a visibly different — though equally valid — layout. See {@link DR} for why.\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    /** @protected */\n    get _wasm_session_keys() {\n        return [\"umap_epoch\", \"umap_neg\"];\n    }\n\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> | KDTree<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 target = Math.log2(k);\n        const rhos = [];\n        const sigmas = [];\n        const X = this.X;\n        const N = X.shape[0];\n\n        /** @type {{ element: Float64Array; index: number; distance: number }[][]} */\n        const distances = [];\n        // Every index returns its results closest first, which is the order the code below relies\n        // on: `rho` reads the nearest non-zero distance off the front, and the degenerate branch\n        // reads the farthest off the back.\n        //\n        // `search_by_index` excludes the point itself, but UMAP's fuzzy set is defined over `k`\n        // entries *starting* at the point, so it is put back at the front — the `psum` loop below\n        // skips index 0, and `rho` needs the self entry filtered out by distance anyway.\n        for (let i = 0; i < N; ++i) {\n            const x_i = /** @type {Float64Array} */ (X.row(i));\n            distances.push([{ element: x_i, index: i, distance: 0 }, ...knn.search_by_index(i, k - 1)]);\n        }\n\n        // The grand mean of the whole kNN distance matrix, used by the degenerate `rho === 0`\n        // branch below. Computed once: it does not depend on `i`.\n        let total_distance = 0;\n        let total_count = 0;\n        for (const row of distances) {\n            for (const d of row) {\n                total_distance += d.distance;\n                ++total_count;\n            }\n        }\n        const mean_distances = total_count > 0 ? total_distance / total_count : 0;\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                // Starts at 1: the element itself sits at index 0 and is not part of the fuzzy set\n                // whose cardinality is being solved for.\n                for (let j = 1; j < search_result.length; ++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                // The bracket must be narrowed before the new midpoint is taken from it. Assigning\n                // both at once computed the midpoint from the *old* bound, which sent `mid` to\n                // Infinity the first time the search stepped down from `hi = Infinity`.\n                if (psum > target) {\n                    hi = mid;\n                    mid = (lo + hi) / 2;\n                } else {\n                    lo = mid;\n                    if (hi === Infinity) {\n                        mid *= 2;\n                    } else {\n                        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 if (mid < MIN_K_DIST_SCALE * mean_distances) {\n                mid = MIN_K_DIST_SCALE * mean_distances;\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                : spatial_tree(X.to2dArray(), {\n                      metric,\n                      seed: /** @type {number} */ (this._parameters.seed),\n                  });\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        try {\n            for (let i = 0; i < iterations; ++i) {\n                this.next();\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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        try {\n            for (let i = 0; i < iterations; ++i) {\n                this.next();\n                yield this.projection;\n            }\n            return this.projection;\n        } finally {\n            this._release_wasm();\n        }\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        if (this._optimize_layout_wasm(head_embedding, head, tail, dim, a, b, _repulsion_strength, alpha)) {\n            return head_embedding;\n        }\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     * WASM path for {@link _optimize_layout}.\n     *\n     * Only the forces run in WASM. The negative samples are drawn here first, in the edge order the\n     * kernel walks, so both paths consume the seeded randomizer identically — moving the generator\n     * into WASM would break that. The kernel updates one embedding in place, which holds because the\n     * sole caller passes the same matrix as head and tail.\n     *\n     * @private\n     * @param {Matrix} embedding\n     * @param {number[]} head\n     * @param {number[]} tail\n     * @param {number} dim\n     * @param {number} a\n     * @param {number} b\n     * @param {number} gamma\n     * @param {number} alpha\n     * @returns {boolean} True if the epoch was executed in WASM.\n     */\n    _optimize_layout_wasm(embedding, head, tail, dim, a, b, gamma, alpha) {\n        if (!isWasmAvailable()) return false;\n        const epochs_per_sample = this._epochs_per_sample;\n        const epoch_of_next_sample = this._epoch_of_next_sample;\n        const epochs_per_negative_sample = this._epochs_per_negative_sample;\n        const epoch_of_next_negative_sample = this._epoch_of_next_negative_sample;\n        if (\n            !epochs_per_sample ||\n            !epoch_of_next_sample ||\n            !epochs_per_negative_sample ||\n            !epoch_of_next_negative_sample\n        ) {\n            return false;\n        }\n\n        const n_edges = epochs_per_sample.length;\n        if (n_edges < WASM_MIN_UMAP_EDGES) return false;\n\n        // Index buffers are rebuilt only when the edge list changes, which it never does after init.\n        if (!this._head_int32 || this._head_int32.length !== n_edges) {\n            this._head_int32 = Int32Array.from(head);\n            this._tail_int32 = Int32Array.from(tail);\n        }\n\n        const iter = this._iter;\n        const randomizer = this._randomizer;\n        const tail_length = tail.length;\n\n        // Draw the negative samples in edge order, matching the JS loop draw for draw.\n        const negative_samples = [];\n        for (let i = 0; i < n_edges; ++i) {\n            if (epoch_of_next_sample[i] > iter) continue;\n            const n_neg_samples = (iter - epoch_of_next_negative_sample[i]) / epochs_per_negative_sample[i];\n            for (let p = 0; p < n_neg_samples; ++p) {\n                negative_samples.push(tail[randomizer.random_int % tail_length]);\n            }\n        }\n\n        return wasmUmapOptimizeEpoch(\n            embedding.values,\n            this._head_int32,\n            /** @type {Int32Array} */ (this._tail_int32),\n            epochs_per_sample,\n            epoch_of_next_sample,\n            epochs_per_negative_sample,\n            epoch_of_next_negative_sample,\n            Int32Array.from(negative_samples),\n            dim,\n            iter,\n            a,\n            b,\n            gamma,\n            alpha,\n        );\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;\n\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// Only the control surface is public — the individual `wasm*` kernels are an implementation detail\n// of the accelerated functions and are not part of the API.\nexport { isWasmAvailable, isWasmThreadsSupported, setWasmEnabled } from \"./wasm/index.js\";\nexport { parallel_available, terminate_pool } from \"./wasm/worker_pool.js\";\n"],"names":["qr","qr_gramschmidt"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,sBAAsB,GAAG,GAAG;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,6BAA6B,GAAG,IAAI;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,aAAa,GAAG,EAAE;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,mBAAmB,GAAG,GAAG;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,sBAAsB,GAAG,IAAI;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,mBAAmB,GAAG,GAAG;;AC/EtC;AACO,MAAM,WAAW,GAAG,kiqCAAkiqC;;ACC7jqC;AACA,IAAI,YAAY,GAAG,IAAI;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG,KAAK;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG,CAAC,aAAa,CAAC,oBAAoB,CAAC;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,IAAI,EAAE;AAC7B,IAAI,IAAI;AACR,QAAQ,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG;AAChE,QAAQ,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;AACjC,QAAQ,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,OAAO;AACxF,IAAI,CAAC,CAAC,MAAM;AACZ,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,OAAO,EAAE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"}