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.
- package/HISTORY.md +35 -0
- package/README.md +1 -1
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +2 -2
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/config.js +5 -1
- package/lib/cjs/core/function/config.js +4 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesBernoulli.generated.js +25 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesIsBounded.generated.js +17 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesIsFinite.generated.js +21 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSize.generated.js +0 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +21 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesBernoulli.generated.js +21 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesIsBounded.generated.js +17 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesIsFinite.generated.js +21 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSize.generated.js +0 -2
- package/lib/cjs/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +21 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +223 -218
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +82 -77
- package/lib/cjs/entry/pureFunctionsAny.generated.js +717 -702
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +155 -142
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/cjs/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
- package/lib/cjs/expression/embeddedDocs/function/probability/bernoulli.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/utils/isBounded.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/utils/isFinite.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/utils/isNaN.js +1 -1
- package/lib/cjs/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
- package/lib/cjs/expression/node/AccessorNode.js +36 -7
- package/lib/cjs/expression/node/ConstantNode.js +4 -4
- package/lib/cjs/expression/node/FunctionNode.js +20 -5
- package/lib/cjs/expression/node/IndexNode.js +1 -1
- package/lib/cjs/expression/parse.js +74 -46
- package/lib/cjs/factoriesAny.js +21 -0
- package/lib/cjs/factoriesNumber.js +23 -2
- package/lib/cjs/function/algebra/simplifyConstant.js +3 -2
- package/lib/cjs/function/algebra/sylvester.js +6 -5
- package/lib/cjs/function/arithmetic/nthRoots.js +5 -1
- package/lib/cjs/function/logical/nullish.js +2 -2
- package/lib/cjs/function/matrix/column.js +2 -1
- package/lib/cjs/function/matrix/dot.js +4 -9
- package/lib/cjs/function/matrix/flatten.js +6 -3
- package/lib/cjs/function/matrix/kron.js +31 -30
- package/lib/cjs/function/matrix/row.js +2 -1
- package/lib/cjs/function/matrix/size.js +11 -17
- package/lib/cjs/function/matrix/subset.js +21 -11
- package/lib/cjs/function/probability/bernoulli.js +108 -0
- package/lib/cjs/function/relational/equal.js +2 -3
- package/lib/cjs/function/special/zeta.js +3 -2
- package/lib/cjs/function/utils/isBounded.js +54 -0
- package/lib/cjs/function/utils/isFinite.js +50 -0
- package/lib/cjs/function/utils/isInteger.js +7 -15
- package/lib/cjs/function/utils/isNaN.js +1 -1
- package/lib/cjs/function/utils/isNumeric.js +1 -1
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/json/replacer.js +1 -1
- package/lib/cjs/plain/number/probability.js +2 -2
- package/lib/cjs/plain/number/trigonometry.js +1 -1
- package/lib/cjs/type/fraction/function/fraction.js +1 -1
- package/lib/cjs/type/matrix/DenseMatrix.js +52 -41
- package/lib/cjs/type/matrix/MatrixIndex.js +19 -20
- package/lib/cjs/type/matrix/SparseMatrix.js +37 -11
- package/lib/cjs/type/unit/Unit.js +12 -8
- package/lib/cjs/utils/number.js +7 -7
- package/lib/cjs/utils/optimizeCallback.js +13 -1
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/config.js +5 -1
- package/lib/esm/core/function/config.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesBernoulli.generated.js +18 -0
- package/lib/esm/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
- package/lib/esm/entry/dependenciesAny/dependenciesIsBounded.generated.js +10 -0
- package/lib/esm/entry/dependenciesAny/dependenciesIsFinite.generated.js +14 -0
- package/lib/esm/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSize.generated.js +0 -2
- package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
- package/lib/esm/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny.generated.js +3 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesBernoulli.generated.js +14 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesIsBounded.generated.js +10 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesIsFinite.generated.js +14 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSize.generated.js +0 -2
- package/lib/esm/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +3 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +225 -220
- package/lib/esm/entry/impureFunctionsNumber.generated.js +84 -79
- package/lib/esm/entry/pureFunctionsAny.generated.js +714 -699
- package/lib/esm/entry/pureFunctionsNumber.generated.js +154 -141
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/esm/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
- package/lib/esm/expression/embeddedDocs/function/probability/bernoulli.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/utils/isBounded.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/utils/isFinite.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/utils/isNaN.js +1 -1
- package/lib/esm/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
- package/lib/esm/expression/node/AccessorNode.js +36 -7
- package/lib/esm/expression/node/ConstantNode.js +4 -4
- package/lib/esm/expression/node/FunctionNode.js +20 -5
- package/lib/esm/expression/node/IndexNode.js +1 -1
- package/lib/esm/expression/parse.js +74 -46
- package/lib/esm/factoriesAny.js +3 -0
- package/lib/esm/factoriesNumber.js +3 -0
- package/lib/esm/function/algebra/simplifyConstant.js +3 -2
- package/lib/esm/function/algebra/sylvester.js +6 -5
- package/lib/esm/function/arithmetic/nthRoots.js +5 -1
- package/lib/esm/function/logical/nullish.js +2 -2
- package/lib/esm/function/matrix/column.js +2 -1
- package/lib/esm/function/matrix/dot.js +4 -9
- package/lib/esm/function/matrix/flatten.js +6 -3
- package/lib/esm/function/matrix/kron.js +31 -30
- package/lib/esm/function/matrix/row.js +2 -1
- package/lib/esm/function/matrix/size.js +11 -17
- package/lib/esm/function/matrix/subset.js +21 -11
- package/lib/esm/function/probability/bernoulli.js +102 -0
- package/lib/esm/function/relational/equal.js +2 -3
- package/lib/esm/function/special/zeta.js +3 -2
- package/lib/esm/function/utils/isBounded.js +48 -0
- package/lib/esm/function/utils/isFinite.js +44 -0
- package/lib/esm/function/utils/isInteger.js +7 -15
- package/lib/esm/function/utils/isNaN.js +1 -1
- package/lib/esm/function/utils/isNumeric.js +1 -1
- package/lib/esm/json/replacer.js +1 -1
- package/lib/esm/plain/number/probability.js +2 -2
- package/lib/esm/plain/number/trigonometry.js +1 -1
- package/lib/esm/type/fraction/function/fraction.js +1 -1
- package/lib/esm/type/matrix/DenseMatrix.js +52 -41
- package/lib/esm/type/matrix/MatrixIndex.js +20 -21
- package/lib/esm/type/matrix/SparseMatrix.js +37 -11
- package/lib/esm/type/unit/Unit.js +12 -8
- package/lib/esm/utils/number.js +7 -7
- package/lib/esm/utils/optimizeCallback.js +13 -1
- package/lib/esm/version.js +1 -1
- package/package.json +8 -8
- 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
|
-
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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 =
|
|
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 =
|
|
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
|
|
955
|
+
* multiply, divide, modulus
|
|
959
956
|
* @return {Node} node
|
|
960
957
|
* @private
|
|
961
958
|
*/
|
|
962
|
-
function
|
|
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
|
-
|
|
981
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/lib/esm/factoriesAny.js
CHANGED
|
@@ -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 &&
|
|
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
|
|
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 =
|
|
66
|
-
var sy =
|
|
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 =
|
|
42
|
-
var ySize =
|
|
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 =
|
|
71
|
-
var bIsColumn =
|
|
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 {
|
|
26
|
-
* @return {
|
|
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
|
-
|
|
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 [
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
});
|