mathjs 11.11.2 → 12.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. package/HISTORY.md +48 -0
  2. package/README.md +1 -1
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/core/create.js +2 -2
  7. package/lib/cjs/defaultInstance.js +2 -2
  8. package/lib/cjs/entry/allFactoriesAny.js +2 -2
  9. package/lib/cjs/entry/allFactoriesNumber.js +2 -2
  10. package/lib/cjs/entry/dependenciesAny/dependenciesDet.generated.js +2 -2
  11. package/lib/cjs/entry/dependenciesAny/dependenciesDistance.generated.js +2 -2
  12. package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
  13. package/lib/cjs/entry/dependenciesAny/dependenciesLsolve.generated.js +2 -2
  14. package/lib/cjs/entry/dependenciesAny/dependenciesLsolveAll.generated.js +2 -2
  15. package/lib/cjs/entry/dependenciesAny/dependenciesLup.generated.js +2 -2
  16. package/lib/cjs/entry/dependenciesAny/dependenciesQr.generated.js +2 -2
  17. package/lib/cjs/entry/dependenciesAny/dependenciesStirlingS2.generated.js +2 -2
  18. package/lib/cjs/entry/dependenciesAny/dependenciesSubtract.generated.js +2 -2
  19. package/lib/cjs/entry/dependenciesAny/dependenciesSubtractScalar.generated.js +17 -0
  20. package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +2 -2
  21. package/lib/cjs/entry/dependenciesAny/dependenciesUsolve.generated.js +2 -2
  22. package/lib/cjs/entry/dependenciesAny/dependenciesUsolveAll.generated.js +2 -2
  23. package/lib/cjs/entry/dependenciesAny.generated.js +7 -0
  24. package/lib/cjs/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +2 -2
  25. package/lib/cjs/entry/dependenciesNumber/dependenciesSubtractScalar.generated.js +17 -0
  26. package/lib/cjs/entry/dependenciesNumber.generated.js +7 -0
  27. package/lib/cjs/entry/impureFunctionsAny.generated.js +4 -3
  28. package/lib/cjs/entry/impureFunctionsNumber.generated.js +2 -1
  29. package/lib/cjs/entry/pureFunctionsAny.generated.js +43 -37
  30. package/lib/cjs/entry/pureFunctionsNumber.generated.js +16 -13
  31. package/lib/cjs/expression/embeddedDocs/function/matrix/eigs.js +2 -2
  32. package/lib/cjs/expression/node/AssignmentNode.js +1 -1
  33. package/lib/cjs/expression/node/FunctionAssignmentNode.js +1 -1
  34. package/lib/cjs/expression/parse.js +50 -69
  35. package/lib/cjs/factoriesAny.js +7 -0
  36. package/lib/cjs/factoriesNumber.js +2 -1
  37. package/lib/cjs/function/algebra/decomposition/lup.js +3 -3
  38. package/lib/cjs/function/algebra/decomposition/qr.js +5 -5
  39. package/lib/cjs/function/algebra/solver/lsolve.js +4 -4
  40. package/lib/cjs/function/algebra/solver/lsolveAll.js +6 -6
  41. package/lib/cjs/function/algebra/solver/usolve.js +4 -4
  42. package/lib/cjs/function/algebra/solver/usolveAll.js +6 -6
  43. package/lib/cjs/function/arithmetic/subtract.js +7 -37
  44. package/lib/cjs/function/arithmetic/subtractScalar.js +52 -0
  45. package/lib/cjs/function/combinatorics/stirlingS2.js +2 -2
  46. package/lib/cjs/function/geometry/distance.js +10 -10
  47. package/lib/cjs/function/matrix/det.js +4 -4
  48. package/lib/cjs/function/matrix/eigs/complexEigs.js +73 -68
  49. package/lib/cjs/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +57 -51
  50. package/lib/cjs/function/matrix/eigs.js +118 -45
  51. package/lib/cjs/header.js +2 -2
  52. package/lib/cjs/type/unit/Unit.js +5 -5
  53. package/lib/cjs/utils/number.js +1 -1
  54. package/lib/cjs/utils/object.js +4 -2
  55. package/lib/cjs/utils/snapshot.js +3 -3
  56. package/lib/cjs/utils/string.js +12 -16
  57. package/lib/cjs/version.js +1 -1
  58. package/lib/esm/entry/dependenciesAny/dependenciesDet.generated.js +2 -2
  59. package/lib/esm/entry/dependenciesAny/dependenciesDistance.generated.js +2 -2
  60. package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
  61. package/lib/esm/entry/dependenciesAny/dependenciesLsolve.generated.js +2 -2
  62. package/lib/esm/entry/dependenciesAny/dependenciesLsolveAll.generated.js +2 -2
  63. package/lib/esm/entry/dependenciesAny/dependenciesLup.generated.js +2 -2
  64. package/lib/esm/entry/dependenciesAny/dependenciesQr.generated.js +2 -2
  65. package/lib/esm/entry/dependenciesAny/dependenciesStirlingS2.generated.js +2 -2
  66. package/lib/esm/entry/dependenciesAny/dependenciesSubtract.generated.js +2 -2
  67. package/lib/esm/entry/dependenciesAny/dependenciesSubtractScalar.generated.js +10 -0
  68. package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +2 -2
  69. package/lib/esm/entry/dependenciesAny/dependenciesUsolve.generated.js +2 -2
  70. package/lib/esm/entry/dependenciesAny/dependenciesUsolveAll.generated.js +2 -2
  71. package/lib/esm/entry/dependenciesAny.generated.js +1 -0
  72. package/lib/esm/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +2 -2
  73. package/lib/esm/entry/dependenciesNumber/dependenciesSubtractScalar.generated.js +10 -0
  74. package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
  75. package/lib/esm/entry/impureFunctionsAny.generated.js +5 -4
  76. package/lib/esm/entry/impureFunctionsNumber.generated.js +3 -2
  77. package/lib/esm/entry/pureFunctionsAny.generated.js +42 -37
  78. package/lib/esm/entry/pureFunctionsNumber.generated.js +16 -13
  79. package/lib/esm/expression/embeddedDocs/function/matrix/eigs.js +2 -2
  80. package/lib/esm/expression/node/AssignmentNode.js +1 -1
  81. package/lib/esm/expression/node/FunctionAssignmentNode.js +1 -1
  82. package/lib/esm/expression/parse.js +50 -69
  83. package/lib/esm/factoriesAny.js +1 -0
  84. package/lib/esm/factoriesNumber.js +1 -0
  85. package/lib/esm/function/algebra/decomposition/lup.js +3 -3
  86. package/lib/esm/function/algebra/decomposition/qr.js +5 -5
  87. package/lib/esm/function/algebra/solver/lsolve.js +4 -4
  88. package/lib/esm/function/algebra/solver/lsolveAll.js +6 -6
  89. package/lib/esm/function/algebra/solver/usolve.js +4 -4
  90. package/lib/esm/function/algebra/solver/usolveAll.js +6 -6
  91. package/lib/esm/function/arithmetic/subtract.js +7 -27
  92. package/lib/esm/function/arithmetic/subtractScalar.js +46 -0
  93. package/lib/esm/function/combinatorics/stirlingS2.js +2 -2
  94. package/lib/esm/function/geometry/distance.js +10 -10
  95. package/lib/esm/function/matrix/det.js +4 -4
  96. package/lib/esm/function/matrix/eigs/complexEigs.js +73 -68
  97. package/lib/esm/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +55 -51
  98. package/lib/esm/function/matrix/eigs.js +119 -47
  99. package/lib/esm/type/unit/Unit.js +5 -5
  100. package/lib/esm/utils/number.js +1 -1
  101. package/lib/esm/utils/object.js +5 -3
  102. package/lib/esm/utils/snapshot.js +1 -1
  103. package/lib/esm/utils/string.js +12 -16
  104. package/lib/esm/version.js +1 -1
  105. package/package.json +14 -14
  106. package/types/EXPLANATION.md +54 -0
  107. package/types/index.d.ts +6797 -6446
@@ -27,25 +27,29 @@ function createRealSymmetric(_ref) {
27
27
  function main(arr, N) {
28
28
  var prec = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : config.epsilon;
29
29
  var type = arguments.length > 3 ? arguments[3] : undefined;
30
+ var computeVectors = arguments.length > 4 ? arguments[4] : undefined;
30
31
  if (type === 'number') {
31
- return diag(arr, prec);
32
+ return diag(arr, prec, computeVectors);
32
33
  }
33
34
  if (type === 'BigNumber') {
34
- return diagBig(arr, prec);
35
+ return diagBig(arr, prec, computeVectors);
35
36
  }
36
37
  throw TypeError('Unsupported data type: ' + type);
37
38
  }
38
39
 
39
40
  // diagonalization implementation for number (efficient)
40
- function diag(x, precision) {
41
+ function diag(x, precision, computeVectors) {
41
42
  var N = x.length;
42
43
  var e0 = Math.abs(precision / N);
43
44
  var psi;
44
- var Sij = new Array(N);
45
- // Sij is Identity Matrix
46
- for (var i = 0; i < N; i++) {
47
- Sij[i] = createArray(N, 0);
48
- Sij[i][i] = 1.0;
45
+ var Sij;
46
+ if (computeVectors) {
47
+ Sij = new Array(N);
48
+ // Sij is Identity Matrix
49
+ for (var i = 0; i < N; i++) {
50
+ Sij[i] = Array(N).fill(0);
51
+ Sij[i][i] = 1.0;
52
+ }
49
53
  }
50
54
  // initial error
51
55
  var Vab = getAij(x);
@@ -54,26 +58,29 @@ function createRealSymmetric(_ref) {
54
58
  var j = Vab[0][1];
55
59
  psi = getTheta(x[_i][_i], x[j][j], x[_i][j]);
56
60
  x = x1(x, psi, _i, j);
57
- Sij = Sij1(Sij, psi, _i, j);
61
+ if (computeVectors) Sij = Sij1(Sij, psi, _i, j);
58
62
  Vab = getAij(x);
59
63
  }
60
- var Ei = createArray(N, 0); // eigenvalues
64
+ var Ei = Array(N).fill(0); // eigenvalues
61
65
  for (var _i2 = 0; _i2 < N; _i2++) {
62
66
  Ei[_i2] = x[_i2][_i2];
63
67
  }
64
- return sorting((0, _object.clone)(Ei), (0, _object.clone)(Sij));
68
+ return sorting((0, _object.clone)(Ei), Sij, computeVectors);
65
69
  }
66
70
 
67
71
  // diagonalization implementation for bigNumber
68
- function diagBig(x, precision) {
72
+ function diagBig(x, precision, computeVectors) {
69
73
  var N = x.length;
70
74
  var e0 = abs(precision / N);
71
75
  var psi;
72
- var Sij = new Array(N);
73
- // Sij is Identity Matrix
74
- for (var i = 0; i < N; i++) {
75
- Sij[i] = createArray(N, 0);
76
- Sij[i][i] = 1.0;
76
+ var Sij;
77
+ if (computeVectors) {
78
+ Sij = new Array(N);
79
+ // Sij is Identity Matrix
80
+ for (var i = 0; i < N; i++) {
81
+ Sij[i] = Array(N).fill(0);
82
+ Sij[i][i] = 1.0;
83
+ }
77
84
  }
78
85
  // initial error
79
86
  var Vab = getAijBig(x);
@@ -82,15 +89,15 @@ function createRealSymmetric(_ref) {
82
89
  var j = Vab[0][1];
83
90
  psi = getThetaBig(x[_i3][_i3], x[j][j], x[_i3][j]);
84
91
  x = x1Big(x, psi, _i3, j);
85
- Sij = Sij1Big(Sij, psi, _i3, j);
92
+ if (computeVectors) Sij = Sij1Big(Sij, psi, _i3, j);
86
93
  Vab = getAijBig(x);
87
94
  }
88
- var Ei = createArray(N, 0); // eigenvalues
95
+ var Ei = Array(N).fill(0); // eigenvalues
89
96
  for (var _i4 = 0; _i4 < N; _i4++) {
90
97
  Ei[_i4] = x[_i4][_i4];
91
98
  }
92
99
  // return [clone(Ei), clone(Sij)]
93
- return sorting((0, _object.clone)(Ei), (0, _object.clone)(Sij));
100
+ return sorting((0, _object.clone)(Ei), Sij, computeVectors);
94
101
  }
95
102
 
96
103
  // get angle
@@ -118,8 +125,8 @@ function createRealSymmetric(_ref) {
118
125
  var N = Sij.length;
119
126
  var c = Math.cos(theta);
120
127
  var s = Math.sin(theta);
121
- var Ski = createArray(N, 0);
122
- var Skj = createArray(N, 0);
128
+ var Ski = Array(N).fill(0);
129
+ var Skj = Array(N).fill(0);
123
130
  for (var k = 0; k < N; k++) {
124
131
  Ski[k] = c * Sij[k][i] - s * Sij[k][j];
125
132
  Skj[k] = s * Sij[k][i] + c * Sij[k][j];
@@ -135,8 +142,8 @@ function createRealSymmetric(_ref) {
135
142
  var N = Sij.length;
136
143
  var c = cos(theta);
137
144
  var s = sin(theta);
138
- var Ski = createArray(N, bignumber(0));
139
- var Skj = createArray(N, bignumber(0));
145
+ var Ski = Array(N).fill(bignumber(0));
146
+ var Skj = Array(N).fill(bignumber(0));
140
147
  for (var k = 0; k < N; k++) {
141
148
  Ski[k] = subtract(multiplyScalar(c, Sij[k][i]), multiplyScalar(s, Sij[k][j]));
142
149
  Skj[k] = addScalar(multiplyScalar(s, Sij[k][i]), multiplyScalar(c, Sij[k][j]));
@@ -155,8 +162,8 @@ function createRealSymmetric(_ref) {
155
162
  var s = bignumber(sin(theta));
156
163
  var c2 = multiplyScalar(c, c);
157
164
  var s2 = multiplyScalar(s, s);
158
- var Aki = createArray(N, bignumber(0));
159
- var Akj = createArray(N, bignumber(0));
165
+ var Aki = Array(N).fill(bignumber(0));
166
+ var Akj = Array(N).fill(bignumber(0));
160
167
  // 2cs Hij
161
168
  var csHij = multiply(bignumber(2), c, s, Hij[i][j]);
162
169
  // Aii
@@ -191,8 +198,8 @@ function createRealSymmetric(_ref) {
191
198
  var s = Math.sin(theta);
192
199
  var c2 = c * c;
193
200
  var s2 = s * s;
194
- var Aki = createArray(N, 0);
195
- var Akj = createArray(N, 0);
201
+ var Aki = Array(N).fill(0);
202
+ var Akj = Array(N).fill(0);
196
203
  // Aii
197
204
  var Aii = c2 * Hij[i][i] - 2 * c * s * Hij[i][j] + s2 * Hij[j][j];
198
205
  var Ajj = s2 * Hij[i][i] + 2 * c * s * Hij[i][j] + c2 * Hij[j][j];
@@ -251,12 +258,15 @@ function createRealSymmetric(_ref) {
251
258
  }
252
259
 
253
260
  // sort results
254
- function sorting(E, S) {
261
+ function sorting(E, S, computeVectors) {
255
262
  var N = E.length;
256
263
  var values = Array(N);
257
- var vectors = Array(N);
258
- for (var k = 0; k < N; k++) {
259
- vectors[k] = Array(N);
264
+ var vecs;
265
+ if (computeVectors) {
266
+ vecs = Array(N);
267
+ for (var k = 0; k < N; k++) {
268
+ vecs[k] = Array(N);
269
+ }
260
270
  }
261
271
  for (var i = 0; i < N; i++) {
262
272
  var minID = 0;
@@ -268,30 +278,26 @@ function createRealSymmetric(_ref) {
268
278
  }
269
279
  }
270
280
  values[i] = E.splice(minID, 1)[0];
271
- for (var _k5 = 0; _k5 < N; _k5++) {
272
- vectors[_k5][i] = S[_k5][minID];
273
- S[_k5].splice(minID, 1);
281
+ if (computeVectors) {
282
+ for (var _k5 = 0; _k5 < N; _k5++) {
283
+ vecs[i][_k5] = S[_k5][minID];
284
+ S[_k5].splice(minID, 1);
285
+ }
274
286
  }
275
287
  }
288
+ if (!computeVectors) return {
289
+ values: values
290
+ };
291
+ var eigenvectors = vecs.map(function (vector, i) {
292
+ return {
293
+ value: values[i],
294
+ vector: vector
295
+ };
296
+ });
276
297
  return {
277
298
  values: values,
278
- vectors: vectors
299
+ eigenvectors: eigenvectors
279
300
  };
280
301
  }
281
-
282
- /**
283
- * Create an array of a certain size and fill all items with an initial value
284
- * @param {number} size
285
- * @param {number} value
286
- * @return {number[]}
287
- */
288
- function createArray(size, value) {
289
- // TODO: as soon as all browsers support Array.fill, use that instead (IE doesn't support it)
290
- var array = new Array(size);
291
- for (var i = 0; i < size; i++) {
292
- array[i] = value;
293
- }
294
- return array;
295
- }
296
302
  return main;
297
303
  }
@@ -1,18 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.createEigs = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
9
  var _factory = require("../../utils/factory.js");
8
10
  var _string = require("../../utils/string.js");
9
11
  var _complexEigs = require("./eigs/complexEigs.js");
10
- var _realSymetric = require("./eigs/realSymetric.js");
12
+ var _realSymmetric = require("./eigs/realSymmetric.js");
11
13
  var _is = require("../../utils/is.js");
12
14
  var name = 'eigs';
13
15
 
14
16
  // The absolute state of math.js's dependency system:
15
- var dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];
17
+ var dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'size', 'reshape', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];
16
18
  var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
17
19
  var config = _ref.config,
18
20
  typed = _ref.typed,
@@ -37,6 +39,8 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
37
39
  complex = _ref.complex,
38
40
  sqrt = _ref.sqrt,
39
41
  diag = _ref.diag,
42
+ size = _ref.size,
43
+ reshape = _ref.reshape,
40
44
  qr = _ref.qr,
41
45
  usolve = _ref.usolve,
42
46
  usolveAll = _ref.usolveAll,
@@ -45,7 +49,7 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
45
49
  smaller = _ref.smaller,
46
50
  matrixFromColumns = _ref.matrixFromColumns,
47
51
  dot = _ref.dot;
48
- var doRealSymetric = (0, _realSymetric.createRealSymmetric)({
52
+ var doRealSymmetric = (0, _realSymmetric.createRealSymmetric)({
49
53
  config: config,
50
54
  addScalar: addScalar,
51
55
  subtract: subtract,
@@ -75,6 +79,8 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
75
79
  abs: abs,
76
80
  bignumber: bignumber,
77
81
  diag: diag,
82
+ size: size,
83
+ reshape: reshape,
78
84
  qr: qr,
79
85
  inv: inv,
80
86
  usolve: usolve,
@@ -88,26 +94,54 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
88
94
  });
89
95
 
90
96
  /**
91
- * Compute eigenvalues and eigenvectors of a matrix. The eigenvalues are sorted by their absolute value, ascending.
92
- * An eigenvalue with multiplicity k will be listed k times. The eigenvectors are returned as columns of a matrix
93
- * the eigenvector that belongs to the j-th eigenvalue in the list (eg. `values[j]`) is the j-th column (eg. `column(vectors, j)`).
94
- * If the algorithm fails to converge, it will throw an error – in that case, however, you may still find useful information
97
+ * Compute eigenvalues and optionally eigenvectors of a square matrix.
98
+ * The eigenvalues are sorted by their absolute value, ascending, and
99
+ * returned as a vector in the `values` property of the returned project.
100
+ * An eigenvalue with algebraic multiplicity k will be listed k times, so
101
+ * that the returned `values` vector always has length equal to the size
102
+ * of the input matrix.
103
+ *
104
+ * The `eigenvectors` property of the return value provides the eigenvectors.
105
+ * It is an array of plain objects: the `value` property of each gives the
106
+ * associated eigenvalue, and the `vector` property gives the eigenvector
107
+ * itself. Note that the same `value` property will occur as many times in
108
+ * the list provided by `eigenvectors` as the geometric multiplicity of
109
+ * that value.
110
+ *
111
+ * If the algorithm fails to converge, it will throw an error –
112
+ * in that case, however, you may still find useful information
95
113
  * in `err.values` and `err.vectors`.
96
114
  *
115
+ * Note that the 'precision' option does not directly specify the _accuracy_
116
+ * of the returned eigenvalues. Rather, it determines how small an entry
117
+ * of the iterative approximations to an upper triangular matrix must be
118
+ * in order to be considered zero. The actual accuracy of the returned
119
+ * eigenvalues may be greater or less than the precision, depending on the
120
+ * conditioning of the matrix and how far apart or close the actual
121
+ * eigenvalues are. Note that currently, relatively simple, "traditional"
122
+ * methods of eigenvalue computation are being used; this is not a modern,
123
+ * high-precision eigenvalue computation. That said, it should typically
124
+ * produce fairly reasonable results.
125
+ *
97
126
  * Syntax:
98
127
  *
99
128
  * math.eigs(x, [prec])
129
+ * math.eigs(x, {options})
100
130
  *
101
131
  * Examples:
102
132
  *
103
- * const { eigs, multiply, column, transpose } = math
133
+ * const { eigs, multiply, column, transpose, matrixFromColumns } = math
104
134
  * const H = [[5, 2.3], [2.3, 1]]
105
- * const ans = eigs(H) // returns {values: [E1,E2...sorted], vectors: [v1,v2.... corresponding vectors as columns]}
135
+ * const ans = eigs(H) // returns {values: [E1,E2...sorted], eigenvectors: [{value: E1, vector: v2}, {value: e, vector: v2}, ...]
106
136
  * const E = ans.values
107
- * const U = ans.vectors
108
- * multiply(H, column(U, 0)) // returns multiply(E[0], column(U, 0))
109
- * const UTxHxU = multiply(transpose(U), H, U) // diagonalizes H
110
- * E[0] == UTxHxU[0][0] // returns true
137
+ * const V = ans.eigenvectors
138
+ * multiply(H, V[0].vector)) // returns multiply(E[0], V[0].vector))
139
+ * const U = matrixFromColumns(...V.map(obj => obj.vector))
140
+ * const UTxHxU = multiply(transpose(U), H, U) // diagonalizes H if possible
141
+ * E[0] == UTxHxU[0][0] // returns true always
142
+ *
143
+ * // Compute only approximate eigenvalues:
144
+ * const {values} = eigs(H, {eigenvectors: false, precision: 1e-6})
111
145
  *
112
146
  * See also:
113
147
  *
@@ -115,57 +149,96 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
115
149
  *
116
150
  * @param {Array | Matrix} x Matrix to be diagonalized
117
151
  *
118
- * @param {number | BigNumber} [prec] Precision, default value: 1e-15
119
- * @return {{values: Array|Matrix, vectors: Array|Matrix}} Object containing an array of eigenvalues and a matrix with eigenvectors as columns.
152
+ * @param {number | BigNumber | OptsObject} [opts] Object with keys `precision`, defaulting to config.epsilon, and `eigenvectors`, defaulting to true and specifying whether to compute eigenvectors. If just a number, specifies precision.
153
+ * @return {{values: Array|Matrix, eigenvectors?: Array<EVobj>}} Object containing an array of eigenvalues and an array of {value: number|BigNumber, vector: Array|Matrix} objects. The eigenvectors property is undefined if eigenvectors were not requested.
120
154
  *
121
155
  */
122
156
  return typed('eigs', {
157
+ // The conversion to matrix in the first two implementations,
158
+ // just to convert back to an array right away in
159
+ // computeValuesAndVectors, is unfortunate, and should perhaps be
160
+ // streamlined. It is done because the Matrix object carries some
161
+ // type information about its entries, and so constructing the matrix
162
+ // is a roundabout way of doing type detection.
123
163
  Array: function Array(x) {
124
- var mat = matrix(x);
125
- return computeValuesAndVectors(mat);
164
+ return doEigs(matrix(x));
126
165
  },
127
166
  'Array, number|BigNumber': function ArrayNumberBigNumber(x, prec) {
128
- var mat = matrix(x);
129
- return computeValuesAndVectors(mat, prec);
167
+ return doEigs(matrix(x), {
168
+ precision: prec
169
+ });
170
+ },
171
+ 'Array, Object': function ArrayObject(x, opts) {
172
+ return doEigs(matrix(x), opts);
130
173
  },
131
174
  Matrix: function Matrix(mat) {
132
- var _computeValuesAndVect = computeValuesAndVectors(mat),
133
- values = _computeValuesAndVect.values,
134
- vectors = _computeValuesAndVect.vectors;
135
- return {
136
- values: matrix(values),
137
- vectors: matrix(vectors)
138
- };
175
+ return doEigs(mat, {
176
+ matricize: true
177
+ });
139
178
  },
140
179
  'Matrix, number|BigNumber': function MatrixNumberBigNumber(mat, prec) {
141
- var _computeValuesAndVect2 = computeValuesAndVectors(mat, prec),
142
- values = _computeValuesAndVect2.values,
143
- vectors = _computeValuesAndVect2.vectors;
144
- return {
145
- values: matrix(values),
146
- vectors: matrix(vectors)
180
+ return doEigs(mat, {
181
+ precision: prec,
182
+ matricize: true
183
+ });
184
+ },
185
+ 'Matrix, Object': function MatrixObject(mat, opts) {
186
+ var useOpts = {
187
+ matricize: true
147
188
  };
189
+ (0, _extends2["default"])(useOpts, opts);
190
+ return doEigs(mat, useOpts);
148
191
  }
149
192
  });
150
- function computeValuesAndVectors(mat, prec) {
151
- if (prec === undefined) {
152
- prec = config.epsilon;
193
+ function doEigs(mat) {
194
+ var _opts$precision;
195
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
196
+ var computeVectors = 'eigenvectors' in opts ? opts.eigenvectors : true;
197
+ var prec = (_opts$precision = opts.precision) !== null && _opts$precision !== void 0 ? _opts$precision : config.epsilon;
198
+ var result = computeValuesAndVectors(mat, prec, computeVectors);
199
+ if (opts.matricize) {
200
+ result.values = matrix(result.values);
201
+ if (computeVectors) {
202
+ result.eigenvectors = result.eigenvectors.map(function (_ref2) {
203
+ var value = _ref2.value,
204
+ vector = _ref2.vector;
205
+ return {
206
+ value: value,
207
+ vector: matrix(vector)
208
+ };
209
+ });
210
+ }
211
+ }
212
+ if (computeVectors) {
213
+ Object.defineProperty(result, 'vectors', {
214
+ enumerable: false,
215
+ // to make sure that the eigenvectors can still be
216
+ // converted to string.
217
+ get: function get() {
218
+ throw new Error('eigs(M).vectors replaced with eigs(M).eigenvectors');
219
+ }
220
+ });
153
221
  }
154
- var size = mat.size();
155
- if (size.length !== 2 || size[0] !== size[1]) {
156
- throw new RangeError('Matrix must be square (size: ' + (0, _string.format)(size) + ')');
222
+ return result;
223
+ }
224
+ function computeValuesAndVectors(mat, prec, computeVectors) {
225
+ var arr = mat.toArray(); // NOTE: arr is guaranteed to be unaliased
226
+ // and so safe to modify in place
227
+ var asize = mat.size();
228
+ if (asize.length !== 2 || asize[0] !== asize[1]) {
229
+ throw new RangeError("Matrix must be square (size: ".concat((0, _string.format)(asize), ")"));
157
230
  }
158
- var arr = mat.toArray();
159
- var N = size[0];
231
+ var N = asize[0];
160
232
  if (isReal(arr, N, prec)) {
161
- coerceReal(arr, N);
233
+ coerceReal(arr, N); // modifies arr by side effect
234
+
162
235
  if (isSymmetric(arr, N, prec)) {
163
- var _type = coerceTypes(mat, arr, N);
164
- return doRealSymetric(arr, N, prec, _type);
236
+ var _type = coerceTypes(mat, arr, N); // modifies arr by side effect
237
+ return doRealSymmetric(arr, N, prec, _type, computeVectors);
165
238
  }
166
239
  }
167
- var type = coerceTypes(mat, arr, N);
168
- return doComplexEigs(arr, N, prec, type);
240
+ var type = coerceTypes(mat, arr, N); // modifies arr by side effect
241
+ return doComplexEigs(arr, N, prec, type, computeVectors);
169
242
  }
170
243
 
171
244
  /** @return {boolean} */
package/lib/cjs/header.js CHANGED
@@ -6,8 +6,8 @@
6
6
  * It features real and complex numbers, units, matrices, a large set of
7
7
  * mathematical functions, and a flexible expression parser.
8
8
  *
9
- * @version 11.11.2
10
- * @date 2023-10-11
9
+ * @version 12.0.0
10
+ * @date 2023-10-26
11
11
  *
12
12
  * @license
13
13
  * Copyright (C) 2013-2023 Jos de Jong <wjosdejong@gmail.com>
@@ -17,12 +17,12 @@ var _constants = require("../../utils/bignumber/constants.js");
17
17
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
19
19
  var name = 'Unit';
20
- var dependencies = ['?on', 'config', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'abs', 'fix', 'round', 'equal', 'isNumeric', 'format', 'number', 'Complex', 'BigNumber', 'Fraction'];
20
+ var dependencies = ['?on', 'config', 'addScalar', 'subtractScalar', 'multiplyScalar', 'divideScalar', 'pow', 'abs', 'fix', 'round', 'equal', 'isNumeric', 'format', 'number', 'Complex', 'BigNumber', 'Fraction'];
21
21
  var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
22
22
  var on = _ref.on,
23
23
  config = _ref.config,
24
24
  addScalar = _ref.addScalar,
25
- subtract = _ref.subtract,
25
+ subtractScalar = _ref.subtractScalar,
26
26
  multiplyScalar = _ref.multiplyScalar,
27
27
  divideScalar = _ref.divideScalar,
28
28
  pow = _ref.pow,
@@ -753,7 +753,7 @@ var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.fact
753
753
  var unitValue = convert(ret.units[0].unit.value);
754
754
  var nominalOffset = convert(ret.units[0].unit.offset);
755
755
  var unitOffset = multiplyScalar(unitValue, nominalOffset);
756
- ret.value = subtract(abs(addScalar(ret.value, unitOffset)), unitOffset);
756
+ ret.value = subtractScalar(abs(addScalar(ret.value, unitOffset)), unitOffset);
757
757
  }
758
758
  }
759
759
  for (var i in ret.units) {
@@ -798,7 +798,7 @@ var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.fact
798
798
  var otherUnitValue = other.units[0].unit.value;
799
799
  var otherNominalOffset = other.units[0].unit.offset;
800
800
  var otherUnitOffset = multiplyScalar(otherUnitValue, otherNominalOffset);
801
- other.value = addScalar(value, convert(subtract(thisUnitOffset, otherUnitOffset)));
801
+ other.value = addScalar(value, convert(subtractScalar(thisUnitOffset, otherUnitOffset)));
802
802
  }
803
803
  other.fixPrefix = true;
804
804
  other.skipAutomaticSimplification = true;
@@ -1174,7 +1174,7 @@ var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.fact
1174
1174
  }
1175
1175
  var y = new Unit(xFixed, parts[i].toString());
1176
1176
  ret.push(y);
1177
- x = subtract(x, y);
1177
+ x = subtractScalar(x, y);
1178
1178
  }
1179
1179
 
1180
1180
  // This little bit fixes a bug where the remainder should be 0 but is a little bit off.
@@ -604,7 +604,7 @@ function nearlyEqual(x, y, epsilon) {
604
604
  if (isFinite(x) && isFinite(y)) {
605
605
  // check numbers are very close, needed when comparing numbers near zero
606
606
  var diff = Math.abs(x - y);
607
- if (diff < DBL_EPSILON) {
607
+ if (diff <= DBL_EPSILON) {
608
608
  return true;
609
609
  } else {
610
610
  // use relative error
@@ -54,10 +54,12 @@ function clone(x) {
54
54
  }
55
55
  if (x instanceof Date) return new Date(x.valueOf());
56
56
  if ((0, _is.isBigNumber)(x)) return x; // bignumbers are immutable
57
- if (x instanceof RegExp) throw new TypeError('Cannot clone ' + x); // TODO: clone a RegExp
58
57
 
59
58
  // object
60
- return mapObject(x, clone);
59
+ if ((0, _is.isObject)(x)) {
60
+ return mapObject(x, clone);
61
+ }
62
+ throw new TypeError("Cannot clone: unknown type of value (value: ".concat(x, ")"));
61
63
  }
62
64
 
63
65
  /**
@@ -14,8 +14,8 @@ var _assert = _interopRequireDefault(require("assert"));
14
14
  var allIsFunctions = _interopRequireWildcard(require("./is.js"));
15
15
  var _create = require("../core/create.js");
16
16
  var _string = require("./string.js");
17
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
18
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
19
19
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
20
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /**
21
21
  * This file contains helper methods to create expected snapshot structures
@@ -141,7 +141,7 @@ function createSnapshotFromFactories(factories) {
141
141
  embeddedDocs[name] = 'Object';
142
142
  }
143
143
  });
144
- embeddedDocs = exclude(embeddedDocs, ['equalScalar', 'apply', 'addScalar', 'multiplyScalar', 'print', 'divideScalar', 'parse', 'compile', 'parser', 'chain', 'reviver', 'replacer']);
144
+ embeddedDocs = exclude(embeddedDocs, ['equalScalar', 'apply', 'addScalar', 'subtractScalar', 'multiplyScalar', 'print', 'divideScalar', 'parse', 'compile', 'parser', 'chain', 'reviver', 'replacer']);
145
145
  var allTypeChecks = {};
146
146
  Object.keys(allIsFunctions).forEach(function (name) {
147
147
  if (name.indexOf('is') === 0) {
@@ -92,7 +92,7 @@ function _format(value, options) {
92
92
  return formatArray(value, options);
93
93
  }
94
94
  if ((0, _is.isString)(value)) {
95
- return '"' + value + '"';
95
+ return stringify(value);
96
96
  }
97
97
  if (typeof value === 'function') {
98
98
  return value.syntax ? String(value.syntax) : 'function';
@@ -105,7 +105,7 @@ function _format(value, options) {
105
105
  return value.toString(options);
106
106
  } else {
107
107
  var entries = Object.keys(value).map(function (key) {
108
- return '"' + key + '": ' + format(value[key], options);
108
+ return stringify(key) + ': ' + format(value[key], options);
109
109
  });
110
110
  return '{' + entries.join(', ') + '}';
111
111
  }
@@ -125,24 +125,20 @@ function stringify(value) {
125
125
  var i = 0;
126
126
  while (i < text.length) {
127
127
  var c = text.charAt(i);
128
- if (c === '\\') {
129
- escaped += c;
130
- i++;
131
- c = text.charAt(i);
132
- if (c === '' || '"\\/bfnrtu'.indexOf(c) === -1) {
133
- escaped += '\\'; // no valid escape character -> escape it
134
- }
135
-
136
- escaped += c;
137
- } else if (c === '"') {
138
- escaped += '\\"';
139
- } else {
140
- escaped += c;
141
- }
128
+ escaped += c in controlCharacters ? controlCharacters[c] : c;
142
129
  i++;
143
130
  }
144
131
  return '"' + escaped + '"';
145
132
  }
133
+ var controlCharacters = {
134
+ '"': '\\"',
135
+ '\\': '\\\\',
136
+ '\b': '\\b',
137
+ '\f': '\\f',
138
+ '\n': '\\n',
139
+ '\r': '\\r',
140
+ '\t': '\\t'
141
+ };
146
142
 
147
143
  /**
148
144
  * Escape special HTML characters
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- var version = exports.version = '11.11.2';
7
+ var version = exports.version = '12.0.0';
8
8
  // Note: This file is automatically generated when building math.js.
9
9
  // Changes made in this file will be overwritten.
@@ -6,7 +6,7 @@ import { divideScalarDependencies } from './dependenciesDivideScalar.generated.j
6
6
  import { isZeroDependencies } from './dependenciesIsZero.generated.js';
7
7
  import { matrixDependencies } from './dependenciesMatrix.generated.js';
8
8
  import { multiplyDependencies } from './dependenciesMultiply.generated.js';
9
- import { subtractDependencies } from './dependenciesSubtract.generated.js';
9
+ import { subtractScalarDependencies } from './dependenciesSubtractScalar.generated.js';
10
10
  import { typedDependencies } from './dependenciesTyped.generated.js';
11
11
  import { unaryMinusDependencies } from './dependenciesUnaryMinus.generated.js';
12
12
  import { createDet } from '../../factoriesAny.js';
@@ -15,7 +15,7 @@ export var detDependencies = {
15
15
  isZeroDependencies,
16
16
  matrixDependencies,
17
17
  multiplyDependencies,
18
- subtractDependencies,
18
+ subtractScalarDependencies,
19
19
  typedDependencies,
20
20
  unaryMinusDependencies,
21
21
  createDet
@@ -8,7 +8,7 @@ import { deepEqualDependencies } from './dependenciesDeepEqual.generated.js';
8
8
  import { divideScalarDependencies } from './dependenciesDivideScalar.generated.js';
9
9
  import { multiplyScalarDependencies } from './dependenciesMultiplyScalar.generated.js';
10
10
  import { sqrtDependencies } from './dependenciesSqrt.generated.js';
11
- import { subtractDependencies } from './dependenciesSubtract.generated.js';
11
+ import { subtractScalarDependencies } from './dependenciesSubtractScalar.generated.js';
12
12
  import { typedDependencies } from './dependenciesTyped.generated.js';
13
13
  import { createDistance } from '../../factoriesAny.js';
14
14
  export var distanceDependencies = {
@@ -18,7 +18,7 @@ export var distanceDependencies = {
18
18
  divideScalarDependencies,
19
19
  multiplyScalarDependencies,
20
20
  sqrtDependencies,
21
- subtractDependencies,
21
+ subtractScalarDependencies,
22
22
  typedDependencies,
23
23
  createDistance
24
24
  };