mathjs 10.4.2 → 10.5.1

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