pca-web 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +421 -0
- package/dist/base.d.ts +79 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +358 -0
- package/dist/base.js.map +1 -0
- package/dist/incremental-pca.d.ts +86 -0
- package/dist/incremental-pca.d.ts.map +1 -0
- package/dist/incremental-pca.js +397 -0
- package/dist/incremental-pca.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/matrix.d.ts +44 -0
- package/dist/matrix.d.ts.map +1 -0
- package/dist/matrix.js +99 -0
- package/dist/matrix.js.map +1 -0
- package/dist/model.d.ts +86 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +132 -0
- package/dist/model.js.map +1 -0
- package/dist/numeric/blas.d.ts +33 -0
- package/dist/numeric/blas.d.ts.map +1 -0
- package/dist/numeric/blas.js +130 -0
- package/dist/numeric/blas.js.map +1 -0
- package/dist/numeric/eigh.d.ts +21 -0
- package/dist/numeric/eigh.d.ts.map +1 -0
- package/dist/numeric/eigh.js +233 -0
- package/dist/numeric/eigh.js.map +1 -0
- package/dist/numeric/lanczos.d.ts +31 -0
- package/dist/numeric/lanczos.d.ts.map +1 -0
- package/dist/numeric/lanczos.js +287 -0
- package/dist/numeric/lanczos.js.map +1 -0
- package/dist/numeric/lu.d.ts +27 -0
- package/dist/numeric/lu.d.ts.map +1 -0
- package/dist/numeric/lu.js +149 -0
- package/dist/numeric/lu.js.map +1 -0
- package/dist/numeric/mle.d.ts +5 -0
- package/dist/numeric/mle.d.ts.map +1 -0
- package/dist/numeric/mle.js +67 -0
- package/dist/numeric/mle.js.map +1 -0
- package/dist/numeric/qr.d.ts +15 -0
- package/dist/numeric/qr.d.ts.map +1 -0
- package/dist/numeric/qr.js +88 -0
- package/dist/numeric/qr.js.map +1 -0
- package/dist/numeric/randomized.d.ts +54 -0
- package/dist/numeric/randomized.d.ts.map +1 -0
- package/dist/numeric/randomized.js +130 -0
- package/dist/numeric/randomized.js.map +1 -0
- package/dist/numeric/rng.d.ts +40 -0
- package/dist/numeric/rng.d.ts.map +1 -0
- package/dist/numeric/rng.js +127 -0
- package/dist/numeric/rng.js.map +1 -0
- package/dist/numeric/special.d.ts +2 -0
- package/dist/numeric/special.d.ts.map +1 -0
- package/dist/numeric/special.js +25 -0
- package/dist/numeric/special.js.map +1 -0
- package/dist/numeric/stats.d.ts +27 -0
- package/dist/numeric/stats.d.ts.map +1 -0
- package/dist/numeric/stats.js +110 -0
- package/dist/numeric/stats.js.map +1 -0
- package/dist/numeric/svd.d.ts +27 -0
- package/dist/numeric/svd.d.ts.map +1 -0
- package/dist/numeric/svd.js +374 -0
- package/dist/numeric/svd.js.map +1 -0
- package/dist/numeric/svdflip.d.ts +9 -0
- package/dist/numeric/svdflip.d.ts.map +1 -0
- package/dist/numeric/svdflip.js +32 -0
- package/dist/numeric/svdflip.js.map +1 -0
- package/dist/pca.d.ts +170 -0
- package/dist/pca.d.ts.map +1 -0
- package/dist/pca.js +649 -0
- package/dist/pca.js.map +1 -0
- package/dist/progress.d.ts +155 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +173 -0
- package/dist/progress.js.map +1 -0
- package/dist/scheduling.d.ts +66 -0
- package/dist/scheduling.d.ts.map +1 -0
- package/dist/scheduling.js +160 -0
- package/dist/scheduling.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +17 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +36 -0
- package/dist/validation.js.map +1 -0
- package/dist/webgpu/df64.d.ts +18 -0
- package/dist/webgpu/df64.d.ts.map +1 -0
- package/dist/webgpu/df64.js +42 -0
- package/dist/webgpu/df64.js.map +1 -0
- package/dist/webgpu/engine.d.ts +74 -0
- package/dist/webgpu/engine.d.ts.map +1 -0
- package/dist/webgpu/engine.js +326 -0
- package/dist/webgpu/engine.js.map +1 -0
- package/dist/webgpu/gpu-pca.d.ts +90 -0
- package/dist/webgpu/gpu-pca.d.ts.map +1 -0
- package/dist/webgpu/gpu-pca.js +407 -0
- package/dist/webgpu/gpu-pca.js.map +1 -0
- package/dist/webgpu/index.d.ts +19 -0
- package/dist/webgpu/index.d.ts.map +1 -0
- package/dist/webgpu/index.js +16 -0
- package/dist/webgpu/index.js.map +1 -0
- package/dist/webgpu/kernels.d.ts +47 -0
- package/dist/webgpu/kernels.d.ts.map +1 -0
- package/dist/webgpu/kernels.js +147 -0
- package/dist/webgpu/kernels.js.map +1 -0
- package/dist/worker/client.d.ts +174 -0
- package/dist/worker/client.d.ts.map +1 -0
- package/dist/worker/client.js +482 -0
- package/dist/worker/client.js.map +1 -0
- package/dist/worker/handler.d.ts +17 -0
- package/dist/worker/handler.d.ts.map +1 -0
- package/dist/worker/handler.js +404 -0
- package/dist/worker/handler.js.map +1 -0
- package/dist/worker/protocol.d.ts +192 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +70 -0
- package/dist/worker/protocol.js.map +1 -0
- package/dist/worker/worker.d.ts +14 -0
- package/dist/worker/worker.d.ts.map +1 -0
- package/dist/worker/worker.js +20 -0
- package/dist/worker/worker.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WGSL GEMM kernels with near-f64 accuracy on f32-only hardware.
|
|
3
|
+
*
|
|
4
|
+
* Design constraint discovered empirically (Chrome/Dawn on Metal): the MSL
|
|
5
|
+
* compiler applies fast-math — classic Dekker/Knuth error-free
|
|
6
|
+
* transformations (two_sum, split) are algebraically folded to zero, and
|
|
7
|
+
* multiply-add pairs are contracted into fma, so double-single (df64)
|
|
8
|
+
* accumulation silently degrades to f32. What DOES survive, verified by
|
|
9
|
+
* on-device probes:
|
|
10
|
+
* - fma(a, b, -a*b) computes the exact f32 multiplication error
|
|
11
|
+
* - single float ops are correctly rounded (no cross-op guarantees)
|
|
12
|
+
* - i32 conversions and integer adds are exact and untouched by fast-math
|
|
13
|
+
*
|
|
14
|
+
* So products use fma-exact two_prod, and ACCUMULATION is exact integer
|
|
15
|
+
* binning: every product term is decomposed — exactly, via power-of-two
|
|
16
|
+
* scaling and fma residuals — into 5 levels of 13-bit integers on a fixed
|
|
17
|
+
* per-dispatch grid (exponent E bounds every |a·b| term), accumulated in
|
|
18
|
+
* i32 (no rounding at all), and recombined in float64 on the CPU. The only
|
|
19
|
+
* error is the truncated tail below the last grid level:
|
|
20
|
+
* |error| ≤ K·7·2^(E-65) ≤ maxProduct·2^-45
|
|
21
|
+
* comparable to true f64 accumulation. Inputs are (hi, lo) f32 pairs of the
|
|
22
|
+
* f64 values; the three significant cross products (+ the tiny lo·lo term)
|
|
23
|
+
* feed the binner, preserving ~48 significant bits end to end.
|
|
24
|
+
*
|
|
25
|
+
* One tiled kernel template covers all four op(A)·op(B) transpose variants;
|
|
26
|
+
* only the injected index expressions differ.
|
|
27
|
+
*/
|
|
28
|
+
export const TILE = 16;
|
|
29
|
+
/**
|
|
30
|
+
* Per-level bin capacity is 2^13; with ≤7 terms per MAC each contributing
|
|
31
|
+
* |n| ≤ 2^13 per level, i32 overflows at K ≈ 2^31/(7·2^13) ≈ 37k. The
|
|
32
|
+
* engine splits the K dimension at this bound and sums chunks in f64.
|
|
33
|
+
*/
|
|
34
|
+
export const MAX_K_PER_DISPATCH = 30000;
|
|
35
|
+
/** i32 bin levels per output element (13 bits each → 65 bits of grid). */
|
|
36
|
+
export const BIN_LEVELS = 5;
|
|
37
|
+
/** i32 slots per output element in the C buffer (BIN_LEVELS padded to 8). */
|
|
38
|
+
export const OUT_SLOTS = 8;
|
|
39
|
+
/**
|
|
40
|
+
* Builds the GEMM shader for C(M×N) = op(A)·op(B) over K = [kStart, kStart+kCount).
|
|
41
|
+
*
|
|
42
|
+
* Physical shapes: A is M×K_total when !ta, K_total×M when ta; B is
|
|
43
|
+
* K_total×N when !tb, N×K_total when tb. All row-major, ds-encoded
|
|
44
|
+
* (array<vec2f> of hi/lo pairs). C is array<i32>, OUT_SLOTS per element.
|
|
45
|
+
*/
|
|
46
|
+
export function gemmShader(ta, tb) {
|
|
47
|
+
// Element (i, l) of op(A) and (l, j) of op(B) in physical storage
|
|
48
|
+
// (kTotal is the stride of the K dimension in the untransposed layout).
|
|
49
|
+
const aIndex = ta ? 'l * dims.m + i' : 'i * dims.kTotal + l';
|
|
50
|
+
const bIndex = tb ? 'j * dims.kTotal + l' : 'l * dims.n + j';
|
|
51
|
+
return /* wgsl */ `
|
|
52
|
+
struct Dims {
|
|
53
|
+
m: u32,
|
|
54
|
+
n: u32,
|
|
55
|
+
kTotal: u32,
|
|
56
|
+
kStart: u32,
|
|
57
|
+
kCount: u32,
|
|
58
|
+
e: i32, // grid exponent: every |product term| < 2^e
|
|
59
|
+
pad0: u32,
|
|
60
|
+
pad1: u32,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@group(0) @binding(0) var<storage, read> matA: array<vec2f>;
|
|
64
|
+
@group(0) @binding(1) var<storage, read> matB: array<vec2f>;
|
|
65
|
+
@group(0) @binding(2) var<storage, read_write> matC: array<i32>;
|
|
66
|
+
@group(0) @binding(3) var<uniform> dims: Dims;
|
|
67
|
+
|
|
68
|
+
var<workgroup> tileA: array<vec2f, ${TILE * TILE}>;
|
|
69
|
+
var<workgroup> tileB: array<vec2f, ${TILE * TILE}>;
|
|
70
|
+
|
|
71
|
+
fn loadA(i: u32, l: u32) -> vec2f {
|
|
72
|
+
if (i < dims.m && l < dims.kStart + dims.kCount) {
|
|
73
|
+
return matA[${aIndex}];
|
|
74
|
+
}
|
|
75
|
+
return vec2f(0.0, 0.0);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
fn loadB(l: u32, j: u32) -> vec2f {
|
|
79
|
+
if (l < dims.kStart + dims.kCount && j < dims.n) {
|
|
80
|
+
return matB[${bIndex}];
|
|
81
|
+
}
|
|
82
|
+
return vec2f(0.0, 0.0);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Decomposes x exactly into 13-bit integers on grids 2^(e-13)…2^(e-65) and
|
|
86
|
+
// adds them to the bins. Every step is exact: power-of-two scaling shifts
|
|
87
|
+
// the exponent only, i32() truncates exactly, and the fma residual is
|
|
88
|
+
// representable (bits of x strictly below the level's grid).
|
|
89
|
+
fn binAdd(x: f32, acc: ptr<function, array<i32, ${BIN_LEVELS}>>) {
|
|
90
|
+
var r = x;
|
|
91
|
+
for (var lvl = 0; lvl < ${BIN_LEVELS}; lvl++) {
|
|
92
|
+
let g = ldexp(1.0, dims.e - 13 * (lvl + 1));
|
|
93
|
+
let n = i32(r * ldexp(1.0, 13 * (lvl + 1) - dims.e));
|
|
94
|
+
(*acc)[lvl] += n;
|
|
95
|
+
r = fma(-f32(n), g, r);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@compute @workgroup_size(${TILE}, ${TILE})
|
|
100
|
+
fn main(
|
|
101
|
+
@builtin(workgroup_id) wg: vec3u,
|
|
102
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
103
|
+
) {
|
|
104
|
+
let row = wg.y * ${TILE}u + lid.y;
|
|
105
|
+
let col = wg.x * ${TILE}u + lid.x;
|
|
106
|
+
var acc: array<i32, ${BIN_LEVELS}>;
|
|
107
|
+
for (var lvl = 0; lvl < ${BIN_LEVELS}; lvl++) {
|
|
108
|
+
acc[lvl] = 0;
|
|
109
|
+
}
|
|
110
|
+
let numTiles = (dims.kCount + ${TILE}u - 1u) / ${TILE}u;
|
|
111
|
+
for (var t = 0u; t < numTiles; t++) {
|
|
112
|
+
let kA = dims.kStart + t * ${TILE}u + lid.x;
|
|
113
|
+
let kB = dims.kStart + t * ${TILE}u + lid.y;
|
|
114
|
+
tileA[lid.y * ${TILE}u + lid.x] = loadA(row, kA);
|
|
115
|
+
tileB[lid.y * ${TILE}u + lid.x] = loadB(kB, col);
|
|
116
|
+
workgroupBarrier();
|
|
117
|
+
for (var m = 0u; m < ${TILE}u; m++) {
|
|
118
|
+
let a = tileA[lid.y * ${TILE}u + m];
|
|
119
|
+
let b = tileB[m * ${TILE}u + lid.x];
|
|
120
|
+
// Exact ds cross products via fma (verified exact on-device).
|
|
121
|
+
let p1 = a.x * b.x;
|
|
122
|
+
let e1 = fma(a.x, b.x, -p1);
|
|
123
|
+
let p2 = a.x * b.y;
|
|
124
|
+
let e2 = fma(a.x, b.y, -p2);
|
|
125
|
+
let p3 = a.y * b.x;
|
|
126
|
+
let e3 = fma(a.y, b.x, -p3);
|
|
127
|
+
let p4 = a.y * b.y; // ≤ 2^-48·|a·b| — plain product suffices
|
|
128
|
+
binAdd(p1, &acc);
|
|
129
|
+
binAdd(e1, &acc);
|
|
130
|
+
binAdd(p2, &acc);
|
|
131
|
+
binAdd(e2, &acc);
|
|
132
|
+
binAdd(p3, &acc);
|
|
133
|
+
binAdd(e3, &acc);
|
|
134
|
+
binAdd(p4, &acc);
|
|
135
|
+
}
|
|
136
|
+
workgroupBarrier();
|
|
137
|
+
}
|
|
138
|
+
if (row < dims.m && col < dims.n) {
|
|
139
|
+
let base = (row * dims.n + col) * ${OUT_SLOTS}u;
|
|
140
|
+
for (var lvl = 0u; lvl < ${BIN_LEVELS}u; lvl++) {
|
|
141
|
+
matC[base + lvl] = acc[lvl];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=kernels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernels.js","sourceRoot":"","sources":["../../src/webgpu/kernels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;AAEvB;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAE5B,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EAAW,EAAE,EAAW;IACjD,kEAAkE;IAClE,wEAAwE;IACxE,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAC7D,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC7D,OAAO,UAAU,CAAC;;;;;;;;;;;;;;;;;qCAiBiB,IAAI,GAAG,IAAI;qCACX,IAAI,GAAG,IAAI;;;;kBAI9B,MAAM;;;;;;;kBAON,MAAM;;;;;;;;;kDAS0B,UAAU;;4BAEhC,UAAU;;;;;;;;2BAQX,IAAI,KAAK,IAAI;;;;;qBAKnB,IAAI;qBACJ,IAAI;wBACD,UAAU;4BACN,UAAU;;;kCAGJ,IAAI,aAAa,IAAI;;iCAEtB,IAAI;iCACJ,IAAI;oBACjB,IAAI;oBACJ,IAAI;;2BAEG,IAAI;8BACD,IAAI;0BACR,IAAI;;;;;;;;;;;;;;;;;;;;wCAoBU,SAAS;+BAClB,UAAU;;;;;CAKxC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pca-web/client` — main-thread async proxies for estimators running in a
|
|
3
|
+
* pca-web worker: `WorkerPCA` and `WorkerIncrementalPCA`.
|
|
4
|
+
*
|
|
5
|
+
* Import discipline (enforced by a dist-graph test): this module pulls in
|
|
6
|
+
* only matrix/types/validation/model/protocol — never estimator or solver
|
|
7
|
+
* code — so apps that fit exclusively in the worker don't bundle the
|
|
8
|
+
* solvers twice.
|
|
9
|
+
*
|
|
10
|
+
* Fitted attributes are mirrored synchronously on the client: every fit
|
|
11
|
+
* piggybacks the resulting model on its response, so `components`,
|
|
12
|
+
* `explainedVariance`, `exportModel()`, … work without a round-trip once
|
|
13
|
+
* the fit promise resolves.
|
|
14
|
+
*/
|
|
15
|
+
import { Matrix, type MatrixInput } from '../matrix.js';
|
|
16
|
+
import { type AnyPCAModel, type IncrementalPCAModel, type PCAModel } from '../model.js';
|
|
17
|
+
import type { PCAFitProgress } from '../progress.js';
|
|
18
|
+
import type { AbortSignalLike } from '../scheduling.js';
|
|
19
|
+
import type { FloatArray } from '../types.js';
|
|
20
|
+
import { type PCAWorkerLike, type ProgressOptions, type QueueableRequest, type WireIPCAOptions, type WireMatrix, type WirePCAOptions, type WireProgress, type WireValue, type WorkerEstimatorInfo, type WorkerFactory, type WorkerMethod } from './protocol.js';
|
|
21
|
+
declare global {
|
|
22
|
+
interface ImportMeta {
|
|
23
|
+
url: string;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Thrown into in-flight calls when `terminate()` hard-kills the worker. */
|
|
27
|
+
export declare class WorkerTerminatedError extends Error {
|
|
28
|
+
readonly name = "WorkerTerminatedError";
|
|
29
|
+
constructor(message?: string);
|
|
30
|
+
}
|
|
31
|
+
/** Client-side abort wiring accepts a real AbortSignal when events are needed. */
|
|
32
|
+
interface EventfulAbortSignal extends AbortSignalLike {
|
|
33
|
+
addEventListener?: (type: 'abort', listener: () => void, opts?: {
|
|
34
|
+
once?: boolean;
|
|
35
|
+
}) => void;
|
|
36
|
+
removeEventListener?: (type: 'abort', listener: () => void) => void;
|
|
37
|
+
}
|
|
38
|
+
/** Per-fit options for the worker proxies. */
|
|
39
|
+
export interface WorkerFitOptions {
|
|
40
|
+
signal?: EventfulAbortSignal;
|
|
41
|
+
/**
|
|
42
|
+
* Transfer the input's buffer to the worker instead of copying (the
|
|
43
|
+
* caller's array becomes unusable). Views are tight-sliced first, so a
|
|
44
|
+
* subarray's parent buffer is never touched either way.
|
|
45
|
+
*/
|
|
46
|
+
transfer?: boolean;
|
|
47
|
+
onProgress?: (event: PCAFitProgress) => void;
|
|
48
|
+
progress?: ProgressOptions;
|
|
49
|
+
}
|
|
50
|
+
/** Options shared by both proxies' constructors. */
|
|
51
|
+
export interface WorkerClientOptions {
|
|
52
|
+
/**
|
|
53
|
+
* The worker (or MessagePort, or Node worker_threads port) to run on, or
|
|
54
|
+
* a factory producing one. Clients given the same port instance share
|
|
55
|
+
* one connection. Omit to spawn the packaged default worker — see the
|
|
56
|
+
* README's bundler recipes if your bundler cannot resolve it.
|
|
57
|
+
*/
|
|
58
|
+
worker?: PCAWorkerLike | WorkerFactory;
|
|
59
|
+
/** Default progress callback for all fits (per-call options override). */
|
|
60
|
+
onProgress?: (event: PCAFitProgress) => void;
|
|
61
|
+
/** Default progress tuning (throttle interval, snapshots). */
|
|
62
|
+
progress?: ProgressOptions;
|
|
63
|
+
}
|
|
64
|
+
export interface WorkerPCAOptions extends WirePCAOptions, WorkerClientOptions {
|
|
65
|
+
/** Where fits run: 'cpu' (default) or 'webgpu' (falls back to CPU). */
|
|
66
|
+
backend?: 'cpu' | 'webgpu';
|
|
67
|
+
}
|
|
68
|
+
export interface WorkerIncrementalPCAOptions extends WireIPCAOptions, WorkerClientOptions {
|
|
69
|
+
}
|
|
70
|
+
export type { WorkerEstimatorInfo } from './protocol.js';
|
|
71
|
+
declare class Connection {
|
|
72
|
+
readonly port: PCAWorkerLike;
|
|
73
|
+
private readonly pending;
|
|
74
|
+
private nextId;
|
|
75
|
+
private readyResolve;
|
|
76
|
+
private readonly readyPromise;
|
|
77
|
+
private dead;
|
|
78
|
+
constructor(port: PCAWorkerLike);
|
|
79
|
+
private readonly listener;
|
|
80
|
+
allocId(): number;
|
|
81
|
+
ready(): Promise<void>;
|
|
82
|
+
post(msg: {
|
|
83
|
+
t: 'abort';
|
|
84
|
+
targetId: number;
|
|
85
|
+
}): void;
|
|
86
|
+
request(msg: QueueableRequest, transfer?: ArrayBufferLike[], onProgress?: (e: WireProgress) => void): Promise<{
|
|
87
|
+
value: WireValue;
|
|
88
|
+
model?: AnyPCAModel;
|
|
89
|
+
}>;
|
|
90
|
+
/** Hard-kill: rejects all in-flight calls and poisons future ones. */
|
|
91
|
+
terminate(): void;
|
|
92
|
+
}
|
|
93
|
+
declare abstract class WorkerEstimatorBase<M extends AnyPCAModel> {
|
|
94
|
+
protected readonly conn: Connection;
|
|
95
|
+
protected readonly estId: string;
|
|
96
|
+
protected readonly ownsWorker: boolean;
|
|
97
|
+
protected readonly defaultOnProgress?: (event: PCAFitProgress) => void;
|
|
98
|
+
protected readonly defaultProgress?: ProgressOptions;
|
|
99
|
+
protected model_: M | null;
|
|
100
|
+
protected whitenOpt: boolean;
|
|
101
|
+
private readonly createDone;
|
|
102
|
+
private disposed;
|
|
103
|
+
protected constructor(estimator: 'pca' | 'ipca', backend: 'cpu' | 'webgpu', wireOptions: WirePCAOptions | WireIPCAOptions, client: WorkerClientOptions, hydrate?: M);
|
|
104
|
+
/** Resolves when the worker handshake and this estimator's create are done. */
|
|
105
|
+
ready(): Promise<void>;
|
|
106
|
+
/** Graceful shutdown of this estimator (terminates owned workers too). */
|
|
107
|
+
dispose(): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Hard-kill the worker: all in-flight calls reject and subsequent calls
|
|
110
|
+
* keep rejecting with WorkerTerminatedError.
|
|
111
|
+
*/
|
|
112
|
+
terminate(): void;
|
|
113
|
+
protected mirror(): M;
|
|
114
|
+
protected call(method: WorkerMethod, payload: {
|
|
115
|
+
x?: WireMatrix;
|
|
116
|
+
model?: AnyPCAModel;
|
|
117
|
+
returnModel?: boolean;
|
|
118
|
+
}, transfer?: ArrayBufferLike[], fit?: WorkerFitOptions): Promise<WireValue>;
|
|
119
|
+
protected wireX(X: MatrixInput, fit?: WorkerFitOptions): {
|
|
120
|
+
x: WireMatrix;
|
|
121
|
+
transfer: ArrayBufferLike[];
|
|
122
|
+
};
|
|
123
|
+
protected callMatrix(method: WorkerMethod, X?: MatrixInput): Promise<Matrix>;
|
|
124
|
+
get components(): Matrix;
|
|
125
|
+
get explainedVariance(): FloatArray;
|
|
126
|
+
get explainedVarianceRatio(): FloatArray;
|
|
127
|
+
get singularValues(): FloatArray;
|
|
128
|
+
get mean(): FloatArray;
|
|
129
|
+
get nComponents(): number;
|
|
130
|
+
get nFeaturesIn(): number;
|
|
131
|
+
get noiseVariance(): number;
|
|
132
|
+
get whiten(): boolean;
|
|
133
|
+
getFeatureNamesOut(): string[];
|
|
134
|
+
/** The current model as an independent copy (sync, from the mirror). */
|
|
135
|
+
exportModel(): M;
|
|
136
|
+
/** Rehydrates worker and mirror from a serialized model. */
|
|
137
|
+
importModel(model: M): Promise<this>;
|
|
138
|
+
/** Which backend actually executes, plus adapter details. */
|
|
139
|
+
info(): Promise<WorkerEstimatorInfo>;
|
|
140
|
+
transform(X: MatrixInput): Promise<Matrix>;
|
|
141
|
+
inverseTransform(X: MatrixInput): Promise<Matrix>;
|
|
142
|
+
getCovariance(): Promise<Matrix>;
|
|
143
|
+
getPrecision(): Promise<Matrix>;
|
|
144
|
+
}
|
|
145
|
+
export declare class WorkerPCA extends WorkerEstimatorBase<PCAModel> {
|
|
146
|
+
constructor(options?: WorkerPCAOptions, /** @internal use fromModel */ hydrate?: PCAModel);
|
|
147
|
+
/**
|
|
148
|
+
* Creates a proxy already hydrated with a fitted model — the worker
|
|
149
|
+
* adopts it (pipelined with create) and the sync mirror is available
|
|
150
|
+
* immediately.
|
|
151
|
+
*/
|
|
152
|
+
static fromModel(model: PCAModel, options?: WorkerPCAOptions): WorkerPCA;
|
|
153
|
+
fit(X: MatrixInput, options?: WorkerFitOptions): Promise<this>;
|
|
154
|
+
fitTransform(X: MatrixInput, options?: WorkerFitOptions): Promise<Matrix>;
|
|
155
|
+
scoreSamples(X: MatrixInput): Promise<FloatArray>;
|
|
156
|
+
score(X: MatrixInput): Promise<number>;
|
|
157
|
+
get nSamples(): number;
|
|
158
|
+
/** The solver the last fit actually used. */
|
|
159
|
+
get resolvedSvdSolver(): PCAModel['svdSolver'];
|
|
160
|
+
}
|
|
161
|
+
export declare class WorkerIncrementalPCA extends WorkerEstimatorBase<IncrementalPCAModel> {
|
|
162
|
+
constructor(options?: WorkerIncrementalPCAOptions,
|
|
163
|
+
/** @internal use fromModel */ hydrate?: IncrementalPCAModel);
|
|
164
|
+
static fromModel(model: IncrementalPCAModel, options?: WorkerIncrementalPCAOptions): WorkerIncrementalPCA;
|
|
165
|
+
fit(X: MatrixInput, options?: WorkerFitOptions): Promise<this>;
|
|
166
|
+
fitTransform(X: MatrixInput, options?: WorkerFitOptions): Promise<Matrix>;
|
|
167
|
+
/** One incremental batch — sklearn's partial_fit, off-thread. */
|
|
168
|
+
partialFit(X: MatrixInput, options?: WorkerFitOptions): Promise<this>;
|
|
169
|
+
get variance(): Float64Array;
|
|
170
|
+
get nSamplesSeen(): number;
|
|
171
|
+
get batchSize(): number;
|
|
172
|
+
}
|
|
173
|
+
export type { PCAWorkerLike, ProgressOptions, WireMatrix, WorkerFactory, } from './protocol.js';
|
|
174
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"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"}
|