mathjs 7.2.0 → 7.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +34 -0
- package/dist/math.js +3421 -2476
- package/dist/math.min.js +5 -5
- package/dist/math.min.map +1 -1
- package/docs/expressions/syntax.md +30 -4
- package/docs/reference/functions/bin.md +38 -0
- package/docs/reference/functions/ceil.md +10 -1
- package/docs/reference/functions/fix.md +10 -2
- package/docs/reference/functions/floor.md +12 -3
- package/docs/reference/functions/hex.md +38 -0
- package/docs/reference/functions/lsolve.md +2 -1
- package/docs/reference/functions/lsolveAll.md +45 -0
- package/docs/reference/functions/oct.md +38 -0
- package/docs/reference/functions/rotationMatrix.md +51 -0
- package/docs/reference/functions/round.md +6 -2
- package/docs/reference/functions/usolve.md +2 -1
- package/docs/reference/functions/usolveAll.md +45 -0
- package/docs/reference/functions.md +8 -2
- package/es/entry/dependenciesAny/dependenciesBin.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesHex.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesLsolveAll.generated.js +22 -0
- package/es/entry/dependenciesAny/dependenciesOct.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
- package/es/entry/dependenciesAny/dependenciesUsolveAll.generated.js +22 -0
- package/es/entry/dependenciesAny.generated.js +6 -0
- package/es/entry/impureFunctionsAny.generated.js +63 -57
- package/es/entry/pureFunctionsAny.generated.js +323 -277
- package/es/expression/embeddedDocs/embeddedDocs.js +12 -0
- package/es/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/es/expression/embeddedDocs/function/algebra/lsolveAll.js +8 -0
- package/es/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/es/expression/embeddedDocs/function/algebra/usolveAll.js +8 -0
- package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
- package/es/expression/embeddedDocs/function/utils/bin.js +8 -0
- package/es/expression/embeddedDocs/function/utils/hex.js +8 -0
- package/es/expression/embeddedDocs/function/utils/oct.js +8 -0
- package/es/expression/parse.js +28 -1
- package/es/factoriesAny.js +6 -0
- package/es/function/algebra/solver/lsolve.js +42 -69
- package/es/function/algebra/solver/lsolveAll.js +213 -0
- package/es/function/algebra/solver/lusolve.js +12 -27
- package/es/function/algebra/solver/usolve.js +41 -64
- package/es/function/algebra/solver/usolveAll.js +213 -0
- package/es/function/algebra/solver/utils/solveValidation.js +66 -107
- package/es/function/arithmetic/ceil.js +88 -4
- package/es/function/arithmetic/fix.js +43 -6
- package/es/function/arithmetic/floor.js +90 -6
- package/es/function/arithmetic/mod.js +10 -1
- package/es/function/arithmetic/round.js +6 -2
- package/es/function/matrix/rotationMatrix.js +175 -0
- package/es/function/matrix/sqrtm.js +4 -0
- package/es/function/probability/pickRandom.js +2 -6
- package/es/function/statistics/variance.js +4 -4
- package/es/function/string/baseUtils.js +36 -0
- package/es/function/string/bin.js +23 -0
- package/es/function/string/hex.js +23 -0
- package/es/function/string/oct.js +23 -0
- package/es/type/bignumber/BigNumber.js +4 -1
- package/es/type/number.js +10 -0
- package/es/utils/object.js +3 -1
- package/es/version.js +1 -1
- package/examples/advanced/web_server/math_worker.js +1 -1
- package/lib/entry/dependenciesAny/dependenciesBin.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
- package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesHex.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesLsolveAll.generated.js +38 -0
- package/lib/entry/dependenciesAny/dependenciesOct.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
- package/lib/entry/dependenciesAny/dependenciesUsolveAll.generated.js +38 -0
- package/lib/entry/dependenciesAny.generated.js +48 -0
- package/lib/entry/impureFunctionsAny.generated.js +65 -59
- package/lib/entry/pureFunctionsAny.generated.js +373 -321
- package/lib/expression/embeddedDocs/embeddedDocs.js +18 -0
- package/lib/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/lib/expression/embeddedDocs/function/algebra/lsolveAll.js +15 -0
- package/lib/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/lib/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
- package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/bin.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/hex.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/oct.js +15 -0
- package/lib/expression/parse.js +28 -1
- package/lib/factoriesAny.js +48 -0
- package/lib/function/algebra/solver/lsolve.js +42 -69
- package/lib/function/algebra/solver/lsolveAll.js +223 -0
- package/lib/function/algebra/solver/lusolve.js +12 -27
- package/lib/function/algebra/solver/usolve.js +41 -64
- package/lib/function/algebra/solver/usolveAll.js +223 -0
- package/lib/function/algebra/solver/utils/solveValidation.js +65 -106
- package/lib/function/arithmetic/ceil.js +91 -4
- package/lib/function/arithmetic/fix.js +44 -6
- package/lib/function/arithmetic/floor.js +93 -6
- package/lib/function/arithmetic/mod.js +10 -1
- package/lib/function/arithmetic/round.js +6 -2
- package/lib/function/matrix/rotationMatrix.js +185 -0
- package/lib/function/matrix/sqrtm.js +4 -0
- package/lib/function/probability/pickRandom.js +3 -7
- package/lib/function/statistics/variance.js +4 -4
- package/lib/function/string/baseUtils.js +45 -0
- package/lib/function/string/bin.js +31 -0
- package/lib/function/string/hex.js +31 -0
- package/lib/function/string/oct.js +31 -0
- package/lib/header.js +2 -2
- package/lib/type/bignumber/BigNumber.js +3 -1
- package/lib/type/number.js +10 -0
- package/lib/utils/object.js +3 -1
- package/lib/version.js +1 -1
- package/package.json +12 -12
- package/src/entry/dependenciesAny/dependenciesBin.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesHex.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesLsolveAll.generated.js +23 -0
- package/src/entry/dependenciesAny/dependenciesOct.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
- package/src/entry/dependenciesAny/dependenciesUsolveAll.generated.js +23 -0
- package/src/entry/dependenciesAny.generated.js +6 -0
- package/src/entry/impureFunctionsAny.generated.js +104 -92
- package/src/entry/pureFunctionsAny.generated.js +94 -82
- package/src/expression/embeddedDocs/embeddedDocs.js +12 -0
- package/src/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/src/expression/embeddedDocs/function/algebra/lsolveAll.js +17 -0
- package/src/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/src/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
- package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
- package/src/expression/embeddedDocs/function/utils/bin.js +12 -0
- package/src/expression/embeddedDocs/function/utils/hex.js +12 -0
- package/src/expression/embeddedDocs/function/utils/oct.js +12 -0
- package/src/expression/parse.js +25 -0
- package/src/factoriesAny.js +6 -0
- package/src/function/algebra/solver/lsolve.js +52 -58
- package/src/function/algebra/solver/lsolveAll.js +197 -0
- package/src/function/algebra/solver/lusolve.js +9 -19
- package/src/function/algebra/solver/usolve.js +52 -55
- package/src/function/algebra/solver/usolveAll.js +199 -0
- package/src/function/algebra/solver/utils/solveValidation.js +78 -86
- package/src/function/arithmetic/ceil.js +63 -3
- package/src/function/arithmetic/fix.js +45 -6
- package/src/function/arithmetic/floor.js +65 -5
- package/src/function/arithmetic/mod.js +8 -1
- package/src/function/arithmetic/round.js +6 -2
- package/src/function/matrix/rotationMatrix.js +185 -0
- package/src/function/matrix/sqrtm.js +4 -0
- package/src/function/probability/pickRandom.js +2 -6
- package/src/function/statistics/variance.js +4 -4
- package/src/function/string/baseUtils.js +29 -0
- package/src/function/string/bin.js +23 -0
- package/src/function/string/hex.js +23 -0
- package/src/function/string/oct.js +24 -0
- package/src/type/bignumber/BigNumber.js +2 -1
- package/src/type/number.js +9 -1
- package/src/utils/object.js +3 -1
- package/src/version.js +1 -1
|
@@ -51,63 +51,49 @@ export var createLusolve = /* #__PURE__ */factory(name, dependencies, function (
|
|
|
51
51
|
|
|
52
52
|
return typed(name, {
|
|
53
53
|
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
var d = lup(a); // solve
|
|
58
|
-
|
|
59
|
-
var x = _lusolve(d.L, d.U, d.p, null, b); // convert result to array
|
|
54
|
+
a = matrix(a);
|
|
55
|
+
var d = lup(a);
|
|
60
56
|
|
|
57
|
+
var x = _lusolve(d.L, d.U, d.p, null, b);
|
|
61
58
|
|
|
62
59
|
return x.valueOf();
|
|
63
60
|
},
|
|
64
61
|
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(a, b) {
|
|
65
|
-
|
|
66
|
-
var d = lup(a); // solve
|
|
67
|
-
|
|
62
|
+
var d = lup(a);
|
|
68
63
|
return _lusolve(d.L, d.U, d.p, null, b);
|
|
69
64
|
},
|
|
70
65
|
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(a, b) {
|
|
71
|
-
|
|
72
|
-
var d = lup(a); // solve
|
|
73
|
-
|
|
66
|
+
var d = lup(a);
|
|
74
67
|
return _lusolve(d.L, d.U, d.p, null, b);
|
|
75
68
|
},
|
|
76
69
|
'SparseMatrix, Array | Matrix, number, number': function SparseMatrixArrayMatrixNumberNumber(a, b, order, threshold) {
|
|
77
|
-
|
|
78
|
-
var d = slu(a, order, threshold); // solve
|
|
79
|
-
|
|
70
|
+
var d = slu(a, order, threshold);
|
|
80
71
|
return _lusolve(d.L, d.U, d.p, d.q, b);
|
|
81
72
|
},
|
|
82
73
|
'Object, Array | Matrix': function ObjectArrayMatrix(d, b) {
|
|
83
|
-
// solve
|
|
84
74
|
return _lusolve(d.L, d.U, d.p, d.q, b);
|
|
85
75
|
}
|
|
86
76
|
});
|
|
87
77
|
|
|
88
78
|
function _toMatrix(a) {
|
|
89
|
-
// check it is a matrix
|
|
90
79
|
if (isMatrix(a)) {
|
|
91
80
|
return a;
|
|
92
|
-
}
|
|
93
|
-
|
|
81
|
+
}
|
|
94
82
|
|
|
95
83
|
if (isArray(a)) {
|
|
96
84
|
return matrix(a);
|
|
97
|
-
}
|
|
98
|
-
|
|
85
|
+
}
|
|
99
86
|
|
|
100
87
|
throw new TypeError('Invalid Matrix LU decomposition');
|
|
101
88
|
}
|
|
102
89
|
|
|
103
90
|
function _lusolve(l, u, p, q, b) {
|
|
104
|
-
// verify
|
|
91
|
+
// verify decomposition
|
|
105
92
|
l = _toMatrix(l);
|
|
106
|
-
u = _toMatrix(u); //
|
|
107
|
-
|
|
108
|
-
b = solveValidation(l, b, false); // apply row permutations if needed (b is a DenseMatrix)
|
|
93
|
+
u = _toMatrix(u); // apply row permutations if needed (b is a DenseMatrix)
|
|
109
94
|
|
|
110
95
|
if (p) {
|
|
96
|
+
b = solveValidation(l, b, true);
|
|
111
97
|
b._data = csIpvec(p, b._data);
|
|
112
98
|
} // use forward substitution to resolve L * y = b
|
|
113
99
|
|
|
@@ -118,8 +104,7 @@ export var createLusolve = /* #__PURE__ */factory(name, dependencies, function (
|
|
|
118
104
|
|
|
119
105
|
if (q) {
|
|
120
106
|
x._data = csIpvec(q, x._data);
|
|
121
|
-
}
|
|
122
|
-
|
|
107
|
+
}
|
|
123
108
|
|
|
124
109
|
return x;
|
|
125
110
|
}
|
|
@@ -14,7 +14,7 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
|
14
14
|
DenseMatrix: DenseMatrix
|
|
15
15
|
});
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* Finds one solution of a linear equation system by backward substitution. Matrix must be an upper triangular matrix. Throws an error if there's no solution.
|
|
18
18
|
*
|
|
19
19
|
* `U * x = b`
|
|
20
20
|
*
|
|
@@ -30,7 +30,7 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
|
30
30
|
*
|
|
31
31
|
* See also:
|
|
32
32
|
*
|
|
33
|
-
* lup, slu, usolve, lusolve
|
|
33
|
+
* usolveAll, lup, slu, usolve, lusolve
|
|
34
34
|
*
|
|
35
35
|
* @param {Matrix, Array} U A N x N matrix or array (U)
|
|
36
36
|
* @param {Matrix, Array} b A column vector with the b values
|
|
@@ -40,68 +40,59 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
|
40
40
|
|
|
41
41
|
return typed(name, {
|
|
42
42
|
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
|
|
43
|
-
// process matrix
|
|
44
43
|
return _sparseBackwardSubstitution(m, b);
|
|
45
44
|
},
|
|
46
45
|
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
|
|
47
|
-
// process matrix
|
|
48
46
|
return _denseBackwardSubstitution(m, b);
|
|
49
47
|
},
|
|
50
48
|
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
|
51
|
-
|
|
52
|
-
var m = matrix(a); // use matrix implementation
|
|
53
|
-
|
|
54
|
-
var r = _denseBackwardSubstitution(m, b); // result
|
|
49
|
+
var m = matrix(a);
|
|
55
50
|
|
|
51
|
+
var r = _denseBackwardSubstitution(m, b);
|
|
56
52
|
|
|
57
53
|
return r.valueOf();
|
|
58
54
|
}
|
|
59
55
|
});
|
|
60
56
|
|
|
61
57
|
function _denseBackwardSubstitution(m, b) {
|
|
62
|
-
//
|
|
63
|
-
b = solveValidation(m, b, true);
|
|
64
|
-
|
|
65
|
-
var bdata = b._data; // rows & columns
|
|
66
|
-
|
|
58
|
+
// make b into a column vector
|
|
59
|
+
b = solveValidation(m, b, true);
|
|
60
|
+
var bdata = b._data;
|
|
67
61
|
var rows = m._size[0];
|
|
68
62
|
var columns = m._size[1]; // result
|
|
69
63
|
|
|
70
|
-
var x = [];
|
|
71
|
-
|
|
72
|
-
var data = m._data; // backward solve m * x = b, loop columns (backwards)
|
|
64
|
+
var x = [];
|
|
65
|
+
var mdata = m._data; // loop columns backwards
|
|
73
66
|
|
|
74
67
|
for (var j = columns - 1; j >= 0; j--) {
|
|
75
68
|
// b[j]
|
|
76
69
|
var bj = bdata[j][0] || 0; // x[j]
|
|
77
70
|
|
|
78
|
-
var xj = void 0;
|
|
71
|
+
var xj = void 0;
|
|
79
72
|
|
|
80
73
|
if (!equalScalar(bj, 0)) {
|
|
81
|
-
// value
|
|
82
|
-
var vjj =
|
|
74
|
+
// value at [j, j]
|
|
75
|
+
var vjj = mdata[j][j];
|
|
83
76
|
|
|
84
77
|
if (equalScalar(vjj, 0)) {
|
|
85
78
|
// system cannot be solved
|
|
86
79
|
throw new Error('Linear system cannot be solved since matrix is singular');
|
|
87
|
-
}
|
|
88
|
-
|
|
80
|
+
}
|
|
89
81
|
|
|
90
82
|
xj = divideScalar(bj, vjj); // loop rows
|
|
91
83
|
|
|
92
84
|
for (var i = j - 1; i >= 0; i--) {
|
|
93
85
|
// update copy of b
|
|
94
|
-
bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj,
|
|
86
|
+
bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
|
|
95
87
|
}
|
|
96
88
|
} else {
|
|
97
|
-
// zero value
|
|
89
|
+
// zero value at j
|
|
98
90
|
xj = 0;
|
|
99
91
|
} // update x
|
|
100
92
|
|
|
101
93
|
|
|
102
94
|
x[j] = [xj];
|
|
103
|
-
}
|
|
104
|
-
|
|
95
|
+
}
|
|
105
96
|
|
|
106
97
|
return new DenseMatrix({
|
|
107
98
|
data: x,
|
|
@@ -110,74 +101,60 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
|
110
101
|
}
|
|
111
102
|
|
|
112
103
|
function _sparseBackwardSubstitution(m, b) {
|
|
113
|
-
//
|
|
114
|
-
b = solveValidation(m, b, true);
|
|
115
|
-
|
|
116
|
-
var bdata = b._data; // rows & columns
|
|
117
|
-
|
|
104
|
+
// make b into a column vector
|
|
105
|
+
b = solveValidation(m, b, true);
|
|
106
|
+
var bdata = b._data;
|
|
118
107
|
var rows = m._size[0];
|
|
119
|
-
var columns = m._size[1];
|
|
120
|
-
|
|
108
|
+
var columns = m._size[1];
|
|
121
109
|
var values = m._values;
|
|
122
110
|
var index = m._index;
|
|
123
|
-
var ptr = m._ptr; //
|
|
124
|
-
|
|
125
|
-
var i, k; // result
|
|
111
|
+
var ptr = m._ptr; // result
|
|
126
112
|
|
|
127
|
-
var x = []; //
|
|
113
|
+
var x = []; // loop columns backwards
|
|
128
114
|
|
|
129
115
|
for (var j = columns - 1; j >= 0; j--) {
|
|
130
|
-
|
|
131
|
-
var bj = bdata[j][0] || 0; // backward substitution (outer product) avoids inner looping when bj === 0
|
|
116
|
+
var bj = bdata[j][0] || 0;
|
|
132
117
|
|
|
133
118
|
if (!equalScalar(bj, 0)) {
|
|
134
|
-
//
|
|
119
|
+
// non-degenerate row, find solution
|
|
135
120
|
var vjj = 0; // upper triangular matrix values & index (column j)
|
|
136
121
|
|
|
137
|
-
var
|
|
138
|
-
var
|
|
122
|
+
var jValues = [];
|
|
123
|
+
var jIndices = []; // first & last indeces in column
|
|
139
124
|
|
|
140
|
-
var
|
|
141
|
-
var
|
|
125
|
+
var firstIndex = ptr[j];
|
|
126
|
+
var lastIndex = ptr[j + 1]; // values in column, find value at [j, j], loop backwards
|
|
142
127
|
|
|
143
|
-
for (k =
|
|
144
|
-
// row
|
|
145
|
-
i = index[k]; // check row
|
|
128
|
+
for (var k = lastIndex - 1; k >= firstIndex; k--) {
|
|
129
|
+
var i = index[k]; // check row (rows are not sorted!)
|
|
146
130
|
|
|
147
131
|
if (i === j) {
|
|
148
|
-
// update vjj
|
|
149
132
|
vjj = values[k];
|
|
150
133
|
} else if (i < j) {
|
|
151
134
|
// store upper triangular
|
|
152
|
-
|
|
153
|
-
|
|
135
|
+
jValues.push(values[k]);
|
|
136
|
+
jIndices.push(i);
|
|
154
137
|
}
|
|
155
|
-
} // at this point we must have a value
|
|
138
|
+
} // at this point we must have a value in vjj
|
|
156
139
|
|
|
157
140
|
|
|
158
141
|
if (equalScalar(vjj, 0)) {
|
|
159
|
-
// system cannot be solved, there is no value @ [j, j]
|
|
160
142
|
throw new Error('Linear system cannot be solved since matrix is singular');
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
var xj = divideScalar(bj, vjj); // loop upper triangular
|
|
165
|
-
|
|
166
|
-
for (k = 0, l = jindex.length; k < l; k++) {
|
|
167
|
-
// row
|
|
168
|
-
i = jindex[k]; // update copy of b
|
|
143
|
+
}
|
|
169
144
|
|
|
170
|
-
|
|
171
|
-
} // update x
|
|
145
|
+
var xj = divideScalar(bj, vjj);
|
|
172
146
|
|
|
147
|
+
for (var _k = 0, _lastIndex = jIndices.length; _k < _lastIndex; _k++) {
|
|
148
|
+
var _i = jIndices[_k];
|
|
149
|
+
bdata[_i] = [subtract(bdata[_i][0], multiplyScalar(xj, jValues[_k]))];
|
|
150
|
+
}
|
|
173
151
|
|
|
174
152
|
x[j] = [xj];
|
|
175
153
|
} else {
|
|
176
|
-
//
|
|
154
|
+
// degenerate row, we can choose any value
|
|
177
155
|
x[j] = [0];
|
|
178
156
|
}
|
|
179
|
-
}
|
|
180
|
-
|
|
157
|
+
}
|
|
181
158
|
|
|
182
159
|
return new DenseMatrix({
|
|
183
160
|
data: x,
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
+
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
|
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
+
|
|
7
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
|
|
8
|
+
|
|
9
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
10
|
+
|
|
11
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
12
|
+
|
|
13
|
+
import { factory } from '../../../utils/factory';
|
|
14
|
+
import { createSolveValidation } from './utils/solveValidation';
|
|
15
|
+
var name = 'usolveAll';
|
|
16
|
+
var dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];
|
|
17
|
+
export var createUsolveAll = /* #__PURE__ */factory(name, dependencies, function (_ref) {
|
|
18
|
+
var typed = _ref.typed,
|
|
19
|
+
matrix = _ref.matrix,
|
|
20
|
+
divideScalar = _ref.divideScalar,
|
|
21
|
+
multiplyScalar = _ref.multiplyScalar,
|
|
22
|
+
subtract = _ref.subtract,
|
|
23
|
+
equalScalar = _ref.equalScalar,
|
|
24
|
+
DenseMatrix = _ref.DenseMatrix;
|
|
25
|
+
var solveValidation = createSolveValidation({
|
|
26
|
+
DenseMatrix: DenseMatrix
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Finds all solutions of a linear equation system by backward substitution. Matrix must be an upper triangular matrix.
|
|
30
|
+
*
|
|
31
|
+
* `U * x = b`
|
|
32
|
+
*
|
|
33
|
+
* Syntax:
|
|
34
|
+
*
|
|
35
|
+
* math.usolve(U, b)
|
|
36
|
+
*
|
|
37
|
+
* Examples:
|
|
38
|
+
*
|
|
39
|
+
* const a = [[-2, 3], [2, 1]]
|
|
40
|
+
* const b = [11, 9]
|
|
41
|
+
* const x = usolve(a, b) // [ [[8], [9]] ]
|
|
42
|
+
*
|
|
43
|
+
* See also:
|
|
44
|
+
*
|
|
45
|
+
* usolve, lup, slu, usolve, lusolve
|
|
46
|
+
*
|
|
47
|
+
* @param {Matrix, Array} U A N x N matrix or array (U)
|
|
48
|
+
* @param {Matrix, Array} b A column vector with the b values
|
|
49
|
+
*
|
|
50
|
+
* @return {DenseMatrix[] | Array[]} An array of affine-independent column vectors (x) that solve the linear system
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
return typed(name, {
|
|
54
|
+
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
|
|
55
|
+
return _sparseBackwardSubstitution(m, b);
|
|
56
|
+
},
|
|
57
|
+
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
|
|
58
|
+
return _denseBackwardSubstitution(m, b);
|
|
59
|
+
},
|
|
60
|
+
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
|
61
|
+
var m = matrix(a);
|
|
62
|
+
|
|
63
|
+
var R = _denseBackwardSubstitution(m, b);
|
|
64
|
+
|
|
65
|
+
return R.map(function (r) {
|
|
66
|
+
return r.valueOf();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
function _denseBackwardSubstitution(m, b_) {
|
|
72
|
+
// the algorithm is derived from
|
|
73
|
+
// https://www.overleaf.com/project/5e6c87c554a3190001a3fc93
|
|
74
|
+
// array of right-hand sides
|
|
75
|
+
var B = [solveValidation(m, b_, true)._data.map(function (e) {
|
|
76
|
+
return e[0];
|
|
77
|
+
})];
|
|
78
|
+
var M = m._data;
|
|
79
|
+
var rows = m._size[0];
|
|
80
|
+
var columns = m._size[1]; // loop columns backwards
|
|
81
|
+
|
|
82
|
+
for (var i = columns - 1; i >= 0; i--) {
|
|
83
|
+
var L = B.length; // loop right-hand sides
|
|
84
|
+
|
|
85
|
+
for (var k = 0; k < L; k++) {
|
|
86
|
+
var b = B[k];
|
|
87
|
+
|
|
88
|
+
if (!equalScalar(M[i][i], 0)) {
|
|
89
|
+
// non-singular row
|
|
90
|
+
b[i] = divideScalar(b[i], M[i][i]);
|
|
91
|
+
|
|
92
|
+
for (var j = i - 1; j >= 0; j--) {
|
|
93
|
+
// b[j] -= b[i] * M[j,i]
|
|
94
|
+
b[j] = subtract(b[j], multiplyScalar(b[i], M[j][i]));
|
|
95
|
+
}
|
|
96
|
+
} else if (!equalScalar(b[i], 0)) {
|
|
97
|
+
// singular row, nonzero RHS
|
|
98
|
+
if (k === 0) {
|
|
99
|
+
// There is no valid solution
|
|
100
|
+
return [];
|
|
101
|
+
} else {
|
|
102
|
+
// This RHS is invalid but other solutions may still exist
|
|
103
|
+
B.splice(k, 1);
|
|
104
|
+
k -= 1;
|
|
105
|
+
L -= 1;
|
|
106
|
+
}
|
|
107
|
+
} else if (k === 0) {
|
|
108
|
+
// singular row, RHS is zero
|
|
109
|
+
var bNew = _toConsumableArray(b);
|
|
110
|
+
|
|
111
|
+
bNew[i] = 1;
|
|
112
|
+
|
|
113
|
+
for (var _j = i - 1; _j >= 0; _j--) {
|
|
114
|
+
bNew[_j] = subtract(bNew[_j], M[_j][i]);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
B.push(bNew);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return B.map(function (x) {
|
|
123
|
+
return new DenseMatrix({
|
|
124
|
+
data: x.map(function (e) {
|
|
125
|
+
return [e];
|
|
126
|
+
}),
|
|
127
|
+
size: [rows, 1]
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function _sparseBackwardSubstitution(m, b_) {
|
|
133
|
+
// array of right-hand sides
|
|
134
|
+
var B = [solveValidation(m, b_, true)._data.map(function (e) {
|
|
135
|
+
return e[0];
|
|
136
|
+
})];
|
|
137
|
+
var rows = m._size[0];
|
|
138
|
+
var columns = m._size[1];
|
|
139
|
+
var values = m._values;
|
|
140
|
+
var index = m._index;
|
|
141
|
+
var ptr = m._ptr; // loop columns backwards
|
|
142
|
+
|
|
143
|
+
for (var i = columns - 1; i >= 0; i--) {
|
|
144
|
+
var L = B.length; // loop right-hand sides
|
|
145
|
+
|
|
146
|
+
for (var k = 0; k < L; k++) {
|
|
147
|
+
var b = B[k]; // values & indices (column i)
|
|
148
|
+
|
|
149
|
+
var iValues = [];
|
|
150
|
+
var iIndices = []; // first & last indeces in column
|
|
151
|
+
|
|
152
|
+
var firstIndex = ptr[i];
|
|
153
|
+
var lastIndex = ptr[i + 1]; // find the value at [i, i]
|
|
154
|
+
|
|
155
|
+
var Mii = 0;
|
|
156
|
+
|
|
157
|
+
for (var j = lastIndex - 1; j >= firstIndex; j--) {
|
|
158
|
+
var J = index[j]; // check row
|
|
159
|
+
|
|
160
|
+
if (J === i) {
|
|
161
|
+
Mii = values[j];
|
|
162
|
+
} else if (J < i) {
|
|
163
|
+
// store upper triangular
|
|
164
|
+
iValues.push(values[j]);
|
|
165
|
+
iIndices.push(J);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (!equalScalar(Mii, 0)) {
|
|
170
|
+
// non-singular row
|
|
171
|
+
b[i] = divideScalar(b[i], Mii); // loop upper triangular
|
|
172
|
+
|
|
173
|
+
for (var _j2 = 0, _lastIndex = iIndices.length; _j2 < _lastIndex; _j2++) {
|
|
174
|
+
var _J = iIndices[_j2];
|
|
175
|
+
b[_J] = subtract(b[_J], multiplyScalar(b[i], iValues[_j2]));
|
|
176
|
+
}
|
|
177
|
+
} else if (!equalScalar(b[i], 0)) {
|
|
178
|
+
// singular row, nonzero RHS
|
|
179
|
+
if (k === 0) {
|
|
180
|
+
// There is no valid solution
|
|
181
|
+
return [];
|
|
182
|
+
} else {
|
|
183
|
+
// This RHS is invalid but other solutions may still exist
|
|
184
|
+
B.splice(k, 1);
|
|
185
|
+
k -= 1;
|
|
186
|
+
L -= 1;
|
|
187
|
+
}
|
|
188
|
+
} else if (k === 0) {
|
|
189
|
+
// singular row, RHS is zero
|
|
190
|
+
var bNew = _toConsumableArray(b);
|
|
191
|
+
|
|
192
|
+
bNew[i] = 1; // loop upper triangular
|
|
193
|
+
|
|
194
|
+
for (var _j3 = 0, _lastIndex2 = iIndices.length; _j3 < _lastIndex2; _j3++) {
|
|
195
|
+
var _J2 = iIndices[_j3];
|
|
196
|
+
bNew[_J2] = subtract(bNew[_J2], iValues[_j3]);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
B.push(bNew);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return B.map(function (x) {
|
|
205
|
+
return new DenseMatrix({
|
|
206
|
+
data: x.map(function (e) {
|
|
207
|
+
return [e];
|
|
208
|
+
}),
|
|
209
|
+
size: [rows, 1]
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
});
|