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.
- package/HISTORY.md +34 -0
- package/dist/math.js +3421 -2476
- package/dist/math.min.js +5 -5
- package/dist/math.min.map +1 -1
- package/docs/expressions/syntax.md +30 -4
- package/docs/reference/functions/bin.md +38 -0
- package/docs/reference/functions/ceil.md +10 -1
- package/docs/reference/functions/fix.md +10 -2
- package/docs/reference/functions/floor.md +12 -3
- package/docs/reference/functions/hex.md +38 -0
- package/docs/reference/functions/lsolve.md +2 -1
- package/docs/reference/functions/lsolveAll.md +45 -0
- package/docs/reference/functions/oct.md +38 -0
- package/docs/reference/functions/rotationMatrix.md +51 -0
- package/docs/reference/functions/round.md +6 -2
- package/docs/reference/functions/usolve.md +2 -1
- package/docs/reference/functions/usolveAll.md +45 -0
- package/docs/reference/functions.md +8 -2
- package/es/entry/dependenciesAny/dependenciesBin.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesHex.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesLsolveAll.generated.js +22 -0
- package/es/entry/dependenciesAny/dependenciesOct.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
- package/es/entry/dependenciesAny/dependenciesUsolveAll.generated.js +22 -0
- package/es/entry/dependenciesAny.generated.js +6 -0
- package/es/entry/impureFunctionsAny.generated.js +63 -57
- package/es/entry/pureFunctionsAny.generated.js +323 -277
- package/es/expression/embeddedDocs/embeddedDocs.js +12 -0
- package/es/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/es/expression/embeddedDocs/function/algebra/lsolveAll.js +8 -0
- package/es/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/es/expression/embeddedDocs/function/algebra/usolveAll.js +8 -0
- package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
- package/es/expression/embeddedDocs/function/utils/bin.js +8 -0
- package/es/expression/embeddedDocs/function/utils/hex.js +8 -0
- package/es/expression/embeddedDocs/function/utils/oct.js +8 -0
- package/es/expression/parse.js +28 -1
- package/es/factoriesAny.js +6 -0
- package/es/function/algebra/solver/lsolve.js +42 -69
- package/es/function/algebra/solver/lsolveAll.js +213 -0
- package/es/function/algebra/solver/lusolve.js +12 -27
- package/es/function/algebra/solver/usolve.js +41 -64
- package/es/function/algebra/solver/usolveAll.js +213 -0
- package/es/function/algebra/solver/utils/solveValidation.js +66 -107
- package/es/function/arithmetic/ceil.js +88 -4
- package/es/function/arithmetic/fix.js +43 -6
- package/es/function/arithmetic/floor.js +90 -6
- package/es/function/arithmetic/mod.js +10 -1
- package/es/function/arithmetic/round.js +6 -2
- package/es/function/matrix/rotationMatrix.js +175 -0
- package/es/function/matrix/sqrtm.js +4 -0
- package/es/function/probability/pickRandom.js +2 -6
- package/es/function/statistics/variance.js +4 -4
- package/es/function/string/baseUtils.js +36 -0
- package/es/function/string/bin.js +23 -0
- package/es/function/string/hex.js +23 -0
- package/es/function/string/oct.js +23 -0
- package/es/type/bignumber/BigNumber.js +4 -1
- package/es/type/number.js +10 -0
- package/es/utils/object.js +3 -1
- package/es/version.js +1 -1
- package/examples/advanced/web_server/math_worker.js +1 -1
- package/lib/entry/dependenciesAny/dependenciesBin.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
- package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesHex.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesLsolveAll.generated.js +38 -0
- package/lib/entry/dependenciesAny/dependenciesOct.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
- package/lib/entry/dependenciesAny/dependenciesUsolveAll.generated.js +38 -0
- package/lib/entry/dependenciesAny.generated.js +48 -0
- package/lib/entry/impureFunctionsAny.generated.js +65 -59
- package/lib/entry/pureFunctionsAny.generated.js +373 -321
- package/lib/expression/embeddedDocs/embeddedDocs.js +18 -0
- package/lib/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/lib/expression/embeddedDocs/function/algebra/lsolveAll.js +15 -0
- package/lib/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/lib/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
- package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/bin.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/hex.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/oct.js +15 -0
- package/lib/expression/parse.js +28 -1
- package/lib/factoriesAny.js +48 -0
- package/lib/function/algebra/solver/lsolve.js +42 -69
- package/lib/function/algebra/solver/lsolveAll.js +223 -0
- package/lib/function/algebra/solver/lusolve.js +12 -27
- package/lib/function/algebra/solver/usolve.js +41 -64
- package/lib/function/algebra/solver/usolveAll.js +223 -0
- package/lib/function/algebra/solver/utils/solveValidation.js +65 -106
- package/lib/function/arithmetic/ceil.js +91 -4
- package/lib/function/arithmetic/fix.js +44 -6
- package/lib/function/arithmetic/floor.js +93 -6
- package/lib/function/arithmetic/mod.js +10 -1
- package/lib/function/arithmetic/round.js +6 -2
- package/lib/function/matrix/rotationMatrix.js +185 -0
- package/lib/function/matrix/sqrtm.js +4 -0
- package/lib/function/probability/pickRandom.js +3 -7
- package/lib/function/statistics/variance.js +4 -4
- package/lib/function/string/baseUtils.js +45 -0
- package/lib/function/string/bin.js +31 -0
- package/lib/function/string/hex.js +31 -0
- package/lib/function/string/oct.js +31 -0
- package/lib/header.js +2 -2
- package/lib/type/bignumber/BigNumber.js +3 -1
- package/lib/type/number.js +10 -0
- package/lib/utils/object.js +3 -1
- package/lib/version.js +1 -1
- package/package.json +12 -12
- package/src/entry/dependenciesAny/dependenciesBin.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesHex.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesLsolveAll.generated.js +23 -0
- package/src/entry/dependenciesAny/dependenciesOct.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
- package/src/entry/dependenciesAny/dependenciesUsolveAll.generated.js +23 -0
- package/src/entry/dependenciesAny.generated.js +6 -0
- package/src/entry/impureFunctionsAny.generated.js +104 -92
- package/src/entry/pureFunctionsAny.generated.js +94 -82
- package/src/expression/embeddedDocs/embeddedDocs.js +12 -0
- package/src/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/src/expression/embeddedDocs/function/algebra/lsolveAll.js +17 -0
- package/src/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/src/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
- package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
- package/src/expression/embeddedDocs/function/utils/bin.js +12 -0
- package/src/expression/embeddedDocs/function/utils/hex.js +12 -0
- package/src/expression/embeddedDocs/function/utils/oct.js +12 -0
- package/src/expression/parse.js +25 -0
- package/src/factoriesAny.js +6 -0
- package/src/function/algebra/solver/lsolve.js +52 -58
- package/src/function/algebra/solver/lsolveAll.js +197 -0
- package/src/function/algebra/solver/lusolve.js +9 -19
- package/src/function/algebra/solver/usolve.js +52 -55
- package/src/function/algebra/solver/usolveAll.js +199 -0
- package/src/function/algebra/solver/utils/solveValidation.js +78 -86
- package/src/function/arithmetic/ceil.js +63 -3
- package/src/function/arithmetic/fix.js +45 -6
- package/src/function/arithmetic/floor.js +65 -5
- package/src/function/arithmetic/mod.js +8 -1
- package/src/function/arithmetic/round.js +6 -2
- package/src/function/matrix/rotationMatrix.js +185 -0
- package/src/function/matrix/sqrtm.js +4 -0
- package/src/function/probability/pickRandom.js +2 -6
- package/src/function/statistics/variance.js +4 -4
- package/src/function/string/baseUtils.js +29 -0
- package/src/function/string/bin.js +23 -0
- package/src/function/string/hex.js +23 -0
- package/src/function/string/oct.js +24 -0
- package/src/type/bignumber/BigNumber.js +2 -1
- package/src/type/number.js +9 -1
- package/src/utils/object.js +3 -1
- 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: '
|
|
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: '
|
|
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
|
+
};
|
package/es/expression/parse.js
CHANGED
|
@@ -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; //
|
|
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
|
package/es/factoriesAny.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
|
|
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);
|
|
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 = [];
|
|
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
|
-
|
|
76
|
-
var
|
|
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
|
-
//
|
|
82
|
-
var 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
|
-
}
|
|
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
|
-
|
|
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
|
-
//
|
|
85
|
+
// degenerate row, we can choose any value
|
|
98
86
|
xj = 0;
|
|
99
|
-
}
|
|
100
|
-
|
|
87
|
+
}
|
|
101
88
|
|
|
102
89
|
x[j] = [xj];
|
|
103
|
-
}
|
|
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);
|
|
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];
|
|
120
|
-
|
|
103
|
+
var columns = m._size[1];
|
|
121
104
|
var values = m._values;
|
|
122
105
|
var index = m._index;
|
|
123
|
-
var ptr = m._ptr; //
|
|
106
|
+
var ptr = m._ptr; // result
|
|
124
107
|
|
|
125
|
-
var
|
|
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
|
-
|
|
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
|
-
//
|
|
135
|
-
var vjj = 0; //
|
|
114
|
+
// non-degenerate row, find solution
|
|
115
|
+
var vjj = 0; // matrix values & indices (column j)
|
|
136
116
|
|
|
137
|
-
var
|
|
138
|
-
var
|
|
117
|
+
var jValues = [];
|
|
118
|
+
var jIndices = []; // first and last index in the column
|
|
139
119
|
|
|
140
|
-
var
|
|
120
|
+
var firstIndex = ptr[j];
|
|
121
|
+
var lastIndex = ptr[j + 1]; // values in column, find value at [j, j]
|
|
141
122
|
|
|
142
|
-
for (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
|
-
|
|
152
|
-
|
|
130
|
+
jValues.push(values[k]);
|
|
131
|
+
jIndices.push(i);
|
|
153
132
|
}
|
|
154
|
-
} // at this point we must have a value
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
//
|
|
149
|
+
// degenerate row, we can choose any value
|
|
176
150
|
x[j] = [0];
|
|
177
151
|
}
|
|
178
|
-
}
|
|
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
|
+
});
|