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
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain serializable model objects: the currency for worker transfer
|
|
3
|
+
* (`postMessage`), `structuredClone`, and IndexedDB persistence — all of
|
|
4
|
+
* which handle typed arrays natively. `modelToJSON`/`modelFromJSON` cover
|
|
5
|
+
* text transports bit-exactly (JS number formatting is shortest-roundtrip);
|
|
6
|
+
* structured clone / IndexedDB remain the primary, cheaper path.
|
|
7
|
+
*
|
|
8
|
+
* This module is part of the worker client's import graph, so it must stay
|
|
9
|
+
* free of value imports from estimator/solver code (types only).
|
|
10
|
+
*/
|
|
11
|
+
import type { PowerIterationNormalizer, SvdSolver } from './pca.js';
|
|
12
|
+
import { type Dtype, type FloatArray } from './types.js';
|
|
13
|
+
export declare const PCA_MODEL_FORMAT_VERSION = 1;
|
|
14
|
+
/** Fields shared by both estimators' models. */
|
|
15
|
+
export interface PCAModelBaseFields {
|
|
16
|
+
formatVersion: typeof PCA_MODEL_FORMAT_VERSION;
|
|
17
|
+
/** Storage dtype of the fitted attributes ('float64' | 'float32'). */
|
|
18
|
+
dtype: Dtype;
|
|
19
|
+
nComponents: number;
|
|
20
|
+
nFeaturesIn: number;
|
|
21
|
+
whiten: boolean;
|
|
22
|
+
noiseVariance: number;
|
|
23
|
+
/** k×p row-major principal axes (tight copy). */
|
|
24
|
+
components: FloatArray;
|
|
25
|
+
/** Per-feature training mean, length p. */
|
|
26
|
+
mean: FloatArray;
|
|
27
|
+
/** Length k. */
|
|
28
|
+
explainedVariance: FloatArray;
|
|
29
|
+
/** Length k. */
|
|
30
|
+
explainedVarianceRatio: FloatArray;
|
|
31
|
+
/** Length k. */
|
|
32
|
+
singularValues: FloatArray;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Serializable PCA constructor options. A live `RandomState` instance
|
|
36
|
+
* cannot be serialized and degrades to null (refits of a rehydrated
|
|
37
|
+
* estimator are then unseeded); numeric seeds round-trip exactly.
|
|
38
|
+
*/
|
|
39
|
+
export interface PCAModelOptions {
|
|
40
|
+
nComponents: number | 'mle' | null;
|
|
41
|
+
copy: boolean;
|
|
42
|
+
whiten: boolean;
|
|
43
|
+
svdSolver: SvdSolver;
|
|
44
|
+
tol: number;
|
|
45
|
+
iteratedPower: number | 'auto';
|
|
46
|
+
nOversamples: number;
|
|
47
|
+
powerIterationNormalizer: PowerIterationNormalizer;
|
|
48
|
+
randomState: number | null;
|
|
49
|
+
}
|
|
50
|
+
export interface IncrementalPCAModelOptions {
|
|
51
|
+
nComponents: number | null;
|
|
52
|
+
whiten: boolean;
|
|
53
|
+
copy: boolean;
|
|
54
|
+
batchSize: number | null;
|
|
55
|
+
}
|
|
56
|
+
export interface PCAModel extends PCAModelBaseFields {
|
|
57
|
+
estimator: 'pca';
|
|
58
|
+
nSamples: number;
|
|
59
|
+
/** The solver the fit actually used (sklearn's `_fit_svd_solver`). */
|
|
60
|
+
svdSolver: Exclude<SvdSolver, 'auto'>;
|
|
61
|
+
options: PCAModelOptions;
|
|
62
|
+
}
|
|
63
|
+
export interface IncrementalPCAModel extends PCAModelBaseFields {
|
|
64
|
+
estimator: 'ipca';
|
|
65
|
+
nSamplesSeen: number;
|
|
66
|
+
/** Per-feature running variance (always float64), length p. */
|
|
67
|
+
variance: Float64Array;
|
|
68
|
+
/** Set by fit(); null when the model was built via partialFit only. */
|
|
69
|
+
batchSize: number | null;
|
|
70
|
+
options: IncrementalPCAModelOptions;
|
|
71
|
+
}
|
|
72
|
+
export type AnyPCAModel = PCAModel | IncrementalPCAModel;
|
|
73
|
+
/**
|
|
74
|
+
* Structural validation of a (possibly deserialized or foreign) model
|
|
75
|
+
* object. Throws with a specific message on the first problem found.
|
|
76
|
+
*/
|
|
77
|
+
export declare function assertValidModel(model: unknown, expected?: 'pca' | 'ipca'): asserts model is AnyPCAModel;
|
|
78
|
+
/**
|
|
79
|
+
* Serializes a model to a JSON string, with typed arrays as plain number
|
|
80
|
+
* arrays. JavaScript prints doubles in shortest-roundtrip form, so parsing
|
|
81
|
+
* restores every value bit-exactly (float32 payloads are exact in float64).
|
|
82
|
+
*/
|
|
83
|
+
export declare function modelToJSON(model: AnyPCAModel): string;
|
|
84
|
+
/** Parses `modelToJSON` output back into a validated model object. */
|
|
85
|
+
export declare function modelFromJSON(json: string): AnyPCAModel;
|
|
86
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAkB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,wBAAwB,CAAC;IAC/C,sEAAsE;IACtE,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,UAAU,EAAE,UAAU,CAAC;IACvB,2CAA2C;IAC3C,IAAI,EAAE,UAAU,CAAC;IACjB,gBAAgB;IAChB,iBAAiB,EAAE,UAAU,CAAC;IAC9B,gBAAgB;IAChB,sBAAsB,EAAE,UAAU,CAAC;IACnC,gBAAgB;IAChB,cAAc,EAAE,UAAU,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,wBAAwB,CAAC;IACnD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,QAAS,SAAQ,kBAAkB;IAClD,SAAS,EAAE,KAAK,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,EAAE,YAAY,CAAC;IACvB,uEAAuE;IACvE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,0BAA0B,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AA6BzD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GACxB,OAAO,CAAC,KAAK,IAAI,WAAW,CA4D9B;AAeD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAUtD;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAkBvD"}
|
package/dist/model.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { constructorFor } from './types.js';
|
|
2
|
+
export const PCA_MODEL_FORMAT_VERSION = 1;
|
|
3
|
+
const RESOLVED_SOLVERS = ['full', 'covariance_eigh', 'arpack', 'randomized'];
|
|
4
|
+
function fail(msg) {
|
|
5
|
+
throw new Error(`Invalid PCA model: ${msg}`);
|
|
6
|
+
}
|
|
7
|
+
function checkArray(value, name, length, dtype) {
|
|
8
|
+
if (!(value instanceof Float64Array) && !(value instanceof Float32Array)) {
|
|
9
|
+
fail(`${name} must be a Float64Array or Float32Array`);
|
|
10
|
+
}
|
|
11
|
+
if (dtype !== 'any' && !(value instanceof constructorFor(dtype))) {
|
|
12
|
+
fail(`${name} must be a ${dtype === 'float64' ? 'Float64Array' : 'Float32Array'}`);
|
|
13
|
+
}
|
|
14
|
+
if (value.length !== length) {
|
|
15
|
+
fail(`${name} must have length ${length}, got ${value.length}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function isPositiveInt(v) {
|
|
19
|
+
return typeof v === 'number' && Number.isInteger(v) && v >= 1;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Structural validation of a (possibly deserialized or foreign) model
|
|
23
|
+
* object. Throws with a specific message on the first problem found.
|
|
24
|
+
*/
|
|
25
|
+
export function assertValidModel(model, expected) {
|
|
26
|
+
if (typeof model !== 'object' || model === null) {
|
|
27
|
+
fail('not an object');
|
|
28
|
+
}
|
|
29
|
+
const m = model;
|
|
30
|
+
if (m.formatVersion !== PCA_MODEL_FORMAT_VERSION) {
|
|
31
|
+
fail(`unsupported formatVersion ${String(m.formatVersion)} (this build reads version ${PCA_MODEL_FORMAT_VERSION})`);
|
|
32
|
+
}
|
|
33
|
+
if (m.estimator !== 'pca' && m.estimator !== 'ipca') {
|
|
34
|
+
fail(`estimator must be 'pca' or 'ipca', got ${String(m.estimator)}`);
|
|
35
|
+
}
|
|
36
|
+
if (expected !== undefined && m.estimator !== expected) {
|
|
37
|
+
fail(`expected a '${expected}' model, got '${String(m.estimator)}'`);
|
|
38
|
+
}
|
|
39
|
+
if (m.dtype !== 'float64' && m.dtype !== 'float32') {
|
|
40
|
+
fail(`dtype must be 'float64' or 'float32', got ${String(m.dtype)}`);
|
|
41
|
+
}
|
|
42
|
+
const dtype = m.dtype;
|
|
43
|
+
if (typeof m.nComponents !== 'number' || !Number.isInteger(m.nComponents) || m.nComponents < 0) {
|
|
44
|
+
fail(`nComponents must be a non-negative integer, got ${String(m.nComponents)}`);
|
|
45
|
+
}
|
|
46
|
+
if (!isPositiveInt(m.nFeaturesIn)) {
|
|
47
|
+
fail(`nFeaturesIn must be a positive integer, got ${String(m.nFeaturesIn)}`);
|
|
48
|
+
}
|
|
49
|
+
const k = m.nComponents;
|
|
50
|
+
const p = m.nFeaturesIn;
|
|
51
|
+
if (typeof m.whiten !== 'boolean') {
|
|
52
|
+
fail('whiten must be a boolean');
|
|
53
|
+
}
|
|
54
|
+
if (typeof m.noiseVariance !== 'number' || !Number.isFinite(m.noiseVariance)) {
|
|
55
|
+
fail('noiseVariance must be a finite number');
|
|
56
|
+
}
|
|
57
|
+
checkArray(m.components, 'components', k * p, dtype);
|
|
58
|
+
checkArray(m.explainedVariance, 'explainedVariance', k, dtype);
|
|
59
|
+
checkArray(m.explainedVarianceRatio, 'explainedVarianceRatio', k, dtype);
|
|
60
|
+
checkArray(m.singularValues, 'singularValues', k, dtype);
|
|
61
|
+
if (typeof m.options !== 'object' || m.options === null) {
|
|
62
|
+
fail('options must be an object');
|
|
63
|
+
}
|
|
64
|
+
if (m.estimator === 'pca') {
|
|
65
|
+
checkArray(m.mean, 'mean', p, dtype);
|
|
66
|
+
if (!isPositiveInt(m.nSamples)) {
|
|
67
|
+
fail(`nSamples must be a positive integer, got ${String(m.nSamples)}`);
|
|
68
|
+
}
|
|
69
|
+
if (!RESOLVED_SOLVERS.includes(m.svdSolver)) {
|
|
70
|
+
fail(`svdSolver must be one of ${RESOLVED_SOLVERS.join(', ')}, got ${String(m.svdSolver)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// IncrementalPCA keeps float64 statistics regardless of the model dtype.
|
|
75
|
+
checkArray(m.mean, 'mean', p, 'float64');
|
|
76
|
+
checkArray(m.variance, 'variance', p, 'float64');
|
|
77
|
+
if (!isPositiveInt(m.nSamplesSeen)) {
|
|
78
|
+
fail(`nSamplesSeen must be a positive integer, got ${String(m.nSamplesSeen)}`);
|
|
79
|
+
}
|
|
80
|
+
if (m.batchSize !== null && !isPositiveInt(m.batchSize)) {
|
|
81
|
+
fail(`batchSize must be a positive integer or null, got ${String(m.batchSize)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------
|
|
86
|
+
// JSON transport (bit-exact via shortest-roundtrip number formatting)
|
|
87
|
+
// ---------------------------------------------------------------------
|
|
88
|
+
const ARRAY_FIELDS = [
|
|
89
|
+
'components',
|
|
90
|
+
'mean',
|
|
91
|
+
'explainedVariance',
|
|
92
|
+
'explainedVarianceRatio',
|
|
93
|
+
'singularValues',
|
|
94
|
+
'variance',
|
|
95
|
+
];
|
|
96
|
+
/**
|
|
97
|
+
* Serializes a model to a JSON string, with typed arrays as plain number
|
|
98
|
+
* arrays. JavaScript prints doubles in shortest-roundtrip form, so parsing
|
|
99
|
+
* restores every value bit-exactly (float32 payloads are exact in float64).
|
|
100
|
+
*/
|
|
101
|
+
export function modelToJSON(model) {
|
|
102
|
+
assertValidModel(model);
|
|
103
|
+
const out = { ...model };
|
|
104
|
+
for (const f of ARRAY_FIELDS) {
|
|
105
|
+
const v = model[f];
|
|
106
|
+
if (v instanceof Float64Array || v instanceof Float32Array) {
|
|
107
|
+
out[f] = Array.from(v);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return JSON.stringify(out);
|
|
111
|
+
}
|
|
112
|
+
/** Parses `modelToJSON` output back into a validated model object. */
|
|
113
|
+
export function modelFromJSON(json) {
|
|
114
|
+
const raw = JSON.parse(json);
|
|
115
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
116
|
+
fail('JSON payload is not an object');
|
|
117
|
+
}
|
|
118
|
+
const dtype = raw.dtype === 'float32' ? 'float32' : 'float64';
|
|
119
|
+
const Ctor = constructorFor(dtype);
|
|
120
|
+
for (const f of ARRAY_FIELDS) {
|
|
121
|
+
const v = raw[f];
|
|
122
|
+
if (Array.isArray(v)) {
|
|
123
|
+
// IncrementalPCA keeps float64 running statistics regardless of the
|
|
124
|
+
// model dtype; every other array carries the model dtype.
|
|
125
|
+
const forceF64 = f === 'variance' || (f === 'mean' && raw.estimator === 'ipca');
|
|
126
|
+
raw[f] = forceF64 ? Float64Array.from(v) : Ctor.from(v);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
assertValidModel(raw);
|
|
130
|
+
return raw;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,cAAc,EAA+B,MAAM,YAAY,CAAC;AAEzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAmE1C,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,CAAU,CAAC;AAEtF,SAAS,IAAI,CAAC,GAAW;IACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,UAAU,CACjB,KAAc,EACd,IAAY,EACZ,MAAc,EACd,KAAoB;IAEpB,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,GAAG,IAAI,yCAAyC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,GAAG,IAAI,cAAc,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,IAAI,qBAAqB,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,QAAyB;IAEzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,aAAa,KAAK,wBAAwB,EAAE,CAAC;QACjD,IAAI,CACF,6BAA6B,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,8BAA8B,wBAAwB,GAAG,CAC9G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,0CAA0C,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvD,IAAI,CAAC,eAAe,QAAQ,iBAAiB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACnD,IAAI,CAAC,6CAA6C,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAc,CAAC;IAC/B,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QAC/F,IAAI,CAAC,mDAAmD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,+CAA+C,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAqB,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAqB,CAAC;IAClC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAChD,CAAC;IACD,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,UAAU,CAAC,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/D,UAAU,CAAC,CAAC,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACzE,UAAU,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACxD,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QAC1B,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,4CAA4C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAA8C,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,4BAA4B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACzC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,gDAAgD,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,qDAAqD,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,sEAAsE;AACtE,wEAAwE;AAExE,MAAM,YAAY,GAAG;IACnB,YAAY;IACZ,MAAM;IACN,mBAAmB;IACnB,wBAAwB;IACxB,gBAAgB;IAChB,UAAU;CACF,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAkB;IAC5C,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,GAAG,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAI,KAA4C,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;YAC3D,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IACxD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAU,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,oEAAoE;YACpE,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;YAChF,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dense row-major matrix kernels. Inputs may be Float64Array or Float32Array
|
|
3
|
+
* (large data arrays keep their storage dtype); all accumulation happens in
|
|
4
|
+
* float64 (JS numbers) and results are produced as Float64Array.
|
|
5
|
+
*/
|
|
6
|
+
import type { FloatArray } from '../types.js';
|
|
7
|
+
/** C (m×n) = A (m×k) @ B (k×n). */
|
|
8
|
+
export declare function matmul(a: FloatArray, b: FloatArray, m: number, k: number, n: number): Float64Array;
|
|
9
|
+
/** C (k1×k2) = Aᵀ @ B where A is (m×k1) and B is (m×k2). */
|
|
10
|
+
export declare function matmulTransA(a: FloatArray, b: FloatArray, m: number, k1: number, k2: number): Float64Array;
|
|
11
|
+
/** C (m×n) = A (m×k) @ Bᵀ where B is (n×k). */
|
|
12
|
+
export declare function matmulTransB(a: FloatArray, b: FloatArray, m: number, k: number, n: number): Float64Array;
|
|
13
|
+
/**
|
|
14
|
+
* One row range of the symmetric rank-k update: accumulates rows
|
|
15
|
+
* [rowStart, rowEnd) of A (·×p) into the upper triangle of `c` (p×p).
|
|
16
|
+
* Accumulation is strictly row-sequential, so chunked calls over
|
|
17
|
+
* consecutive ranges produce bitwise the same result as one full pass.
|
|
18
|
+
*/
|
|
19
|
+
export declare function syrkTChunk(a: FloatArray, p: number, rowStart: number, rowEnd: number, c: Float64Array): void;
|
|
20
|
+
/** Mirrors the upper triangle of `c` (p×p) into the lower triangle. */
|
|
21
|
+
export declare function syrkTMirror(c: Float64Array, p: number): void;
|
|
22
|
+
/**
|
|
23
|
+
* Symmetric rank-k update: C (p×p) = Aᵀ @ A for A (n×p). Computes the upper
|
|
24
|
+
* triangle and mirrors it, halving the flops vs a generic matmul.
|
|
25
|
+
*/
|
|
26
|
+
export declare function syrkT(a: FloatArray, n: number, p: number): Float64Array;
|
|
27
|
+
/** y (m) = A (m×n) @ x (n). */
|
|
28
|
+
export declare function matvec(a: FloatArray, x: FloatArray, m: number, n: number): Float64Array;
|
|
29
|
+
/** y (n) = Aᵀ (n×m) @ x (m) where A is (m×n). */
|
|
30
|
+
export declare function matvecTransA(a: FloatArray, x: FloatArray, m: number, n: number): Float64Array;
|
|
31
|
+
/** Out-of-place transpose: returns Bᵀ (n×m) for B (m×n). */
|
|
32
|
+
export declare function transpose(a: FloatArray, m: number, n: number): Float64Array;
|
|
33
|
+
//# sourceMappingURL=blas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blas.d.ts","sourceRoot":"","sources":["../../src/numeric/blas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,mCAAmC;AACnC,wBAAgB,MAAM,CACpB,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,YAAY,CAgBd;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAC1B,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,YAAY,CAgBd;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAC1B,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,YAAY,CAed;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,YAAY,GACd,IAAI,CAaN;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAM5D;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAKvE;AAED,+BAA+B;AAC/B,wBAAgB,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAWvF;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAY7F;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAS3E"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/** C (m×n) = A (m×k) @ B (k×n). */
|
|
2
|
+
export function matmul(a, b, m, k, n) {
|
|
3
|
+
const c = new Float64Array(m * n);
|
|
4
|
+
for (let i = 0; i < m; i++) {
|
|
5
|
+
const cOff = i * n;
|
|
6
|
+
const aOff = i * k;
|
|
7
|
+
for (let p = 0; p < k; p++) {
|
|
8
|
+
const av = a[aOff + p];
|
|
9
|
+
if (av !== 0) {
|
|
10
|
+
const bOff = p * n;
|
|
11
|
+
for (let j = 0; j < n; j++) {
|
|
12
|
+
c[cOff + j] += av * b[bOff + j];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return c;
|
|
18
|
+
}
|
|
19
|
+
/** C (k1×k2) = Aᵀ @ B where A is (m×k1) and B is (m×k2). */
|
|
20
|
+
export function matmulTransA(a, b, m, k1, k2) {
|
|
21
|
+
const c = new Float64Array(k1 * k2);
|
|
22
|
+
for (let r = 0; r < m; r++) {
|
|
23
|
+
const aOff = r * k1;
|
|
24
|
+
const bOff = r * k2;
|
|
25
|
+
for (let i = 0; i < k1; i++) {
|
|
26
|
+
const av = a[aOff + i];
|
|
27
|
+
if (av !== 0) {
|
|
28
|
+
const cOff = i * k2;
|
|
29
|
+
for (let j = 0; j < k2; j++) {
|
|
30
|
+
c[cOff + j] += av * b[bOff + j];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return c;
|
|
36
|
+
}
|
|
37
|
+
/** C (m×n) = A (m×k) @ Bᵀ where B is (n×k). */
|
|
38
|
+
export function matmulTransB(a, b, m, k, n) {
|
|
39
|
+
const c = new Float64Array(m * n);
|
|
40
|
+
for (let i = 0; i < m; i++) {
|
|
41
|
+
const aOff = i * k;
|
|
42
|
+
const cOff = i * n;
|
|
43
|
+
for (let j = 0; j < n; j++) {
|
|
44
|
+
const bOff = j * k;
|
|
45
|
+
let s = 0;
|
|
46
|
+
for (let p = 0; p < k; p++) {
|
|
47
|
+
s += a[aOff + p] * b[bOff + p];
|
|
48
|
+
}
|
|
49
|
+
c[cOff + j] = s;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return c;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* One row range of the symmetric rank-k update: accumulates rows
|
|
56
|
+
* [rowStart, rowEnd) of A (·×p) into the upper triangle of `c` (p×p).
|
|
57
|
+
* Accumulation is strictly row-sequential, so chunked calls over
|
|
58
|
+
* consecutive ranges produce bitwise the same result as one full pass.
|
|
59
|
+
*/
|
|
60
|
+
export function syrkTChunk(a, p, rowStart, rowEnd, c) {
|
|
61
|
+
for (let r = rowStart; r < rowEnd; r++) {
|
|
62
|
+
const off = r * p;
|
|
63
|
+
for (let i = 0; i < p; i++) {
|
|
64
|
+
const av = a[off + i];
|
|
65
|
+
if (av !== 0) {
|
|
66
|
+
const cOff = i * p;
|
|
67
|
+
for (let j = i; j < p; j++) {
|
|
68
|
+
c[cOff + j] += av * a[off + j];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Mirrors the upper triangle of `c` (p×p) into the lower triangle. */
|
|
75
|
+
export function syrkTMirror(c, p) {
|
|
76
|
+
for (let i = 0; i < p; i++) {
|
|
77
|
+
for (let j = i + 1; j < p; j++) {
|
|
78
|
+
c[j * p + i] = c[i * p + j];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Symmetric rank-k update: C (p×p) = Aᵀ @ A for A (n×p). Computes the upper
|
|
84
|
+
* triangle and mirrors it, halving the flops vs a generic matmul.
|
|
85
|
+
*/
|
|
86
|
+
export function syrkT(a, n, p) {
|
|
87
|
+
const c = new Float64Array(p * p);
|
|
88
|
+
syrkTChunk(a, p, 0, n, c);
|
|
89
|
+
syrkTMirror(c, p);
|
|
90
|
+
return c;
|
|
91
|
+
}
|
|
92
|
+
/** y (m) = A (m×n) @ x (n). */
|
|
93
|
+
export function matvec(a, x, m, n) {
|
|
94
|
+
const y = new Float64Array(m);
|
|
95
|
+
for (let i = 0; i < m; i++) {
|
|
96
|
+
const off = i * n;
|
|
97
|
+
let s = 0;
|
|
98
|
+
for (let j = 0; j < n; j++) {
|
|
99
|
+
s += a[off + j] * x[j];
|
|
100
|
+
}
|
|
101
|
+
y[i] = s;
|
|
102
|
+
}
|
|
103
|
+
return y;
|
|
104
|
+
}
|
|
105
|
+
/** y (n) = Aᵀ (n×m) @ x (m) where A is (m×n). */
|
|
106
|
+
export function matvecTransA(a, x, m, n) {
|
|
107
|
+
const y = new Float64Array(n);
|
|
108
|
+
for (let i = 0; i < m; i++) {
|
|
109
|
+
const off = i * n;
|
|
110
|
+
const xv = x[i];
|
|
111
|
+
if (xv !== 0) {
|
|
112
|
+
for (let j = 0; j < n; j++) {
|
|
113
|
+
y[j] += a[off + j] * xv;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return y;
|
|
118
|
+
}
|
|
119
|
+
/** Out-of-place transpose: returns Bᵀ (n×m) for B (m×n). */
|
|
120
|
+
export function transpose(a, m, n) {
|
|
121
|
+
const t = new Float64Array(m * n);
|
|
122
|
+
for (let i = 0; i < m; i++) {
|
|
123
|
+
const off = i * n;
|
|
124
|
+
for (let j = 0; j < n; j++) {
|
|
125
|
+
t[j * m + i] = a[off + j];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return t;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=blas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blas.js","sourceRoot":"","sources":["../../src/numeric/blas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symmetric eigendecomposition matching `numpy.linalg.eigh`: eigenvalues in
|
|
3
|
+
* ascending order, eigenvectors in the columns of `vectors`.
|
|
4
|
+
*
|
|
5
|
+
* Householder tridiagonalization (tred2) followed by implicit-shift QL
|
|
6
|
+
* iteration (tql2) — the classical EISPACK/JAMA pair (public domain),
|
|
7
|
+
* written for flat row-major arrays.
|
|
8
|
+
*/
|
|
9
|
+
export interface EighResult {
|
|
10
|
+
/** Eigenvalues, ascending, length n. */
|
|
11
|
+
values: Float64Array;
|
|
12
|
+
/** Eigenvectors, n×n row-major; column j pairs with values[j]. */
|
|
13
|
+
vectors: Float64Array;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Eigendecomposition of a symmetric matrix `a` (n×n row-major, read-only).
|
|
17
|
+
* Only the values actually stored are used (the matrix is assumed exactly
|
|
18
|
+
* symmetric, as sklearn's covariance construction guarantees).
|
|
19
|
+
*/
|
|
20
|
+
export declare function eigh(a: Float64Array, n: number): EighResult;
|
|
21
|
+
//# sourceMappingURL=eigh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eigh.d.ts","sourceRoot":"","sources":["../../src/numeric/eigh.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,MAAM,EAAE,YAAY,CAAC;IACrB,kEAAkE;IAClE,OAAO,EAAE,YAAY,CAAC;CACvB;AAyND;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAU3D"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symmetric eigendecomposition matching `numpy.linalg.eigh`: eigenvalues in
|
|
3
|
+
* ascending order, eigenvectors in the columns of `vectors`.
|
|
4
|
+
*
|
|
5
|
+
* Householder tridiagonalization (tred2) followed by implicit-shift QL
|
|
6
|
+
* iteration (tql2) — the classical EISPACK/JAMA pair (public domain),
|
|
7
|
+
* written for flat row-major arrays.
|
|
8
|
+
*/
|
|
9
|
+
function hypot2(a, b) {
|
|
10
|
+
const aa = Math.abs(a);
|
|
11
|
+
const ab = Math.abs(b);
|
|
12
|
+
if (aa > ab) {
|
|
13
|
+
const t = ab / aa;
|
|
14
|
+
return aa * Math.sqrt(1 + t * t);
|
|
15
|
+
}
|
|
16
|
+
if (ab === 0) {
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
const t = aa / ab;
|
|
20
|
+
return ab * Math.sqrt(1 + t * t);
|
|
21
|
+
}
|
|
22
|
+
const EPS = 2 ** -52;
|
|
23
|
+
const MAX_ITER = 100;
|
|
24
|
+
/** Householder reduction to symmetric tridiagonal form, with accumulation. */
|
|
25
|
+
function tred2(v, n, d, e) {
|
|
26
|
+
for (let j = 0; j < n; j++) {
|
|
27
|
+
d[j] = v[(n - 1) * n + j];
|
|
28
|
+
}
|
|
29
|
+
for (let i = n - 1; i > 0; i--) {
|
|
30
|
+
let scale = 0;
|
|
31
|
+
let h = 0;
|
|
32
|
+
for (let k = 0; k < i; k++) {
|
|
33
|
+
scale += Math.abs(d[k]);
|
|
34
|
+
}
|
|
35
|
+
if (scale === 0) {
|
|
36
|
+
e[i] = d[i - 1];
|
|
37
|
+
for (let j = 0; j < i; j++) {
|
|
38
|
+
d[j] = v[(i - 1) * n + j];
|
|
39
|
+
v[i * n + j] = 0;
|
|
40
|
+
v[j * n + i] = 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Generate Householder vector.
|
|
45
|
+
for (let k = 0; k < i; k++) {
|
|
46
|
+
d[k] /= scale;
|
|
47
|
+
h += d[k] * d[k];
|
|
48
|
+
}
|
|
49
|
+
let f = d[i - 1];
|
|
50
|
+
let g = Math.sqrt(h);
|
|
51
|
+
if (f > 0) {
|
|
52
|
+
g = -g;
|
|
53
|
+
}
|
|
54
|
+
e[i] = scale * g;
|
|
55
|
+
h -= f * g;
|
|
56
|
+
d[i - 1] = f - g;
|
|
57
|
+
for (let j = 0; j < i; j++) {
|
|
58
|
+
e[j] = 0;
|
|
59
|
+
}
|
|
60
|
+
// Apply similarity transformation to remaining columns.
|
|
61
|
+
for (let j = 0; j < i; j++) {
|
|
62
|
+
f = d[j];
|
|
63
|
+
v[j * n + i] = f;
|
|
64
|
+
g = e[j] + v[j * n + j] * f;
|
|
65
|
+
for (let k = j + 1; k <= i - 1; k++) {
|
|
66
|
+
g += v[k * n + j] * d[k];
|
|
67
|
+
e[k] += v[k * n + j] * f;
|
|
68
|
+
}
|
|
69
|
+
e[j] = g;
|
|
70
|
+
}
|
|
71
|
+
f = 0;
|
|
72
|
+
for (let j = 0; j < i; j++) {
|
|
73
|
+
e[j] /= h;
|
|
74
|
+
f += e[j] * d[j];
|
|
75
|
+
}
|
|
76
|
+
const hh = f / (h + h);
|
|
77
|
+
for (let j = 0; j < i; j++) {
|
|
78
|
+
e[j] -= hh * d[j];
|
|
79
|
+
}
|
|
80
|
+
for (let j = 0; j < i; j++) {
|
|
81
|
+
f = d[j];
|
|
82
|
+
g = e[j];
|
|
83
|
+
for (let k = j; k <= i - 1; k++) {
|
|
84
|
+
v[k * n + j] -= f * e[k] + g * d[k];
|
|
85
|
+
}
|
|
86
|
+
d[j] = v[(i - 1) * n + j];
|
|
87
|
+
v[i * n + j] = 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
d[i] = h;
|
|
91
|
+
}
|
|
92
|
+
// Accumulate transformations.
|
|
93
|
+
for (let i = 0; i < n - 1; i++) {
|
|
94
|
+
v[(n - 1) * n + i] = v[i * n + i];
|
|
95
|
+
v[i * n + i] = 1;
|
|
96
|
+
const h = d[i + 1];
|
|
97
|
+
if (h !== 0) {
|
|
98
|
+
for (let k = 0; k <= i; k++) {
|
|
99
|
+
d[k] = v[k * n + (i + 1)] / h;
|
|
100
|
+
}
|
|
101
|
+
for (let j = 0; j <= i; j++) {
|
|
102
|
+
let g = 0;
|
|
103
|
+
for (let k = 0; k <= i; k++) {
|
|
104
|
+
g += v[k * n + (i + 1)] * v[k * n + j];
|
|
105
|
+
}
|
|
106
|
+
for (let k = 0; k <= i; k++) {
|
|
107
|
+
v[k * n + j] -= g * d[k];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
for (let k = 0; k <= i; k++) {
|
|
112
|
+
v[k * n + (i + 1)] = 0;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (let j = 0; j < n; j++) {
|
|
116
|
+
d[j] = v[(n - 1) * n + j];
|
|
117
|
+
v[(n - 1) * n + j] = 0;
|
|
118
|
+
}
|
|
119
|
+
v[(n - 1) * n + (n - 1)] = 1;
|
|
120
|
+
e[0] = 0;
|
|
121
|
+
}
|
|
122
|
+
/** Implicit-shift QL iteration on the tridiagonal, ascending order. */
|
|
123
|
+
function tql2(v, n, d, e) {
|
|
124
|
+
for (let i = 1; i < n; i++) {
|
|
125
|
+
e[i - 1] = e[i];
|
|
126
|
+
}
|
|
127
|
+
e[n - 1] = 0;
|
|
128
|
+
let f = 0;
|
|
129
|
+
let tst1 = 0;
|
|
130
|
+
for (let l = 0; l < n; l++) {
|
|
131
|
+
tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));
|
|
132
|
+
let m = l;
|
|
133
|
+
while (m < n) {
|
|
134
|
+
if (Math.abs(e[m]) <= EPS * tst1) {
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
m++;
|
|
138
|
+
}
|
|
139
|
+
if (m > l) {
|
|
140
|
+
let iter = 0;
|
|
141
|
+
do {
|
|
142
|
+
iter++;
|
|
143
|
+
if (iter > MAX_ITER) {
|
|
144
|
+
throw new Error('eigh: failed to converge');
|
|
145
|
+
}
|
|
146
|
+
// Compute implicit shift.
|
|
147
|
+
let g = d[l];
|
|
148
|
+
let p = (d[l + 1] - g) / (2.0 * e[l]);
|
|
149
|
+
let r = hypot2(p, 1.0);
|
|
150
|
+
if (p < 0) {
|
|
151
|
+
r = -r;
|
|
152
|
+
}
|
|
153
|
+
d[l] = e[l] / (p + r);
|
|
154
|
+
d[l + 1] = e[l] * (p + r);
|
|
155
|
+
const dl1 = d[l + 1];
|
|
156
|
+
let h = g - d[l];
|
|
157
|
+
for (let i = l + 2; i < n; i++) {
|
|
158
|
+
d[i] -= h;
|
|
159
|
+
}
|
|
160
|
+
f += h;
|
|
161
|
+
// Implicit QL transformation.
|
|
162
|
+
p = d[m];
|
|
163
|
+
let c = 1;
|
|
164
|
+
let c2 = c;
|
|
165
|
+
let c3 = c;
|
|
166
|
+
const el1 = e[l + 1];
|
|
167
|
+
let s = 0;
|
|
168
|
+
let s2 = 0;
|
|
169
|
+
for (let i = m - 1; i >= l; i--) {
|
|
170
|
+
c3 = c2;
|
|
171
|
+
c2 = c;
|
|
172
|
+
s2 = s;
|
|
173
|
+
g = c * e[i];
|
|
174
|
+
h = c * p;
|
|
175
|
+
r = hypot2(p, e[i]);
|
|
176
|
+
e[i + 1] = s * r;
|
|
177
|
+
s = e[i] / r;
|
|
178
|
+
c = p / r;
|
|
179
|
+
p = c * d[i] - s * g;
|
|
180
|
+
d[i + 1] = h + s * (c * g + s * d[i]);
|
|
181
|
+
// Accumulate transformation.
|
|
182
|
+
for (let k = 0; k < n; k++) {
|
|
183
|
+
h = v[k * n + (i + 1)];
|
|
184
|
+
v[k * n + (i + 1)] = s * v[k * n + i] + c * h;
|
|
185
|
+
v[k * n + i] = c * v[k * n + i] - s * h;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
p = (-s * s2 * c3 * el1 * e[l]) / dl1;
|
|
189
|
+
e[l] = s * p;
|
|
190
|
+
d[l] = c * p;
|
|
191
|
+
} while (Math.abs(e[l]) > EPS * tst1);
|
|
192
|
+
}
|
|
193
|
+
d[l] += f;
|
|
194
|
+
e[l] = 0;
|
|
195
|
+
}
|
|
196
|
+
// Sort eigenvalues ascending, carrying eigenvector columns along.
|
|
197
|
+
for (let i = 0; i < n - 1; i++) {
|
|
198
|
+
let k = i;
|
|
199
|
+
let p = d[i];
|
|
200
|
+
for (let j = i + 1; j < n; j++) {
|
|
201
|
+
if (d[j] < p) {
|
|
202
|
+
k = j;
|
|
203
|
+
p = d[j];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (k !== i) {
|
|
207
|
+
d[k] = d[i];
|
|
208
|
+
d[i] = p;
|
|
209
|
+
for (let j = 0; j < n; j++) {
|
|
210
|
+
p = v[j * n + i];
|
|
211
|
+
v[j * n + i] = v[j * n + k];
|
|
212
|
+
v[j * n + k] = p;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Eigendecomposition of a symmetric matrix `a` (n×n row-major, read-only).
|
|
219
|
+
* Only the values actually stored are used (the matrix is assumed exactly
|
|
220
|
+
* symmetric, as sklearn's covariance construction guarantees).
|
|
221
|
+
*/
|
|
222
|
+
export function eigh(a, n) {
|
|
223
|
+
const v = a.slice();
|
|
224
|
+
const d = new Float64Array(n);
|
|
225
|
+
const e = new Float64Array(n);
|
|
226
|
+
if (n === 1) {
|
|
227
|
+
return { values: Float64Array.of(a[0]), vectors: Float64Array.of(1) };
|
|
228
|
+
}
|
|
229
|
+
tred2(v, n, d, e);
|
|
230
|
+
tql2(v, n, d, e);
|
|
231
|
+
return { values: d, vectors: v };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=eigh.js.map
|