1 | import { factory } from '../../../utils/factory'
|
2 | import { DimensionError } from '../../../error/DimensionError'
|
3 |
|
4 | const name = 'algorithm01'
|
5 | const dependencies = ['typed']
|
6 |
|
7 | export const createAlgorithm01 = factory(name, dependencies, ({ typed }) => {
|
8 | |
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | return function algorithm1 (denseMatrix, sparseMatrix, callback, inverse) {
|
28 |
|
29 | const adata = denseMatrix._data
|
30 | const asize = denseMatrix._size
|
31 | const adt = denseMatrix._datatype
|
32 |
|
33 | const bvalues = sparseMatrix._values
|
34 | const bindex = sparseMatrix._index
|
35 | const bptr = sparseMatrix._ptr
|
36 | const bsize = sparseMatrix._size
|
37 | const bdt = sparseMatrix._datatype
|
38 |
|
39 |
|
40 | if (asize.length !== bsize.length) { throw new DimensionError(asize.length, bsize.length) }
|
41 |
|
42 |
|
43 | if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')') }
|
44 |
|
45 |
|
46 | if (!bvalues) { throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix') }
|
47 |
|
48 |
|
49 | const rows = asize[0]
|
50 | const columns = asize[1]
|
51 |
|
52 |
|
53 | const dt = typeof adt === 'string' && adt === bdt ? adt : undefined
|
54 |
|
55 | const cf = dt ? typed.find(callback, [dt, dt]) : callback
|
56 |
|
57 |
|
58 | let i, j
|
59 |
|
60 |
|
61 | const cdata = []
|
62 |
|
63 | for (i = 0; i < rows; i++) { cdata[i] = [] }
|
64 |
|
65 |
|
66 | const x = []
|
67 |
|
68 | const w = []
|
69 |
|
70 |
|
71 | for (j = 0; j < columns; j++) {
|
72 |
|
73 | const mark = j + 1
|
74 |
|
75 | for (let k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {
|
76 |
|
77 | i = bindex[k]
|
78 |
|
79 | x[i] = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k])
|
80 |
|
81 | w[i] = mark
|
82 | }
|
83 |
|
84 | for (i = 0; i < rows; i++) {
|
85 |
|
86 | if (w[i] === mark) {
|
87 |
|
88 | cdata[i][j] = x[i]
|
89 | } else {
|
90 |
|
91 | cdata[i][j] = adata[i][j]
|
92 | }
|
93 | }
|
94 | }
|
95 |
|
96 |
|
97 | return denseMatrix.createDenseMatrix({
|
98 | data: cdata,
|
99 | size: [rows, columns],
|
100 | datatype: dt
|
101 | })
|
102 | }
|
103 | })
|