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
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createLsolveAll = void 0;
7
+
8
+ var _factory = require("../../../utils/factory");
9
+
10
+ var _solveValidation = require("./utils/solveValidation");
11
+
12
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
13
+
14
+ 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."); }
15
+
16
+ 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); }
17
+
18
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
19
+
20
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
21
+
22
+ 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; }
23
+
24
+ var name = 'lsolveAll';
25
+ var dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];
26
+ var createLsolveAll = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
27
+ var typed = _ref.typed,
28
+ matrix = _ref.matrix,
29
+ divideScalar = _ref.divideScalar,
30
+ multiplyScalar = _ref.multiplyScalar,
31
+ subtract = _ref.subtract,
32
+ equalScalar = _ref.equalScalar,
33
+ DenseMatrix = _ref.DenseMatrix;
34
+ var solveValidation = (0, _solveValidation.createSolveValidation)({
35
+ DenseMatrix: DenseMatrix
36
+ });
37
+ /**
38
+ * Finds all solutions of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix.
39
+ *
40
+ * `L * x = b`
41
+ *
42
+ * Syntax:
43
+ *
44
+ * math.lsolve(L, b)
45
+ *
46
+ * Examples:
47
+ *
48
+ * const a = [[-2, 3], [2, 1]]
49
+ * const b = [11, 9]
50
+ * const x = lsolve(a, b) // [ [[-5.5], [20]] ]
51
+ *
52
+ * See also:
53
+ *
54
+ * lsolve, lup, slu, usolve, lusolve
55
+ *
56
+ * @param {Matrix, Array} L A N x N matrix or array (L)
57
+ * @param {Matrix, Array} b A column vector with the b values
58
+ *
59
+ * @return {DenseMatrix[] | Array[]} An array of affine-independent column vectors (x) that solve the linear system
60
+ */
61
+
62
+ return typed(name, {
63
+ 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
64
+ return _sparseForwardSubstitution(m, b);
65
+ },
66
+ 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
67
+ return _denseForwardSubstitution(m, b);
68
+ },
69
+ 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
70
+ var m = matrix(a);
71
+
72
+ var R = _denseForwardSubstitution(m, b);
73
+
74
+ return R.map(function (r) {
75
+ return r.valueOf();
76
+ });
77
+ }
78
+ });
79
+
80
+ function _denseForwardSubstitution(m, b_) {
81
+ // the algorithm is derived from
82
+ // https://www.overleaf.com/project/5e6c87c554a3190001a3fc93
83
+ // array of right-hand sides
84
+ var B = [solveValidation(m, b_, true)._data.map(function (e) {
85
+ return e[0];
86
+ })];
87
+ var M = m._data;
88
+ var rows = m._size[0];
89
+ var columns = m._size[1]; // loop columns
90
+
91
+ for (var i = 0; i < columns; i++) {
92
+ var L = B.length; // loop right-hand sides
93
+
94
+ for (var k = 0; k < L; k++) {
95
+ var b = B[k];
96
+
97
+ if (!equalScalar(M[i][i], 0)) {
98
+ // non-singular row
99
+ b[i] = divideScalar(b[i], M[i][i]);
100
+
101
+ for (var j = i + 1; j < columns; j++) {
102
+ // b[j] -= b[i] * M[j,i]
103
+ b[j] = subtract(b[j], multiplyScalar(b[i], M[j][i]));
104
+ }
105
+ } else if (!equalScalar(b[i], 0)) {
106
+ // singular row, nonzero RHS
107
+ if (k === 0) {
108
+ // There is no valid solution
109
+ return [];
110
+ } else {
111
+ // This RHS is invalid but other solutions may still exist
112
+ B.splice(k, 1);
113
+ k -= 1;
114
+ L -= 1;
115
+ }
116
+ } else if (k === 0) {
117
+ // singular row, RHS is zero
118
+ var bNew = _toConsumableArray(b);
119
+
120
+ bNew[i] = 1;
121
+
122
+ for (var _j = i + 1; _j < columns; _j++) {
123
+ bNew[_j] = subtract(bNew[_j], M[_j][i]);
124
+ }
125
+
126
+ B.push(bNew);
127
+ }
128
+ }
129
+ }
130
+
131
+ return B.map(function (x) {
132
+ return new DenseMatrix({
133
+ data: x.map(function (e) {
134
+ return [e];
135
+ }),
136
+ size: [rows, 1]
137
+ });
138
+ });
139
+ }
140
+
141
+ function _sparseForwardSubstitution(m, b_) {
142
+ // array of right-hand sides
143
+ var B = [solveValidation(m, b_, true)._data.map(function (e) {
144
+ return e[0];
145
+ })];
146
+ var rows = m._size[0];
147
+ var columns = m._size[1];
148
+ var values = m._values;
149
+ var index = m._index;
150
+ var ptr = m._ptr; // loop columns
151
+
152
+ for (var i = 0; i < columns; i++) {
153
+ var L = B.length; // loop right-hand sides
154
+
155
+ for (var k = 0; k < L; k++) {
156
+ var b = B[k]; // values & indices (column i)
157
+
158
+ var iValues = [];
159
+ var iIndices = []; // first & last indeces in column
160
+
161
+ var firstIndex = ptr[i];
162
+ var lastIndex = ptr[i + 1]; // find the value at [i, i]
163
+
164
+ var Mii = 0;
165
+
166
+ for (var j = firstIndex; j < lastIndex; j++) {
167
+ var J = index[j]; // check row
168
+
169
+ if (J === i) {
170
+ Mii = values[j];
171
+ } else if (J > i) {
172
+ // store lower triangular
173
+ iValues.push(values[j]);
174
+ iIndices.push(J);
175
+ }
176
+ }
177
+
178
+ if (!equalScalar(Mii, 0)) {
179
+ // non-singular row
180
+ b[i] = divideScalar(b[i], Mii);
181
+
182
+ for (var _j2 = 0, _lastIndex = iIndices.length; _j2 < _lastIndex; _j2++) {
183
+ var _J = iIndices[_j2];
184
+ b[_J] = subtract(b[_J], multiplyScalar(b[i], iValues[_j2]));
185
+ }
186
+ } else if (!equalScalar(b[i], 0)) {
187
+ // singular row, nonzero RHS
188
+ if (k === 0) {
189
+ // There is no valid solution
190
+ return [];
191
+ } else {
192
+ // This RHS is invalid but other solutions may still exist
193
+ B.splice(k, 1);
194
+ k -= 1;
195
+ L -= 1;
196
+ }
197
+ } else if (k === 0) {
198
+ // singular row, RHS is zero
199
+ var bNew = _toConsumableArray(b);
200
+
201
+ bNew[i] = 1;
202
+
203
+ for (var _j3 = 0, _lastIndex2 = iIndices.length; _j3 < _lastIndex2; _j3++) {
204
+ var _J2 = iIndices[_j3];
205
+ bNew[_J2] = subtract(bNew[_J2], iValues[_j3]);
206
+ }
207
+
208
+ B.push(bNew);
209
+ }
210
+ }
211
+ }
212
+
213
+ return B.map(function (x) {
214
+ return new DenseMatrix({
215
+ data: x.map(function (e) {
216
+ return [e];
217
+ }),
218
+ size: [rows, 1]
219
+ });
220
+ });
221
+ }
222
+ });
223
+ exports.createLsolveAll = createLsolveAll;
@@ -62,63 +62,49 @@ var createLusolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, fun
62
62
 
63
63
  return typed(name, {
64
64
  'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
65
- // convert a to matrix
66
- a = matrix(a); // matrix lup decomposition
67
-
68
- var d = lup(a); // solve
69
-
70
- var x = _lusolve(d.L, d.U, d.p, null, b); // convert result to array
65
+ a = matrix(a);
66
+ var d = lup(a);
71
67
 
68
+ var x = _lusolve(d.L, d.U, d.p, null, b);
72
69
 
73
70
  return x.valueOf();
74
71
  },
75
72
  'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(a, b) {
76
- // matrix lup decomposition
77
- var d = lup(a); // solve
78
-
73
+ var d = lup(a);
79
74
  return _lusolve(d.L, d.U, d.p, null, b);
80
75
  },
81
76
  'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(a, b) {
82
- // matrix lup decomposition
83
- var d = lup(a); // solve
84
-
77
+ var d = lup(a);
85
78
  return _lusolve(d.L, d.U, d.p, null, b);
86
79
  },
87
80
  'SparseMatrix, Array | Matrix, number, number': function SparseMatrixArrayMatrixNumberNumber(a, b, order, threshold) {
88
- // matrix lu decomposition
89
- var d = slu(a, order, threshold); // solve
90
-
81
+ var d = slu(a, order, threshold);
91
82
  return _lusolve(d.L, d.U, d.p, d.q, b);
92
83
  },
93
84
  'Object, Array | Matrix': function ObjectArrayMatrix(d, b) {
94
- // solve
95
85
  return _lusolve(d.L, d.U, d.p, d.q, b);
96
86
  }
97
87
  });
98
88
 
99
89
  function _toMatrix(a) {
100
- // check it is a matrix
101
90
  if ((0, _is.isMatrix)(a)) {
102
91
  return a;
103
- } // check array
104
-
92
+ }
105
93
 
106
94
  if ((0, _is.isArray)(a)) {
107
95
  return matrix(a);
108
- } // throw
109
-
96
+ }
110
97
 
111
98
  throw new TypeError('Invalid Matrix LU decomposition');
112
99
  }
113
100
 
114
101
  function _lusolve(l, u, p, q, b) {
115
- // verify L, U, P
102
+ // verify decomposition
116
103
  l = _toMatrix(l);
117
- u = _toMatrix(u); // validate matrix and vector
118
-
119
- b = solveValidation(l, b, false); // apply row permutations if needed (b is a DenseMatrix)
104
+ u = _toMatrix(u); // apply row permutations if needed (b is a DenseMatrix)
120
105
 
121
106
  if (p) {
107
+ b = solveValidation(l, b, true);
122
108
  b._data = (0, _csIpvec.csIpvec)(p, b._data);
123
109
  } // use forward substitution to resolve L * y = b
124
110
 
@@ -129,8 +115,7 @@ var createLusolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, fun
129
115
 
130
116
  if (q) {
131
117
  x._data = (0, _csIpvec.csIpvec)(q, x._data);
132
- } // return solution
133
-
118
+ }
134
119
 
135
120
  return x;
136
121
  }
@@ -23,7 +23,7 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
23
23
  DenseMatrix: DenseMatrix
24
24
  });
25
25
  /**
26
- * Solves the linear equation system by backward substitution. Matrix must be an upper triangular matrix.
26
+ * 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.
27
27
  *
28
28
  * `U * x = b`
29
29
  *
@@ -39,7 +39,7 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
39
39
  *
40
40
  * See also:
41
41
  *
42
- * lup, slu, usolve, lusolve
42
+ * usolveAll, lup, slu, usolve, lusolve
43
43
  *
44
44
  * @param {Matrix, Array} U A N x N matrix or array (U)
45
45
  * @param {Matrix, Array} b A column vector with the b values
@@ -49,68 +49,59 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
49
49
 
50
50
  return typed(name, {
51
51
  'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
52
- // process matrix
53
52
  return _sparseBackwardSubstitution(m, b);
54
53
  },
55
54
  'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
56
- // process matrix
57
55
  return _denseBackwardSubstitution(m, b);
58
56
  },
59
57
  'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
60
- // create dense matrix from array
61
- var m = matrix(a); // use matrix implementation
62
-
63
- var r = _denseBackwardSubstitution(m, b); // result
58
+ var m = matrix(a);
64
59
 
60
+ var r = _denseBackwardSubstitution(m, b);
65
61
 
66
62
  return r.valueOf();
67
63
  }
68
64
  });
69
65
 
70
66
  function _denseBackwardSubstitution(m, b) {
71
- // validate matrix and vector, return copy of column vector b
72
- b = solveValidation(m, b, true); // column vector data
73
-
74
- var bdata = b._data; // rows & columns
75
-
67
+ // make b into a column vector
68
+ b = solveValidation(m, b, true);
69
+ var bdata = b._data;
76
70
  var rows = m._size[0];
77
71
  var columns = m._size[1]; // result
78
72
 
79
- var x = []; // arrays
80
-
81
- var data = m._data; // backward solve m * x = b, loop columns (backwards)
73
+ var x = [];
74
+ var mdata = m._data; // loop columns backwards
82
75
 
83
76
  for (var j = columns - 1; j >= 0; j--) {
84
77
  // b[j]
85
78
  var bj = bdata[j][0] || 0; // x[j]
86
79
 
87
- var xj = void 0; // backward substitution (outer product) avoids inner looping when bj === 0
80
+ var xj = void 0;
88
81
 
89
82
  if (!equalScalar(bj, 0)) {
90
- // value @ [j, j]
91
- var vjj = data[j][j]; // check vjj
83
+ // value at [j, j]
84
+ var vjj = mdata[j][j];
92
85
 
93
86
  if (equalScalar(vjj, 0)) {
94
87
  // system cannot be solved
95
88
  throw new Error('Linear system cannot be solved since matrix is singular');
96
- } // calculate xj
97
-
89
+ }
98
90
 
99
91
  xj = divideScalar(bj, vjj); // loop rows
100
92
 
101
93
  for (var i = j - 1; i >= 0; i--) {
102
94
  // update copy of b
103
- bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, data[i][j]))];
95
+ bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
104
96
  }
105
97
  } else {
106
- // zero value @ j
98
+ // zero value at j
107
99
  xj = 0;
108
100
  } // update x
109
101
 
110
102
 
111
103
  x[j] = [xj];
112
- } // return column vector
113
-
104
+ }
114
105
 
115
106
  return new DenseMatrix({
116
107
  data: x,
@@ -119,74 +110,60 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
119
110
  }
120
111
 
121
112
  function _sparseBackwardSubstitution(m, b) {
122
- // validate matrix and vector, return copy of column vector b
123
- b = solveValidation(m, b, true); // column vector data
124
-
125
- var bdata = b._data; // rows & columns
126
-
113
+ // make b into a column vector
114
+ b = solveValidation(m, b, true);
115
+ var bdata = b._data;
127
116
  var rows = m._size[0];
128
- var columns = m._size[1]; // matrix arrays
129
-
117
+ var columns = m._size[1];
130
118
  var values = m._values;
131
119
  var index = m._index;
132
- var ptr = m._ptr; // vars
133
-
134
- var i, k; // result
120
+ var ptr = m._ptr; // result
135
121
 
136
- var x = []; // backward solve m * x = b, loop columns (backwards)
122
+ var x = []; // loop columns backwards
137
123
 
138
124
  for (var j = columns - 1; j >= 0; j--) {
139
- // b[j]
140
- var bj = bdata[j][0] || 0; // backward substitution (outer product) avoids inner looping when bj === 0
125
+ var bj = bdata[j][0] || 0;
141
126
 
142
127
  if (!equalScalar(bj, 0)) {
143
- // value @ [j, j]
128
+ // non-degenerate row, find solution
144
129
  var vjj = 0; // upper triangular matrix values & index (column j)
145
130
 
146
- var jvalues = [];
147
- var jindex = []; // first & last indeces in column
131
+ var jValues = [];
132
+ var jIndices = []; // first & last indeces in column
148
133
 
149
- var f = ptr[j];
150
- var l = ptr[j + 1]; // values in column, find value @ [j, j], loop backwards
134
+ var firstIndex = ptr[j];
135
+ var lastIndex = ptr[j + 1]; // values in column, find value at [j, j], loop backwards
151
136
 
152
- for (k = l - 1; k >= f; k--) {
153
- // row
154
- i = index[k]; // check row
137
+ for (var k = lastIndex - 1; k >= firstIndex; k--) {
138
+ var i = index[k]; // check row (rows are not sorted!)
155
139
 
156
140
  if (i === j) {
157
- // update vjj
158
141
  vjj = values[k];
159
142
  } else if (i < j) {
160
143
  // store upper triangular
161
- jvalues.push(values[k]);
162
- jindex.push(i);
144
+ jValues.push(values[k]);
145
+ jIndices.push(i);
163
146
  }
164
- } // at this point we must have a value @ [j, j]
147
+ } // at this point we must have a value in vjj
165
148
 
166
149
 
167
150
  if (equalScalar(vjj, 0)) {
168
- // system cannot be solved, there is no value @ [j, j]
169
151
  throw new Error('Linear system cannot be solved since matrix is singular');
170
- } // calculate xj
171
-
172
-
173
- var xj = divideScalar(bj, vjj); // loop upper triangular
174
-
175
- for (k = 0, l = jindex.length; k < l; k++) {
176
- // row
177
- i = jindex[k]; // update copy of b
152
+ }
178
153
 
179
- bdata[i] = [subtract(bdata[i][0], multiplyScalar(xj, jvalues[k]))];
180
- } // update x
154
+ var xj = divideScalar(bj, vjj);
181
155
 
156
+ for (var _k = 0, _lastIndex = jIndices.length; _k < _lastIndex; _k++) {
157
+ var _i = jIndices[_k];
158
+ bdata[_i] = [subtract(bdata[_i][0], multiplyScalar(xj, jValues[_k]))];
159
+ }
182
160
 
183
161
  x[j] = [xj];
184
162
  } else {
185
- // update x
163
+ // degenerate row, we can choose any value
186
164
  x[j] = [0];
187
165
  }
188
- } // return vector
189
-
166
+ }
190
167
 
191
168
  return new DenseMatrix({
192
169
  data: x,