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