deepbox 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 +344 -0
- package/dist/CSRMatrix-CwGwQRea.d.cts +219 -0
- package/dist/CSRMatrix-KzNt6QpS.d.ts +219 -0
- package/dist/Tensor-BQLk1ltW.d.cts +147 -0
- package/dist/Tensor-g8mUClel.d.ts +147 -0
- package/dist/chunk-4S73VUBD.js +677 -0
- package/dist/chunk-4S73VUBD.js.map +1 -0
- package/dist/chunk-5R4S63PF.js +2925 -0
- package/dist/chunk-5R4S63PF.js.map +1 -0
- package/dist/chunk-6AE5FKKQ.cjs +9264 -0
- package/dist/chunk-6AE5FKKQ.cjs.map +1 -0
- package/dist/chunk-AD436M45.js +3854 -0
- package/dist/chunk-AD436M45.js.map +1 -0
- package/dist/chunk-ALS7ETWZ.cjs +4263 -0
- package/dist/chunk-ALS7ETWZ.cjs.map +1 -0
- package/dist/chunk-AU7XHGKJ.js +2092 -0
- package/dist/chunk-AU7XHGKJ.js.map +1 -0
- package/dist/chunk-B5TNKUEY.js +1481 -0
- package/dist/chunk-B5TNKUEY.js.map +1 -0
- package/dist/chunk-BCR7G3A6.js +9136 -0
- package/dist/chunk-BCR7G3A6.js.map +1 -0
- package/dist/chunk-C4PKXY74.cjs +1917 -0
- package/dist/chunk-C4PKXY74.cjs.map +1 -0
- package/dist/chunk-DWZY6PIP.cjs +6400 -0
- package/dist/chunk-DWZY6PIP.cjs.map +1 -0
- package/dist/chunk-E3EU5FZO.cjs +2113 -0
- package/dist/chunk-E3EU5FZO.cjs.map +1 -0
- package/dist/chunk-F3JWBINJ.js +1054 -0
- package/dist/chunk-F3JWBINJ.js.map +1 -0
- package/dist/chunk-FJYLIGJX.js +1940 -0
- package/dist/chunk-FJYLIGJX.js.map +1 -0
- package/dist/chunk-JSCDE774.cjs +729 -0
- package/dist/chunk-JSCDE774.cjs.map +1 -0
- package/dist/chunk-LWECRCW2.cjs +2412 -0
- package/dist/chunk-LWECRCW2.cjs.map +1 -0
- package/dist/chunk-MLBMYKCG.js +6379 -0
- package/dist/chunk-MLBMYKCG.js.map +1 -0
- package/dist/chunk-OX6QXFMV.cjs +3874 -0
- package/dist/chunk-OX6QXFMV.cjs.map +1 -0
- package/dist/chunk-PHV2DKRS.cjs +1072 -0
- package/dist/chunk-PHV2DKRS.cjs.map +1 -0
- package/dist/chunk-PL7TAYKI.js +4056 -0
- package/dist/chunk-PL7TAYKI.js.map +1 -0
- package/dist/chunk-PR647I7R.js +1898 -0
- package/dist/chunk-PR647I7R.js.map +1 -0
- package/dist/chunk-QERHVCHC.cjs +2960 -0
- package/dist/chunk-QERHVCHC.cjs.map +1 -0
- package/dist/chunk-XEG44RF6.cjs +1514 -0
- package/dist/chunk-XEG44RF6.cjs.map +1 -0
- package/dist/chunk-XMWVME2W.js +2377 -0
- package/dist/chunk-XMWVME2W.js.map +1 -0
- package/dist/chunk-ZB75FESB.cjs +1979 -0
- package/dist/chunk-ZB75FESB.cjs.map +1 -0
- package/dist/chunk-ZLW62TJG.cjs +4061 -0
- package/dist/chunk-ZLW62TJG.cjs.map +1 -0
- package/dist/chunk-ZXKBDFP3.js +4235 -0
- package/dist/chunk-ZXKBDFP3.js.map +1 -0
- package/dist/core/index.cjs +204 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +2 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/dataframe/index.cjs +22 -0
- package/dist/dataframe/index.cjs.map +1 -0
- package/dist/dataframe/index.d.cts +3 -0
- package/dist/dataframe/index.d.ts +3 -0
- package/dist/dataframe/index.js +5 -0
- package/dist/dataframe/index.js.map +1 -0
- package/dist/datasets/index.cjs +134 -0
- package/dist/datasets/index.cjs.map +1 -0
- package/dist/datasets/index.d.cts +3 -0
- package/dist/datasets/index.d.ts +3 -0
- package/dist/datasets/index.js +5 -0
- package/dist/datasets/index.js.map +1 -0
- package/dist/index-74AB8Cyh.d.cts +1126 -0
- package/dist/index-9oQx1HgV.d.cts +1180 -0
- package/dist/index-BJY2SI4i.d.ts +483 -0
- package/dist/index-BWGhrDlr.d.ts +733 -0
- package/dist/index-B_DK4FKY.d.cts +242 -0
- package/dist/index-BbA2Gxfl.d.ts +456 -0
- package/dist/index-BgHYAoSS.d.cts +837 -0
- package/dist/index-BndMbqsM.d.ts +1439 -0
- package/dist/index-C1mfVYoo.d.ts +2517 -0
- package/dist/index-CCvlwAmL.d.cts +809 -0
- package/dist/index-CDw5CnOU.d.ts +785 -0
- package/dist/index-Cn3SdB0O.d.ts +1126 -0
- package/dist/index-CrqLlS-a.d.ts +776 -0
- package/dist/index-D61yaSMY.d.cts +483 -0
- package/dist/index-D9Loo1_A.d.cts +2517 -0
- package/dist/index-DIT_OO9C.d.cts +785 -0
- package/dist/index-DIp_RrRt.d.ts +242 -0
- package/dist/index-DbultU6X.d.cts +1427 -0
- package/dist/index-DmEg_LCm.d.cts +776 -0
- package/dist/index-DoPWVxPo.d.cts +1439 -0
- package/dist/index-DuCxd-8d.d.ts +837 -0
- package/dist/index-Dx42TZaY.d.ts +809 -0
- package/dist/index-DyZ4QQf5.d.cts +456 -0
- package/dist/index-GFAVyOWO.d.ts +1427 -0
- package/dist/index-WHQLn0e8.d.cts +733 -0
- package/dist/index-ZtI1Iy4L.d.ts +1180 -0
- package/dist/index-eJgeni9c.d.cts +1911 -0
- package/dist/index-tk4lSYod.d.ts +1911 -0
- package/dist/index.cjs +72 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/linalg/index.cjs +86 -0
- package/dist/linalg/index.cjs.map +1 -0
- package/dist/linalg/index.d.cts +3 -0
- package/dist/linalg/index.d.ts +3 -0
- package/dist/linalg/index.js +5 -0
- package/dist/linalg/index.js.map +1 -0
- package/dist/metrics/index.cjs +158 -0
- package/dist/metrics/index.cjs.map +1 -0
- package/dist/metrics/index.d.cts +3 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.js +5 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/ml/index.cjs +87 -0
- package/dist/ml/index.cjs.map +1 -0
- package/dist/ml/index.d.cts +3 -0
- package/dist/ml/index.d.ts +3 -0
- package/dist/ml/index.js +6 -0
- package/dist/ml/index.js.map +1 -0
- package/dist/ndarray/index.cjs +501 -0
- package/dist/ndarray/index.cjs.map +1 -0
- package/dist/ndarray/index.d.cts +5 -0
- package/dist/ndarray/index.d.ts +5 -0
- package/dist/ndarray/index.js +4 -0
- package/dist/ndarray/index.js.map +1 -0
- package/dist/nn/index.cjs +142 -0
- package/dist/nn/index.cjs.map +1 -0
- package/dist/nn/index.d.cts +6 -0
- package/dist/nn/index.d.ts +6 -0
- package/dist/nn/index.js +5 -0
- package/dist/nn/index.js.map +1 -0
- package/dist/optim/index.cjs +77 -0
- package/dist/optim/index.cjs.map +1 -0
- package/dist/optim/index.d.cts +4 -0
- package/dist/optim/index.d.ts +4 -0
- package/dist/optim/index.js +4 -0
- package/dist/optim/index.js.map +1 -0
- package/dist/plot/index.cjs +114 -0
- package/dist/plot/index.cjs.map +1 -0
- package/dist/plot/index.d.cts +6 -0
- package/dist/plot/index.d.ts +6 -0
- package/dist/plot/index.js +5 -0
- package/dist/plot/index.js.map +1 -0
- package/dist/preprocess/index.cjs +82 -0
- package/dist/preprocess/index.cjs.map +1 -0
- package/dist/preprocess/index.d.cts +4 -0
- package/dist/preprocess/index.d.ts +4 -0
- package/dist/preprocess/index.js +5 -0
- package/dist/preprocess/index.js.map +1 -0
- package/dist/random/index.cjs +74 -0
- package/dist/random/index.cjs.map +1 -0
- package/dist/random/index.d.cts +3 -0
- package/dist/random/index.d.ts +3 -0
- package/dist/random/index.js +5 -0
- package/dist/random/index.js.map +1 -0
- package/dist/stats/index.cjs +142 -0
- package/dist/stats/index.cjs.map +1 -0
- package/dist/stats/index.d.cts +3 -0
- package/dist/stats/index.d.ts +3 -0
- package/dist/stats/index.js +5 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/tensor-B96jjJLQ.d.cts +205 -0
- package/dist/tensor-B96jjJLQ.d.ts +205 -0
- package/package.json +226 -0
|
@@ -0,0 +1,2113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk6AE5FKKQ_cjs = require('./chunk-6AE5FKKQ.cjs');
|
|
4
|
+
var chunkJSCDE774_cjs = require('./chunk-JSCDE774.cjs');
|
|
5
|
+
|
|
6
|
+
// src/linalg/index.ts
|
|
7
|
+
var linalg_exports = {};
|
|
8
|
+
chunkJSCDE774_cjs.__export(linalg_exports, {
|
|
9
|
+
cholesky: () => cholesky,
|
|
10
|
+
cond: () => cond,
|
|
11
|
+
det: () => det,
|
|
12
|
+
eig: () => eig,
|
|
13
|
+
eigh: () => eigh,
|
|
14
|
+
eigvals: () => eigvals,
|
|
15
|
+
eigvalsh: () => eigvalsh,
|
|
16
|
+
inv: () => inv,
|
|
17
|
+
lstsq: () => lstsq,
|
|
18
|
+
lu: () => lu,
|
|
19
|
+
matrixRank: () => matrixRank,
|
|
20
|
+
norm: () => norm,
|
|
21
|
+
pinv: () => pinv,
|
|
22
|
+
qr: () => qr,
|
|
23
|
+
slogdet: () => slogdet,
|
|
24
|
+
solve: () => solve,
|
|
25
|
+
solveTriangular: () => solveTriangular,
|
|
26
|
+
svd: () => svd,
|
|
27
|
+
trace: () => trace
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// src/linalg/_internal.ts
|
|
31
|
+
function asMatrix2D(t) {
|
|
32
|
+
if (t.dtype === "string") {
|
|
33
|
+
throw new chunkJSCDE774_cjs.DTypeError("String tensors are not supported");
|
|
34
|
+
}
|
|
35
|
+
if (t.ndim !== 2) {
|
|
36
|
+
throw new chunkJSCDE774_cjs.ShapeError("Expected a 2D tensor");
|
|
37
|
+
}
|
|
38
|
+
const rows = t.shape[0];
|
|
39
|
+
const cols = t.shape[1];
|
|
40
|
+
if (rows === void 0 || cols === void 0) {
|
|
41
|
+
throw new chunkJSCDE774_cjs.ShapeError("Tensor shape metadata is inconsistent");
|
|
42
|
+
}
|
|
43
|
+
const strideRow = t.strides[0];
|
|
44
|
+
const strideCol = t.strides[1];
|
|
45
|
+
if (strideRow === void 0 || strideCol === void 0) {
|
|
46
|
+
throw new chunkJSCDE774_cjs.ShapeError("Tensor stride metadata is inconsistent");
|
|
47
|
+
}
|
|
48
|
+
const isRowMajorContiguous = strideCol === 1 && strideRow === cols;
|
|
49
|
+
return {
|
|
50
|
+
tensor: t,
|
|
51
|
+
rows,
|
|
52
|
+
cols,
|
|
53
|
+
offset: t.offset,
|
|
54
|
+
strideRow,
|
|
55
|
+
strideCol,
|
|
56
|
+
isRowMajorContiguous
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function toDenseMatrix2D(t) {
|
|
60
|
+
const m = asMatrix2D(t);
|
|
61
|
+
const { rows, cols } = m;
|
|
62
|
+
const out = new Float64Array(rows * cols);
|
|
63
|
+
if (m.isRowMajorContiguous) {
|
|
64
|
+
const start = m.offset;
|
|
65
|
+
const end = start + rows * cols;
|
|
66
|
+
for (let i = 0, j = start; j < end; i++, j++) {
|
|
67
|
+
const val = Number(m.tensor.data[j]);
|
|
68
|
+
if (!Number.isFinite(val)) {
|
|
69
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Input contains non-finite values");
|
|
70
|
+
}
|
|
71
|
+
out[i] = val;
|
|
72
|
+
}
|
|
73
|
+
return { rows, cols, data: out };
|
|
74
|
+
}
|
|
75
|
+
for (let i = 0; i < rows; i++) {
|
|
76
|
+
const base = m.offset + i * m.strideRow;
|
|
77
|
+
for (let j = 0; j < cols; j++) {
|
|
78
|
+
const val = Number(m.tensor.data[base + j * m.strideCol]);
|
|
79
|
+
if (!Number.isFinite(val)) {
|
|
80
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Input contains non-finite values");
|
|
81
|
+
}
|
|
82
|
+
out[i * cols + j] = val;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { rows, cols, data: out };
|
|
86
|
+
}
|
|
87
|
+
function toDenseVector1D(t) {
|
|
88
|
+
if (t.dtype === "string") {
|
|
89
|
+
throw new chunkJSCDE774_cjs.DTypeError("String tensors are not supported");
|
|
90
|
+
}
|
|
91
|
+
if (t.ndim !== 1) {
|
|
92
|
+
throw new chunkJSCDE774_cjs.ShapeError("Expected a 1D tensor");
|
|
93
|
+
}
|
|
94
|
+
const n = t.shape[0];
|
|
95
|
+
if (n === void 0) {
|
|
96
|
+
throw new chunkJSCDE774_cjs.ShapeError("Tensor shape metadata is inconsistent");
|
|
97
|
+
}
|
|
98
|
+
const stride = t.strides[0];
|
|
99
|
+
if (stride === void 0) {
|
|
100
|
+
throw new chunkJSCDE774_cjs.ShapeError("Tensor stride metadata is inconsistent");
|
|
101
|
+
}
|
|
102
|
+
const out = new Float64Array(n);
|
|
103
|
+
const base = t.offset;
|
|
104
|
+
for (let i = 0; i < n; i++) {
|
|
105
|
+
const val = Number(t.data[base + i * stride]);
|
|
106
|
+
if (!Number.isFinite(val)) {
|
|
107
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Input contains non-finite values");
|
|
108
|
+
}
|
|
109
|
+
out[i] = val;
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
function fromDenseMatrix2D(rows, cols, data) {
|
|
114
|
+
const config = chunkJSCDE774_cjs.getConfig();
|
|
115
|
+
return chunk6AE5FKKQ_cjs.Tensor.fromTypedArray({
|
|
116
|
+
data,
|
|
117
|
+
shape: [rows, cols],
|
|
118
|
+
dtype: "float64",
|
|
119
|
+
device: config.defaultDevice
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function fromDenseVector1D(data) {
|
|
123
|
+
const config = chunkJSCDE774_cjs.getConfig();
|
|
124
|
+
return chunk6AE5FKKQ_cjs.Tensor.fromTypedArray({
|
|
125
|
+
data,
|
|
126
|
+
shape: [data.length],
|
|
127
|
+
dtype: "float64",
|
|
128
|
+
device: config.defaultDevice
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function luFactorSquare(a, n) {
|
|
132
|
+
const lu2 = new Float64Array(a);
|
|
133
|
+
const piv = new Int32Array(n);
|
|
134
|
+
for (let i = 0; i < n; i++) piv[i] = i;
|
|
135
|
+
let pivSign = 1;
|
|
136
|
+
for (let k = 0; k < n; k++) {
|
|
137
|
+
let maxRow = k;
|
|
138
|
+
let maxVal = Math.abs(at(lu2, k * n + k));
|
|
139
|
+
for (let i = k + 1; i < n; i++) {
|
|
140
|
+
const v = Math.abs(at(lu2, i * n + k));
|
|
141
|
+
if (v > maxVal) {
|
|
142
|
+
maxVal = v;
|
|
143
|
+
maxRow = i;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!Number.isFinite(maxVal) || maxVal === 0) {
|
|
147
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Matrix is singular");
|
|
148
|
+
}
|
|
149
|
+
if (maxRow !== k) {
|
|
150
|
+
for (let j = 0; j < n; j++) {
|
|
151
|
+
const tmp = at(lu2, k * n + j);
|
|
152
|
+
lu2[k * n + j] = at(lu2, maxRow * n + j);
|
|
153
|
+
lu2[maxRow * n + j] = tmp;
|
|
154
|
+
}
|
|
155
|
+
const tp = atInt(piv, k);
|
|
156
|
+
piv[k] = atInt(piv, maxRow);
|
|
157
|
+
piv[maxRow] = tp;
|
|
158
|
+
pivSign = -pivSign;
|
|
159
|
+
}
|
|
160
|
+
const pivot = at(lu2, k * n + k);
|
|
161
|
+
for (let i = k + 1; i < n; i++) {
|
|
162
|
+
lu2[i * n + k] = at(lu2, i * n + k) / pivot;
|
|
163
|
+
const lik = at(lu2, i * n + k);
|
|
164
|
+
for (let j = k + 1; j < n; j++) {
|
|
165
|
+
lu2[i * n + j] = at(lu2, i * n + j) - lik * at(lu2, k * n + j);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { lu: lu2, piv, pivSign };
|
|
170
|
+
}
|
|
171
|
+
function luSolveInPlace(lu2, piv, n, b, nrhs) {
|
|
172
|
+
const b0 = new Float64Array(b);
|
|
173
|
+
for (let i = 0; i < n; i++) {
|
|
174
|
+
const pi = atInt(piv, i);
|
|
175
|
+
for (let j = 0; j < nrhs; j++) {
|
|
176
|
+
b[i * nrhs + j] = at(b0, pi * nrhs + j);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
for (let i = 0; i < n; i++) {
|
|
180
|
+
for (let j = 0; j < nrhs; j++) {
|
|
181
|
+
let sum = at(b, i * nrhs + j);
|
|
182
|
+
for (let k = 0; k < i; k++) {
|
|
183
|
+
sum -= at(lu2, i * n + k) * at(b, k * nrhs + j);
|
|
184
|
+
}
|
|
185
|
+
b[i * nrhs + j] = sum;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
189
|
+
const diag = at(lu2, i * n + i);
|
|
190
|
+
if (diag === 0) throw new chunkJSCDE774_cjs.DataValidationError("Matrix is singular");
|
|
191
|
+
for (let j = 0; j < nrhs; j++) {
|
|
192
|
+
let sum = at(b, i * nrhs + j);
|
|
193
|
+
for (let k = i + 1; k < n; k++) {
|
|
194
|
+
sum -= at(lu2, i * n + k) * at(b, k * nrhs + j);
|
|
195
|
+
}
|
|
196
|
+
b[i * nrhs + j] = sum / diag;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function at(arr, i) {
|
|
201
|
+
const value = arr[i];
|
|
202
|
+
if (value === void 0) {
|
|
203
|
+
throw new chunkJSCDE774_cjs.IndexError(`Index ${i} is out of bounds for Float64Array length ${arr.length}`, {
|
|
204
|
+
index: i,
|
|
205
|
+
validRange: [0, Math.max(0, arr.length - 1)]
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return value;
|
|
209
|
+
}
|
|
210
|
+
function atArr(arr, i) {
|
|
211
|
+
const value = arr[i];
|
|
212
|
+
if (value === void 0) {
|
|
213
|
+
throw new chunkJSCDE774_cjs.IndexError(`Index ${i} is out of bounds for array length ${arr.length}`, {
|
|
214
|
+
index: i,
|
|
215
|
+
validRange: [0, Math.max(0, arr.length - 1)]
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
function atInt(arr, i) {
|
|
221
|
+
const value = arr[i];
|
|
222
|
+
if (value === void 0) {
|
|
223
|
+
throw new chunkJSCDE774_cjs.IndexError(`Index ${i} is out of bounds for Int32Array length ${arr.length}`, {
|
|
224
|
+
index: i,
|
|
225
|
+
validRange: [0, Math.max(0, arr.length - 1)]
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return value;
|
|
229
|
+
}
|
|
230
|
+
function getDim(t, axis, context) {
|
|
231
|
+
const dim = t.shape[axis];
|
|
232
|
+
if (dim === void 0) {
|
|
233
|
+
throw new chunkJSCDE774_cjs.ShapeError(`${context}: missing dimension for axis ${axis}`);
|
|
234
|
+
}
|
|
235
|
+
return dim;
|
|
236
|
+
}
|
|
237
|
+
function getStride(t, axis, context) {
|
|
238
|
+
const stride = t.strides[axis];
|
|
239
|
+
if (stride === void 0) {
|
|
240
|
+
throw new chunkJSCDE774_cjs.ShapeError(`${context}: missing stride for axis ${axis}`);
|
|
241
|
+
}
|
|
242
|
+
return stride;
|
|
243
|
+
}
|
|
244
|
+
function assertFiniteTensor(t, context) {
|
|
245
|
+
if (t.dtype === "string") {
|
|
246
|
+
throw new chunkJSCDE774_cjs.DTypeError(`${context} does not support string dtype`);
|
|
247
|
+
}
|
|
248
|
+
if (t.size === 0) return;
|
|
249
|
+
const ndim = t.ndim;
|
|
250
|
+
if (ndim === 0) {
|
|
251
|
+
const val = Number(t.data[t.offset]);
|
|
252
|
+
if (!Number.isFinite(val)) {
|
|
253
|
+
throw new chunkJSCDE774_cjs.DataValidationError(`${context} contains non-finite values`);
|
|
254
|
+
}
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const shape = t.shape;
|
|
258
|
+
const strides = t.strides;
|
|
259
|
+
const data = t.data;
|
|
260
|
+
if (!Array.isArray(data) && !(data instanceof BigInt64Array) && t.offset === 0) {
|
|
261
|
+
let contiguous = true;
|
|
262
|
+
let expected = 1;
|
|
263
|
+
for (let i = ndim - 1; i >= 0; i--) {
|
|
264
|
+
if (strides[i] !== expected) {
|
|
265
|
+
contiguous = false;
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
expected *= shape[i] ?? 1;
|
|
269
|
+
}
|
|
270
|
+
if (contiguous) {
|
|
271
|
+
for (let i = 0; i < t.size; i++) {
|
|
272
|
+
const val = data[i];
|
|
273
|
+
if (!Number.isFinite(val)) {
|
|
274
|
+
throw new chunkJSCDE774_cjs.DataValidationError(`${context} contains non-finite values`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const idx = new Array(ndim).fill(0);
|
|
281
|
+
let offset = t.offset;
|
|
282
|
+
for (let count = 0; count < t.size; count++) {
|
|
283
|
+
const val = Number(data[offset]);
|
|
284
|
+
if (!Number.isFinite(val)) {
|
|
285
|
+
throw new chunkJSCDE774_cjs.DataValidationError(`${context} contains non-finite values`);
|
|
286
|
+
}
|
|
287
|
+
for (let d = ndim - 1; d >= 0; d--) {
|
|
288
|
+
const dim = shape[d];
|
|
289
|
+
const stride = strides[d];
|
|
290
|
+
if (dim === void 0 || stride === void 0) {
|
|
291
|
+
throw new chunkJSCDE774_cjs.ShapeError(`${context}: tensor metadata is inconsistent`);
|
|
292
|
+
}
|
|
293
|
+
const idxVal = idx[d] ?? 0;
|
|
294
|
+
const nextIdx = idxVal + 1;
|
|
295
|
+
idx[d] = nextIdx;
|
|
296
|
+
offset += stride;
|
|
297
|
+
if (nextIdx < dim) {
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
offset -= nextIdx * stride;
|
|
301
|
+
idx[d] = 0;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// src/linalg/decomposition/cholesky.ts
|
|
307
|
+
function cholesky(a) {
|
|
308
|
+
if (a.ndim !== 2) {
|
|
309
|
+
throw new chunkJSCDE774_cjs.ShapeError("Input must be a 2D matrix");
|
|
310
|
+
}
|
|
311
|
+
const rows = getDim(a, 0, "cholesky()");
|
|
312
|
+
const cols = getDim(a, 1, "cholesky()");
|
|
313
|
+
if (rows !== cols) {
|
|
314
|
+
throw new chunkJSCDE774_cjs.ShapeError("cholesky requires a square matrix");
|
|
315
|
+
}
|
|
316
|
+
const n = rows;
|
|
317
|
+
if (n === 0) {
|
|
318
|
+
return fromDenseMatrix2D(0, 0, new Float64Array(0));
|
|
319
|
+
}
|
|
320
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
321
|
+
for (let i = 0; i < n; i++) {
|
|
322
|
+
for (let j = i + 1; j < n; j++) {
|
|
323
|
+
const aij = at(A, i * n + j);
|
|
324
|
+
const aji = at(A, j * n + i);
|
|
325
|
+
if (Math.abs(aij - aji) > 1e-10) {
|
|
326
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Matrix must be symmetric");
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const L = new Float64Array(n * n);
|
|
331
|
+
for (let i = 0; i < n; i++) {
|
|
332
|
+
for (let j = 0; j <= i; j++) {
|
|
333
|
+
let sum = 0;
|
|
334
|
+
if (j === i) {
|
|
335
|
+
for (let k = 0; k < j; k++) {
|
|
336
|
+
const Lik = at(L, i * n + k);
|
|
337
|
+
sum += Lik * Lik;
|
|
338
|
+
}
|
|
339
|
+
const val = at(A, i * n + i) - sum;
|
|
340
|
+
if (val <= 0) {
|
|
341
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Matrix is not positive definite");
|
|
342
|
+
}
|
|
343
|
+
L[i * n + i] = Math.sqrt(val);
|
|
344
|
+
} else {
|
|
345
|
+
for (let k = 0; k < j; k++) {
|
|
346
|
+
sum += at(L, i * n + k) * at(L, j * n + k);
|
|
347
|
+
}
|
|
348
|
+
const Ljj = at(L, j * n + j);
|
|
349
|
+
L[i * n + j] = (at(A, i * n + j) - sum) / Ljj;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return fromDenseMatrix2D(n, n, L);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// src/linalg/decomposition/svd.ts
|
|
357
|
+
function identityMatrix(n) {
|
|
358
|
+
const out = new Float64Array(n * n);
|
|
359
|
+
for (let i = 0; i < n; i++) out[i * n + i] = 1;
|
|
360
|
+
return out;
|
|
361
|
+
}
|
|
362
|
+
function fillOrthonormalColumn(mat, rows, cols, col) {
|
|
363
|
+
for (let basis = 0; basis < rows; basis++) {
|
|
364
|
+
const vec = new Float64Array(rows);
|
|
365
|
+
vec[basis] = 1;
|
|
366
|
+
for (let j = 0; j < col; j++) {
|
|
367
|
+
let dot = 0;
|
|
368
|
+
for (let i = 0; i < rows; i++) {
|
|
369
|
+
dot += at(mat, i * cols + j) * at(vec, i);
|
|
370
|
+
}
|
|
371
|
+
for (let i = 0; i < rows; i++) {
|
|
372
|
+
vec[i] = at(vec, i) - dot * at(mat, i * cols + j);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
let norm2 = 0;
|
|
376
|
+
for (let i = 0; i < rows; i++) {
|
|
377
|
+
const v = at(vec, i);
|
|
378
|
+
norm2 += v * v;
|
|
379
|
+
}
|
|
380
|
+
norm2 = Math.sqrt(norm2);
|
|
381
|
+
if (norm2 > 1e-12) {
|
|
382
|
+
const inv2 = 1 / norm2;
|
|
383
|
+
for (let i = 0; i < rows; i++) {
|
|
384
|
+
mat[i * cols + col] = at(vec, i) * inv2;
|
|
385
|
+
}
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
function completeOrthonormalColumns(mat, rows, cols, startCol) {
|
|
392
|
+
for (let col = startCol; col < cols; col++) {
|
|
393
|
+
fillOrthonormalColumn(mat, rows, cols, col);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function jacobiSVDCols(a, m, n, maxSweeps = 100, tol = 1e-12) {
|
|
397
|
+
const B = new Float64Array(a);
|
|
398
|
+
const V = identityMatrix(n);
|
|
399
|
+
if (m === 0 || n === 0) return { B, V };
|
|
400
|
+
for (let sweep = 0; sweep < maxSweeps; sweep++) {
|
|
401
|
+
let maxCorr = 0;
|
|
402
|
+
for (let p = 0; p < n - 1; p++) {
|
|
403
|
+
for (let q = p + 1; q < n; q++) {
|
|
404
|
+
let alpha = 0;
|
|
405
|
+
let beta = 0;
|
|
406
|
+
let gamma = 0;
|
|
407
|
+
for (let i = 0; i < m; i++) {
|
|
408
|
+
const ip = at(B, i * n + p);
|
|
409
|
+
const iq = at(B, i * n + q);
|
|
410
|
+
alpha += ip * ip;
|
|
411
|
+
beta += iq * iq;
|
|
412
|
+
gamma += ip * iq;
|
|
413
|
+
}
|
|
414
|
+
if (alpha === 0 || beta === 0) continue;
|
|
415
|
+
const denom = Math.sqrt(alpha * beta);
|
|
416
|
+
if (denom === 0) continue;
|
|
417
|
+
const corr = Math.abs(gamma) / denom;
|
|
418
|
+
if (corr > maxCorr) maxCorr = corr;
|
|
419
|
+
if (corr <= tol) continue;
|
|
420
|
+
const tau = (beta - alpha) / (2 * gamma);
|
|
421
|
+
const sign = tau >= 0 ? 1 : -1;
|
|
422
|
+
const t = sign / (Math.abs(tau) + Math.sqrt(1 + tau * tau));
|
|
423
|
+
const c = 1 / Math.sqrt(1 + t * t);
|
|
424
|
+
const s = c * t;
|
|
425
|
+
for (let i = 0; i < m; i++) {
|
|
426
|
+
const ip = at(B, i * n + p);
|
|
427
|
+
const iq = at(B, i * n + q);
|
|
428
|
+
B[i * n + p] = c * ip - s * iq;
|
|
429
|
+
B[i * n + q] = s * ip + c * iq;
|
|
430
|
+
}
|
|
431
|
+
for (let i = 0; i < n; i++) {
|
|
432
|
+
const vip = at(V, i * n + p);
|
|
433
|
+
const viq = at(V, i * n + q);
|
|
434
|
+
V[i * n + p] = c * vip - s * viq;
|
|
435
|
+
V[i * n + q] = s * vip + c * viq;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
if (maxCorr <= tol) break;
|
|
440
|
+
}
|
|
441
|
+
return { B, V };
|
|
442
|
+
}
|
|
443
|
+
function emptySvd(m, n, fullMatrices) {
|
|
444
|
+
const k = Math.min(m, n);
|
|
445
|
+
const s = new Float64Array(0);
|
|
446
|
+
if (!fullMatrices) {
|
|
447
|
+
return [
|
|
448
|
+
fromDenseMatrix2D(m, k, new Float64Array(m * k)),
|
|
449
|
+
fromDenseVector1D(s),
|
|
450
|
+
fromDenseMatrix2D(k, n, new Float64Array(k * n))
|
|
451
|
+
];
|
|
452
|
+
}
|
|
453
|
+
const Ufull = identityMatrix(m);
|
|
454
|
+
const VtFull = identityMatrix(n);
|
|
455
|
+
return [fromDenseMatrix2D(m, m, Ufull), fromDenseVector1D(s), fromDenseMatrix2D(n, n, VtFull)];
|
|
456
|
+
}
|
|
457
|
+
function buildSvdFromJacobi(B, V, m, n, fullMatrices) {
|
|
458
|
+
const k = Math.min(m, n);
|
|
459
|
+
const norms = new Float64Array(n);
|
|
460
|
+
let maxSigma = 0;
|
|
461
|
+
for (let j = 0; j < n; j++) {
|
|
462
|
+
let sum = 0;
|
|
463
|
+
for (let i = 0; i < m; i++) {
|
|
464
|
+
const v = at(B, i * n + j);
|
|
465
|
+
sum += v * v;
|
|
466
|
+
}
|
|
467
|
+
const sigma = Math.sqrt(sum);
|
|
468
|
+
norms[j] = sigma;
|
|
469
|
+
if (sigma > maxSigma) maxSigma = sigma;
|
|
470
|
+
}
|
|
471
|
+
const idx = new Array(n);
|
|
472
|
+
for (let i = 0; i < n; i++) idx[i] = i;
|
|
473
|
+
idx.sort((i, j) => at(norms, j) - at(norms, i));
|
|
474
|
+
const sigmaTol = Number.EPSILON * Math.max(m, n) * (maxSigma || 1);
|
|
475
|
+
const s = new Float64Array(k);
|
|
476
|
+
const U = new Float64Array(m * k);
|
|
477
|
+
const filled = new Array(k).fill(false);
|
|
478
|
+
for (let j = 0; j < k; j++) {
|
|
479
|
+
const col = idx[j] ?? 0;
|
|
480
|
+
const sigma = norms[col] ?? 0;
|
|
481
|
+
s[j] = sigma;
|
|
482
|
+
if (sigma > sigmaTol) {
|
|
483
|
+
const inv2 = 1 / sigma;
|
|
484
|
+
for (let i = 0; i < m; i++) {
|
|
485
|
+
U[i * k + j] = at(B, i * n + col) * inv2;
|
|
486
|
+
}
|
|
487
|
+
filled[j] = true;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
for (let j = 0; j < k; j++) {
|
|
491
|
+
if (!filled[j]) {
|
|
492
|
+
fillOrthonormalColumn(U, m, k, j);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
const Vsorted = new Float64Array(n * n);
|
|
496
|
+
for (let j = 0; j < n; j++) {
|
|
497
|
+
const col = idx[j] ?? 0;
|
|
498
|
+
for (let i = 0; i < n; i++) {
|
|
499
|
+
Vsorted[i * n + j] = at(V, i * n + col);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (!fullMatrices) {
|
|
503
|
+
const Vt = new Float64Array(k * n);
|
|
504
|
+
for (let i = 0; i < k; i++) {
|
|
505
|
+
for (let j = 0; j < n; j++) {
|
|
506
|
+
Vt[i * n + j] = at(Vsorted, j * n + i);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return [fromDenseMatrix2D(m, k, U), fromDenseVector1D(s), fromDenseMatrix2D(k, n, Vt)];
|
|
510
|
+
}
|
|
511
|
+
let Ufull = U;
|
|
512
|
+
if (m !== k) {
|
|
513
|
+
Ufull = new Float64Array(m * m);
|
|
514
|
+
for (let j = 0; j < k; j++) {
|
|
515
|
+
for (let i = 0; i < m; i++) {
|
|
516
|
+
Ufull[i * m + j] = at(U, i * k + j);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
completeOrthonormalColumns(Ufull, m, m, k);
|
|
520
|
+
}
|
|
521
|
+
const VtFull = new Float64Array(n * n);
|
|
522
|
+
for (let i = 0; i < n; i++) {
|
|
523
|
+
for (let j = 0; j < n; j++) {
|
|
524
|
+
VtFull[i * n + j] = at(Vsorted, j * n + i);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
return [fromDenseMatrix2D(m, m, Ufull), fromDenseVector1D(s), fromDenseMatrix2D(n, n, VtFull)];
|
|
528
|
+
}
|
|
529
|
+
function buildSvdFromJacobiTransposed(B, V, m, n, fullMatrices) {
|
|
530
|
+
const k = Math.min(m, n);
|
|
531
|
+
const norms = new Float64Array(k);
|
|
532
|
+
let maxSigma = 0;
|
|
533
|
+
for (let j = 0; j < k; j++) {
|
|
534
|
+
let sum = 0;
|
|
535
|
+
for (let i = 0; i < n; i++) {
|
|
536
|
+
const v = at(B, i * k + j);
|
|
537
|
+
sum += v * v;
|
|
538
|
+
}
|
|
539
|
+
const sigma = Math.sqrt(sum);
|
|
540
|
+
norms[j] = sigma;
|
|
541
|
+
if (sigma > maxSigma) maxSigma = sigma;
|
|
542
|
+
}
|
|
543
|
+
const idx = new Array(k);
|
|
544
|
+
for (let i = 0; i < k; i++) idx[i] = i;
|
|
545
|
+
idx.sort((i, j) => at(norms, j) - at(norms, i));
|
|
546
|
+
const sigmaTol = Number.EPSILON * Math.max(m, n) * (maxSigma || 1);
|
|
547
|
+
const s = new Float64Array(k);
|
|
548
|
+
const U = new Float64Array(m * k);
|
|
549
|
+
const Vcols = new Float64Array(n * k);
|
|
550
|
+
const filledV = new Array(k).fill(false);
|
|
551
|
+
for (let j = 0; j < k; j++) {
|
|
552
|
+
const col = idx[j] ?? 0;
|
|
553
|
+
const sigma = norms[col] ?? 0;
|
|
554
|
+
s[j] = sigma;
|
|
555
|
+
for (let i = 0; i < m; i++) {
|
|
556
|
+
U[i * k + j] = at(V, i * k + col);
|
|
557
|
+
}
|
|
558
|
+
if (sigma > sigmaTol) {
|
|
559
|
+
const inv2 = 1 / sigma;
|
|
560
|
+
for (let i = 0; i < n; i++) {
|
|
561
|
+
Vcols[i * k + j] = at(B, i * k + col) * inv2;
|
|
562
|
+
}
|
|
563
|
+
filledV[j] = true;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
for (let j = 0; j < k; j++) {
|
|
567
|
+
if (!filledV[j]) {
|
|
568
|
+
fillOrthonormalColumn(Vcols, n, k, j);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
if (!fullMatrices) {
|
|
572
|
+
const Vt = new Float64Array(k * n);
|
|
573
|
+
for (let i = 0; i < k; i++) {
|
|
574
|
+
for (let j = 0; j < n; j++) {
|
|
575
|
+
Vt[i * n + j] = at(Vcols, j * k + i);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return [fromDenseMatrix2D(m, k, U), fromDenseVector1D(s), fromDenseMatrix2D(k, n, Vt)];
|
|
579
|
+
}
|
|
580
|
+
let Vfull = Vcols;
|
|
581
|
+
if (n !== k) {
|
|
582
|
+
Vfull = new Float64Array(n * n);
|
|
583
|
+
for (let j = 0; j < k; j++) {
|
|
584
|
+
for (let i = 0; i < n; i++) {
|
|
585
|
+
Vfull[i * n + j] = at(Vcols, i * k + j);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
completeOrthonormalColumns(Vfull, n, n, k);
|
|
589
|
+
}
|
|
590
|
+
const VtFull = new Float64Array(n * n);
|
|
591
|
+
for (let i = 0; i < n; i++) {
|
|
592
|
+
for (let j = 0; j < n; j++) {
|
|
593
|
+
VtFull[i * n + j] = at(Vfull, j * n + i);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return [fromDenseMatrix2D(m, m, U), fromDenseVector1D(s), fromDenseMatrix2D(n, n, VtFull)];
|
|
597
|
+
}
|
|
598
|
+
function svd(a, fullMatrices = true) {
|
|
599
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("Input must be 2D matrix");
|
|
600
|
+
const m = getDim(a, 0, "svd()");
|
|
601
|
+
const n = getDim(a, 1, "svd()");
|
|
602
|
+
if (m === 0 || n === 0) {
|
|
603
|
+
return emptySvd(m, n, fullMatrices);
|
|
604
|
+
}
|
|
605
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
606
|
+
const maxSweeps = 100;
|
|
607
|
+
const tol = 1e-12;
|
|
608
|
+
if (m >= n) {
|
|
609
|
+
const { B: B2, V: V2 } = jacobiSVDCols(A, m, n, maxSweeps, tol);
|
|
610
|
+
return buildSvdFromJacobi(B2, V2, m, n, fullMatrices);
|
|
611
|
+
}
|
|
612
|
+
const At = new Float64Array(n * m);
|
|
613
|
+
for (let i = 0; i < m; i++) {
|
|
614
|
+
for (let j = 0; j < n; j++) {
|
|
615
|
+
At[j * m + i] = at(A, i * n + j);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
const { B, V } = jacobiSVDCols(At, n, m, maxSweeps, tol);
|
|
619
|
+
return buildSvdFromJacobiTransposed(B, V, m, n, fullMatrices);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// src/linalg/decomposition/eig.ts
|
|
623
|
+
function getSquareMatrixSize(a, context) {
|
|
624
|
+
if (a.ndim !== 2) {
|
|
625
|
+
throw new chunkJSCDE774_cjs.ShapeError(`${context}: input must be 2D matrix`);
|
|
626
|
+
}
|
|
627
|
+
const rows = a.shape[0];
|
|
628
|
+
const cols = a.shape[1];
|
|
629
|
+
if (rows === void 0 || cols === void 0 || rows !== cols) {
|
|
630
|
+
throw new chunkJSCDE774_cjs.ShapeError(`${context}: input must be square matrix`);
|
|
631
|
+
}
|
|
632
|
+
return rows;
|
|
633
|
+
}
|
|
634
|
+
function jacobiEigenSymmetric(a, n, maxSweeps = 100, tol = 1e-12) {
|
|
635
|
+
const A = new Float64Array(a);
|
|
636
|
+
const V = new Float64Array(n * n);
|
|
637
|
+
for (let i = 0; i < n; i++) V[i * n + i] = 1;
|
|
638
|
+
for (let sweep = 0; sweep < maxSweeps; sweep++) {
|
|
639
|
+
let p = 0;
|
|
640
|
+
let q = 1;
|
|
641
|
+
let max = 0;
|
|
642
|
+
for (let i = 0; i < n; i++) {
|
|
643
|
+
for (let j = i + 1; j < n; j++) {
|
|
644
|
+
const v = Math.abs(at(A, i * n + j));
|
|
645
|
+
if (v > max) {
|
|
646
|
+
max = v;
|
|
647
|
+
p = i;
|
|
648
|
+
q = j;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
if (max < tol) break;
|
|
653
|
+
const app = at(A, p * n + p);
|
|
654
|
+
const aqq = at(A, q * n + q);
|
|
655
|
+
const apq = at(A, p * n + q);
|
|
656
|
+
if (apq === 0) continue;
|
|
657
|
+
const tau = (aqq - app) / (2 * apq);
|
|
658
|
+
const sign = tau >= 0 ? 1 : -1;
|
|
659
|
+
const t = sign / (Math.abs(tau) + Math.sqrt(1 + tau * tau));
|
|
660
|
+
const c = 1 / Math.sqrt(1 + t * t);
|
|
661
|
+
const s = t * c;
|
|
662
|
+
for (let k = 0; k < n; k++) {
|
|
663
|
+
if (k === p || k === q) continue;
|
|
664
|
+
const aik = at(A, k * n + p);
|
|
665
|
+
const akq = at(A, k * n + q);
|
|
666
|
+
const newAik = c * aik - s * akq;
|
|
667
|
+
const newAkq = s * aik + c * akq;
|
|
668
|
+
A[k * n + p] = newAik;
|
|
669
|
+
A[p * n + k] = newAik;
|
|
670
|
+
A[k * n + q] = newAkq;
|
|
671
|
+
A[q * n + k] = newAkq;
|
|
672
|
+
}
|
|
673
|
+
const newApp = c * c * app - 2 * s * c * apq + s * s * aqq;
|
|
674
|
+
const newAqq = s * s * app + 2 * s * c * apq + c * c * aqq;
|
|
675
|
+
A[p * n + p] = newApp;
|
|
676
|
+
A[q * n + q] = newAqq;
|
|
677
|
+
A[p * n + q] = 0;
|
|
678
|
+
A[q * n + p] = 0;
|
|
679
|
+
for (let k = 0; k < n; k++) {
|
|
680
|
+
const vkp = at(V, k * n + p);
|
|
681
|
+
const vkq = at(V, k * n + q);
|
|
682
|
+
V[k * n + p] = c * vkp - s * vkq;
|
|
683
|
+
V[k * n + q] = s * vkp + c * vkq;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
const values = new Float64Array(n);
|
|
687
|
+
for (let i = 0; i < n; i++) values[i] = at(A, i * n + i);
|
|
688
|
+
return { values, vectors: V };
|
|
689
|
+
}
|
|
690
|
+
function matmulSquare(a, b, n) {
|
|
691
|
+
const out = new Float64Array(n * n);
|
|
692
|
+
for (let i = 0; i < n; i++) {
|
|
693
|
+
for (let j = 0; j < n; j++) {
|
|
694
|
+
let sum = 0;
|
|
695
|
+
for (let k = 0; k < n; k++) {
|
|
696
|
+
sum += at(a, i * n + k) * at(b, k * n + j);
|
|
697
|
+
}
|
|
698
|
+
out[i * n + j] = sum;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
return out;
|
|
702
|
+
}
|
|
703
|
+
function qrFactorSquare(a, n) {
|
|
704
|
+
const Q = new Float64Array(n * n);
|
|
705
|
+
const R = new Float64Array(n * n);
|
|
706
|
+
const v = new Float64Array(n * n);
|
|
707
|
+
v.set(a);
|
|
708
|
+
const fillOrthonormalColumn2 = (col) => {
|
|
709
|
+
for (let basis = 0; basis < n; basis++) {
|
|
710
|
+
const vec = new Float64Array(n);
|
|
711
|
+
vec[basis] = 1;
|
|
712
|
+
for (let j = 0; j < col; j++) {
|
|
713
|
+
let dot = 0;
|
|
714
|
+
for (let k = 0; k < n; k++) {
|
|
715
|
+
dot += at(Q, k * n + j) * at(vec, k);
|
|
716
|
+
}
|
|
717
|
+
for (let k = 0; k < n; k++) {
|
|
718
|
+
vec[k] = at(vec, k) - dot * at(Q, k * n + j);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
let norm2 = 0;
|
|
722
|
+
for (let k = 0; k < n; k++) {
|
|
723
|
+
const val = at(vec, k);
|
|
724
|
+
norm2 += val * val;
|
|
725
|
+
}
|
|
726
|
+
norm2 = Math.sqrt(norm2);
|
|
727
|
+
if (norm2 > 1e-12) {
|
|
728
|
+
const inv2 = 1 / norm2;
|
|
729
|
+
for (let k = 0; k < n; k++) {
|
|
730
|
+
Q[k * n + col] = at(vec, k) * inv2;
|
|
731
|
+
}
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
};
|
|
736
|
+
for (let j = 0; j < n; j++) {
|
|
737
|
+
for (let i = 0; i < j; i++) {
|
|
738
|
+
let dot = 0;
|
|
739
|
+
for (let k = 0; k < n; k++) {
|
|
740
|
+
dot += at(Q, k * n + i) * at(v, k * n + j);
|
|
741
|
+
}
|
|
742
|
+
R[i * n + j] = dot;
|
|
743
|
+
for (let k = 0; k < n; k++) {
|
|
744
|
+
v[k * n + j] = at(v, k * n + j) - dot * at(Q, k * n + i);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
let norm2 = 0;
|
|
748
|
+
for (let k = 0; k < n; k++) {
|
|
749
|
+
const x = at(v, k * n + j);
|
|
750
|
+
norm2 += x * x;
|
|
751
|
+
}
|
|
752
|
+
norm2 = Math.sqrt(norm2);
|
|
753
|
+
R[j * n + j] = norm2;
|
|
754
|
+
if (norm2 > 1e-12) {
|
|
755
|
+
const inv2 = 1 / norm2;
|
|
756
|
+
for (let k = 0; k < n; k++) {
|
|
757
|
+
Q[k * n + j] = at(v, k * n + j) * inv2;
|
|
758
|
+
}
|
|
759
|
+
} else {
|
|
760
|
+
fillOrthonormalColumn2(j);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
return { Q, R };
|
|
764
|
+
}
|
|
765
|
+
function hessenbergReduce(a, n) {
|
|
766
|
+
const H = new Float64Array(a);
|
|
767
|
+
const Q = new Float64Array(n * n);
|
|
768
|
+
for (let i = 0; i < n; i++) Q[i * n + i] = 1;
|
|
769
|
+
const v = new Float64Array(n);
|
|
770
|
+
for (let col = 0; col < n - 2; col++) {
|
|
771
|
+
let norm2 = 0;
|
|
772
|
+
for (let i = col + 1; i < n; i++) {
|
|
773
|
+
const val = at(H, i * n + col);
|
|
774
|
+
v[i] = val;
|
|
775
|
+
norm2 += val * val;
|
|
776
|
+
}
|
|
777
|
+
norm2 = Math.sqrt(norm2);
|
|
778
|
+
if (norm2 < 1e-14) continue;
|
|
779
|
+
const vkp1 = at(v, col + 1);
|
|
780
|
+
const sign = vkp1 >= 0 ? 1 : -1;
|
|
781
|
+
v[col + 1] = vkp1 + sign * norm2;
|
|
782
|
+
let vnorm = 0;
|
|
783
|
+
for (let i = col + 1; i < n; i++) {
|
|
784
|
+
const val = at(v, i);
|
|
785
|
+
vnorm += val * val;
|
|
786
|
+
}
|
|
787
|
+
vnorm = Math.sqrt(vnorm);
|
|
788
|
+
if (vnorm < 1e-14) continue;
|
|
789
|
+
for (let i = col + 1; i < n; i++) {
|
|
790
|
+
v[i] = at(v, i) / vnorm;
|
|
791
|
+
}
|
|
792
|
+
for (let j = col; j < n; j++) {
|
|
793
|
+
let dot = 0;
|
|
794
|
+
for (let i = col + 1; i < n; i++) {
|
|
795
|
+
dot += at(v, i) * at(H, i * n + j);
|
|
796
|
+
}
|
|
797
|
+
dot *= 2;
|
|
798
|
+
for (let i = col + 1; i < n; i++) {
|
|
799
|
+
H[i * n + j] = at(H, i * n + j) - dot * at(v, i);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
for (let i = 0; i < n; i++) {
|
|
803
|
+
let dot = 0;
|
|
804
|
+
for (let j = col + 1; j < n; j++) {
|
|
805
|
+
dot += at(H, i * n + j) * at(v, j);
|
|
806
|
+
}
|
|
807
|
+
dot *= 2;
|
|
808
|
+
for (let j = col + 1; j < n; j++) {
|
|
809
|
+
H[i * n + j] = at(H, i * n + j) - dot * at(v, j);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
for (let i = 0; i < n; i++) {
|
|
813
|
+
let dot = 0;
|
|
814
|
+
for (let j = col + 1; j < n; j++) {
|
|
815
|
+
dot += at(Q, i * n + j) * at(v, j);
|
|
816
|
+
}
|
|
817
|
+
dot *= 2;
|
|
818
|
+
for (let j = col + 1; j < n; j++) {
|
|
819
|
+
Q[i * n + j] = at(Q, i * n + j) - dot * at(v, j);
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
return { H, Q };
|
|
824
|
+
}
|
|
825
|
+
function eig(a, options = {}) {
|
|
826
|
+
const n = getSquareMatrixSize(a, "eig");
|
|
827
|
+
if (n === 0) {
|
|
828
|
+
return [fromDenseVector1D(new Float64Array(0)), fromDenseMatrix2D(0, 0, new Float64Array(0))];
|
|
829
|
+
}
|
|
830
|
+
const { data: A0 } = toDenseMatrix2D(a);
|
|
831
|
+
let symmetric = true;
|
|
832
|
+
for (let i = 0; i < n && symmetric; i++) {
|
|
833
|
+
for (let j = i + 1; j < n; j++) {
|
|
834
|
+
const aij = at(A0, i * n + j);
|
|
835
|
+
const aji = at(A0, j * n + i);
|
|
836
|
+
if (Math.abs(aij - aji) > 1e-10) {
|
|
837
|
+
symmetric = false;
|
|
838
|
+
break;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
if (symmetric) {
|
|
843
|
+
return eigh(a);
|
|
844
|
+
}
|
|
845
|
+
const { H } = hessenbergReduce(A0, n);
|
|
846
|
+
const maxIter = options.maxIter ?? 300;
|
|
847
|
+
const convTol = options.tol ?? 1e-10;
|
|
848
|
+
let Ak = H;
|
|
849
|
+
let converged = false;
|
|
850
|
+
for (let iter = 0; iter < maxIter; iter++) {
|
|
851
|
+
let off = 0;
|
|
852
|
+
for (let i = 1; i < n; i++) {
|
|
853
|
+
const v = at(Ak, i * n + (i - 1));
|
|
854
|
+
off += v * v;
|
|
855
|
+
}
|
|
856
|
+
if (Math.sqrt(off) < convTol) {
|
|
857
|
+
converged = true;
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
const mu = at(Ak, (n - 1) * n + (n - 1));
|
|
861
|
+
const shifted = new Float64Array(Ak);
|
|
862
|
+
for (let i = 0; i < n; i++) {
|
|
863
|
+
shifted[i * n + i] = at(shifted, i * n + i) - mu;
|
|
864
|
+
}
|
|
865
|
+
const { Q, R } = qrFactorSquare(shifted, n);
|
|
866
|
+
Ak = matmulSquare(R, Q, n);
|
|
867
|
+
for (let i = 0; i < n; i++) {
|
|
868
|
+
Ak[i * n + i] = at(Ak, i * n + i) + mu;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
for (let i = 1; i < n; i++) {
|
|
872
|
+
const v = at(Ak, i * n + (i - 1));
|
|
873
|
+
if (Math.abs(v) < convTol) {
|
|
874
|
+
Ak[i * n + (i - 1)] = 0;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
const complexTol = 1e-8;
|
|
878
|
+
let hasComplex = false;
|
|
879
|
+
for (let i = 0; i < n - 1; i++) {
|
|
880
|
+
const subdiag = Math.abs(at(Ak, (i + 1) * n + i));
|
|
881
|
+
if (subdiag > complexTol) {
|
|
882
|
+
const a11 = at(Ak, i * n + i);
|
|
883
|
+
const a12 = at(Ak, i * n + (i + 1));
|
|
884
|
+
const a21 = at(Ak, (i + 1) * n + i);
|
|
885
|
+
const a22 = at(Ak, (i + 1) * n + (i + 1));
|
|
886
|
+
const discriminant = (a11 - a22) * (a11 - a22) + 4 * a12 * a21;
|
|
887
|
+
if (discriminant < -complexTol) {
|
|
888
|
+
hasComplex = true;
|
|
889
|
+
break;
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
if (hasComplex) {
|
|
894
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
895
|
+
"Matrix has complex eigenvalues, which are not supported. Only matrices with real eigenvalues can be decomposed. Symmetric matrices always have real eigenvalues.",
|
|
896
|
+
"a"
|
|
897
|
+
);
|
|
898
|
+
}
|
|
899
|
+
if (!converged) {
|
|
900
|
+
throw new chunkJSCDE774_cjs.ConvergenceError(`eig() failed to converge after ${maxIter} iterations`, {
|
|
901
|
+
iterations: maxIter,
|
|
902
|
+
tolerance: convTol
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
const evals = new Float64Array(n);
|
|
906
|
+
for (let i = 0; i < n; i++) evals[i] = at(Ak, i * n + i);
|
|
907
|
+
const vectors = new Float64Array(n * n);
|
|
908
|
+
const used = new Array(n).fill(false);
|
|
909
|
+
const clusterTol = 1e-8;
|
|
910
|
+
for (let i = 0; i < n; i++) {
|
|
911
|
+
if (used[i]) continue;
|
|
912
|
+
const lambda = at(evals, i);
|
|
913
|
+
const cluster = [i];
|
|
914
|
+
used[i] = true;
|
|
915
|
+
for (let j = i + 1; j < n; j++) {
|
|
916
|
+
if (used[j]) continue;
|
|
917
|
+
const diff = Math.abs(at(evals, j) - lambda);
|
|
918
|
+
const scale = Math.max(1, Math.abs(lambda));
|
|
919
|
+
if (diff <= clusterTol * scale) {
|
|
920
|
+
used[j] = true;
|
|
921
|
+
cluster.push(j);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
const basis = (() => {
|
|
925
|
+
const M = new Float64Array(A0);
|
|
926
|
+
for (let d = 0; d < n; d++) {
|
|
927
|
+
M[d * n + d] = at(M, d * n + d) - lambda;
|
|
928
|
+
}
|
|
929
|
+
const [_, s, Vt] = svd(fromDenseMatrix2D(n, n, M), true);
|
|
930
|
+
const sDense = toDenseVector1D(s);
|
|
931
|
+
const { data: VtData } = toDenseMatrix2D(Vt);
|
|
932
|
+
const vData = new Float64Array(n * n);
|
|
933
|
+
for (let r = 0; r < n; r++) {
|
|
934
|
+
for (let c = 0; c < n; c++) {
|
|
935
|
+
vData[r * n + c] = at(VtData, c * n + r);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
const sMax = sDense.length === 0 ? 0 : at(sDense, 0);
|
|
939
|
+
const tol = Number.EPSILON * n * sMax;
|
|
940
|
+
const basisVecs = [];
|
|
941
|
+
for (let r = sDense.length - 1; r >= 0; r--) {
|
|
942
|
+
if (at(sDense, r) <= tol) {
|
|
943
|
+
const vec = new Float64Array(n);
|
|
944
|
+
for (let c = 0; c < n; c++) {
|
|
945
|
+
vec[c] = at(vData, c * n + r);
|
|
946
|
+
}
|
|
947
|
+
basisVecs.push(vec);
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
if (basisVecs.length === 0 && sDense.length > 0) {
|
|
951
|
+
const r = sDense.length - 1;
|
|
952
|
+
const vec = new Float64Array(n);
|
|
953
|
+
for (let c = 0; c < n; c++) {
|
|
954
|
+
vec[c] = at(vData, c * n + r);
|
|
955
|
+
}
|
|
956
|
+
basisVecs.push(vec);
|
|
957
|
+
}
|
|
958
|
+
return basisVecs.length === 0 ? [new Float64Array(n)] : basisVecs;
|
|
959
|
+
})();
|
|
960
|
+
for (let b = 0; b < cluster.length; b++) {
|
|
961
|
+
const colIndex = cluster[b];
|
|
962
|
+
if (colIndex === void 0) {
|
|
963
|
+
throw new chunkJSCDE774_cjs.ShapeError("eig(): eigenvector index is missing");
|
|
964
|
+
}
|
|
965
|
+
const vec = basis[b % basis.length];
|
|
966
|
+
if (vec === void 0) {
|
|
967
|
+
throw new chunkJSCDE774_cjs.ShapeError("eig(): eigenvector basis is missing");
|
|
968
|
+
}
|
|
969
|
+
let norm2 = 0;
|
|
970
|
+
for (let r = 0; r < n; r++) {
|
|
971
|
+
const v = at(vec, r);
|
|
972
|
+
norm2 += v * v;
|
|
973
|
+
}
|
|
974
|
+
if (norm2 === 0) {
|
|
975
|
+
for (let r = 0; r < n; r++) {
|
|
976
|
+
vectors[r * n + colIndex] = r === colIndex ? 1 : 0;
|
|
977
|
+
}
|
|
978
|
+
continue;
|
|
979
|
+
}
|
|
980
|
+
const inv2 = 1 / Math.sqrt(norm2);
|
|
981
|
+
for (let r = 0; r < n; r++) {
|
|
982
|
+
vectors[r * n + colIndex] = at(vec, r) * inv2;
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
return [fromDenseVector1D(evals), fromDenseMatrix2D(n, n, vectors)];
|
|
987
|
+
}
|
|
988
|
+
function eigvals(a, options) {
|
|
989
|
+
const [eigenvalues] = eig(a, options);
|
|
990
|
+
return eigenvalues;
|
|
991
|
+
}
|
|
992
|
+
function eigvalsh(a) {
|
|
993
|
+
const n = getSquareMatrixSize(a, "eigvalsh");
|
|
994
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
995
|
+
for (let i = 0; i < n; i++) {
|
|
996
|
+
for (let j = i + 1; j < n; j++) {
|
|
997
|
+
const aij = at(A, i * n + j);
|
|
998
|
+
const aji = at(A, j * n + i);
|
|
999
|
+
if (Math.abs(aij - aji) > 1e-10) {
|
|
1000
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Input must be symmetric for eigvalsh");
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
const [eigenvalues] = eigh(a);
|
|
1005
|
+
return eigenvalues;
|
|
1006
|
+
}
|
|
1007
|
+
function eigh(a) {
|
|
1008
|
+
const n = getSquareMatrixSize(a, "eigh");
|
|
1009
|
+
if (n === 0) {
|
|
1010
|
+
return [fromDenseVector1D(new Float64Array(0)), fromDenseMatrix2D(0, 0, new Float64Array(0))];
|
|
1011
|
+
}
|
|
1012
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
1013
|
+
for (let i = 0; i < n; i++) {
|
|
1014
|
+
for (let j = i + 1; j < n; j++) {
|
|
1015
|
+
const aij = at(A, i * n + j);
|
|
1016
|
+
const aji = at(A, j * n + i);
|
|
1017
|
+
if (Math.abs(aij - aji) > 1e-10) {
|
|
1018
|
+
throw new chunkJSCDE774_cjs.DataValidationError("Input must be symmetric for eigh");
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
const { values, vectors } = jacobiEigenSymmetric(A, n);
|
|
1023
|
+
const idx = new Array(n);
|
|
1024
|
+
for (let i = 0; i < n; i++) idx[i] = i;
|
|
1025
|
+
idx.sort((i, j) => at(values, i) - at(values, j));
|
|
1026
|
+
const outVals = new Float64Array(n);
|
|
1027
|
+
const outVecs = new Float64Array(n * n);
|
|
1028
|
+
for (let col = 0; col < n; col++) {
|
|
1029
|
+
const src = atArr(idx, col);
|
|
1030
|
+
outVals[col] = at(values, src);
|
|
1031
|
+
for (let row = 0; row < n; row++) {
|
|
1032
|
+
outVecs[row * n + col] = at(vectors, row * n + src);
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
return [fromDenseVector1D(outVals), fromDenseMatrix2D(n, n, outVecs)];
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
// src/linalg/decomposition/lu.ts
|
|
1039
|
+
function lu(a) {
|
|
1040
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("Input must be 2D matrix");
|
|
1041
|
+
const m = getDim(a, 0, "lu()");
|
|
1042
|
+
const n = getDim(a, 1, "lu()");
|
|
1043
|
+
const k = Math.min(m, n);
|
|
1044
|
+
const { data: A0 } = toDenseMatrix2D(a);
|
|
1045
|
+
const Ufull = new Float64Array(A0);
|
|
1046
|
+
const Lfull = new Float64Array(m * k);
|
|
1047
|
+
for (let i = 0; i < Math.min(m, k); i++) Lfull[i * k + i] = 1;
|
|
1048
|
+
const piv = new Int32Array(m);
|
|
1049
|
+
for (let i = 0; i < m; i++) piv[i] = i;
|
|
1050
|
+
for (let col = 0; col < k; col++) {
|
|
1051
|
+
let maxRow = col;
|
|
1052
|
+
let maxVal = Math.abs(at(Ufull, col * n + col));
|
|
1053
|
+
for (let i = col + 1; i < m; i++) {
|
|
1054
|
+
const v = Math.abs(at(Ufull, i * n + col));
|
|
1055
|
+
if (v > maxVal) {
|
|
1056
|
+
maxVal = v;
|
|
1057
|
+
maxRow = i;
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
if (maxRow !== col) {
|
|
1061
|
+
for (let j = 0; j < n; j++) {
|
|
1062
|
+
const tmp = at(Ufull, col * n + j);
|
|
1063
|
+
Ufull[col * n + j] = at(Ufull, maxRow * n + j);
|
|
1064
|
+
Ufull[maxRow * n + j] = tmp;
|
|
1065
|
+
}
|
|
1066
|
+
for (let j = 0; j < col; j++) {
|
|
1067
|
+
const tmp = at(Lfull, col * k + j);
|
|
1068
|
+
Lfull[col * k + j] = at(Lfull, maxRow * k + j);
|
|
1069
|
+
Lfull[maxRow * k + j] = tmp;
|
|
1070
|
+
}
|
|
1071
|
+
const tp = atInt(piv, col);
|
|
1072
|
+
piv[col] = atInt(piv, maxRow);
|
|
1073
|
+
piv[maxRow] = tp;
|
|
1074
|
+
}
|
|
1075
|
+
const pivot = at(Ufull, col * n + col);
|
|
1076
|
+
if (pivot === 0) continue;
|
|
1077
|
+
for (let i = col + 1; i < m; i++) {
|
|
1078
|
+
const factor = at(Ufull, i * n + col) / pivot;
|
|
1079
|
+
Lfull[i * k + col] = factor;
|
|
1080
|
+
Ufull[i * n + col] = factor;
|
|
1081
|
+
for (let j = col + 1; j < n; j++) {
|
|
1082
|
+
Ufull[i * n + j] = at(Ufull, i * n + j) - factor * at(Ufull, col * n + j);
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
const Pfull = new Float64Array(m * m);
|
|
1087
|
+
for (let i = 0; i < m; i++) {
|
|
1088
|
+
const pi = atInt(piv, i);
|
|
1089
|
+
Pfull[i * m + pi] = 1;
|
|
1090
|
+
}
|
|
1091
|
+
const U = new Float64Array(k * n);
|
|
1092
|
+
for (let i = 0; i < k; i++) {
|
|
1093
|
+
for (let j = 0; j < n; j++) {
|
|
1094
|
+
U[i * n + j] = i <= j ? at(Ufull, i * n + j) : 0;
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
return [
|
|
1098
|
+
fromDenseMatrix2D(m, m, Pfull),
|
|
1099
|
+
fromDenseMatrix2D(m, k, Lfull),
|
|
1100
|
+
fromDenseMatrix2D(k, n, U)
|
|
1101
|
+
];
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
// src/linalg/decomposition/qr.ts
|
|
1105
|
+
function qr(a, mode = "reduced") {
|
|
1106
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("Input must be 2D matrix");
|
|
1107
|
+
const m = getDim(a, 0, "qr()");
|
|
1108
|
+
const n = getDim(a, 1, "qr()");
|
|
1109
|
+
const minDim = Math.min(m, n);
|
|
1110
|
+
const { data: A_data } = toDenseMatrix2D(a);
|
|
1111
|
+
const R = new Float64Array(A_data);
|
|
1112
|
+
const Q = new Float64Array(m * m);
|
|
1113
|
+
for (let i = 0; i < m; i++) {
|
|
1114
|
+
Q[i * m + i] = 1;
|
|
1115
|
+
}
|
|
1116
|
+
const v = new Float64Array(m);
|
|
1117
|
+
const w = new Float64Array(m);
|
|
1118
|
+
for (let k = 0; k < minDim; k++) {
|
|
1119
|
+
let normXSq = 0;
|
|
1120
|
+
for (let i = k; i < m; i++) {
|
|
1121
|
+
const val = at(R, i * n + k);
|
|
1122
|
+
normXSq += val * val;
|
|
1123
|
+
}
|
|
1124
|
+
if (normXSq < 1e-15) continue;
|
|
1125
|
+
const normX = Math.sqrt(normXSq);
|
|
1126
|
+
const x0 = at(R, k * n + k);
|
|
1127
|
+
const sign = x0 >= 0 ? 1 : -1;
|
|
1128
|
+
const alpha = -sign * normX;
|
|
1129
|
+
v.fill(0);
|
|
1130
|
+
v[k] = x0 - alpha;
|
|
1131
|
+
for (let i = k + 1; i < m; i++) {
|
|
1132
|
+
v[i] = at(R, i * n + k);
|
|
1133
|
+
}
|
|
1134
|
+
let normVSq = 0;
|
|
1135
|
+
for (let i = k; i < m; i++) {
|
|
1136
|
+
const vi = at(v, i);
|
|
1137
|
+
normVSq += vi * vi;
|
|
1138
|
+
}
|
|
1139
|
+
const normV = Math.sqrt(normVSq);
|
|
1140
|
+
if (normV < 1e-15) continue;
|
|
1141
|
+
const invNormV = 1 / normV;
|
|
1142
|
+
for (let i = k; i < m; i++) {
|
|
1143
|
+
v[i] = at(v, i) * invNormV;
|
|
1144
|
+
}
|
|
1145
|
+
for (let j = k; j < n; j++) {
|
|
1146
|
+
let dot = 0;
|
|
1147
|
+
for (let i = k; i < m; i++) {
|
|
1148
|
+
dot += at(v, i) * at(R, i * n + j);
|
|
1149
|
+
}
|
|
1150
|
+
for (let i = k; i < m; i++) {
|
|
1151
|
+
R[i * n + j] = at(R, i * n + j) - 2 * dot * at(v, i);
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
R[k * n + k] = alpha;
|
|
1155
|
+
for (let i = k + 1; i < m; i++) {
|
|
1156
|
+
R[i * n + k] = 0;
|
|
1157
|
+
}
|
|
1158
|
+
w.fill(0);
|
|
1159
|
+
for (let i = 0; i < m; i++) {
|
|
1160
|
+
let dot = 0;
|
|
1161
|
+
for (let j = k; j < m; j++) {
|
|
1162
|
+
dot += at(Q, i * m + j) * at(v, j);
|
|
1163
|
+
}
|
|
1164
|
+
w[i] = dot;
|
|
1165
|
+
}
|
|
1166
|
+
for (let j = k; j < m; j++) {
|
|
1167
|
+
const vj = at(v, j);
|
|
1168
|
+
for (let i = 0; i < m; i++) {
|
|
1169
|
+
Q[i * m + j] = at(Q, i * m + j) - 2 * at(w, i) * vj;
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
if (mode === "reduced") {
|
|
1174
|
+
const k = minDim;
|
|
1175
|
+
const Q_reduced = new Float64Array(m * k);
|
|
1176
|
+
for (let i = 0; i < m; i++) {
|
|
1177
|
+
for (let j = 0; j < k; j++) {
|
|
1178
|
+
Q_reduced[i * k + j] = at(Q, i * m + j);
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
const R_reduced = new Float64Array(k * n);
|
|
1182
|
+
for (let i = 0; i < k; i++) {
|
|
1183
|
+
for (let j = 0; j < n; j++) {
|
|
1184
|
+
R_reduced[i * n + j] = at(R, i * n + j);
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
return [fromDenseMatrix2D(m, k, Q_reduced), fromDenseMatrix2D(k, n, R_reduced)];
|
|
1188
|
+
}
|
|
1189
|
+
return [fromDenseMatrix2D(m, m, Q), fromDenseMatrix2D(m, n, R)];
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
// src/linalg/inverse.ts
|
|
1193
|
+
function inv(a) {
|
|
1194
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("Input must be 2D matrix");
|
|
1195
|
+
const rows = getDim(a, 0, "inv()");
|
|
1196
|
+
const cols = getDim(a, 1, "inv()");
|
|
1197
|
+
if (rows !== cols) throw new chunkJSCDE774_cjs.ShapeError("inv requires a square matrix");
|
|
1198
|
+
const n = rows;
|
|
1199
|
+
if (n === 0) {
|
|
1200
|
+
return fromDenseMatrix2D(0, 0, new Float64Array(0));
|
|
1201
|
+
}
|
|
1202
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
1203
|
+
const { lu: lu2, piv } = luFactorSquare(A, n);
|
|
1204
|
+
const rhs = new Float64Array(n * n);
|
|
1205
|
+
for (let i = 0; i < n; i++) rhs[i * n + i] = 1;
|
|
1206
|
+
luSolveInPlace(lu2, piv, n, rhs, n);
|
|
1207
|
+
return fromDenseMatrix2D(n, n, rhs);
|
|
1208
|
+
}
|
|
1209
|
+
function pinv(a, rcond) {
|
|
1210
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("Input must be 2D matrix");
|
|
1211
|
+
if (rcond !== void 0 && (!Number.isFinite(rcond) || rcond < 0)) {
|
|
1212
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("rcond must be a non-negative finite number", "rcond", rcond);
|
|
1213
|
+
}
|
|
1214
|
+
const m = getDim(a, 0, "pinv()");
|
|
1215
|
+
const n = getDim(a, 1, "pinv()");
|
|
1216
|
+
const k = Math.min(m, n);
|
|
1217
|
+
if (k === 0) {
|
|
1218
|
+
return fromDenseMatrix2D(n, m, new Float64Array(n * m));
|
|
1219
|
+
}
|
|
1220
|
+
const [U_t, s_t, Vt_t] = svd(a, false);
|
|
1221
|
+
const { data: U, cols: uCols, rows: uRows } = toDenseMatrix2D(U_t);
|
|
1222
|
+
const s = toDenseVector1D(s_t);
|
|
1223
|
+
const { data: Vt, cols: vtCols, rows: vtRows } = toDenseMatrix2D(Vt_t);
|
|
1224
|
+
if (uRows !== m || uCols !== k) throw new chunkJSCDE774_cjs.DeepboxError("Internal error: unexpected U shape");
|
|
1225
|
+
if (vtRows !== k || vtCols !== n) throw new chunkJSCDE774_cjs.DeepboxError("Internal error: unexpected Vt shape");
|
|
1226
|
+
const s0 = at(s, 0);
|
|
1227
|
+
const rcondVal = rcond ?? Number.EPSILON * Math.max(m, n);
|
|
1228
|
+
const cutoff = rcondVal * s0;
|
|
1229
|
+
const sInv = new Float64Array(k);
|
|
1230
|
+
for (let i = 0; i < k; i++) {
|
|
1231
|
+
const si = at(s, i);
|
|
1232
|
+
sInv[i] = si > cutoff ? 1 / si : 0;
|
|
1233
|
+
}
|
|
1234
|
+
const out = new Float64Array(n * m);
|
|
1235
|
+
for (let i = 0; i < n; i++) {
|
|
1236
|
+
for (let j = 0; j < m; j++) {
|
|
1237
|
+
let sum = 0;
|
|
1238
|
+
for (let r = 0; r < k; r++) {
|
|
1239
|
+
const v_ir = at(Vt, r * n + i);
|
|
1240
|
+
const u_jr = at(U, j * k + r);
|
|
1241
|
+
sum += v_ir * at(sInv, r) * u_jr;
|
|
1242
|
+
}
|
|
1243
|
+
out[i * m + j] = sum;
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
return fromDenseMatrix2D(n, m, out);
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
// src/linalg/norms.ts
|
|
1250
|
+
function norm(x, ord, axis, keepdims = false) {
|
|
1251
|
+
assertFiniteTensor(x, "norm()");
|
|
1252
|
+
const axes = axis !== void 0 ? chunkJSCDE774_cjs.normalizeAxes(axis, x.ndim) : void 0;
|
|
1253
|
+
let p;
|
|
1254
|
+
if (ord === void 0) {
|
|
1255
|
+
if (axes === void 0) {
|
|
1256
|
+
p = x.ndim === 1 ? 2 : "fro";
|
|
1257
|
+
} else if (axes.length === 2) {
|
|
1258
|
+
p = "fro";
|
|
1259
|
+
} else {
|
|
1260
|
+
p = 2;
|
|
1261
|
+
}
|
|
1262
|
+
} else {
|
|
1263
|
+
p = ord;
|
|
1264
|
+
}
|
|
1265
|
+
const normalizeVectorOrder = (order) => {
|
|
1266
|
+
const ordValue = order === "fro" ? 2 : order;
|
|
1267
|
+
if (Number.isNaN(ordValue)) {
|
|
1268
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("ord must be a valid number", "ord", ordValue);
|
|
1269
|
+
}
|
|
1270
|
+
if (!Number.isFinite(ordValue)) {
|
|
1271
|
+
if (ordValue === Number.POSITIVE_INFINITY || ordValue === Number.NEGATIVE_INFINITY) {
|
|
1272
|
+
return ordValue;
|
|
1273
|
+
}
|
|
1274
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("ord must be finite or \xB1Infinity", "ord", ordValue);
|
|
1275
|
+
}
|
|
1276
|
+
if (ordValue < 0) {
|
|
1277
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1278
|
+
"Vector norm order must be non-negative or \xB1Infinity",
|
|
1279
|
+
"ord",
|
|
1280
|
+
ordValue
|
|
1281
|
+
);
|
|
1282
|
+
}
|
|
1283
|
+
return ordValue;
|
|
1284
|
+
};
|
|
1285
|
+
const vectorNormValue = (values, order) => {
|
|
1286
|
+
const n = values.length;
|
|
1287
|
+
if (n === 0) return 0;
|
|
1288
|
+
if (order === 0) {
|
|
1289
|
+
let count = 0;
|
|
1290
|
+
for (const v of values) if (v !== 0) count++;
|
|
1291
|
+
return count;
|
|
1292
|
+
}
|
|
1293
|
+
if (order === 1) {
|
|
1294
|
+
let sum2 = 0;
|
|
1295
|
+
for (const v of values) sum2 += Math.abs(v);
|
|
1296
|
+
return sum2;
|
|
1297
|
+
}
|
|
1298
|
+
if (order === 2) {
|
|
1299
|
+
let sum2 = 0;
|
|
1300
|
+
for (const v of values) sum2 += v * v;
|
|
1301
|
+
return Math.sqrt(sum2);
|
|
1302
|
+
}
|
|
1303
|
+
if (order === Number.POSITIVE_INFINITY) {
|
|
1304
|
+
let max = 0;
|
|
1305
|
+
for (const v of values) max = Math.max(max, Math.abs(v));
|
|
1306
|
+
return max;
|
|
1307
|
+
}
|
|
1308
|
+
if (order === Number.NEGATIVE_INFINITY) {
|
|
1309
|
+
let min = Infinity;
|
|
1310
|
+
for (const v of values) min = Math.min(min, Math.abs(v));
|
|
1311
|
+
return min === Infinity ? 0 : min;
|
|
1312
|
+
}
|
|
1313
|
+
let sum = 0;
|
|
1314
|
+
for (const v of values) sum += Math.abs(v) ** order;
|
|
1315
|
+
return sum ** (1 / order);
|
|
1316
|
+
};
|
|
1317
|
+
const vectorNormAxis = (axisValue, order, keep) => {
|
|
1318
|
+
const ax = chunkJSCDE774_cjs.normalizeAxis(axisValue, x.ndim);
|
|
1319
|
+
const axisDim = getDim(x, ax, "norm()");
|
|
1320
|
+
const outShape = [];
|
|
1321
|
+
for (let i = 0; i < x.ndim; i++) {
|
|
1322
|
+
if (i === ax) {
|
|
1323
|
+
if (keep) outShape.push(1);
|
|
1324
|
+
} else {
|
|
1325
|
+
outShape.push(getDim(x, i, "norm()"));
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
const outSize = outShape.length === 0 ? 1 : outShape.reduce((a, b) => a * b, 1);
|
|
1329
|
+
const out = new Float64Array(outSize);
|
|
1330
|
+
const outStrides = new Array(outShape.length);
|
|
1331
|
+
let stride = 1;
|
|
1332
|
+
for (let i = outShape.length - 1; i >= 0; i--) {
|
|
1333
|
+
outStrides[i] = stride;
|
|
1334
|
+
stride *= outShape[i] ?? 0;
|
|
1335
|
+
}
|
|
1336
|
+
for (let outFlat = 0; outFlat < outSize; outFlat++) {
|
|
1337
|
+
let rem = outFlat;
|
|
1338
|
+
const outIdx = new Array(outShape.length);
|
|
1339
|
+
let i = 0;
|
|
1340
|
+
for (const s of outStrides) {
|
|
1341
|
+
outIdx[i] = Math.floor(rem / s);
|
|
1342
|
+
rem %= s;
|
|
1343
|
+
i++;
|
|
1344
|
+
}
|
|
1345
|
+
const inIdx = new Array(x.ndim);
|
|
1346
|
+
if (keep) {
|
|
1347
|
+
for (let i2 = 0; i2 < x.ndim; i2++) {
|
|
1348
|
+
inIdx[i2] = i2 === ax ? 0 : outIdx[i2] ?? 0;
|
|
1349
|
+
}
|
|
1350
|
+
} else {
|
|
1351
|
+
let outAxis = 0;
|
|
1352
|
+
for (let i2 = 0; i2 < x.ndim; i2++) {
|
|
1353
|
+
if (i2 === ax) {
|
|
1354
|
+
inIdx[i2] = 0;
|
|
1355
|
+
} else {
|
|
1356
|
+
inIdx[i2] = outIdx[outAxis] ?? 0;
|
|
1357
|
+
outAxis++;
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
if (axisDim === 0) {
|
|
1362
|
+
out[outFlat] = 0;
|
|
1363
|
+
continue;
|
|
1364
|
+
}
|
|
1365
|
+
let baseOffset = x.offset;
|
|
1366
|
+
for (let i2 = 0; i2 < x.ndim; i2++) {
|
|
1367
|
+
baseOffset += (inIdx[i2] ?? 0) * getStride(x, i2, "norm()");
|
|
1368
|
+
}
|
|
1369
|
+
const axisStride = getStride(x, ax, "norm()");
|
|
1370
|
+
if (order === 0) {
|
|
1371
|
+
let count = 0;
|
|
1372
|
+
for (let k = 0; k < axisDim; k++) {
|
|
1373
|
+
if (Number(x.data[baseOffset + k * axisStride]) !== 0) count++;
|
|
1374
|
+
}
|
|
1375
|
+
out[outFlat] = count;
|
|
1376
|
+
} else if (order === 1) {
|
|
1377
|
+
let sum = 0;
|
|
1378
|
+
for (let k = 0; k < axisDim; k++) {
|
|
1379
|
+
sum += Math.abs(Number(x.data[baseOffset + k * axisStride]));
|
|
1380
|
+
}
|
|
1381
|
+
out[outFlat] = sum;
|
|
1382
|
+
} else if (order === 2) {
|
|
1383
|
+
let sum = 0;
|
|
1384
|
+
for (let k = 0; k < axisDim; k++) {
|
|
1385
|
+
const v = Number(x.data[baseOffset + k * axisStride]);
|
|
1386
|
+
sum += v * v;
|
|
1387
|
+
}
|
|
1388
|
+
out[outFlat] = Math.sqrt(sum);
|
|
1389
|
+
} else if (order === Number.POSITIVE_INFINITY) {
|
|
1390
|
+
let max = 0;
|
|
1391
|
+
for (let k = 0; k < axisDim; k++) {
|
|
1392
|
+
max = Math.max(max, Math.abs(Number(x.data[baseOffset + k * axisStride])));
|
|
1393
|
+
}
|
|
1394
|
+
out[outFlat] = max;
|
|
1395
|
+
} else if (order === Number.NEGATIVE_INFINITY) {
|
|
1396
|
+
let min = Infinity;
|
|
1397
|
+
for (let k = 0; k < axisDim; k++) {
|
|
1398
|
+
min = Math.min(min, Math.abs(Number(x.data[baseOffset + k * axisStride])));
|
|
1399
|
+
}
|
|
1400
|
+
out[outFlat] = min === Infinity ? 0 : min;
|
|
1401
|
+
} else {
|
|
1402
|
+
let sum = 0;
|
|
1403
|
+
for (let k = 0; k < axisDim; k++) {
|
|
1404
|
+
sum += Math.abs(Number(x.data[baseOffset + k * axisStride])) ** order;
|
|
1405
|
+
}
|
|
1406
|
+
out[outFlat] = sum ** (1 / order);
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
if (outShape.length === 0 && !keep) return at(out, 0);
|
|
1410
|
+
return chunk6AE5FKKQ_cjs.tensor(out).view(outShape);
|
|
1411
|
+
};
|
|
1412
|
+
const collectValues = () => {
|
|
1413
|
+
const values = new Array(x.size);
|
|
1414
|
+
if (x.size === 0) return values;
|
|
1415
|
+
if (x.ndim === 0) {
|
|
1416
|
+
values[0] = Number(x.data[x.offset]);
|
|
1417
|
+
return values;
|
|
1418
|
+
}
|
|
1419
|
+
const data = x.data;
|
|
1420
|
+
if (!Array.isArray(data) && !(data instanceof BigInt64Array) && x.offset === 0 && chunk6AE5FKKQ_cjs.isContiguous(x.shape, x.strides)) {
|
|
1421
|
+
for (let i = 0; i < x.size; i++) {
|
|
1422
|
+
values[i] = data[i];
|
|
1423
|
+
}
|
|
1424
|
+
return values;
|
|
1425
|
+
}
|
|
1426
|
+
const idx = new Array(x.ndim).fill(0);
|
|
1427
|
+
let offset = x.offset;
|
|
1428
|
+
for (let count = 0; count < x.size; count++) {
|
|
1429
|
+
values[count] = Number(data[offset]);
|
|
1430
|
+
for (let d = x.ndim - 1; d >= 0; d--) {
|
|
1431
|
+
const dim = getDim(x, d, "norm()");
|
|
1432
|
+
const stride = getStride(x, d, "norm()");
|
|
1433
|
+
const idxVal = idx[d] ?? 0;
|
|
1434
|
+
const nextIdx = idxVal + 1;
|
|
1435
|
+
idx[d] = nextIdx;
|
|
1436
|
+
offset += stride;
|
|
1437
|
+
if (nextIdx < dim) break;
|
|
1438
|
+
offset -= nextIdx * stride;
|
|
1439
|
+
idx[d] = 0;
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
return values;
|
|
1443
|
+
};
|
|
1444
|
+
if (axis !== void 0) {
|
|
1445
|
+
if (p === "nuc") {
|
|
1446
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1447
|
+
"axis is only supported for vector norms, not nuclear norm",
|
|
1448
|
+
"axis",
|
|
1449
|
+
axis
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1452
|
+
if (axes === void 0) {
|
|
1453
|
+
throw new chunkJSCDE774_cjs.ShapeError("axis has invalid length for input");
|
|
1454
|
+
}
|
|
1455
|
+
if (axes.length === 0) {
|
|
1456
|
+
const ordValue = normalizeVectorOrder(p === "fro" ? 2 : p);
|
|
1457
|
+
const value = vectorNormValue(collectValues(), ordValue);
|
|
1458
|
+
if (!keepdims) return value;
|
|
1459
|
+
const kdShape = new Array(x.ndim).fill(1);
|
|
1460
|
+
return chunk6AE5FKKQ_cjs.tensor([value]).view(kdShape);
|
|
1461
|
+
}
|
|
1462
|
+
if (axes.length === 1) {
|
|
1463
|
+
const ax = axes[0];
|
|
1464
|
+
if (ax === void 0) throw new chunkJSCDE774_cjs.ShapeError("axis has invalid length for input");
|
|
1465
|
+
const ordValue = normalizeVectorOrder(p === "fro" ? 2 : p);
|
|
1466
|
+
return vectorNormAxis(ax, ordValue, keepdims);
|
|
1467
|
+
}
|
|
1468
|
+
if (axes.length === 2) {
|
|
1469
|
+
if (x.ndim < 2) throw new chunkJSCDE774_cjs.ShapeError("axis has invalid length for input");
|
|
1470
|
+
const ax0 = axes[0];
|
|
1471
|
+
const ax1 = axes[1];
|
|
1472
|
+
if (ax0 === void 0 || ax1 === void 0)
|
|
1473
|
+
throw new chunkJSCDE774_cjs.ShapeError("axis has invalid length for input");
|
|
1474
|
+
const dimRow = getDim(x, ax0, "norm()");
|
|
1475
|
+
const dimCol = getDim(x, ax1, "norm()");
|
|
1476
|
+
const strideRow = getStride(x, ax0, "norm()");
|
|
1477
|
+
const strideCol = getStride(x, ax1, "norm()");
|
|
1478
|
+
const outerShape = [];
|
|
1479
|
+
const outerStrides = [];
|
|
1480
|
+
for (let i = 0; i < x.ndim; i++) {
|
|
1481
|
+
if (i !== ax0 && i !== ax1) {
|
|
1482
|
+
outerShape.push(getDim(x, i, "norm()"));
|
|
1483
|
+
outerStrides.push(getStride(x, i, "norm()"));
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
const outerSize = outerShape.length === 0 ? 1 : outerShape.reduce((a, b) => a * b, 1);
|
|
1487
|
+
const matOrd = p === "fro" ? "fro" : p;
|
|
1488
|
+
if (matOrd !== "fro" && matOrd !== 1 && matOrd !== -1 && matOrd !== 2 && matOrd !== -2 && matOrd !== Number.POSITIVE_INFINITY && matOrd !== Number.NEGATIVE_INFINITY) {
|
|
1489
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1490
|
+
`Invalid norm order '${String(matOrd)}' for matrix norm. Valid orders are: 1, -1, 2, -2, Infinity, -Infinity, 'fro'.`,
|
|
1491
|
+
"ord",
|
|
1492
|
+
matOrd
|
|
1493
|
+
);
|
|
1494
|
+
}
|
|
1495
|
+
const results = new Float64Array(outerSize);
|
|
1496
|
+
for (let outer = 0; outer < outerSize; outer++) {
|
|
1497
|
+
let baseOffset = x.offset;
|
|
1498
|
+
let rem = outer;
|
|
1499
|
+
for (let d = outerShape.length - 1; d >= 0; d--) {
|
|
1500
|
+
const dim = outerShape[d] ?? 0;
|
|
1501
|
+
const idx = rem % dim;
|
|
1502
|
+
rem = Math.floor(rem / dim);
|
|
1503
|
+
baseOffset += idx * (outerStrides[d] ?? 0);
|
|
1504
|
+
}
|
|
1505
|
+
let val = 0;
|
|
1506
|
+
if (matOrd === "fro") {
|
|
1507
|
+
let sum = 0;
|
|
1508
|
+
for (let i = 0; i < dimRow; i++) {
|
|
1509
|
+
for (let j = 0; j < dimCol; j++) {
|
|
1510
|
+
const v = Number(x.data[baseOffset + i * strideRow + j * strideCol]);
|
|
1511
|
+
sum += v * v;
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
val = Math.sqrt(sum);
|
|
1515
|
+
} else if (matOrd === 1) {
|
|
1516
|
+
let maxSum = 0;
|
|
1517
|
+
for (let j = 0; j < dimCol; j++) {
|
|
1518
|
+
let colSum = 0;
|
|
1519
|
+
for (let i = 0; i < dimRow; i++) {
|
|
1520
|
+
colSum += Math.abs(Number(x.data[baseOffset + i * strideRow + j * strideCol]));
|
|
1521
|
+
}
|
|
1522
|
+
maxSum = Math.max(maxSum, colSum);
|
|
1523
|
+
}
|
|
1524
|
+
val = maxSum;
|
|
1525
|
+
} else if (matOrd === -1) {
|
|
1526
|
+
let minSum = Infinity;
|
|
1527
|
+
for (let j = 0; j < dimCol; j++) {
|
|
1528
|
+
let colSum = 0;
|
|
1529
|
+
for (let i = 0; i < dimRow; i++) {
|
|
1530
|
+
colSum += Math.abs(Number(x.data[baseOffset + i * strideRow + j * strideCol]));
|
|
1531
|
+
}
|
|
1532
|
+
minSum = Math.min(minSum, colSum);
|
|
1533
|
+
}
|
|
1534
|
+
val = minSum === Infinity ? 0 : minSum;
|
|
1535
|
+
} else if (matOrd === Number.POSITIVE_INFINITY) {
|
|
1536
|
+
let maxSum = 0;
|
|
1537
|
+
for (let i = 0; i < dimRow; i++) {
|
|
1538
|
+
let rowSum = 0;
|
|
1539
|
+
for (let j = 0; j < dimCol; j++) {
|
|
1540
|
+
rowSum += Math.abs(Number(x.data[baseOffset + i * strideRow + j * strideCol]));
|
|
1541
|
+
}
|
|
1542
|
+
maxSum = Math.max(maxSum, rowSum);
|
|
1543
|
+
}
|
|
1544
|
+
val = maxSum;
|
|
1545
|
+
} else if (matOrd === Number.NEGATIVE_INFINITY) {
|
|
1546
|
+
let minSum = Infinity;
|
|
1547
|
+
for (let i = 0; i < dimRow; i++) {
|
|
1548
|
+
let rowSum = 0;
|
|
1549
|
+
for (let j = 0; j < dimCol; j++) {
|
|
1550
|
+
rowSum += Math.abs(Number(x.data[baseOffset + i * strideRow + j * strideCol]));
|
|
1551
|
+
}
|
|
1552
|
+
minSum = Math.min(minSum, rowSum);
|
|
1553
|
+
}
|
|
1554
|
+
val = minSum === Infinity ? 0 : minSum;
|
|
1555
|
+
} else if (matOrd === 2 || matOrd === -2) {
|
|
1556
|
+
const sliceData = new Float64Array(dimRow * dimCol);
|
|
1557
|
+
for (let i = 0; i < dimRow; i++) {
|
|
1558
|
+
for (let j = 0; j < dimCol; j++) {
|
|
1559
|
+
sliceData[i * dimCol + j] = Number(
|
|
1560
|
+
x.data[baseOffset + i * strideRow + j * strideCol]
|
|
1561
|
+
);
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
const sliceTensor = chunk6AE5FKKQ_cjs.tensor(sliceData).view([dimRow, dimCol]);
|
|
1565
|
+
const [_U, s, _Vt] = svd(sliceTensor);
|
|
1566
|
+
const sDense = toDenseVector1D(s);
|
|
1567
|
+
if (sDense.length === 0) {
|
|
1568
|
+
val = 0;
|
|
1569
|
+
} else {
|
|
1570
|
+
val = matOrd === 2 ? at(sDense, 0) : Math.abs(at(sDense, sDense.length - 1));
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
results[outer] = val;
|
|
1574
|
+
}
|
|
1575
|
+
if (keepdims) {
|
|
1576
|
+
const kdShape = [];
|
|
1577
|
+
for (let i = 0; i < x.ndim; i++) {
|
|
1578
|
+
kdShape.push(i === ax0 || i === ax1 ? 1 : getDim(x, i, "norm()"));
|
|
1579
|
+
}
|
|
1580
|
+
return chunk6AE5FKKQ_cjs.tensor(results).view(kdShape);
|
|
1581
|
+
}
|
|
1582
|
+
if (outerSize === 1 && outerShape.length === 0) return at(results, 0);
|
|
1583
|
+
return chunk6AE5FKKQ_cjs.tensor(results).view(outerShape);
|
|
1584
|
+
}
|
|
1585
|
+
throw new chunkJSCDE774_cjs.ShapeError("axis has invalid length for input");
|
|
1586
|
+
}
|
|
1587
|
+
if (x.ndim === 0) {
|
|
1588
|
+
if (p === "nuc") {
|
|
1589
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("Invalid norm order 'nuc' for scalar norm.", "ord", p);
|
|
1590
|
+
}
|
|
1591
|
+
const ordInput = p === "fro" ? 2 : p;
|
|
1592
|
+
if (typeof ordInput !== "number") {
|
|
1593
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1594
|
+
`Invalid norm order '${String(ordInput)}' for scalar norm.`,
|
|
1595
|
+
"ord",
|
|
1596
|
+
ordInput
|
|
1597
|
+
);
|
|
1598
|
+
}
|
|
1599
|
+
const ordValue = normalizeVectorOrder(ordInput);
|
|
1600
|
+
return vectorNormValue(collectValues(), ordValue);
|
|
1601
|
+
}
|
|
1602
|
+
if (x.ndim === 1) {
|
|
1603
|
+
if (p === "nuc") {
|
|
1604
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("Invalid norm order 'nuc' for vector norm.", "ord", p);
|
|
1605
|
+
}
|
|
1606
|
+
const ordInput = p === "fro" ? 2 : p;
|
|
1607
|
+
if (typeof ordInput !== "number") {
|
|
1608
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1609
|
+
`Invalid norm order '${String(ordInput)}' for vector norm.`,
|
|
1610
|
+
"ord",
|
|
1611
|
+
ordInput
|
|
1612
|
+
);
|
|
1613
|
+
}
|
|
1614
|
+
const ordValue = normalizeVectorOrder(ordInput);
|
|
1615
|
+
return vectorNormValue(collectValues(), ordValue);
|
|
1616
|
+
}
|
|
1617
|
+
if (x.ndim !== 2) {
|
|
1618
|
+
throw new chunkJSCDE774_cjs.ShapeError("norm requires 1D or 2D input when axis is omitted");
|
|
1619
|
+
}
|
|
1620
|
+
const s0 = getStride(x, 0, "norm()");
|
|
1621
|
+
const s1 = getStride(x, 1, "norm()");
|
|
1622
|
+
const rows = getDim(x, 0, "norm()");
|
|
1623
|
+
const cols = getDim(x, 1, "norm()");
|
|
1624
|
+
if (p === "fro") {
|
|
1625
|
+
let sum = 0;
|
|
1626
|
+
for (let i = 0; i < rows; i++) {
|
|
1627
|
+
for (let j = 0; j < cols; j++) {
|
|
1628
|
+
const val = Number(x.data[x.offset + i * s0 + j * s1]);
|
|
1629
|
+
sum += val * val;
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
return Math.sqrt(sum);
|
|
1633
|
+
}
|
|
1634
|
+
if (p === "nuc") {
|
|
1635
|
+
const [_U, s, _Vt] = svd(x);
|
|
1636
|
+
const sDense = toDenseVector1D(s);
|
|
1637
|
+
let sum = 0;
|
|
1638
|
+
for (let i = 0; i < sDense.length; i++) sum += Math.abs(at(sDense, i));
|
|
1639
|
+
return sum;
|
|
1640
|
+
}
|
|
1641
|
+
if (p === 1) {
|
|
1642
|
+
let maxSum = 0;
|
|
1643
|
+
for (let j = 0; j < cols; j++) {
|
|
1644
|
+
let colSum = 0;
|
|
1645
|
+
for (let i = 0; i < rows; i++) {
|
|
1646
|
+
colSum += Math.abs(Number(x.data[x.offset + i * s0 + j * s1]));
|
|
1647
|
+
}
|
|
1648
|
+
maxSum = Math.max(maxSum, colSum);
|
|
1649
|
+
}
|
|
1650
|
+
return maxSum;
|
|
1651
|
+
}
|
|
1652
|
+
if (p === -1) {
|
|
1653
|
+
let minSum = Infinity;
|
|
1654
|
+
for (let j = 0; j < cols; j++) {
|
|
1655
|
+
let colSum = 0;
|
|
1656
|
+
for (let i = 0; i < rows; i++) {
|
|
1657
|
+
colSum += Math.abs(Number(x.data[x.offset + i * s0 + j * s1]));
|
|
1658
|
+
}
|
|
1659
|
+
minSum = Math.min(minSum, colSum);
|
|
1660
|
+
}
|
|
1661
|
+
return minSum === Infinity ? 0 : minSum;
|
|
1662
|
+
}
|
|
1663
|
+
if (p === Number.POSITIVE_INFINITY) {
|
|
1664
|
+
let maxSum = 0;
|
|
1665
|
+
for (let i = 0; i < rows; i++) {
|
|
1666
|
+
let rowSum = 0;
|
|
1667
|
+
for (let j = 0; j < cols; j++) {
|
|
1668
|
+
rowSum += Math.abs(Number(x.data[x.offset + i * s0 + j * s1]));
|
|
1669
|
+
}
|
|
1670
|
+
maxSum = Math.max(maxSum, rowSum);
|
|
1671
|
+
}
|
|
1672
|
+
return maxSum;
|
|
1673
|
+
}
|
|
1674
|
+
if (p === Number.NEGATIVE_INFINITY) {
|
|
1675
|
+
let minSum = Infinity;
|
|
1676
|
+
for (let i = 0; i < rows; i++) {
|
|
1677
|
+
let rowSum = 0;
|
|
1678
|
+
for (let j = 0; j < cols; j++) {
|
|
1679
|
+
rowSum += Math.abs(Number(x.data[x.offset + i * s0 + j * s1]));
|
|
1680
|
+
}
|
|
1681
|
+
minSum = Math.min(minSum, rowSum);
|
|
1682
|
+
}
|
|
1683
|
+
return minSum === Infinity ? 0 : minSum;
|
|
1684
|
+
}
|
|
1685
|
+
if (p === 2 || p === -2) {
|
|
1686
|
+
const [_U, s, _Vt] = svd(x);
|
|
1687
|
+
const sDense = toDenseVector1D(s);
|
|
1688
|
+
if (sDense.length === 0) return 0;
|
|
1689
|
+
const sMax = at(sDense, 0);
|
|
1690
|
+
const sMin = at(sDense, sDense.length - 1);
|
|
1691
|
+
return p === 2 ? sMax : Math.abs(sMin);
|
|
1692
|
+
}
|
|
1693
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1694
|
+
`Invalid norm order '${String(p)}' for matrix norm. Valid orders are: 1, -1, 2, -2, Infinity, -Infinity, 'fro', 'nuc'.`,
|
|
1695
|
+
"ord",
|
|
1696
|
+
p
|
|
1697
|
+
);
|
|
1698
|
+
}
|
|
1699
|
+
function cond(a, _p) {
|
|
1700
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("Input must be 2D matrix");
|
|
1701
|
+
assertFiniteTensor(a, "cond()");
|
|
1702
|
+
if (_p !== void 0) {
|
|
1703
|
+
if (_p === "fro") ; else if (typeof _p === "number") {
|
|
1704
|
+
if (!Number.isFinite(_p) || Number.isNaN(_p) || _p !== 2) {
|
|
1705
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1706
|
+
"Only 2-norm and Frobenius norm are supported for condition number",
|
|
1707
|
+
"p",
|
|
1708
|
+
_p
|
|
1709
|
+
);
|
|
1710
|
+
}
|
|
1711
|
+
} else {
|
|
1712
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError(
|
|
1713
|
+
"Only 2-norm and Frobenius norm are supported for condition number",
|
|
1714
|
+
"p",
|
|
1715
|
+
_p
|
|
1716
|
+
);
|
|
1717
|
+
}
|
|
1718
|
+
}
|
|
1719
|
+
const m = getDim(a, 0, "cond()");
|
|
1720
|
+
const n = getDim(a, 1, "cond()");
|
|
1721
|
+
const k = Math.min(m, n);
|
|
1722
|
+
if (k === 0) return Infinity;
|
|
1723
|
+
const [_U, s, _Vt] = svd(a);
|
|
1724
|
+
const sDense = toDenseVector1D(s);
|
|
1725
|
+
if (_p === "fro") {
|
|
1726
|
+
if (sDense.length === 0) return Infinity;
|
|
1727
|
+
let sumSq = 0;
|
|
1728
|
+
let sumInvSq = 0;
|
|
1729
|
+
for (let i = 0; i < sDense.length; i++) {
|
|
1730
|
+
const si = at(sDense, i);
|
|
1731
|
+
sumSq += si * si;
|
|
1732
|
+
if (si === 0) return Infinity;
|
|
1733
|
+
sumInvSq += 1 / (si * si);
|
|
1734
|
+
}
|
|
1735
|
+
return Math.sqrt(sumSq) * Math.sqrt(sumInvSq);
|
|
1736
|
+
}
|
|
1737
|
+
const sMax = at(sDense, 0);
|
|
1738
|
+
const sMin = at(sDense, k - 1);
|
|
1739
|
+
if (sMin === 0) return Infinity;
|
|
1740
|
+
return sMax / sMin;
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
// src/linalg/properties.ts
|
|
1744
|
+
function det(a) {
|
|
1745
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("det requires a 2-D matrix");
|
|
1746
|
+
const rows = getDim(a, 0, "det()");
|
|
1747
|
+
const cols = getDim(a, 1, "det()");
|
|
1748
|
+
if (rows !== cols) throw new chunkJSCDE774_cjs.ShapeError("det requires a square matrix");
|
|
1749
|
+
const n = rows;
|
|
1750
|
+
if (n === 0) return 1;
|
|
1751
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
1752
|
+
try {
|
|
1753
|
+
const { lu: lu2, pivSign } = luFactorSquare(A, n);
|
|
1754
|
+
let detVal = pivSign;
|
|
1755
|
+
for (let i = 0; i < n; i++) detVal *= at(lu2, i * n + i);
|
|
1756
|
+
return detVal;
|
|
1757
|
+
} catch (err) {
|
|
1758
|
+
if (err instanceof chunkJSCDE774_cjs.DataValidationError && err.message === "Matrix is singular") {
|
|
1759
|
+
return 0;
|
|
1760
|
+
}
|
|
1761
|
+
throw err;
|
|
1762
|
+
}
|
|
1763
|
+
}
|
|
1764
|
+
function slogdet(a) {
|
|
1765
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("slogdet requires a 2-D matrix");
|
|
1766
|
+
const rows = getDim(a, 0, "slogdet()");
|
|
1767
|
+
const cols = getDim(a, 1, "slogdet()");
|
|
1768
|
+
if (rows !== cols) throw new chunkJSCDE774_cjs.ShapeError("slogdet requires a square matrix");
|
|
1769
|
+
const n = rows;
|
|
1770
|
+
if (n === 0) return [chunk6AE5FKKQ_cjs.tensor([1]), chunk6AE5FKKQ_cjs.tensor([0])];
|
|
1771
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
1772
|
+
try {
|
|
1773
|
+
const { lu: lu2, pivSign } = luFactorSquare(A, n);
|
|
1774
|
+
let sign = pivSign;
|
|
1775
|
+
let logAbsDet = 0;
|
|
1776
|
+
for (let i = 0; i < n; i++) {
|
|
1777
|
+
const d = at(lu2, i * n + i);
|
|
1778
|
+
if (d === 0) {
|
|
1779
|
+
return [chunk6AE5FKKQ_cjs.tensor([0]), chunk6AE5FKKQ_cjs.tensor([-Infinity])];
|
|
1780
|
+
}
|
|
1781
|
+
sign *= Math.sign(d);
|
|
1782
|
+
logAbsDet += Math.log(Math.abs(d));
|
|
1783
|
+
}
|
|
1784
|
+
return [chunk6AE5FKKQ_cjs.tensor([sign]), chunk6AE5FKKQ_cjs.tensor([logAbsDet])];
|
|
1785
|
+
} catch (err) {
|
|
1786
|
+
if (err instanceof chunkJSCDE774_cjs.DataValidationError && err.message === "Matrix is singular") {
|
|
1787
|
+
return [chunk6AE5FKKQ_cjs.tensor([0]), chunk6AE5FKKQ_cjs.tensor([-Infinity])];
|
|
1788
|
+
}
|
|
1789
|
+
throw err;
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
function trace(a, offset = 0, axis1 = 0, axis2 = 1) {
|
|
1793
|
+
if (a.ndim < 2) {
|
|
1794
|
+
throw new chunkJSCDE774_cjs.ShapeError("Input must be at least 2D");
|
|
1795
|
+
}
|
|
1796
|
+
if (!Number.isInteger(offset)) {
|
|
1797
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("offset must be an integer", "offset", offset);
|
|
1798
|
+
}
|
|
1799
|
+
if (a.dtype === "string") {
|
|
1800
|
+
throw new chunkJSCDE774_cjs.DataValidationError("trace() does not support string dtype");
|
|
1801
|
+
}
|
|
1802
|
+
const ndim = a.ndim;
|
|
1803
|
+
const ax1 = chunkJSCDE774_cjs.normalizeAxis(axis1, ndim);
|
|
1804
|
+
const ax2 = chunkJSCDE774_cjs.normalizeAxis(axis2, ndim);
|
|
1805
|
+
if (ax1 === ax2) {
|
|
1806
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("axis1 and axis2 must be different", "axis", [axis1, axis2]);
|
|
1807
|
+
}
|
|
1808
|
+
const dim1 = getDim(a, ax1, "trace()");
|
|
1809
|
+
const dim2 = getDim(a, ax2, "trace()");
|
|
1810
|
+
const stride1 = getStride(a, ax1, "trace()");
|
|
1811
|
+
const stride2 = getStride(a, ax2, "trace()");
|
|
1812
|
+
const outerShape = [];
|
|
1813
|
+
const outerStrides = [];
|
|
1814
|
+
for (let i = 0; i < ndim; i++) {
|
|
1815
|
+
if (i !== ax1 && i !== ax2) {
|
|
1816
|
+
outerShape.push(getDim(a, i, "trace()"));
|
|
1817
|
+
outerStrides.push(getStride(a, i, "trace()"));
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
const outerSize = outerShape.length === 0 ? 1 : outerShape.reduce((acc, v) => acc * v, 1);
|
|
1821
|
+
const out = new Float64Array(outerSize);
|
|
1822
|
+
for (let outer = 0; outer < outerSize; outer++) {
|
|
1823
|
+
let baseOffset = a.offset;
|
|
1824
|
+
let rem = outer;
|
|
1825
|
+
for (let d = outerShape.length - 1; d >= 0; d--) {
|
|
1826
|
+
const dim = outerShape[d];
|
|
1827
|
+
if (dim === void 0) throw new chunkJSCDE774_cjs.ShapeError("trace(): outer shape is out of bounds");
|
|
1828
|
+
const idx = rem % dim;
|
|
1829
|
+
rem = Math.floor(rem / dim);
|
|
1830
|
+
const stride = outerStrides[d];
|
|
1831
|
+
if (stride === void 0) throw new chunkJSCDE774_cjs.ShapeError("trace(): outer stride is out of bounds");
|
|
1832
|
+
baseOffset += idx * stride;
|
|
1833
|
+
}
|
|
1834
|
+
let sum = 0;
|
|
1835
|
+
if (offset >= 0) {
|
|
1836
|
+
const n = Math.min(dim1, Math.max(0, dim2 - offset));
|
|
1837
|
+
for (let i = 0; i < n; i++) {
|
|
1838
|
+
sum += Number(a.data[baseOffset + i * stride1 + (i + offset) * stride2]);
|
|
1839
|
+
}
|
|
1840
|
+
} else {
|
|
1841
|
+
const absOffset = -offset;
|
|
1842
|
+
const n = Math.min(Math.max(0, dim1 - absOffset), dim2);
|
|
1843
|
+
for (let i = 0; i < n; i++) {
|
|
1844
|
+
sum += Number(a.data[baseOffset + (i + absOffset) * stride1 + i * stride2]);
|
|
1845
|
+
}
|
|
1846
|
+
}
|
|
1847
|
+
out[outer] = sum;
|
|
1848
|
+
}
|
|
1849
|
+
if (outerShape.length === 0) {
|
|
1850
|
+
return chunk6AE5FKKQ_cjs.tensor([at(out, 0)]);
|
|
1851
|
+
}
|
|
1852
|
+
return chunk6AE5FKKQ_cjs.tensor(out).view(outerShape);
|
|
1853
|
+
}
|
|
1854
|
+
function matrixRank(a, tol) {
|
|
1855
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("matrixRank requires a 2-D matrix");
|
|
1856
|
+
if (tol !== void 0 && (!Number.isFinite(tol) || tol < 0)) {
|
|
1857
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("tol must be a non-negative finite number", "tol", tol);
|
|
1858
|
+
}
|
|
1859
|
+
const rows = getDim(a, 0, "matrixRank()");
|
|
1860
|
+
const cols = getDim(a, 1, "matrixRank()");
|
|
1861
|
+
const k = Math.min(rows, cols);
|
|
1862
|
+
if (k === 0) return 0;
|
|
1863
|
+
const [_U, s, _Vt] = svd(a);
|
|
1864
|
+
const sDense = toDenseVector1D(s);
|
|
1865
|
+
const defaultTol = at(sDense, 0) * Number.EPSILON * Math.max(rows, cols);
|
|
1866
|
+
const threshold = tol ?? defaultTol;
|
|
1867
|
+
let rank = 0;
|
|
1868
|
+
for (let i = 0; i < k; i++) {
|
|
1869
|
+
if (at(sDense, i) > threshold) rank++;
|
|
1870
|
+
}
|
|
1871
|
+
return rank;
|
|
1872
|
+
}
|
|
1873
|
+
|
|
1874
|
+
// src/linalg/solvers/lstsq.ts
|
|
1875
|
+
function lstsq(a, b, rcond) {
|
|
1876
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("A must be a 2D matrix");
|
|
1877
|
+
if (b.ndim !== 1 && b.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("b must be a 1D or 2D tensor");
|
|
1878
|
+
if (rcond !== void 0 && (!Number.isFinite(rcond) || rcond < 0)) {
|
|
1879
|
+
throw new chunkJSCDE774_cjs.InvalidParameterError("rcond must be a non-negative finite number", "rcond", rcond);
|
|
1880
|
+
}
|
|
1881
|
+
const m = getDim(a, 0, "lstsq()");
|
|
1882
|
+
const n = getDim(a, 1, "lstsq()");
|
|
1883
|
+
const bRows = getDim(b, 0, "lstsq()");
|
|
1884
|
+
if (bRows !== m) throw new chunkJSCDE774_cjs.ShapeError("A and b dimensions do not match");
|
|
1885
|
+
const k = Math.min(m, n);
|
|
1886
|
+
if (k === 0) {
|
|
1887
|
+
const zeroX = b.ndim === 1 ? fromDenseVector1D(new Float64Array(n)) : fromDenseMatrix2D(
|
|
1888
|
+
n,
|
|
1889
|
+
getDim(b, 1, "lstsq()"),
|
|
1890
|
+
new Float64Array(n * getDim(b, 1, "lstsq()"))
|
|
1891
|
+
);
|
|
1892
|
+
const zeroResiduals = b.ndim === 1 ? chunk6AE5FKKQ_cjs.tensor([0]) : fromDenseVector1D(new Float64Array(getDim(b, 1, "lstsq()")));
|
|
1893
|
+
return {
|
|
1894
|
+
x: zeroX,
|
|
1895
|
+
residuals: zeroResiduals,
|
|
1896
|
+
rank: 0,
|
|
1897
|
+
s: fromDenseVector1D(new Float64Array(0))
|
|
1898
|
+
};
|
|
1899
|
+
}
|
|
1900
|
+
const rcondVal = rcond ?? Number.EPSILON * Math.max(m, n);
|
|
1901
|
+
const [U_t, s, Vt_t] = svd(a, false);
|
|
1902
|
+
const { data: U, cols: uCols, rows: uRows } = toDenseMatrix2D(U_t);
|
|
1903
|
+
const sDense = toDenseVector1D(s);
|
|
1904
|
+
const { data: Vt, cols: vtCols, rows: vtRows } = toDenseMatrix2D(Vt_t);
|
|
1905
|
+
if (uRows !== m || uCols !== k) {
|
|
1906
|
+
throw new chunkJSCDE774_cjs.DeepboxError("Internal error: unexpected U shape");
|
|
1907
|
+
}
|
|
1908
|
+
if (vtRows !== k || vtCols !== n) {
|
|
1909
|
+
throw new chunkJSCDE774_cjs.DeepboxError("Internal error: unexpected Vt shape");
|
|
1910
|
+
}
|
|
1911
|
+
const cutoff = at(sDense, 0) * rcondVal;
|
|
1912
|
+
let rank = 0;
|
|
1913
|
+
const sInv = new Float64Array(k);
|
|
1914
|
+
for (let i = 0; i < k; i++) {
|
|
1915
|
+
const si = at(sDense, i);
|
|
1916
|
+
if (si > cutoff) {
|
|
1917
|
+
rank++;
|
|
1918
|
+
sInv[i] = 1 / si;
|
|
1919
|
+
} else {
|
|
1920
|
+
sInv[i] = 0;
|
|
1921
|
+
}
|
|
1922
|
+
}
|
|
1923
|
+
const P = new Float64Array(n * m);
|
|
1924
|
+
for (let i = 0; i < n; i++) {
|
|
1925
|
+
for (let j = 0; j < m; j++) {
|
|
1926
|
+
let sum = 0;
|
|
1927
|
+
for (let r = 0; r < k; r++) {
|
|
1928
|
+
const v_ir = at(Vt, r * n + i);
|
|
1929
|
+
const u_jr = at(U, j * k + r);
|
|
1930
|
+
sum += v_ir * at(sInv, r) * u_jr;
|
|
1931
|
+
}
|
|
1932
|
+
P[i * m + j] = sum;
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1935
|
+
if (b.ndim === 1) {
|
|
1936
|
+
const bv = toDenseVector1D(b);
|
|
1937
|
+
const x = new Float64Array(n);
|
|
1938
|
+
for (let i = 0; i < n; i++) {
|
|
1939
|
+
let sum = 0;
|
|
1940
|
+
for (let j = 0; j < m; j++) {
|
|
1941
|
+
sum += at(P, i * m + j) * at(bv, j);
|
|
1942
|
+
}
|
|
1943
|
+
x[i] = sum;
|
|
1944
|
+
}
|
|
1945
|
+
const { data: A2 } = toDenseMatrix2D(a);
|
|
1946
|
+
let residual = 0;
|
|
1947
|
+
for (let i = 0; i < m; i++) {
|
|
1948
|
+
let pred = 0;
|
|
1949
|
+
for (let j = 0; j < n; j++) {
|
|
1950
|
+
pred += at(A2, i * n + j) * at(x, j);
|
|
1951
|
+
}
|
|
1952
|
+
const err = at(bv, i) - pred;
|
|
1953
|
+
residual += err * err;
|
|
1954
|
+
}
|
|
1955
|
+
return {
|
|
1956
|
+
x: fromDenseVector1D(x),
|
|
1957
|
+
residuals: chunk6AE5FKKQ_cjs.tensor([residual]),
|
|
1958
|
+
rank,
|
|
1959
|
+
s
|
|
1960
|
+
};
|
|
1961
|
+
}
|
|
1962
|
+
const nrhs = getDim(b, 1, "lstsq()");
|
|
1963
|
+
const { data: B, rows: bM, cols: bK } = toDenseMatrix2D(b);
|
|
1964
|
+
if (bM !== m || bK !== nrhs) throw new chunkJSCDE774_cjs.DeepboxError("Internal error: unexpected b shape");
|
|
1965
|
+
const X = new Float64Array(n * nrhs);
|
|
1966
|
+
for (let i = 0; i < n; i++) {
|
|
1967
|
+
for (let k2 = 0; k2 < nrhs; k2++) {
|
|
1968
|
+
let sum = 0;
|
|
1969
|
+
for (let j = 0; j < m; j++) {
|
|
1970
|
+
sum += at(P, i * m + j) * at(B, j * nrhs + k2);
|
|
1971
|
+
}
|
|
1972
|
+
X[i * nrhs + k2] = sum;
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
1976
|
+
const residuals = new Float64Array(nrhs);
|
|
1977
|
+
for (let k2 = 0; k2 < nrhs; k2++) {
|
|
1978
|
+
let rsum = 0;
|
|
1979
|
+
for (let i = 0; i < m; i++) {
|
|
1980
|
+
let pred = 0;
|
|
1981
|
+
for (let j = 0; j < n; j++) {
|
|
1982
|
+
pred += at(A, i * n + j) * at(X, j * nrhs + k2);
|
|
1983
|
+
}
|
|
1984
|
+
const err = at(B, i * nrhs + k2) - pred;
|
|
1985
|
+
rsum += err * err;
|
|
1986
|
+
}
|
|
1987
|
+
residuals[k2] = rsum;
|
|
1988
|
+
}
|
|
1989
|
+
return {
|
|
1990
|
+
x: fromDenseMatrix2D(n, nrhs, X),
|
|
1991
|
+
residuals: fromDenseVector1D(residuals),
|
|
1992
|
+
rank,
|
|
1993
|
+
s
|
|
1994
|
+
};
|
|
1995
|
+
}
|
|
1996
|
+
|
|
1997
|
+
// src/linalg/solvers/solve.ts
|
|
1998
|
+
function solve(a, b) {
|
|
1999
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("A must be a 2D matrix");
|
|
2000
|
+
const n = getDim(a, 0, "solve()");
|
|
2001
|
+
const n2 = getDim(a, 1, "solve()");
|
|
2002
|
+
if (n !== n2) throw new chunkJSCDE774_cjs.ShapeError("A must be square");
|
|
2003
|
+
if (b.ndim !== 1 && b.ndim !== 2) {
|
|
2004
|
+
throw new chunkJSCDE774_cjs.ShapeError("b must be a 1D or 2D tensor");
|
|
2005
|
+
}
|
|
2006
|
+
const bRows = getDim(b, 0, "solve()");
|
|
2007
|
+
if (bRows !== n) {
|
|
2008
|
+
throw new chunkJSCDE774_cjs.ShapeError("A and b dimensions do not match");
|
|
2009
|
+
}
|
|
2010
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
2011
|
+
const { lu: lu2, piv } = luFactorSquare(A, n);
|
|
2012
|
+
if (b.ndim === 1) {
|
|
2013
|
+
const rhs = toDenseVector1D(b);
|
|
2014
|
+
const rhsMat = new Float64Array(n * 1);
|
|
2015
|
+
for (let i = 0; i < n; i++) rhsMat[i] = at(rhs, i);
|
|
2016
|
+
luSolveInPlace(lu2, piv, n, rhsMat, 1);
|
|
2017
|
+
return fromDenseVector1D(rhsMat);
|
|
2018
|
+
}
|
|
2019
|
+
const nrhs = getDim(b, 1, "solve()");
|
|
2020
|
+
const { data: B } = toDenseMatrix2D(b);
|
|
2021
|
+
luSolveInPlace(lu2, piv, n, B, nrhs);
|
|
2022
|
+
return fromDenseMatrix2D(n, nrhs, B);
|
|
2023
|
+
}
|
|
2024
|
+
function solveTriangular(a, b, lower = true) {
|
|
2025
|
+
if (a.ndim !== 2) throw new chunkJSCDE774_cjs.ShapeError("A must be a 2D matrix");
|
|
2026
|
+
const n = getDim(a, 0, "solveTriangular()");
|
|
2027
|
+
const n2 = getDim(a, 1, "solveTriangular()");
|
|
2028
|
+
if (n !== n2) throw new chunkJSCDE774_cjs.ShapeError("A must be square");
|
|
2029
|
+
if (b.ndim !== 1 && b.ndim !== 2) {
|
|
2030
|
+
throw new chunkJSCDE774_cjs.ShapeError("b must be a 1D or 2D tensor");
|
|
2031
|
+
}
|
|
2032
|
+
const bN = getDim(b, 0, "solveTriangular()");
|
|
2033
|
+
if (bN !== n) throw new chunkJSCDE774_cjs.ShapeError("A and b dimensions do not match");
|
|
2034
|
+
const { data: A } = toDenseMatrix2D(a);
|
|
2035
|
+
if (b.ndim === 1) {
|
|
2036
|
+
const rhs = toDenseVector1D(b);
|
|
2037
|
+
const x = new Float64Array(n);
|
|
2038
|
+
if (lower) {
|
|
2039
|
+
for (let i = 0; i < n; i++) {
|
|
2040
|
+
let sum = at(rhs, i);
|
|
2041
|
+
for (let j = 0; j < i; j++) {
|
|
2042
|
+
sum -= at(A, i * n + j) * at(x, j);
|
|
2043
|
+
}
|
|
2044
|
+
const diag = at(A, i * n + i);
|
|
2045
|
+
if (diag === 0) throw new chunkJSCDE774_cjs.DataValidationError("Matrix is singular");
|
|
2046
|
+
x[i] = sum / diag;
|
|
2047
|
+
}
|
|
2048
|
+
} else {
|
|
2049
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
2050
|
+
let sum = at(rhs, i);
|
|
2051
|
+
for (let j = i + 1; j < n; j++) {
|
|
2052
|
+
sum -= at(A, i * n + j) * at(x, j);
|
|
2053
|
+
}
|
|
2054
|
+
const diag = at(A, i * n + i);
|
|
2055
|
+
if (diag === 0) throw new chunkJSCDE774_cjs.DataValidationError("Matrix is singular");
|
|
2056
|
+
x[i] = sum / diag;
|
|
2057
|
+
}
|
|
2058
|
+
}
|
|
2059
|
+
return fromDenseVector1D(x);
|
|
2060
|
+
}
|
|
2061
|
+
const nrhs = getDim(b, 1, "solveTriangular()");
|
|
2062
|
+
const { data: B } = toDenseMatrix2D(b);
|
|
2063
|
+
const X = new Float64Array(n * nrhs);
|
|
2064
|
+
if (lower) {
|
|
2065
|
+
for (let k = 0; k < nrhs; k++) {
|
|
2066
|
+
for (let i = 0; i < n; i++) {
|
|
2067
|
+
let sum = at(B, i * nrhs + k);
|
|
2068
|
+
for (let j = 0; j < i; j++) {
|
|
2069
|
+
sum -= at(A, i * n + j) * at(X, j * nrhs + k);
|
|
2070
|
+
}
|
|
2071
|
+
const diag = at(A, i * n + i);
|
|
2072
|
+
if (diag === 0) throw new chunkJSCDE774_cjs.DataValidationError("Matrix is singular");
|
|
2073
|
+
X[i * nrhs + k] = sum / diag;
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
} else {
|
|
2077
|
+
for (let k = 0; k < nrhs; k++) {
|
|
2078
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
2079
|
+
let sum = at(B, i * nrhs + k);
|
|
2080
|
+
for (let j = i + 1; j < n; j++) {
|
|
2081
|
+
sum -= at(A, i * n + j) * at(X, j * nrhs + k);
|
|
2082
|
+
}
|
|
2083
|
+
const diag = at(A, i * n + i);
|
|
2084
|
+
if (diag === 0) throw new chunkJSCDE774_cjs.DataValidationError("Matrix is singular");
|
|
2085
|
+
X[i * nrhs + k] = sum / diag;
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
return fromDenseMatrix2D(n, nrhs, X);
|
|
2090
|
+
}
|
|
2091
|
+
|
|
2092
|
+
exports.cholesky = cholesky;
|
|
2093
|
+
exports.cond = cond;
|
|
2094
|
+
exports.det = det;
|
|
2095
|
+
exports.eig = eig;
|
|
2096
|
+
exports.eigh = eigh;
|
|
2097
|
+
exports.eigvals = eigvals;
|
|
2098
|
+
exports.eigvalsh = eigvalsh;
|
|
2099
|
+
exports.inv = inv;
|
|
2100
|
+
exports.linalg_exports = linalg_exports;
|
|
2101
|
+
exports.lstsq = lstsq;
|
|
2102
|
+
exports.lu = lu;
|
|
2103
|
+
exports.matrixRank = matrixRank;
|
|
2104
|
+
exports.norm = norm;
|
|
2105
|
+
exports.pinv = pinv;
|
|
2106
|
+
exports.qr = qr;
|
|
2107
|
+
exports.slogdet = slogdet;
|
|
2108
|
+
exports.solve = solve;
|
|
2109
|
+
exports.solveTriangular = solveTriangular;
|
|
2110
|
+
exports.svd = svd;
|
|
2111
|
+
exports.trace = trace;
|
|
2112
|
+
//# sourceMappingURL=chunk-E3EU5FZO.cjs.map
|
|
2113
|
+
//# sourceMappingURL=chunk-E3EU5FZO.cjs.map
|