umap-web 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +98 -0
- package/LICENSE +29 -0
- package/NOTICE +19 -0
- package/README.md +205 -0
- package/dist/chunk-Bp6m_JJh.js +13 -0
- package/dist/core-BPpH5_PW.js +2816 -0
- package/dist/core-BPpH5_PW.js.map +1 -0
- package/dist/core-IHdw-3yY.d.ts +373 -0
- package/dist/core.d.ts +3 -0
- package/dist/core.js +4 -0
- package/dist/index.d.ts +261 -0
- package/dist/index.js +2991 -0
- package/dist/index.js.map +1 -0
- package/dist/init-DLiEtGpx.js +802 -0
- package/dist/init-DLiEtGpx.js.map +1 -0
- package/dist/sparse-BxSeVhO4.d.ts +150 -0
- package/dist/webgpu.d.ts +111 -0
- package/dist/webgpu.js +955 -0
- package/dist/webgpu.js.map +1 -0
- package/dist/worker.d.ts +1 -0
- package/dist/worker.js +1095 -0
- package/dist/worker.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-DLiEtGpx.js","names":["silentLogger: Logger","consoleLogger: Logger","X: Float64Array","P: Float64Array | null","newX: Float64Array","newP: Float64Array","LX","A","eig","meta: Float64Array","verts: number[]","emb: Float64Array"],"sources":["../src/types.ts","../src/linalg.ts","../src/init/pca.ts","../src/init/spectral.ts","../src/init/index.ts"],"sourcesContent":["/**\n * Public data types and typed errors (BRIEF §4.1/§4.2).\n */\n\nexport type DenseInput =\n | number[][]\n | { data: Float32Array | Float64Array; rows: number; cols: number };\n\nexport interface CSRInput {\n data: Float32Array;\n indices: Int32Array;\n indptr: Int32Array;\n rows: number;\n cols: number;\n}\n\n/** CPU-only custom metric. */\nexport type MetricFn = (a: Float32Array, b: Float32Array) => number;\n\nexport interface Embedding {\n data: Float32Array;\n rows: number;\n cols: number;\n}\n\n/** -1 = unlabeled (semi-supervised). */\nexport type Labels = Int32Array | number[];\n/** Continuous supervision target. */\nexport type Target = Float32Array | number[];\n\nexport interface Logger {\n info(msg: string): void;\n warn(msg: string): void;\n}\n\nexport const silentLogger: Logger = { info() {}, warn() {} };\n\nexport const consoleLogger: Logger = {\n info(msg: string) {\n console.log(`[umap-web] ${msg}`);\n },\n warn(msg: string) {\n console.warn(`[umap-web] ${msg}`);\n },\n};\n\n// ---------------------------------------------------------------------------\n// errors\n// ---------------------------------------------------------------------------\n\nexport class UmapError extends Error {\n override name = 'UmapError';\n}\n\nexport class UmapValidationError extends UmapError {\n override name = 'UmapValidationError';\n}\n\nexport class UmapBackendError extends UmapError {\n override name = 'UmapBackendError';\n}\n\n/** Surfaced through the logger on convergence problems (spectral fallback etc.). */\nexport class UmapConvergenceWarning extends UmapError {\n override name = 'UmapConvergenceWarning';\n}\n\nexport function abortError(): DOMException {\n return new DOMException('The operation was aborted.', 'AbortError');\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw (signal.reason as Error | undefined) ?? abortError();\n }\n}\n\n// ---------------------------------------------------------------------------\n// internal dense matrix view\n// ---------------------------------------------------------------------------\n\nexport interface Matrix {\n data: Float32Array;\n rows: number;\n cols: number;\n}\n\nexport interface KnnGraph {\n indices: Int32Array; // n * k, -1 = missing\n distances: Float32Array; // n * k\n k: number;\n}\n","/**\n * Small dense linear algebra (float64): cyclic Jacobi eigensolver for symmetric\n * matrices, modified Gram–Schmidt, and dense helpers. Used by LOBPCG's Rayleigh–Ritz\n * step (block sizes ≤ ~12) and the multi-component meta layout.\n */\n\nexport interface EigResult {\n /** ascending eigenvalues */\n values: Float64Array;\n /** column-major eigenvectors: vectors[c * n + r] = component r of eigenvector c */\n vectors: Float64Array;\n}\n\n/** Cyclic Jacobi for a symmetric n×n matrix (row-major input, not modified). */\nexport function symmetricEigen(A: Float64Array, n: number, maxSweeps = 100): EigResult {\n const a = A.slice();\n const v = new Float64Array(n * n);\n for (let i = 0; i < n; i++) v[i * n + i] = 1;\n\n for (let sweep = 0; sweep < maxSweeps; sweep++) {\n let off = 0;\n for (let p = 0; p < n - 1; p++) {\n for (let q = p + 1; q < n; q++) off += a[p * n + q]! * a[p * n + q]!;\n }\n if (off < 1e-30) break;\n for (let p = 0; p < n - 1; p++) {\n for (let q = p + 1; q < n; q++) {\n const apq = a[p * n + q]!;\n if (Math.abs(apq) < 1e-300) continue;\n const app = a[p * n + p]!;\n const aqq = a[q * n + q]!;\n const tau = (aqq - app) / (2 * apq);\n const t =\n Math.sign(tau) / (Math.abs(tau) + Math.sqrt(1 + tau * tau)) ||\n 1 / (tau + Math.sqrt(1 + tau * tau));\n const c = 1 / Math.sqrt(1 + t * t);\n const s = t * c;\n // rotate rows/cols p,q of a\n for (let i = 0; i < n; i++) {\n const aip = a[i * n + p]!;\n const aiq = a[i * n + q]!;\n a[i * n + p] = c * aip - s * aiq;\n a[i * n + q] = s * aip + c * aiq;\n }\n for (let i = 0; i < n; i++) {\n const api = a[p * n + i]!;\n const aqi = a[q * n + i]!;\n a[p * n + i] = c * api - s * aqi;\n a[q * n + i] = s * api + c * aqi;\n }\n for (let i = 0; i < n; i++) {\n const vip = v[i * n + p]!;\n const viq = v[i * n + q]!;\n v[i * n + p] = c * vip - s * viq;\n v[i * n + q] = s * vip + c * viq;\n }\n }\n }\n }\n const values = new Float64Array(n);\n for (let i = 0; i < n; i++) values[i] = a[i * n + i]!;\n // sort ascending, permute vectors (to column-major layout)\n const order = Array.from({ length: n }, (_, i) => i).sort((x, y) => values[x]! - values[y]!);\n const outVal = new Float64Array(n);\n const outVec = new Float64Array(n * n);\n for (let c = 0; c < n; c++) {\n const src = order[c]!;\n outVal[c] = values[src]!;\n for (let r = 0; r < n; r++) outVec[c * n + r] = v[r * n + src]!;\n }\n return { values: outVal, vectors: outVec };\n}\n\n/**\n * Modified Gram–Schmidt over columns stored contiguously (col-major: X[c*n..c*n+n)).\n * Columns with norm below dropTol (relative to their original norm) are dropped.\n * Returns the number of retained columns (retained columns are compacted in place).\n */\nexport function mgsOrthonormalize(\n X: Float64Array,\n n: number,\n cols: number,\n dropTol = 1e-10,\n): number {\n let kept = 0;\n for (let c = 0; c < cols; c++) {\n const src = c * n;\n if (kept !== c) X.copyWithin(kept * n, src, src + n);\n const base = kept * n;\n let norm0 = 0;\n for (let r = 0; r < n; r++) norm0 += X[base + r]! * X[base + r]!;\n norm0 = Math.sqrt(norm0);\n for (let pass = 0; pass < 2; pass++) {\n for (let p = 0; p < kept; p++) {\n const pb = p * n;\n let dot = 0;\n for (let r = 0; r < n; r++) dot += X[pb + r]! * X[base + r]!;\n for (let r = 0; r < n; r++) X[base + r] = X[base + r]! - dot * X[pb + r]!;\n }\n }\n let norm = 0;\n for (let r = 0; r < n; r++) norm += X[base + r]! * X[base + r]!;\n norm = Math.sqrt(norm);\n if (norm > dropTol * Math.max(norm0, 1e-300) && norm > 1e-300) {\n for (let r = 0; r < n; r++) X[base + r] = X[base + r]! / norm;\n kept++;\n }\n }\n return kept;\n}\n","/**\n * PCA init via randomized SVD (Halko et al.), f64 accumulators (§5.6, BRIEF M3).\n * Returns PCA scores (U·Σ) of the centered data — the same quantity as\n * sklearn PCA.fit_transform up to component sign.\n */\n\nimport { symmetricEigen } from '../linalg.js';\nimport type { Pcg32 } from '../rng.js';\nimport type { Matrix } from '../types.js';\n\nexport function pcaScores(X: Matrix, dim: number, rng: Pcg32, center = true): Float64Array {\n const n = X.rows;\n const d = X.cols;\n const l = Math.min(d, dim + 7); // oversampling\n const mean = new Float64Array(d);\n if (center) {\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < d; j++) mean[j] = mean[j]! + X.data[i * d + j]!;\n }\n for (let j = 0; j < d; j++) mean[j] = mean[j]! / n;\n }\n\n // Y = (X − μ) Ω, Ω: d×l gaussian\n const omega = new Float64Array(d * l);\n for (let i = 0; i < omega.length; i++) omega[i] = rng.normal();\n let Q = new Float64Array(n * l); // col-major\n for (let i = 0; i < n; i++) {\n for (let c = 0; c < l; c++) {\n let acc = 0;\n for (let j = 0; j < d; j++) {\n acc += (X.data[i * d + j]! - mean[j]!) * omega[j * l + c]!;\n }\n Q[c * n + i] = acc;\n }\n }\n orthonormalizeCols(Q, n, l);\n\n // one power iteration: Q ← orth((X−μ)(X−μ)ᵀ Q)\n for (let power = 0; power < 2; power++) {\n const Z = new Float64Array(d * l); // (X−μ)ᵀ Q, col-major d×l\n for (let c = 0; c < l; c++) {\n for (let i = 0; i < n; i++) {\n const q = Q[c * n + i]!;\n if (q === 0) continue;\n for (let j = 0; j < d; j++) {\n Z[c * d + j] = Z[c * d + j]! + (X.data[i * d + j]! - mean[j]!) * q;\n }\n }\n }\n const Q2 = new Float64Array(n * l);\n for (let c = 0; c < l; c++) {\n for (let i = 0; i < n; i++) {\n let acc = 0;\n for (let j = 0; j < d; j++) acc += (X.data[i * d + j]! - mean[j]!) * Z[c * d + j]!;\n Q2[c * n + i] = acc;\n }\n }\n Q = Q2;\n orthonormalizeCols(Q, n, l);\n }\n\n // B = Qᵀ (X−μ) (l×d); eigen of B Bᵀ (l×l) → left singular vectors W, values σ²\n const B = new Float64Array(l * d);\n for (let c = 0; c < l; c++) {\n for (let i = 0; i < n; i++) {\n const q = Q[c * n + i]!;\n if (q === 0) continue;\n for (let j = 0; j < d; j++) {\n B[c * d + j] = B[c * d + j]! + q * (X.data[i * d + j]! - mean[j]!);\n }\n }\n }\n const BBt = new Float64Array(l * l);\n for (let a = 0; a < l; a++) {\n for (let b = a; b < l; b++) {\n let acc = 0;\n for (let j = 0; j < d; j++) acc += B[a * d + j]! * B[b * d + j]!;\n BBt[a * l + b] = acc;\n BBt[b * l + a] = acc;\n }\n }\n const eig = symmetricEigen(BBt, l);\n // top-dim columns: eigenvalues ascending → take the last `dim` in DESC order\n const scores = new Float64Array(n * dim);\n for (let c = 0; c < dim; c++) {\n const col = l - 1 - c;\n // scores column = Q · w_col scaled... U = Q W / ||; scores = U σ = Q (W σ)/σ = Q w σ?\n // B = W Σ Vᵀ, so U = Q W and scores = U Σ = Q W Σ. w has unit norm; σ = sqrt(eig).\n const sigma = Math.sqrt(Math.max(eig.values[col]!, 0));\n for (let i = 0; i < n; i++) {\n let acc = 0;\n for (let a = 0; a < l; a++) acc += Q[a * n + i]! * eig.vectors[col * l + a]!;\n scores[i * dim + c] = acc * sigma;\n }\n }\n return scores;\n}\n\nfunction orthonormalizeCols(Q: Float64Array, n: number, cols: number): void {\n for (let c = 0; c < cols; c++) {\n const base = c * n;\n for (let pass = 0; pass < 2; pass++) {\n for (let p = 0; p < c; p++) {\n const pb = p * n;\n let dot = 0;\n for (let r = 0; r < n; r++) dot += Q[pb + r]! * Q[base + r]!;\n for (let r = 0; r < n; r++) Q[base + r] = Q[base + r]! - dot * Q[pb + r]!;\n }\n }\n let norm = 0;\n for (let r = 0; r < n; r++) norm += Q[base + r]! * Q[base + r]!;\n norm = Math.sqrt(norm);\n if (norm > 1e-300) {\n for (let r = 0; r < n; r++) Q[base + r] = Q[base + r]! / norm;\n }\n }\n}\n","/**\n * Spectral initialization (umap spectral.py; notes §8, BRIEF §A4):\n * symmetric-normalized Laplacian of the fuzzy graph, LOBPCG with diagonal\n * preconditioner for the k+1 smallest eigenpairs (drop trivial), warn-and-fallback\n * to random, and Python's multi-component meta layout.\n */\n\nimport { mgsOrthonormalize, symmetricEigen } from '../linalg.js';\nimport type { Pcg32 } from '../rng.js';\nimport type { Csr } from '../sparse.js';\nimport type { Logger, Matrix } from '../types.js';\nimport { silentLogger } from '../types.js';\n\nexport interface SpectralResult {\n embedding: Float64Array; // n × dim, row-major\n usedFallback: boolean;\n}\n\n/** Connected components via BFS over an undirected CSR graph. */\nexport function connectedComponents(graph: Csr): { count: number; labels: Int32Array } {\n const n = graph.rows;\n const labels = new Int32Array(n).fill(-1);\n const queue = new Int32Array(n);\n let count = 0;\n for (let s = 0; s < n; s++) {\n if (labels[s] !== -1) continue;\n labels[s] = count;\n let head = 0;\n let tail = 0;\n queue[tail++] = s;\n while (head < tail) {\n const u = queue[head++]!;\n for (let p = graph.indptr[u]!; p < graph.indptr[u + 1]!; p++) {\n const v = graph.indices[p]!;\n if (labels[v] === -1) {\n labels[v] = count;\n queue[tail++] = v;\n }\n }\n }\n count++;\n }\n return { count, labels };\n}\n\n/**\n * Y = L S for a block S of `cols` column vectors, where\n * L = I − D^{-1/2} A D^{-1/2}. `scaled` holds the pre-scaled off-diagonal\n * values A_ij·dinvsqrt[j] (computed once per solve); dinvsqrt[i] is applied\n * after each row sum — the exact fp op order of the unfused loop, so results\n * are bit-identical to the reference implementation path, per column. All\n * columns share one pass over the CSR arrays (the SpMV is memory-bound; the\n * blocked walk reads `scaled`/`indices` once instead of once per column).\n */\nfunction laplacianMatVecBlock(\n graph: Csr,\n scaled: Float64Array,\n dinvsqrt: Float64Array,\n S: Float64Array,\n cols: number,\n Y: Float64Array,\n): void {\n const n = graph.rows;\n const indptr = graph.indptr;\n const indices = graph.indices;\n if (cols === 3) {\n // block size dim+1 = 3 is the 2-D embedding hot case\n for (let i = 0; i < n; i++) {\n let a0 = 0;\n let a1 = 0;\n let a2 = 0;\n const end = indptr[i + 1]!;\n for (let p = indptr[i]!; p < end; p++) {\n const v = scaled[p]!;\n const j = indices[p]!;\n a0 += v * S[j]!;\n a1 += v * S[n + j]!;\n a2 += v * S[2 * n + j]!;\n }\n const di = dinvsqrt[i]!;\n Y[i] = S[i]! - di * a0;\n Y[n + i] = S[n + i]! - di * a1;\n Y[2 * n + i] = S[2 * n + i]! - di * a2;\n }\n return;\n }\n const acc = new Float64Array(cols);\n for (let i = 0; i < n; i++) {\n acc.fill(0);\n const end = indptr[i + 1]!;\n for (let p = indptr[i]!; p < end; p++) {\n const v = scaled[p]!;\n const j = indices[p]!;\n for (let c = 0; c < cols; c++) acc[c]! += v * S[c * n + j]!;\n }\n const di = dinvsqrt[i]!;\n for (let c = 0; c < cols; c++) Y[c * n + i] = S[c * n + i]! - di * acc[c]!;\n }\n}\n\nfunction scaleLaplacian(graph: Csr, dinvsqrt: Float64Array): Float64Array {\n const scaled = new Float64Array(graph.data.length);\n for (let i = 0; i < graph.rows; i++) {\n for (let p = graph.indptr[i]!; p < graph.indptr[i + 1]!; p++) {\n scaled[p] = graph.data[p]! * dinvsqrt[graph.indices[p]!]!;\n }\n }\n return scaled;\n}\n\nexport interface LobpcgResult {\n values: Float64Array;\n /** col-major eigenvectors (m columns of length n) */\n vectors: Float64Array;\n converged: boolean;\n iterations: number;\n residuals: Float64Array;\n}\n\n/**\n * LOBPCG for the m smallest eigenpairs of the normalized Laplacian of `graph`,\n * with diagonal (Jacobi) preconditioner. X0 is col-major n×m.\n */\nexport function lobpcgSmallest(\n graph: Csr,\n dinvsqrt: Float64Array,\n X0: Float64Array,\n m: number,\n tol = 1e-4,\n maxIter = 200,\n): LobpcgResult {\n const n = graph.rows;\n // diagonal of L: 1 − dinvsqrt[i]^2 * A_ii ≈ 1 (self-loops are absent) → use\n // diag(L)=1 minus any explicit diagonal entries\n const diag = new Float64Array(n).fill(1);\n for (let i = 0; i < n; i++) {\n for (let p = graph.indptr[i]!; p < graph.indptr[i + 1]!; p++) {\n if (graph.indices[p] === i) diag[i] = 1 - graph.data[p]! * dinvsqrt[i]! * dinvsqrt[i]!;\n }\n }\n const precond = new Float64Array(n);\n for (let i = 0; i < n; i++) precond[i] = Math.abs(diag[i]!) > 1e-12 ? 1 / diag[i]! : 1;\n const scaled = scaleLaplacian(graph, dinvsqrt);\n\n let X: Float64Array = X0.slice(); // col-major n×m\n let P: Float64Array | null = null;\n let pCols = 0;\n const values = new Float64Array(m);\n const residuals = new Float64Array(m).fill(Infinity);\n let converged = false;\n let iter = 0;\n\n // Workspaces reused across iterations (identical op order and values as the\n // allocate-per-iteration form — every region is fully overwritten before\n // use, or zero-filled where fresh-array zero-init was load-bearing). This\n // avoids ~8 n-scale allocations per iteration, which matters in browser\n // pages already under heap pressure.\n const LXbuf = new Float64Array(n * m);\n const Rbuf = new Float64Array(n * m);\n const Wbuf = new Float64Array(n * m);\n const Sbuf = new Float64Array(n * 3 * m);\n const LSbuf = new Float64Array(n * 3 * m);\n const xtlx = new Float64Array(m);\n let newX: Float64Array = new Float64Array(n * m);\n let newP: Float64Array = new Float64Array(n * m);\n\n const applyL = (S: Float64Array, cols: number, out: Float64Array): Float64Array => {\n laplacianMatVecBlock(graph, scaled, dinvsqrt, S, cols, out);\n return out;\n };\n\n for (iter = 0; iter < maxIter; iter++) {\n mgsOrthonormalize(X, n, m);\n const LX = applyL(X, m, LXbuf);\n // Rayleigh quotients per current block: Λ = Xᵀ L X (diagonal after RR of prev step)\n // Residuals R = LX − X (XᵀLX diag)\n for (let c = 0; c < m; c++) {\n let dot = 0;\n for (let r = 0; r < n; r++) dot += X[c * n + r]! * LX[c * n + r]!;\n xtlx[c] = dot;\n }\n const R = Rbuf;\n let worst = 0;\n for (let c = 0; c < m; c++) {\n let rn = 0;\n for (let r = 0; r < n; r++) {\n const v = LX[c * n + r]! - xtlx[c]! * X[c * n + r]!;\n R[c * n + r] = v;\n rn += v * v;\n }\n residuals[c] = Math.sqrt(rn);\n if (residuals[c]! > worst) worst = residuals[c]!;\n values[c] = xtlx[c]!;\n }\n if (worst <= tol) {\n converged = true;\n break;\n }\n // precondition residuals\n const W = Wbuf;\n for (let c = 0; c < m; c++) {\n for (let r = 0; r < n; r++) W[c * n + r] = precond[r]! * R[c * n + r]!;\n }\n // subspace S = [X | W | P]\n const totalCols = m + m + pCols;\n const S = Sbuf;\n S.set(X.subarray(0, n * m), 0);\n S.set(W, n * m);\n if (P && pCols > 0) S.set(P.subarray(0, n * pCols), n * 2 * m);\n const q = mgsOrthonormalize(S, n, totalCols);\n if (q < m) break; // degenerate subspace — bail to fallback safety below\n const LS = applyL(S, q, LSbuf);\n // A = Sᵀ L S (q×q)\n const A = new Float64Array(q * q);\n for (let a = 0; a < q; a++) {\n for (let b = a; b < q; b++) {\n let dot = 0;\n for (let r = 0; r < n; r++) dot += S[a * n + r]! * LS[b * n + r]!;\n A[a * q + b] = dot;\n A[b * q + a] = dot;\n }\n }\n const eig = symmetricEigen(A, q);\n // new X = S · C[:, :m]; new P = S_{W,P part} · C — standard LOBPCG restart form:\n // use C rows beyond the X block for P\n newX.fill(0);\n newP.fill(0);\n for (let c = 0; c < m; c++) {\n for (let a = 0; a < q; a++) {\n const w = eig.vectors[c * q + a]!;\n if (w === 0) continue;\n const sBase = a * n;\n const xBase = c * n;\n for (let r = 0; r < n; r++) newX[xBase + r] = newX[xBase + r]! + w * S[sBase + r]!;\n if (a >= m) {\n for (let r = 0; r < n; r++) newP[xBase + r] = newP[xBase + r]! + w * S[sBase + r]!;\n }\n }\n }\n // ping-pong: the old X/P buffers become the next iteration's accumulators\n const oldX = X;\n const oldP = P ?? new Float64Array(n * m);\n X = newX;\n P = newP;\n newX = oldX;\n newP = oldP;\n pCols = m;\n }\n\n // final Rayleigh–Ritz to return sorted eigenpairs\n mgsOrthonormalize(X, n, m);\n const LX = applyL(X, m, LXbuf);\n const A = new Float64Array(m * m);\n for (let a = 0; a < m; a++) {\n for (let b = a; b < m; b++) {\n let dot = 0;\n for (let r = 0; r < n; r++) dot += X[a * n + r]! * LX[b * n + r]!;\n A[a * m + b] = dot;\n A[b * m + a] = dot;\n }\n }\n const eig = symmetricEigen(A, m);\n const outVec = new Float64Array(n * m);\n for (let c = 0; c < m; c++) {\n for (let a = 0; a < m; a++) {\n const w = eig.vectors[c * m + a]!;\n if (w === 0) continue;\n for (let r = 0; r < n; r++) outVec[c * n + r] = outVec[c * n + r]! + w * X[a * n + r]!;\n }\n }\n // recompute residuals for the rotated vectors\n const LV = applyL(outVec, m, LXbuf); // LX is dead past the gram above\n for (let c = 0; c < m; c++) {\n let rn = 0;\n for (let r = 0; r < n; r++) {\n const v = LV[c * n + r]! - eig.values[c]! * outVec[c * n + r]!;\n rn += v * v;\n }\n residuals[c] = Math.sqrt(rn);\n }\n return { values: eig.values, vectors: outVec, converged, iterations: iter, residuals };\n}\n\n/**\n * lobpcgSmallest with an injected (possibly asynchronous) L·S operator — used\n * by the WebGPU backend to offload the SpMV. A verbatim duplicate of the sync\n * driver above (kept separate so the validated CPU path stays untouched);\n * only the applyL calls are awaited.\n */\nexport async function lobpcgSmallestAsync(\n graph: Csr,\n dinvsqrt: Float64Array,\n X0: Float64Array,\n m: number,\n tol: number,\n maxIter: number,\n applyLAsync: (S: Float64Array, cols: number, out: Float64Array) => Promise<Float64Array>,\n): Promise<LobpcgResult> {\n const n = graph.rows;\n const diag = new Float64Array(n).fill(1);\n for (let i = 0; i < n; i++) {\n for (let p = graph.indptr[i]!; p < graph.indptr[i + 1]!; p++) {\n if (graph.indices[p] === i) diag[i] = 1 - graph.data[p]! * dinvsqrt[i]! * dinvsqrt[i]!;\n }\n }\n const precond = new Float64Array(n);\n for (let i = 0; i < n; i++) precond[i] = Math.abs(diag[i]!) > 1e-12 ? 1 / diag[i]! : 1;\n\n let X: Float64Array = X0.slice();\n let P: Float64Array | null = null;\n let pCols = 0;\n const values = new Float64Array(m);\n const residuals = new Float64Array(m).fill(Infinity);\n let converged = false;\n let iter = 0;\n\n const LXbuf = new Float64Array(n * m);\n const Rbuf = new Float64Array(n * m);\n const Wbuf = new Float64Array(n * m);\n const Sbuf = new Float64Array(n * 3 * m);\n const LSbuf = new Float64Array(n * 3 * m);\n const xtlx = new Float64Array(m);\n let newX: Float64Array = new Float64Array(n * m);\n let newP: Float64Array = new Float64Array(n * m);\n\n for (iter = 0; iter < maxIter; iter++) {\n mgsOrthonormalize(X, n, m);\n const LX = await applyLAsync(X, m, LXbuf);\n for (let c = 0; c < m; c++) {\n let dot = 0;\n for (let r = 0; r < n; r++) dot += X[c * n + r]! * LX[c * n + r]!;\n xtlx[c] = dot;\n }\n const R = Rbuf;\n let worst = 0;\n for (let c = 0; c < m; c++) {\n let rn = 0;\n for (let r = 0; r < n; r++) {\n const v = LX[c * n + r]! - xtlx[c]! * X[c * n + r]!;\n R[c * n + r] = v;\n rn += v * v;\n }\n residuals[c] = Math.sqrt(rn);\n if (residuals[c]! > worst) worst = residuals[c]!;\n values[c] = xtlx[c]!;\n }\n if (worst <= tol) {\n converged = true;\n break;\n }\n const W = Wbuf;\n for (let c = 0; c < m; c++) {\n for (let r = 0; r < n; r++) W[c * n + r] = precond[r]! * R[c * n + r]!;\n }\n const totalCols = m + m + pCols;\n const S = Sbuf;\n S.set(X.subarray(0, n * m), 0);\n S.set(W, n * m);\n if (P && pCols > 0) S.set(P.subarray(0, n * pCols), n * 2 * m);\n const q = mgsOrthonormalize(S, n, totalCols);\n if (q < m) break;\n const LS = await applyLAsync(S, q, LSbuf);\n const A = new Float64Array(q * q);\n for (let a = 0; a < q; a++) {\n for (let b = a; b < q; b++) {\n let dot = 0;\n for (let r = 0; r < n; r++) dot += S[a * n + r]! * LS[b * n + r]!;\n A[a * q + b] = dot;\n A[b * q + a] = dot;\n }\n }\n const eig = symmetricEigen(A, q);\n newX.fill(0);\n newP.fill(0);\n for (let c = 0; c < m; c++) {\n for (let a = 0; a < q; a++) {\n const w = eig.vectors[c * q + a]!;\n if (w === 0) continue;\n const sBase = a * n;\n const xBase = c * n;\n for (let r = 0; r < n; r++) newX[xBase + r] = newX[xBase + r]! + w * S[sBase + r]!;\n if (a >= m) {\n for (let r = 0; r < n; r++) newP[xBase + r] = newP[xBase + r]! + w * S[sBase + r]!;\n }\n }\n }\n const oldX = X;\n const oldP = P ?? new Float64Array(n * m);\n X = newX;\n P = newP;\n newX = oldX;\n newP = oldP;\n pCols = m;\n }\n\n mgsOrthonormalize(X, n, m);\n const LX = await applyLAsync(X, m, LXbuf);\n const A = new Float64Array(m * m);\n for (let a = 0; a < m; a++) {\n for (let b = a; b < m; b++) {\n let dot = 0;\n for (let r = 0; r < n; r++) dot += X[a * n + r]! * LX[b * n + r]!;\n A[a * m + b] = dot;\n A[b * m + a] = dot;\n }\n }\n const eig = symmetricEigen(A, m);\n const outVec = new Float64Array(n * m);\n for (let c = 0; c < m; c++) {\n for (let a = 0; a < m; a++) {\n const w = eig.vectors[c * m + a]!;\n if (w === 0) continue;\n for (let r = 0; r < n; r++) outVec[c * n + r] = outVec[c * n + r]! + w * X[a * n + r]!;\n }\n }\n const LV = await applyLAsync(outVec, m, LXbuf);\n for (let c = 0; c < m; c++) {\n let rn = 0;\n for (let r = 0; r < n; r++) {\n const v = LV[c * n + r]! - eig.values[c]! * outVec[c * n + r]!;\n rn += v * v;\n }\n residuals[c] = Math.sqrt(rn);\n }\n return { values: eig.values, vectors: outVec, converged, iterations: iter, residuals };\n}\n\n/** Degree vector d_i = Σ_j A_ij and its inverse sqrt. */\nexport function degreeInvSqrt(graph: Csr): { deg: Float64Array; dinvsqrt: Float64Array } {\n const n = graph.rows;\n const deg = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n for (let p = graph.indptr[i]!; p < graph.indptr[i + 1]!; p++) deg[i] = deg[i]! + graph.data[p]!;\n }\n const dinvsqrt = new Float64Array(n);\n for (let i = 0; i < n; i++) dinvsqrt[i] = deg[i]! > 0 ? 1 / Math.sqrt(deg[i]!) : 0;\n return { deg, dinvsqrt };\n}\n\n/** Single-component spectral layout: k+1 smallest eigenvectors, drop trivial. */\nfunction spectralLayoutSingle(graph: Csr, dim: number, rng: Pcg32, logger: Logger): SpectralResult {\n const n = graph.rows;\n const m = dim + 1;\n const { deg, dinvsqrt } = degreeInvSqrt(graph);\n // X0: random normal block, column 0 = exact trivial eigenvector sqrt(deg)/||·||\n const X0 = new Float64Array(n * m);\n for (let c = 0; c < m; c++) {\n for (let r = 0; r < n; r++) X0[c * n + r] = rng.normal();\n }\n let norm = 0;\n for (let r = 0; r < n; r++) norm += deg[r]!;\n norm = Math.sqrt(norm);\n for (let r = 0; r < n; r++) X0[r] = Math.sqrt(deg[r]!) / norm;\n\n const res = lobpcgSmallest(graph, dinvsqrt, X0, m, 1e-4, 5 * Math.min(n, 60));\n if (!res.converged) {\n // Python escalates non-convergence warnings to the random fallback;\n // surfaced through the logger as a UmapConvergenceWarning (BRIEF §4.1)\n logger.warn(\n 'UmapConvergenceWarning: Spectral initialisation failed! The eigenvector solver failed. This is likely due to too small an eigengap. Consider adding some noise or jitter to your data. Falling back to random initialisation!',\n );\n const emb = new Float64Array(n * dim);\n for (let i = 0; i < emb.length; i++) emb[i] = rng.uniform(-10, 10);\n return { embedding: emb, usedFallback: true };\n }\n // drop the trivial (smallest) eigenvector; take columns 1..m\n const embedding = new Float64Array(n * dim);\n for (let d = 0; d < dim; d++) {\n const c = d + 1;\n for (let r = 0; r < n; r++) embedding[r * dim + d] = res.vectors[c * n + r]!;\n }\n return { embedding, usedFallback: false };\n}\n\n/** exp(−d²) affinity spectral embedding of component centroids (spectral.py:18-142). */\nfunction componentLayout(\n data: Matrix | null,\n nComponents: number,\n labels: Int32Array,\n dim: number,\n rng: Pcg32,\n): Float64Array {\n const meta = new Float64Array(nComponents * dim);\n if (!data) {\n for (let i = 0; i < meta.length; i++) meta[i] = rng.nextFloat() * 10.0;\n return meta;\n }\n // centroids\n const d = data.cols;\n const centroids = new Float64Array(nComponents * d);\n const counts = new Int32Array(nComponents);\n for (let i = 0; i < data.rows; i++) {\n const c = labels[i]!;\n counts[c]!++;\n for (let j = 0; j < d; j++) {\n centroids[c * d + j] = centroids[c * d + j]! + data.data[i * d + j]!;\n }\n }\n for (let c = 0; c < nComponents; c++) {\n for (let j = 0; j < d; j++) centroids[c * d + j] = centroids[c * d + j]! / counts[c]!;\n }\n // euclidean distance matrix + affinity exp(−d²)\n const aff = new Float64Array(nComponents * nComponents);\n for (let a = 0; a < nComponents; a++) {\n for (let b = 0; b < nComponents; b++) {\n let s = 0;\n for (let j = 0; j < d; j++) {\n const diff = centroids[a * d + j]! - centroids[b * d + j]!;\n s += diff * diff;\n }\n aff[a * nComponents + b] = Math.exp(-s);\n }\n }\n // sklearn-style normalized Laplacian eigenmaps with D^{-1/2} recovery\n const n = nComponents;\n const deg = new Float64Array(n);\n for (let a = 0; a < n; a++) {\n for (let b = 0; b < n; b++) deg[a] = deg[a]! + aff[a * n + b]!;\n }\n const L = new Float64Array(n * n);\n for (let a = 0; a < n; a++) {\n for (let b = 0; b < n; b++) {\n const norm = Math.sqrt(deg[a]! * deg[b]!);\n L[a * n + b] = (a === b ? 1 : 0) - (norm > 0 ? aff[a * n + b]! / norm : 0);\n }\n }\n const eig = symmetricEigen(L, n);\n // maps = D^{-1/2} * eigenvectors 1..dim (drop trivial)\n let mx = 0;\n for (let c = 0; c < dim; c++) {\n const col = Math.min(c + 1, n - 1);\n for (let a = 0; a < n; a++) {\n const v = eig.vectors[col * n + a]! / Math.sqrt(deg[a]!);\n meta[a * dim + c] = v;\n if (Math.abs(v) > mx) mx = Math.abs(v);\n }\n }\n // embedding /= embedding.max() (Python divides by max, not abs-max)\n let realMax = -Infinity;\n for (let i = 0; i < meta.length; i++) if (meta[i]! > realMax) realMax = meta[i]!;\n if (realMax !== 0 && Number.isFinite(realMax)) {\n for (let i = 0; i < meta.length; i++) meta[i] = meta[i]! / realMax;\n }\n return meta;\n}\n\n/** multi_component_layout (spectral.py:145-260). */\nfunction multiComponentLayout(\n data: Matrix | null,\n graph: Csr,\n nComponents: number,\n labels: Int32Array,\n dim: number,\n rng: Pcg32,\n logger: Logger,\n): SpectralResult {\n const n = graph.rows;\n const result = new Float64Array(n * dim);\n let meta: Float64Array;\n if (nComponents > 2 * dim) {\n meta = componentLayout(data, nComponents, labels, dim, rng);\n } else {\n // ± unit vectors: rows of [I_k 0; -I_k 0][:nComponents], k = ceil(nComponents/2)\n const k = Math.ceil(nComponents / 2);\n meta = new Float64Array(nComponents * dim);\n for (let c = 0; c < nComponents; c++) {\n if (c < k) {\n if (c < dim) meta[c * dim + c] = 1;\n } else {\n const idx = c - k;\n if (idx < dim) meta[c * dim + idx] = -1;\n }\n }\n }\n let anyFallback = false;\n for (let label = 0; label < nComponents; label++) {\n // vertices of this component\n const verts: number[] = [];\n for (let i = 0; i < n; i++) if (labels[i] === label) verts.push(i);\n const size = verts.length;\n // data_range = half the min positive distance from this meta point to the others\n let minDist = Infinity;\n for (let other = 0; other < nComponents; other++) {\n if (other === label) continue;\n let s = 0;\n for (let c = 0; c < dim; c++) {\n const diff = meta[label * dim + c]! - meta[other * dim + c]!;\n s += diff * diff;\n }\n const dd = Math.sqrt(s);\n if (dd > 0 && dd < minDist) minDist = dd;\n }\n const dataRange = (Number.isFinite(minDist) ? minDist : 1) / 2.0;\n\n if (size < 2 * dim || size <= dim + 1) {\n for (const [vi, v] of verts.entries()) {\n void vi;\n for (let c = 0; c < dim; c++) {\n result[v * dim + c] = rng.uniform(-dataRange, dataRange) + meta[label * dim + c]!;\n }\n }\n continue;\n }\n // component subgraph\n const remap = new Int32Array(n).fill(-1);\n verts.forEach((v, i) => {\n remap[v] = i;\n });\n const subIndptr = new Int32Array(size + 1);\n let nnz = 0;\n for (const v of verts) {\n for (let p = graph.indptr[v]!; p < graph.indptr[v + 1]!; p++) {\n if (remap[graph.indices[p]!]! >= 0) nnz++;\n }\n }\n const subIndices = new Int32Array(nnz);\n const subData = new Float64Array(nnz);\n let w = 0;\n verts.forEach((v, i) => {\n for (let p = graph.indptr[v]!; p < graph.indptr[v + 1]!; p++) {\n const t = remap[graph.indices[p]!]!;\n if (t >= 0) {\n subIndices[w] = t;\n subData[w] = graph.data[p]!;\n w++;\n }\n }\n subIndptr[i + 1] = w;\n });\n const sub: Csr = {\n indptr: subIndptr,\n indices: subIndices,\n data: subData,\n rows: size,\n cols: size,\n };\n const compRes = spectralLayoutSingle(sub, dim, rng, logger);\n anyFallback ||= compRes.usedFallback;\n let mx = 0;\n for (let i = 0; i < compRes.embedding.length; i++) {\n const v = Math.abs(compRes.embedding[i]!);\n if (v > mx) mx = v;\n }\n const expansion = mx > 0 ? dataRange / mx : 1;\n verts.forEach((v, i) => {\n for (let c = 0; c < dim; c++) {\n result[v * dim + c] = compRes.embedding[i * dim + c]! * expansion + meta[label * dim + c]!;\n }\n });\n }\n return { embedding: result, usedFallback: anyFallback };\n}\n\n/**\n * spectral_layout: normalized-Laplacian eigenmaps of the fuzzy graph with\n * multi-component handling. Returns n×dim float64 (caller scales/noises/casts).\n */\nexport function spectralLayout(\n data: Matrix | null,\n graph: Csr,\n dim: number,\n rng: Pcg32,\n logger: Logger = silentLogger,\n): SpectralResult {\n const { count, labels } = connectedComponents(graph);\n if (count > 1) {\n return multiComponentLayout(data, graph, count, labels, dim, rng, logger);\n }\n return spectralLayoutSingle(graph, dim, rng, logger);\n}\n","/**\n * Embedding initialization dispatch (umap_.py:1095-1192; notes §7):\n * random | pca | spectral | user array, each followed by the shared final\n * per-dimension min-max rescale into [0, 10].\n */\n\nimport type { Pcg32 } from '../rng.js';\nimport type { Csr } from '../sparse.js';\nimport type { Embedding, Logger, Matrix } from '../types.js';\nimport { silentLogger, UmapValidationError } from '../types.js';\nimport { pcaScores } from './pca.js';\nimport { spectralLayout } from './spectral.js';\n\nexport type InitMethod = 'spectral' | 'random' | 'pca' | Embedding;\n\n/** noisy_scale_coords (umap_.py:928-935): scale abs-max to maxCoord, add N(0, noise). */\nexport function noisyScaleCoords(\n coords: Float64Array,\n rng: Pcg32,\n maxCoord = 10.0,\n noise = 0.0001,\n): void {\n let mx = 0;\n for (let i = 0; i < coords.length; i++) {\n const v = Math.abs(coords[i]!);\n if (v > mx) mx = v;\n }\n const expansion = mx > 0 ? maxCoord / mx : 1;\n for (let i = 0; i < coords.length; i++) {\n coords[i] = Math.fround(coords[i]! * expansion) + rng.normal() * noise;\n }\n}\n\n/** Final rescale applied to EVERY init (umap_.py:1188-1192): per-dim min-max → [0,10]. */\nexport function finalInitRescale(embedding: Float64Array, n: number, dim: number): Float32Array {\n const out = new Float32Array(n * dim);\n for (let c = 0; c < dim; c++) {\n let mn = Infinity;\n let mx = -Infinity;\n for (let i = 0; i < n; i++) {\n const v = embedding[i * dim + c]!;\n if (v < mn) mn = v;\n if (v > mx) mx = v;\n }\n const range = mx - mn;\n for (let i = 0; i < n; i++) {\n out[i * dim + c] = range > 0 ? (10.0 * (embedding[i * dim + c]! - mn)) / range : 0;\n }\n }\n return out;\n}\n\nexport interface InitializeOptions {\n logger?: Logger;\n}\n\nexport interface InitializeResult {\n embedding: Float32Array; // n × dim, after the final [0,10] rescale\n spectralFallback: boolean;\n}\n\n/**\n * Produce the initial embedding for `graph` (pruned fuzzy graph) and `data`.\n * Data may be null when init doesn't need it (random / spectral without\n * multi-component meta layout data).\n */\nexport function initializeEmbedding(\n init: InitMethod,\n data: Matrix | null,\n graph: Csr,\n dim: number,\n rng: Pcg32,\n { logger = silentLogger }: InitializeOptions = {},\n): InitializeResult {\n const n = graph.rows;\n let emb: Float64Array;\n let spectralFallback = false;\n\n if (typeof init === 'object') {\n const e = init;\n if (e.rows !== n || e.cols !== dim) {\n throw new UmapValidationError(`init embedding must be ${n}x${dim}, got ${e.rows}x${e.cols}`);\n }\n emb = new Float64Array(n * dim);\n // duplicate rows get jittered by 0.001 * mean-NN-dist (umap_.py:1133-1144)\n const seen = new Set<string>();\n let hasDup = false;\n for (let i = 0; i < n; i++) {\n const key = Array.from(e.data.subarray(i * dim, (i + 1) * dim)).join(',');\n if (seen.has(key)) {\n hasDup = true;\n break;\n }\n seen.add(key);\n }\n for (let i = 0; i < e.data.length; i++) emb[i] = e.data[i]!;\n if (hasDup) {\n // mean distance to nearest distinct neighbor, approximated on a sample for O(n·s)\n const sample = Math.min(n, 512);\n let acc = 0;\n let cnt = 0;\n for (let i = 0; i < sample; i++) {\n let best = Infinity;\n for (let j = 0; j < n; j++) {\n if (j === i) continue;\n let s = 0;\n for (let c = 0; c < dim; c++) {\n const d = emb[i * dim + c]! - emb[j * dim + c]!;\n s += d * d;\n }\n if (s > 0 && s < best) best = s;\n }\n if (Number.isFinite(best)) {\n acc += Math.sqrt(best);\n cnt++;\n }\n }\n const nndist = cnt > 0 ? acc / cnt : 1e-3;\n for (let i = 0; i < emb.length; i++) emb[i] = emb[i]! + rng.normal() * 0.001 * nndist;\n }\n } else if (init === 'random') {\n emb = new Float64Array(n * dim);\n for (let i = 0; i < emb.length; i++) emb[i] = rng.uniform(-10, 10);\n } else if (init === 'pca') {\n if (!data) throw new UmapValidationError(\"init 'pca' requires dense data\");\n emb = pcaScores(data, dim, rng);\n noisyScaleCoords(emb, rng, 10, 0.0001);\n } else if (init === 'spectral') {\n const res = spectralLayout(data, graph, dim, rng, logger);\n emb = res.embedding;\n spectralFallback = res.usedFallback;\n if (!res.usedFallback) noisyScaleCoords(emb, rng, 10, 0.0001);\n } else {\n throw new UmapValidationError(`unknown init '${String(init)}'`);\n }\n\n return { embedding: finalInitRescale(emb, n, dim), spectralFallback };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
//#region src/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Public data types and typed errors (BRIEF §4.1/§4.2).
|
|
4
|
+
*/
|
|
5
|
+
type DenseInput = number[][] | {
|
|
6
|
+
data: Float32Array | Float64Array;
|
|
7
|
+
rows: number;
|
|
8
|
+
cols: number;
|
|
9
|
+
};
|
|
10
|
+
interface CSRInput {
|
|
11
|
+
data: Float32Array;
|
|
12
|
+
indices: Int32Array;
|
|
13
|
+
indptr: Int32Array;
|
|
14
|
+
rows: number;
|
|
15
|
+
cols: number;
|
|
16
|
+
}
|
|
17
|
+
/** CPU-only custom metric. */
|
|
18
|
+
type MetricFn = (a: Float32Array, b: Float32Array) => number;
|
|
19
|
+
interface Embedding {
|
|
20
|
+
data: Float32Array;
|
|
21
|
+
rows: number;
|
|
22
|
+
cols: number;
|
|
23
|
+
}
|
|
24
|
+
/** -1 = unlabeled (semi-supervised). */
|
|
25
|
+
type Labels = Int32Array | number[];
|
|
26
|
+
/** Continuous supervision target. */
|
|
27
|
+
type Target = Float32Array | number[];
|
|
28
|
+
interface Logger {
|
|
29
|
+
info(msg: string): void;
|
|
30
|
+
warn(msg: string): void;
|
|
31
|
+
}
|
|
32
|
+
declare class UmapError extends Error {
|
|
33
|
+
name: string;
|
|
34
|
+
}
|
|
35
|
+
declare class UmapValidationError extends UmapError {
|
|
36
|
+
name: string;
|
|
37
|
+
}
|
|
38
|
+
declare class UmapBackendError extends UmapError {
|
|
39
|
+
name: string;
|
|
40
|
+
}
|
|
41
|
+
/** Surfaced through the logger on convergence problems (spectral fallback etc.). */
|
|
42
|
+
declare class UmapConvergenceWarning extends UmapError {
|
|
43
|
+
name: string;
|
|
44
|
+
}
|
|
45
|
+
interface Matrix {
|
|
46
|
+
data: Float32Array;
|
|
47
|
+
rows: number;
|
|
48
|
+
cols: number;
|
|
49
|
+
}
|
|
50
|
+
interface KnnGraph {
|
|
51
|
+
indices: Int32Array;
|
|
52
|
+
distances: Float32Array;
|
|
53
|
+
k: number;
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/rng.d.ts
|
|
57
|
+
/**
|
|
58
|
+
* Seeded PRNG — PCG32 (O'Neill, pcg-random.org), the reproducible generator of §5.5.
|
|
59
|
+
*
|
|
60
|
+
* Test vectors in test/unit/rng.test.ts were generated from the canonical C reference
|
|
61
|
+
* (pcg_basic.c) compiled locally; the first draw for seed(42, 54) is 0xa15c02b7,
|
|
62
|
+
* matching the published pcg32-demo output.
|
|
63
|
+
*
|
|
64
|
+
* 64-bit state is held as two u32 words; the LCG multiply uses exact 16-bit limb
|
|
65
|
+
* arithmetic (all intermediates < 2^53).
|
|
66
|
+
*/
|
|
67
|
+
declare class Pcg32 {
|
|
68
|
+
private sHi;
|
|
69
|
+
private sLo;
|
|
70
|
+
private iHi;
|
|
71
|
+
private iLo;
|
|
72
|
+
private spareNormal;
|
|
73
|
+
constructor(seedHi: number, seedLo: number, seqHi: number, seqLo: number);
|
|
74
|
+
/** Derive from a JS number seed (integer-valued; uses full 53-bit range). */
|
|
75
|
+
static fromSeed(seed: number, stream?: number): Pcg32;
|
|
76
|
+
nextU32(): number;
|
|
77
|
+
/** Uniform float in [0, 1). */
|
|
78
|
+
nextFloat(): number;
|
|
79
|
+
/** Uniform float in [lo, hi). */
|
|
80
|
+
uniform(lo: number, hi: number): number;
|
|
81
|
+
/** Integer in [0, n) — modulo method (matches umap's structural usage). */
|
|
82
|
+
randint(n: number): number;
|
|
83
|
+
/** Integer in [lo, hi) like numpy randint. */
|
|
84
|
+
randintRange(lo: number, hi: number): number;
|
|
85
|
+
/** Standard normal via Box–Muller (cached spare). */
|
|
86
|
+
normal(): number;
|
|
87
|
+
/** In-place Fisher–Yates shuffle. */
|
|
88
|
+
shuffle(arr: Int32Array | Uint32Array | Float32Array): void;
|
|
89
|
+
/**
|
|
90
|
+
* Seed a 3-word tau state like Python's
|
|
91
|
+
* `random_state.randint(INT32_MIN, INT32_MAX, 3)` (values in int32 range).
|
|
92
|
+
*/
|
|
93
|
+
tauState(): Int32Array;
|
|
94
|
+
/** Snapshot the full generator state (backend-fallback rng restoration). */
|
|
95
|
+
clone(): Pcg32;
|
|
96
|
+
/** Restore state from a clone() snapshot (un-consumes draws after the snapshot). */
|
|
97
|
+
restoreFrom(snapshot: Pcg32): void;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* taus88 combined Tausworthe step, structurally identical to umap's `tau_rand_int`
|
|
101
|
+
* but on u32 words (Python runs it on int64 with 32-bit truncations). Used for the
|
|
102
|
+
* SGD negative-sampling stream; parity with Python is statistical, not bitwise (§5.5).
|
|
103
|
+
* Returns a signed int32.
|
|
104
|
+
*/
|
|
105
|
+
declare function tauRandInt(state: Int32Array): number;
|
|
106
|
+
/** Floor-mod (Python `%` semantics) of a signed int by a positive int. */
|
|
107
|
+
declare function floorMod(a: number, n: number): number;
|
|
108
|
+
/** tau_rand: uniform in [0,1] from tauRandInt (umap utils.py:66-80). */
|
|
109
|
+
declare function tauRand(state: Int32Array): number;
|
|
110
|
+
//#endregion
|
|
111
|
+
//#region src/sparse.d.ts
|
|
112
|
+
/**
|
|
113
|
+
* CSR sparse matrix utilities. Canonical form: sorted column indices per row,
|
|
114
|
+
* duplicates summed, explicit zeros eliminated — matching scipy's behavior after
|
|
115
|
+
* `tocsr()` + `sum_duplicates()` + `eliminate_zeros()`.
|
|
116
|
+
*/
|
|
117
|
+
interface Csr {
|
|
118
|
+
data: Float64Array;
|
|
119
|
+
indices: Int32Array;
|
|
120
|
+
indptr: Int32Array;
|
|
121
|
+
rows: number;
|
|
122
|
+
cols: number;
|
|
123
|
+
}
|
|
124
|
+
declare function csrNnz(m: Csr): number;
|
|
125
|
+
/**
|
|
126
|
+
* Build canonical CSR from COO triplets: duplicates summed, zeros eliminated,
|
|
127
|
+
* columns sorted per row.
|
|
128
|
+
*/
|
|
129
|
+
declare function csrFromCoo(rows: number, cols: number, rowIdx: Int32Array, colIdx: Int32Array, values: Float64Array | Float32Array): Csr;
|
|
130
|
+
declare function csrTranspose(m: Csr): Csr;
|
|
131
|
+
/**
|
|
132
|
+
* Elementwise combine over the UNION sparsity of two canonical CSRs.
|
|
133
|
+
* `f(a, b)` receives 0 for absent entries; results equal to 0 are eliminated.
|
|
134
|
+
*/
|
|
135
|
+
declare function csrBinaryOp(A: Csr, B: Csr, f: (a: number, b: number) => number): Csr;
|
|
136
|
+
/** Drop explicit zeros (canonicalize). */
|
|
137
|
+
declare function csrEliminateZeros(m: Csr): Csr;
|
|
138
|
+
/** Map values in place. */
|
|
139
|
+
declare function csrMapValues(m: Csr, f: (v: number) => number): Csr;
|
|
140
|
+
/** Max of |A - B| over union sparsity, for tests. */
|
|
141
|
+
declare function csrMaxAbsDiff(A: Csr, B: Csr): number;
|
|
142
|
+
/** Row-normalize by max (scipy normalize(norm='max')): divide each row by its max value. */
|
|
143
|
+
declare function csrRowNormalizeMax(m: Csr): Csr;
|
|
144
|
+
/** COO iteration helper. */
|
|
145
|
+
declare function csrForEach(m: Csr, cb: (row: number, col: number, val: number) => void): void;
|
|
146
|
+
/** Deep copy. */
|
|
147
|
+
declare function csrCopy(m: Csr): Csr;
|
|
148
|
+
//#endregion
|
|
149
|
+
export { MetricFn as C, UmapError as D, UmapConvergenceWarning as E, UmapValidationError as O, Matrix as S, UmapBackendError as T, DenseInput as _, csrForEach as a, Labels as b, csrMaxAbsDiff as c, csrTranspose as d, Pcg32 as f, CSRInput as g, tauRandInt as h, csrEliminateZeros as i, csrNnz as l, tauRand as m, csrBinaryOp as n, csrFromCoo as o, floorMod as p, csrCopy as r, csrMapValues as s, Csr as t, csrRowNormalizeMax as u, Embedding as v, Target as w, Logger as x, KnnGraph as y };
|
|
150
|
+
//# sourceMappingURL=sparse-BxSeVhO4.d.ts.map
|
package/dist/webgpu.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { S as Matrix, f as Pcg32, t as Csr, x as Logger, y as KnnGraph } from "./sparse-BxSeVhO4.js";
|
|
2
|
+
|
|
3
|
+
//#region src/backends/webgpu/device.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* WebGPU device acquisition (§5.4): injected device/provider or navigator.gpu,
|
|
7
|
+
* elevated limits up to adapter limits. Device loss is tracked on the context
|
|
8
|
+
* (kernels check it at loop boundaries and raise a typed UmapBackendError; the
|
|
9
|
+
* estimator falls back to CPU under backend 'auto' — see DECISIONS D-017), and
|
|
10
|
+
* every kernel runs inside validation + out-of-memory error scopes so GPU
|
|
11
|
+
* failures surface as typed errors instead of silent zero-filled readbacks.
|
|
12
|
+
*/
|
|
13
|
+
interface GpuContext {
|
|
14
|
+
device: GPUDevice;
|
|
15
|
+
adapterInfo: {
|
|
16
|
+
vendor: string;
|
|
17
|
+
architecture: string;
|
|
18
|
+
device: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
limits: {
|
|
22
|
+
maxStorageBufferBindingSize: number;
|
|
23
|
+
maxBufferSize: number;
|
|
24
|
+
maxWorkgroupsX: number;
|
|
25
|
+
};
|
|
26
|
+
timestamps: boolean;
|
|
27
|
+
injected: boolean;
|
|
28
|
+
/** set when the device reports loss; kernels must stop using the context */
|
|
29
|
+
lost: {
|
|
30
|
+
reason: string;
|
|
31
|
+
message: string;
|
|
32
|
+
} | null;
|
|
33
|
+
}
|
|
34
|
+
type DeviceProvider = GPUDevice | (() => Promise<GPUDevice>) | Promise<GPUDevice>;
|
|
35
|
+
declare function acquireGpu(provided?: DeviceProvider): Promise<GpuContext>;
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/backends/webgpu/knn.d.ts
|
|
38
|
+
type GpuMetricKind = 0 | 1 | 2 | 3 | 4;
|
|
39
|
+
interface GpuMetricPlan {
|
|
40
|
+
kind: GpuMetricKind;
|
|
41
|
+
/** center rows before upload (correlation) */
|
|
42
|
+
center: boolean;
|
|
43
|
+
correction: (d: number) => number;
|
|
44
|
+
}
|
|
45
|
+
/** GPU support matrix (§4.3). Returns null for unsupported metrics. */
|
|
46
|
+
declare function gpuMetricPlan(name: string): GpuMetricPlan | null;
|
|
47
|
+
interface GpuKnnOptions {
|
|
48
|
+
/** candidates per dispatch (watchdog safety); tuned by data size */
|
|
49
|
+
candChunk?: number;
|
|
50
|
+
onProgress?: (done: number, total: number) => void;
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* kNN of `queries` against `data` (self-kNN when they alias) in INTERNAL metric
|
|
55
|
+
* space; returns corrected, ascending-sorted results.
|
|
56
|
+
*/
|
|
57
|
+
declare function gpuKnn(ctx: GpuContext, X: Matrix, queries: Matrix | null, k: number, plan: GpuMetricPlan, {
|
|
58
|
+
candChunk,
|
|
59
|
+
onProgress,
|
|
60
|
+
signal
|
|
61
|
+
}?: GpuKnnOptions): Promise<KnnGraph>;
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/backends/webgpu/layout.d.ts
|
|
64
|
+
type GpuLayoutStrategy = 'vertexGather' | 'edgeAtomic';
|
|
65
|
+
interface GpuLayoutOptions {
|
|
66
|
+
gamma: number;
|
|
67
|
+
initialAlpha: number;
|
|
68
|
+
negativeSampleRate: number;
|
|
69
|
+
moveOther: boolean;
|
|
70
|
+
strategy?: GpuLayoutStrategy;
|
|
71
|
+
onEpoch?: (info: {
|
|
72
|
+
epoch: number;
|
|
73
|
+
nEpochs: number;
|
|
74
|
+
phase: string;
|
|
75
|
+
embedding?: Float32Array;
|
|
76
|
+
}) => void;
|
|
77
|
+
snapshotEvery?: number;
|
|
78
|
+
signal?: AbortSignal;
|
|
79
|
+
}
|
|
80
|
+
declare function gpuOptimizeLayout(ctx: GpuContext, embedding: Float32Array,
|
|
81
|
+
// mutated with the final result
|
|
82
|
+
dim: number, head: Int32Array, tail: Int32Array, nEpochs: number, nVertices: number, epochsPerSample: Float64Array, a: number, b: number, rng: Pcg32, opts: GpuLayoutOptions): Promise<Float32Array>;
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/backends/webgpu/spectral.d.ts
|
|
85
|
+
interface GpuInitResult {
|
|
86
|
+
embedding: Float32Array;
|
|
87
|
+
spectralFallback: boolean;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Spectral init with GPU SpMV. Returns null for multi-component graphs (the
|
|
91
|
+
* caller must then run the CPU init path; no rng draws are consumed here in
|
|
92
|
+
* that case) and for dim > 5 (kernel block bound).
|
|
93
|
+
*/
|
|
94
|
+
declare function gpuSpectralInit(ctx: GpuContext, graph: Csr, dim: number, rng: Pcg32, logger?: Logger, signal?: AbortSignal): Promise<GpuInitResult | null>;
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/backends/webgpu/index.d.ts
|
|
97
|
+
/** Which fit configurations the GPU backend supports end-to-end (§4.3). */
|
|
98
|
+
declare function gpuSupportsConfig(opts: {
|
|
99
|
+
metric?: string | ((a: Float32Array, b: Float32Array) => number);
|
|
100
|
+
outputMetric?: string;
|
|
101
|
+
densMap?: boolean;
|
|
102
|
+
nNeighbors?: number;
|
|
103
|
+
nComponents?: number;
|
|
104
|
+
}): {
|
|
105
|
+
knn: boolean;
|
|
106
|
+
layout: boolean;
|
|
107
|
+
reason?: string;
|
|
108
|
+
};
|
|
109
|
+
//#endregion
|
|
110
|
+
export { type DeviceProvider, type GpuContext, type GpuInitResult, type GpuLayoutOptions, type GpuLayoutStrategy, type GpuMetricPlan, acquireGpu, gpuKnn, gpuMetricPlan, gpuOptimizeLayout, gpuSpectralInit, gpuSupportsConfig };
|
|
111
|
+
//# sourceMappingURL=webgpu.d.ts.map
|