UNPKG

2.8 kBJavaScriptView Raw
1import { factory } from '../../../utils/factory.js';
2var name = 'algorithm12';
3var dependencies = ['typed', 'DenseMatrix'];
4export var createAlgorithm12 = /* #__PURE__ */factory(name, dependencies, _ref => {
5 var {
6 typed,
7 DenseMatrix
8 } = _ref;
9
10 /**
11 * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b).
12 * Callback function invoked MxN times.
13 *
14 *
15 * ┌ f(Sij, b) ; S(i,j) !== 0
16 * C(i,j) = ┤
17 * └ f(0, b) ; otherwise
18 *
19 *
20 * @param {Matrix} s The SparseMatrix instance (S)
21 * @param {Scalar} b The Scalar value
22 * @param {Function} callback The f(Aij,b) operation to invoke
23 * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij)
24 *
25 * @return {Matrix} DenseMatrix (C)
26 *
27 * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813
28 */
29 return function algorithm12(s, b, callback, inverse) {
30 // sparse matrix arrays
31 var avalues = s._values;
32 var aindex = s._index;
33 var aptr = s._ptr;
34 var asize = s._size;
35 var adt = s._datatype; // sparse matrix cannot be a Pattern matrix
36
37 if (!avalues) {
38 throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value');
39 } // rows & columns
40
41
42 var rows = asize[0];
43 var columns = asize[1]; // datatype
44
45 var dt; // callback signature to use
46
47 var cf = callback; // process data types
48
49 if (typeof adt === 'string') {
50 // datatype
51 dt = adt; // convert b to the same datatype
52
53 b = typed.convert(b, dt); // callback
54
55 cf = typed.find(callback, [dt, dt]);
56 } // result arrays
57
58
59 var cdata = []; // workspaces
60
61 var x = []; // marks indicating we have a value in x for a given column
62
63 var w = []; // loop columns
64
65 for (var j = 0; j < columns; j++) {
66 // columns mark
67 var mark = j + 1; // values in j
68
69 for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {
70 // row
71 var r = aindex[k]; // update workspace
72
73 x[r] = avalues[k];
74 w[r] = mark;
75 } // loop rows
76
77
78 for (var i = 0; i < rows; i++) {
79 // initialize C on first column
80 if (j === 0) {
81 // create row array
82 cdata[i] = [];
83 } // check sparse matrix has a value @ i,j
84
85
86 if (w[i] === mark) {
87 // invoke callback, update C
88 cdata[i][j] = inverse ? cf(b, x[i]) : cf(x[i], b);
89 } else {
90 // dense matrix value @ i, j
91 cdata[i][j] = inverse ? cf(b, 0) : cf(0, b);
92 }
93 }
94 } // return dense matrix
95
96
97 return new DenseMatrix({
98 data: cdata,
99 size: [rows, columns],
100 datatype: dt
101 });
102 };
103});
\No newline at end of file