mathjs 11.11.2 → 12.0.0

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 (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
  };