mathjs 10.4.2 → 10.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 (130) hide show
  1. package/HISTORY.md +36 -0
  2. package/docs/datatypes/matrices.md +17 -0
  3. package/docs/expressions/syntax.md +11 -4
  4. package/docs/reference/functions/fix.md +1 -0
  5. package/docs/reference/functions/floor.md +4 -0
  6. package/docs/reference/functions/lgamma.md +46 -0
  7. package/docs/reference/functions/pinv.md +44 -0
  8. package/docs/reference/functions/pow.md +8 -2
  9. package/docs/reference/functions/resolve.md +2 -2
  10. package/docs/reference/functions/simplifyConstant.md +52 -0
  11. package/docs/reference/functions/stirlingS2.md +5 -1
  12. package/docs/reference/functions.md +2 -0
  13. package/lib/browser/math.js +6 -6
  14. package/lib/browser/math.js.map +1 -1
  15. package/lib/cjs/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
  16. package/lib/cjs/entry/dependenciesAny/dependenciesDet.generated.js +5 -2
  17. package/lib/cjs/entry/dependenciesAny/dependenciesFix.generated.js +9 -0
  18. package/lib/cjs/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
  19. package/lib/cjs/entry/dependenciesAny/dependenciesIndexNode.generated.js +0 -3
  20. package/lib/cjs/entry/dependenciesAny/dependenciesLgamma.generated.js +23 -0
  21. package/lib/cjs/entry/dependenciesAny/dependenciesPinv.generated.js +53 -0
  22. package/lib/cjs/entry/dependenciesAny/dependenciesPow.generated.js +3 -0
  23. package/lib/cjs/entry/dependenciesAny/dependenciesStirlingS2.generated.js +6 -0
  24. package/lib/cjs/entry/dependenciesAny.generated.js +16 -0
  25. package/lib/cjs/entry/dependenciesNumber/dependenciesCeil.generated.js +3 -0
  26. package/lib/cjs/entry/dependenciesNumber/dependenciesFix.generated.js +6 -0
  27. package/lib/cjs/entry/dependenciesNumber/dependenciesFloor.generated.js +3 -0
  28. package/lib/cjs/entry/dependenciesNumber/dependenciesIndexNode.generated.js +0 -3
  29. package/lib/cjs/entry/dependenciesNumber/dependenciesLgamma.generated.js +20 -0
  30. package/lib/cjs/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +3 -0
  31. package/lib/cjs/entry/dependenciesNumber.generated.js +8 -0
  32. package/lib/cjs/entry/impureFunctionsAny.generated.js +96 -95
  33. package/lib/cjs/entry/impureFunctionsNumber.generated.js +11 -11
  34. package/lib/cjs/entry/pureFunctionsAny.generated.js +227 -196
  35. package/lib/cjs/entry/pureFunctionsNumber.generated.js +36 -25
  36. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
  37. package/lib/cjs/expression/embeddedDocs/function/arithmetic/pow.js +1 -1
  38. package/lib/cjs/expression/embeddedDocs/function/matrix/pinv.js +15 -0
  39. package/lib/cjs/expression/embeddedDocs/function/probability/lgamma.js +15 -0
  40. package/lib/cjs/expression/node/IndexNode.js +26 -61
  41. package/lib/cjs/factoriesAny.js +16 -0
  42. package/lib/cjs/factoriesNumber.js +44 -27
  43. package/lib/cjs/function/algebra/resolve.js +3 -3
  44. package/lib/cjs/function/arithmetic/ceil.js +75 -39
  45. package/lib/cjs/function/arithmetic/fix.js +54 -16
  46. package/lib/cjs/function/arithmetic/floor.js +79 -37
  47. package/lib/cjs/function/arithmetic/nthRoot.js +1 -3
  48. package/lib/cjs/function/arithmetic/pow.js +25 -6
  49. package/lib/cjs/function/arithmetic/round.js +27 -47
  50. package/lib/cjs/function/combinatorics/stirlingS2.js +42 -12
  51. package/lib/cjs/function/matrix/det.js +37 -31
  52. package/lib/cjs/function/matrix/pinv.js +223 -0
  53. package/lib/cjs/function/probability/lgamma.js +146 -0
  54. package/lib/cjs/header.js +2 -2
  55. package/lib/cjs/plain/number/arithmetic.js +17 -31
  56. package/lib/cjs/plain/number/probability.js +43 -3
  57. package/lib/cjs/type/matrix/function/sparse.js +6 -0
  58. package/lib/cjs/utils/latex.js +6 -0
  59. package/lib/cjs/utils/lruQueue.js +1 -3
  60. package/lib/cjs/utils/number.js +17 -2
  61. package/lib/cjs/utils/object.js +3 -1
  62. package/lib/cjs/version.js +1 -1
  63. package/lib/esm/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  64. package/lib/esm/entry/dependenciesAny/dependenciesDet.generated.js +4 -2
  65. package/lib/esm/entry/dependenciesAny/dependenciesFix.generated.js +6 -0
  66. package/lib/esm/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  67. package/lib/esm/entry/dependenciesAny/dependenciesIndexNode.generated.js +0 -2
  68. package/lib/esm/entry/dependenciesAny/dependenciesLgamma.generated.js +12 -0
  69. package/lib/esm/entry/dependenciesAny/dependenciesPinv.generated.js +32 -0
  70. package/lib/esm/entry/dependenciesAny/dependenciesPow.generated.js +2 -0
  71. package/lib/esm/entry/dependenciesAny/dependenciesStirlingS2.generated.js +4 -0
  72. package/lib/esm/entry/dependenciesAny.generated.js +2 -0
  73. package/lib/esm/entry/dependenciesNumber/dependenciesCeil.generated.js +2 -0
  74. package/lib/esm/entry/dependenciesNumber/dependenciesFix.generated.js +4 -0
  75. package/lib/esm/entry/dependenciesNumber/dependenciesFloor.generated.js +2 -0
  76. package/lib/esm/entry/dependenciesNumber/dependenciesIndexNode.generated.js +0 -2
  77. package/lib/esm/entry/dependenciesNumber/dependenciesLgamma.generated.js +10 -0
  78. package/lib/esm/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +2 -0
  79. package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
  80. package/lib/esm/entry/impureFunctionsAny.generated.js +90 -89
  81. package/lib/esm/entry/impureFunctionsNumber.generated.js +12 -12
  82. package/lib/esm/entry/pureFunctionsAny.generated.js +191 -162
  83. package/lib/esm/entry/pureFunctionsNumber.generated.js +24 -14
  84. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -0
  85. package/lib/esm/expression/embeddedDocs/function/arithmetic/pow.js +1 -1
  86. package/lib/esm/expression/embeddedDocs/function/matrix/pinv.js +8 -0
  87. package/lib/esm/expression/embeddedDocs/function/probability/lgamma.js +8 -0
  88. package/lib/esm/expression/node/BlockNode.js +3 -3
  89. package/lib/esm/expression/node/IndexNode.js +22 -59
  90. package/lib/esm/expression/parse.js +5 -5
  91. package/lib/esm/factoriesAny.js +2 -0
  92. package/lib/esm/factoriesNumber.js +21 -8
  93. package/lib/esm/function/algebra/decomposition/qr.js +2 -2
  94. package/lib/esm/function/algebra/resolve.js +3 -3
  95. package/lib/esm/function/algebra/solver/utils/solveValidation.js +5 -5
  96. package/lib/esm/function/algebra/sparse/csChol.js +2 -2
  97. package/lib/esm/function/algebra/sparse/csLeaf.js +2 -2
  98. package/lib/esm/function/algebra/sparse/csLu.js +3 -3
  99. package/lib/esm/function/arithmetic/ceil.js +61 -24
  100. package/lib/esm/function/arithmetic/fix.js +51 -13
  101. package/lib/esm/function/arithmetic/floor.js +65 -23
  102. package/lib/esm/function/arithmetic/nthRoot.js +1 -3
  103. package/lib/esm/function/arithmetic/nthRoots.js +1 -1
  104. package/lib/esm/function/arithmetic/pow.js +25 -6
  105. package/lib/esm/function/arithmetic/round.js +25 -43
  106. package/lib/esm/function/combinatorics/stirlingS2.js +41 -12
  107. package/lib/esm/function/matrix/det.js +35 -31
  108. package/lib/esm/function/matrix/expm.js +2 -2
  109. package/lib/esm/function/matrix/pinv.js +205 -0
  110. package/lib/esm/function/probability/gamma.js +1 -1
  111. package/lib/esm/function/probability/lgamma.js +137 -0
  112. package/lib/esm/function/string/bin.js +1 -1
  113. package/lib/esm/function/string/hex.js +1 -1
  114. package/lib/esm/function/string/oct.js +1 -1
  115. package/lib/esm/plain/number/arithmetic.js +16 -20
  116. package/lib/esm/plain/number/probability.js +33 -1
  117. package/lib/esm/type/complex/Complex.js +2 -2
  118. package/lib/esm/type/matrix/DenseMatrix.js +2 -2
  119. package/lib/esm/type/matrix/FibonacciHeap.js +2 -2
  120. package/lib/esm/type/matrix/SparseMatrix.js +13 -13
  121. package/lib/esm/type/matrix/function/sparse.js +6 -0
  122. package/lib/esm/type/unit/Unit.js +7 -7
  123. package/lib/esm/utils/latex.js +6 -0
  124. package/lib/esm/utils/lruQueue.js +1 -2
  125. package/lib/esm/utils/number.js +16 -4
  126. package/lib/esm/utils/object.js +3 -1
  127. package/lib/esm/version.js +1 -1
  128. package/package.json +20 -9
  129. package/types/index.d.ts +1806 -1363
  130. package/types/index.ts +705 -264
@@ -1,20 +1,14 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
- exports.createRoundNumber = exports.createRound = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ exports.createRound = void 0;
11
7
 
12
8
  var _factory = require("../../utils/factory.js");
13
9
 
14
10
  var _collection = require("../../utils/collection.js");
15
11
 
16
- var _number = require("../../utils/number.js");
17
-
18
12
  var _algorithm = require("../../type/matrix/utils/algorithm11.js");
19
13
 
20
14
  var _algorithm2 = require("../../type/matrix/utils/algorithm12.js");
@@ -23,10 +17,6 @@ var _algorithm3 = require("../../type/matrix/utils/algorithm14.js");
23
17
 
24
18
  var _index = require("../../plain/number/index.js");
25
19
 
26
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
27
-
28
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
29
-
30
20
  var NO_INT = 'Number of decimals in function round must be an integer';
31
21
  var name = 'round';
32
22
  var dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'BigNumber', 'DenseMatrix'];
@@ -84,7 +74,16 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
84
74
  * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
85
75
  */
86
76
 
87
- return typed(name, _objectSpread(_objectSpread({}, roundNumberSignatures), {}, {
77
+ return typed(name, {
78
+ number: _index.roundNumber,
79
+ 'number, number': _index.roundNumber,
80
+ 'number, BigNumber': function numberBigNumber(x, n) {
81
+ if (!n.isInteger()) {
82
+ throw new TypeError(NO_INT);
83
+ }
84
+
85
+ return new BigNumber(x).toDecimalPlaces(n.toNumber());
86
+ },
88
87
  Complex: function Complex(x) {
89
88
  return x.round();
90
89
  },
@@ -104,13 +103,6 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
104
103
 
105
104
  return x.round(_n);
106
105
  },
107
- 'number, BigNumber': function numberBigNumber(x, n) {
108
- if (!n.isInteger()) {
109
- throw new TypeError(NO_INT);
110
- }
111
-
112
- return new BigNumber(x).toDecimalPlaces(n.toNumber());
113
- },
114
106
  BigNumber: function BigNumber(x) {
115
107
  return x.toDecimalPlaces(0);
116
108
  },
@@ -131,6 +123,13 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
131
123
 
132
124
  return x.round(n);
133
125
  },
126
+ 'Fraction, BigNumber': function FractionBigNumber(x, n) {
127
+ if (!n.isInteger()) {
128
+ throw new TypeError(NO_INT);
129
+ }
130
+
131
+ return x.round(n.toNumber());
132
+ },
134
133
  'Array | Matrix': function ArrayMatrix(x) {
135
134
  // deep map collection, skip zeros since round(0) = 0
136
135
  return (0, _collection.deepMap)(x, this, true);
@@ -141,7 +140,11 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
141
140
  'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) {
142
141
  return algorithm14(x, y, this, false);
143
142
  },
144
- 'number | Complex | BigNumber, SparseMatrix': function numberComplexBigNumberSparseMatrix(x, y) {
143
+ 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) {
144
+ // use matrix implementation
145
+ return algorithm14(matrix(x), y, this, false).valueOf();
146
+ },
147
+ 'number | Complex | BigNumber | Fraction, SparseMatrix': function numberComplexBigNumberFractionSparseMatrix(x, y) {
145
148
  // check scalar is zero
146
149
  if (equalScalar(x, 0)) {
147
150
  // do not execute algorithm, result will be a zero matrix
@@ -150,7 +153,7 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
150
153
 
151
154
  return algorithm12(y, x, this, true);
152
155
  },
153
- 'number | Complex | BigNumber, DenseMatrix': function numberComplexBigNumberDenseMatrix(x, y) {
156
+ 'number | Complex | BigNumber | Fraction, DenseMatrix': function numberComplexBigNumberFractionDenseMatrix(x, y) {
154
157
  // check scalar is zero
155
158
  if (equalScalar(x, 0)) {
156
159
  // do not execute algorithm, result will be a zero matrix
@@ -159,33 +162,10 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
159
162
 
160
163
  return algorithm14(y, x, this, true);
161
164
  },
162
- 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) {
163
- // use matrix implementation
164
- return algorithm14(matrix(x), y, this, false).valueOf();
165
- },
166
- 'number | Complex | BigNumber, Array': function numberComplexBigNumberArray(x, y) {
165
+ 'number | Complex | BigNumber | Fraction, Array': function numberComplexBigNumberFractionArray(x, y) {
167
166
  // use matrix implementation
168
167
  return algorithm14(matrix(y), x, this, true).valueOf();
169
168
  }
170
- }));
171
- });
172
- exports.createRound = createRound;
173
- var roundNumberSignatures = {
174
- number: _index.roundNumber,
175
- 'number, number': function numberNumber(x, n) {
176
- if (!(0, _number.isInteger)(n)) {
177
- throw new TypeError(NO_INT);
178
- }
179
-
180
- if (n < 0 || n > 15) {
181
- throw new Error('Number of decimals in function round must be in the range of 0-15');
182
- }
183
-
184
- return (0, _index.roundNumber)(x, n);
185
- }
186
- };
187
- var createRoundNumber = /* #__PURE__ */(0, _factory.factory)(name, ['typed'], function (_ref2) {
188
- var typed = _ref2.typed;
189
- return typed(name, roundNumberSignatures);
169
+ });
190
170
  });
191
- exports.createRoundNumber = createRoundNumber;
171
+ exports.createRound = createRound;
@@ -7,8 +7,10 @@ exports.createStirlingS2 = void 0;
7
7
 
8
8
  var _factory = require("../../utils/factory.js");
9
9
 
10
+ var _is = require("../../utils/is.js");
11
+
10
12
  var name = 'stirlingS2';
11
- var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'larger'];
13
+ var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'number', '?bignumber', 'larger'];
12
14
  var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
13
15
  var typed = _ref.typed,
14
16
  addScalar = _ref.addScalar,
@@ -20,15 +22,22 @@ var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
20
22
  combinations = _ref.combinations,
21
23
  isNegative = _ref.isNegative,
22
24
  isInteger = _ref.isInteger,
25
+ number = _ref.number,
26
+ bignumber = _ref.bignumber,
23
27
  larger = _ref.larger;
24
-
28
+ var smallCache = [];
29
+ var bigCache = [];
25
30
  /**
26
31
  * The Stirling numbers of the second kind, counts the number of ways to partition
27
32
  * a set of n labelled objects into k nonempty unlabelled subsets.
28
33
  * stirlingS2 only takes integer arguments.
29
34
  * The following condition must be enforced: k <= n.
30
35
  *
31
- * If n = k or k = 1, then s(n,k) = 1
36
+ * If n = k or k = 1 <= n, then s(n,k) = 1
37
+ * If k = 0 < n, then s(n,k) = 0
38
+ *
39
+ * Note that if either n or k is supplied as a BigNumber, the result will be
40
+ * as well.
32
41
  *
33
42
  * Syntax:
34
43
  *
@@ -46,26 +55,47 @@ var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
46
55
  * @param {Number | BigNumber} k Number of objects in the subset
47
56
  * @return {Number | BigNumber} S(n,k)
48
57
  */
58
+
49
59
  return typed(name, {
50
60
  'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) {
51
61
  if (!isInteger(n) || isNegative(n) || !isInteger(k) || isNegative(k)) {
52
62
  throw new TypeError('Non-negative integer value expected in function stirlingS2');
53
63
  } else if (larger(k, n)) {
54
64
  throw new TypeError('k must be less than or equal to n in function stirlingS2');
55
- } // 1/k! Sum(i=0 -> k) [(-1)^(k-i)*C(k,j)* i^n]
65
+ }
66
+
67
+ var big = !((0, _is.isNumber)(n) && (0, _is.isNumber)(k));
68
+ var cache = big ? bigCache : smallCache;
69
+ var make = big ? bignumber : number;
70
+ var nn = number(n);
71
+ var nk = number(k);
72
+ /* See if we already have the value: */
73
+
74
+ if (cache[nn] && cache[nn].length > nk) {
75
+ return cache[nn][nk];
76
+ }
77
+ /* Fill the cache */
78
+
56
79
 
80
+ for (var m = 0; m <= nn; ++m) {
81
+ if (!cache[m]) {
82
+ cache[m] = [m === 0 ? make(1) : make(0)];
83
+ }
57
84
 
58
- var kFactorial = factorial(k);
59
- var result = 0;
85
+ if (m === 0) continue;
86
+ var row = cache[m];
87
+ var prev = cache[m - 1];
60
88
 
61
- for (var i = 0; i <= k; i++) {
62
- var negativeOne = pow(-1, subtract(k, i));
63
- var kChooseI = combinations(k, i);
64
- var iPower = pow(i, n);
65
- result = addScalar(result, multiplyScalar(multiplyScalar(kChooseI, iPower), negativeOne));
89
+ for (var i = row.length; i <= m && i <= nk; ++i) {
90
+ if (i === m) {
91
+ row[i] = 1;
92
+ } else {
93
+ row[i] = addScalar(multiplyScalar(make(i), prev[i]), prev[i - 1]);
94
+ }
95
+ }
66
96
  }
67
97
 
68
- return divideScalar(result, kFactorial);
98
+ return cache[nn][nk];
69
99
  }
70
100
  });
71
101
  });
@@ -14,14 +14,15 @@ var _string = require("../../utils/string.js");
14
14
  var _factory = require("../../utils/factory.js");
15
15
 
16
16
  var name = 'det';
17
- var dependencies = ['typed', 'matrix', 'subtract', 'multiply', 'unaryMinus', 'lup'];
17
+ var dependencies = ['typed', 'matrix', 'subtract', 'multiply', 'divideScalar', 'isZero', 'unaryMinus'];
18
18
  var createDet = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
19
19
  var typed = _ref.typed,
20
20
  matrix = _ref.matrix,
21
21
  subtract = _ref.subtract,
22
22
  multiply = _ref.multiply,
23
- unaryMinus = _ref.unaryMinus,
24
- lup = _ref.lup;
23
+ divideScalar = _ref.divideScalar,
24
+ isZero = _ref.isZero,
25
+ unaryMinus = _ref.unaryMinus;
25
26
 
26
27
  /**
27
28
  * Calculate the determinant of a matrix.
@@ -115,42 +116,47 @@ var createDet = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
115
116
  // the determinant of [a11,a12;a21,a22] is det = a11*a22-a21*a12
116
117
  return subtract(multiply(matrix[0][0], matrix[1][1]), multiply(matrix[1][0], matrix[0][1]));
117
118
  } else {
118
- // Compute the LU decomposition
119
- var decomp = lup(matrix); // The determinant is the product of the diagonal entries of U (and those of L, but they are all 1)
120
-
121
- var det = decomp.U[0][0];
122
-
123
- for (var _i = 1; _i < rows; _i++) {
124
- det = multiply(det, decomp.U[_i][_i]);
125
- } // The determinant will be multiplied by 1 or -1 depending on the parity of the permutation matrix.
126
- // This can be determined by counting the cycles. This is roughly a linear time algorithm.
127
-
128
-
129
- var evenCycles = 0;
130
- var i = 0;
131
- var visited = [];
119
+ // Bareiss algorithm
120
+ // this algorithm have same complexity as LUP decomposition (O(n^3))
121
+ // but it preserve precision of floating point more relative to the LUP decomposition
122
+ var negated = false;
123
+ var rowIndices = new Array(rows).fill(0).map(function (_, i) {
124
+ return i;
125
+ }); // matrix index of row i
126
+
127
+ for (var k = 0; k < rows; k++) {
128
+ var k_ = rowIndices[k];
129
+
130
+ if (isZero(matrix[k_][k])) {
131
+ var _k = void 0;
132
+
133
+ for (_k = k + 1; _k < rows; _k++) {
134
+ if (!isZero(matrix[rowIndices[_k]][k])) {
135
+ k_ = rowIndices[_k];
136
+ rowIndices[_k] = rowIndices[k];
137
+ rowIndices[k] = k_;
138
+ negated = !negated;
139
+ break;
140
+ }
141
+ }
132
142
 
133
- while (true) {
134
- while (visited[i]) {
135
- i++;
143
+ if (_k === rows) return matrix[k_][k]; // some zero of the type
136
144
  }
137
145
 
138
- if (i >= rows) break;
139
- var j = i;
140
- var cycleLen = 0;
146
+ var piv = matrix[k_][k];
147
+ var piv_ = k === 0 ? 1 : matrix[rowIndices[k - 1]][k - 1];
141
148
 
142
- while (!visited[decomp.p[j]]) {
143
- visited[decomp.p[j]] = true;
144
- j = decomp.p[j];
145
- cycleLen++;
146
- }
149
+ for (var i = k + 1; i < rows; i++) {
150
+ var i_ = rowIndices[i];
147
151
 
148
- if (cycleLen % 2 === 0) {
149
- evenCycles++;
152
+ for (var j = k + 1; j < rows; j++) {
153
+ matrix[i_][j] = divideScalar(subtract(multiply(matrix[i_][j], piv), multiply(matrix[i_][k], matrix[k_][j])), piv_);
154
+ }
150
155
  }
151
156
  }
152
157
 
153
- return evenCycles % 2 === 0 ? det : unaryMinus(det);
158
+ var det = matrix[rowIndices[rows - 1]][rows - 1];
159
+ return negated ? unaryMinus(det) : det;
154
160
  }
155
161
  }
156
162
  });
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createPinv = void 0;
7
+
8
+ var _is = require("../../utils/is.js");
9
+
10
+ var _array = require("../../utils/array.js");
11
+
12
+ var _factory = require("../../utils/factory.js");
13
+
14
+ var _string = require("../../utils/string.js");
15
+
16
+ var _object = require("../../utils/object.js");
17
+
18
+ var name = 'pinv';
19
+ var dependencies = ['typed', 'matrix', 'inv', 'deepEqual', 'equal', 'dotDivide', 'dot', 'ctranspose', 'divideScalar', 'multiply', 'add', 'Complex'];
20
+ var createPinv = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
21
+ var typed = _ref.typed,
22
+ matrix = _ref.matrix,
23
+ inv = _ref.inv,
24
+ deepEqual = _ref.deepEqual,
25
+ equal = _ref.equal,
26
+ dotDivide = _ref.dotDivide,
27
+ dot = _ref.dot,
28
+ ctranspose = _ref.ctranspose,
29
+ divideScalar = _ref.divideScalar,
30
+ multiply = _ref.multiply,
31
+ add = _ref.add,
32
+ Complex = _ref.Complex;
33
+
34
+ /**
35
+ * Calculate the Moore–Penrose inverse of a matrix.
36
+ *
37
+ * Syntax:
38
+ *
39
+ * math.pinv(x)
40
+ *
41
+ * Examples:
42
+ *
43
+ * math.pinv([[1, 2], [3, 4]]) // returns [[-2, 1], [1.5, -0.5]]
44
+ * math.pinv([[1, 0], [0, 1], [0, 1]]) // returns [[1, 0, 0], [0, 0.5, 0.5]]
45
+ * math.pinv(4) // returns 0.25
46
+ *
47
+ * See also:
48
+ *
49
+ * inv
50
+ *
51
+ * @param {number | Complex | Array | Matrix} x Matrix to be inversed
52
+ * @return {number | Complex | Array | Matrix} The inverse of `x`.
53
+ */
54
+ return typed(name, {
55
+ 'Array | Matrix': function ArrayMatrix(x) {
56
+ var size = (0, _is.isMatrix)(x) ? x.size() : (0, _array.arraySize)(x);
57
+
58
+ switch (size.length) {
59
+ case 1:
60
+ // vector
61
+ if (_isZeros(x)) return ctranspose(x); // null vector
62
+
63
+ if (size[0] === 1) {
64
+ return inv(x); // invertible matrix
65
+ } else {
66
+ return dotDivide(ctranspose(x), dot(x, x));
67
+ }
68
+
69
+ case 2:
70
+ // two dimensional array
71
+ {
72
+ if (_isZeros(x)) return ctranspose(x); // zero matrixx
73
+
74
+ var rows = size[0];
75
+ var cols = size[1];
76
+
77
+ if (rows === cols) {
78
+ try {
79
+ return inv(x); // invertible matrix
80
+ } catch (err) {
81
+ if (err instanceof Error && err.message.match(/Cannot calculate inverse, determinant is zero/)) {// Expected
82
+ } else {
83
+ throw err;
84
+ }
85
+ }
86
+ }
87
+
88
+ if ((0, _is.isMatrix)(x)) {
89
+ return matrix(_pinv(x.valueOf(), rows, cols), x.storage());
90
+ } else {
91
+ // return an Array
92
+ return _pinv(x, rows, cols);
93
+ }
94
+ }
95
+
96
+ default:
97
+ // multi dimensional array
98
+ throw new RangeError('Matrix must be two dimensional ' + '(size: ' + (0, _string.format)(size) + ')');
99
+ }
100
+ },
101
+ any: function any(x) {
102
+ // scalar
103
+ if (equal(x, 0)) return (0, _object.clone)(x); // zero
104
+
105
+ return divideScalar(1, x);
106
+ }
107
+ });
108
+ /**
109
+ * Calculate the Moore–Penrose inverse of a matrix
110
+ * @param {Array[]} mat A matrix
111
+ * @param {number} rows Number of rows
112
+ * @param {number} cols Number of columns
113
+ * @return {Array[]} pinv Pseudoinverse matrix
114
+ * @private
115
+ */
116
+
117
+ function _pinv(mat, rows, cols) {
118
+ var _rankFact2 = _rankFact(mat, rows, cols),
119
+ C = _rankFact2.C,
120
+ F = _rankFact2.F; // TODO: Use SVD instead (may improve precision)
121
+
122
+
123
+ var Cpinv = multiply(inv(multiply(ctranspose(C), C)), ctranspose(C));
124
+ var Fpinv = multiply(ctranspose(F), inv(multiply(F, ctranspose(F))));
125
+ return multiply(Fpinv, Cpinv);
126
+ }
127
+ /**
128
+ * Calculate the reduced row echelon form of a matrix
129
+ *
130
+ * Modified from https://rosettacode.org/wiki/Reduced_row_echelon_form
131
+ *
132
+ * @param {Array[]} mat A matrix
133
+ * @param {number} rows Number of rows
134
+ * @param {number} cols Number of columns
135
+ * @return {Array[]} Reduced row echelon form
136
+ * @private
137
+ */
138
+
139
+
140
+ function _rref(mat, rows, cols) {
141
+ var M = (0, _object.clone)(mat);
142
+ var lead = 0;
143
+
144
+ for (var r = 0; r < rows; r++) {
145
+ if (cols <= lead) {
146
+ return M;
147
+ }
148
+
149
+ var i = r;
150
+
151
+ while (_isZero(M[i][lead])) {
152
+ i++;
153
+
154
+ if (rows === i) {
155
+ i = r;
156
+ lead++;
157
+
158
+ if (cols === lead) {
159
+ return M;
160
+ }
161
+ }
162
+ }
163
+
164
+ var _ref2 = [M[r], M[i]];
165
+ M[i] = _ref2[0];
166
+ M[r] = _ref2[1];
167
+ var val = M[r][lead];
168
+
169
+ for (var j = 0; j < cols; j++) {
170
+ M[r][j] = dotDivide(M[r][j], val);
171
+ }
172
+
173
+ for (var _i = 0; _i < rows; _i++) {
174
+ if (_i === r) continue;
175
+ val = M[_i][lead];
176
+
177
+ for (var _j = 0; _j < cols; _j++) {
178
+ M[_i][_j] = add(M[_i][_j], multiply(-1, multiply(val, M[r][_j])));
179
+ }
180
+ }
181
+
182
+ lead++;
183
+ }
184
+
185
+ return M;
186
+ }
187
+ /**
188
+ * Calculate the rank factorization of a matrix
189
+ *
190
+ * @param {Array[]} mat A matrix (M)
191
+ * @param {number} rows Number of rows
192
+ * @param {number} cols Number of columns
193
+ * @return {{C: Array, F: Array}} rank factorization where M = C F
194
+ * @private
195
+ */
196
+
197
+
198
+ function _rankFact(mat, rows, cols) {
199
+ var rref = _rref(mat, rows, cols);
200
+
201
+ var C = mat.map(function (_, i) {
202
+ return _.filter(function (_, j) {
203
+ return j < rows && !_isZero(dot(rref[j], rref[j]));
204
+ });
205
+ });
206
+ var F = rref.filter(function (_, i) {
207
+ return !_isZero(dot(rref[i], rref[i]));
208
+ });
209
+ return {
210
+ C: C,
211
+ F: F
212
+ };
213
+ }
214
+
215
+ function _isZero(x) {
216
+ return equal(add(x, Complex(1, 1)), add(0, Complex(1, 1)));
217
+ }
218
+
219
+ function _isZeros(arr) {
220
+ return deepEqual(add(arr, Complex(1, 1)), add(multiply(arr, 0), Complex(1, 1)));
221
+ }
222
+ });
223
+ exports.createPinv = createPinv;