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
@@ -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
+ });