UNPKG

3.49 kBJavaScriptView Raw
1import { factory } from '../../../utils/factory.js';
2import { DimensionError } from '../../../error/DimensionError.js';
3var name = 'algorithm02';
4var dependencies = ['typed', 'equalScalar'];
5export var createAlgorithm02 = /* #__PURE__ */factory(name, dependencies, _ref => {
6 var {
7 typed,
8 equalScalar
9 } = _ref;
10
11 /**
12 * Iterates over SparseMatrix nonzero items and invokes the callback function f(Dij, Sij).
13 * Callback function invoked NNZ times (number of nonzero items in SparseMatrix).
14 *
15 *
16 * ┌ f(Dij, Sij) ; S(i,j) !== 0
17 * C(i,j) = ┤
18 * └ 0 ; otherwise
19 *
20 *
21 * @param {Matrix} denseMatrix The DenseMatrix instance (D)
22 * @param {Matrix} sparseMatrix The SparseMatrix instance (S)
23 * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j)
24 * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij)
25 *
26 * @return {Matrix} SparseMatrix (C)
27 *
28 * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571
29 */
30 return function algorithm02(denseMatrix, sparseMatrix, callback, inverse) {
31 // dense matrix arrays
32 var adata = denseMatrix._data;
33 var asize = denseMatrix._size;
34 var adt = denseMatrix._datatype; // sparse matrix arrays
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; // validate dimensions
41
42 if (asize.length !== bsize.length) {
43 throw new DimensionError(asize.length, bsize.length);
44 } // check rows & columns
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 } // sparse matrix cannot be a Pattern matrix
50
51
52 if (!bvalues) {
53 throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix');
54 } // rows & columns
55
56
57 var rows = asize[0];
58 var columns = asize[1]; // datatype
59
60 var dt; // equal signature to use
61
62 var eq = equalScalar; // zero value
63
64 var zero = 0; // callback signature to use
65
66 var cf = callback; // process data types
67
68 if (typeof adt === 'string' && adt === bdt) {
69 // datatype
70 dt = adt; // find signature that matches (dt, dt)
71
72 eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype
73
74 zero = typed.convert(0, dt); // callback
75
76 cf = typed.find(callback, [dt, dt]);
77 } // result (SparseMatrix)
78
79
80 var cvalues = [];
81 var cindex = [];
82 var cptr = []; // loop columns in b
83
84 for (var j = 0; j < columns; j++) {
85 // update cptr
86 cptr[j] = cindex.length; // values in column j
87
88 for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {
89 // row
90 var i = bindex[k]; // update C(i,j)
91
92 var cij = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]); // check for nonzero
93
94 if (!eq(cij, zero)) {
95 // push i & v
96 cindex.push(i);
97 cvalues.push(cij);
98 }
99 }
100 } // update cptr
101
102
103 cptr[columns] = cindex.length; // return sparse matrix
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