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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +421 -0
  3. package/dist/base.d.ts +79 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +358 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/incremental-pca.d.ts +86 -0
  8. package/dist/incremental-pca.d.ts.map +1 -0
  9. package/dist/incremental-pca.js +397 -0
  10. package/dist/incremental-pca.js.map +1 -0
  11. package/dist/index.d.ts +21 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/matrix.d.ts +44 -0
  16. package/dist/matrix.d.ts.map +1 -0
  17. package/dist/matrix.js +99 -0
  18. package/dist/matrix.js.map +1 -0
  19. package/dist/model.d.ts +86 -0
  20. package/dist/model.d.ts.map +1 -0
  21. package/dist/model.js +132 -0
  22. package/dist/model.js.map +1 -0
  23. package/dist/numeric/blas.d.ts +33 -0
  24. package/dist/numeric/blas.d.ts.map +1 -0
  25. package/dist/numeric/blas.js +130 -0
  26. package/dist/numeric/blas.js.map +1 -0
  27. package/dist/numeric/eigh.d.ts +21 -0
  28. package/dist/numeric/eigh.d.ts.map +1 -0
  29. package/dist/numeric/eigh.js +233 -0
  30. package/dist/numeric/eigh.js.map +1 -0
  31. package/dist/numeric/lanczos.d.ts +31 -0
  32. package/dist/numeric/lanczos.d.ts.map +1 -0
  33. package/dist/numeric/lanczos.js +287 -0
  34. package/dist/numeric/lanczos.js.map +1 -0
  35. package/dist/numeric/lu.d.ts +27 -0
  36. package/dist/numeric/lu.d.ts.map +1 -0
  37. package/dist/numeric/lu.js +149 -0
  38. package/dist/numeric/lu.js.map +1 -0
  39. package/dist/numeric/mle.d.ts +5 -0
  40. package/dist/numeric/mle.d.ts.map +1 -0
  41. package/dist/numeric/mle.js +67 -0
  42. package/dist/numeric/mle.js.map +1 -0
  43. package/dist/numeric/qr.d.ts +15 -0
  44. package/dist/numeric/qr.d.ts.map +1 -0
  45. package/dist/numeric/qr.js +88 -0
  46. package/dist/numeric/qr.js.map +1 -0
  47. package/dist/numeric/randomized.d.ts +54 -0
  48. package/dist/numeric/randomized.d.ts.map +1 -0
  49. package/dist/numeric/randomized.js +130 -0
  50. package/dist/numeric/randomized.js.map +1 -0
  51. package/dist/numeric/rng.d.ts +40 -0
  52. package/dist/numeric/rng.d.ts.map +1 -0
  53. package/dist/numeric/rng.js +127 -0
  54. package/dist/numeric/rng.js.map +1 -0
  55. package/dist/numeric/special.d.ts +2 -0
  56. package/dist/numeric/special.d.ts.map +1 -0
  57. package/dist/numeric/special.js +25 -0
  58. package/dist/numeric/special.js.map +1 -0
  59. package/dist/numeric/stats.d.ts +27 -0
  60. package/dist/numeric/stats.d.ts.map +1 -0
  61. package/dist/numeric/stats.js +110 -0
  62. package/dist/numeric/stats.js.map +1 -0
  63. package/dist/numeric/svd.d.ts +27 -0
  64. package/dist/numeric/svd.d.ts.map +1 -0
  65. package/dist/numeric/svd.js +374 -0
  66. package/dist/numeric/svd.js.map +1 -0
  67. package/dist/numeric/svdflip.d.ts +9 -0
  68. package/dist/numeric/svdflip.d.ts.map +1 -0
  69. package/dist/numeric/svdflip.js +32 -0
  70. package/dist/numeric/svdflip.js.map +1 -0
  71. package/dist/pca.d.ts +170 -0
  72. package/dist/pca.d.ts.map +1 -0
  73. package/dist/pca.js +649 -0
  74. package/dist/pca.js.map +1 -0
  75. package/dist/progress.d.ts +155 -0
  76. package/dist/progress.d.ts.map +1 -0
  77. package/dist/progress.js +173 -0
  78. package/dist/progress.js.map +1 -0
  79. package/dist/scheduling.d.ts +66 -0
  80. package/dist/scheduling.d.ts.map +1 -0
  81. package/dist/scheduling.js +160 -0
  82. package/dist/scheduling.js.map +1 -0
  83. package/dist/types.d.ts +10 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +11 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/validation.d.ts +17 -0
  88. package/dist/validation.d.ts.map +1 -0
  89. package/dist/validation.js +36 -0
  90. package/dist/validation.js.map +1 -0
  91. package/dist/webgpu/df64.d.ts +18 -0
  92. package/dist/webgpu/df64.d.ts.map +1 -0
  93. package/dist/webgpu/df64.js +42 -0
  94. package/dist/webgpu/df64.js.map +1 -0
  95. package/dist/webgpu/engine.d.ts +74 -0
  96. package/dist/webgpu/engine.d.ts.map +1 -0
  97. package/dist/webgpu/engine.js +326 -0
  98. package/dist/webgpu/engine.js.map +1 -0
  99. package/dist/webgpu/gpu-pca.d.ts +90 -0
  100. package/dist/webgpu/gpu-pca.d.ts.map +1 -0
  101. package/dist/webgpu/gpu-pca.js +407 -0
  102. package/dist/webgpu/gpu-pca.js.map +1 -0
  103. package/dist/webgpu/index.d.ts +19 -0
  104. package/dist/webgpu/index.d.ts.map +1 -0
  105. package/dist/webgpu/index.js +16 -0
  106. package/dist/webgpu/index.js.map +1 -0
  107. package/dist/webgpu/kernels.d.ts +47 -0
  108. package/dist/webgpu/kernels.d.ts.map +1 -0
  109. package/dist/webgpu/kernels.js +147 -0
  110. package/dist/webgpu/kernels.js.map +1 -0
  111. package/dist/worker/client.d.ts +174 -0
  112. package/dist/worker/client.d.ts.map +1 -0
  113. package/dist/worker/client.js +482 -0
  114. package/dist/worker/client.js.map +1 -0
  115. package/dist/worker/handler.d.ts +17 -0
  116. package/dist/worker/handler.d.ts.map +1 -0
  117. package/dist/worker/handler.js +404 -0
  118. package/dist/worker/handler.js.map +1 -0
  119. package/dist/worker/protocol.d.ts +192 -0
  120. package/dist/worker/protocol.d.ts.map +1 -0
  121. package/dist/worker/protocol.js +70 -0
  122. package/dist/worker/protocol.js.map +1 -0
  123. package/dist/worker/worker.d.ts +14 -0
  124. package/dist/worker/worker.d.ts.map +1 -0
  125. package/dist/worker/worker.js +20 -0
  126. package/dist/worker/worker.js.map +1 -0
  127. 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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"}