1 | import { factory } from '../../../utils/factory.js';
|
2 | import { DimensionError } from '../../../error/DimensionError.js';
|
3 | var name = 'algorithm08';
|
4 | var dependencies = ['typed', 'equalScalar'];
|
5 | export var createAlgorithm08 = 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 | return function algorithm08(a, b, callback) {
|
30 |
|
31 | var avalues = a._values;
|
32 | var aindex = a._index;
|
33 | var aptr = a._ptr;
|
34 | var asize = a._size;
|
35 | var adt = a._datatype;
|
36 |
|
37 | var bvalues = b._values;
|
38 | var bindex = b._index;
|
39 | var bptr = b._ptr;
|
40 | var bsize = b._size;
|
41 | var bdt = b._datatype;
|
42 |
|
43 | if (asize.length !== bsize.length) {
|
44 | throw new DimensionError(asize.length, bsize.length);
|
45 | }
|
46 |
|
47 |
|
48 | if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {
|
49 | throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');
|
50 | }
|
51 |
|
52 |
|
53 | if (!avalues || !bvalues) {
|
54 | throw new Error('Cannot perform operation on Pattern Sparse Matrices');
|
55 | }
|
56 |
|
57 |
|
58 | var rows = asize[0];
|
59 | var columns = asize[1];
|
60 |
|
61 | var dt;
|
62 |
|
63 | var eq = equalScalar;
|
64 |
|
65 | var zero = 0;
|
66 |
|
67 | var cf = callback;
|
68 |
|
69 | if (typeof adt === 'string' && adt === bdt) {
|
70 |
|
71 | dt = adt;
|
72 |
|
73 | eq = typed.find(equalScalar, [dt, dt]);
|
74 |
|
75 | zero = typed.convert(0, dt);
|
76 |
|
77 | cf = typed.find(callback, [dt, dt]);
|
78 | }
|
79 |
|
80 |
|
81 | var cvalues = [];
|
82 | var cindex = [];
|
83 | var cptr = [];
|
84 |
|
85 | var x = [];
|
86 |
|
87 | var w = [];
|
88 |
|
89 | var k, k0, k1, i;
|
90 |
|
91 | for (var j = 0; j < columns; j++) {
|
92 |
|
93 | cptr[j] = cindex.length;
|
94 |
|
95 | var mark = j + 1;
|
96 |
|
97 | for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {
|
98 |
|
99 | i = aindex[k];
|
100 |
|
101 | w[i] = mark;
|
102 |
|
103 | x[i] = avalues[k];
|
104 |
|
105 | cindex.push(i);
|
106 | }
|
107 |
|
108 |
|
109 | for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {
|
110 |
|
111 | i = bindex[k];
|
112 |
|
113 | if (w[i] === mark) {
|
114 |
|
115 | x[i] = cf(x[i], bvalues[k]);
|
116 | }
|
117 | }
|
118 |
|
119 |
|
120 | k = cptr[j];
|
121 |
|
122 | while (k < cindex.length) {
|
123 |
|
124 | i = cindex[k];
|
125 |
|
126 | var v = x[i];
|
127 |
|
128 | if (!eq(v, zero)) {
|
129 |
|
130 | cvalues.push(v);
|
131 |
|
132 | k++;
|
133 | } else {
|
134 |
|
135 | cindex.splice(k, 1);
|
136 | }
|
137 | }
|
138 | }
|
139 |
|
140 |
|
141 | cptr[columns] = cindex.length;
|
142 |
|
143 | return a.createSparseMatrix({
|
144 | values: cvalues,
|
145 | index: cindex,
|
146 | ptr: cptr,
|
147 | size: [rows, columns],
|
148 | datatype: dt
|
149 | });
|
150 | };
|
151 | }); |
\ | No newline at end of file |