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