1 | import { factory } from '../../../utils/factory.js';
|
2 | import { DimensionError } from '../../../error/DimensionError.js';
|
3 | var name = 'algorithm01';
|
4 | var dependencies = ['typed'];
|
5 | export var createAlgorithm01 = factory(name, dependencies, _ref => {
|
6 | var {
|
7 | typed
|
8 | } = _ref;
|
9 |
|
10 | |
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 | return function algorithm1(denseMatrix, sparseMatrix, callback, inverse) {
|
30 |
|
31 | var adata = denseMatrix._data;
|
32 | var asize = denseMatrix._size;
|
33 | var adt = denseMatrix._datatype;
|
34 |
|
35 | var bvalues = sparseMatrix._values;
|
36 | var bindex = sparseMatrix._index;
|
37 | var bptr = sparseMatrix._ptr;
|
38 | var bsize = sparseMatrix._size;
|
39 | var bdt = sparseMatrix._datatype;
|
40 |
|
41 | if (asize.length !== bsize.length) {
|
42 | throw new DimensionError(asize.length, bsize.length);
|
43 | }
|
44 |
|
45 |
|
46 | if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {
|
47 | throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');
|
48 | }
|
49 |
|
50 |
|
51 | if (!bvalues) {
|
52 | throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix');
|
53 | }
|
54 |
|
55 |
|
56 | var rows = asize[0];
|
57 | var columns = asize[1];
|
58 |
|
59 | var dt = typeof adt === 'string' && adt === bdt ? adt : undefined;
|
60 |
|
61 | var cf = dt ? typed.find(callback, [dt, dt]) : callback;
|
62 |
|
63 | var i, j;
|
64 |
|
65 | var cdata = [];
|
66 |
|
67 | for (i = 0; i < rows; i++) {
|
68 | cdata[i] = [];
|
69 | }
|
70 |
|
71 |
|
72 | var x = [];
|
73 |
|
74 | var w = [];
|
75 |
|
76 | for (j = 0; j < columns; j++) {
|
77 |
|
78 | var mark = j + 1;
|
79 |
|
80 | for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {
|
81 |
|
82 | i = bindex[k];
|
83 |
|
84 | x[i] = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]);
|
85 |
|
86 | w[i] = mark;
|
87 | }
|
88 |
|
89 |
|
90 | for (i = 0; i < rows; i++) {
|
91 |
|
92 | if (w[i] === mark) {
|
93 |
|
94 | cdata[i][j] = x[i];
|
95 | } else {
|
96 |
|
97 | cdata[i][j] = adata[i][j];
|
98 | }
|
99 | }
|
100 | }
|
101 |
|
102 |
|
103 | return denseMatrix.createDenseMatrix({
|
104 | data: cdata,
|
105 | size: [rows, columns],
|
106 | datatype: dt
|
107 | });
|
108 | };
|
109 | }); |
\ | No newline at end of file |