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
package/dist/base.js ADDED
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Shared machinery for PCA and IncrementalPCA — the counterpart of sklearn's
3
+ * `_BasePCA`: transform / inverseTransform / getCovariance / getPrecision /
4
+ * getFeatureNamesOut operating on the fitted state.
5
+ */
6
+ import { asMatrix, Matrix } from './matrix.js';
7
+ import { PCA_MODEL_FORMAT_VERSION } from './model.js';
8
+ import { matmul, matmulTransB } from './numeric/blas.js';
9
+ import { inverse } from './numeric/lu.js';
10
+ import { dtypeOf, epsFor } from './types.js';
11
+ import { assertAllFinite, checkFeatureCount, NotFittedError } from './validation.js';
12
+ export function castTo(a, dtype) {
13
+ return dtype === 'float64' ? a : Float32Array.from(a);
14
+ }
15
+ export function promoteDtype(a, b) {
16
+ return a === 'float64' || b === 'float64' ? 'float64' : 'float32';
17
+ }
18
+ export class BasePCA {
19
+ estimatorName = 'PCA';
20
+ fitted = false;
21
+ /** True while a fit generator is live — re-entrant fits on one instance throw. */
22
+ fitting = false;
23
+ dtype = 'float64';
24
+ whitenOpt = false;
25
+ components_ = null;
26
+ explainedVariance_ = null;
27
+ explainedVarianceRatio_ = null;
28
+ singularValues_ = null;
29
+ mean_ = null;
30
+ nComponents_ = 0;
31
+ nFeaturesIn_ = 0;
32
+ noiseVariance_ = 0;
33
+ assertFitted() {
34
+ if (!this.fitted) {
35
+ throw new NotFittedError(this.estimatorName);
36
+ }
37
+ }
38
+ // ------------------------------------------------------------------
39
+ // Fitted attributes (sklearn's trailing-underscore attributes)
40
+ // ------------------------------------------------------------------
41
+ /** Principal axes (nComponents × nFeatures) — sklearn's `components_`. */
42
+ get components() {
43
+ this.assertFitted();
44
+ return this.components_;
45
+ }
46
+ /** sklearn's `explained_variance_`. */
47
+ get explainedVariance() {
48
+ this.assertFitted();
49
+ return this.explainedVariance_;
50
+ }
51
+ /**
52
+ * sklearn's `explained_variance_ratio_`. For zero-variance (all-constant)
53
+ * training data the total variance is 0, so every entry is NaN — the same
54
+ * 0/0 sklearn produces (alongside a RuntimeWarning) in that case.
55
+ */
56
+ get explainedVarianceRatio() {
57
+ this.assertFitted();
58
+ return this.explainedVarianceRatio_;
59
+ }
60
+ /** sklearn's `singular_values_`. */
61
+ get singularValues() {
62
+ this.assertFitted();
63
+ return this.singularValues_;
64
+ }
65
+ /** Per-feature training mean — sklearn's `mean_`. */
66
+ get mean() {
67
+ this.assertFitted();
68
+ return this.mean_;
69
+ }
70
+ /** Estimated number of components — sklearn's `n_components_`. */
71
+ get nComponents() {
72
+ this.assertFitted();
73
+ return this.nComponents_;
74
+ }
75
+ /** sklearn's `n_features_in_`. */
76
+ get nFeaturesIn() {
77
+ this.assertFitted();
78
+ return this.nFeaturesIn_;
79
+ }
80
+ /** Tipping–Bishop noise variance — sklearn's `noise_variance_`. */
81
+ get noiseVariance() {
82
+ this.assertFitted();
83
+ return this.noiseVariance_;
84
+ }
85
+ /** Whether whitening is enabled (constructor option). */
86
+ get whiten() {
87
+ return this.whitenOpt;
88
+ }
89
+ // ------------------------------------------------------------------
90
+ // Transforms
91
+ // ------------------------------------------------------------------
92
+ /** Project X onto the principal components — sklearn's `transform`. */
93
+ transform(X) {
94
+ this.assertFitted();
95
+ const xm = asMatrix(X);
96
+ assertAllFinite(xm, `${this.estimatorName}.transform`);
97
+ checkFeatureCount(xm, this.nFeaturesIn_, this.estimatorName);
98
+ return this.transformCore(xm, false);
99
+ }
100
+ transformCore(X, xIsCentered) {
101
+ const comp = this.components_;
102
+ // Project first, then remove the projected mean — sklearn's operation
103
+ // order (avoids centering a copy of X).
104
+ const xt = matmulTransB(X.data, comp.data, X.rows, X.cols, comp.rows);
105
+ return this._transformFromProjection(xt, X.rows, X.dtype, xIsCentered);
106
+ }
107
+ /**
108
+ * @internal Everything in transform downstream of the X·componentsᵀ
109
+ * product (mean-projection removal, whitening, dtype cast). The WebGPU
110
+ * frontend calls this with a device-computed projection; `xt` is consumed.
111
+ */
112
+ _transformFromProjection(xt, n, xDtype, xIsCentered) {
113
+ const comp = this.components_;
114
+ const ev = this.explainedVariance_;
115
+ const meanArr = this.mean_;
116
+ const p = comp.cols;
117
+ const k = comp.rows;
118
+ if (!xIsCentered) {
119
+ const meanProj = new Float64Array(k);
120
+ for (let c = 0; c < k; c++) {
121
+ let acc = 0;
122
+ const off = c * p;
123
+ for (let j = 0; j < p; j++) {
124
+ acc += meanArr[j] * comp.data[off + j];
125
+ }
126
+ meanProj[c] = acc;
127
+ }
128
+ for (let i = 0; i < n; i++) {
129
+ for (let c = 0; c < k; c++) {
130
+ xt[i * k + c] -= meanProj[c];
131
+ }
132
+ }
133
+ }
134
+ if (this.whitenOpt) {
135
+ // Clip near-zero variances at dtype eps, as sklearn does, so
136
+ // rank-deficient data cannot produce non-finite whitened output.
137
+ const minScale = epsFor(dtypeOf(ev));
138
+ for (let c = 0; c < k; c++) {
139
+ let scale = Math.sqrt(ev[c]);
140
+ if (scale < minScale) {
141
+ scale = minScale;
142
+ }
143
+ for (let i = 0; i < n; i++) {
144
+ xt[i * k + c] /= scale;
145
+ }
146
+ }
147
+ }
148
+ return new Matrix(castTo(xt, promoteDtype(xDtype, this.dtype)), n, k);
149
+ }
150
+ /** Map component-space data back to feature space — sklearn's `inverse_transform`. */
151
+ inverseTransform(X) {
152
+ this.assertFitted();
153
+ const xm = asMatrix(X);
154
+ const comp = this.components_;
155
+ const ev = this.explainedVariance_;
156
+ const meanArr = this.mean_;
157
+ const k = comp.rows;
158
+ const p = comp.cols;
159
+ if (xm.cols !== k) {
160
+ throw new Error(`X has ${xm.cols} features, but inverseTransform expects ${k} (= nComponents)`);
161
+ }
162
+ const n = xm.rows;
163
+ let compData = comp.data;
164
+ if (this.whitenOpt) {
165
+ const scaled = new Float64Array(k * p);
166
+ for (let c = 0; c < k; c++) {
167
+ const f = Math.sqrt(ev[c]);
168
+ const off = c * p;
169
+ for (let j = 0; j < p; j++) {
170
+ scaled[off + j] = f * comp.data[off + j];
171
+ }
172
+ }
173
+ compData = scaled;
174
+ }
175
+ const out = matmul(xm.data, compData, n, k, p);
176
+ for (let i = 0; i < n; i++) {
177
+ const off = i * p;
178
+ for (let j = 0; j < p; j++) {
179
+ out[off + j] += meanArr[j];
180
+ }
181
+ }
182
+ // numpy promotion: `X @ components + mean_` picks up mean_'s dtype, so a
183
+ // float32-fitted IncrementalPCA (whose mean_ is always float64) returns
184
+ // float64 here — unlike transform, whose in-place subtraction stays f32.
185
+ const outDtype = promoteDtype(promoteDtype(xm.dtype, this.dtype), dtypeOf(meanArr));
186
+ return new Matrix(castTo(out, outDtype), n, p);
187
+ }
188
+ // ------------------------------------------------------------------
189
+ // Generative model: covariance and precision
190
+ // ------------------------------------------------------------------
191
+ /** Model covariance `componentsᵀ diag(ev − nv) components + nv·I` — sklearn's `get_covariance`. */
192
+ getCovariance() {
193
+ this.assertFitted();
194
+ const p = this.nFeaturesIn_;
195
+ return new Matrix(castTo(this.covarianceF64(), this.dtype), p, p);
196
+ }
197
+ covarianceF64() {
198
+ const comp = this.components_;
199
+ const ev = this.explainedVariance_;
200
+ const nv = this.noiseVariance_;
201
+ const k = comp.rows;
202
+ const p = comp.cols;
203
+ // w = components (rows scaled by sqrt(ev) when whitening, like sklearn);
204
+ // scaled = diag(exp_var_diff) @ w, so cov = scaledᵀ @ w.
205
+ const w = new Float64Array(k * p);
206
+ const scaled = new Float64Array(k * p);
207
+ for (let c = 0; c < k; c++) {
208
+ const f = this.whitenOpt ? Math.sqrt(ev[c]) : 1;
209
+ const evd = ev[c] > nv ? ev[c] - nv : 0;
210
+ const off = c * p;
211
+ for (let j = 0; j < p; j++) {
212
+ const wv = comp.data[off + j] * f;
213
+ w[off + j] = wv;
214
+ scaled[off + j] = wv * evd;
215
+ }
216
+ }
217
+ const cov = new Float64Array(p * p);
218
+ for (let c = 0; c < k; c++) {
219
+ const offW = c * p;
220
+ for (let i = 0; i < p; i++) {
221
+ const sv = scaled[offW + i];
222
+ if (sv !== 0) {
223
+ const covOff = i * p;
224
+ for (let j = 0; j < p; j++) {
225
+ cov[covOff + j] += sv * w[offW + j];
226
+ }
227
+ }
228
+ }
229
+ }
230
+ for (let i = 0; i < p; i++) {
231
+ cov[i * p + i] += nv;
232
+ }
233
+ return cov;
234
+ }
235
+ /** Model precision via the matrix inversion lemma — sklearn's `get_precision`. */
236
+ getPrecision() {
237
+ this.assertFitted();
238
+ const p = this.nFeaturesIn_;
239
+ return new Matrix(castTo(this.precisionF64(), this.dtype), p, p);
240
+ }
241
+ precisionF64() {
242
+ const p = this.nFeaturesIn_;
243
+ const k = this.nComponents_;
244
+ const nv = this.noiseVariance_;
245
+ if (k === 0) {
246
+ const eye = new Float64Array(p * p);
247
+ for (let i = 0; i < p; i++) {
248
+ eye[i * p + i] = 1 / nv;
249
+ }
250
+ return eye;
251
+ }
252
+ if (nv === 0) {
253
+ return inverse(this.covarianceF64(), p);
254
+ }
255
+ const comp = this.components_;
256
+ const ev = this.explainedVariance_;
257
+ const w = new Float64Array(k * p);
258
+ for (let c = 0; c < k; c++) {
259
+ const f = this.whitenOpt ? Math.sqrt(ev[c]) : 1;
260
+ const off = c * p;
261
+ for (let j = 0; j < p; j++) {
262
+ w[off + j] = comp.data[off + j] * f;
263
+ }
264
+ }
265
+ // inner = w wᵀ / nv + diag(1 / (ev − nv))
266
+ const inner = new Float64Array(k * k);
267
+ for (let a = 0; a < k; a++) {
268
+ for (let b = 0; b < k; b++) {
269
+ let acc = 0;
270
+ const offA = a * p;
271
+ const offB = b * p;
272
+ for (let j = 0; j < p; j++) {
273
+ acc += w[offA + j] * w[offB + j];
274
+ }
275
+ inner[a * k + b] = acc / nv;
276
+ }
277
+ }
278
+ for (let c = 0; c < k; c++) {
279
+ const evd = ev[c] > nv ? ev[c] - nv : 0;
280
+ inner[c * k + c] += 1 / evd;
281
+ }
282
+ const innerInv = inverse(inner, k);
283
+ // precision = −(wᵀ innerInv w) / nv² + I/nv
284
+ const tmp = matmul(innerInv, w, k, k, p); // k×p
285
+ const prec = new Float64Array(p * p);
286
+ for (let c = 0; c < k; c++) {
287
+ const offW = c * p;
288
+ for (let i = 0; i < p; i++) {
289
+ const wv = w[offW + i];
290
+ if (wv !== 0) {
291
+ const off = i * p;
292
+ for (let j = 0; j < p; j++) {
293
+ prec[off + j] += wv * tmp[offW + j];
294
+ }
295
+ }
296
+ }
297
+ }
298
+ const nv2 = nv * nv;
299
+ for (let i = 0; i < p * p; i++) {
300
+ prec[i] /= -nv2;
301
+ }
302
+ for (let i = 0; i < p; i++) {
303
+ prec[i * p + i] += 1 / nv;
304
+ }
305
+ return prec;
306
+ }
307
+ /** Output feature names, e.g. ['pca0', 'pca1', …] — sklearn's `get_feature_names_out`. */
308
+ getFeatureNamesOut() {
309
+ this.assertFitted();
310
+ const prefix = this.estimatorName.toLowerCase();
311
+ const names = new Array(this.nComponents_);
312
+ for (let i = 0; i < this.nComponents_; i++) {
313
+ names[i] = `${prefix}${i}`;
314
+ }
315
+ return names;
316
+ }
317
+ // ------------------------------------------------------------------
318
+ // Model serialization
319
+ // ------------------------------------------------------------------
320
+ /**
321
+ * The shared fitted attributes as tight copies — a snapshot fully
322
+ * decoupled from live estimator state, safe to transfer or persist.
323
+ */
324
+ exportBaseModel() {
325
+ this.assertFitted();
326
+ return {
327
+ formatVersion: PCA_MODEL_FORMAT_VERSION,
328
+ dtype: this.dtype,
329
+ nComponents: this.nComponents_,
330
+ nFeaturesIn: this.nFeaturesIn_,
331
+ whiten: this.whitenOpt,
332
+ noiseVariance: this.noiseVariance_,
333
+ components: this.components_.data.slice(),
334
+ mean: this.mean_.slice(),
335
+ explainedVariance: this.explainedVariance_.slice(),
336
+ explainedVarianceRatio: this.explainedVarianceRatio_.slice(),
337
+ singularValues: this.singularValues_.slice(),
338
+ };
339
+ }
340
+ /**
341
+ * Adopts a (validated) model's fields zero-copy and marks the estimator
342
+ * fitted. Callers own any defensive copying.
343
+ */
344
+ importBaseModel(m) {
345
+ this.dtype = m.dtype;
346
+ this.whitenOpt = m.whiten;
347
+ this.nComponents_ = m.nComponents;
348
+ this.nFeaturesIn_ = m.nFeaturesIn;
349
+ this.noiseVariance_ = m.noiseVariance;
350
+ this.components_ = new Matrix(m.components, m.nComponents, m.nFeaturesIn);
351
+ this.mean_ = m.mean;
352
+ this.explainedVariance_ = m.explainedVariance;
353
+ this.explainedVarianceRatio_ = m.explainedVarianceRatio;
354
+ this.singularValues_ = m.singularValues;
355
+ this.fitted = true;
356
+ }
357
+ }
358
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Incremental PCA matching `sklearn.decomposition.IncrementalPCA` (1.9):
3
+ * constant-memory fitting via `partialFit` batches (Ross et al. 2008), so the
4
+ * dataset never needs to reside in memory at once.
5
+ */
6
+ import { BasePCA } from './base.js';
7
+ import { Matrix, type MatrixInput } from './matrix.js';
8
+ import { type IncrementalPCAModel } from './model.js';
9
+ import { type FitAsyncOptions, type FitObserver } from './progress.js';
10
+ export interface IncrementalPCAOptions {
11
+ /** Number of components to keep (integer ≥ 1), or null to use min(batch shape). */
12
+ nComponents?: number | null;
13
+ /** Scale transformed output to unit component-wise variance. */
14
+ whiten?: boolean;
15
+ /** When false, fit/partialFit may overwrite the input Matrix's data. */
16
+ copy?: boolean;
17
+ /** Rows per batch for fit(); null → 5 × nFeatures, like sklearn. */
18
+ batchSize?: number | null;
19
+ }
20
+ export declare class IncrementalPCA extends BasePCA {
21
+ protected readonly estimatorName: string;
22
+ private readonly opts;
23
+ private var_;
24
+ private meanF64_;
25
+ private nSamplesSeen_;
26
+ private batchSize_;
27
+ /** Mirrors sklearn's hasattr(self, 'components_') — set by fit() before batching. */
28
+ private hasComponentsAttr_;
29
+ constructor(options?: IncrementalPCAOptions);
30
+ /** Per-feature running variance (always float64, like sklearn) — `var_`. */
31
+ get variance(): Float64Array;
32
+ /** Samples processed so far — sklearn's `n_samples_seen_`. */
33
+ get nSamplesSeen(): number;
34
+ /** Batch size used by fit — sklearn's `batch_size_` (only set by fit()). */
35
+ get batchSize(): number;
36
+ /**
37
+ * Fit in minibatches of `batchSize` rows — sklearn's `IncrementalPCA.fit`.
38
+ * The first batch must have at least 2 samples.
39
+ */
40
+ fit(X: MatrixInput, observer?: FitObserver): this;
41
+ /**
42
+ * Non-blocking fit: identical batching, time-sliced on the event loop.
43
+ * Results are bit-identical to the synchronous fit. An abort between
44
+ * batches keeps the completed-batch model (the estimator stays usable).
45
+ */
46
+ fitAsync(X: MatrixInput, options?: FitAsyncOptions): Promise<this>;
47
+ /**
48
+ * @internal The batched fit as a step generator — one `yield` per batch
49
+ * is the suspension/abort checkpoint for the drivers. Mirrors sklearn's
50
+ * fit(): state is reset before validation, and each batch runs the
51
+ * unchanged partialFit update.
52
+ */
53
+ _fitSteps(X: Matrix, observer?: FitObserver): Generator<void, void, void>;
54
+ /**
55
+ * Snapshot of the just-stored (batch-prefix) model, as fresh float64
56
+ * copies. Scores project the original input's rows seen so far; with
57
+ * `copy: false` the first batch's rows were destructively centered by
58
+ * the update (sklearn's contract), making those scores approximate.
59
+ */
60
+ private batchSnapshot;
61
+ /**
62
+ * Incremental fit on one batch — sklearn's `partial_fit`. All of X is one
63
+ * batch. The first call must see at least 2 samples; later calls may
64
+ * stream batches of any size (including single rows).
65
+ */
66
+ partialFit(X: MatrixInput): this;
67
+ /** Equivalent to fit(X).transform(X) (sklearn's TransformerMixin behavior). */
68
+ fitTransform(X: MatrixInput, observer?: FitObserver): Matrix;
69
+ /** Non-blocking fitTransform — fitAsync followed by transform. */
70
+ fitTransformAsync(X: MatrixInput, options?: FitAsyncOptions): Promise<Matrix>;
71
+ /**
72
+ * The fitted model as a plain structured-clone-friendly object. Includes
73
+ * the running statistics (`nSamplesSeen`, float64 mean/variance), so
74
+ * `partialFit` resumes bit-exactly after rehydration.
75
+ */
76
+ toModel(): IncrementalPCAModel;
77
+ /**
78
+ * Rehydrates a fitted IncrementalPCA from `toModel()` output (validated
79
+ * first; arrays adopted without copying). Further `partialFit` calls
80
+ * continue the stream exactly where the exported estimator left off.
81
+ */
82
+ static fromModel(model: IncrementalPCAModel): IncrementalPCA;
83
+ /** The whitening/update step; mutates `X`'s data (callers pass a copy unless copy=false). */
84
+ private partialFitCore;
85
+ }
86
+ //# sourceMappingURL=incremental-pca.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-pca.d.ts","sourceRoot":"","sources":["../src/incremental-pca.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAY,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIxE,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAKjB,MAAM,eAAe,CAAC;AAKvB,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AA+CD,qBAAa,cAAe,SAAQ,OAAO;IACzC,mBAA4B,aAAa,EAAE,MAAM,CAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IAEvC,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAuB;IACzC,qFAAqF;IACrF,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,OAAO,GAAE,qBAA0B;IAM/C,4EAA4E;IAC5E,IAAI,QAAQ,IAAI,YAAY,CAG3B;IAED,8DAA8D;IAC9D,IAAI,YAAY,IAAI,MAAM,CAGzB;IAED,4EAA4E;IAC5E,IAAI,SAAS,IAAI,MAAM,CAKtB;IAMD;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAKjD;;;;OAIG;IACG,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5E;;;;;OAKG;IACF,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAwE1E;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA0BrB;;;;OAIG;IACH,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAuBhC,+EAA+E;IAC/E,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM;IAK5D,kEAAkE;IAC5D,iBAAiB,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IASvF;;;;OAIG;IACH,OAAO,IAAI,mBAAmB;IAiB9B;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc;IAa5D,6FAA6F;IAC7F,OAAO,CAAC,cAAc;CAmIvB"}