mathjs 14.2.1 → 14.3.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 (73) hide show
  1. package/HISTORY.md +16 -0
  2. package/lib/browser/math.js +1 -1
  3. package/lib/browser/math.js.LICENSE.txt +2 -2
  4. package/lib/browser/math.js.map +1 -1
  5. package/lib/cjs/entry/dependenciesAny/dependenciesMax.generated.js +2 -0
  6. package/lib/cjs/entry/dependenciesAny/dependenciesMaxTransform.generated.js +2 -0
  7. package/lib/cjs/entry/dependenciesAny/dependenciesMin.generated.js +2 -0
  8. package/lib/cjs/entry/dependenciesAny/dependenciesMinTransform.generated.js +2 -0
  9. package/lib/cjs/entry/dependenciesNumber/dependenciesMax.generated.js +2 -0
  10. package/lib/cjs/entry/dependenciesNumber/dependenciesMaxTransform.generated.js +2 -0
  11. package/lib/cjs/entry/dependenciesNumber/dependenciesMin.generated.js +2 -0
  12. package/lib/cjs/entry/dependenciesNumber/dependenciesMinTransform.generated.js +2 -0
  13. package/lib/cjs/entry/impureFunctionsAny.generated.js +2 -0
  14. package/lib/cjs/entry/impureFunctionsNumber.generated.js +2 -0
  15. package/lib/cjs/entry/pureFunctionsAny.generated.js +2 -0
  16. package/lib/cjs/entry/pureFunctionsNumber.generated.js +2 -0
  17. package/lib/cjs/expression/embeddedDocs/function/matrix/mapSlices.js +1 -1
  18. package/lib/cjs/expression/embeddedDocs/function/relational/larger.js +1 -1
  19. package/lib/cjs/expression/embeddedDocs/function/relational/smaller.js +1 -1
  20. package/lib/cjs/expression/embeddedDocs/function/statistics/max.js +1 -1
  21. package/lib/cjs/expression/embeddedDocs/function/statistics/min.js +1 -1
  22. package/lib/cjs/expression/transform/max.transform.js +5 -3
  23. package/lib/cjs/expression/transform/min.transform.js +5 -3
  24. package/lib/cjs/expression/transform/variance.transform.js +2 -2
  25. package/lib/cjs/function/matrix/flatten.js +1 -1
  26. package/lib/cjs/function/matrix/forEach.js +1 -1
  27. package/lib/cjs/function/matrix/map.js +1 -1
  28. package/lib/cjs/function/matrix/partitionSelect.js +2 -2
  29. package/lib/cjs/function/statistics/max.js +5 -4
  30. package/lib/cjs/function/statistics/min.js +5 -4
  31. package/lib/cjs/function/statistics/mode.js +2 -2
  32. package/lib/cjs/function/statistics/variance.js +2 -2
  33. package/lib/cjs/header.js +2 -2
  34. package/lib/cjs/type/matrix/DenseMatrix.js +45 -48
  35. package/lib/cjs/utils/array.js +120 -48
  36. package/lib/cjs/utils/collection.js +14 -15
  37. package/lib/cjs/utils/optimizeCallback.js +19 -2
  38. package/lib/cjs/version.js +1 -1
  39. package/lib/esm/entry/dependenciesAny/dependenciesMax.generated.js +2 -0
  40. package/lib/esm/entry/dependenciesAny/dependenciesMaxTransform.generated.js +2 -0
  41. package/lib/esm/entry/dependenciesAny/dependenciesMin.generated.js +2 -0
  42. package/lib/esm/entry/dependenciesAny/dependenciesMinTransform.generated.js +2 -0
  43. package/lib/esm/entry/dependenciesNumber/dependenciesMax.generated.js +2 -0
  44. package/lib/esm/entry/dependenciesNumber/dependenciesMaxTransform.generated.js +2 -0
  45. package/lib/esm/entry/dependenciesNumber/dependenciesMin.generated.js +2 -0
  46. package/lib/esm/entry/dependenciesNumber/dependenciesMinTransform.generated.js +2 -0
  47. package/lib/esm/entry/impureFunctionsAny.generated.js +2 -0
  48. package/lib/esm/entry/impureFunctionsNumber.generated.js +2 -0
  49. package/lib/esm/entry/pureFunctionsAny.generated.js +2 -0
  50. package/lib/esm/entry/pureFunctionsNumber.generated.js +2 -0
  51. package/lib/esm/expression/embeddedDocs/function/matrix/mapSlices.js +1 -1
  52. package/lib/esm/expression/embeddedDocs/function/relational/larger.js +1 -1
  53. package/lib/esm/expression/embeddedDocs/function/relational/smaller.js +1 -1
  54. package/lib/esm/expression/embeddedDocs/function/statistics/max.js +1 -1
  55. package/lib/esm/expression/embeddedDocs/function/statistics/min.js +1 -1
  56. package/lib/esm/expression/transform/max.transform.js +5 -3
  57. package/lib/esm/expression/transform/min.transform.js +5 -3
  58. package/lib/esm/expression/transform/variance.transform.js +2 -2
  59. package/lib/esm/function/matrix/flatten.js +1 -1
  60. package/lib/esm/function/matrix/forEach.js +2 -2
  61. package/lib/esm/function/matrix/map.js +2 -2
  62. package/lib/esm/function/matrix/partitionSelect.js +2 -2
  63. package/lib/esm/function/statistics/max.js +5 -4
  64. package/lib/esm/function/statistics/min.js +5 -4
  65. package/lib/esm/function/statistics/mode.js +2 -2
  66. package/lib/esm/function/statistics/variance.js +2 -2
  67. package/lib/esm/type/matrix/DenseMatrix.js +46 -49
  68. package/lib/esm/utils/array.js +118 -47
  69. package/lib/esm/utils/collection.js +15 -16
  70. package/lib/esm/utils/optimizeCallback.js +19 -2
  71. package/lib/esm/version.js +1 -1
  72. package/package.json +9 -9
  73. package/types/index.d.ts +2 -1
@@ -2,7 +2,7 @@ export var maxDocs = {
2
2
  name: 'max',
3
3
  category: 'Statistics',
4
4
  syntax: ['max(a, b, c, ...)', 'max(A)', 'max(A, dimension)'],
5
- description: 'Compute the maximum value of a list of values.',
5
+ description: 'Compute the maximum value of a list of values. If any NaN values are found, the function yields the last NaN in the input.',
6
6
  examples: ['max(2, 3, 4, 1)', 'max([2, 3, 4, 1])', 'max([2, 5; 4, 3])', 'max([2, 5; 4, 3], 1)', 'max([2, 5; 4, 3], 2)', 'max(2.7, 7.1, -4.5, 2.0, 4.1)', 'min(2.7, 7.1, -4.5, 2.0, 4.1)'],
7
7
  seealso: ['mean', 'median', 'min', 'prod', 'std', 'sum', 'variance']
8
8
  };
@@ -2,7 +2,7 @@ export var minDocs = {
2
2
  name: 'min',
3
3
  category: 'Statistics',
4
4
  syntax: ['min(a, b, c, ...)', 'min(A)', 'min(A, dimension)'],
5
- description: 'Compute the minimum value of a list of values.',
5
+ description: 'Compute the minimum value of a list of values. If any NaN values are found, the function yields the last NaN in the input.',
6
6
  examples: ['min(2, 3, 4, 1)', 'min([2, 3, 4, 1])', 'min([2, 5; 4, 3])', 'min([2, 5; 4, 3], 1)', 'min([2, 5; 4, 3], 2)', 'min(2.7, 7.1, -4.5, 2.0, 4.1)', 'max(2.7, 7.1, -4.5, 2.0, 4.1)'],
7
7
  seealso: ['max', 'mean', 'median', 'prod', 'std', 'sum', 'variance']
8
8
  };
@@ -3,19 +3,21 @@ import { errorTransform } from './utils/errorTransform.js';
3
3
  import { createMax } from '../../function/statistics/max.js';
4
4
  import { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';
5
5
  var name = 'max';
6
- var dependencies = ['typed', 'config', 'numeric', 'larger'];
6
+ var dependencies = ['typed', 'config', 'numeric', 'larger', 'isNaN'];
7
7
  export var createMaxTransform = /* #__PURE__ */factory(name, dependencies, _ref => {
8
8
  var {
9
9
  typed,
10
10
  config,
11
11
  numeric,
12
- larger
12
+ larger,
13
+ isNaN: mathIsNaN
13
14
  } = _ref;
14
15
  var max = createMax({
15
16
  typed,
16
17
  config,
17
18
  numeric,
18
- larger
19
+ larger,
20
+ isNaN: mathIsNaN
19
21
  });
20
22
 
21
23
  /**
@@ -3,19 +3,21 @@ import { errorTransform } from './utils/errorTransform.js';
3
3
  import { createMin } from '../../function/statistics/min.js';
4
4
  import { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';
5
5
  var name = 'min';
6
- var dependencies = ['typed', 'config', 'numeric', 'smaller'];
6
+ var dependencies = ['typed', 'config', 'numeric', 'smaller', 'isNaN'];
7
7
  export var createMinTransform = /* #__PURE__ */factory(name, dependencies, _ref => {
8
8
  var {
9
9
  typed,
10
10
  config,
11
11
  numeric,
12
- smaller
12
+ smaller,
13
+ isNaN: mathIsNaN
13
14
  } = _ref;
14
15
  var min = createMin({
15
16
  typed,
16
17
  config,
17
18
  numeric,
18
- smaller
19
+ smaller,
20
+ isNaN: mathIsNaN
19
21
  });
20
22
 
21
23
  /**
@@ -20,7 +20,7 @@ export var createVarianceTransform = /* #__PURE__ */factory(name, dependencies,
20
20
  multiply,
21
21
  divide,
22
22
  mapSlices,
23
- isNaN
23
+ isNaN: mathIsNaN
24
24
  } = _ref;
25
25
  var variance = createVariance({
26
26
  typed,
@@ -29,7 +29,7 @@ export var createVarianceTransform = /* #__PURE__ */factory(name, dependencies,
29
29
  multiply,
30
30
  divide,
31
31
  mapSlices,
32
- isNaN
32
+ isNaN: mathIsNaN
33
33
  });
34
34
  return typed(name, {
35
35
  '...any': function any(args) {
@@ -32,7 +32,7 @@ export var createFlatten = /* #__PURE__ */factory(name, dependencies, _ref => {
32
32
  Matrix: function Matrix(x) {
33
33
  // Return the same matrix type as x (Dense or Sparse Matrix)
34
34
  // Return the same data type as x
35
- return x.create(flattenArray(x.toArray()), x.datatype());
35
+ return x.create(flattenArray(x.valueOf()), x.datatype());
36
36
  }
37
37
  });
38
38
  });
@@ -1,6 +1,6 @@
1
1
  import { optimizeCallback } from '../../utils/optimizeCallback.js';
2
2
  import { factory } from '../../utils/factory.js';
3
- import { recurse } from '../../utils/array.js';
3
+ import { deepForEach } from '../../utils/array.js';
4
4
  var name = 'forEach';
5
5
  var dependencies = ['typed'];
6
6
  export var createForEach = /* #__PURE__ */factory(name, dependencies, _ref => {
@@ -52,5 +52,5 @@ export var createForEach = /* #__PURE__ */factory(name, dependencies, _ref => {
52
52
  * @private
53
53
  */
54
54
  function _forEach(array, callback) {
55
- recurse(array, [], array, optimizeCallback(callback, array, name));
55
+ deepForEach(array, optimizeCallback(callback, array, name));
56
56
  }
@@ -1,5 +1,5 @@
1
1
  import { optimizeCallback } from '../../utils/optimizeCallback.js';
2
- import { arraySize, broadcastSizes, broadcastTo, get, recurse } from '../../utils/array.js';
2
+ import { arraySize, broadcastSizes, broadcastTo, get, deepMap } from '../../utils/array.js';
3
3
  import { factory } from '../../utils/factory.js';
4
4
  var name = 'map';
5
5
  var dependencies = ['typed'];
@@ -137,6 +137,6 @@ export var createMap = /* #__PURE__ */factory(name, dependencies, _ref => {
137
137
  * @private
138
138
  */
139
139
  function _mapArray(array, callback) {
140
- return recurse(array, [], array, optimizeCallback(callback, array, name));
140
+ return deepMap(array, optimizeCallback(callback, array, name));
141
141
  }
142
142
  });
@@ -7,7 +7,7 @@ export var createPartitionSelect = /* #__PURE__ */factory(name, dependencies, _r
7
7
  var {
8
8
  typed,
9
9
  isNumeric,
10
- isNaN,
10
+ isNaN: mathIsNaN,
11
11
  compare
12
12
  } = _ref;
13
13
  var asc = compare;
@@ -98,7 +98,7 @@ export var createPartitionSelect = /* #__PURE__ */factory(name, dependencies, _r
98
98
 
99
99
  // check for NaN values since these can cause an infinite while loop
100
100
  for (var i = 0; i < arr.length; i++) {
101
- if (isNumeric(arr[i]) && isNaN(arr[i])) {
101
+ if (isNumeric(arr[i]) && mathIsNaN(arr[i])) {
102
102
  return arr[i]; // return NaN
103
103
  }
104
104
  }
@@ -3,13 +3,14 @@ import { factory } from '../../utils/factory.js';
3
3
  import { safeNumberType } from '../../utils/number.js';
4
4
  import { improveErrorMessage } from './utils/improveErrorMessage.js';
5
5
  var name = 'max';
6
- var dependencies = ['typed', 'config', 'numeric', 'larger'];
6
+ var dependencies = ['typed', 'config', 'numeric', 'larger', 'isNaN'];
7
7
  export var createMax = /* #__PURE__ */factory(name, dependencies, _ref => {
8
8
  var {
9
9
  typed,
10
10
  config,
11
11
  numeric,
12
- larger
12
+ larger,
13
+ isNaN: mathIsNaN
13
14
  } = _ref;
14
15
  /**
15
16
  * Compute the maximum value of a matrix or a list with values.
@@ -83,8 +84,8 @@ export var createMax = /* #__PURE__ */factory(name, dependencies, _ref => {
83
84
  var res;
84
85
  deepForEach(array, function (value) {
85
86
  try {
86
- if (typeof value === 'number' && isNaN(value)) {
87
- res = NaN;
87
+ if (mathIsNaN(value)) {
88
+ res = value;
88
89
  } else if (res === undefined || larger(value, res)) {
89
90
  res = value;
90
91
  }
@@ -3,13 +3,14 @@ import { factory } from '../../utils/factory.js';
3
3
  import { safeNumberType } from '../../utils/number.js';
4
4
  import { improveErrorMessage } from './utils/improveErrorMessage.js';
5
5
  var name = 'min';
6
- var dependencies = ['typed', 'config', 'numeric', 'smaller'];
6
+ var dependencies = ['typed', 'config', 'numeric', 'smaller', 'isNaN'];
7
7
  export var createMin = /* #__PURE__ */factory(name, dependencies, _ref => {
8
8
  var {
9
9
  typed,
10
10
  config,
11
11
  numeric,
12
- smaller
12
+ smaller,
13
+ isNaN: mathIsNaN
13
14
  } = _ref;
14
15
  /**
15
16
  * Compute the minimum value of a matrix or a list of values.
@@ -83,8 +84,8 @@ export var createMin = /* #__PURE__ */factory(name, dependencies, _ref => {
83
84
  var min;
84
85
  deepForEach(array, function (value) {
85
86
  try {
86
- if (typeof value === 'number' && isNaN(value)) {
87
- min = NaN;
87
+ if (mathIsNaN(value)) {
88
+ min = value;
88
89
  } else if (min === undefined || smaller(value, min)) {
89
90
  min = value;
90
91
  }
@@ -5,7 +5,7 @@ var dependencies = ['typed', 'isNaN', 'isNumeric'];
5
5
  export var createMode = /* #__PURE__ */factory(name, dependencies, _ref => {
6
6
  var {
7
7
  typed,
8
- isNaN,
8
+ isNaN: mathIsNaN,
9
9
  isNumeric
10
10
  } = _ref;
11
11
  /**
@@ -57,7 +57,7 @@ export var createMode = /* #__PURE__ */factory(name, dependencies, _ref => {
57
57
  var max = 0;
58
58
  for (var i = 0; i < values.length; i++) {
59
59
  var value = values[i];
60
- if (isNumeric(value) && isNaN(value)) {
60
+ if (isNumeric(value) && mathIsNaN(value)) {
61
61
  throw new Error('Cannot calculate mode of an array containing NaN values');
62
62
  }
63
63
  if (!(value in count)) {
@@ -13,7 +13,7 @@ export var createVariance = /* #__PURE__ */factory(name, dependencies, _ref => {
13
13
  multiply,
14
14
  divide,
15
15
  mapSlices,
16
- isNaN
16
+ isNaN: mathIsNaN
17
17
  } = _ref;
18
18
  /**
19
19
  * Compute the variance of a matrix or a list with values.
@@ -123,7 +123,7 @@ export var createVariance = /* #__PURE__ */factory(name, dependencies, _ref => {
123
123
  var diff = subtract(value, mean);
124
124
  sum = sum === undefined ? multiply(diff, diff) : add(sum, multiply(diff, diff));
125
125
  });
126
- if (isNaN(sum)) {
126
+ if (mathIsNaN(sum)) {
127
127
  return sum;
128
128
  }
129
129
  switch (normalization) {
@@ -525,56 +525,35 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
525
525
  * array, and the Matrix being traversed.
526
526
  */
527
527
  DenseMatrix.prototype._forEach = function (callback) {
528
- // matrix instance
529
528
  var me = this;
530
529
  var s = me.size();
531
-
532
- // if there is only one dimension, just loop through it
533
- if (s.length === 1) {
534
- for (var i = 0; i < s[0]; i++) {
530
+ var maxDepth = s.length - 1;
531
+ if (maxDepth < 0) {
532
+ return;
533
+ }
534
+ if (maxDepth === 0) {
535
+ var thisSize = s[0];
536
+ for (var i = 0; i < thisSize; i++) {
535
537
  callback(me._data, i, [i]);
536
538
  }
537
539
  return;
538
540
  }
539
-
540
- // keep track of the current index permutation
541
- var index = Array(s.length).fill(0);
542
-
543
- // store a reference of each dimension of the matrix for faster access
544
- var data = Array(s.length - 1);
545
- var last = data.length - 1;
546
- data[0] = me._data[0];
547
- for (var _i = 0; _i < last; _i++) {
548
- data[_i + 1] = data[_i][0];
549
- }
550
- index[last] = -1;
551
- while (true) {
552
- var _i2 = void 0;
553
- for (_i2 = last; _i2 >= 0; _i2--) {
554
- // march index to the next permutation
555
- index[_i2]++;
556
- if (index[_i2] === s[_i2]) {
557
- index[_i2] = 0;
558
- continue;
559
- }
560
-
561
- // update references to matrix dimensions
562
- data[_i2] = _i2 === 0 ? me._data[index[_i2]] : data[_i2 - 1][index[_i2]];
563
- for (var j = _i2; j < last; j++) {
564
- data[j + 1] = data[j][0];
541
+ var index = Array(s.length);
542
+ function recurse(data, depth) {
543
+ var thisSize = s[depth];
544
+ if (depth < maxDepth) {
545
+ for (var _i = 0; _i < thisSize; _i++) {
546
+ index[depth] = _i;
547
+ recurse(data[_i], depth + 1);
565
548
  }
566
-
567
- // loop through the last dimension and map each value
568
- for (var _j = 0; _j < s[data.length]; _j++) {
569
- index[data.length] = _j;
570
- callback(data[last], _j, index.slice(0));
549
+ } else {
550
+ for (var _i2 = 0; _i2 < thisSize; _i2++) {
551
+ index[depth] = _i2;
552
+ callback(data, _i2, index.slice());
571
553
  }
572
- break;
573
- }
574
- if (_i2 === -1) {
575
- break;
576
554
  }
577
555
  }
556
+ recurse(me._data, 0);
578
557
  };
579
558
 
580
559
  /**
@@ -617,19 +596,37 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
617
596
  * @return {Iterable<{ value, index: number[] }>}
618
597
  */
619
598
  DenseMatrix.prototype[Symbol.iterator] = function* () {
620
- var _recurse = function* recurse(value, index) {
621
- if (isArray(value)) {
622
- for (var i = 0; i < value.length; i++) {
623
- yield* _recurse(value[i], index.concat(i));
624
- }
625
- } else {
599
+ var maxDepth = this._size.length - 1;
600
+ if (maxDepth < 0) {
601
+ return;
602
+ }
603
+ if (maxDepth === 0) {
604
+ for (var i = 0; i < this._data.length; i++) {
626
605
  yield {
627
- value,
628
- index
606
+ value: this._data[i],
607
+ index: [i]
629
608
  };
630
609
  }
610
+ return;
611
+ }
612
+ var index = [];
613
+ var _recurse = function* recurse(value, depth) {
614
+ if (depth < maxDepth) {
615
+ for (var _i3 = 0; _i3 < value.length; _i3++) {
616
+ index[depth] = _i3;
617
+ yield* _recurse(value[_i3], depth + 1);
618
+ }
619
+ } else {
620
+ for (var _i4 = 0; _i4 < value.length; _i4++) {
621
+ index[depth] = _i4;
622
+ yield {
623
+ value: value[_i4],
624
+ index: index.slice()
625
+ };
626
+ }
627
+ }
631
628
  };
632
- yield* _recurse(this._data, []);
629
+ yield* _recurse(this._data, 0);
633
630
  };
634
631
 
635
632
  /**