mathjs 11.10.1 → 11.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. package/HISTORY.md +21 -2
  2. package/lib/browser/math.js +1 -1
  3. package/lib/browser/math.js.LICENSE.txt +4 -4
  4. package/lib/browser/math.js.map +1 -1
  5. package/lib/cjs/entry/dependenciesAny/dependenciesCorr.generated.js +36 -0
  6. package/lib/cjs/entry/dependenciesAny/dependenciesGcd.generated.js +4 -0
  7. package/lib/cjs/entry/dependenciesAny/dependenciesMod.generated.js +4 -0
  8. package/lib/cjs/entry/dependenciesAny/dependenciesPrintTransform.generated.js +24 -0
  9. package/lib/cjs/entry/dependenciesAny/dependenciesQuantileSeq.generated.js +12 -0
  10. package/lib/cjs/entry/dependenciesAny/dependenciesQuantileSeqTransform.generated.js +12 -0
  11. package/lib/cjs/entry/dependenciesAny.generated.js +14 -0
  12. package/lib/cjs/entry/dependenciesNumber/dependenciesCorr.generated.js +36 -0
  13. package/lib/cjs/entry/dependenciesNumber/dependenciesQuantileSeq.generated.js +10 -0
  14. package/lib/cjs/entry/dependenciesNumber.generated.js +7 -0
  15. package/lib/cjs/entry/impureFunctionsAny.generated.js +48 -35
  16. package/lib/cjs/entry/impureFunctionsNumber.generated.js +17 -16
  17. package/lib/cjs/entry/pureFunctionsAny.generated.js +101 -76
  18. package/lib/cjs/entry/pureFunctionsNumber.generated.js +46 -28
  19. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +2 -0
  20. package/lib/cjs/expression/embeddedDocs/function/statistics/corr.js +15 -0
  21. package/lib/cjs/expression/embeddedDocs/function/utils/print.js +1 -1
  22. package/lib/cjs/expression/node/FunctionNode.js +3 -1
  23. package/lib/cjs/expression/transform/print.transform.js +47 -0
  24. package/lib/cjs/expression/transform/quantileSeq.transform.js +27 -5
  25. package/lib/cjs/factoriesAny.js +15 -1
  26. package/lib/cjs/factoriesNumber.js +10 -4
  27. package/lib/cjs/function/algebra/simplify/util.js +2 -2
  28. package/lib/cjs/function/arithmetic/gcd.js +40 -4
  29. package/lib/cjs/function/arithmetic/mod.js +32 -3
  30. package/lib/cjs/function/numeric/solveODE.js +2 -2
  31. package/lib/cjs/function/statistics/corr.js +85 -0
  32. package/lib/cjs/function/statistics/quantileSeq.js +90 -167
  33. package/lib/cjs/function/string/print.js +5 -1
  34. package/lib/cjs/header.js +2 -2
  35. package/lib/cjs/plain/number/arithmetic.js +4 -12
  36. package/lib/cjs/type/unit/Unit.js +2 -2
  37. package/lib/cjs/utils/print.js +8 -0
  38. package/lib/cjs/utils/snapshot.js +8 -8
  39. package/lib/cjs/version.js +1 -1
  40. package/lib/esm/entry/dependenciesAny/dependenciesCorr.generated.js +28 -0
  41. package/lib/esm/entry/dependenciesAny/dependenciesGcd.generated.js +4 -0
  42. package/lib/esm/entry/dependenciesAny/dependenciesMod.generated.js +4 -0
  43. package/lib/esm/entry/dependenciesAny/dependenciesPrintTransform.generated.js +16 -0
  44. package/lib/esm/entry/dependenciesAny/dependenciesQuantileSeq.generated.js +12 -0
  45. package/lib/esm/entry/dependenciesAny/dependenciesQuantileSeqTransform.generated.js +12 -0
  46. package/lib/esm/entry/dependenciesAny.generated.js +2 -0
  47. package/lib/esm/entry/dependenciesNumber/dependenciesCorr.generated.js +28 -0
  48. package/lib/esm/entry/dependenciesNumber/dependenciesQuantileSeq.generated.js +10 -0
  49. package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
  50. package/lib/esm/entry/impureFunctionsAny.generated.js +49 -36
  51. package/lib/esm/entry/impureFunctionsNumber.generated.js +19 -18
  52. package/lib/esm/entry/pureFunctionsAny.generated.js +85 -61
  53. package/lib/esm/entry/pureFunctionsNumber.generated.js +39 -22
  54. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +2 -0
  55. package/lib/esm/expression/embeddedDocs/function/statistics/corr.js +8 -0
  56. package/lib/esm/expression/embeddedDocs/function/utils/print.js +1 -1
  57. package/lib/esm/expression/node/FunctionNode.js +3 -1
  58. package/lib/esm/expression/transform/print.transform.js +42 -0
  59. package/lib/esm/expression/transform/quantileSeq.transform.js +23 -5
  60. package/lib/esm/factoriesAny.js +3 -1
  61. package/lib/esm/factoriesNumber.js +1 -0
  62. package/lib/esm/function/algebra/simplify/util.js +2 -2
  63. package/lib/esm/function/arithmetic/gcd.js +40 -4
  64. package/lib/esm/function/arithmetic/mod.js +32 -3
  65. package/lib/esm/function/numeric/solveODE.js +2 -2
  66. package/lib/esm/function/statistics/corr.js +74 -0
  67. package/lib/esm/function/statistics/quantileSeq.js +82 -165
  68. package/lib/esm/function/string/print.js +5 -1
  69. package/lib/esm/plain/number/arithmetic.js +4 -12
  70. package/lib/esm/type/unit/Unit.js +2 -2
  71. package/lib/esm/utils/print.js +1 -0
  72. package/lib/esm/utils/snapshot.js +2 -2
  73. package/lib/esm/version.js +1 -1
  74. package/package.json +21 -21
  75. package/types/index.d.ts +8 -0
@@ -375,6 +375,12 @@ Object.defineProperty(exports, "createConstantNode", {
375
375
  return _ConstantNode.createConstantNode;
376
376
  }
377
377
  });
378
+ Object.defineProperty(exports, "createCorr", {
379
+ enumerable: true,
380
+ get: function get() {
381
+ return _corr.createCorr;
382
+ }
383
+ });
378
384
  Object.defineProperty(exports, "createCos", {
379
385
  enumerable: true,
380
386
  get: function get() {
@@ -1461,6 +1467,12 @@ Object.defineProperty(exports, "createPrint", {
1461
1467
  return _print.createPrint;
1462
1468
  }
1463
1469
  });
1470
+ Object.defineProperty(exports, "createPrintTransform", {
1471
+ enumerable: true,
1472
+ get: function get() {
1473
+ return _printTransform.createPrintTransform;
1474
+ }
1475
+ });
1464
1476
  Object.defineProperty(exports, "createProd", {
1465
1477
  enumerable: true,
1466
1478
  get: function get() {
@@ -2366,6 +2378,7 @@ var _mad = require("./function/statistics/mad.js");
2366
2378
  var _variance = require("./function/statistics/variance.js");
2367
2379
  var _quantileSeq = require("./function/statistics/quantileSeq.js");
2368
2380
  var _std = require("./function/statistics/std.js");
2381
+ var _corr = require("./function/statistics/corr.js");
2369
2382
  var _combinations = require("./function/probability/combinations.js");
2370
2383
  var _combinationsWithRep = require("./function/probability/combinationsWithRep.js");
2371
2384
  var _gamma = require("./function/probability/gamma.js");
@@ -2413,4 +2426,5 @@ var _stdTransform = require("./expression/transform/std.transform.js");
2413
2426
  var _sumTransform = require("./expression/transform/sum.transform.js");
2414
2427
  var _quantileSeqTransform = require("./expression/transform/quantileSeq.transform.js");
2415
2428
  var _cumsumTransform = require("./expression/transform/cumsum.transform.js");
2416
- var _varianceTransform = require("./expression/transform/variance.transform.js");
2429
+ var _varianceTransform = require("./expression/transform/variance.transform.js");
2430
+ var _printTransform = require("./expression/transform/print.transform.js");
@@ -136,6 +136,12 @@ Object.defineProperty(exports, "createConstantNode", {
136
136
  return _ConstantNode.createConstantNode;
137
137
  }
138
138
  });
139
+ Object.defineProperty(exports, "createCorr", {
140
+ enumerable: true,
141
+ get: function get() {
142
+ return _corr.createCorr;
143
+ }
144
+ });
139
145
  exports.createCube = exports.createCsch = exports.createCsc = exports.createCoth = exports.createCot = exports.createCosh = exports.createCos = void 0;
140
146
  Object.defineProperty(exports, "createCumSum", {
141
147
  enumerable: true,
@@ -354,8 +360,8 @@ Object.defineProperty(exports, "createLargerEq", {
354
360
  return _largerEq.createLargerEqNumber;
355
361
  }
356
362
  });
357
- exports.createLeftShift = exports.createLcm = void 0;
358
- exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = void 0;
363
+ exports.createLcm = void 0;
364
+ exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = exports.createLeftShift = void 0;
359
365
  Object.defineProperty(exports, "createMad", {
360
366
  enumerable: true,
361
367
  get: function get() {
@@ -777,8 +783,7 @@ Object.defineProperty(exports, "createVersion", {
777
783
  return _constants.createVersion;
778
784
  }
779
785
  });
780
- exports.createXgcd = void 0;
781
- exports.createXor = void 0;
786
+ exports.createXor = exports.createXgcd = void 0;
782
787
  Object.defineProperty(exports, "createZeta", {
783
788
  enumerable: true,
784
789
  get: function get() {
@@ -874,6 +879,7 @@ var _mad = require("./function/statistics/mad.js");
874
879
  var _variance = require("./function/statistics/variance.js");
875
880
  var _quantileSeq = require("./function/statistics/quantileSeq.js");
876
881
  var _std = require("./function/statistics/std.js");
882
+ var _corr = require("./function/statistics/corr.js");
877
883
  var _format = require("./function/string/format.js");
878
884
  var _print = require("./function/string/print.js");
879
885
  var _applyTransform = require("./expression/transform/apply.transform.js");
@@ -9,8 +9,8 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
9
9
  var _is = require("../../../utils/is.js");
10
10
  var _factory = require("../../../utils/factory.js");
11
11
  var _object = require("../../../utils/object.js");
12
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
12
+ 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; }
13
+ 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; }
14
14
  var name = 'simplifyUtil';
15
15
  var dependencies = ['FunctionNode', 'OperatorNode', 'SymbolNode'];
16
16
  var createUtil = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
@@ -7,15 +7,16 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.createGcd = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _number = require("../../utils/number.js");
10
11
  var _factory = require("../../utils/factory.js");
12
+ var _mod = require("./mod.js");
11
13
  var _matAlgo01xDSid = require("../../type/matrix/utils/matAlgo01xDSid.js");
12
14
  var _matAlgo04xSidSid = require("../../type/matrix/utils/matAlgo04xSidSid.js");
13
15
  var _matAlgo10xSids = require("../../type/matrix/utils/matAlgo10xSids.js");
14
16
  var _matrixAlgorithmSuite = require("../../type/matrix/utils/matrixAlgorithmSuite.js");
15
- var _index = require("../../plain/number/index.js");
16
17
  var _ArgumentsError = require("../../error/ArgumentsError.js");
17
18
  var name = 'gcd';
18
- var dependencies = ['typed', 'matrix', 'equalScalar', 'BigNumber', 'DenseMatrix', 'concat'];
19
+ var dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar', 'zeros', 'BigNumber', 'DenseMatrix', 'concat'];
19
20
  var gcdTypes = 'number | BigNumber | Fraction | Matrix | Array';
20
21
  var gcdManyTypesSignature = "".concat(gcdTypes, ", ").concat(gcdTypes, ", ...").concat(gcdTypes);
21
22
  function is1d(array) {
@@ -27,10 +28,23 @@ var createGcd = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
27
28
  var _typed;
28
29
  var typed = _ref.typed,
29
30
  matrix = _ref.matrix,
31
+ config = _ref.config,
32
+ round = _ref.round,
30
33
  equalScalar = _ref.equalScalar,
34
+ zeros = _ref.zeros,
31
35
  BigNumber = _ref.BigNumber,
32
36
  DenseMatrix = _ref.DenseMatrix,
33
37
  concat = _ref.concat;
38
+ var mod = (0, _mod.createMod)({
39
+ typed: typed,
40
+ config: config,
41
+ round: round,
42
+ matrix: matrix,
43
+ equalScalar: equalScalar,
44
+ zeros: zeros,
45
+ DenseMatrix: DenseMatrix,
46
+ concat: concat
47
+ });
34
48
  var matAlgo01xDSid = (0, _matAlgo01xDSid.createMatAlgo01xDSid)({
35
49
  typed: typed
36
50
  });
@@ -74,7 +88,7 @@ var createGcd = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
74
88
  * @return {number | BigNumber | Fraction | Array | Matrix} The greatest common divisor
75
89
  */
76
90
  return typed(name, {
77
- 'number, number': _index.gcdNumber,
91
+ 'number, number': _gcdNumber,
78
92
  'BigNumber, BigNumber': _gcdBigNumber,
79
93
  'Fraction, Fraction': function FractionFraction(x, y) {
80
94
  return x.gcd(y);
@@ -107,6 +121,28 @@ var createGcd = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
107
121
  };
108
122
  })), _typed));
109
123
 
124
+ /**
125
+ * Calculate gcd for numbers
126
+ * @param {number} a
127
+ * @param {number} b
128
+ * @returns {number} Returns the greatest common denominator of a and b
129
+ * @private
130
+ */
131
+ function _gcdNumber(a, b) {
132
+ if (!(0, _number.isInteger)(a) || !(0, _number.isInteger)(b)) {
133
+ throw new Error('Parameters in function gcd must be integer numbers');
134
+ }
135
+
136
+ // https://en.wikipedia.org/wiki/Euclidean_algorithm
137
+ var r;
138
+ while (b !== 0) {
139
+ r = mod(a, b);
140
+ a = b;
141
+ b = r;
142
+ }
143
+ return a < 0 ? -a : a;
144
+ }
145
+
110
146
  /**
111
147
  * Calculate gcd for BigNumbers
112
148
  * @param {BigNumber} a
@@ -122,7 +158,7 @@ var createGcd = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
122
158
  // https://en.wikipedia.org/wiki/Euclidean_algorithm
123
159
  var zero = new BigNumber(0);
124
160
  while (!b.isZero()) {
125
- var r = a.mod(b);
161
+ var r = mod(a, b);
126
162
  a = b;
127
163
  b = r;
128
164
  }
@@ -5,21 +5,33 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createMod = void 0;
7
7
  var _factory = require("../../utils/factory.js");
8
+ var _floor = require("./floor.js");
8
9
  var _matAlgo02xDS = require("../../type/matrix/utils/matAlgo02xDS0.js");
9
10
  var _matAlgo03xDSf = require("../../type/matrix/utils/matAlgo03xDSf.js");
10
11
  var _matAlgo05xSfSf = require("../../type/matrix/utils/matAlgo05xSfSf.js");
11
12
  var _matAlgo11xS0s = require("../../type/matrix/utils/matAlgo11xS0s.js");
12
13
  var _matAlgo12xSfs = require("../../type/matrix/utils/matAlgo12xSfs.js");
13
- var _index = require("../../plain/number/index.js");
14
14
  var _matrixAlgorithmSuite = require("../../type/matrix/utils/matrixAlgorithmSuite.js");
15
15
  var name = 'mod';
16
- var dependencies = ['typed', 'matrix', 'equalScalar', 'DenseMatrix', 'concat'];
16
+ var dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix', 'concat'];
17
17
  var createMod = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
18
18
  var typed = _ref.typed,
19
+ config = _ref.config,
20
+ round = _ref.round,
19
21
  matrix = _ref.matrix,
20
22
  equalScalar = _ref.equalScalar,
23
+ zeros = _ref.zeros,
21
24
  DenseMatrix = _ref.DenseMatrix,
22
25
  concat = _ref.concat;
26
+ var floor = (0, _floor.createFloor)({
27
+ typed: typed,
28
+ config: config,
29
+ round: round,
30
+ matrix: matrix,
31
+ equalScalar: equalScalar,
32
+ zeros: zeros,
33
+ DenseMatrix: DenseMatrix
34
+ });
23
35
  var matAlgo02xDS0 = (0, _matAlgo02xDS.createMatAlgo02xDS0)({
24
36
  typed: typed,
25
37
  equalScalar: equalScalar
@@ -81,7 +93,7 @@ var createMod = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
81
93
  * @return {number | BigNumber | Fraction | Array | Matrix} Returns the remainder of `x` divided by `y`.
82
94
  */
83
95
  return typed(name, {
84
- 'number, number': _index.modNumber,
96
+ 'number, number': _modNumber,
85
97
  'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {
86
98
  if (y.isNeg()) {
87
99
  throw new Error('Cannot calculate mod for a negative divisor');
@@ -102,5 +114,22 @@ var createMod = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
102
114
  Ss: matAlgo11xS0s,
103
115
  sS: matAlgo12xSfs
104
116
  }));
117
+
118
+ /**
119
+ * Calculate the modulus of two numbers
120
+ * @param {number} x
121
+ * @param {number} y
122
+ * @returns {number} res
123
+ * @private
124
+ */
125
+ function _modNumber(x, y) {
126
+ // We don't use JavaScript's % operator here as this doesn't work
127
+ // correctly for x < 0 and x === 0
128
+ // see https://en.wikipedia.org/wiki/Modulo_operation
129
+
130
+ // We use mathjs floor to handle errors associated with
131
+ // precision float approximation
132
+ return y === 0 ? x : x - y * floor(x / y);
133
+ }
105
134
  });
106
135
  exports.createMod = createMod;
@@ -10,8 +10,8 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
11
  var _is = require("../../utils/is.js");
12
12
  var _factory = require("../../utils/factory.js");
13
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
14
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
13
+ 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; }
14
+ 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; }
15
15
  var name = 'solveODE';
16
16
  var dependencies = ['typed', 'add', 'subtract', 'multiply', 'divide', 'max', 'map', 'abs', 'isPositive', 'isNegative', 'larger', 'smaller', 'matrix', 'bignumber', 'unaryMinus'];
17
17
  var createSolveODE = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createCorr = void 0;
7
+ var _factory = require("../../utils/factory.js");
8
+ var name = 'corr';
9
+ var dependencies = ['typed', 'matrix', 'mean', 'sqrt', 'sum', 'add', 'subtract', 'multiply', 'pow', 'divide'];
10
+ var createCorr = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
11
+ var typed = _ref.typed,
12
+ matrix = _ref.matrix,
13
+ sqrt = _ref.sqrt,
14
+ sum = _ref.sum,
15
+ add = _ref.add,
16
+ subtract = _ref.subtract,
17
+ multiply = _ref.multiply,
18
+ pow = _ref.pow,
19
+ divide = _ref.divide;
20
+ /**
21
+ * Compute the correlation coefficient of a two list with values, For matrices, the matrix correlation coefficient is calculated.
22
+ *
23
+ * Syntax:
24
+ *
25
+ * math.corr(A, B)
26
+ *
27
+ * Examples:
28
+ *
29
+ * math.corr([1, 2, 3, 4, 5], [4, 5, 6, 7, 8]) // returns 1
30
+ * math.corr([1, 2.2, 3, 4.8, 5], [4, 5.3, 6.6, 7, 8]) // returns 0.9569941688503644
31
+ * math.corr(math.matrix([[1, 2.2, 3, 4.8, 5], [1, 2, 3, 4, 5]]), math.matrix([[4, 5.3, 6.6, 7, 8], [1, 2, 3, 4, 5]])) // returns DenseMatrix [0.9569941688503644, 1]
32
+ *
33
+ * See also:
34
+ *
35
+ * median, mean, min, max, sum, prod, std, variance
36
+ *
37
+ * @param {Array | Matrix} A The first array or matrix to compute correlation coefficient
38
+ * @param {Array | Matrix} B The second array or matrix to compute correlation coefficient
39
+ * @return {*} The correlation coefficient
40
+ */
41
+ return typed(name, {
42
+ 'Array, Array': function ArrayArray(A, B) {
43
+ return _corr(A, B);
44
+ },
45
+ 'Matrix, Matrix': function MatrixMatrix(xMatrix, yMatrix) {
46
+ return matrix(_corr(xMatrix.toArray(), yMatrix.toArray()));
47
+ }
48
+ });
49
+ /**
50
+ * Calculate the correlation coefficient between two arrays or matrices.
51
+ * @param {Array | Matrix} A
52
+ * @param {Array | Matrix} B
53
+ * @return {*} correlation coefficient
54
+ * @private
55
+ */
56
+ function _corr(A, B) {
57
+ if (Array.isArray(A[0]) && Array.isArray(B[0])) {
58
+ var correlations = [];
59
+ for (var i = 0; i < A.length; i++) {
60
+ correlations.push(correlation(A[i], B[i]));
61
+ }
62
+ return correlations;
63
+ } else {
64
+ return correlation(A, B);
65
+ }
66
+ }
67
+ function correlation(A, B) {
68
+ var n = A.length;
69
+ var sumX = sum(A);
70
+ var sumY = sum(B);
71
+ var sumXY = A.reduce(function (acc, x, index) {
72
+ return add(acc, multiply(x, B[index]));
73
+ }, 0);
74
+ var sumXSquare = sum(A.map(function (x) {
75
+ return pow(x, 2);
76
+ }));
77
+ var sumYSquare = sum(B.map(function (y) {
78
+ return pow(y, 2);
79
+ }));
80
+ var numerator = subtract(multiply(n, sumXY), multiply(sumX, sumY));
81
+ var denominator = sqrt(multiply(subtract(multiply(n, sumXSquare), pow(sumX, 2)), subtract(multiply(n, sumYSquare), pow(sumY, 2))));
82
+ return divide(numerator, denominator);
83
+ }
84
+ });
85
+ exports.createCorr = createCorr;
@@ -9,14 +9,25 @@ var _array = require("../../utils/array.js");
9
9
  var _factory = require("../../utils/factory.js");
10
10
  var _apply = require("../matrix/apply.js");
11
11
  var name = 'quantileSeq';
12
- var dependencies = ['typed', 'add', 'multiply', 'partitionSelect', 'compare', 'isInteger'];
12
+ var dependencies = ['typed', '?bignumber', 'add', 'subtract', 'divide', 'multiply', 'partitionSelect', 'compare', 'isInteger', 'smaller', 'smallerEq', 'larger'];
13
13
  var createQuantileSeq = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
14
14
  var typed = _ref.typed,
15
+ bignumber = _ref.bignumber,
15
16
  add = _ref.add,
17
+ subtract = _ref.subtract,
18
+ divide = _ref.divide,
16
19
  multiply = _ref.multiply,
17
20
  partitionSelect = _ref.partitionSelect,
18
21
  compare = _ref.compare,
19
- isInteger = _ref.isInteger;
22
+ isInteger = _ref.isInteger,
23
+ smaller = _ref.smaller,
24
+ smallerEq = _ref.smallerEq,
25
+ larger = _ref.larger;
26
+ var apply = (0, _apply.createApply)({
27
+ typed: typed,
28
+ isInteger: isInteger
29
+ });
30
+
20
31
  /**
21
32
  * Compute the prob order quantile of a matrix or a list with values.
22
33
  * The sequence is sorted and the middle value is returned.
@@ -51,130 +62,83 @@ var createQuantileSeq = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
51
62
  * @param {Boolean} sorted=false is data sorted in ascending order
52
63
  * @return {Number, BigNumber, Unit, Array} Quantile(s)
53
64
  */
54
-
55
- var apply = (0, _apply.createApply)({
56
- typed: typed,
57
- isInteger: isInteger
58
- });
59
- /**
60
- * Check if array value types are valid, throw error otherwise.
61
- * @param {number | BigNumber | Unit} x
62
- * @param {number | BigNumber | Unit} x
63
- * @private
64
- */
65
- var validate = typed({
66
- 'number | BigNumber | Unit': function numberBigNumberUnit(x) {
67
- return x;
68
- }
69
- });
70
65
  return typed(name, {
71
- 'Array|Matrix, number|BigNumber|Array': function ArrayMatrixNumberBigNumberArray(data, prob) {
72
- return quantileSeq(data, prob, false);
66
+ 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(data, p) {
67
+ return _quantileSeqProbNumber(data, p, false);
68
+ },
69
+ 'Array | Matrix, number | BigNumber, number': function ArrayMatrixNumberBigNumberNumber(data, prob, dim) {
70
+ return _quantileSeqDim(data, prob, false, dim, _quantileSeqProbNumber);
71
+ },
72
+ 'Array | Matrix, number | BigNumber, boolean': _quantileSeqProbNumber,
73
+ 'Array | Matrix, number | BigNumber, boolean, number': function ArrayMatrixNumberBigNumberBooleanNumber(data, prob, sorted, dim) {
74
+ return _quantileSeqDim(data, prob, sorted, dim, _quantileSeqProbNumber);
73
75
  },
74
- 'Array|Matrix, number|BigNumber|Array, boolean': quantileSeq,
75
- 'Array|Matrix, number|BigNumber|Array, number': function ArrayMatrixNumberBigNumberArrayNumber(data, prob, dim) {
76
- return _quantileSeqDim(data, prob, false, dim);
76
+ 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(data, p) {
77
+ return _quantileSeqProbCollection(data, p, false);
77
78
  },
78
- 'Array|Matrix, number|BigNumber|Array, boolean, number': function ArrayMatrixNumberBigNumberArrayBooleanNumber(data, prob, sorted, dim) {
79
- return _quantileSeqDim(data, prob, sorted, dim);
79
+ 'Array | Matrix, Array | Matrix, number': function ArrayMatrixArrayMatrixNumber(data, prob, dim) {
80
+ return _quantileSeqDim(data, prob, false, dim, _quantileSeqProbCollection);
81
+ },
82
+ 'Array | Matrix, Array | Matrix, boolean': _quantileSeqProbCollection,
83
+ 'Array | Matrix, Array | Matrix, boolean, number': function ArrayMatrixArrayMatrixBooleanNumber(data, prob, sorted, dim) {
84
+ return _quantileSeqDim(data, prob, sorted, dim, _quantileSeqProbCollection);
80
85
  }
81
86
  });
82
- function _quantileSeqDim(data, prob, sorted, dim) {
83
- // return [1.3, 1.2]
87
+ function _quantileSeqDim(data, prob, sorted, dim, fn) {
84
88
  return apply(data, dim, function (x) {
85
- return quantileSeq(x, prob, sorted);
89
+ return fn(x, prob, sorted);
86
90
  });
87
91
  }
88
- function quantileSeq(data, probOrN, sorted) {
89
- var probArr, dataArr, one;
90
- if (arguments.length < 2 || arguments.length > 3) {
91
- throw new SyntaxError('Function quantileSeq requires two or three parameters');
92
+ function _quantileSeqProbNumber(data, probOrN, sorted) {
93
+ var probArr;
94
+ var dataArr = data.valueOf();
95
+ if (smaller(probOrN, 0)) {
96
+ throw new Error('N/prob must be non-negative');
92
97
  }
93
- if ((0, _is.isCollection)(data)) {
94
- sorted = sorted || false;
95
- if (typeof sorted === 'boolean') {
96
- dataArr = data.valueOf();
97
- if ((0, _is.isNumber)(probOrN)) {
98
- if (probOrN < 0) {
99
- throw new Error('N/prob must be non-negative');
100
- }
101
- if (probOrN <= 1) {
102
- // quantileSeq([a, b, c, d, ...], prob[,sorted])
103
- return _quantileSeq(dataArr, probOrN, sorted);
104
- }
105
- if (probOrN > 1) {
106
- // quantileSeq([a, b, c, d, ...], N[,sorted])
107
- if (!isInteger(probOrN)) {
108
- throw new Error('N must be a positive integer');
109
- }
110
- var nPlusOne = probOrN + 1;
111
- probArr = new Array(probOrN);
112
- for (var i = 0; i < probOrN;) {
113
- probArr[i] = _quantileSeq(dataArr, ++i / nPlusOne, sorted);
114
- }
115
- return probArr;
116
- }
117
- }
118
- if ((0, _is.isBigNumber)(probOrN)) {
119
- var BigNumber = probOrN.constructor;
120
- if (probOrN.isNegative()) {
121
- throw new Error('N/prob must be non-negative');
122
- }
123
- one = new BigNumber(1);
124
- if (probOrN.lte(one)) {
125
- // quantileSeq([a, b, c, d, ...], prob[,sorted])
126
- return new BigNumber(_quantileSeq(dataArr, probOrN, sorted));
127
- }
128
- if (probOrN.gt(one)) {
129
- // quantileSeq([a, b, c, d, ...], N[,sorted])
130
- if (!probOrN.isInteger()) {
131
- throw new Error('N must be a positive integer');
132
- }
133
-
134
- // largest possible Array length is 2^32-1
135
- // 2^32 < 10^15, thus safe conversion guaranteed
136
- var intN = probOrN.toNumber();
137
- if (intN > 4294967295) {
138
- throw new Error('N must be less than or equal to 2^32-1, as that is the maximum length of an Array');
139
- }
140
- var _nPlusOne = new BigNumber(intN + 1);
141
- probArr = new Array(intN);
142
- for (var _i = 0; _i < intN;) {
143
- probArr[_i] = new BigNumber(_quantileSeq(dataArr, new BigNumber(++_i).div(_nPlusOne), sorted));
144
- }
145
- return probArr;
146
- }
147
- }
148
- if ((0, _is.isCollection)(probOrN)) {
149
- // quantileSeq([a, b, c, d, ...], [prob1, prob2, ...][,sorted])
150
- var probOrNArr = probOrN.valueOf();
151
- probArr = new Array(probOrNArr.length);
152
- for (var _i2 = 0; _i2 < probArr.length; ++_i2) {
153
- var currProb = probOrNArr[_i2];
154
- if ((0, _is.isNumber)(currProb)) {
155
- if (currProb < 0 || currProb > 1) {
156
- throw new Error('Probability must be between 0 and 1, inclusive');
157
- }
158
- } else if ((0, _is.isBigNumber)(currProb)) {
159
- one = new currProb.constructor(1);
160
- if (currProb.isNegative() || currProb.gt(one)) {
161
- throw new Error('Probability must be between 0 and 1, inclusive');
162
- }
163
- } else {
164
- throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function
165
- }
166
-
167
- probArr[_i2] = _quantileSeq(dataArr, currProb, sorted);
168
- }
169
- return probArr;
170
- }
171
- throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function
98
+ if (smallerEq(probOrN, 1)) {
99
+ // quantileSeq([a, b, c, d, ...], prob[,sorted])
100
+ return (0, _is.isNumber)(probOrN) ? _quantileSeq(dataArr, probOrN, sorted) : bignumber(_quantileSeq(dataArr, probOrN, sorted));
101
+ }
102
+ if (larger(probOrN, 1)) {
103
+ // quantileSeq([a, b, c, d, ...], N[,sorted])
104
+ if (!isInteger(probOrN)) {
105
+ throw new Error('N must be a positive integer');
172
106
  }
173
107
 
174
- throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function
108
+ // largest possible Array length is 2^32-1
109
+ // 2^32 < 10^15, thus safe conversion guaranteed
110
+ if (larger(probOrN, 4294967295)) {
111
+ throw new Error('N must be less than or equal to 2^32-1, as that is the maximum length of an Array');
112
+ }
113
+ var nPlusOne = add(probOrN, 1);
114
+ probArr = [];
115
+ for (var i = 0; smaller(i, probOrN); i++) {
116
+ var prob = divide(i + 1, nPlusOne);
117
+ probArr.push(_quantileSeq(dataArr, prob, sorted));
118
+ }
119
+ return (0, _is.isNumber)(probOrN) ? probArr : bignumber(probArr);
175
120
  }
121
+ }
122
+
123
+ /**
124
+ * Calculate the prob order quantile of an n-dimensional array.
125
+ *
126
+ * @param {Array, Matrix} array
127
+ * @param {Array, Matrix} prob
128
+ * @param {Boolean} sorted
129
+ * @return {Number, BigNumber, Unit} prob order quantile
130
+ * @private
131
+ */
176
132
 
177
- throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function
133
+ function _quantileSeqProbCollection(data, probOrN, sorted) {
134
+ var dataArr = data.valueOf();
135
+ // quantileSeq([a, b, c, d, ...], [prob1, prob2, ...][,sorted])
136
+ var probOrNArr = probOrN.valueOf();
137
+ var probArr = [];
138
+ for (var i = 0; i < probOrNArr.length; ++i) {
139
+ probArr.push(_quantileSeq(dataArr, probOrNArr[i], sorted));
140
+ }
141
+ return probArr;
178
142
  }
179
143
 
180
144
  /**
@@ -192,71 +156,30 @@ var createQuantileSeq = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
192
156
  if (len === 0) {
193
157
  throw new Error('Cannot calculate quantile of an empty sequence');
194
158
  }
195
- if ((0, _is.isNumber)(prob)) {
196
- var _index = prob * (len - 1);
197
- var _fracPart = _index % 1;
198
- if (_fracPart === 0) {
199
- var value = sorted ? flat[_index] : partitionSelect(flat, _index);
200
- validate(value);
201
- return value;
202
- }
203
- var _integerPart = Math.floor(_index);
204
- var _left;
205
- var _right;
206
- if (sorted) {
207
- _left = flat[_integerPart];
208
- _right = flat[_integerPart + 1];
209
- } else {
210
- _right = partitionSelect(flat, _integerPart + 1);
211
-
212
- // max of partition is kth largest
213
- _left = flat[_integerPart];
214
- for (var i = 0; i < _integerPart; ++i) {
215
- if (compare(flat[i], _left) > 0) {
216
- _left = flat[i];
217
- }
218
- }
219
- }
220
- validate(_left);
221
- validate(_right);
222
-
223
- // Q(prob) = (1-f)*A[floor(index)] + f*A[floor(index)+1]
224
- return add(multiply(_left, 1 - _fracPart), multiply(_right, _fracPart));
159
+ var index = (0, _is.isNumber)(prob) ? prob * (len - 1) : prob.times(len - 1);
160
+ var integerPart = (0, _is.isNumber)(prob) ? Math.floor(index) : index.floor().toNumber();
161
+ var fracPart = (0, _is.isNumber)(prob) ? index % 1 : index.minus(integerPart);
162
+ if (isInteger(index)) {
163
+ return sorted ? flat[index] : partitionSelect(flat, (0, _is.isNumber)(prob) ? index : index.valueOf());
225
164
  }
226
-
227
- // If prob is a BigNumber
228
- var index = prob.times(len - 1);
229
- if (index.isInteger()) {
230
- index = index.toNumber();
231
- var _value = sorted ? flat[index] : partitionSelect(flat, index);
232
- validate(_value);
233
- return _value;
234
- }
235
- var integerPart = index.floor();
236
- var fracPart = index.minus(integerPart);
237
- var integerPartNumber = integerPart.toNumber();
238
165
  var left;
239
166
  var right;
240
167
  if (sorted) {
241
- left = flat[integerPartNumber];
242
- right = flat[integerPartNumber + 1];
168
+ left = flat[integerPart];
169
+ right = flat[integerPart + 1];
243
170
  } else {
244
- right = partitionSelect(flat, integerPartNumber + 1);
171
+ right = partitionSelect(flat, integerPart + 1);
245
172
 
246
173
  // max of partition is kth largest
247
- left = flat[integerPartNumber];
248
- for (var _i3 = 0; _i3 < integerPartNumber; ++_i3) {
249
- if (compare(flat[_i3], left) > 0) {
250
- left = flat[_i3];
174
+ left = flat[integerPart];
175
+ for (var i = 0; i < integerPart; ++i) {
176
+ if (compare(flat[i], left) > 0) {
177
+ left = flat[i];
251
178
  }
252
179
  }
253
180
  }
254
- validate(left);
255
- validate(right);
256
-
257
181
  // Q(prob) = (1-f)*A[floor(index)] + f*A[floor(index)+1]
258
- var one = new fracPart.constructor(1);
259
- return add(multiply(left, one.minus(fracPart)), multiply(right, fracPart));
182
+ return add(multiply(left, subtract(1, fracPart)), multiply(right, fracPart));
260
183
  }
261
184
  });
262
185
  exports.createQuantileSeq = createQuantileSeq;