1 | import { factory } from '../../../utils/factory.js';
|
2 | import { DimensionError } from '../../../error/DimensionError.js';
|
3 | var name = 'algorithm07';
|
4 | var dependencies = ['typed', 'DenseMatrix'];
|
5 | export var createAlgorithm07 = factory(name, dependencies, _ref => {
|
6 | var {
|
7 | typed,
|
8 | DenseMatrix
|
9 | } = _ref;
|
10 |
|
11 | |
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | return function algorithm07(a, b, callback) {
|
26 |
|
27 | var asize = a._size;
|
28 | var adt = a._datatype;
|
29 |
|
30 | var bsize = b._size;
|
31 | var bdt = b._datatype;
|
32 |
|
33 | if (asize.length !== bsize.length) {
|
34 | throw new DimensionError(asize.length, bsize.length);
|
35 | }
|
36 |
|
37 |
|
38 | if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {
|
39 | throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');
|
40 | }
|
41 |
|
42 |
|
43 | var rows = asize[0];
|
44 | var columns = asize[1];
|
45 |
|
46 | var dt;
|
47 |
|
48 | var zero = 0;
|
49 |
|
50 | var cf = callback;
|
51 |
|
52 | if (typeof adt === 'string' && adt === bdt) {
|
53 |
|
54 | dt = adt;
|
55 |
|
56 | zero = typed.convert(0, dt);
|
57 |
|
58 | cf = typed.find(callback, [dt, dt]);
|
59 | }
|
60 |
|
61 |
|
62 | var i, j;
|
63 |
|
64 | var cdata = [];
|
65 |
|
66 | for (i = 0; i < rows; i++) {
|
67 | cdata[i] = [];
|
68 | }
|
69 |
|
70 |
|
71 | var xa = [];
|
72 | var xb = [];
|
73 |
|
74 | var wa = [];
|
75 | var wb = [];
|
76 |
|
77 | for (j = 0; j < columns; j++) {
|
78 |
|
79 | var mark = j + 1;
|
80 |
|
81 | _scatter(a, j, wa, xa, mark);
|
82 |
|
83 |
|
84 | _scatter(b, j, wb, xb, mark);
|
85 |
|
86 |
|
87 | for (i = 0; i < rows; i++) {
|
88 |
|
89 | var va = wa[i] === mark ? xa[i] : zero;
|
90 | var vb = wb[i] === mark ? xb[i] : zero;
|
91 |
|
92 | cdata[i][j] = cf(va, vb);
|
93 | }
|
94 | }
|
95 |
|
96 |
|
97 | return new DenseMatrix({
|
98 | data: cdata,
|
99 | size: [rows, columns],
|
100 | datatype: dt
|
101 | });
|
102 | };
|
103 |
|
104 | function _scatter(m, j, w, x, mark) {
|
105 |
|
106 | var values = m._values;
|
107 | var index = m._index;
|
108 | var ptr = m._ptr;
|
109 |
|
110 | for (var k = ptr[j], k1 = ptr[j + 1]; k < k1; k++) {
|
111 |
|
112 | var i = index[k];
|
113 |
|
114 | w[i] = mark;
|
115 | x[i] = values[k];
|
116 | }
|
117 | }
|
118 | }); |
\ | No newline at end of file |