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.
Files changed (159) hide show
  1. package/HISTORY.md +34 -0
  2. package/dist/math.js +3421 -2476
  3. package/dist/math.min.js +5 -5
  4. package/dist/math.min.map +1 -1
  5. package/docs/expressions/syntax.md +30 -4
  6. package/docs/reference/functions/bin.md +38 -0
  7. package/docs/reference/functions/ceil.md +10 -1
  8. package/docs/reference/functions/fix.md +10 -2
  9. package/docs/reference/functions/floor.md +12 -3
  10. package/docs/reference/functions/hex.md +38 -0
  11. package/docs/reference/functions/lsolve.md +2 -1
  12. package/docs/reference/functions/lsolveAll.md +45 -0
  13. package/docs/reference/functions/oct.md +38 -0
  14. package/docs/reference/functions/rotationMatrix.md +51 -0
  15. package/docs/reference/functions/round.md +6 -2
  16. package/docs/reference/functions/usolve.md +2 -1
  17. package/docs/reference/functions/usolveAll.md +45 -0
  18. package/docs/reference/functions.md +8 -2
  19. package/es/entry/dependenciesAny/dependenciesBin.generated.js +10 -0
  20. package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  21. package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
  22. package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  23. package/es/entry/dependenciesAny/dependenciesHex.generated.js +10 -0
  24. package/es/entry/dependenciesAny/dependenciesLsolveAll.generated.js +22 -0
  25. package/es/entry/dependenciesAny/dependenciesOct.generated.js +10 -0
  26. package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
  27. package/es/entry/dependenciesAny/dependenciesUsolveAll.generated.js +22 -0
  28. package/es/entry/dependenciesAny.generated.js +6 -0
  29. package/es/entry/impureFunctionsAny.generated.js +63 -57
  30. package/es/entry/pureFunctionsAny.generated.js +323 -277
  31. package/es/expression/embeddedDocs/embeddedDocs.js +12 -0
  32. package/es/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  33. package/es/expression/embeddedDocs/function/algebra/lsolveAll.js +8 -0
  34. package/es/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  35. package/es/expression/embeddedDocs/function/algebra/usolveAll.js +8 -0
  36. package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
  37. package/es/expression/embeddedDocs/function/utils/bin.js +8 -0
  38. package/es/expression/embeddedDocs/function/utils/hex.js +8 -0
  39. package/es/expression/embeddedDocs/function/utils/oct.js +8 -0
  40. package/es/expression/parse.js +28 -1
  41. package/es/factoriesAny.js +6 -0
  42. package/es/function/algebra/solver/lsolve.js +42 -69
  43. package/es/function/algebra/solver/lsolveAll.js +213 -0
  44. package/es/function/algebra/solver/lusolve.js +12 -27
  45. package/es/function/algebra/solver/usolve.js +41 -64
  46. package/es/function/algebra/solver/usolveAll.js +213 -0
  47. package/es/function/algebra/solver/utils/solveValidation.js +66 -107
  48. package/es/function/arithmetic/ceil.js +88 -4
  49. package/es/function/arithmetic/fix.js +43 -6
  50. package/es/function/arithmetic/floor.js +90 -6
  51. package/es/function/arithmetic/mod.js +10 -1
  52. package/es/function/arithmetic/round.js +6 -2
  53. package/es/function/matrix/rotationMatrix.js +175 -0
  54. package/es/function/matrix/sqrtm.js +4 -0
  55. package/es/function/probability/pickRandom.js +2 -6
  56. package/es/function/statistics/variance.js +4 -4
  57. package/es/function/string/baseUtils.js +36 -0
  58. package/es/function/string/bin.js +23 -0
  59. package/es/function/string/hex.js +23 -0
  60. package/es/function/string/oct.js +23 -0
  61. package/es/type/bignumber/BigNumber.js +4 -1
  62. package/es/type/number.js +10 -0
  63. package/es/utils/object.js +3 -1
  64. package/es/version.js +1 -1
  65. package/examples/advanced/web_server/math_worker.js +1 -1
  66. package/lib/entry/dependenciesAny/dependenciesBin.generated.js +20 -0
  67. package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
  68. package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
  69. package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
  70. package/lib/entry/dependenciesAny/dependenciesHex.generated.js +20 -0
  71. package/lib/entry/dependenciesAny/dependenciesLsolveAll.generated.js +38 -0
  72. package/lib/entry/dependenciesAny/dependenciesOct.generated.js +20 -0
  73. package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
  74. package/lib/entry/dependenciesAny/dependenciesUsolveAll.generated.js +38 -0
  75. package/lib/entry/dependenciesAny.generated.js +48 -0
  76. package/lib/entry/impureFunctionsAny.generated.js +65 -59
  77. package/lib/entry/pureFunctionsAny.generated.js +373 -321
  78. package/lib/expression/embeddedDocs/embeddedDocs.js +18 -0
  79. package/lib/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  80. package/lib/expression/embeddedDocs/function/algebra/lsolveAll.js +15 -0
  81. package/lib/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  82. package/lib/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
  83. package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
  84. package/lib/expression/embeddedDocs/function/utils/bin.js +15 -0
  85. package/lib/expression/embeddedDocs/function/utils/hex.js +15 -0
  86. package/lib/expression/embeddedDocs/function/utils/oct.js +15 -0
  87. package/lib/expression/parse.js +28 -1
  88. package/lib/factoriesAny.js +48 -0
  89. package/lib/function/algebra/solver/lsolve.js +42 -69
  90. package/lib/function/algebra/solver/lsolveAll.js +223 -0
  91. package/lib/function/algebra/solver/lusolve.js +12 -27
  92. package/lib/function/algebra/solver/usolve.js +41 -64
  93. package/lib/function/algebra/solver/usolveAll.js +223 -0
  94. package/lib/function/algebra/solver/utils/solveValidation.js +65 -106
  95. package/lib/function/arithmetic/ceil.js +91 -4
  96. package/lib/function/arithmetic/fix.js +44 -6
  97. package/lib/function/arithmetic/floor.js +93 -6
  98. package/lib/function/arithmetic/mod.js +10 -1
  99. package/lib/function/arithmetic/round.js +6 -2
  100. package/lib/function/matrix/rotationMatrix.js +185 -0
  101. package/lib/function/matrix/sqrtm.js +4 -0
  102. package/lib/function/probability/pickRandom.js +3 -7
  103. package/lib/function/statistics/variance.js +4 -4
  104. package/lib/function/string/baseUtils.js +45 -0
  105. package/lib/function/string/bin.js +31 -0
  106. package/lib/function/string/hex.js +31 -0
  107. package/lib/function/string/oct.js +31 -0
  108. package/lib/header.js +2 -2
  109. package/lib/type/bignumber/BigNumber.js +3 -1
  110. package/lib/type/number.js +10 -0
  111. package/lib/utils/object.js +3 -1
  112. package/lib/version.js +1 -1
  113. package/package.json +12 -12
  114. package/src/entry/dependenciesAny/dependenciesBin.generated.js +11 -0
  115. package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  116. package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
  117. package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  118. package/src/entry/dependenciesAny/dependenciesHex.generated.js +11 -0
  119. package/src/entry/dependenciesAny/dependenciesLsolveAll.generated.js +23 -0
  120. package/src/entry/dependenciesAny/dependenciesOct.generated.js +11 -0
  121. package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
  122. package/src/entry/dependenciesAny/dependenciesUsolveAll.generated.js +23 -0
  123. package/src/entry/dependenciesAny.generated.js +6 -0
  124. package/src/entry/impureFunctionsAny.generated.js +104 -92
  125. package/src/entry/pureFunctionsAny.generated.js +94 -82
  126. package/src/expression/embeddedDocs/embeddedDocs.js +12 -0
  127. package/src/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  128. package/src/expression/embeddedDocs/function/algebra/lsolveAll.js +17 -0
  129. package/src/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  130. package/src/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
  131. package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
  132. package/src/expression/embeddedDocs/function/utils/bin.js +12 -0
  133. package/src/expression/embeddedDocs/function/utils/hex.js +12 -0
  134. package/src/expression/embeddedDocs/function/utils/oct.js +12 -0
  135. package/src/expression/parse.js +25 -0
  136. package/src/factoriesAny.js +6 -0
  137. package/src/function/algebra/solver/lsolve.js +52 -58
  138. package/src/function/algebra/solver/lsolveAll.js +197 -0
  139. package/src/function/algebra/solver/lusolve.js +9 -19
  140. package/src/function/algebra/solver/usolve.js +52 -55
  141. package/src/function/algebra/solver/usolveAll.js +199 -0
  142. package/src/function/algebra/solver/utils/solveValidation.js +78 -86
  143. package/src/function/arithmetic/ceil.js +63 -3
  144. package/src/function/arithmetic/fix.js +45 -6
  145. package/src/function/arithmetic/floor.js +65 -5
  146. package/src/function/arithmetic/mod.js +8 -1
  147. package/src/function/arithmetic/round.js +6 -2
  148. package/src/function/matrix/rotationMatrix.js +185 -0
  149. package/src/function/matrix/sqrtm.js +4 -0
  150. package/src/function/probability/pickRandom.js +2 -6
  151. package/src/function/statistics/variance.js +4 -4
  152. package/src/function/string/baseUtils.js +29 -0
  153. package/src/function/string/bin.js +23 -0
  154. package/src/function/string/hex.js +23 -0
  155. package/src/function/string/oct.js +24 -0
  156. package/src/type/bignumber/BigNumber.js +2 -1
  157. package/src/type/number.js +9 -1
  158. package/src/utils/object.js +3 -1
  159. 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
- // convert a to matrix
55
- a = matrix(a); // matrix lup decomposition
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
- // matrix lup decomposition
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
- // matrix lup decomposition
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
- // matrix lu decomposition
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
- } // check array
93
-
81
+ }
94
82
 
95
83
  if (isArray(a)) {
96
84
  return matrix(a);
97
- } // throw
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 L, U, P
91
+ // verify decomposition
105
92
  l = _toMatrix(l);
106
- u = _toMatrix(u); // validate matrix and vector
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
- } // return solution
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
- * Solves the linear equation system by backward substitution. Matrix must be an upper triangular matrix.
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
- // create dense matrix from array
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
- // validate matrix and vector, return copy of column vector b
63
- b = solveValidation(m, b, true); // column vector data
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 = []; // arrays
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; // backward substitution (outer product) avoids inner looping when bj === 0
71
+ var xj = void 0;
79
72
 
80
73
  if (!equalScalar(bj, 0)) {
81
- // value @ [j, j]
82
- var vjj = data[j][j]; // check 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
- } // calculate xj
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, data[i][j]))];
86
+ bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
95
87
  }
96
88
  } else {
97
- // zero value @ j
89
+ // zero value at j
98
90
  xj = 0;
99
91
  } // update x
100
92
 
101
93
 
102
94
  x[j] = [xj];
103
- } // return column vector
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
- // validate matrix and vector, return copy of column vector b
114
- b = solveValidation(m, b, true); // column vector data
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]; // matrix arrays
120
-
108
+ var columns = m._size[1];
121
109
  var values = m._values;
122
110
  var index = m._index;
123
- var ptr = m._ptr; // vars
124
-
125
- var i, k; // result
111
+ var ptr = m._ptr; // result
126
112
 
127
- var x = []; // backward solve m * x = b, loop columns (backwards)
113
+ var x = []; // loop columns backwards
128
114
 
129
115
  for (var j = columns - 1; j >= 0; j--) {
130
- // b[j]
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
- // value @ [j, j]
119
+ // non-degenerate row, find solution
135
120
  var vjj = 0; // upper triangular matrix values & index (column j)
136
121
 
137
- var jvalues = [];
138
- var jindex = []; // first & last indeces in column
122
+ var jValues = [];
123
+ var jIndices = []; // first & last indeces in column
139
124
 
140
- var f = ptr[j];
141
- var l = ptr[j + 1]; // values in column, find value @ [j, j], loop backwards
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 = l - 1; k >= f; 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
- jvalues.push(values[k]);
153
- jindex.push(i);
135
+ jValues.push(values[k]);
136
+ jIndices.push(i);
154
137
  }
155
- } // at this point we must have a value @ [j, j]
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
- } // calculate xj
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
- bdata[i] = [subtract(bdata[i][0], multiplyScalar(xj, jvalues[k]))];
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
- // update x
154
+ // degenerate row, we can choose any value
177
155
  x[j] = [0];
178
156
  }
179
- } // return vector
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
+ });