@danielsimonjr/mathts-matrix 0.1.8 → 0.1.11

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/README.md CHANGED
@@ -52,7 +52,7 @@ This package is under active development. Currently implemented:
52
52
  - [x] Dense matrix structure
53
53
  - [x] Sparse matrix (CSR) structure
54
54
  - [x] Matrix operations (add, multiply, transpose, etc.)
55
- - [x] WASM backend (Rust primary, AssemblyScript legacy)
55
+ - [x] WASM backend (AssemblyScript)
56
56
  - [x] GPU backend (WebGPU)
57
57
  - [x] SVD decomposition
58
58
  - [x] Eigenvalue solvers
@@ -0,0 +1,607 @@
1
+ // src/operations/common.ts
2
+ function eye(n) {
3
+ return Array.from(
4
+ { length: n },
5
+ (_, i) => Array.from({ length: n }, (_2, j) => i === j ? 1 : 0)
6
+ );
7
+ }
8
+ function cloneMatrix(A) {
9
+ return A.map((row) => [...row]);
10
+ }
11
+ function transpose(A) {
12
+ const m = A.length;
13
+ const n = A[0].length;
14
+ return Array.from({ length: n }, (_, j) => Array.from({ length: m }, (_2, i) => A[i][j]));
15
+ }
16
+ function isSymmetric(matrix, tolerance = 1e-10) {
17
+ const n = matrix.length;
18
+ if (n === 0) return true;
19
+ if (matrix[0].length !== n) return false;
20
+ for (let i = 0; i < n; i++) {
21
+ for (let j = i + 1; j < n; j++) {
22
+ if (Math.abs(matrix[i][j] - matrix[j][i]) > tolerance) {
23
+ return false;
24
+ }
25
+ }
26
+ }
27
+ return true;
28
+ }
29
+ function matMul(A, B) {
30
+ const m = A.length;
31
+ const p = A[0].length;
32
+ const n = B[0].length;
33
+ const C = Array.from({ length: m }, () => new Array(n).fill(0));
34
+ for (let i = 0; i < m; i++) {
35
+ for (let k = 0; k < p; k++) {
36
+ const aik = A[i][k];
37
+ if (aik === 0) continue;
38
+ for (let j = 0; j < n; j++) C[i][j] += aik * B[k][j];
39
+ }
40
+ }
41
+ return C;
42
+ }
43
+ function matAdd(A, B) {
44
+ const n = A.length;
45
+ return Array.from(
46
+ { length: n },
47
+ (_, i) => Array.from({ length: n }, (_2, j) => A[i][j] + B[i][j])
48
+ );
49
+ }
50
+ function matSub(A, B) {
51
+ const n = A.length;
52
+ return Array.from(
53
+ { length: n },
54
+ (_, i) => Array.from({ length: n }, (_2, j) => A[i][j] - B[i][j])
55
+ );
56
+ }
57
+ function matScale(A, c) {
58
+ return A.map((row) => row.map((v) => v * c));
59
+ }
60
+ function normInf(A) {
61
+ let mx = 0;
62
+ for (const row of A) for (const v of row) if (Math.abs(v) > mx) mx = Math.abs(v);
63
+ return mx;
64
+ }
65
+ function norm1(A) {
66
+ const m = A.length;
67
+ const n = A[0].length;
68
+ let maxColSum = 0;
69
+ for (let j = 0; j < n; j++) {
70
+ let colSum = 0;
71
+ for (let i = 0; i < m; i++) colSum += Math.abs(A[i][j]);
72
+ if (colSum > maxColSum) maxColSum = colSum;
73
+ }
74
+ return maxColSum;
75
+ }
76
+ function householder(x, degenerateBeta = -2) {
77
+ const n = x.length;
78
+ let sigma = 0;
79
+ for (let i = 1; i < n; i++) {
80
+ sigma += x[i] * x[i];
81
+ }
82
+ const v = [...x];
83
+ v[0] = 1;
84
+ if (sigma === 0 && x[0] >= 0) {
85
+ return { v, beta: 0 };
86
+ } else if (sigma === 0 && x[0] < 0) {
87
+ return { v, beta: degenerateBeta };
88
+ } else {
89
+ const mu = Math.sqrt(x[0] * x[0] + sigma);
90
+ if (x[0] <= 0) {
91
+ v[0] = x[0] - mu;
92
+ } else {
93
+ v[0] = -sigma / (x[0] + mu);
94
+ }
95
+ const beta = 2 * v[0] * v[0] / (sigma + v[0] * v[0]);
96
+ const v0 = v[0];
97
+ for (let i = 0; i < n; i++) {
98
+ v[i] /= v0;
99
+ }
100
+ return { v, beta };
101
+ }
102
+ }
103
+ function applyHouseholderLeft(A, v, beta, startRow, startCol) {
104
+ const n = A[0].length;
105
+ const len = v.length;
106
+ for (let j = startCol; j < n; j++) {
107
+ let dot = 0;
108
+ for (let i = 0; i < len; i++) {
109
+ dot += v[i] * A[startRow + i][j];
110
+ }
111
+ dot *= beta;
112
+ for (let i = 0; i < len; i++) {
113
+ A[startRow + i][j] -= dot * v[i];
114
+ }
115
+ }
116
+ }
117
+ function applyHouseholderRight(A, v, beta, startRow, startCol) {
118
+ const m = A.length;
119
+ const len = v.length;
120
+ for (let i = startRow; i < m; i++) {
121
+ let dot = 0;
122
+ for (let j = 0; j < len; j++) {
123
+ dot += A[i][startCol + j] * v[j];
124
+ }
125
+ dot *= beta;
126
+ for (let j = 0; j < len; j++) {
127
+ A[i][startCol + j] -= dot * v[j];
128
+ }
129
+ }
130
+ }
131
+
132
+ // src/operations/eig.ts
133
+ var EIG_GEN_EPS = 2220446049250313e-31;
134
+ function cdiv(xr, xi, yr, yi) {
135
+ let rr;
136
+ let d;
137
+ if (Math.abs(yr) > Math.abs(yi)) {
138
+ rr = yi / yr;
139
+ d = yr + rr * yi;
140
+ return { r: (xr + rr * xi) / d, i: (xi - rr * xr) / d };
141
+ } else {
142
+ rr = yr / yi;
143
+ d = yi + rr * yr;
144
+ return { r: (rr * xr + xi) / d, i: (rr * xi - xr) / d };
145
+ }
146
+ }
147
+ function orthesGeneral(H, V, ort, nn) {
148
+ const low = 0;
149
+ const high = nn - 1;
150
+ for (let m = low + 1; m <= high - 1; m++) {
151
+ let scale = 0;
152
+ for (let i = m; i <= high; i++) {
153
+ scale += Math.abs(H[i * nn + (m - 1)]);
154
+ }
155
+ if (scale !== 0) {
156
+ let h = 0;
157
+ for (let i = high; i >= m; i--) {
158
+ ort[i] = H[i * nn + (m - 1)] / scale;
159
+ h += ort[i] * ort[i];
160
+ }
161
+ let g = Math.sqrt(h);
162
+ if (ort[m] > 0) g = -g;
163
+ h = h - ort[m] * g;
164
+ ort[m] = ort[m] - g;
165
+ for (let j = m; j < nn; j++) {
166
+ let f = 0;
167
+ for (let i = high; i >= m; i--) f += ort[i] * H[i * nn + j];
168
+ f = f / h;
169
+ for (let i = m; i <= high; i++) H[i * nn + j] -= f * ort[i];
170
+ }
171
+ for (let i = 0; i <= high; i++) {
172
+ let f = 0;
173
+ for (let j = high; j >= m; j--) f += ort[j] * H[i * nn + j];
174
+ f = f / h;
175
+ for (let j = m; j <= high; j++) H[i * nn + j] -= f * ort[j];
176
+ }
177
+ ort[m] = scale * ort[m];
178
+ H[m * nn + (m - 1)] = scale * g;
179
+ }
180
+ }
181
+ for (let m = high - 1; m >= low + 1; m--) {
182
+ if (H[m * nn + (m - 1)] !== 0) {
183
+ for (let i = m + 1; i <= high; i++) ort[i] = H[i * nn + (m - 1)];
184
+ for (let j = m; j <= high; j++) {
185
+ let g = 0;
186
+ for (let i = m; i <= high; i++) g += ort[i] * V[i * nn + j];
187
+ g = g / ort[m] / H[m * nn + (m - 1)];
188
+ for (let i = m; i <= high; i++) V[i * nn + j] += g * ort[i];
189
+ }
190
+ }
191
+ }
192
+ }
193
+ function eigGeneral(A, computeVectors, symmetric) {
194
+ const nn = A.length;
195
+ const eps = EIG_GEN_EPS;
196
+ const H = new Float64Array(nn * nn);
197
+ for (let i = 0; i < nn; i++) {
198
+ for (let j = 0; j < nn; j++) H[i * nn + j] = A[i][j];
199
+ }
200
+ const V = new Float64Array(nn * nn);
201
+ for (let i = 0; i < nn; i++) V[i * nn + i] = 1;
202
+ const d = new Float64Array(nn);
203
+ const e = new Float64Array(nn);
204
+ const ort = new Float64Array(nn);
205
+ orthesGeneral(H, V, ort, nn);
206
+ const low = 0;
207
+ const high = nn - 1;
208
+ let exshift = 0;
209
+ let p = 0;
210
+ let q = 0;
211
+ let r = 0;
212
+ let s = 0;
213
+ let z = 0;
214
+ let t;
215
+ let w;
216
+ let x;
217
+ let y;
218
+ let norm = 0;
219
+ for (let i = 0; i < nn; i++) {
220
+ for (let j = Math.max(i - 1, 0); j < nn; j++) {
221
+ norm += Math.abs(H[i * nn + j]);
222
+ }
223
+ }
224
+ let nIdx = nn - 1;
225
+ let iter = 0;
226
+ while (nIdx >= low) {
227
+ let l = nIdx;
228
+ while (l > low) {
229
+ s = Math.abs(H[(l - 1) * nn + (l - 1)]) + Math.abs(H[l * nn + l]);
230
+ if (s === 0) s = norm;
231
+ if (Math.abs(H[l * nn + (l - 1)]) < eps * s) break;
232
+ l--;
233
+ }
234
+ if (l === nIdx) {
235
+ H[nIdx * nn + nIdx] = H[nIdx * nn + nIdx] + exshift;
236
+ d[nIdx] = H[nIdx * nn + nIdx];
237
+ e[nIdx] = 0;
238
+ nIdx--;
239
+ iter = 0;
240
+ } else if (l === nIdx - 1) {
241
+ w = H[nIdx * nn + (nIdx - 1)] * H[(nIdx - 1) * nn + nIdx];
242
+ p = (H[(nIdx - 1) * nn + (nIdx - 1)] - H[nIdx * nn + nIdx]) / 2;
243
+ q = p * p + w;
244
+ z = Math.sqrt(Math.abs(q));
245
+ H[nIdx * nn + nIdx] = H[nIdx * nn + nIdx] + exshift;
246
+ H[(nIdx - 1) * nn + (nIdx - 1)] = H[(nIdx - 1) * nn + (nIdx - 1)] + exshift;
247
+ x = H[nIdx * nn + nIdx];
248
+ if (q >= 0) {
249
+ z = p >= 0 ? p + z : p - z;
250
+ d[nIdx - 1] = x + z;
251
+ d[nIdx] = d[nIdx - 1];
252
+ if (z !== 0) d[nIdx] = x - w / z;
253
+ e[nIdx - 1] = 0;
254
+ e[nIdx] = 0;
255
+ x = H[nIdx * nn + (nIdx - 1)];
256
+ s = Math.abs(x) + Math.abs(z);
257
+ p = x / s;
258
+ q = z / s;
259
+ r = Math.sqrt(p * p + q * q);
260
+ p = p / r;
261
+ q = q / r;
262
+ for (let j = nIdx - 1; j < nn; j++) {
263
+ z = H[(nIdx - 1) * nn + j];
264
+ H[(nIdx - 1) * nn + j] = q * z + p * H[nIdx * nn + j];
265
+ H[nIdx * nn + j] = q * H[nIdx * nn + j] - p * z;
266
+ }
267
+ for (let i = 0; i <= nIdx; i++) {
268
+ z = H[i * nn + (nIdx - 1)];
269
+ H[i * nn + (nIdx - 1)] = q * z + p * H[i * nn + nIdx];
270
+ H[i * nn + nIdx] = q * H[i * nn + nIdx] - p * z;
271
+ }
272
+ for (let i = low; i <= high; i++) {
273
+ z = V[i * nn + (nIdx - 1)];
274
+ V[i * nn + (nIdx - 1)] = q * z + p * V[i * nn + nIdx];
275
+ V[i * nn + nIdx] = q * V[i * nn + nIdx] - p * z;
276
+ }
277
+ } else {
278
+ d[nIdx - 1] = x + p;
279
+ d[nIdx] = x + p;
280
+ e[nIdx - 1] = z;
281
+ e[nIdx] = -z;
282
+ }
283
+ nIdx = nIdx - 2;
284
+ iter = 0;
285
+ } else {
286
+ x = H[nIdx * nn + nIdx];
287
+ y = 0;
288
+ w = 0;
289
+ if (l < nIdx) {
290
+ y = H[(nIdx - 1) * nn + (nIdx - 1)];
291
+ w = H[nIdx * nn + (nIdx - 1)] * H[(nIdx - 1) * nn + nIdx];
292
+ }
293
+ if (iter === 10) {
294
+ exshift += x;
295
+ for (let i = low; i <= nIdx; i++) H[i * nn + i] -= x;
296
+ s = Math.abs(H[nIdx * nn + (nIdx - 1)]) + Math.abs(H[(nIdx - 1) * nn + (nIdx - 2)]);
297
+ x = y = 0.75 * s;
298
+ w = -0.4375 * s * s;
299
+ }
300
+ if (iter === 30) {
301
+ s = (y - x) / 2;
302
+ s = s * s + w;
303
+ if (s > 0) {
304
+ s = Math.sqrt(s);
305
+ if (y < x) s = -s;
306
+ s = x - w / ((y - x) / 2 + s);
307
+ for (let i = low; i <= nIdx; i++) H[i * nn + i] -= s;
308
+ exshift += s;
309
+ x = y = w = 0.964;
310
+ }
311
+ }
312
+ iter = iter + 1;
313
+ let m = nIdx - 2;
314
+ while (m >= l) {
315
+ z = H[m * nn + m];
316
+ r = x - z;
317
+ s = y - z;
318
+ p = (r * s - w) / H[(m + 1) * nn + m] + H[m * nn + (m + 1)];
319
+ q = H[(m + 1) * nn + (m + 1)] - z - r - s;
320
+ r = H[(m + 2) * nn + (m + 1)];
321
+ s = Math.abs(p) + Math.abs(q) + Math.abs(r);
322
+ p = p / s;
323
+ q = q / s;
324
+ r = r / s;
325
+ if (m === l) break;
326
+ if (Math.abs(H[m * nn + (m - 1)]) * (Math.abs(q) + Math.abs(r)) < eps * (Math.abs(p) * (Math.abs(H[(m - 1) * nn + (m - 1)]) + Math.abs(z) + Math.abs(H[(m + 1) * nn + (m + 1)])))) {
327
+ break;
328
+ }
329
+ m--;
330
+ }
331
+ for (let i = m + 2; i <= nIdx; i++) {
332
+ H[i * nn + (i - 2)] = 0;
333
+ if (i > m + 2) H[i * nn + (i - 3)] = 0;
334
+ }
335
+ for (let k = m; k <= nIdx - 1; k++) {
336
+ const notlast = k !== nIdx - 1;
337
+ if (k !== m) {
338
+ p = H[k * nn + (k - 1)];
339
+ q = H[(k + 1) * nn + (k - 1)];
340
+ r = notlast ? H[(k + 2) * nn + (k - 1)] : 0;
341
+ x = Math.abs(p) + Math.abs(q) + Math.abs(r);
342
+ if (x !== 0) {
343
+ p = p / x;
344
+ q = q / x;
345
+ r = r / x;
346
+ }
347
+ }
348
+ if (x === 0) break;
349
+ s = Math.sqrt(p * p + q * q + r * r);
350
+ if (p < 0) s = -s;
351
+ if (s !== 0) {
352
+ if (k !== m) {
353
+ H[k * nn + (k - 1)] = -s * x;
354
+ } else if (l !== m) {
355
+ H[k * nn + (k - 1)] = -H[k * nn + (k - 1)];
356
+ }
357
+ p = p + s;
358
+ x = p / s;
359
+ y = q / s;
360
+ z = r / s;
361
+ q = q / p;
362
+ r = r / p;
363
+ for (let j = k; j < nn; j++) {
364
+ p = H[k * nn + j] + q * H[(k + 1) * nn + j];
365
+ if (notlast) {
366
+ p = p + r * H[(k + 2) * nn + j];
367
+ H[(k + 2) * nn + j] = H[(k + 2) * nn + j] - p * z;
368
+ }
369
+ H[k * nn + j] = H[k * nn + j] - p * x;
370
+ H[(k + 1) * nn + j] = H[(k + 1) * nn + j] - p * y;
371
+ }
372
+ const colEnd = Math.min(nIdx, k + 3);
373
+ for (let i = 0; i <= colEnd; i++) {
374
+ p = x * H[i * nn + k] + y * H[i * nn + (k + 1)];
375
+ if (notlast) {
376
+ p = p + z * H[i * nn + (k + 2)];
377
+ H[i * nn + (k + 2)] = H[i * nn + (k + 2)] - p * r;
378
+ }
379
+ H[i * nn + k] = H[i * nn + k] - p;
380
+ H[i * nn + (k + 1)] = H[i * nn + (k + 1)] - p * q;
381
+ }
382
+ for (let i = low; i <= high; i++) {
383
+ p = x * V[i * nn + k] + y * V[i * nn + (k + 1)];
384
+ if (notlast) {
385
+ p = p + z * V[i * nn + (k + 2)];
386
+ V[i * nn + (k + 2)] = V[i * nn + (k + 2)] - p * r;
387
+ }
388
+ V[i * nn + k] = V[i * nn + k] - p;
389
+ V[i * nn + (k + 1)] = V[i * nn + (k + 1)] - p * q;
390
+ }
391
+ }
392
+ }
393
+ }
394
+ }
395
+ if (norm !== 0) {
396
+ for (nIdx = nn - 1; nIdx >= 0; nIdx--) {
397
+ p = d[nIdx];
398
+ q = e[nIdx];
399
+ if (q === 0) {
400
+ let l = nIdx;
401
+ H[nIdx * nn + nIdx] = 1;
402
+ for (let i = nIdx - 1; i >= 0; i--) {
403
+ w = H[i * nn + i] - p;
404
+ r = 0;
405
+ for (let j = l; j <= nIdx; j++) r += H[i * nn + j] * H[j * nn + nIdx];
406
+ if (e[i] < 0) {
407
+ z = w;
408
+ s = r;
409
+ } else {
410
+ l = i;
411
+ if (e[i] === 0) {
412
+ H[i * nn + nIdx] = w !== 0 ? -r / w : -r / (eps * norm);
413
+ } else {
414
+ x = H[i * nn + (i + 1)];
415
+ y = H[(i + 1) * nn + i];
416
+ q = (d[i] - p) * (d[i] - p) + e[i] * e[i];
417
+ t = (x * s - z * r) / q;
418
+ H[i * nn + nIdx] = t;
419
+ if (Math.abs(x) > Math.abs(z)) {
420
+ H[(i + 1) * nn + nIdx] = (-r - w * t) / x;
421
+ } else {
422
+ H[(i + 1) * nn + nIdx] = (-s - y * t) / z;
423
+ }
424
+ }
425
+ t = Math.abs(H[i * nn + nIdx]);
426
+ if (eps * t * t > 1) {
427
+ for (let j = i; j <= nIdx; j++) H[j * nn + nIdx] = H[j * nn + nIdx] / t;
428
+ }
429
+ }
430
+ }
431
+ } else if (q < 0) {
432
+ let l = nIdx - 1;
433
+ if (Math.abs(H[nIdx * nn + (nIdx - 1)]) > Math.abs(H[(nIdx - 1) * nn + nIdx])) {
434
+ H[(nIdx - 1) * nn + (nIdx - 1)] = q / H[nIdx * nn + (nIdx - 1)];
435
+ H[(nIdx - 1) * nn + nIdx] = -(H[nIdx * nn + nIdx] - p) / H[nIdx * nn + (nIdx - 1)];
436
+ } else {
437
+ const cd = cdiv(0, -H[(nIdx - 1) * nn + nIdx], H[(nIdx - 1) * nn + (nIdx - 1)] - p, q);
438
+ H[(nIdx - 1) * nn + (nIdx - 1)] = cd.r;
439
+ H[(nIdx - 1) * nn + nIdx] = cd.i;
440
+ }
441
+ H[nIdx * nn + (nIdx - 1)] = 0;
442
+ H[nIdx * nn + nIdx] = 1;
443
+ for (let i = nIdx - 2; i >= 0; i--) {
444
+ let ra = 0;
445
+ let sa = 0;
446
+ for (let j = l; j <= nIdx; j++) {
447
+ ra += H[i * nn + j] * H[j * nn + (nIdx - 1)];
448
+ sa += H[i * nn + j] * H[j * nn + nIdx];
449
+ }
450
+ w = H[i * nn + i] - p;
451
+ if (e[i] < 0) {
452
+ z = w;
453
+ r = ra;
454
+ s = sa;
455
+ } else {
456
+ l = i;
457
+ if (e[i] === 0) {
458
+ const cd = cdiv(-ra, -sa, w, q);
459
+ H[i * nn + (nIdx - 1)] = cd.r;
460
+ H[i * nn + nIdx] = cd.i;
461
+ } else {
462
+ x = H[i * nn + (i + 1)];
463
+ y = H[(i + 1) * nn + i];
464
+ let vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
465
+ const vi = (d[i] - p) * 2 * q;
466
+ if (vr === 0 && vi === 0) {
467
+ vr = eps * norm * (Math.abs(w) + Math.abs(q) + Math.abs(x) + Math.abs(y) + Math.abs(z));
468
+ }
469
+ const cd = cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi);
470
+ H[i * nn + (nIdx - 1)] = cd.r;
471
+ H[i * nn + nIdx] = cd.i;
472
+ if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {
473
+ H[(i + 1) * nn + (nIdx - 1)] = (-ra - w * H[i * nn + (nIdx - 1)] + q * H[i * nn + nIdx]) / x;
474
+ H[(i + 1) * nn + nIdx] = (-sa - w * H[i * nn + nIdx] - q * H[i * nn + (nIdx - 1)]) / x;
475
+ } else {
476
+ const cd2 = cdiv(
477
+ -r - y * H[i * nn + (nIdx - 1)],
478
+ -s - y * H[i * nn + nIdx],
479
+ z,
480
+ q
481
+ );
482
+ H[(i + 1) * nn + (nIdx - 1)] = cd2.r;
483
+ H[(i + 1) * nn + nIdx] = cd2.i;
484
+ }
485
+ }
486
+ t = Math.max(Math.abs(H[i * nn + (nIdx - 1)]), Math.abs(H[i * nn + nIdx]));
487
+ if (eps * t * t > 1) {
488
+ for (let j = i; j <= nIdx; j++) {
489
+ H[j * nn + (nIdx - 1)] = H[j * nn + (nIdx - 1)] / t;
490
+ H[j * nn + nIdx] = H[j * nn + nIdx] / t;
491
+ }
492
+ }
493
+ }
494
+ }
495
+ }
496
+ }
497
+ for (let j = nn - 1; j >= low; j--) {
498
+ for (let i = low; i <= high; i++) {
499
+ z = 0;
500
+ const kEnd = Math.min(j, high);
501
+ for (let k = low; k <= kEnd; k++) z += V[i * nn + k] * H[k * nn + j];
502
+ V[i * nn + j] = z;
503
+ }
504
+ }
505
+ }
506
+ const values = [];
507
+ for (let j = 0; j < nn; j++) values.push({ re: d[j], im: e[j] });
508
+ let vectors;
509
+ if (computeVectors) {
510
+ vectors = [];
511
+ for (let j = 0; j < nn; j++) {
512
+ const vec = new Array(nn).fill(0);
513
+ if (e[j] === 0) {
514
+ let colNorm = 0;
515
+ for (let i = 0; i < nn; i++) colNorm += V[i * nn + j] * V[i * nn + j];
516
+ colNorm = Math.sqrt(colNorm);
517
+ if (colNorm > 1e-300) {
518
+ for (let i = 0; i < nn; i++) vec[i] = V[i * nn + j] / colNorm;
519
+ } else {
520
+ for (let i = 0; i < nn; i++) vec[i] = V[i * nn + j];
521
+ }
522
+ }
523
+ vectors.push(vec);
524
+ }
525
+ } else {
526
+ vectors = eye(nn);
527
+ }
528
+ return { values, vectors, isSymmetric: symmetric };
529
+ }
530
+ function eig(matrix, options = {}) {
531
+ const { computeVectors = true } = options;
532
+ let A;
533
+ if (matrix instanceof Float64Array) {
534
+ const n2 = Math.sqrt(matrix.length);
535
+ if (n2 !== Math.floor(n2)) {
536
+ throw new Error("Float64Array length must be a perfect square");
537
+ }
538
+ A = Array.from({ length: n2 }, (_, i) => Array.from({ length: n2 }, (_2, j) => matrix[i * n2 + j]));
539
+ } else {
540
+ A = matrix;
541
+ }
542
+ const n = A.length;
543
+ if (n === 0) {
544
+ return { values: [], vectors: [], isSymmetric: true };
545
+ }
546
+ for (let i = 0; i < n; i++) {
547
+ if (A[i].length !== n) {
548
+ throw new Error("Matrix must be square");
549
+ }
550
+ }
551
+ const symmetric = isSymmetric(A);
552
+ if (n === 1) {
553
+ return {
554
+ values: [{ re: A[0][0], im: 0 }],
555
+ vectors: [[1]],
556
+ isSymmetric: symmetric
557
+ };
558
+ }
559
+ return eigGeneral(A, computeVectors, symmetric);
560
+ }
561
+ function eigvals(matrix, options) {
562
+ return eig(matrix, { ...options, computeVectors: false }).values;
563
+ }
564
+ function powerIteration(matrix, options = {}) {
565
+ const { maxIterations = 1e3, tolerance = 1e-12 } = options;
566
+ const n = matrix.length;
567
+ let v = Array.from({ length: n }, () => Math.random() - 0.5);
568
+ let norm = Math.sqrt(v.reduce((sum, x) => sum + x * x, 0));
569
+ v = v.map((x) => x / norm);
570
+ let eigenvalue = 0;
571
+ let prevEigenvalue = 0;
572
+ for (let iter = 0; iter < maxIterations; iter++) {
573
+ const w = new Array(n).fill(0);
574
+ for (let i = 0; i < n; i++) {
575
+ for (let j = 0; j < n; j++) {
576
+ w[i] += matrix[i][j] * v[j];
577
+ }
578
+ }
579
+ eigenvalue = v.reduce((sum, vi, i) => sum + vi * w[i], 0);
580
+ norm = Math.sqrt(w.reduce((sum, x) => sum + x * x, 0));
581
+ v = w.map((x) => x / norm);
582
+ if (Math.abs(eigenvalue - prevEigenvalue) < tolerance * Math.abs(eigenvalue)) {
583
+ break;
584
+ }
585
+ prevEigenvalue = eigenvalue;
586
+ }
587
+ return { value: eigenvalue, vector: v };
588
+ }
589
+
590
+ export {
591
+ eye,
592
+ cloneMatrix,
593
+ transpose,
594
+ isSymmetric,
595
+ matMul,
596
+ matAdd,
597
+ matSub,
598
+ matScale,
599
+ normInf,
600
+ norm1,
601
+ householder,
602
+ applyHouseholderLeft,
603
+ applyHouseholderRight,
604
+ eig,
605
+ eigvals,
606
+ powerIteration
607
+ };
@@ -2,7 +2,7 @@ import {
2
2
  eig,
3
3
  eigvals,
4
4
  powerIteration
5
- } from "./chunk-VCPLE6ED.js";
5
+ } from "./chunk-JRSQE7LB.js";
6
6
  import "./chunk-4VMDO6W2.js";
7
7
  export {
8
8
  eig,