1 | import { factory } from '../../../utils/factory.js';
|
2 | import { DimensionError } from '../../../error/DimensionError.js';
|
3 | var name = 'algorithm05';
|
4 | var dependencies = ['typed', 'equalScalar'];
|
5 | export var createAlgorithm05 = 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 algorithm05(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 | var rows = asize[0];
|
54 | var columns = asize[1];
|
55 |
|
56 | var dt;
|
57 |
|
58 | var eq = equalScalar;
|
59 |
|
60 | var zero = 0;
|
61 |
|
62 | var cf = callback;
|
63 |
|
64 | if (typeof adt === 'string' && adt === bdt) {
|
65 |
|
66 | dt = adt;
|
67 |
|
68 | eq = typed.find(equalScalar, [dt, dt]);
|
69 |
|
70 | zero = typed.convert(0, dt);
|
71 |
|
72 | cf = typed.find(callback, [dt, dt]);
|
73 | }
|
74 |
|
75 |
|
76 | var cvalues = avalues && bvalues ? [] : undefined;
|
77 | var cindex = [];
|
78 | var cptr = [];
|
79 |
|
80 | var xa = cvalues ? [] : undefined;
|
81 | var xb = cvalues ? [] : undefined;
|
82 |
|
83 | var wa = [];
|
84 | var wb = [];
|
85 |
|
86 | var i, j, k, k1;
|
87 |
|
88 | for (j = 0; j < columns; j++) {
|
89 |
|
90 | cptr[j] = cindex.length;
|
91 |
|
92 | var mark = j + 1;
|
93 |
|
94 | for (k = aptr[j], k1 = aptr[j + 1]; k < k1; k++) {
|
95 |
|
96 | i = aindex[k];
|
97 |
|
98 | cindex.push(i);
|
99 |
|
100 | wa[i] = mark;
|
101 |
|
102 | if (xa) {
|
103 | xa[i] = avalues[k];
|
104 | }
|
105 | }
|
106 |
|
107 |
|
108 | for (k = bptr[j], k1 = bptr[j + 1]; k < k1; k++) {
|
109 |
|
110 | i = bindex[k];
|
111 |
|
112 | if (wa[i] !== mark) {
|
113 |
|
114 | cindex.push(i);
|
115 | }
|
116 |
|
117 |
|
118 | wb[i] = mark;
|
119 |
|
120 | if (xb) {
|
121 | xb[i] = bvalues[k];
|
122 | }
|
123 | }
|
124 |
|
125 |
|
126 | if (cvalues) {
|
127 |
|
128 | k = cptr[j];
|
129 |
|
130 | while (k < cindex.length) {
|
131 |
|
132 | i = cindex[k];
|
133 |
|
134 | var wai = wa[i];
|
135 | var wbi = wb[i];
|
136 |
|
137 | if (wai === mark || wbi === mark) {
|
138 |
|
139 | var va = wai === mark ? xa[i] : zero;
|
140 | var vb = wbi === mark ? xb[i] : zero;
|
141 |
|
142 | var vc = cf(va, vb);
|
143 |
|
144 | if (!eq(vc, zero)) {
|
145 |
|
146 | cvalues.push(vc);
|
147 |
|
148 | k++;
|
149 | } else {
|
150 |
|
151 | cindex.splice(k, 1);
|
152 | }
|
153 | }
|
154 | }
|
155 | }
|
156 | }
|
157 |
|
158 |
|
159 | cptr[columns] = cindex.length;
|
160 |
|
161 | return a.createSparseMatrix({
|
162 | values: cvalues,
|
163 | index: cindex,
|
164 | ptr: cptr,
|
165 | size: [rows, columns],
|
166 | datatype: dt
|
167 | });
|
168 | };
|
169 | }); |
\ | No newline at end of file |