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
@@ -9,6 +9,9 @@ import { isNegativeDocs } from './function/utils/isNegative';
9
9
  import { isIntegerDocs } from './function/utils/isInteger';
10
10
  import { isNaNDocs } from './function/utils/isNaN';
11
11
  import { formatDocs } from './function/utils/format';
12
+ import { binDocs } from './function/utils/bin';
13
+ import { octDocs } from './function/utils/oct';
14
+ import { hexDocs } from './function/utils/hex';
12
15
  import { cloneDocs } from './function/utils/clone';
13
16
  import { toDocs } from './function/units/to';
14
17
  import { tanhDocs } from './function/trigonometry/tanh';
@@ -167,11 +170,13 @@ import { addDocs } from './function/arithmetic/add';
167
170
  import { absDocs } from './function/arithmetic/abs';
168
171
  import { qrDocs } from './function/algebra/qr';
169
172
  import { usolveDocs } from './function/algebra/usolve';
173
+ import { usolveAllDocs } from './function/algebra/usolveAll';
170
174
  import { sluDocs } from './function/algebra/slu';
171
175
  import { rationalizeDocs } from './function/algebra/rationalize';
172
176
  import { simplifyDocs } from './function/algebra/simplify';
173
177
  import { lupDocs } from './function/algebra/lup';
174
178
  import { lsolveDocs } from './function/algebra/lsolve';
179
+ import { lsolveAllDocs } from './function/algebra/lsolveAll';
175
180
  import { derivativeDocs } from './function/algebra/derivative';
176
181
  import { versionDocs } from './constants/version';
177
182
  import { trueDocs } from './constants/true';
@@ -209,6 +214,7 @@ import { sinDocs } from './function/trigonometry/sin';
209
214
  import { numericDocs } from './function/utils/numeric';
210
215
  import { columnDocs } from './function/matrix/column';
211
216
  import { rowDocs } from './function/matrix/row';
217
+ import { rotationMatrixDocs } from './function/matrix/rotationMatrix';
212
218
  export var embeddedDocs = {
213
219
  // construction functions
214
220
  bignumber: bignumberDocs,
@@ -450,12 +456,14 @@ export var embeddedDocs = {
450
456
  // functions - algebra
451
457
  derivative: derivativeDocs,
452
458
  lsolve: lsolveDocs,
459
+ lsolveAll: lsolveAllDocs,
453
460
  lup: lupDocs,
454
461
  lusolve: lusolveDocs,
455
462
  simplify: simplifyDocs,
456
463
  rationalize: rationalizeDocs,
457
464
  slu: sluDocs,
458
465
  usolve: usolveDocs,
466
+ usolveAll: usolveAllDocs,
459
467
  qr: qrDocs,
460
468
  // functions - arithmetic
461
469
  abs: absDocs,
@@ -550,6 +558,7 @@ export var embeddedDocs = {
550
558
  range: rangeDocs,
551
559
  resize: resizeDocs,
552
560
  reshape: reshapeDocs,
561
+ rotationMatrix: rotationMatrixDocs,
553
562
  row: rowDocs,
554
563
  size: sizeDocs,
555
564
  sort: sortDocs,
@@ -638,6 +647,9 @@ export var embeddedDocs = {
638
647
  // functions - utils
639
648
  clone: cloneDocs,
640
649
  format: formatDocs,
650
+ bin: binDocs,
651
+ oct: octDocs,
652
+ hex: hexDocs,
641
653
  isNaN: isNaNDocs,
642
654
  isInteger: isIntegerDocs,
643
655
  isNegative: isNegativeDocs,
@@ -2,7 +2,7 @@ export var lsolveDocs = {
2
2
  name: 'lsolve',
3
3
  category: 'Algebra',
4
4
  syntax: ['x=lsolve(L, b)'],
5
- description: 'Solves the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',
5
+ description: 'Finds one solution of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',
6
6
  examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'],
7
- seealso: ['lup', 'lusolve', 'usolve', 'matrix', 'sparse']
7
+ seealso: ['lsolveAll', 'lup', 'lusolve', 'usolve', 'matrix', 'sparse']
8
8
  };
@@ -0,0 +1,8 @@
1
+ export var lsolveAllDocs = {
2
+ name: 'lsolveAll',
3
+ category: 'Algebra',
4
+ syntax: ['x=lsolveAll(L, b)'],
5
+ description: 'Finds all solutions of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',
6
+ examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'],
7
+ seealso: ['lsolve', 'lup', 'lusolve', 'usolve', 'matrix', 'sparse']
8
+ };
@@ -2,7 +2,7 @@ export var usolveDocs = {
2
2
  name: 'usolve',
3
3
  category: 'Algebra',
4
4
  syntax: ['x=usolve(U, b)'],
5
- description: 'Solves the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',
5
+ description: 'Finds one solution of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',
6
6
  examples: ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'],
7
- seealso: ['lup', 'lusolve', 'lsolve', 'matrix', 'sparse']
7
+ seealso: ['usolveAll', 'lup', 'lusolve', 'lsolve', 'matrix', 'sparse']
8
8
  };
@@ -0,0 +1,8 @@
1
+ export var usolveAllDocs = {
2
+ name: 'usolveAll',
3
+ category: 'Algebra',
4
+ syntax: ['x=usolve(U, b)'],
5
+ description: 'Finds all solutions of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',
6
+ examples: ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'],
7
+ seealso: ['usolve', 'lup', 'lusolve', 'lsolve', 'matrix', 'sparse']
8
+ };
@@ -0,0 +1,8 @@
1
+ export var rotationMatrixDocs = {
2
+ name: 'rotationMatrix',
3
+ category: 'Matrix',
4
+ syntax: ['rotationMatrix(theta)', 'rotationMatrix(theta, v)', 'rotationMatrix(theta, v, format)'],
5
+ description: 'Returns a 2-D rotation matrix (2x2) for a given angle (in radians). ' + 'Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.',
6
+ examples: ['rotationMatrix(pi / 2)', 'rotationMatrix(unit("45deg"), [0, 0, 1])', 'rotationMatrix(1, matrix([0, 0, 1]), "sparse")'],
7
+ seealso: ['cos', 'sin']
8
+ };
@@ -0,0 +1,8 @@
1
+ export var binDocs = {
2
+ name: 'bin',
3
+ category: 'Utils',
4
+ syntax: ['bin(value)'],
5
+ description: 'Format a number as binary',
6
+ examples: ['bin(2)'],
7
+ seealso: ['oct', 'hex']
8
+ };
@@ -0,0 +1,8 @@
1
+ export var hexDocs = {
2
+ name: 'hex',
3
+ category: 'Utils',
4
+ syntax: ['hex(value)'],
5
+ description: 'Format a number as hexadecimal',
6
+ examples: ['hex(240)'],
7
+ seealso: ['bin', 'oct']
8
+ };
@@ -0,0 +1,8 @@
1
+ export var octDocs = {
2
+ name: 'oct',
3
+ category: 'Utils',
4
+ syntax: ['oct(value)'],
5
+ description: 'Format a number as octal',
6
+ examples: ['oct(56)'],
7
+ seealso: ['bin', 'hex']
8
+ };
@@ -302,7 +302,24 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, function (_r
302
302
 
303
303
 
304
304
  if (parse.isDigitDot(c1)) {
305
- state.tokenType = TOKENTYPE.NUMBER; // get number, can have a single dot
305
+ state.tokenType = TOKENTYPE.NUMBER; // check for binary, octal, or hex
306
+
307
+ var _c = currentString(state, 2);
308
+
309
+ if (_c === '0b' || _c === '0o' || _c === '0x') {
310
+ state.token += currentCharacter(state);
311
+ next(state);
312
+ state.token += currentCharacter(state);
313
+ next(state);
314
+
315
+ while (parse.isHexDigit(currentCharacter(state))) {
316
+ state.token += currentCharacter(state);
317
+ next(state);
318
+ }
319
+
320
+ return;
321
+ } // get number, can have a single dot
322
+
306
323
 
307
324
  if (currentCharacter(state) === '.') {
308
325
  state.token += currentCharacter(state);
@@ -514,6 +531,16 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, function (_r
514
531
  parse.isDigit = function isDigit(c) {
515
532
  return c >= '0' && c <= '9';
516
533
  };
534
+ /**
535
+ * checks if the given char c is a hex digit
536
+ * @param {string} c a string with one character
537
+ * @return {boolean}
538
+ */
539
+
540
+
541
+ parse.isHexDigit = function isHexDigit(c) {
542
+ return c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F';
543
+ };
517
544
  /**
518
545
  * Start of the parse levels below, in order of precedence
519
546
  * @return {Node} node
@@ -78,6 +78,7 @@ export { createOnes } from './function/matrix/ones';
78
78
  export { createRange } from './function/matrix/range';
79
79
  export { createReshape } from './function/matrix/reshape';
80
80
  export { createResize } from './function/matrix/resize';
81
+ export { createRotationMatrix } from './function/matrix/rotationMatrix';
81
82
  export { createRow } from './function/matrix/row';
82
83
  export { createSize } from './function/matrix/size';
83
84
  export { createSqueeze } from './function/matrix/squeeze';
@@ -89,6 +90,9 @@ export { createErf } from './function/special/erf';
89
90
  export { createMode } from './function/statistics/mode';
90
91
  export { createProd } from './function/statistics/prod';
91
92
  export { createFormat } from './function/string/format';
93
+ export { createBin } from './function/string/bin';
94
+ export { createOct } from './function/string/oct';
95
+ export { createHex } from './function/string/hex';
92
96
  export { createPrint } from './function/string/print';
93
97
  export { createTo } from './function/unit/to';
94
98
  export { createIsPrime } from './function/utils/isPrime';
@@ -103,6 +107,8 @@ export { createDotPow } from './function/arithmetic/dotPow';
103
107
  export { createDotDivide } from './function/arithmetic/dotDivide';
104
108
  export { createLsolve } from './function/algebra/solver/lsolve';
105
109
  export { createUsolve } from './function/algebra/solver/usolve';
110
+ export { createLsolveAll } from './function/algebra/solver/lsolveAll';
111
+ export { createUsolveAll } from './function/algebra/solver/usolveAll';
106
112
  export { createLeftShift } from './function/bitwise/leftShift';
107
113
  export { createRightArithShift } from './function/bitwise/rightArithShift';
108
114
  export { createRightLogShift } from './function/bitwise/rightLogShift';
@@ -14,7 +14,7 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
14
14
  DenseMatrix: DenseMatrix
15
15
  });
16
16
  /**
17
- * Solves the linear equation system by forwards substitution. Matrix must be a lower triangular matrix.
17
+ * Finds one solution of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix. Throws an error if there's no solution.
18
18
  *
19
19
  * `L * x = b`
20
20
  *
@@ -30,7 +30,7 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
30
30
  *
31
31
  * See also:
32
32
  *
33
- * lup, slu, usolve, lusolve
33
+ * lsolveAll, lup, slu, usolve, lusolve
34
34
  *
35
35
  * @param {Matrix, Array} L A N x N matrix or array (L)
36
36
  * @param {Matrix, Array} b A column vector with the b values
@@ -40,19 +40,15 @@ export var createLsolve = /* #__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 _sparseForwardSubstitution(m, b);
45
44
  },
46
45
  'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
47
- // process matrix
48
46
  return _denseForwardSubstitution(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 = _denseForwardSubstitution(m, b); // result
49
+ var m = matrix(a);
55
50
 
51
+ var r = _denseForwardSubstitution(m, b);
56
52
 
57
53
  return r.valueOf();
58
54
  }
@@ -60,48 +56,38 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
60
56
 
61
57
  function _denseForwardSubstitution(m, b) {
62
58
  // 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
-
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 = []; // data
71
-
72
- var data = m._data; // forward solve m * x = b, loop columns
64
+ var x = [];
65
+ var mdata = m._data; // loop columns
73
66
 
74
67
  for (var j = 0; j < columns; j++) {
75
- // b[j]
76
- var bj = bdata[j][0] || 0; // x[j]
77
-
78
- var xj = void 0; // forward substitution (outer product) avoids inner looping when bj === 0
68
+ var bj = bdata[j][0] || 0;
69
+ var xj = void 0;
79
70
 
80
71
  if (!equalScalar(bj, 0)) {
81
- // value @ [j, j]
82
- var vjj = data[j][j]; // check vjj
72
+ // non-degenerate row, find solution
73
+ var vjj = mdata[j][j];
83
74
 
84
75
  if (equalScalar(vjj, 0)) {
85
- // system cannot be solved
86
76
  throw new Error('Linear system cannot be solved since matrix is singular');
87
- } // calculate xj
88
-
77
+ }
89
78
 
90
79
  xj = divideScalar(bj, vjj); // loop rows
91
80
 
92
81
  for (var i = j + 1; i < rows; i++) {
93
- // update copy of b
94
- bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, data[i][j]))];
82
+ bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
95
83
  }
96
84
  } else {
97
- // zero @ j
85
+ // degenerate row, we can choose any value
98
86
  xj = 0;
99
- } // update x
100
-
87
+ }
101
88
 
102
89
  x[j] = [xj];
103
- } // return vector
104
-
90
+ }
105
91
 
106
92
  return new DenseMatrix({
107
93
  data: x,
@@ -111,72 +97,59 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
111
97
 
112
98
  function _sparseForwardSubstitution(m, b) {
113
99
  // 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
-
100
+ b = solveValidation(m, b, true);
101
+ var bdata = b._data;
118
102
  var rows = m._size[0];
119
- var columns = m._size[1]; // matrix arrays
120
-
103
+ var columns = m._size[1];
121
104
  var values = m._values;
122
105
  var index = m._index;
123
- var ptr = m._ptr; // vars
106
+ var ptr = m._ptr; // result
124
107
 
125
- var i, k; // result
126
-
127
- var x = []; // forward solve m * x = b, loop columns
108
+ var x = []; // loop columns
128
109
 
129
110
  for (var j = 0; j < columns; j++) {
130
- // b[j]
131
- var bj = bdata[j][0] || 0; // forward substitution (outer product) avoids inner looping when bj === 0
111
+ var bj = bdata[j][0] || 0;
132
112
 
133
113
  if (!equalScalar(bj, 0)) {
134
- // value @ [j, j]
135
- var vjj = 0; // lower triangular matrix values & index (column j)
114
+ // non-degenerate row, find solution
115
+ var vjj = 0; // matrix values & indices (column j)
136
116
 
137
- var jvalues = [];
138
- var jindex = []; // last index in column
117
+ var jValues = [];
118
+ var jIndices = []; // first and last index in the column
139
119
 
140
- var l = ptr[j + 1]; // values in column, find value @ [j, j]
120
+ var firstIndex = ptr[j];
121
+ var lastIndex = ptr[j + 1]; // values in column, find value at [j, j]
141
122
 
142
- for (k = ptr[j]; k < l; k++) {
143
- // row
144
- i = index[k]; // check row (rows are not sorted!)
123
+ for (var k = firstIndex; k < lastIndex; k++) {
124
+ var i = index[k]; // check row (rows are not sorted!)
145
125
 
146
126
  if (i === j) {
147
- // update vjj
148
127
  vjj = values[k];
149
128
  } else if (i > j) {
150
129
  // store lower triangular
151
- jvalues.push(values[k]);
152
- jindex.push(i);
130
+ jValues.push(values[k]);
131
+ jIndices.push(i);
153
132
  }
154
- } // at this point we must have a value @ [j, j]
133
+ } // at this point we must have a value in vjj
155
134
 
156
135
 
157
136
  if (equalScalar(vjj, 0)) {
158
- // system cannot be solved, there is no value @ [j, j]
159
137
  throw new Error('Linear system cannot be solved since matrix is singular');
160
- } // calculate xj
161
-
162
-
163
- var xj = divideScalar(bj, vjj); // loop lower triangular
164
-
165
- for (k = 0, l = jindex.length; k < l; k++) {
166
- // row
167
- i = jindex[k]; // update copy of b
138
+ }
168
139
 
169
- bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, jvalues[k]))];
170
- } // update x
140
+ var xj = divideScalar(bj, vjj);
171
141
 
142
+ for (var _k = 0, l = jIndices.length; _k < l; _k++) {
143
+ var _i = jIndices[_k];
144
+ bdata[_i] = [subtract(bdata[_i][0] || 0, multiplyScalar(xj, jValues[_k]))];
145
+ }
172
146
 
173
147
  x[j] = [xj];
174
148
  } else {
175
- // update x
149
+ // degenerate row, we can choose any value
176
150
  x[j] = [0];
177
151
  }
178
- } // return vector
179
-
152
+ }
180
153
 
181
154
  return new DenseMatrix({
182
155
  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 = 'lsolveAll';
16
+ var dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];
17
+ export var createLsolveAll = /* #__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 forwards substitution. Matrix must be a lower triangular matrix.
30
+ *
31
+ * `L * x = b`
32
+ *
33
+ * Syntax:
34
+ *
35
+ * math.lsolve(L, b)
36
+ *
37
+ * Examples:
38
+ *
39
+ * const a = [[-2, 3], [2, 1]]
40
+ * const b = [11, 9]
41
+ * const x = lsolve(a, b) // [ [[-5.5], [20]] ]
42
+ *
43
+ * See also:
44
+ *
45
+ * lsolve, lup, slu, usolve, lusolve
46
+ *
47
+ * @param {Matrix, Array} L A N x N matrix or array (L)
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 _sparseForwardSubstitution(m, b);
56
+ },
57
+ 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
58
+ return _denseForwardSubstitution(m, b);
59
+ },
60
+ 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
61
+ var m = matrix(a);
62
+
63
+ var R = _denseForwardSubstitution(m, b);
64
+
65
+ return R.map(function (r) {
66
+ return r.valueOf();
67
+ });
68
+ }
69
+ });
70
+
71
+ function _denseForwardSubstitution(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
81
+
82
+ for (var i = 0; i < columns; 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 < columns; 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 < columns; _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 _sparseForwardSubstitution(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
142
+
143
+ for (var i = 0; i < columns; 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 = firstIndex; j < lastIndex; j++) {
158
+ var J = index[j]; // check row
159
+
160
+ if (J === i) {
161
+ Mii = values[j];
162
+ } else if (J > i) {
163
+ // store lower 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);
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;
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
+ });