mathjs 10.2.0 → 10.4.1

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 (86) hide show
  1. package/HISTORY.md +43 -0
  2. package/docs/expressions/syntax.md +31 -2
  3. package/docs/reference/functions/cumsum.md +57 -0
  4. package/docs/reference/functions/format.md +1 -1
  5. package/docs/reference/functions/map.md +22 -5
  6. package/docs/reference/functions/subset.md +10 -2
  7. package/docs/reference/functions/sum.md +2 -1
  8. package/docs/reference/functions/symbolicEqual.md +62 -0
  9. package/docs/reference/functions.md +3 -1
  10. package/lib/browser/math.js +6 -6
  11. package/lib/browser/math.js.map +1 -1
  12. package/lib/cjs/entry/dependenciesAny/dependenciesCumSum.generated.js +26 -0
  13. package/lib/cjs/entry/dependenciesAny/dependenciesCumSumTransform.generated.js +26 -0
  14. package/lib/cjs/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +29 -0
  15. package/lib/cjs/entry/dependenciesAny.generated.js +24 -0
  16. package/lib/cjs/entry/dependenciesNumber/dependenciesCumSum.generated.js +26 -0
  17. package/lib/cjs/entry/dependenciesNumber/dependenciesCumSumTransform.generated.js +26 -0
  18. package/lib/cjs/entry/dependenciesNumber.generated.js +16 -0
  19. package/lib/cjs/entry/impureFunctionsAny.generated.js +22 -8
  20. package/lib/cjs/entry/impureFunctionsNumber.generated.js +6 -0
  21. package/lib/cjs/entry/pureFunctionsAny.generated.js +18 -12
  22. package/lib/cjs/entry/pureFunctionsNumber.generated.js +8 -2
  23. package/lib/cjs/expression/embeddedDocs/construction/fraction.js +3 -3
  24. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +240 -234
  25. package/lib/cjs/expression/embeddedDocs/function/algebra/symbolicEqual.js +15 -0
  26. package/lib/cjs/expression/embeddedDocs/function/matrix/subset.js +2 -2
  27. package/lib/cjs/expression/embeddedDocs/function/statistics/cumsum.js +15 -0
  28. package/lib/cjs/expression/node/FunctionNode.js +74 -55
  29. package/lib/cjs/expression/parse.js +12 -8
  30. package/lib/cjs/expression/transform/cumsum.transform.js +57 -0
  31. package/lib/cjs/expression/transform/sum.transform.js +1 -1
  32. package/lib/cjs/factoriesAny.js +24 -0
  33. package/lib/cjs/factoriesNumber.js +18 -2
  34. package/lib/cjs/function/algebra/simplify.js +8 -0
  35. package/lib/cjs/function/algebra/simplifyCore.js +2 -2
  36. package/lib/cjs/function/algebra/symbolicEqual.js +88 -0
  37. package/lib/cjs/function/matrix/eigs/complexEigs.js +39 -28
  38. package/lib/cjs/function/matrix/map.js +53 -15
  39. package/lib/cjs/function/matrix/subset.js +15 -5
  40. package/lib/cjs/function/statistics/cumsum.js +151 -0
  41. package/lib/cjs/function/statistics/sum.js +1 -1
  42. package/lib/cjs/function/string/format.js +1 -1
  43. package/lib/cjs/header.js +2 -2
  44. package/lib/cjs/type/fraction/function/fraction.js +20 -8
  45. package/lib/cjs/utils/collection.js +3 -27
  46. package/lib/cjs/utils/switch.js +31 -0
  47. package/lib/cjs/version.js +1 -1
  48. package/lib/esm/entry/dependenciesAny/dependenciesCumSum.generated.js +14 -0
  49. package/lib/esm/entry/dependenciesAny/dependenciesCumSumTransform.generated.js +14 -0
  50. package/lib/esm/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +16 -0
  51. package/lib/esm/entry/dependenciesAny.generated.js +3 -0
  52. package/lib/esm/entry/dependenciesNumber/dependenciesCumSum.generated.js +14 -0
  53. package/lib/esm/entry/dependenciesNumber/dependenciesCumSumTransform.generated.js +14 -0
  54. package/lib/esm/entry/dependenciesNumber.generated.js +2 -0
  55. package/lib/esm/entry/impureFunctionsAny.generated.js +22 -9
  56. package/lib/esm/entry/impureFunctionsNumber.generated.js +8 -2
  57. package/lib/esm/entry/pureFunctionsAny.generated.js +13 -8
  58. package/lib/esm/entry/pureFunctionsNumber.generated.js +6 -1
  59. package/lib/esm/expression/embeddedDocs/construction/fraction.js +3 -3
  60. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +220 -216
  61. package/lib/esm/expression/embeddedDocs/function/algebra/symbolicEqual.js +8 -0
  62. package/lib/esm/expression/embeddedDocs/function/matrix/subset.js +2 -2
  63. package/lib/esm/expression/embeddedDocs/function/statistics/cumsum.js +8 -0
  64. package/lib/esm/expression/node/FunctionNode.js +70 -53
  65. package/lib/esm/expression/parse.js +12 -8
  66. package/lib/esm/expression/transform/cumsum.transform.js +48 -0
  67. package/lib/esm/expression/transform/sum.transform.js +1 -1
  68. package/lib/esm/factoriesAny.js +3 -0
  69. package/lib/esm/factoriesNumber.js +2 -0
  70. package/lib/esm/function/algebra/simplify.js +8 -0
  71. package/lib/esm/function/algebra/simplifyCore.js +2 -2
  72. package/lib/esm/function/algebra/symbolicEqual.js +80 -0
  73. package/lib/esm/function/matrix/eigs/complexEigs.js +36 -25
  74. package/lib/esm/function/matrix/map.js +53 -15
  75. package/lib/esm/function/matrix/subset.js +15 -5
  76. package/lib/esm/function/statistics/cumsum.js +139 -0
  77. package/lib/esm/function/statistics/sum.js +1 -1
  78. package/lib/esm/function/string/format.js +1 -1
  79. package/lib/esm/type/fraction/function/fraction.js +20 -8
  80. package/lib/esm/utils/collection.js +1 -26
  81. package/lib/esm/utils/switch.js +24 -0
  82. package/lib/esm/version.js +1 -1
  83. package/package.json +15 -11
  84. package/types/index.d.ts +209 -23
  85. package/types/index.ts +274 -57
  86. package/types/tsconfig.json +2 -1
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.symbolicEqualDocs = void 0;
7
+ var symbolicEqualDocs = {
8
+ name: 'symbolicEqual',
9
+ category: 'Algebra',
10
+ syntax: ['symbolicEqual(expr1, expr2)', 'symbolicEqual(expr1, expr2, options)'],
11
+ description: 'Returns true if the difference of the expressions simplifies to 0',
12
+ examples: ['symbolicEqual("x*y","y*x")', 'symbolicEqual("abs(x^2)", "x^2")', 'symbolicEqual("abs(x)", "x", {context: {abs: {trivial: true}}})'],
13
+ seealso: ['simplify', 'evaluate']
14
+ };
15
+ exports.symbolicEqualDocs = symbolicEqualDocs;
@@ -8,8 +8,8 @@ var subsetDocs = {
8
8
  name: 'subset',
9
9
  category: 'Matrix',
10
10
  syntax: ['value(index)', 'value(index) = replacement', 'subset(value, [index])', 'subset(value, [index], replacement)'],
11
- description: 'Get or set a subset of a matrix or string. ' + 'Indexes are one-based. ' + 'Both the ranges lower-bound and upper-bound are included.',
12
- examples: ['d = [1, 2; 3, 4]', 'e = []', 'e[1, 1:2] = [5, 6]', 'e[2, :] = [7, 8]', 'f = d * e', 'f[2, 1]', 'f[:, 1]'],
11
+ description: 'Get or set a subset of the entries of a matrix or ' + 'characters of a string. ' + 'Indexes are one-based. There should be one index specification for ' + 'each dimension of the target. Each specification can be a single ' + 'index, a list of indices, or a range in colon notation `l:u`. ' + 'In a range, both the lower bound l and upper bound u are included; ' + 'and if a bound is omitted it defaults to the most extreme valid value. ' + 'The cartesian product of the indices specified in each dimension ' + 'determines the target of the operation.',
12
+ examples: ['d = [1, 2; 3, 4]', 'e = []', 'e[1, 1:2] = [5, 6]', 'e[2, :] = [7, 8]', 'f = d * e', 'f[2, 1]', 'f[:, 1]', 'f[[1,2], [1,3]] = [9, 10; 11, 12]', 'f'],
13
13
  seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'trace', 'transpose', 'zeros']
14
14
  };
15
15
  exports.subsetDocs = subsetDocs;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cumSumDocs = void 0;
7
+ var cumSumDocs = {
8
+ name: 'cumsum',
9
+ category: 'Statistics',
10
+ syntax: ['cumsum(a, b, c, ...)', 'cumsum(A)'],
11
+ description: 'Compute the cumulative sum of all values.',
12
+ examples: ['cumsum(2, 3, 4, 1)', 'cumsum([2, 3, 4, 1])', 'cumsum([1, 2; 3, 4])', 'cumsum([1, 2; 3, 4], 1)', 'cumsum([1, 2; 3, 4], 2)'],
13
+ seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', 'sum', 'variance']
14
+ };
15
+ exports.cumSumDocs = cumSumDocs;
@@ -97,78 +97,97 @@ var createFunctionNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
97
97
  });
98
98
 
99
99
  if ((0, _is.isSymbolNode)(this.fn)) {
100
- // we can statically determine whether the function has an rawArgs property
101
100
  var _name = this.fn.name;
102
- var fn = _name in math ? (0, _customs.getSafeProperty)(math, _name) : undefined;
103
- var isRaw = typeof fn === 'function' && fn.rawArgs === true;
104
101
 
105
- var resolveFn = function resolveFn(scope) {
106
- if (scope.has(_name)) {
107
- return scope.get(_name);
108
- }
102
+ if (!argNames[_name]) {
103
+ // we can statically determine whether the function has an rawArgs property
104
+ var fn = _name in math ? (0, _customs.getSafeProperty)(math, _name) : undefined;
105
+ var isRaw = typeof fn === 'function' && fn.rawArgs === true;
109
106
 
110
- if (_name in math) {
111
- return (0, _customs.getSafeProperty)(math, _name);
112
- }
107
+ var resolveFn = function resolveFn(scope) {
108
+ if (scope.has(_name)) {
109
+ return scope.get(_name);
110
+ }
113
111
 
114
- return FunctionNode.onUndefinedFunction(_name);
115
- };
112
+ if (_name in math) {
113
+ return (0, _customs.getSafeProperty)(math, _name);
114
+ }
116
115
 
117
- if (isRaw) {
118
- // pass unevaluated parameters (nodes) to the function
119
- // "raw" evaluation
120
- var rawArgs = this.args;
121
- return function evalFunctionNode(scope, args, context) {
122
- var fn = resolveFn(scope);
123
- return fn(rawArgs, math, (0, _scope.createSubScope)(scope, args), scope);
116
+ return FunctionNode.onUndefinedFunction(_name);
124
117
  };
125
- } else {
126
- // "regular" evaluation
127
- switch (evalArgs.length) {
128
- case 0:
129
- return function evalFunctionNode(scope, args, context) {
130
- var fn = resolveFn(scope);
131
- return fn();
132
- };
133
-
134
- case 1:
135
- return function evalFunctionNode(scope, args, context) {
136
- var fn = resolveFn(scope);
137
- var evalArg0 = evalArgs[0];
138
- return fn(evalArg0(scope, args, context));
139
- };
140
-
141
- case 2:
142
- return function evalFunctionNode(scope, args, context) {
143
- var fn = resolveFn(scope);
144
- var evalArg0 = evalArgs[0];
145
- var evalArg1 = evalArgs[1];
146
- return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
147
- };
148
-
149
- default:
150
- return function evalFunctionNode(scope, args, context) {
151
- var fn = resolveFn(scope);
152
- var values = evalArgs.map(function (evalArg) {
153
- return evalArg(scope, args, context);
154
- });
155
- return fn.apply(void 0, (0, _toConsumableArray2.default)(values));
156
- };
118
+
119
+ if (isRaw) {
120
+ // pass unevaluated parameters (nodes) to the function
121
+ // "raw" evaluation
122
+ var rawArgs = this.args;
123
+ return function evalFunctionNode(scope, args, context) {
124
+ var fn = resolveFn(scope);
125
+ return fn(rawArgs, math, (0, _scope.createSubScope)(scope, args), scope);
126
+ };
127
+ } else {
128
+ // "regular" evaluation
129
+ switch (evalArgs.length) {
130
+ case 0:
131
+ return function evalFunctionNode(scope, args, context) {
132
+ var fn = resolveFn(scope);
133
+ return fn();
134
+ };
135
+
136
+ case 1:
137
+ return function evalFunctionNode(scope, args, context) {
138
+ var fn = resolveFn(scope);
139
+ var evalArg0 = evalArgs[0];
140
+ return fn(evalArg0(scope, args, context));
141
+ };
142
+
143
+ case 2:
144
+ return function evalFunctionNode(scope, args, context) {
145
+ var fn = resolveFn(scope);
146
+ var evalArg0 = evalArgs[0];
147
+ var evalArg1 = evalArgs[1];
148
+ return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
149
+ };
150
+
151
+ default:
152
+ return function evalFunctionNode(scope, args, context) {
153
+ var fn = resolveFn(scope);
154
+ var values = evalArgs.map(function (evalArg) {
155
+ return evalArg(scope, args, context);
156
+ });
157
+ return fn.apply(void 0, (0, _toConsumableArray2.default)(values));
158
+ };
159
+ }
157
160
  }
161
+ } else {
162
+ // the function symbol is an argName
163
+ var _rawArgs = this.args;
164
+ return function evalFunctionNode(scope, args, context) {
165
+ var fn = args[_name];
166
+ var isRaw = fn && fn.rawArgs;
167
+
168
+ if (isRaw) {
169
+ return fn(_rawArgs, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
170
+ } else {
171
+ var values = evalArgs.map(function (evalArg) {
172
+ return evalArg(scope, args, context);
173
+ });
174
+ return fn.apply(fn, values);
175
+ }
176
+ };
158
177
  }
159
178
  } else if ((0, _is.isAccessorNode)(this.fn) && (0, _is.isIndexNode)(this.fn.index) && this.fn.index.isObjectProperty()) {
160
179
  // execute the function with the right context: the object of the AccessorNode
161
180
  var evalObject = this.fn.object._compile(math, argNames);
162
181
 
163
182
  var prop = this.fn.index.getObjectProperty();
164
- var _rawArgs = this.args;
183
+ var _rawArgs2 = this.args;
165
184
  return function evalFunctionNode(scope, args, context) {
166
185
  var object = evalObject(scope, args, context);
167
186
  (0, _customs.validateSafeMethod)(object, prop);
168
187
  var isRaw = object[prop] && object[prop].rawArgs;
169
188
 
170
189
  if (isRaw) {
171
- return object[prop](_rawArgs, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
190
+ return object[prop](_rawArgs2, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
172
191
  } else {
173
192
  // "regular" evaluation
174
193
  var values = evalArgs.map(function (evalArg) {
@@ -182,13 +201,13 @@ var createFunctionNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
182
201
  // we have to dynamically determine whether the function has a rawArgs property
183
202
  var evalFn = this.fn._compile(math, argNames);
184
203
 
185
- var _rawArgs2 = this.args;
204
+ var _rawArgs3 = this.args;
186
205
  return function evalFunctionNode(scope, args, context) {
187
206
  var fn = evalFn(scope, args, context);
188
207
  var isRaw = fn && fn.rawArgs;
189
208
 
190
209
  if (isRaw) {
191
- return fn(_rawArgs2, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
210
+ return fn(_rawArgs3, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
192
211
  } else {
193
212
  // "regular" evaluation
194
213
  var values = evalArgs.map(function (evalArg) {
@@ -253,18 +253,22 @@ var createParse = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
253
253
  function getToken(state) {
254
254
  state.tokenType = TOKENTYPE.NULL;
255
255
  state.token = '';
256
- state.comment = ''; // skip over whitespaces
257
- // space, tab, and newline when inside parameters
256
+ state.comment = ''; // skip over ignored characters:
258
257
 
259
- while (parse.isWhitespace(currentCharacter(state), state.nestingLevel)) {
260
- next(state);
261
- } // skip comment
258
+ while (true) {
259
+ // comments:
260
+ if (currentCharacter(state) === '#') {
261
+ while (currentCharacter(state) !== '\n' && currentCharacter(state) !== '') {
262
+ state.comment += currentCharacter(state);
263
+ next(state);
264
+ }
265
+ } // whitespace: space, tab, and newline when inside parameters
262
266
 
263
267
 
264
- if (currentCharacter(state) === '#') {
265
- while (currentCharacter(state) !== '\n' && currentCharacter(state) !== '') {
266
- state.comment += currentCharacter(state);
268
+ if (parse.isWhitespace(currentCharacter(state), state.nestingLevel)) {
267
269
  next(state);
270
+ } else {
271
+ break;
268
272
  }
269
273
  } // check for end of expression
270
274
 
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createCumSumTransform = void 0;
7
+
8
+ var _is = require("../../utils/is.js");
9
+
10
+ var _factory = require("../../utils/factory.js");
11
+
12
+ var _errorTransform = require("./utils/errorTransform.js");
13
+
14
+ var _cumsum = require("../../function/statistics/cumsum.js");
15
+
16
+ /**
17
+ * Attach a transform function to math.sum
18
+ * Adds a property transform containing the transform function.
19
+ *
20
+ * This transform changed the last `dim` parameter of function sum
21
+ * from one-based to zero based
22
+ */
23
+ var name = 'cumsum';
24
+ var dependencies = ['typed', 'add', 'unaryPlus'];
25
+ var createCumSumTransform = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
26
+ var typed = _ref.typed,
27
+ add = _ref.add,
28
+ unaryPlus = _ref.unaryPlus;
29
+ var cumsum = (0, _cumsum.createCumSum)({
30
+ typed: typed,
31
+ add: add,
32
+ unaryPlus: unaryPlus
33
+ });
34
+ return typed(name, {
35
+ '...any': function any(args) {
36
+ // change last argument dim from one-based to zero-based
37
+ if (args.length === 2 && (0, _is.isCollection)(args[0])) {
38
+ var dim = args[1];
39
+
40
+ if ((0, _is.isNumber)(dim)) {
41
+ args[1] = dim - 1;
42
+ } else if ((0, _is.isBigNumber)(dim)) {
43
+ args[1] = dim.minus(1);
44
+ }
45
+ }
46
+
47
+ try {
48
+ return cumsum.apply(null, args);
49
+ } catch (err) {
50
+ throw (0, _errorTransform.errorTransform)(err);
51
+ }
52
+ }
53
+ });
54
+ }, {
55
+ isTransformFunction: true
56
+ });
57
+ exports.createCumSumTransform = createCumSumTransform;
@@ -17,7 +17,7 @@ var _lastDimToZeroBase = require("./utils/lastDimToZeroBase.js");
17
17
  * Attach a transform function to math.sum
18
18
  * Adds a property transform containing the transform function.
19
19
  *
20
- * This transform changed the last `dim` parameter of function mean
20
+ * This transform changed the last `dim` parameter of function sum
21
21
  * from one-based to zero based
22
22
  */
23
23
  var name = 'sum';
@@ -447,6 +447,18 @@ Object.defineProperty(exports, "createCube", {
447
447
  return _cube.createCube;
448
448
  }
449
449
  });
450
+ Object.defineProperty(exports, "createCumSum", {
451
+ enumerable: true,
452
+ get: function get() {
453
+ return _cumsum.createCumSum;
454
+ }
455
+ });
456
+ Object.defineProperty(exports, "createCumSumTransform", {
457
+ enumerable: true,
458
+ get: function get() {
459
+ return _cumsumTransform.createCumSumTransform;
460
+ }
461
+ });
450
462
  Object.defineProperty(exports, "createDeepEqual", {
451
463
  enumerable: true,
452
464
  get: function get() {
@@ -1857,6 +1869,12 @@ Object.defineProperty(exports, "createSymbolNode", {
1857
1869
  return _SymbolNode.createSymbolNode;
1858
1870
  }
1859
1871
  });
1872
+ Object.defineProperty(exports, "createSymbolicEqual", {
1873
+ enumerable: true,
1874
+ get: function get() {
1875
+ return _symbolicEqual.createSymbolicEqual;
1876
+ }
1877
+ });
1860
1878
  Object.defineProperty(exports, "createTan", {
1861
1879
  enumerable: true,
1862
1880
  get: function get() {
@@ -2472,6 +2490,8 @@ var _intersect = require("./function/geometry/intersect.js");
2472
2490
 
2473
2491
  var _sum = require("./function/statistics/sum.js");
2474
2492
 
2493
+ var _cumsum = require("./function/statistics/cumsum.js");
2494
+
2475
2495
  var _mean = require("./function/statistics/mean.js");
2476
2496
 
2477
2497
  var _median = require("./function/statistics/median.js");
@@ -2520,6 +2540,8 @@ var _simplifyCore = require("./function/algebra/simplifyCore.js");
2520
2540
 
2521
2541
  var _resolve = require("./function/algebra/resolve.js");
2522
2542
 
2543
+ var _symbolicEqual = require("./function/algebra/symbolicEqual.js");
2544
+
2523
2545
  var _derivative = require("./function/algebra/derivative.js");
2524
2546
 
2525
2547
  var _rationalize = require("./function/algebra/rationalize.js");
@@ -2564,4 +2586,6 @@ var _stdTransform = require("./expression/transform/std.transform.js");
2564
2586
 
2565
2587
  var _sumTransform = require("./expression/transform/sum.transform.js");
2566
2588
 
2589
+ var _cumsumTransform = require("./expression/transform/cumsum.transform.js");
2590
+
2567
2591
  var _varianceTransform = require("./expression/transform/variance.transform.js");
@@ -131,6 +131,18 @@ Object.defineProperty(exports, "createConstantNode", {
131
131
  }
132
132
  });
133
133
  exports.createCube = exports.createCsch = exports.createCsc = exports.createCoth = exports.createCot = exports.createCosh = exports.createCos = void 0;
134
+ Object.defineProperty(exports, "createCumSum", {
135
+ enumerable: true,
136
+ get: function get() {
137
+ return _cumsum.createCumSum;
138
+ }
139
+ });
140
+ Object.defineProperty(exports, "createCumSumTransform", {
141
+ enumerable: true,
142
+ get: function get() {
143
+ return _cumsumTransform.createCumSumTransform;
144
+ }
145
+ });
134
146
  Object.defineProperty(exports, "createDeepEqual", {
135
147
  enumerable: true,
136
148
  get: function get() {
@@ -325,8 +337,8 @@ Object.defineProperty(exports, "createLargerEq", {
325
337
  return _largerEq.createLargerEqNumber;
326
338
  }
327
339
  });
328
- exports.createLog10 = exports.createLog = exports.createLeftShift = exports.createLcm = void 0;
329
- exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLeftShift = exports.createLcm = void 0;
340
+ exports.createLeftShift = exports.createLcm = void 0;
341
+ exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = void 0;
330
342
  Object.defineProperty(exports, "createMad", {
331
343
  enumerable: true,
332
344
  get: function get() {
@@ -914,6 +926,8 @@ var _min = require("./function/statistics/min.js");
914
926
 
915
927
  var _sum = require("./function/statistics/sum.js");
916
928
 
929
+ var _cumsum = require("./function/statistics/cumsum.js");
930
+
917
931
  var _mean = require("./function/statistics/mean.js");
918
932
 
919
933
  var _median = require("./function/statistics/median.js");
@@ -950,6 +964,8 @@ var _stdTransform = require("./expression/transform/std.transform.js");
950
964
 
951
965
  var _sumTransform = require("./expression/transform/sum.transform.js");
952
966
 
967
+ var _cumsumTransform = require("./expression/transform/cumsum.transform.js");
968
+
953
969
  var _varianceTransform = require("./expression/transform/variance.transform.js");
954
970
 
955
971
  var _clone = require("./function/utils/clone.js");
@@ -343,6 +343,14 @@ var createSimplify = /* #__PURE__ */(0, _factory.factory)(name, dependencies, fu
343
343
  total: true
344
344
  }
345
345
  }
346
+ }, {
347
+ s: 'n-n -> 0',
348
+ // partial alternative when we can't always subtract
349
+ assuming: {
350
+ subtract: {
351
+ total: false
352
+ }
353
+ }
346
354
  }, {
347
355
  s: '-(c*v) -> v * (-c)',
348
356
  // make non-constant terms positive
@@ -215,9 +215,9 @@ var createSimplifyCore = /* #__PURE__ */(0, _factory.factory)(name, dependencies
215
215
  }
216
216
  }
217
217
  }
218
-
219
- return new OperatorNode(node.op, node.fn, [_a, a1]);
220
218
  }
219
+
220
+ return new OperatorNode(node.op, node.fn, [_a, a1]);
221
221
  } else if ((0, _is.isFunctionNode)(node)) {
222
222
  return new FunctionNode(simplifyCore(node.fn), node.args.map(function (n) {
223
223
  return simplifyCore(n, options);
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createSymbolicEqual = void 0;
7
+
8
+ var _is = require("../../utils/is.js");
9
+
10
+ var _factory = require("../../utils/factory.js");
11
+
12
+ var name = 'symbolicEqual';
13
+ var dependencies = ['parse', 'simplify', 'typed', 'OperatorNode'];
14
+ var createSymbolicEqual = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
15
+ var parse = _ref.parse,
16
+ simplify = _ref.simplify,
17
+ typed = _ref.typed,
18
+ OperatorNode = _ref.OperatorNode;
19
+
20
+ /**
21
+ * Attempts to determine if two expressions are symbolically equal, i.e.
22
+ * one is the result of valid algebraic manipulations on the other.
23
+ * Currently, this simply checks if the difference of the two expressions
24
+ * simplifies down to 0. So there are two important caveats:
25
+ * 1. whether two expressions are symbolically equal depends on the
26
+ * manipulations allowed. Therefore, this function takes an optional
27
+ * third argument, which are the options that control the behavior
28
+ * as documented for the `simplify()` function.
29
+ * 2. it is in general intractable to find the minimal simplification of
30
+ * an arbitrarily complicated expression. So while a `true` value
31
+ * of `symbolicEqual` ensures that the two expressions can be manipulated
32
+ * to match each other, a `false` value does not absolutely rule this out.
33
+ *
34
+ * Syntax:
35
+ *
36
+ * symbolicEqual(expr1, expr2)
37
+ * symbolicEqual(expr1, expr2, options)
38
+ *
39
+ * Examples:
40
+ *
41
+ * symbolicEqual('x*y', 'y*x') // true
42
+ * symbolicEqual('x*y', 'y*x', {context: {multiply: {commutative: false}}})
43
+ * //false
44
+ * symbolicEqual('x/y', '(y*x^(-1))^(-1)') // true
45
+ * symbolicEqual('abs(x)','x') // false
46
+ * symbolicEqual('abs(x)','x', simplify.positiveContext) // true
47
+ *
48
+ * See also:
49
+ *
50
+ * simplify, evaluate
51
+ *
52
+ * @param {Node|string} expr1 The first expression to compare
53
+ * @param {Node|string} expr2 The second expression to compare
54
+ * @param {Object} [options] Optional option object, passed to simplify
55
+ * @returns {boolean}
56
+ * Returns true if a valid manipulation making the expressions equal
57
+ * is found.
58
+ */
59
+ return typed(name, {
60
+ 'string, string': function stringString(s1, s2) {
61
+ return this(parse(s1), parse(s2), {});
62
+ },
63
+ 'string, string, Object': function stringStringObject(s1, s2, options) {
64
+ return this(parse(s1), parse(s2), options);
65
+ },
66
+ 'Node, string': function NodeString(e1, s2) {
67
+ return this(e1, parse(s2), {});
68
+ },
69
+ 'Node, string, Object': function NodeStringObject(e1, s2, options) {
70
+ return this(e1, parse(s2), options);
71
+ },
72
+ 'string, Node': function stringNode(s1, e2) {
73
+ return this(parse(s1), e2, {});
74
+ },
75
+ 'string, Node, Object': function stringNodeObject(s1, e2, options) {
76
+ return this(parse(s1), e2, options);
77
+ },
78
+ 'Node, Node': function NodeNode(e1, e2) {
79
+ return this(e1, e2, {});
80
+ },
81
+ 'Node, Node, Object': function NodeNodeObject(e1, e2, options) {
82
+ var diff = new OperatorNode('-', 'subtract', [e1, e2]);
83
+ var simplified = simplify(diff, {}, options);
84
+ return (0, _is.isConstantNode)(simplified) && !simplified.value;
85
+ }
86
+ });
87
+ });
88
+ exports.createSymbolicEqual = createSymbolicEqual;