mathjs 10.1.0 → 10.3.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 +38 -0
- package/docs/expressions/algebra.md +27 -0
- package/docs/expressions/syntax.md +31 -2
- package/docs/reference/functions/abs.md +6 -0
- package/docs/reference/functions/acos.md +6 -0
- package/docs/reference/functions/acosh.md +6 -0
- package/docs/reference/functions/acot.md +6 -0
- package/docs/reference/functions/acoth.md +6 -0
- package/docs/reference/functions/acsc.md +6 -0
- package/docs/reference/functions/acsch.md +6 -0
- package/docs/reference/functions/add.md +6 -0
- package/docs/reference/functions/and.md +6 -0
- package/docs/reference/functions/apply.md +6 -0
- package/docs/reference/functions/arg.md +6 -0
- package/docs/reference/functions/asec.md +6 -0
- package/docs/reference/functions/asech.md +6 -0
- package/docs/reference/functions/asin.md +6 -0
- package/docs/reference/functions/asinh.md +6 -0
- package/docs/reference/functions/atan.md +6 -0
- package/docs/reference/functions/atan2.md +6 -0
- package/docs/reference/functions/atanh.md +6 -0
- package/docs/reference/functions/bellNumbers.md +6 -0
- package/docs/reference/functions/bin.md +6 -0
- package/docs/reference/functions/bitAnd.md +6 -0
- package/docs/reference/functions/bitNot.md +6 -0
- package/docs/reference/functions/bitOr.md +6 -0
- package/docs/reference/functions/bitXor.md +6 -0
- package/docs/reference/functions/catalan.md +6 -0
- package/docs/reference/functions/cbrt.md +6 -0
- package/docs/reference/functions/ceil.md +6 -0
- package/docs/reference/functions/clone.md +6 -0
- package/docs/reference/functions/column.md +6 -0
- package/docs/reference/functions/combinations.md +6 -0
- package/docs/reference/functions/combinationsWithRep.md +6 -0
- package/docs/reference/functions/compare.md +6 -0
- package/docs/reference/functions/compareNatural.md +6 -0
- package/docs/reference/functions/compareText.md +6 -0
- package/docs/reference/functions/compile.md +6 -0
- package/docs/reference/functions/composition.md +6 -0
- package/docs/reference/functions/concat.md +6 -0
- package/docs/reference/functions/conj.md +6 -0
- package/docs/reference/functions/cos.md +6 -0
- package/docs/reference/functions/cosh.md +6 -0
- package/docs/reference/functions/cot.md +6 -0
- package/docs/reference/functions/coth.md +6 -0
- package/docs/reference/functions/count.md +6 -0
- package/docs/reference/functions/cross.md +6 -0
- package/docs/reference/functions/csc.md +6 -0
- package/docs/reference/functions/csch.md +6 -0
- package/docs/reference/functions/ctranspose.md +6 -0
- package/docs/reference/functions/cube.md +6 -0
- package/docs/reference/functions/deepEqual.md +6 -0
- package/docs/reference/functions/derivative.md +6 -0
- package/docs/reference/functions/det.md +6 -0
- package/docs/reference/functions/diag.md +6 -0
- package/docs/reference/functions/diff.md +6 -0
- package/docs/reference/functions/distance.md +6 -0
- package/docs/reference/functions/divide.md +6 -0
- package/docs/reference/functions/dot.md +6 -0
- package/docs/reference/functions/dotDivide.md +6 -0
- package/docs/reference/functions/dotMultiply.md +6 -0
- package/docs/reference/functions/dotPow.md +6 -0
- package/docs/reference/functions/eigs.md +6 -0
- package/docs/reference/functions/equal.md +6 -0
- package/docs/reference/functions/equalText.md +6 -0
- package/docs/reference/functions/erf.md +6 -0
- package/docs/reference/functions/evaluate.md +6 -0
- package/docs/reference/functions/exp.md +6 -0
- package/docs/reference/functions/expm.md +6 -0
- package/docs/reference/functions/expm1.md +6 -0
- package/docs/reference/functions/factorial.md +6 -0
- package/docs/reference/functions/filter.md +6 -0
- package/docs/reference/functions/fix.md +6 -0
- package/docs/reference/functions/flatten.md +6 -0
- package/docs/reference/functions/floor.md +6 -0
- package/docs/reference/functions/forEach.md +6 -0
- package/docs/reference/functions/format.md +6 -0
- package/docs/reference/functions/gamma.md +6 -0
- package/docs/reference/functions/gcd.md +6 -0
- package/docs/reference/functions/getMatrixDataType.md +6 -0
- package/docs/reference/functions/hasNumericValue.md +6 -0
- package/docs/reference/functions/help.md +6 -0
- package/docs/reference/functions/hex.md +6 -0
- package/docs/reference/functions/hypot.md +6 -0
- package/docs/reference/functions/identity.md +6 -0
- package/docs/reference/functions/im.md +6 -0
- package/docs/reference/functions/intersect.md +6 -0
- package/docs/reference/functions/inv.md +6 -0
- package/docs/reference/functions/invmod.md +6 -0
- package/docs/reference/functions/isInteger.md +6 -0
- package/docs/reference/functions/isNaN.md +6 -0
- package/docs/reference/functions/isNegative.md +6 -0
- package/docs/reference/functions/isNumeric.md +6 -0
- package/docs/reference/functions/isPositive.md +6 -0
- package/docs/reference/functions/isPrime.md +6 -0
- package/docs/reference/functions/isZero.md +6 -0
- package/docs/reference/functions/kldivergence.md +6 -0
- package/docs/reference/functions/kron.md +6 -0
- package/docs/reference/functions/larger.md +6 -0
- package/docs/reference/functions/largerEq.md +6 -0
- package/docs/reference/functions/lcm.md +6 -0
- package/docs/reference/functions/leafCount.md +52 -0
- package/docs/reference/functions/leftShift.md +6 -0
- package/docs/reference/functions/log.md +6 -0
- package/docs/reference/functions/log10.md +6 -0
- package/docs/reference/functions/log1p.md +6 -0
- package/docs/reference/functions/log2.md +6 -0
- package/docs/reference/functions/lsolve.md +6 -0
- package/docs/reference/functions/lsolveAll.md +6 -0
- package/docs/reference/functions/lup.md +6 -0
- package/docs/reference/functions/lusolve.md +6 -0
- package/docs/reference/functions/mad.md +6 -0
- package/docs/reference/functions/map.md +28 -5
- package/docs/reference/functions/matrixFromColumns.md +6 -0
- package/docs/reference/functions/matrixFromFunction.md +6 -0
- package/docs/reference/functions/matrixFromRows.md +6 -0
- package/docs/reference/functions/max.md +6 -0
- package/docs/reference/functions/mean.md +6 -0
- package/docs/reference/functions/median.md +6 -0
- package/docs/reference/functions/min.md +6 -0
- package/docs/reference/functions/mod.md +6 -0
- package/docs/reference/functions/mode.md +6 -0
- package/docs/reference/functions/multinomial.md +6 -0
- package/docs/reference/functions/multiply.md +6 -0
- package/docs/reference/functions/norm.md +6 -0
- package/docs/reference/functions/not.md +6 -0
- package/docs/reference/functions/nthRoot.md +6 -0
- package/docs/reference/functions/nthRoots.md +6 -0
- package/docs/reference/functions/numeric.md +6 -0
- package/docs/reference/functions/oct.md +6 -0
- package/docs/reference/functions/ones.md +6 -0
- package/docs/reference/functions/or.md +6 -0
- package/docs/reference/functions/parser.md +6 -0
- package/docs/reference/functions/partitionSelect.md +6 -0
- package/docs/reference/functions/permutations.md +6 -0
- package/docs/reference/functions/pickRandom.md +6 -0
- package/docs/reference/functions/pow.md +6 -0
- package/docs/reference/functions/print.md +6 -0
- package/docs/reference/functions/prod.md +6 -0
- package/docs/reference/functions/qr.md +6 -0
- package/docs/reference/functions/quantileSeq.md +6 -0
- package/docs/reference/functions/random.md +6 -0
- package/docs/reference/functions/randomInt.md +6 -0
- package/docs/reference/functions/range.md +6 -0
- package/docs/reference/functions/rationalize.md +7 -1
- package/docs/reference/functions/re.md +6 -0
- package/docs/reference/functions/reshape.md +7 -0
- package/docs/reference/functions/resize.md +6 -0
- package/docs/reference/functions/resolve.md +46 -0
- package/docs/reference/functions/rightArithShift.md +6 -0
- package/docs/reference/functions/rightLogShift.md +6 -0
- package/docs/reference/functions/rotate.md +6 -0
- package/docs/reference/functions/rotationMatrix.md +6 -0
- package/docs/reference/functions/round.md +6 -0
- package/docs/reference/functions/row.md +6 -0
- package/docs/reference/functions/sec.md +6 -0
- package/docs/reference/functions/sech.md +6 -0
- package/docs/reference/functions/setCartesian.md +6 -0
- package/docs/reference/functions/setDifference.md +6 -0
- package/docs/reference/functions/setDistinct.md +6 -0
- package/docs/reference/functions/setIntersect.md +6 -0
- package/docs/reference/functions/setIsSubset.md +6 -0
- package/docs/reference/functions/setMultiplicity.md +6 -0
- package/docs/reference/functions/setPowerset.md +6 -0
- package/docs/reference/functions/setSize.md +6 -0
- package/docs/reference/functions/setSymDifference.md +6 -0
- package/docs/reference/functions/setUnion.md +6 -0
- package/docs/reference/functions/sign.md +6 -0
- package/docs/reference/functions/simplify.md +47 -7
- package/docs/reference/functions/simplifyCore.md +50 -0
- package/docs/reference/functions/sin.md +6 -0
- package/docs/reference/functions/sinh.md +6 -0
- package/docs/reference/functions/size.md +6 -0
- package/docs/reference/functions/slu.md +6 -0
- package/docs/reference/functions/smaller.md +6 -0
- package/docs/reference/functions/smallerEq.md +6 -0
- package/docs/reference/functions/sort.md +6 -0
- package/docs/reference/functions/sqrt.md +6 -0
- package/docs/reference/functions/sqrtm.md +6 -0
- package/docs/reference/functions/square.md +6 -0
- package/docs/reference/functions/squeeze.md +6 -0
- package/docs/reference/functions/std.md +6 -0
- package/docs/reference/functions/stirlingS2.md +6 -0
- package/docs/reference/functions/subset.md +16 -2
- package/docs/reference/functions/subtract.md +6 -0
- package/docs/reference/functions/sum.md +6 -0
- package/docs/reference/functions/symbolicEqual.md +62 -0
- package/docs/reference/functions/tan.md +6 -0
- package/docs/reference/functions/tanh.md +6 -0
- package/docs/reference/functions/to.md +6 -0
- package/docs/reference/functions/trace.md +6 -0
- package/docs/reference/functions/transpose.md +6 -0
- package/docs/reference/functions/typeOf.md +6 -0
- package/docs/reference/functions/unaryMinus.md +6 -0
- package/docs/reference/functions/unaryPlus.md +6 -0
- package/docs/reference/functions/unequal.md +6 -0
- package/docs/reference/functions/usolve.md +6 -0
- package/docs/reference/functions/usolveAll.md +6 -0
- package/docs/reference/functions/variance.md +6 -0
- package/docs/reference/functions/xgcd.md +6 -0
- package/docs/reference/functions/xor.md +6 -0
- package/docs/reference/functions/zeros.md +6 -0
- package/docs/reference/functions.md +5 -1
- package/lib/browser/math.js +6 -6
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/create.js +4 -4
- package/lib/cjs/core/function/import.js +3 -3
- package/lib/cjs/core/function/typed.js +2 -2
- package/lib/cjs/defaultInstance.js +3 -3
- package/lib/cjs/entry/allFactoriesAny.js +1 -1
- package/lib/cjs/entry/allFactoriesNumber.js +1 -1
- package/lib/cjs/entry/configReadonly.js +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesLeafCount.generated.js +23 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesResolve.generated.js +32 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +6 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +65 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +29 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +32 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesResolve.generated.js +32 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +6 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +65 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +16 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +80 -34
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +96 -64
- package/lib/cjs/entry/pureFunctionsAny.generated.js +62 -64
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +46 -48
- package/lib/cjs/expression/Help.js +4 -0
- package/lib/cjs/expression/Parser.js +1 -1
- package/lib/cjs/expression/embeddedDocs/core/typed.js +1 -1
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +247 -235
- package/lib/cjs/expression/embeddedDocs/function/algebra/leafCount.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/algebra/resolve.js +16 -0
- package/lib/cjs/expression/embeddedDocs/function/algebra/simplify.js +1 -1
- package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyCore.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/algebra/symbolicEqual.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/matrix/subset.js +2 -2
- package/lib/cjs/expression/node/FunctionNode.js +80 -61
- package/lib/cjs/expression/node/IndexNode.js +1 -1
- package/lib/cjs/expression/node/Node.js +3 -3
- package/lib/cjs/expression/node/ObjectNode.js +1 -1
- package/lib/cjs/expression/node/utils/access.js +1 -1
- package/lib/cjs/expression/node/utils/assign.js +1 -1
- package/lib/cjs/expression/parse.js +13 -13
- package/lib/cjs/factoriesAny.js +32 -0
- package/lib/cjs/factoriesNumber.js +16 -0
- package/lib/cjs/function/algebra/decomposition/qr.js +1 -1
- package/lib/cjs/function/algebra/leafCount.js +66 -0
- package/lib/cjs/function/algebra/rationalize.js +24 -41
- package/lib/cjs/function/algebra/resolve.js +106 -0
- package/lib/cjs/function/algebra/simplify/simplifyConstant.js +5 -5
- package/lib/cjs/function/algebra/simplify/util.js +171 -33
- package/lib/cjs/function/algebra/simplify.js +588 -211
- package/lib/cjs/function/algebra/{simplify/simplifyCore.js → simplifyCore.js} +67 -43
- package/lib/cjs/function/algebra/solver/lsolveAll.js +2 -2
- package/lib/cjs/function/algebra/solver/usolveAll.js +2 -2
- package/lib/cjs/function/algebra/symbolicEqual.js +88 -0
- package/lib/cjs/function/arithmetic/ceil.js +3 -3
- package/lib/cjs/function/arithmetic/floor.js +3 -3
- package/lib/cjs/function/arithmetic/invmod.js +1 -1
- package/lib/cjs/function/arithmetic/norm.js +1 -1
- package/lib/cjs/function/arithmetic/round.js +1 -1
- package/lib/cjs/function/matrix/eigs/complexEigs.js +13 -11
- package/lib/cjs/function/matrix/map.js +53 -15
- package/lib/cjs/function/matrix/matrixFromColumns.js +1 -1
- package/lib/cjs/function/matrix/matrixFromRows.js +1 -1
- package/lib/cjs/function/matrix/subset.js +15 -5
- package/lib/cjs/function/probability/util/seededRNG.js +2 -2
- package/lib/cjs/function/relational/compareNatural.js +6 -6
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/plain/bignumber/index.js +1 -1
- package/lib/cjs/plain/number/combinations.js +18 -6
- package/lib/cjs/type/bignumber/BigNumber.js +2 -2
- package/lib/cjs/type/bignumber/function/bignumber.js +1 -1
- package/lib/cjs/type/boolean.js +2 -2
- package/lib/cjs/type/complex/Complex.js +14 -14
- package/lib/cjs/type/complex/function/complex.js +1 -1
- package/lib/cjs/type/fraction/Fraction.js +6 -6
- package/lib/cjs/type/fraction/function/fraction.js +1 -1
- package/lib/cjs/type/matrix/DenseMatrix.js +5 -5
- package/lib/cjs/type/matrix/SparseMatrix.js +2 -2
- package/lib/cjs/type/number.js +1 -1
- package/lib/cjs/type/string.js +2 -2
- package/lib/cjs/type/unit/Unit.js +8 -8
- package/lib/cjs/utils/customs.js +2 -2
- package/lib/cjs/utils/emitter.js +1 -1
- package/lib/cjs/utils/function.js +2 -2
- package/lib/cjs/utils/is.js +6 -6
- package/lib/cjs/utils/latex.js +3 -3
- package/lib/cjs/utils/lruQueue.js +1 -1
- package/lib/cjs/utils/map.js +3 -3
- package/lib/cjs/utils/object.js +2 -2
- package/lib/cjs/utils/snapshot.js +7 -7
- package/lib/cjs/utils/string.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesLeafCount.generated.js +12 -0
- package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesResolve.generated.js +18 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +40 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +16 -0
- package/lib/esm/entry/dependenciesAny.generated.js +4 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesResolve.generated.js +18 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +4 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +40 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +2 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +69 -27
- package/lib/esm/entry/impureFunctionsNumber.generated.js +83 -53
- package/lib/esm/entry/pureFunctionsAny.generated.js +49 -49
- package/lib/esm/entry/pureFunctionsNumber.generated.js +32 -32
- package/lib/esm/expression/Help.js +4 -0
- package/lib/esm/expression/embeddedDocs/core/typed.js +1 -1
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +220 -212
- package/lib/esm/expression/embeddedDocs/function/algebra/leafCount.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/algebra/resolve.js +9 -0
- package/lib/esm/expression/embeddedDocs/function/algebra/simplify.js +1 -1
- package/lib/esm/expression/embeddedDocs/function/algebra/simplifyCore.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/algebra/symbolicEqual.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/matrix/subset.js +2 -2
- package/lib/esm/expression/node/FunctionNode.js +70 -53
- package/lib/esm/factoriesAny.js +4 -0
- package/lib/esm/factoriesNumber.js +2 -0
- package/lib/esm/function/algebra/leafCount.js +59 -0
- package/lib/esm/function/algebra/rationalize.js +24 -40
- package/lib/esm/function/algebra/resolve.js +95 -0
- package/lib/esm/function/algebra/simplify/simplifyConstant.js +3 -3
- package/lib/esm/function/algebra/simplify/util.js +170 -34
- package/lib/esm/function/algebra/simplify.js +583 -206
- package/lib/esm/function/algebra/{simplify/simplifyCore.js → simplifyCore.js} +60 -44
- package/lib/esm/function/algebra/symbolicEqual.js +80 -0
- package/lib/esm/function/matrix/eigs/complexEigs.js +8 -6
- package/lib/esm/function/matrix/map.js +53 -15
- package/lib/esm/function/matrix/subset.js +15 -5
- package/lib/esm/plain/number/combinations.js +18 -6
- package/lib/esm/version.js +1 -1
- package/package.json +20 -15
- package/types/index.d.ts +52 -10
- package/lib/cjs/function/algebra/simplify/resolve.js +0 -76
- package/lib/esm/function/algebra/simplify/resolve.js +0 -67
|
@@ -77,76 +77,93 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
77
77
|
var evalArgs = this.args.map(arg => arg._compile(math, argNames));
|
|
78
78
|
|
|
79
79
|
if (isSymbolNode(this.fn)) {
|
|
80
|
-
// we can statically determine whether the function has an rawArgs property
|
|
81
80
|
var _name = this.fn.name;
|
|
82
|
-
var fn = _name in math ? getSafeProperty(math, _name) : undefined;
|
|
83
|
-
var isRaw = typeof fn === 'function' && fn.rawArgs === true;
|
|
84
81
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
if (!argNames[_name]) {
|
|
83
|
+
// we can statically determine whether the function has an rawArgs property
|
|
84
|
+
var fn = _name in math ? getSafeProperty(math, _name) : undefined;
|
|
85
|
+
var isRaw = typeof fn === 'function' && fn.rawArgs === true;
|
|
89
86
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
var resolveFn = scope => {
|
|
88
|
+
if (scope.has(_name)) {
|
|
89
|
+
return scope.get(_name);
|
|
90
|
+
}
|
|
93
91
|
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
if (_name in math) {
|
|
93
|
+
return getSafeProperty(math, _name);
|
|
94
|
+
}
|
|
96
95
|
|
|
97
|
-
|
|
98
|
-
// pass unevaluated parameters (nodes) to the function
|
|
99
|
-
// "raw" evaluation
|
|
100
|
-
var rawArgs = this.args;
|
|
101
|
-
return function evalFunctionNode(scope, args, context) {
|
|
102
|
-
var fn = resolveFn(scope);
|
|
103
|
-
return fn(rawArgs, math, createSubScope(scope, args), scope);
|
|
96
|
+
return FunctionNode.onUndefinedFunction(_name);
|
|
104
97
|
};
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
98
|
+
|
|
99
|
+
if (isRaw) {
|
|
100
|
+
// pass unevaluated parameters (nodes) to the function
|
|
101
|
+
// "raw" evaluation
|
|
102
|
+
var rawArgs = this.args;
|
|
103
|
+
return function evalFunctionNode(scope, args, context) {
|
|
104
|
+
var fn = resolveFn(scope);
|
|
105
|
+
return fn(rawArgs, math, createSubScope(scope, args), scope);
|
|
106
|
+
};
|
|
107
|
+
} else {
|
|
108
|
+
// "regular" evaluation
|
|
109
|
+
switch (evalArgs.length) {
|
|
110
|
+
case 0:
|
|
111
|
+
return function evalFunctionNode(scope, args, context) {
|
|
112
|
+
var fn = resolveFn(scope);
|
|
113
|
+
return fn();
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
case 1:
|
|
117
|
+
return function evalFunctionNode(scope, args, context) {
|
|
118
|
+
var fn = resolveFn(scope);
|
|
119
|
+
var evalArg0 = evalArgs[0];
|
|
120
|
+
return fn(evalArg0(scope, args, context));
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
case 2:
|
|
124
|
+
return function evalFunctionNode(scope, args, context) {
|
|
125
|
+
var fn = resolveFn(scope);
|
|
126
|
+
var evalArg0 = evalArgs[0];
|
|
127
|
+
var evalArg1 = evalArgs[1];
|
|
128
|
+
return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
default:
|
|
132
|
+
return function evalFunctionNode(scope, args, context) {
|
|
133
|
+
var fn = resolveFn(scope);
|
|
134
|
+
var values = evalArgs.map(evalArg => evalArg(scope, args, context));
|
|
135
|
+
return fn(...values);
|
|
136
|
+
};
|
|
137
|
+
}
|
|
135
138
|
}
|
|
139
|
+
} else {
|
|
140
|
+
// the function symbol is an argName
|
|
141
|
+
var _rawArgs = this.args;
|
|
142
|
+
return function evalFunctionNode(scope, args, context) {
|
|
143
|
+
var fn = args[_name];
|
|
144
|
+
var isRaw = fn && fn.rawArgs;
|
|
145
|
+
|
|
146
|
+
if (isRaw) {
|
|
147
|
+
return fn(_rawArgs, math, createSubScope(scope, args), scope); // "raw" evaluation
|
|
148
|
+
} else {
|
|
149
|
+
var values = evalArgs.map(evalArg => evalArg(scope, args, context));
|
|
150
|
+
return fn.apply(fn, values);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
136
153
|
}
|
|
137
154
|
} else if (isAccessorNode(this.fn) && isIndexNode(this.fn.index) && this.fn.index.isObjectProperty()) {
|
|
138
155
|
// execute the function with the right context: the object of the AccessorNode
|
|
139
156
|
var evalObject = this.fn.object._compile(math, argNames);
|
|
140
157
|
|
|
141
158
|
var prop = this.fn.index.getObjectProperty();
|
|
142
|
-
var
|
|
159
|
+
var _rawArgs2 = this.args;
|
|
143
160
|
return function evalFunctionNode(scope, args, context) {
|
|
144
161
|
var object = evalObject(scope, args, context);
|
|
145
162
|
validateSafeMethod(object, prop);
|
|
146
163
|
var isRaw = object[prop] && object[prop].rawArgs;
|
|
147
164
|
|
|
148
165
|
if (isRaw) {
|
|
149
|
-
return object[prop](
|
|
166
|
+
return object[prop](_rawArgs2, math, createSubScope(scope, args), scope); // "raw" evaluation
|
|
150
167
|
} else {
|
|
151
168
|
// "regular" evaluation
|
|
152
169
|
var values = evalArgs.map(evalArg => evalArg(scope, args, context));
|
|
@@ -158,13 +175,13 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
158
175
|
// we have to dynamically determine whether the function has a rawArgs property
|
|
159
176
|
var evalFn = this.fn._compile(math, argNames);
|
|
160
177
|
|
|
161
|
-
var
|
|
178
|
+
var _rawArgs3 = this.args;
|
|
162
179
|
return function evalFunctionNode(scope, args, context) {
|
|
163
180
|
var fn = evalFn(scope, args, context);
|
|
164
181
|
var isRaw = fn && fn.rawArgs;
|
|
165
182
|
|
|
166
183
|
if (isRaw) {
|
|
167
|
-
return fn(
|
|
184
|
+
return fn(_rawArgs3, math, createSubScope(scope, args), scope); // "raw" evaluation
|
|
168
185
|
} else {
|
|
169
186
|
// "regular" evaluation
|
|
170
187
|
var values = evalArgs.map(evalArg => evalArg(scope, args, context));
|
package/lib/esm/factoriesAny.js
CHANGED
|
@@ -241,7 +241,11 @@ export { createStirlingS2 } from './function/combinatorics/stirlingS2.js';
|
|
|
241
241
|
export { createBellNumbers } from './function/combinatorics/bellNumbers.js';
|
|
242
242
|
export { createCatalan } from './function/combinatorics/catalan.js';
|
|
243
243
|
export { createComposition } from './function/combinatorics/composition.js';
|
|
244
|
+
export { createLeafCount } from './function/algebra/leafCount.js';
|
|
244
245
|
export { createSimplify } from './function/algebra/simplify.js';
|
|
246
|
+
export { createSimplifyCore } from './function/algebra/simplifyCore.js';
|
|
247
|
+
export { createResolve } from './function/algebra/resolve.js';
|
|
248
|
+
export { createSymbolicEqual } from './function/algebra/symbolicEqual.js';
|
|
245
249
|
export { createDerivative } from './function/algebra/derivative.js';
|
|
246
250
|
export { createRationalize } from './function/algebra/rationalize.js';
|
|
247
251
|
export { createReviver } from './json/reviver.js';
|
|
@@ -13,7 +13,9 @@ export { createChainClass } from './type/chain/Chain.js';
|
|
|
13
13
|
export { createHelp } from './expression/function/help.js';
|
|
14
14
|
export { createChain } from './type/chain/function/chain.js'; // algebra
|
|
15
15
|
|
|
16
|
+
export { createResolve } from './function/algebra/resolve.js';
|
|
16
17
|
export { createSimplify } from './function/algebra/simplify.js';
|
|
18
|
+
export { createSimplifyCore } from './function/algebra/simplifyCore.js';
|
|
17
19
|
export { createDerivative } from './function/algebra/derivative.js';
|
|
18
20
|
export { createRationalize } from './function/algebra/rationalize.js'; // arithmetic
|
|
19
21
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { factory } from '../../utils/factory.js';
|
|
2
|
+
var name = 'leafCount';
|
|
3
|
+
var dependencies = ['parse', 'typed'];
|
|
4
|
+
export var createLeafCount = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
5
|
+
var {
|
|
6
|
+
parse,
|
|
7
|
+
typed
|
|
8
|
+
} = _ref;
|
|
9
|
+
|
|
10
|
+
// This does the real work, but we don't have to recurse through
|
|
11
|
+
// a typed call if we separate it out
|
|
12
|
+
function countLeaves(node) {
|
|
13
|
+
var count = 0;
|
|
14
|
+
node.forEach(n => {
|
|
15
|
+
count += countLeaves(n);
|
|
16
|
+
});
|
|
17
|
+
return count || 1;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gives the number of "leaf nodes" in the parse tree of the given expression
|
|
21
|
+
* A leaf node is one that has no subexpressions, essentially either a
|
|
22
|
+
* symbol or a constant. Note that `5!` has just one leaf, the '5'; the
|
|
23
|
+
* unary factorial operator does not add a leaf. On the other hand,
|
|
24
|
+
* function symbols do add leaves, so `sin(x)/cos(x)` has four leaves.
|
|
25
|
+
*
|
|
26
|
+
* The `simplify()` function should generally not increase the `leafCount()`
|
|
27
|
+
* of an expression, although currently there is no guarantee that it never
|
|
28
|
+
* does so. In many cases, `simplify()` reduces the leaf count.
|
|
29
|
+
*
|
|
30
|
+
* Syntax:
|
|
31
|
+
*
|
|
32
|
+
* leafCount(expr)
|
|
33
|
+
*
|
|
34
|
+
* Examples:
|
|
35
|
+
*
|
|
36
|
+
* math.leafCount('x') // 1
|
|
37
|
+
* math.leafCount(math.parse('a*d-b*c')) // 4
|
|
38
|
+
* math.leafCount('[a,b;c,d][0,1]') // 6
|
|
39
|
+
*
|
|
40
|
+
* See also:
|
|
41
|
+
*
|
|
42
|
+
* simplify
|
|
43
|
+
*
|
|
44
|
+
* @param {Node|string} expr The expression to count the leaves of
|
|
45
|
+
*
|
|
46
|
+
* @return {number} The number of leaves of `expr`
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
return typed(name, {
|
|
52
|
+
string: function string(expr) {
|
|
53
|
+
return this(parse(expr));
|
|
54
|
+
},
|
|
55
|
+
Node: function Node(expr) {
|
|
56
|
+
return countLeaves(expr);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { isInteger } from '../../utils/number.js';
|
|
2
2
|
import { factory } from '../../utils/factory.js';
|
|
3
3
|
import { createSimplifyConstant } from './simplify/simplifyConstant.js';
|
|
4
|
-
import { createSimplifyCore } from './simplify/simplifyCore.js';
|
|
5
4
|
var name = 'rationalize';
|
|
6
|
-
var dependencies = ['config', 'typed', 'equal', 'isZero', 'add', 'subtract', 'multiply', 'divide', 'pow', 'parse', 'simplify', '?bignumber', '?fraction', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode', 'ParenthesisNode'];
|
|
5
|
+
var dependencies = ['config', 'typed', 'equal', 'isZero', 'add', 'subtract', 'multiply', 'divide', 'pow', 'parse', 'simplifyCore', 'simplify', '?bignumber', '?fraction', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode', 'ParenthesisNode'];
|
|
7
6
|
export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
8
7
|
var {
|
|
9
8
|
config,
|
|
@@ -16,6 +15,7 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
|
16
15
|
divide,
|
|
17
16
|
pow,
|
|
18
17
|
parse,
|
|
18
|
+
simplifyCore,
|
|
19
19
|
simplify,
|
|
20
20
|
fraction,
|
|
21
21
|
bignumber,
|
|
@@ -47,23 +47,6 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
|
47
47
|
OperatorNode,
|
|
48
48
|
SymbolNode
|
|
49
49
|
});
|
|
50
|
-
var simplifyCore = createSimplifyCore({
|
|
51
|
-
equal,
|
|
52
|
-
isZero,
|
|
53
|
-
add,
|
|
54
|
-
subtract,
|
|
55
|
-
multiply,
|
|
56
|
-
divide,
|
|
57
|
-
pow,
|
|
58
|
-
AccessorNode,
|
|
59
|
-
ArrayNode,
|
|
60
|
-
ConstantNode,
|
|
61
|
-
FunctionNode,
|
|
62
|
-
IndexNode,
|
|
63
|
-
ObjectNode,
|
|
64
|
-
OperatorNode,
|
|
65
|
-
ParenthesisNode
|
|
66
|
-
});
|
|
67
50
|
/**
|
|
68
51
|
* Transform a rationalizable expression in a rational fraction.
|
|
69
52
|
* If rational fraction is one variable polynomial then converts
|
|
@@ -107,13 +90,13 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
|
107
90
|
* @param {Object|boolean} optional scope of expression or true for already evaluated rational expression at input
|
|
108
91
|
* @param {Boolean} detailed optional True if return an object, false if return expression node (default)
|
|
109
92
|
*
|
|
110
|
-
* @return {Object | Node} The rational polynomial of `expr` or
|
|
111
|
-
* {
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
93
|
+
* @return {Object | Node} The rational polynomial of `expr` or an object
|
|
94
|
+
* `{expression, numerator, denominator, variables, coefficients}`, where
|
|
95
|
+
* `expression` is a `Node` with the node simplified expression,
|
|
96
|
+
* `numerator` is a `Node` with the simplified numerator of expression,
|
|
97
|
+
* `denominator` is a `Node` or `boolean` with the simplified denominator or `false` (if there is no denominator),
|
|
98
|
+
* `variables` is an array with variable names,
|
|
99
|
+
* and `coefficients` is an array with coefficients of numerator sorted by increased exponent
|
|
117
100
|
* {Expression Node} node simplified expression
|
|
118
101
|
*
|
|
119
102
|
*/
|
|
@@ -146,6 +129,12 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
|
146
129
|
var polyRet = polynomial(expr, scope, true, setRules.firstRules); // Check if expression is a rationalizable polynomial
|
|
147
130
|
|
|
148
131
|
var nVars = polyRet.variables.length;
|
|
132
|
+
var noExactFractions = {
|
|
133
|
+
exactFractions: false
|
|
134
|
+
};
|
|
135
|
+
var withExactFractions = {
|
|
136
|
+
exactFractions: true
|
|
137
|
+
};
|
|
149
138
|
expr = polyRet.expression;
|
|
150
139
|
|
|
151
140
|
if (nVars >= 1) {
|
|
@@ -156,18 +145,16 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
|
156
145
|
|
|
157
146
|
var rules;
|
|
158
147
|
var eDistrDiv = true;
|
|
159
|
-
var redoInic = false;
|
|
160
|
-
expr = simplify(expr, setRules.firstRules, {}, {
|
|
161
|
-
exactFractions: false
|
|
162
|
-
}); // Apply the initial rules, including succ div rules
|
|
148
|
+
var redoInic = false; // Apply the initial rules, including succ div rules:
|
|
163
149
|
|
|
150
|
+
expr = simplify(expr, setRules.firstRules, {}, noExactFractions);
|
|
164
151
|
var s;
|
|
165
152
|
|
|
166
153
|
while (true) {
|
|
167
|
-
//
|
|
154
|
+
// Alternate applying successive division rules and distr.div.rules
|
|
155
|
+
// until there are no more changes:
|
|
168
156
|
rules = eDistrDiv ? setRules.distrDivRules : setRules.sucDivRules;
|
|
169
|
-
expr = simplify(expr, rules);
|
|
170
|
-
|
|
157
|
+
expr = simplify(expr, rules, {}, withExactFractions);
|
|
171
158
|
eDistrDiv = !eDistrDiv; // Swap between Distr.Div and Succ. Div. Rules
|
|
172
159
|
|
|
173
160
|
s = expr.toString();
|
|
@@ -182,14 +169,11 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
|
182
169
|
|
|
183
170
|
if (redoInic) {
|
|
184
171
|
// Apply first rules again without succ div rules (if there are changes)
|
|
185
|
-
expr = simplify(expr, setRules.firstRulesAgain, {},
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
172
|
+
expr = simplify(expr, setRules.firstRulesAgain, {}, noExactFractions);
|
|
173
|
+
} // Apply final rules:
|
|
174
|
+
|
|
189
175
|
|
|
190
|
-
expr = simplify(expr, setRules.finalRules, {},
|
|
191
|
-
exactFractions: false
|
|
192
|
-
}); // Apply final rules
|
|
176
|
+
expr = simplify(expr, setRules.finalRules, {}, noExactFractions);
|
|
193
177
|
} // NVars >= 1
|
|
194
178
|
|
|
195
179
|
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { createMap, isMap } from '../../utils/map.js';
|
|
2
|
+
import { isFunctionNode, isNode, isOperatorNode, isParenthesisNode, isSymbolNode } from '../../utils/is.js';
|
|
3
|
+
import { factory } from '../../utils/factory.js';
|
|
4
|
+
var name = 'resolve';
|
|
5
|
+
var dependencies = ['parse', 'ConstantNode', 'FunctionNode', 'OperatorNode', 'ParenthesisNode'];
|
|
6
|
+
export var createResolve = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
7
|
+
var {
|
|
8
|
+
parse,
|
|
9
|
+
ConstantNode,
|
|
10
|
+
FunctionNode,
|
|
11
|
+
OperatorNode,
|
|
12
|
+
ParenthesisNode
|
|
13
|
+
} = _ref;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* resolve(expr, scope) replaces variable nodes with their scoped values
|
|
17
|
+
*
|
|
18
|
+
* Syntax:
|
|
19
|
+
*
|
|
20
|
+
* resolve(expr, scope)
|
|
21
|
+
*
|
|
22
|
+
* Examples:
|
|
23
|
+
*
|
|
24
|
+
* math.resolve('x + y', {x:1, y:2}) // Node {1 + 2}
|
|
25
|
+
* math.resolve(math.parse('x+y'), {x:1, y:2}) // Node {1 + 2}
|
|
26
|
+
* math.simplify('x+y', {x:2, y:'x+x'}).toString() // "6"
|
|
27
|
+
*
|
|
28
|
+
* See also:
|
|
29
|
+
*
|
|
30
|
+
* simplify, evaluate
|
|
31
|
+
*
|
|
32
|
+
* @param {Node} node
|
|
33
|
+
* The expression tree to be simplified
|
|
34
|
+
* @param {Object} scope
|
|
35
|
+
* Scope specifying variables to be resolved
|
|
36
|
+
* @return {Node} Returns `node` with variables recursively substituted.
|
|
37
|
+
* @throws {ReferenceError}
|
|
38
|
+
* If there is a cyclic dependency among the variables in `scope`,
|
|
39
|
+
* resolution is impossible and a ReferenceError is thrown.
|
|
40
|
+
*/
|
|
41
|
+
function resolve(node, scope) {
|
|
42
|
+
var within = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Set();
|
|
43
|
+
|
|
44
|
+
// note `within`:
|
|
45
|
+
// `within` is not documented, since it is for internal cycle
|
|
46
|
+
// detection only
|
|
47
|
+
if (!scope) {
|
|
48
|
+
return node;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!isMap(scope)) {
|
|
52
|
+
scope = createMap(scope);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (isSymbolNode(node)) {
|
|
56
|
+
if (within.has(node.name)) {
|
|
57
|
+
var variables = Array.from(within).join(', ');
|
|
58
|
+
throw new ReferenceError("recursive loop of variable definitions among {".concat(variables, "}"));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var value = scope.get(node.name);
|
|
62
|
+
|
|
63
|
+
if (isNode(value)) {
|
|
64
|
+
var nextWithin = new Set(within);
|
|
65
|
+
nextWithin.add(node.name);
|
|
66
|
+
return resolve(value, scope, nextWithin);
|
|
67
|
+
} else if (typeof value === 'number') {
|
|
68
|
+
return parse(String(value));
|
|
69
|
+
} else if (value !== undefined) {
|
|
70
|
+
return new ConstantNode(value);
|
|
71
|
+
} else {
|
|
72
|
+
return node;
|
|
73
|
+
}
|
|
74
|
+
} else if (isOperatorNode(node)) {
|
|
75
|
+
var args = node.args.map(function (arg) {
|
|
76
|
+
return resolve(arg, scope, within);
|
|
77
|
+
});
|
|
78
|
+
return new OperatorNode(node.op, node.fn, args, node.implicit);
|
|
79
|
+
} else if (isParenthesisNode(node)) {
|
|
80
|
+
return new ParenthesisNode(resolve(node.content, scope, within));
|
|
81
|
+
} else if (isFunctionNode(node)) {
|
|
82
|
+
var _args = node.args.map(function (arg) {
|
|
83
|
+
return resolve(arg, scope, within);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return new FunctionNode(node.name, _args);
|
|
87
|
+
} // Otherwise just recursively resolve any children (might also work
|
|
88
|
+
// for some of the above special cases)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
return node.map(child => resolve(child, scope, within));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return resolve;
|
|
95
|
+
});
|
|
@@ -386,11 +386,11 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
|
|
|
386
386
|
} else {
|
|
387
387
|
res = makeNode(_args);
|
|
388
388
|
}
|
|
389
|
-
} else if (isAssociative(node)) {
|
|
390
|
-
_args = allChildren(node);
|
|
389
|
+
} else if (isAssociative(node, options.context)) {
|
|
390
|
+
_args = allChildren(node, options.context);
|
|
391
391
|
_args = _args.map(arg => foldFraction(arg, options));
|
|
392
392
|
|
|
393
|
-
if (isCommutative(fn)) {
|
|
393
|
+
if (isCommutative(fn, options.context)) {
|
|
394
394
|
// commutative binary operator
|
|
395
395
|
var consts = [];
|
|
396
396
|
var vars = [];
|