mathjs 7.2.0 → 7.5.1

Sign up to get free protection for your applications and to get access to all the features.
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,