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,397 @@
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, castTo } from './base.js';
7
+ import { asMatrix, Matrix } from './matrix.js';
8
+ import { assertValidModel } from './model.js';
9
+ import { colMeans, incrementalMeanAndVar } from './numeric/stats.js';
10
+ import { svd } from './numeric/svd.js';
11
+ import { svdFlipVBased } from './numeric/svdflip.js';
12
+ import { makeReporter, projectForSnapshot, toFloat64Copy, } from './progress.js';
13
+ import { driveAsync, driveSync } from './scheduling.js';
14
+ import { dtypeOf, epsFor } from './types.js';
15
+ import { assertAllFinite, assertMinSamplesForFit, checkFeatureCount } from './validation.js';
16
+ function validateOptions(o) {
17
+ const nComponents = o.nComponents ?? null;
18
+ if (nComponents !== null && !(Number.isInteger(nComponents) && nComponents >= 1)) {
19
+ throw new Error(`nComponents must be an integer >= 1 or null; got ${nComponents}`);
20
+ }
21
+ const batchSize = o.batchSize ?? null;
22
+ if (batchSize !== null && !(Number.isInteger(batchSize) && batchSize >= 1)) {
23
+ throw new Error(`batchSize must be an integer >= 1 or null; got ${batchSize}`);
24
+ }
25
+ return {
26
+ nComponents,
27
+ whiten: o.whiten ?? false,
28
+ copy: o.copy ?? true,
29
+ batchSize,
30
+ };
31
+ }
32
+ /** sklearn's `gen_batches`: full slices, with a too-small tail merged into the last one. */
33
+ function* genBatches(n, batchSize, minBatchSize) {
34
+ let start = 0;
35
+ const nFull = Math.floor(n / batchSize);
36
+ for (let i = 0; i < nFull; i++) {
37
+ const end = start + batchSize;
38
+ if (end + minBatchSize > n) {
39
+ continue;
40
+ }
41
+ yield [start, end];
42
+ start = end;
43
+ }
44
+ if (start < n) {
45
+ yield [start, n];
46
+ }
47
+ }
48
+ export class IncrementalPCA extends BasePCA {
49
+ estimatorName = 'IncrementalPCA';
50
+ opts;
51
+ var_ = null;
52
+ meanF64_ = null;
53
+ nSamplesSeen_ = 0;
54
+ batchSize_ = null;
55
+ /** Mirrors sklearn's hasattr(self, 'components_') — set by fit() before batching. */
56
+ hasComponentsAttr_ = false;
57
+ constructor(options = {}) {
58
+ super();
59
+ this.opts = validateOptions(options);
60
+ this.whitenOpt = this.opts.whiten;
61
+ }
62
+ /** Per-feature running variance (always float64, like sklearn) — `var_`. */
63
+ get variance() {
64
+ this.assertFitted();
65
+ return this.var_;
66
+ }
67
+ /** Samples processed so far — sklearn's `n_samples_seen_`. */
68
+ get nSamplesSeen() {
69
+ this.assertFitted();
70
+ return this.nSamplesSeen_;
71
+ }
72
+ /** Batch size used by fit — sklearn's `batch_size_` (only set by fit()). */
73
+ get batchSize() {
74
+ if (this.batchSize_ === null) {
75
+ throw new Error("batchSize is only available after fit() (sklearn's batch_size_)");
76
+ }
77
+ return this.batchSize_;
78
+ }
79
+ // ------------------------------------------------------------------
80
+ // Fitting
81
+ // ------------------------------------------------------------------
82
+ /**
83
+ * Fit in minibatches of `batchSize` rows — sklearn's `IncrementalPCA.fit`.
84
+ * The first batch must have at least 2 samples.
85
+ */
86
+ fit(X, observer) {
87
+ driveSync(this._fitSteps(asMatrix(X), observer), observer?.signal);
88
+ return this;
89
+ }
90
+ /**
91
+ * Non-blocking fit: identical batching, time-sliced on the event loop.
92
+ * Results are bit-identical to the synchronous fit. An abort between
93
+ * batches keeps the completed-batch model (the estimator stays usable).
94
+ */
95
+ async fitAsync(X, options = {}) {
96
+ await driveAsync(this._fitSteps(asMatrix(X), options), {
97
+ budgetMs: options.budgetMs,
98
+ signal: options.signal,
99
+ });
100
+ return this;
101
+ }
102
+ /**
103
+ * @internal The batched fit as a step generator — one `yield` per batch
104
+ * is the suspension/abort checkpoint for the drivers. Mirrors sklearn's
105
+ * fit(): state is reset before validation, and each batch runs the
106
+ * unchanged partialFit update.
107
+ */
108
+ *_fitSteps(X, observer) {
109
+ if (this.fitting) {
110
+ throw new Error('This IncrementalPCA instance is already fitting; concurrent fits on one instance are not supported');
111
+ }
112
+ this.fitting = true;
113
+ try {
114
+ // Reset all state, mirroring sklearn's fit().
115
+ this.components_ = null;
116
+ this.hasComponentsAttr_ = true; // sklearn sets self.components_ = None
117
+ this.nSamplesSeen_ = 0;
118
+ this.meanF64_ = null;
119
+ this.var_ = null;
120
+ this.singularValues_ = null;
121
+ this.explainedVariance_ = null;
122
+ this.explainedVarianceRatio_ = null;
123
+ this.noiseVariance_ = 0;
124
+ this.fitted = false;
125
+ assertAllFinite(X, 'IncrementalPCA.fit');
126
+ if (X.rows < 1 || X.cols < 1) {
127
+ throw new Error(`Found array with shape (${X.rows}, ${X.cols}); at least 1 sample and 1 feature required`);
128
+ }
129
+ const work = this.opts.copy ? X.copy() : X;
130
+ const n = work.rows;
131
+ const p = work.cols;
132
+ this.nFeaturesIn_ = p;
133
+ this.batchSize_ = this.opts.batchSize ?? 5 * p;
134
+ // Materialized so totalSteps is known up front.
135
+ const batches = [...genBatches(n, this.batchSize_, this.opts.nComponents ?? 0)];
136
+ const reporter = makeReporter(observer, {
137
+ estimator: 'IncrementalPCA',
138
+ solver: 'incremental',
139
+ nRows: n,
140
+ whiten: this.opts.whiten,
141
+ });
142
+ for (let i = 0; i < batches.length; i++) {
143
+ const [start, end] = batches[i];
144
+ const rows = end - start;
145
+ const batch = new Matrix(work.data.subarray(start * p, end * p), rows, p);
146
+ this.partialFitCore(batch);
147
+ if (reporter) {
148
+ reporter.emit({
149
+ phase: 'batch',
150
+ step: i + 1,
151
+ totalSteps: batches.length,
152
+ snapshot: reporter.wantSnapshot(i + 1)
153
+ ? this.batchSnapshot(X, end, reporter.scoresRequested)
154
+ : undefined,
155
+ });
156
+ }
157
+ yield;
158
+ }
159
+ if (reporter) {
160
+ reporter.emit({
161
+ phase: 'finalize',
162
+ step: batches.length,
163
+ totalSteps: batches.length,
164
+ snapshot: reporter.snapshotsEnabled
165
+ ? this.batchSnapshot(X, n, reporter.scoresRequested)
166
+ : undefined,
167
+ });
168
+ }
169
+ }
170
+ finally {
171
+ this.fitting = false;
172
+ }
173
+ }
174
+ /**
175
+ * Snapshot of the just-stored (batch-prefix) model, as fresh float64
176
+ * copies. Scores project the original input's rows seen so far; with
177
+ * `copy: false` the first batch's rows were destructively centered by
178
+ * the update (sklearn's contract), making those scores approximate.
179
+ */
180
+ batchSnapshot(X, rowsSeen, wantScores) {
181
+ const comp = this.components_;
182
+ const k = comp.rows;
183
+ const p = comp.cols;
184
+ const snapshot = {
185
+ components: new Matrix(toFloat64Copy(comp.data), k, p),
186
+ singularValues: toFloat64Copy(this.singularValues_),
187
+ explainedVariance: toFloat64Copy(this.explainedVariance_),
188
+ };
189
+ if (wantScores) {
190
+ const ev = this.explainedVariance_;
191
+ snapshot.scores = projectForSnapshot(X.data, rowsSeen, p, comp.data, k, this.mean_, ev, this.whitenOpt, epsFor(dtypeOf(ev)));
192
+ }
193
+ return snapshot;
194
+ }
195
+ /**
196
+ * Incremental fit on one batch — sklearn's `partial_fit`. All of X is one
197
+ * batch. The first call must see at least 2 samples; later calls may
198
+ * stream batches of any size (including single rows).
199
+ */
200
+ partialFit(X) {
201
+ if (this.fitting) {
202
+ throw new Error('This IncrementalPCA instance is fitting; partialFit cannot run concurrently with fit');
203
+ }
204
+ const xm = asMatrix(X);
205
+ assertAllFinite(xm, 'IncrementalPCA.partialFit');
206
+ if (xm.rows < 1 || xm.cols < 1) {
207
+ throw new Error(`Found array with shape (${xm.rows}, ${xm.cols}); at least 1 sample and 1 feature required`);
208
+ }
209
+ if (this.nFeaturesIn_ > 0 && this.hasComponentsAttr_) {
210
+ checkFeatureCount(xm, this.nFeaturesIn_, this.estimatorName);
211
+ }
212
+ else {
213
+ this.nFeaturesIn_ = xm.cols;
214
+ }
215
+ const work = this.opts.copy ? xm.copy() : xm;
216
+ this.partialFitCore(work);
217
+ return this;
218
+ }
219
+ /** Equivalent to fit(X).transform(X) (sklearn's TransformerMixin behavior). */
220
+ fitTransform(X, observer) {
221
+ this.fit(X, observer);
222
+ return this.transform(X);
223
+ }
224
+ /** Non-blocking fitTransform — fitAsync followed by transform. */
225
+ async fitTransformAsync(X, options = {}) {
226
+ await this.fitAsync(X, options);
227
+ return this.transform(X);
228
+ }
229
+ // ------------------------------------------------------------------
230
+ // Model serialization
231
+ // ------------------------------------------------------------------
232
+ /**
233
+ * The fitted model as a plain structured-clone-friendly object. Includes
234
+ * the running statistics (`nSamplesSeen`, float64 mean/variance), so
235
+ * `partialFit` resumes bit-exactly after rehydration.
236
+ */
237
+ toModel() {
238
+ const base = this.exportBaseModel();
239
+ return {
240
+ ...base,
241
+ estimator: 'ipca',
242
+ nSamplesSeen: this.nSamplesSeen_,
243
+ variance: this.var_.slice(),
244
+ batchSize: this.batchSize_,
245
+ options: {
246
+ nComponents: this.opts.nComponents,
247
+ whiten: this.opts.whiten,
248
+ copy: this.opts.copy,
249
+ batchSize: this.opts.batchSize,
250
+ },
251
+ };
252
+ }
253
+ /**
254
+ * Rehydrates a fitted IncrementalPCA from `toModel()` output (validated
255
+ * first; arrays adopted without copying). Further `partialFit` calls
256
+ * continue the stream exactly where the exported estimator left off.
257
+ */
258
+ static fromModel(model) {
259
+ assertValidModel(model, 'ipca');
260
+ const ipca = new IncrementalPCA(model.options);
261
+ ipca.importBaseModel(model);
262
+ // mean_ and meanF64_ alias one array in live estimators; preserve that.
263
+ ipca.meanF64_ = model.mean;
264
+ ipca.var_ = model.variance;
265
+ ipca.nSamplesSeen_ = model.nSamplesSeen;
266
+ ipca.batchSize_ = model.batchSize;
267
+ ipca.hasComponentsAttr_ = true;
268
+ return ipca;
269
+ }
270
+ /** The whitening/update step; mutates `X`'s data (callers pass a copy unless copy=false). */
271
+ partialFitCore(X) {
272
+ // Only the very first batch of data needs 2+ samples (it seeds the
273
+ // variance estimate); later 1-row updates are well-defined.
274
+ if (this.nSamplesSeen_ === 0) {
275
+ assertMinSamplesForFit(X, this.estimatorName);
276
+ }
277
+ const firstPass = !this.hasComponentsAttr_;
278
+ if (firstPass) {
279
+ this.components_ = null;
280
+ this.hasComponentsAttr_ = true;
281
+ }
282
+ const n = X.rows;
283
+ const p = X.cols;
284
+ // Resolve n_components exactly like sklearn.
285
+ const ncOpt = this.opts.nComponents;
286
+ if (ncOpt === null) {
287
+ if (this.components_ === null) {
288
+ this.nComponents_ = Math.min(n, p);
289
+ }
290
+ else {
291
+ this.nComponents_ = this.components_.rows;
292
+ }
293
+ }
294
+ else if (!(ncOpt <= p)) {
295
+ throw new Error(`nComponents=${ncOpt} invalid for nFeatures=${p}, need more rows than columns for IncrementalPCA processing`);
296
+ }
297
+ else if (ncOpt > n && firstPass) {
298
+ throw new Error(`nComponents=${ncOpt} must be less or equal to the batch number of samples ${n} for the first partialFit call.`);
299
+ }
300
+ else {
301
+ this.nComponents_ = ncOpt;
302
+ }
303
+ if (this.components_ !== null && this.components_.rows !== this.nComponents_) {
304
+ throw new Error(`Number of components has changed from ${this.components_.rows} to ` +
305
+ `${this.nComponents_} between calls to partialFit! Try setting nComponents to a fixed value.`);
306
+ }
307
+ const k = this.nComponents_;
308
+ // Update running statistics (float64, like sklearn's float64 accumulators).
309
+ const stats = incrementalMeanAndVar(X.data, n, p, this.meanF64_, this.var_, this.nSamplesSeen_);
310
+ const nTotal = stats.count;
311
+ // Build the matrix to decompose.
312
+ let stacked;
313
+ let stackedRows;
314
+ let stackedDtype;
315
+ if (this.nSamplesSeen_ === 0) {
316
+ // First step: just center the batch (in its own dtype, like sklearn).
317
+ stackedDtype = X.dtype;
318
+ stackedRows = n;
319
+ stacked = X.data;
320
+ for (let i = 0; i < n; i++) {
321
+ const off = i * p;
322
+ for (let j = 0; j < p; j++) {
323
+ stacked[off + j] -= stats.mean[j];
324
+ }
325
+ }
326
+ }
327
+ else {
328
+ // Later steps: numpy's vstack promotes to float64 because the
329
+ // mean-correction row is float64 — replicated (a float32 model's
330
+ // attributes really do become float64 after the second partial_fit).
331
+ const comp = this.components_;
332
+ const sv = this.singularValues_;
333
+ const colBatchMean = colMeans(X.data, n, p);
334
+ stackedDtype = 'float64';
335
+ stackedRows = k + n + 1;
336
+ const st = new Float64Array(stackedRows * p);
337
+ for (let c = 0; c < k; c++) {
338
+ const f = sv[c];
339
+ const off = c * p;
340
+ for (let j = 0; j < p; j++) {
341
+ st[off + j] = f * comp.data[off + j];
342
+ }
343
+ }
344
+ // X -= col_batch_mean happens in the batch's dtype in sklearn.
345
+ const f32 = X.dtype === 'float32';
346
+ for (let i = 0; i < n; i++) {
347
+ const src = i * p;
348
+ const dst = (k + i) * p;
349
+ for (let j = 0; j < p; j++) {
350
+ const v = X.data[src + j] - colBatchMean[j];
351
+ st[dst + j] = f32 ? Math.fround(v) : v;
352
+ }
353
+ }
354
+ const corrScale = Math.sqrt((this.nSamplesSeen_ / nTotal) * n);
355
+ const off = (k + n) * p;
356
+ for (let j = 0; j < p; j++) {
357
+ st[off + j] = corrScale * (this.meanF64_[j] - colBatchMean[j]);
358
+ }
359
+ stacked = st;
360
+ }
361
+ const dec = svd(stacked, stackedRows, p);
362
+ const minDim = Math.min(stackedRows, p);
363
+ svdFlipVBased(dec.u, stackedRows, dec.vt, minDim, p);
364
+ const explainedVariance = new Float64Array(minDim);
365
+ let varTimesTotal = 0;
366
+ for (let j = 0; j < p; j++) {
367
+ varTimesTotal += stats.variance[j] * nTotal;
368
+ }
369
+ const ratio = new Float64Array(minDim);
370
+ for (let i = 0; i < minDim; i++) {
371
+ const s2 = dec.s[i] * dec.s[i];
372
+ explainedVariance[i] = s2 / (nTotal - 1);
373
+ ratio[i] = s2 / varTimesTotal;
374
+ }
375
+ this.nSamplesSeen_ = nTotal;
376
+ this.meanF64_ = stats.mean;
377
+ this.var_ = stats.variance;
378
+ this.dtype = stackedDtype;
379
+ this.components_ = new Matrix(castTo(dec.vt.slice(0, k * p), stackedDtype), k, p);
380
+ this.singularValues_ = castTo(dec.s.slice(0, k), stackedDtype);
381
+ this.explainedVariance_ = castTo(explainedVariance.slice(0, k), stackedDtype);
382
+ this.explainedVarianceRatio_ = castTo(ratio.slice(0, k), stackedDtype);
383
+ this.mean_ = stats.mean; // float64, like sklearn
384
+ if (k !== n && k !== p) {
385
+ let acc = 0;
386
+ for (let i = k; i < minDim; i++) {
387
+ acc += explainedVariance[i];
388
+ }
389
+ this.noiseVariance_ = acc / (minDim - k);
390
+ }
391
+ else {
392
+ this.noiseVariance_ = 0;
393
+ }
394
+ this.fitted = true;
395
+ }
396
+ }
397
+ //# sourceMappingURL=incremental-pca.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-pca.js","sourceRoot":"","sources":["../src/incremental-pca.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * pca-web — scikit-learn-compatible PCA and IncrementalPCA for the browser
3
+ * and Node.js, with zero runtime dependencies.
4
+ *
5
+ * WebGPU acceleration lives behind the `pca-web/webgpu` subpath export so
6
+ * the core stays free of GPU code for bundlers.
7
+ */
8
+ export type { IncrementalPCAOptions } from './incremental-pca.js';
9
+ export { IncrementalPCA } from './incremental-pca.js';
10
+ export type { MatrixInput } from './matrix.js';
11
+ export { asMatrix, Matrix } from './matrix.js';
12
+ export type { AnyPCAModel, IncrementalPCAModel, IncrementalPCAModelOptions, PCAModel, PCAModelBaseFields, PCAModelOptions, } from './model.js';
13
+ export { assertValidModel, modelFromJSON, modelToJSON, PCA_MODEL_FORMAT_VERSION, } from './model.js';
14
+ export type { PCAOptions, PowerIterationNormalizer, SvdSolver } from './pca.js';
15
+ export { PCA, RandomState } from './pca.js';
16
+ export type { FitAsyncOptions, FitObserver, FitPhase, FitSolverId, PCAFitProgress, PCAFitSnapshot, SnapshotOptions, } from './progress.js';
17
+ export type { AbortSignalLike } from './scheduling.js';
18
+ export { FitAbortError } from './scheduling.js';
19
+ export type { Dtype, FloatArray } from './types.js';
20
+ export { NotFittedError } from './validation.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,0BAA0B,EAC1B,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChF,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EACV,eAAe,EACf,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * pca-web — scikit-learn-compatible PCA and IncrementalPCA for the browser
3
+ * and Node.js, with zero runtime dependencies.
4
+ *
5
+ * WebGPU acceleration lives behind the `pca-web/webgpu` subpath export so
6
+ * the core stays free of GPU code for bundlers.
7
+ */
8
+ export { IncrementalPCA } from './incremental-pca.js';
9
+ export { asMatrix, Matrix } from './matrix.js';
10
+ export { assertValidModel, modelFromJSON, modelToJSON, PCA_MODEL_FORMAT_VERSION, } from './model.js';
11
+ export { PCA, RandomState } from './pca.js';
12
+ export { FitAbortError } from './scheduling.js';
13
+ export { NotFittedError } from './validation.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAS/C,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAW5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type Dtype, type FloatArray } from './types.js';
2
+ /**
3
+ * A dense row-major matrix backed by a Float64Array or Float32Array.
4
+ *
5
+ * This is the container returned by all pca-web methods. It is a thin,
6
+ * zero-copy wrapper: `data[i * cols + j]` is the element at row `i`,
7
+ * column `j`.
8
+ */
9
+ export declare class Matrix {
10
+ readonly data: FloatArray;
11
+ readonly rows: number;
12
+ readonly cols: number;
13
+ /**
14
+ * Wraps an existing typed array (no copy). `data.length` must equal
15
+ * `rows * cols`.
16
+ */
17
+ constructor(data: FloatArray, rows: number, cols: number);
18
+ /** Storage dtype: 'float64' or 'float32'. */
19
+ get dtype(): Dtype;
20
+ /** Allocates a zero-initialized matrix. */
21
+ static zeros(rows: number, cols: number, dtype?: Dtype): Matrix;
22
+ /**
23
+ * Builds a matrix from an array of rows, e.g. `Matrix.from2d([[1, 2], [3, 4]])`.
24
+ * All rows must have equal length.
25
+ */
26
+ static from2d(rows2d: ArrayLike<number>[], dtype?: Dtype): Matrix;
27
+ get(i: number, j: number): number;
28
+ set(i: number, j: number, v: number): void;
29
+ /** Returns a deep copy (same dtype). */
30
+ copy(): Matrix;
31
+ /** Converts to a plain nested array of numbers. */
32
+ toArray(): number[][];
33
+ /** Copy of row `i` as a plain typed array (same dtype). */
34
+ row(i: number): FloatArray;
35
+ }
36
+ /** Accepted input type for training/transform data. */
37
+ export type MatrixInput = Matrix | ArrayLike<number>[];
38
+ /**
39
+ * Coerces user input to a Matrix without copying when it is already one.
40
+ * Nested arrays become float64 (mirrors sklearn coercing non-float dtypes
41
+ * to float64).
42
+ */
43
+ export declare function asMatrix(X: MatrixInput): Matrix;
44
+ //# sourceMappingURL=matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,KAAK,EAAW,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,qBAAa,MAAM;IACjB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;gBACS,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAWxD,6CAA6C;IAC7C,IAAI,KAAK,IAAI,KAAK,CAEjB;IAED,2CAA2C;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,KAAiB,GAAG,MAAM;IAK1E;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,GAAE,KAAiB,GAAG,MAAM;IAsB5E,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1C,wCAAwC;IACxC,IAAI,IAAI,MAAM;IAId,mDAAmD;IACnD,OAAO,IAAI,MAAM,EAAE,EAAE;IAYrB,2DAA2D;IAC3D,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;CAG3B;AAED,uDAAuD;AACvD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAW/C"}
package/dist/matrix.js ADDED
@@ -0,0 +1,99 @@
1
+ import { constructorFor, dtypeOf } from './types.js';
2
+ /**
3
+ * A dense row-major matrix backed by a Float64Array or Float32Array.
4
+ *
5
+ * This is the container returned by all pca-web methods. It is a thin,
6
+ * zero-copy wrapper: `data[i * cols + j]` is the element at row `i`,
7
+ * column `j`.
8
+ */
9
+ export class Matrix {
10
+ data;
11
+ rows;
12
+ cols;
13
+ /**
14
+ * Wraps an existing typed array (no copy). `data.length` must equal
15
+ * `rows * cols`.
16
+ */
17
+ constructor(data, rows, cols) {
18
+ if (data.length !== rows * cols) {
19
+ throw new Error(`Matrix: data length ${data.length} does not match shape ${rows}x${cols} (= ${rows * cols})`);
20
+ }
21
+ this.data = data;
22
+ this.rows = rows;
23
+ this.cols = cols;
24
+ }
25
+ /** Storage dtype: 'float64' or 'float32'. */
26
+ get dtype() {
27
+ return dtypeOf(this.data);
28
+ }
29
+ /** Allocates a zero-initialized matrix. */
30
+ static zeros(rows, cols, dtype = 'float64') {
31
+ const Ctor = constructorFor(dtype);
32
+ return new Matrix(new Ctor(rows * cols), rows, cols);
33
+ }
34
+ /**
35
+ * Builds a matrix from an array of rows, e.g. `Matrix.from2d([[1, 2], [3, 4]])`.
36
+ * All rows must have equal length.
37
+ */
38
+ static from2d(rows2d, dtype = 'float64') {
39
+ const rows = rows2d.length;
40
+ if (rows === 0) {
41
+ throw new Error('Matrix.from2d: at least one row is required');
42
+ }
43
+ const cols = rows2d[0].length;
44
+ const Ctor = constructorFor(dtype);
45
+ const data = new Ctor(rows * cols);
46
+ for (let i = 0; i < rows; i++) {
47
+ const r = rows2d[i];
48
+ if (r.length !== cols) {
49
+ throw new Error(`Matrix.from2d: row ${i} has length ${r.length}, expected ${cols} (rows must be equal length)`);
50
+ }
51
+ for (let j = 0; j < cols; j++) {
52
+ data[i * cols + j] = r[j];
53
+ }
54
+ }
55
+ return new Matrix(data, rows, cols);
56
+ }
57
+ get(i, j) {
58
+ return this.data[i * this.cols + j];
59
+ }
60
+ set(i, j, v) {
61
+ this.data[i * this.cols + j] = v;
62
+ }
63
+ /** Returns a deep copy (same dtype). */
64
+ copy() {
65
+ return new Matrix(this.data.slice(), this.rows, this.cols);
66
+ }
67
+ /** Converts to a plain nested array of numbers. */
68
+ toArray() {
69
+ const out = new Array(this.rows);
70
+ for (let i = 0; i < this.rows; i++) {
71
+ const row = new Array(this.cols);
72
+ for (let j = 0; j < this.cols; j++) {
73
+ row[j] = this.data[i * this.cols + j];
74
+ }
75
+ out[i] = row;
76
+ }
77
+ return out;
78
+ }
79
+ /** Copy of row `i` as a plain typed array (same dtype). */
80
+ row(i) {
81
+ return this.data.slice(i * this.cols, (i + 1) * this.cols);
82
+ }
83
+ }
84
+ /**
85
+ * Coerces user input to a Matrix without copying when it is already one.
86
+ * Nested arrays become float64 (mirrors sklearn coercing non-float dtypes
87
+ * to float64).
88
+ */
89
+ export function asMatrix(X) {
90
+ if (X instanceof Matrix) {
91
+ return X;
92
+ }
93
+ if (Array.isArray(X)) {
94
+ return Matrix.from2d(X);
95
+ }
96
+ throw new TypeError('Expected a Matrix or an array of rows (number[][]); ' +
97
+ 'wrap typed-array data with new Matrix(data, rows, cols)');
98
+ }
99
+ //# sourceMappingURL=matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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"}