mathjs 14.9.1 → 15.1.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 (146) hide show
  1. package/HISTORY.md +35 -0
  2. package/README.md +1 -1
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/core/config.js +5 -1
  7. package/lib/cjs/core/function/config.js +4 -0
  8. package/lib/cjs/entry/dependenciesAny/dependenciesBernoulli.generated.js +25 -0
  9. package/lib/cjs/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
  10. package/lib/cjs/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
  11. package/lib/cjs/entry/dependenciesAny/dependenciesIsBounded.generated.js +17 -0
  12. package/lib/cjs/entry/dependenciesAny/dependenciesIsFinite.generated.js +21 -0
  13. package/lib/cjs/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
  14. package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
  15. package/lib/cjs/entry/dependenciesAny/dependenciesSize.generated.js +0 -2
  16. package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
  17. package/lib/cjs/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
  18. package/lib/cjs/entry/dependenciesAny.generated.js +21 -0
  19. package/lib/cjs/entry/dependenciesNumber/dependenciesBernoulli.generated.js +21 -0
  20. package/lib/cjs/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
  21. package/lib/cjs/entry/dependenciesNumber/dependenciesIsBounded.generated.js +17 -0
  22. package/lib/cjs/entry/dependenciesNumber/dependenciesIsFinite.generated.js +21 -0
  23. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
  24. package/lib/cjs/entry/dependenciesNumber/dependenciesSize.generated.js +0 -2
  25. package/lib/cjs/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
  26. package/lib/cjs/entry/dependenciesNumber.generated.js +21 -0
  27. package/lib/cjs/entry/impureFunctionsAny.generated.js +223 -218
  28. package/lib/cjs/entry/impureFunctionsNumber.generated.js +82 -77
  29. package/lib/cjs/entry/pureFunctionsAny.generated.js +717 -702
  30. package/lib/cjs/entry/pureFunctionsNumber.generated.js +155 -142
  31. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
  32. package/lib/cjs/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
  33. package/lib/cjs/expression/embeddedDocs/function/probability/bernoulli.js +14 -0
  34. package/lib/cjs/expression/embeddedDocs/function/utils/isBounded.js +14 -0
  35. package/lib/cjs/expression/embeddedDocs/function/utils/isFinite.js +14 -0
  36. package/lib/cjs/expression/embeddedDocs/function/utils/isNaN.js +1 -1
  37. package/lib/cjs/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
  38. package/lib/cjs/expression/node/AccessorNode.js +36 -7
  39. package/lib/cjs/expression/node/ConstantNode.js +4 -4
  40. package/lib/cjs/expression/node/FunctionNode.js +20 -5
  41. package/lib/cjs/expression/node/IndexNode.js +1 -1
  42. package/lib/cjs/expression/parse.js +74 -46
  43. package/lib/cjs/factoriesAny.js +21 -0
  44. package/lib/cjs/factoriesNumber.js +23 -2
  45. package/lib/cjs/function/algebra/simplifyConstant.js +3 -2
  46. package/lib/cjs/function/algebra/sylvester.js +6 -5
  47. package/lib/cjs/function/arithmetic/nthRoots.js +5 -1
  48. package/lib/cjs/function/logical/nullish.js +2 -2
  49. package/lib/cjs/function/matrix/column.js +2 -1
  50. package/lib/cjs/function/matrix/dot.js +4 -9
  51. package/lib/cjs/function/matrix/flatten.js +6 -3
  52. package/lib/cjs/function/matrix/kron.js +31 -30
  53. package/lib/cjs/function/matrix/row.js +2 -1
  54. package/lib/cjs/function/matrix/size.js +11 -17
  55. package/lib/cjs/function/matrix/subset.js +21 -11
  56. package/lib/cjs/function/probability/bernoulli.js +108 -0
  57. package/lib/cjs/function/relational/equal.js +2 -3
  58. package/lib/cjs/function/special/zeta.js +3 -2
  59. package/lib/cjs/function/utils/isBounded.js +54 -0
  60. package/lib/cjs/function/utils/isFinite.js +50 -0
  61. package/lib/cjs/function/utils/isInteger.js +7 -15
  62. package/lib/cjs/function/utils/isNaN.js +1 -1
  63. package/lib/cjs/function/utils/isNumeric.js +1 -1
  64. package/lib/cjs/header.js +2 -2
  65. package/lib/cjs/json/replacer.js +1 -1
  66. package/lib/cjs/plain/number/probability.js +2 -2
  67. package/lib/cjs/plain/number/trigonometry.js +1 -1
  68. package/lib/cjs/type/fraction/function/fraction.js +1 -1
  69. package/lib/cjs/type/matrix/DenseMatrix.js +52 -41
  70. package/lib/cjs/type/matrix/MatrixIndex.js +19 -20
  71. package/lib/cjs/type/matrix/SparseMatrix.js +37 -11
  72. package/lib/cjs/type/unit/Unit.js +12 -8
  73. package/lib/cjs/utils/number.js +7 -7
  74. package/lib/cjs/utils/optimizeCallback.js +13 -1
  75. package/lib/cjs/version.js +1 -1
  76. package/lib/esm/core/config.js +5 -1
  77. package/lib/esm/core/function/config.js +4 -0
  78. package/lib/esm/entry/dependenciesAny/dependenciesBernoulli.generated.js +18 -0
  79. package/lib/esm/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
  80. package/lib/esm/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
  81. package/lib/esm/entry/dependenciesAny/dependenciesIsBounded.generated.js +10 -0
  82. package/lib/esm/entry/dependenciesAny/dependenciesIsFinite.generated.js +14 -0
  83. package/lib/esm/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
  84. package/lib/esm/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
  85. package/lib/esm/entry/dependenciesAny/dependenciesSize.generated.js +0 -2
  86. package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
  87. package/lib/esm/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
  88. package/lib/esm/entry/dependenciesAny.generated.js +3 -0
  89. package/lib/esm/entry/dependenciesNumber/dependenciesBernoulli.generated.js +14 -0
  90. package/lib/esm/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
  91. package/lib/esm/entry/dependenciesNumber/dependenciesIsBounded.generated.js +10 -0
  92. package/lib/esm/entry/dependenciesNumber/dependenciesIsFinite.generated.js +14 -0
  93. package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
  94. package/lib/esm/entry/dependenciesNumber/dependenciesSize.generated.js +0 -2
  95. package/lib/esm/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
  96. package/lib/esm/entry/dependenciesNumber.generated.js +3 -0
  97. package/lib/esm/entry/impureFunctionsAny.generated.js +225 -220
  98. package/lib/esm/entry/impureFunctionsNumber.generated.js +84 -79
  99. package/lib/esm/entry/pureFunctionsAny.generated.js +714 -699
  100. package/lib/esm/entry/pureFunctionsNumber.generated.js +154 -141
  101. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
  102. package/lib/esm/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
  103. package/lib/esm/expression/embeddedDocs/function/probability/bernoulli.js +8 -0
  104. package/lib/esm/expression/embeddedDocs/function/utils/isBounded.js +8 -0
  105. package/lib/esm/expression/embeddedDocs/function/utils/isFinite.js +8 -0
  106. package/lib/esm/expression/embeddedDocs/function/utils/isNaN.js +1 -1
  107. package/lib/esm/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
  108. package/lib/esm/expression/node/AccessorNode.js +36 -7
  109. package/lib/esm/expression/node/ConstantNode.js +4 -4
  110. package/lib/esm/expression/node/FunctionNode.js +20 -5
  111. package/lib/esm/expression/node/IndexNode.js +1 -1
  112. package/lib/esm/expression/parse.js +74 -46
  113. package/lib/esm/factoriesAny.js +3 -0
  114. package/lib/esm/factoriesNumber.js +3 -0
  115. package/lib/esm/function/algebra/simplifyConstant.js +3 -2
  116. package/lib/esm/function/algebra/sylvester.js +6 -5
  117. package/lib/esm/function/arithmetic/nthRoots.js +5 -1
  118. package/lib/esm/function/logical/nullish.js +2 -2
  119. package/lib/esm/function/matrix/column.js +2 -1
  120. package/lib/esm/function/matrix/dot.js +4 -9
  121. package/lib/esm/function/matrix/flatten.js +6 -3
  122. package/lib/esm/function/matrix/kron.js +31 -30
  123. package/lib/esm/function/matrix/row.js +2 -1
  124. package/lib/esm/function/matrix/size.js +11 -17
  125. package/lib/esm/function/matrix/subset.js +21 -11
  126. package/lib/esm/function/probability/bernoulli.js +102 -0
  127. package/lib/esm/function/relational/equal.js +2 -3
  128. package/lib/esm/function/special/zeta.js +3 -2
  129. package/lib/esm/function/utils/isBounded.js +48 -0
  130. package/lib/esm/function/utils/isFinite.js +44 -0
  131. package/lib/esm/function/utils/isInteger.js +7 -15
  132. package/lib/esm/function/utils/isNaN.js +1 -1
  133. package/lib/esm/function/utils/isNumeric.js +1 -1
  134. package/lib/esm/json/replacer.js +1 -1
  135. package/lib/esm/plain/number/probability.js +2 -2
  136. package/lib/esm/plain/number/trigonometry.js +1 -1
  137. package/lib/esm/type/fraction/function/fraction.js +1 -1
  138. package/lib/esm/type/matrix/DenseMatrix.js +52 -41
  139. package/lib/esm/type/matrix/MatrixIndex.js +20 -21
  140. package/lib/esm/type/matrix/SparseMatrix.js +37 -11
  141. package/lib/esm/type/unit/Unit.js +12 -8
  142. package/lib/esm/utils/number.js +7 -7
  143. package/lib/esm/utils/optimizeCallback.js +13 -1
  144. package/lib/esm/version.js +1 -1
  145. package/package.json +8 -8
  146. package/types/index.d.ts +535 -223
@@ -4,10 +4,11 @@ import { typeOf } from '../../utils/is.js';
4
4
  import { escapeLatex } from '../../utils/latex.js';
5
5
  import { factory } from '../../utils/factory.js';
6
6
  var name = 'ConstantNode';
7
- var dependencies = ['Node'];
7
+ var dependencies = ['Node', 'isBounded'];
8
8
  export var createConstantNode = /* #__PURE__ */factory(name, dependencies, _ref => {
9
9
  var {
10
- Node
10
+ Node,
11
+ isBounded
11
12
  } = _ref;
12
13
  class ConstantNode extends Node {
13
14
  /**
@@ -150,8 +151,7 @@ export var createConstantNode = /* #__PURE__ */factory(name, dependencies, _ref
150
151
  case 'number':
151
152
  case 'BigNumber':
152
153
  {
153
- var finite = type === 'BigNumber' ? this.value.isFinite() : isFinite(this.value);
154
- if (!finite) {
154
+ if (!isBounded(this.value)) {
155
155
  return this.value.valueOf() < 0 ? '-\\infty' : '\\infty';
156
156
  }
157
157
  var index = value.toLowerCase().indexOf('e');
@@ -100,7 +100,7 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
100
100
  * the arguments, typically a SymbolNode or AccessorNode
101
101
  * @param {./Node[]} args
102
102
  */
103
- constructor(fn, args) {
103
+ constructor(fn, args, optional) {
104
104
  super();
105
105
  if (typeof fn === 'string') {
106
106
  fn = new SymbolNode(fn);
@@ -111,8 +111,13 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
111
111
  if (!Array.isArray(args) || !args.every(isNode)) {
112
112
  throw new TypeError('Array containing Nodes expected for parameter "args"');
113
113
  }
114
+ var optionalType = typeof optional;
115
+ if (!(optionalType === 'undefined' || optionalType === 'boolean')) {
116
+ throw new TypeError('optional flag, if specified, must be boolean');
117
+ }
114
118
  this.fn = fn;
115
119
  this.args = args || [];
120
+ this.optional = !!optional;
116
121
  }
117
122
 
118
123
  // readonly property name
@@ -142,6 +147,7 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
142
147
  _compile(math, argNames) {
143
148
  // compile arguments
144
149
  var evalArgs = this.args.map(arg => arg._compile(math, argNames));
150
+ var fromOptionalChaining = this.optional || isAccessorNode(this.fn) && this.fn.optionalChaining;
145
151
  if (isSymbolNode(this.fn)) {
146
152
  var _name = this.fn.name;
147
153
  if (!argNames[_name]) {
@@ -155,10 +161,8 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
155
161
  value = scope.get(_name);
156
162
  } else if (_name in math) {
157
163
  value = getSafeProperty(math, _name);
158
- } else {
159
- return FunctionNode.onUndefinedFunction(_name);
160
- }
161
- if (typeof value === 'function') {
164
+ } else if (fromOptionalChaining) value = undefined;else return FunctionNode.onUndefinedFunction(_name);
165
+ if (typeof value === 'function' || fromOptionalChaining && value === undefined) {
162
166
  return value;
163
167
  }
164
168
  throw new TypeError("'".concat(_name, "' is not a function; its value is:\n ").concat(strin(value)));
@@ -185,17 +189,20 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
185
189
  case 0:
186
190
  return function evalFunctionNode(scope, args, context) {
187
191
  var fn = resolveFn(scope);
192
+ if (fromOptionalChaining && fn === undefined) return undefined;
188
193
  return fn();
189
194
  };
190
195
  case 1:
191
196
  return function evalFunctionNode(scope, args, context) {
192
197
  var fn = resolveFn(scope);
198
+ if (fromOptionalChaining && fn === undefined) return undefined;
193
199
  var evalArg0 = evalArgs[0];
194
200
  return fn(evalArg0(scope, args, context));
195
201
  };
196
202
  case 2:
197
203
  return function evalFunctionNode(scope, args, context) {
198
204
  var fn = resolveFn(scope);
205
+ if (fromOptionalChaining && fn === undefined) return undefined;
199
206
  var evalArg0 = evalArgs[0];
200
207
  var evalArg1 = evalArgs[1];
201
208
  return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
@@ -203,6 +210,7 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
203
210
  default:
204
211
  return function evalFunctionNode(scope, args, context) {
205
212
  var fn = resolveFn(scope);
213
+ if (fromOptionalChaining && fn === undefined) return undefined;
206
214
  var values = evalArgs.map(evalArg => evalArg(scope, args, context));
207
215
  return fn(...values);
208
216
  };
@@ -213,6 +221,7 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
213
221
  var _rawArgs = this.args;
214
222
  return function evalFunctionNode(scope, args, context) {
215
223
  var fn = getSafeProperty(args, _name);
224
+ if (fromOptionalChaining && fn === undefined) return undefined;
216
225
  if (typeof fn !== 'function') {
217
226
  throw new TypeError("Argument '".concat(_name, "' was not a function; received: ").concat(strin(fn)));
218
227
  }
@@ -234,6 +243,11 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
234
243
  var _rawArgs2 = this.args;
235
244
  return function evalFunctionNode(scope, args, context) {
236
245
  var object = evalObject(scope, args, context);
246
+
247
+ // Optional chaining: if the base object is nullish, short-circuit to undefined
248
+ if (fromOptionalChaining && (object == null || object[prop] === undefined)) {
249
+ return undefined;
250
+ }
237
251
  var fn = getSafeMethod(object, prop);
238
252
  if (fn !== null && fn !== void 0 && fn.rawArgs) {
239
253
  // "Raw" evaluation
@@ -253,6 +267,7 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
253
267
  var _rawArgs3 = this.args;
254
268
  return function evalFunctionNode(scope, args, context) {
255
269
  var fn = evalFn(scope, args, context);
270
+ if (fromOptionalChaining && fn === undefined) return undefined;
256
271
  if (typeof fn !== 'function') {
257
272
  throw new TypeError("Expression '".concat(fnExpr, "' did not evaluate to a function; value is:") + "\n ".concat(strin(fn)));
258
273
  }
@@ -79,7 +79,7 @@ export var createIndexNode = /* #__PURE__ */factory(name, dependencies, _ref =>
79
79
  if (!isMatrix(context) && !isArray(context) && !isString(context)) {
80
80
  throw new TypeError('Cannot resolve "end": ' + 'context must be a Matrix, Array, or string but is ' + typeOf(context));
81
81
  }
82
- var s = size(context).valueOf();
82
+ var s = size(context);
83
83
  var childArgs = Object.create(args);
84
84
  childArgs.end = s[i];
85
85
  return _evalDimension(scope, childArgs, context);
@@ -129,6 +129,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
129
129
  '=': true,
130
130
  ':': true,
131
131
  '?': true,
132
+ '?.': true,
132
133
  '??': true,
133
134
  '==': true,
134
135
  '!=': true,
@@ -295,7 +296,9 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
295
296
  }
296
297
 
297
298
  // check for delimiters consisting of 2 characters
298
- if (c2.length === 2 && DELIMITERS[c2]) {
299
+ // Special case: the check for '?.' is to prevent a case like 'a?.3:.7' from being interpreted as optional chaining
300
+ // TODO: refactor the tokenization into some better way to deal with cases like 'a?.3:.7', see https://github.com/josdejong/mathjs/pull/3584
301
+ if (c2.length === 2 && DELIMITERS[c2] && (c2 !== '?.' || !parse.isDigit(state.expression.charAt(state.index + 2)))) {
299
302
  state.tokenType = TOKENTYPE.DELIMITER;
300
303
  state.token = c2;
301
304
  next(state);
@@ -322,7 +325,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
322
325
  next(state);
323
326
  state.token += currentCharacter(state);
324
327
  next(state);
325
- while (parse.isHexDigit(currentCharacter(state))) {
328
+ while (parse.isAlpha(currentCharacter(state), prevCharacter(state), nextCharacter(state)) || parse.isDigit(currentCharacter(state))) {
326
329
  state.token += currentCharacter(state);
327
330
  next(state);
328
331
  }
@@ -331,7 +334,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
331
334
  state.token += '.';
332
335
  next(state);
333
336
  // get the digits after the radix
334
- while (parse.isHexDigit(currentCharacter(state))) {
337
+ while (parse.isAlpha(currentCharacter(state), prevCharacter(state), nextCharacter(state)) || parse.isDigit(currentCharacter(state))) {
335
338
  state.token += currentCharacter(state);
336
339
  next(state);
337
340
  }
@@ -537,15 +540,6 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
537
540
  return c >= '0' && c <= '9';
538
541
  };
539
542
 
540
- /**
541
- * checks if the given char c is a hex digit
542
- * @param {string} c a string with one character
543
- * @return {boolean}
544
- */
545
- parse.isHexDigit = function isHexDigit(c) {
546
- return c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F';
547
- };
548
-
549
543
  /**
550
544
  * Start of the parse levels below, in order of precedence
551
545
  * @return {Node} node
@@ -649,6 +643,9 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
649
643
  return new AssignmentNode(new SymbolNode(name), value);
650
644
  } else if (isAccessorNode(node)) {
651
645
  // parse a matrix subset assignment like 'A[1,2] = 4'
646
+ if (node.optionalChaining) {
647
+ throw createSyntaxError(state, 'Cannot assign to optional chain');
648
+ }
652
649
  getTokenSkipNewline(state);
653
650
  value = parseAssignment(state);
654
651
  return new AssignmentNode(node.object, node.index, value);
@@ -934,7 +931,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
934
931
  */
935
932
  function parseAddSubtract(state) {
936
933
  var node, name, fn, params;
937
- node = parseMultiplyDivideModulusPercentage(state);
934
+ node = parseMultiplyDivideModulus(state);
938
935
  var operators = {
939
936
  '+': 'add',
940
937
  '-': 'subtract'
@@ -943,7 +940,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
943
940
  name = state.token;
944
941
  fn = operators[name];
945
942
  getTokenSkipNewline(state);
946
- var rightNode = parseMultiplyDivideModulusPercentage(state);
943
+ var rightNode = parseMultiplyDivideModulus(state);
947
944
  if (rightNode.isPercentage) {
948
945
  params = [node, new OperatorNode('*', 'multiply', [node, rightNode])];
949
946
  } else {
@@ -955,11 +952,11 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
955
952
  }
956
953
 
957
954
  /**
958
- * multiply, divide, modulus, percentage
955
+ * multiply, divide, modulus
959
956
  * @return {Node} node
960
957
  * @private
961
958
  */
962
- function parseMultiplyDivideModulusPercentage(state) {
959
+ function parseMultiplyDivideModulus(state) {
963
960
  var node, last, name, fn;
964
961
  node = parseImplicitMultiplication(state);
965
962
  last = node;
@@ -977,23 +974,8 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
977
974
  name = state.token;
978
975
  fn = operators[name];
979
976
  getTokenSkipNewline(state);
980
- if (name === '%' && state.tokenType === TOKENTYPE.DELIMITER && state.token !== '(') {
981
- // If the expression contains only %, then treat that as /100
982
- if (state.token !== '' && operators[state.token]) {
983
- var left = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
984
- name = state.token;
985
- fn = operators[name];
986
- getTokenSkipNewline(state);
987
- last = parseImplicitMultiplication(state);
988
- node = new OperatorNode(name, fn, [left, last]);
989
- } else {
990
- node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
991
- }
992
- // return node
993
- } else {
994
- last = parseImplicitMultiplication(state);
995
- node = new OperatorNode(name, fn, [node, last]);
996
- }
977
+ last = parseImplicitMultiplication(state);
978
+ node = new OperatorNode(name, fn, [node, last]);
997
979
  } else {
998
980
  break;
999
981
  }
@@ -1036,7 +1018,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1036
1018
  * @private
1037
1019
  */
1038
1020
  function parseRule2(state) {
1039
- var node = parseUnary(state);
1021
+ var node = parseUnaryPercentage(state);
1040
1022
  var last = node;
1041
1023
  var tokenStates = [];
1042
1024
  while (true) {
@@ -1058,7 +1040,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1058
1040
  // Rewind once and build the "number / number" node; the symbol will be consumed later
1059
1041
  _extends(state, tokenStates.pop());
1060
1042
  tokenStates.pop();
1061
- last = parseUnary(state);
1043
+ last = parseUnaryPercentage(state);
1062
1044
  node = new OperatorNode('/', 'divide', [node, last]);
1063
1045
  } else {
1064
1046
  // Not a match, so rewind
@@ -1078,6 +1060,34 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1078
1060
  return node;
1079
1061
  }
1080
1062
 
1063
+ /**
1064
+ * Unary percentage operator (treated as `value / 100`)
1065
+ * @return {Node} node
1066
+ * @private
1067
+ */
1068
+ function parseUnaryPercentage(state) {
1069
+ var node = parseUnary(state);
1070
+ if (state.token === '%') {
1071
+ var previousState = _extends({}, state);
1072
+ getTokenSkipNewline(state);
1073
+ // We need to decide if this is a unary percentage % or binary modulo %
1074
+ // So we attempt to parse a unary expression at this point.
1075
+ // If it fails, then the only possibility is that this is a unary percentage.
1076
+ // If it succeeds, then we presume that this must be binary modulo, since the
1077
+ // only things that parseUnary can handle are _higher_ precedence than unary %.
1078
+ try {
1079
+ parseUnary(state);
1080
+ // Not sure if we could somehow use the result of that parseUnary? Without
1081
+ // further analysis/testing, safer just to discard and let the parse proceed
1082
+ _extends(state, previousState);
1083
+ } catch (_unused) {
1084
+ // Not seeing a term at this point, so was a unary %
1085
+ node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
1086
+ }
1087
+ }
1088
+ return node;
1089
+ }
1090
+
1081
1091
  /**
1082
1092
  * Unary plus and minus, and logical and bitwise not
1083
1093
  * @return {Node} node
@@ -1250,9 +1260,9 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1250
1260
 
1251
1261
  /**
1252
1262
  * parse accessors:
1253
- * - function invocation in round brackets (...), for example sqrt(2)
1254
- * - index enclosed in square brackets [...], for example A[2,3]
1255
- * - dot notation for properties, like foo.bar
1263
+ * - function invocation in round brackets (...), for example sqrt(2) or sqrt?.(2) with optional chaining
1264
+ * - index enclosed in square brackets [...], for example A[2,3] or A?.[2,3] with optional chaining
1265
+ * - dot notation for properties, like foo.bar or foo?.bar with optional chaining
1256
1266
  * @param {Object} state
1257
1267
  * @param {Node} node Node on which to apply the parameters. If there
1258
1268
  * are no parameters in the expression, the node
@@ -1264,12 +1274,27 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1264
1274
  */
1265
1275
  function parseAccessors(state, node, types) {
1266
1276
  var params;
1267
- while ((state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.includes(state.token))) {
1277
+
1278
+ // Iterate and handle chained accessors, including repeated optional chaining
1279
+ while (true) {
1268
1280
  // eslint-disable-line no-unmodified-loop-condition
1281
+ // Track whether an optional chaining operator precedes the next accessor
1282
+ var optional = false;
1283
+
1284
+ // Consume an optional chaining operator if present
1285
+ if (state.token === '?.') {
1286
+ optional = true;
1287
+ // consume the '?.' token
1288
+ getToken(state);
1289
+ }
1290
+ var hasNextAccessor = (state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.includes(state.token));
1291
+ if (!(optional || hasNextAccessor)) {
1292
+ break;
1293
+ }
1269
1294
  params = [];
1270
1295
  if (state.token === '(') {
1271
- if (isSymbolNode(node) || isAccessorNode(node)) {
1272
- // function invocation like fn(2, 3) or obj.fn(2, 3)
1296
+ if (optional || isSymbolNode(node) || isAccessorNode(node)) {
1297
+ // function invocation: fn(2, 3) or obj.fn(2, 3) or (anything)?.(2, 3)
1273
1298
  openParams(state);
1274
1299
  getToken(state);
1275
1300
  if (state.token !== ')') {
@@ -1287,7 +1312,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1287
1312
  }
1288
1313
  closeParams(state);
1289
1314
  getToken(state);
1290
- node = new FunctionNode(node, params);
1315
+ node = new FunctionNode(node, params, optional);
1291
1316
  } else {
1292
1317
  // implicit multiplication like (2+3)(4+5) or sqrt(2)(1+2)
1293
1318
  // don't parse it here but let it be handled by parseImplicitMultiplication
@@ -1313,18 +1338,21 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1313
1338
  }
1314
1339
  closeParams(state);
1315
1340
  getToken(state);
1316
- node = new AccessorNode(node, new IndexNode(params));
1341
+ node = new AccessorNode(node, new IndexNode(params), optional);
1317
1342
  } else {
1318
1343
  // dot notation like variable.prop
1319
- getToken(state);
1344
+ // consume the `.` (if it was ?., already consumed):
1345
+ if (!optional) getToken(state);
1320
1346
  var isPropertyName = state.tokenType === TOKENTYPE.SYMBOL || state.tokenType === TOKENTYPE.DELIMITER && state.token in NAMED_DELIMITERS;
1321
1347
  if (!isPropertyName) {
1322
- throw createSyntaxError(state, 'Property name expected after dot');
1348
+ var message = 'Property name expected after ';
1349
+ message += optional ? 'optional chain' : 'dot';
1350
+ throw createSyntaxError(state, message);
1323
1351
  }
1324
1352
  params.push(new ConstantNode(state.token));
1325
1353
  getToken(state);
1326
1354
  var dotNotation = true;
1327
- node = new AccessorNode(node, new IndexNode(params, dotNotation));
1355
+ node = new AccessorNode(node, new IndexNode(params, dotNotation), optional);
1328
1356
  }
1329
1357
  }
1330
1358
  return node;
@@ -14,6 +14,8 @@ export { createHasNumericValue } from './function/utils/hasNumericValue.js';
14
14
  export { createIsPositive } from './function/utils/isPositive.js';
15
15
  export { createIsZero } from './function/utils/isZero.js';
16
16
  export { createIsNaN } from './function/utils/isNaN.js';
17
+ export { createIsBounded } from './function/utils/isBounded.js';
18
+ export { createIsFinite } from './function/utils/isFinite.js';
17
19
  export { createTypeOf } from './function/utils/typeOf.js';
18
20
  export { createEqualScalar } from './function/relational/equalScalar.js';
19
21
  export { createSparseMatrixClass } from './type/matrix/SparseMatrix.js';
@@ -242,6 +244,7 @@ export { createVariance } from './function/statistics/variance.js';
242
244
  export { createQuantileSeq } from './function/statistics/quantileSeq.js';
243
245
  export { createStd } from './function/statistics/std.js';
244
246
  export { createCorr } from './function/statistics/corr.js';
247
+ export { createBernoulli } from './function/probability/bernoulli.js';
245
248
  export { createCombinations } from './function/probability/combinations.js';
246
249
  export { createCombinationsWithRep } from './function/probability/combinationsWithRep.js';
247
250
  export { createGamma } from './function/probability/gamma.js';
@@ -136,6 +136,7 @@ export var createSubset = /* #__PURE__ */factory('subset', [], () => noSubset);
136
136
  export { createPartitionSelect } from './function/matrix/partitionSelect.js';
137
137
 
138
138
  // probability
139
+ export { createBernoulli } from './function/probability/bernoulli.js';
139
140
  export var createCombinations = createNumberFactory('combinations', combinationsNumber);
140
141
  export var createGamma = createNumberFactory('gamma', gammaNumber);
141
142
  export var createLgamma = createNumberFactory('lgamma', lgammaNumber);
@@ -236,6 +237,8 @@ export { createHasNumericValue } from './function/utils/hasNumericValue.js';
236
237
  export var createIsPositive = /* #__PURE__ */createNumberFactory('isPositive', isPositiveNumber);
237
238
  export var createIsZero = /* #__PURE__ */createNumberFactory('isZero', isZeroNumber);
238
239
  export var createIsNaN = /* #__PURE__ */createNumberFactory('isNaN', isNaNNumber);
240
+ export { createIsBounded } from './function/utils/isBounded.js';
241
+ export { createIsFinite } from './function/utils/isFinite.js';
239
242
  export { createTypeOf } from './function/utils/typeOf.js';
240
243
  export { createIsPrime } from './function/utils/isPrime.js';
241
244
  export { createNumeric } from './function/utils/numeric.js';
@@ -4,13 +4,14 @@ import { safeNumberType } from '../../utils/number.js';
4
4
  import { createUtil } from './simplify/util.js';
5
5
  import { noBignumber, noFraction } from '../../utils/noop.js';
6
6
  var name = 'simplifyConstant';
7
- var dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
7
+ var dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', 'isBounded', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
8
8
  export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _ref => {
9
9
  var {
10
10
  typed,
11
11
  config,
12
12
  mathWithTransform,
13
13
  matrix,
14
+ isBounded,
14
15
  fraction,
15
16
  bignumber,
16
17
  AccessorNode,
@@ -128,7 +129,7 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
128
129
  // and when both numerator and denominator are small enough
129
130
  function _exactFraction(n, options) {
130
131
  var exactFractions = options && options.exactFractions !== false;
131
- if (exactFractions && isFinite(n) && fraction) {
132
+ if (exactFractions && isBounded(n) && fraction) {
132
133
  var f = fraction(n);
133
134
  var fractionsLimit = options && typeof options.fractionsLimit === 'number' ? options.fractionsLimit : Infinity; // no limit by default
134
135
 
@@ -17,7 +17,8 @@ export var createSylvester = /* #__PURE__ */factory(name, dependencies, _ref =>
17
17
  subtract,
18
18
  identity,
19
19
  lusolve,
20
- abs
20
+ abs,
21
+ config
21
22
  } = _ref;
22
23
  /**
23
24
  *
@@ -88,7 +89,7 @@ export var createSylvester = /* #__PURE__ */factory(name, dependencies, _ref =>
88
89
  var vc = (a, b) => concat(a, b, 0);
89
90
  for (var k = 0; k < n; k++) {
90
91
  if (k < n - 1 && abs(subset(G, index(k + 1, k))) > 1e-5) {
91
- var RHS = vc(subset(D, index(all, k)), subset(D, index(all, k + 1)));
92
+ var RHS = vc(subset(D, index(all, [k])), subset(D, index(all, [k + 1])));
92
93
  for (var j = 0; j < k; j++) {
93
94
  RHS = add(RHS, vc(multiply(y[j], subset(G, index(j, k))), multiply(y[j], subset(G, index(j, k + 1)))));
94
95
  }
@@ -98,11 +99,11 @@ export var createSylvester = /* #__PURE__ */factory(name, dependencies, _ref =>
98
99
  var gmm = multiply(identity(m), multiply(-1, subset(G, index(k + 1, k + 1))));
99
100
  var LHS = vc(hc(add(F, gkk), gmk), hc(gkm, add(F, gmm)));
100
101
  var yAux = lusolve(LHS, RHS);
101
- y[k] = yAux.subset(index(range(0, m), 0));
102
- y[k + 1] = yAux.subset(index(range(m, 2 * m), 0));
102
+ y[k] = yAux.subset(index(range(0, m), [0]));
103
+ y[k + 1] = yAux.subset(index(range(m, 2 * m), [0]));
103
104
  k++;
104
105
  } else {
105
- var _RHS = subset(D, index(all, k));
106
+ var _RHS = subset(D, index(all, [k]));
106
107
  for (var _j = 0; _j < k; _j++) {
107
108
  _RHS = add(_RHS, multiply(y[_j], subset(G, index(_j, k))));
108
109
  }
@@ -73,7 +73,11 @@ export var createNthRoots = /* #__PURE__ */factory(name, dependencies, _ref => {
73
73
  * Calculate the nth roots of a value.
74
74
  * An nth root of a positive real number A,
75
75
  * is a positive real solution of the equation "x^root = A".
76
- * This function returns an array of complex values.
76
+ * This function returns an array of Complex values.
77
+ * Note that currently the precision of Complex numbers are limited
78
+ * to the precision of a 64-bit IEEE floating point, so even if the input
79
+ * is a BigNumber with greater precision, rounding to 64 bits will occur
80
+ * in computing the nth roots.
77
81
  *
78
82
  * Syntax:
79
83
  *
@@ -62,8 +62,8 @@ export var createNullish = /* #__PURE__ */factory(name, dependencies, _ref => {
62
62
  'undefined, any': (_x, y) => y,
63
63
  // SparseMatrix-first with collection RHS: enforce exact shape match
64
64
  'SparseMatrix, Array | Matrix': (x, y) => {
65
- var sx = flatten(size(x).valueOf()); // work around #3529/#3530
66
- var sy = flatten(size(y).valueOf());
65
+ var sx = size(x);
66
+ var sy = size(y);
67
67
  if (deepEqual(sx, sy)) return x;
68
68
  throw new DimensionError(sx, sy);
69
69
  },
@@ -52,8 +52,9 @@ export var createColumn = /* #__PURE__ */factory(name, dependencies, _ref => {
52
52
  }
53
53
  validateIndex(column, value.size()[1]);
54
54
  var rowRange = range(0, value.size()[0]);
55
- var index = new Index(rowRange, column);
55
+ var index = new Index(rowRange, [column]);
56
56
  var result = value.subset(index);
57
+ // once config.legacySubset just return result
57
58
  return isMatrix(result) ? result : matrix([[result]]);
58
59
  }
59
60
  });
@@ -38,8 +38,8 @@ export var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {
38
38
  'SparseMatrix, SparseMatrix': _sparseDot
39
39
  });
40
40
  function _validateDim(x, y) {
41
- var xSize = _size(x);
42
- var ySize = _size(y);
41
+ var xSize = size(x);
42
+ var ySize = size(y);
43
43
  var xLen, yLen;
44
44
  if (xSize.length === 1) {
45
45
  xLen = xSize[0];
@@ -67,8 +67,8 @@ export var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {
67
67
  var bdt = isMatrix(b) ? b._datatype || b.getDataType() : undefined;
68
68
 
69
69
  // are these 2-dimensional column vectors? (as opposed to 1-dimensional vectors)
70
- var aIsColumn = _size(a).length === 2;
71
- var bIsColumn = _size(b).length === 2;
70
+ var aIsColumn = size(a).length === 2;
71
+ var bIsColumn = size(b).length === 2;
72
72
  var add = addScalar;
73
73
  var mul = multiplyScalar;
74
74
 
@@ -148,9 +148,4 @@ export var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {
148
148
  }
149
149
  return c;
150
150
  }
151
-
152
- // TODO remove this once #1771 is fixed
153
- function _size(x) {
154
- return isMatrix(x) ? x.size() : size(x);
155
- }
156
151
  });
@@ -22,17 +22,20 @@ export var createFlatten = /* #__PURE__ */factory(name, dependencies, _ref => {
22
22
  *
23
23
  * concat, resize, size, squeeze
24
24
  *
25
- * @param {Matrix | Array} x Matrix to be flattened
26
- * @return {Matrix | Array} Returns the flattened matrix
25
+ * @param {DenseMatrix | Array} x Matrix to be flattened
26
+ * @return {DenseMatrix | Array} Returns the flattened matrix
27
27
  */
28
28
  return typed(name, {
29
29
  Array: function Array(x) {
30
30
  return flattenArray(x);
31
31
  },
32
- Matrix: function Matrix(x) {
32
+ DenseMatrix: function DenseMatrix(x) {
33
33
  // Return the same matrix type as x (Dense or Sparse Matrix)
34
34
  // Return the same data type as x
35
35
  return x.create(flattenArray(x.valueOf(), true), x.datatype());
36
+ },
37
+ SparseMatrix: function SparseMatrix(_x) {
38
+ throw new TypeError('SparseMatrix is not supported by function flatten ' + 'because it does not support 1D vectors. ' + 'Convert to a DenseMatrix or Array first. Example: flatten(x.toArray())');
36
39
  }
37
40
  });
38
41
  });
@@ -25,7 +25,7 @@ export var createKron = /* #__PURE__ */factory(name, dependencies, _ref => {
25
25
  * // returns [ [ 1, 2, 0, 0 ], [ 3, 4, 0, 0 ], [ 0, 0, 1, 2 ], [ 0, 0, 3, 4 ] ]
26
26
  *
27
27
  * math.kron([1,1], [2,3,4])
28
- * // returns [ [ 2, 3, 4, 2, 3, 4 ] ]
28
+ * // returns [2, 3, 4, 2, 3, 4]
29
29
  *
30
30
  * See also:
31
31
  *
@@ -49,37 +49,38 @@ export var createKron = /* #__PURE__ */factory(name, dependencies, _ref => {
49
49
  });
50
50
 
51
51
  /**
52
- * Calculate the Kronecker product of two matrices / vectors
53
- * @param {Array} a First vector
54
- * @param {Array} b Second vector
55
- * @returns {Array} Returns the Kronecker product of x and y
56
- * @private
52
+ * Calculate the Kronecker product of two (1-dimensional) vectors,
53
+ * with no dimension checking
54
+ * @param {Array} a First vector
55
+ * @param {Array} b Second vector
56
+ * @returns {Array} the 1-dimensional Kronecker product of a and b
57
+ * @private
58
+ */
59
+ function _kron1d(a, b) {
60
+ // TODO in core overhaul: would be faster to see if we can choose a
61
+ // particular implementation of multiplyScalar at the beginning,
62
+ // rather than re-dispatch for _every_ ordered pair of entries.
63
+ return a.flatMap(x => b.map(y => multiplyScalar(x, y)));
64
+ }
65
+
66
+ /**
67
+ * Calculate the Kronecker product of two possibly multidimensional arrays
68
+ * @param {Array} a First array
69
+ * @param {Array} b Second array
70
+ * @param {number} [d] common dimension; if missing, compute and match args
71
+ * @returns {Array} Returns the Kronecker product of x and y
72
+ * @private
57
73
  */
58
74
  function _kron(a, b) {
59
- // Deal with the dimensions of the matricies.
60
- if (size(a).length === 1) {
61
- // Wrap it in a 2D Matrix
62
- a = [a];
63
- }
64
- if (size(b).length === 1) {
65
- // Wrap it in a 2D Matrix
66
- b = [b];
67
- }
68
- if (size(a).length > 2 || size(b).length > 2) {
69
- throw new RangeError('Vectors with dimensions greater then 2 are not supported expected ' + '(Size x = ' + JSON.stringify(a.length) + ', y = ' + JSON.stringify(b.length) + ')');
75
+ var d = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
76
+ if (d < 0) {
77
+ var adim = size(a).length;
78
+ var bdim = size(b).length;
79
+ d = Math.max(adim, bdim);
80
+ while (adim++ < d) a = [a];
81
+ while (bdim++ < d) b = [b];
70
82
  }
71
- var t = [];
72
- var r = [];
73
- return a.map(function (a) {
74
- return b.map(function (b) {
75
- r = [];
76
- t.push(r);
77
- return a.map(function (y) {
78
- return b.map(function (x) {
79
- return r.push(multiplyScalar(y, x));
80
- });
81
- });
82
- });
83
- }) && t;
83
+ if (d === 1) return _kron1d(a, b);
84
+ return a.flatMap(aSlice => b.map(bSlice => _kron(aSlice, bSlice, d - 1)));
84
85
  }
85
86
  });