mathjs 10.2.0 → 10.4.1

Sign up to get free protection for your applications and to get access to all the features.
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;