mathjs 10.6.2 → 11.0.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 +74 -1
- package/README.md +1 -1
- package/lib/browser/math.js +2 -41
- package/lib/browser/math.js.LICENSE.txt +43 -0
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/create.js +6 -5
- package/lib/cjs/core/function/import.js +4 -14
- package/lib/cjs/core/function/typed.js +54 -12
- 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/dependenciesChainClass.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesKldivergence.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesResolve.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +56 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +6 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSqrtm.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesStd.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesStdTransform.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +8 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesChainClass.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesResolve.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +50 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +6 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesStd.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesStdTransform.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +8 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +87 -61
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +93 -69
- package/lib/cjs/entry/pureFunctionsAny.generated.js +50 -45
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +22 -19
- package/lib/cjs/expression/Parser.js +1 -1
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +8 -5
- package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyConstant.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyCore.js +1 -1
- package/lib/cjs/expression/node/AccessorNode.js +216 -173
- package/lib/cjs/expression/node/ArrayNode.js +206 -160
- package/lib/cjs/expression/node/AssignmentNode.js +321 -270
- package/lib/cjs/expression/node/BlockNode.js +223 -172
- package/lib/cjs/expression/node/ConditionalNode.js +253 -193
- package/lib/cjs/expression/node/ConstantNode.js +216 -171
- package/lib/cjs/expression/node/FunctionAssignmentNode.js +258 -196
- package/lib/cjs/expression/node/FunctionNode.js +456 -416
- package/lib/cjs/expression/node/IndexNode.js +256 -210
- package/lib/cjs/expression/node/Node.js +411 -378
- package/lib/cjs/expression/node/ObjectNode.js +223 -178
- package/lib/cjs/expression/node/OperatorNode.js +474 -397
- package/lib/cjs/expression/node/ParenthesisNode.js +189 -143
- package/lib/cjs/expression/node/RangeNode.js +272 -224
- package/lib/cjs/expression/node/RelationalNode.js +246 -195
- package/lib/cjs/expression/node/SymbolNode.js +219 -172
- package/lib/cjs/expression/node/utils/access.js +1 -1
- package/lib/cjs/expression/node/utils/assign.js +1 -1
- package/lib/cjs/expression/operators.js +117 -23
- package/lib/cjs/expression/parse.js +37 -19
- package/lib/cjs/expression/transform/std.transform.js +3 -1
- package/lib/cjs/factoriesAny.js +8 -0
- package/lib/cjs/factoriesNumber.js +10 -1
- package/lib/cjs/function/algebra/decomposition/qr.js +1 -1
- package/lib/cjs/function/algebra/derivative.js +22 -30
- package/lib/cjs/function/algebra/leafCount.js +0 -3
- package/lib/cjs/function/algebra/rationalize.js +78 -108
- package/lib/cjs/function/algebra/resolve.js +53 -16
- package/lib/cjs/function/algebra/simplify/util.js +1 -1
- package/lib/cjs/function/algebra/simplify.js +87 -114
- package/lib/cjs/function/algebra/{simplify/simplifyConstant.js → simplifyConstant.js} +44 -10
- package/lib/cjs/function/algebra/simplifyCore.js +196 -93
- 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 +9 -26
- package/lib/cjs/function/arithmetic/abs.js +7 -14
- package/lib/cjs/function/arithmetic/add.js +26 -70
- package/lib/cjs/function/arithmetic/addScalar.js +17 -9
- package/lib/cjs/function/arithmetic/cbrt.js +7 -11
- package/lib/cjs/function/arithmetic/ceil.js +56 -46
- package/lib/cjs/function/arithmetic/cube.js +5 -10
- package/lib/cjs/function/arithmetic/divide.js +7 -7
- package/lib/cjs/function/arithmetic/divideScalar.js +4 -18
- package/lib/cjs/function/arithmetic/dotDivide.js +22 -65
- package/lib/cjs/function/arithmetic/dotMultiply.js +16 -61
- package/lib/cjs/function/arithmetic/dotPow.js +30 -63
- package/lib/cjs/function/arithmetic/exp.js +8 -12
- package/lib/cjs/function/arithmetic/expm1.js +10 -10
- package/lib/cjs/function/arithmetic/fix.js +33 -27
- package/lib/cjs/function/arithmetic/floor.js +56 -46
- package/lib/cjs/function/arithmetic/gcd.js +27 -68
- package/lib/cjs/function/arithmetic/hypot.js +9 -5
- package/lib/cjs/function/arithmetic/invmod.js +1 -1
- package/lib/cjs/function/arithmetic/lcm.js +27 -68
- package/lib/cjs/function/arithmetic/log.js +10 -12
- package/lib/cjs/function/arithmetic/log10.js +5 -3
- package/lib/cjs/function/arithmetic/log1p.js +11 -7
- package/lib/cjs/function/arithmetic/log2.js +5 -3
- package/lib/cjs/function/arithmetic/mod.js +22 -64
- package/lib/cjs/function/arithmetic/multiply.js +40 -35
- package/lib/cjs/function/arithmetic/multiplyScalar.js +2 -9
- package/lib/cjs/function/arithmetic/norm.js +1 -5
- package/lib/cjs/function/arithmetic/nthRoot.js +80 -92
- package/lib/cjs/function/arithmetic/round.js +56 -42
- package/lib/cjs/function/arithmetic/sign.js +14 -10
- package/lib/cjs/function/arithmetic/sqrt.js +5 -9
- package/lib/cjs/function/arithmetic/square.js +6 -10
- package/lib/cjs/function/arithmetic/subtract.js +44 -100
- package/lib/cjs/function/arithmetic/unaryMinus.js +14 -16
- package/lib/cjs/function/arithmetic/unaryPlus.js +6 -4
- package/lib/cjs/function/bitwise/bitAnd.js +17 -61
- package/lib/cjs/function/bitwise/bitNot.js +5 -3
- package/lib/cjs/function/bitwise/bitOr.js +16 -60
- package/lib/cjs/function/bitwise/bitXor.js +17 -61
- package/lib/cjs/function/bitwise/leftShift.js +68 -81
- package/lib/cjs/function/bitwise/rightArithShift.js +68 -81
- package/lib/cjs/function/bitwise/rightLogShift.js +68 -81
- package/lib/cjs/function/bitwise/useMatrixForArrayScalar.js +36 -0
- package/lib/cjs/function/complex/arg.js +5 -3
- package/lib/cjs/function/complex/conj.js +6 -7
- package/lib/cjs/function/complex/im.js +7 -8
- package/lib/cjs/function/complex/re.js +6 -10
- package/lib/cjs/function/logical/and.js +74 -80
- package/lib/cjs/function/logical/not.js +13 -6
- package/lib/cjs/function/logical/or.js +21 -63
- package/lib/cjs/function/logical/xor.js +21 -63
- package/lib/cjs/function/matrix/diff.js +10 -7
- package/lib/cjs/function/matrix/eigs/complexEigs.js +5 -5
- package/lib/cjs/function/matrix/fft.js +2 -2
- package/lib/cjs/function/matrix/matrixFromColumns.js +1 -1
- package/lib/cjs/function/matrix/matrixFromRows.js +1 -1
- package/lib/cjs/function/matrix/ones.js +2 -1
- package/lib/cjs/function/matrix/sqrtm.js +3 -2
- package/lib/cjs/function/matrix/transpose.js +47 -48
- package/lib/cjs/function/matrix/zeros.js +2 -1
- package/lib/cjs/function/probability/factorial.js +5 -3
- package/lib/cjs/function/probability/gamma.js +38 -40
- package/lib/cjs/function/probability/kldivergence.js +5 -2
- package/lib/cjs/function/probability/lgamma.js +30 -30
- package/lib/cjs/function/probability/util/seededRNG.js +2 -2
- package/lib/cjs/function/relational/compare.js +21 -67
- package/lib/cjs/function/relational/compareNatural.js +59 -54
- package/lib/cjs/function/relational/compareText.js +10 -43
- package/lib/cjs/function/relational/compareUnits.js +24 -0
- package/lib/cjs/function/relational/equal.js +19 -80
- package/lib/cjs/function/relational/equalScalar.js +7 -9
- package/lib/cjs/function/relational/larger.js +21 -67
- package/lib/cjs/function/relational/largerEq.js +21 -67
- package/lib/cjs/function/relational/smaller.js +21 -67
- package/lib/cjs/function/relational/smallerEq.js +21 -67
- package/lib/cjs/function/relational/unequal.js +19 -80
- package/lib/cjs/function/special/erf.js +5 -3
- package/lib/cjs/function/statistics/std.js +11 -2
- package/lib/cjs/function/trigonometry/acos.js +4 -8
- package/lib/cjs/function/trigonometry/acosh.js +2 -7
- package/lib/cjs/function/trigonometry/acot.js +4 -8
- package/lib/cjs/function/trigonometry/acoth.js +4 -8
- package/lib/cjs/function/trigonometry/acsc.js +4 -8
- package/lib/cjs/function/trigonometry/acsch.js +4 -8
- package/lib/cjs/function/trigonometry/asec.js +4 -8
- package/lib/cjs/function/trigonometry/asech.js +4 -8
- package/lib/cjs/function/trigonometry/asin.js +4 -9
- package/lib/cjs/function/trigonometry/asinh.js +4 -9
- package/lib/cjs/function/trigonometry/atan.js +4 -9
- package/lib/cjs/function/trigonometry/atan2.js +24 -62
- package/lib/cjs/function/trigonometry/atanh.js +4 -9
- package/lib/cjs/function/trigonometry/cos.js +11 -20
- package/lib/cjs/function/trigonometry/cosh.js +5 -19
- package/lib/cjs/function/trigonometry/cot.js +9 -15
- package/lib/cjs/function/trigonometry/coth.js +4 -15
- package/lib/cjs/function/trigonometry/csc.js +11 -17
- package/lib/cjs/function/trigonometry/csch.js +4 -15
- package/lib/cjs/function/trigonometry/sec.js +11 -17
- package/lib/cjs/function/trigonometry/sech.js +4 -15
- package/lib/cjs/function/trigonometry/sin.js +11 -21
- package/lib/cjs/function/trigonometry/sinh.js +5 -20
- package/lib/cjs/function/trigonometry/tan.js +11 -21
- package/lib/cjs/function/trigonometry/tanh.js +5 -20
- package/lib/cjs/function/trigonometry/trigUnit.js +24 -0
- package/lib/cjs/function/unit/to.js +7 -41
- package/lib/cjs/function/utils/hasNumericValue.js +4 -0
- package/lib/cjs/function/utils/isInteger.js +5 -3
- package/lib/cjs/function/utils/isNegative.js +10 -6
- package/lib/cjs/function/utils/isNumeric.js +5 -3
- package/lib/cjs/function/utils/isPositive.js +10 -6
- package/lib/cjs/function/utils/isPrime.js +5 -3
- package/lib/cjs/function/utils/isZero.js +10 -6
- package/lib/cjs/function/utils/numeric.js +11 -4
- package/lib/cjs/function/utils/typeOf.js +38 -44
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/plain/bignumber/index.js +1 -1
- package/lib/cjs/type/bignumber/BigNumber.js +2 -2
- package/lib/cjs/type/bignumber/function/bignumber.js +6 -4
- package/lib/cjs/type/boolean.js +7 -5
- package/lib/cjs/type/chain/Chain.js +23 -3
- package/lib/cjs/type/complex/Complex.js +18 -14
- package/lib/cjs/type/complex/function/complex.js +6 -4
- package/lib/cjs/type/fraction/Fraction.js +10 -6
- package/lib/cjs/type/fraction/function/fraction.js +6 -4
- package/lib/cjs/type/matrix/DenseMatrix.js +21 -6
- package/lib/cjs/type/matrix/SparseMatrix.js +12 -2
- package/lib/cjs/type/matrix/utils/{algorithm01.js → matAlgo01xDSid.js} +4 -4
- package/lib/cjs/type/matrix/utils/{algorithm02.js → matAlgo02xDS0.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm03.js → matAlgo03xDSf.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm04.js → matAlgo04xSidSid.js} +7 -7
- package/lib/cjs/type/matrix/utils/{algorithm05.js → matAlgo05xSfSf.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm06.js → matAlgo06xS0S0.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm07.js → matAlgo07xSSf.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm08.js → matAlgo08xS0Sid.js} +6 -6
- package/lib/cjs/type/matrix/utils/{algorithm09.js → matAlgo09xS0Sf.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm10.js → matAlgo10xSids.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm11.js → matAlgo11xS0s.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm12.js → matAlgo12xSfs.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm13.js → matAlgo13xDD.js} +5 -5
- package/lib/cjs/type/matrix/utils/{algorithm14.js → matAlgo14xDs.js} +5 -5
- package/lib/cjs/type/matrix/utils/matrixAlgorithmSuite.js +238 -0
- package/lib/cjs/type/number.js +6 -4
- package/lib/cjs/type/string.js +7 -5
- package/lib/cjs/type/unit/Unit.js +69 -21
- package/lib/cjs/type/unit/function/createUnit.js +2 -1
- package/lib/cjs/type/unit/function/unit.js +9 -3
- 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 +27 -25
- 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 +30 -57
- package/lib/cjs/utils/string.js +3 -3
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/create.js +2 -1
- package/lib/esm/core/function/import.js +2 -12
- package/lib/esm/core/function/typed.js +47 -11
- package/lib/esm/entry/dependenciesAny/dependenciesChainClass.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesKldivergence.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesResolve.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +34 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSqrtm.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesStd.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesStdTransform.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny.generated.js +1 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesChainClass.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesResolve.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +30 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +4 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesStd.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesStdTransform.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +73 -48
- package/lib/esm/entry/impureFunctionsNumber.generated.js +81 -58
- package/lib/esm/entry/pureFunctionsAny.generated.js +39 -36
- package/lib/esm/entry/pureFunctionsNumber.generated.js +14 -13
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +2 -0
- package/lib/esm/expression/embeddedDocs/function/algebra/simplifyConstant.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/algebra/simplifyCore.js +1 -1
- package/lib/esm/expression/node/AccessorNode.js +158 -153
- package/lib/esm/expression/node/ArrayNode.js +162 -154
- package/lib/esm/expression/node/AssignmentNode.js +257 -245
- package/lib/esm/expression/node/BlockNode.js +177 -163
- package/lib/esm/expression/node/ConditionalNode.js +197 -174
- package/lib/esm/expression/node/ConstantNode.js +171 -163
- package/lib/esm/expression/node/FunctionAssignmentNode.js +205 -180
- package/lib/esm/expression/node/FunctionNode.js +407 -407
- package/lib/esm/expression/node/IndexNode.js +206 -198
- package/lib/esm/expression/node/Node.js +325 -325
- package/lib/esm/expression/node/ObjectNode.js +166 -157
- package/lib/esm/expression/node/OperatorNode.js +414 -377
- package/lib/esm/expression/node/ParenthesisNode.js +146 -138
- package/lib/esm/expression/node/RangeNode.js +221 -212
- package/lib/esm/expression/node/RelationalNode.js +190 -176
- package/lib/esm/expression/node/SymbolNode.js +161 -152
- package/lib/esm/expression/operators.js +96 -4
- package/lib/esm/expression/parse.js +25 -7
- package/lib/esm/expression/transform/std.transform.js +3 -1
- package/lib/esm/factoriesAny.js +1 -0
- package/lib/esm/factoriesNumber.js +1 -0
- package/lib/esm/function/algebra/derivative.js +22 -30
- package/lib/esm/function/algebra/leafCount.js +0 -3
- package/lib/esm/function/algebra/rationalize.js +83 -114
- package/lib/esm/function/algebra/resolve.js +25 -16
- package/lib/esm/function/algebra/simplify.js +82 -112
- package/lib/esm/function/algebra/{simplify/simplifyConstant.js → simplifyConstant.js} +39 -9
- package/lib/esm/function/algebra/simplifyCore.js +192 -91
- package/lib/esm/function/algebra/symbolicEqual.js +9 -26
- package/lib/esm/function/arithmetic/abs.js +3 -16
- package/lib/esm/function/arithmetic/add.js +21 -65
- package/lib/esm/function/arithmetic/addScalar.js +11 -5
- package/lib/esm/function/arithmetic/cbrt.js +7 -10
- package/lib/esm/function/arithmetic/ceil.js +25 -25
- package/lib/esm/function/arithmetic/cube.js +5 -9
- package/lib/esm/function/arithmetic/divide.js +7 -7
- package/lib/esm/function/arithmetic/divideScalar.js +2 -19
- package/lib/esm/function/arithmetic/dotDivide.js +22 -64
- package/lib/esm/function/arithmetic/dotMultiply.js +16 -60
- package/lib/esm/function/arithmetic/dotPow.js +30 -62
- package/lib/esm/function/arithmetic/exp.js +8 -11
- package/lib/esm/function/arithmetic/expm1.js +10 -9
- package/lib/esm/function/arithmetic/fix.js +17 -17
- package/lib/esm/function/arithmetic/floor.js +25 -25
- package/lib/esm/function/arithmetic/gcd.js +26 -70
- package/lib/esm/function/arithmetic/hypot.js +7 -6
- package/lib/esm/function/arithmetic/lcm.js +26 -70
- package/lib/esm/function/arithmetic/log.js +7 -10
- package/lib/esm/function/arithmetic/log10.js +1 -3
- package/lib/esm/function/arithmetic/log1p.js +4 -6
- package/lib/esm/function/arithmetic/log2.js +1 -3
- package/lib/esm/function/arithmetic/mod.js +21 -62
- package/lib/esm/function/arithmetic/multiply.js +23 -27
- package/lib/esm/function/arithmetic/multiplyScalar.js +2 -13
- package/lib/esm/function/arithmetic/norm.js +0 -4
- package/lib/esm/function/arithmetic/nthRoot.js +38 -73
- package/lib/esm/function/arithmetic/round.js +26 -28
- package/lib/esm/function/arithmetic/sign.js +5 -7
- package/lib/esm/function/arithmetic/sqrt.js +5 -8
- package/lib/esm/function/arithmetic/square.js +6 -9
- package/lib/esm/function/arithmetic/subtract.js +31 -95
- package/lib/esm/function/arithmetic/unaryMinus.js +6 -16
- package/lib/esm/function/arithmetic/unaryPlus.js +2 -4
- package/lib/esm/function/bitwise/bitAnd.js +16 -59
- package/lib/esm/function/bitwise/bitNot.js +1 -3
- package/lib/esm/function/bitwise/bitOr.js +16 -59
- package/lib/esm/function/bitwise/bitXor.js +16 -59
- package/lib/esm/function/bitwise/leftShift.js +38 -60
- package/lib/esm/function/bitwise/rightArithShift.js +38 -60
- package/lib/esm/function/bitwise/rightLogShift.js +38 -60
- package/lib/esm/function/bitwise/useMatrixForArrayScalar.js +13 -0
- package/lib/esm/function/complex/arg.js +1 -3
- package/lib/esm/function/complex/conj.js +3 -12
- package/lib/esm/function/complex/im.js +4 -15
- package/lib/esm/function/complex/re.js +3 -15
- package/lib/esm/function/logical/and.js +35 -57
- package/lib/esm/function/logical/not.js +3 -6
- package/lib/esm/function/logical/or.js +16 -61
- package/lib/esm/function/logical/xor.js +16 -61
- package/lib/esm/function/matrix/diff.js +2 -7
- package/lib/esm/function/matrix/ones.js +2 -1
- package/lib/esm/function/matrix/sqrtm.js +3 -2
- package/lib/esm/function/matrix/transpose.js +47 -50
- package/lib/esm/function/matrix/zeros.js +2 -1
- package/lib/esm/function/probability/factorial.js +1 -3
- package/lib/esm/function/probability/gamma.js +38 -39
- package/lib/esm/function/probability/kldivergence.js +3 -2
- package/lib/esm/function/probability/lgamma.js +29 -29
- package/lib/esm/function/relational/compare.js +21 -67
- package/lib/esm/function/relational/compareNatural.js +54 -49
- package/lib/esm/function/relational/compareText.js +10 -42
- package/lib/esm/function/relational/compareUnits.js +15 -0
- package/lib/esm/function/relational/equal.js +19 -79
- package/lib/esm/function/relational/equalScalar.js +6 -9
- package/lib/esm/function/relational/larger.js +23 -73
- package/lib/esm/function/relational/largerEq.js +23 -73
- package/lib/esm/function/relational/smaller.js +23 -73
- package/lib/esm/function/relational/smallerEq.js +23 -73
- package/lib/esm/function/relational/unequal.js +19 -79
- package/lib/esm/function/special/erf.js +1 -3
- package/lib/esm/function/statistics/std.js +10 -2
- package/lib/esm/function/trigonometry/acos.js +4 -7
- package/lib/esm/function/trigonometry/acosh.js +2 -6
- package/lib/esm/function/trigonometry/acot.js +4 -7
- package/lib/esm/function/trigonometry/acoth.js +4 -7
- package/lib/esm/function/trigonometry/acsc.js +4 -7
- package/lib/esm/function/trigonometry/acsch.js +4 -7
- package/lib/esm/function/trigonometry/asec.js +4 -7
- package/lib/esm/function/trigonometry/asech.js +4 -7
- package/lib/esm/function/trigonometry/asin.js +4 -8
- package/lib/esm/function/trigonometry/asinh.js +4 -8
- package/lib/esm/function/trigonometry/atan.js +4 -8
- package/lib/esm/function/trigonometry/atan2.js +25 -64
- package/lib/esm/function/trigonometry/atanh.js +4 -8
- package/lib/esm/function/trigonometry/cos.js +11 -22
- package/lib/esm/function/trigonometry/cosh.js +5 -20
- package/lib/esm/function/trigonometry/cot.js +10 -20
- package/lib/esm/function/trigonometry/coth.js +6 -20
- package/lib/esm/function/trigonometry/csc.js +12 -22
- package/lib/esm/function/trigonometry/csch.js +6 -20
- package/lib/esm/function/trigonometry/sec.js +12 -22
- package/lib/esm/function/trigonometry/sech.js +6 -20
- package/lib/esm/function/trigonometry/sin.js +11 -23
- package/lib/esm/function/trigonometry/sinh.js +5 -21
- package/lib/esm/function/trigonometry/tan.js +11 -23
- package/lib/esm/function/trigonometry/tanh.js +5 -21
- package/lib/esm/function/trigonometry/trigUnit.js +15 -0
- package/lib/esm/function/unit/to.js +8 -43
- package/lib/esm/function/utils/hasNumericValue.js +2 -0
- package/lib/esm/function/utils/isInteger.js +1 -3
- package/lib/esm/function/utils/isNegative.js +2 -6
- package/lib/esm/function/utils/isNumeric.js +3 -9
- package/lib/esm/function/utils/isPositive.js +2 -6
- package/lib/esm/function/utils/isPrime.js +1 -3
- package/lib/esm/function/utils/isZero.js +2 -6
- package/lib/esm/function/utils/numeric.js +11 -4
- package/lib/esm/function/utils/typeOf.js +38 -44
- package/lib/esm/type/bignumber/function/bignumber.js +1 -3
- package/lib/esm/type/boolean.js +1 -3
- package/lib/esm/type/chain/Chain.js +23 -3
- package/lib/esm/type/complex/Complex.js +4 -0
- package/lib/esm/type/complex/function/complex.js +1 -3
- package/lib/esm/type/fraction/Fraction.js +4 -0
- package/lib/esm/type/fraction/function/fraction.js +1 -3
- package/lib/esm/type/matrix/DenseMatrix.js +15 -1
- package/lib/esm/type/matrix/SparseMatrix.js +9 -0
- package/lib/esm/type/matrix/utils/{algorithm01.js → matAlgo01xDSid.js} +2 -2
- package/lib/esm/type/matrix/utils/{algorithm02.js → matAlgo02xDS0.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm03.js → matAlgo03xDSf.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm04.js → matAlgo04xSidSid.js} +5 -5
- package/lib/esm/type/matrix/utils/{algorithm05.js → matAlgo05xSfSf.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm06.js → matAlgo06xS0S0.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm07.js → matAlgo07xSSf.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm08.js → matAlgo08xS0Sid.js} +4 -4
- package/lib/esm/type/matrix/utils/{algorithm09.js → matAlgo09xS0Sf.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm10.js → matAlgo10xSids.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm11.js → matAlgo11xS0s.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm12.js → matAlgo12xSfs.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm13.js → matAlgo13xDD.js} +3 -3
- package/lib/esm/type/matrix/utils/{algorithm14.js → matAlgo14xDs.js} +3 -3
- package/lib/esm/type/matrix/utils/matrixAlgorithmSuite.js +168 -0
- package/lib/esm/type/number.js +1 -3
- package/lib/esm/type/string.js +1 -3
- package/lib/esm/type/unit/Unit.js +61 -13
- package/lib/esm/type/unit/function/createUnit.js +2 -1
- package/lib/esm/type/unit/function/unit.js +5 -3
- package/lib/esm/utils/is.js +18 -18
- package/lib/esm/utils/snapshot.js +22 -48
- package/lib/esm/version.js +1 -1
- package/package.json +21 -24
- package/types/index.d.ts +202 -181
- package/types/index.ts +264 -57
- package/lib/cjs/utils/polyfills.js +0 -14
- package/lib/esm/utils/polyfills.js +0 -12
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import { isNode, isConstantNode, isOperatorNode, isParenthesisNode } from '../../utils/is.js';
|
|
2
3
|
import { map } from '../../utils/array.js';
|
|
3
4
|
import { escape } from '../../utils/string.js';
|
|
4
5
|
import { getSafeProperty, isSafeMethod } from '../../utils/customs.js';
|
|
@@ -13,149 +14,29 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
13
14
|
} = _ref;
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* @
|
|
21
|
-
* @param {string} fn Function name, for example 'add'
|
|
22
|
-
* @param {Node[]} args Operator arguments
|
|
23
|
-
* @param {boolean} [implicit] Is this an implicit multiplication?
|
|
24
|
-
* @param {boolean} [isPercentage] Is this an percentage Operation?
|
|
25
|
-
*/
|
|
26
|
-
function OperatorNode(op, fn, args, implicit, isPercentage) {
|
|
27
|
-
if (!(this instanceof OperatorNode)) {
|
|
28
|
-
throw new SyntaxError('Constructor must be called with the new operator');
|
|
29
|
-
} // validate input
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (typeof op !== 'string') {
|
|
33
|
-
throw new TypeError('string expected for parameter "op"');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (typeof fn !== 'string') {
|
|
37
|
-
throw new TypeError('string expected for parameter "fn"');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!Array.isArray(args) || !args.every(isNode)) {
|
|
41
|
-
throw new TypeError('Array containing Nodes expected for parameter "args"');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
this.implicit = implicit === true;
|
|
45
|
-
this.isPercentage = isPercentage === true;
|
|
46
|
-
this.op = op;
|
|
47
|
-
this.fn = fn;
|
|
48
|
-
this.args = args || [];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
OperatorNode.prototype = new Node();
|
|
52
|
-
OperatorNode.prototype.type = 'OperatorNode';
|
|
53
|
-
OperatorNode.prototype.isOperatorNode = true;
|
|
54
|
-
/**
|
|
55
|
-
* Compile a node into a JavaScript function.
|
|
56
|
-
* This basically pre-calculates as much as possible and only leaves open
|
|
57
|
-
* calculations which depend on a dynamic scope with variables.
|
|
58
|
-
* @param {Object} math Math.js namespace with functions and constants.
|
|
59
|
-
* @param {Object} argNames An object with argument names as key and `true`
|
|
60
|
-
* as value. Used in the SymbolNode to optimize
|
|
61
|
-
* for arguments from user assigned functions
|
|
62
|
-
* (see FunctionAssignmentNode) or special symbols
|
|
63
|
-
* like `end` (see IndexNode).
|
|
64
|
-
* @return {function} Returns a function which can be called like:
|
|
65
|
-
* evalNode(scope: Object, args: Object, context: *)
|
|
17
|
+
* Returns true if the expression starts with a constant, under
|
|
18
|
+
* the current parenthesization:
|
|
19
|
+
* @param {Node} expression
|
|
20
|
+
* @param {string} parenthesis
|
|
21
|
+
* @return {boolean}
|
|
66
22
|
*/
|
|
23
|
+
function startsWithConstant(expr, parenthesis) {
|
|
24
|
+
var curNode = expr;
|
|
67
25
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (!math[this.fn]) {
|
|
72
|
-
throw new Error('Function ' + this.fn + ' missing in provided namespace "math"');
|
|
73
|
-
} else {
|
|
74
|
-
throw new Error('No access to function "' + this.fn + '"');
|
|
26
|
+
if (parenthesis === 'auto') {
|
|
27
|
+
while (isParenthesisNode(curNode)) {
|
|
28
|
+
curNode = curNode.content;
|
|
75
29
|
}
|
|
76
30
|
}
|
|
77
31
|
|
|
78
|
-
|
|
79
|
-
var evalArgs = map(this.args, function (arg) {
|
|
80
|
-
return arg._compile(math, argNames);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
if (evalArgs.length === 1) {
|
|
84
|
-
var evalArg0 = evalArgs[0];
|
|
85
|
-
return function evalOperatorNode(scope, args, context) {
|
|
86
|
-
return fn(evalArg0(scope, args, context));
|
|
87
|
-
};
|
|
88
|
-
} else if (evalArgs.length === 2) {
|
|
89
|
-
var _evalArg = evalArgs[0];
|
|
90
|
-
var evalArg1 = evalArgs[1];
|
|
91
|
-
return function evalOperatorNode(scope, args, context) {
|
|
92
|
-
return fn(_evalArg(scope, args, context), evalArg1(scope, args, context));
|
|
93
|
-
};
|
|
94
|
-
} else {
|
|
95
|
-
return function evalOperatorNode(scope, args, context) {
|
|
96
|
-
return fn.apply(null, map(evalArgs, function (evalArg) {
|
|
97
|
-
return evalArg(scope, args, context);
|
|
98
|
-
}));
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
/**
|
|
103
|
-
* Execute a callback for each of the child nodes of this node
|
|
104
|
-
* @param {function(child: Node, path: string, parent: Node)} callback
|
|
105
|
-
*/
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
OperatorNode.prototype.forEach = function (callback) {
|
|
109
|
-
for (var i = 0; i < this.args.length; i++) {
|
|
110
|
-
callback(this.args[i], 'args[' + i + ']', this);
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
/**
|
|
114
|
-
* Create a new OperatorNode having it's childs be the results of calling
|
|
115
|
-
* the provided callback function for each of the childs of the original node.
|
|
116
|
-
* @param {function(child: Node, path: string, parent: Node): Node} callback
|
|
117
|
-
* @returns {OperatorNode} Returns a transformed copy of the node
|
|
118
|
-
*/
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
OperatorNode.prototype.map = function (callback) {
|
|
122
|
-
var args = [];
|
|
32
|
+
if (isConstantNode(curNode)) return true;
|
|
123
33
|
|
|
124
|
-
|
|
125
|
-
|
|
34
|
+
if (isOperatorNode(curNode)) {
|
|
35
|
+
return startsWithConstant(curNode.args[0], parenthesis);
|
|
126
36
|
}
|
|
127
37
|
|
|
128
|
-
return
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Create a clone of this node, a shallow copy
|
|
132
|
-
* @return {OperatorNode}
|
|
133
|
-
*/
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
OperatorNode.prototype.clone = function () {
|
|
137
|
-
return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
|
|
138
|
-
};
|
|
139
|
-
/**
|
|
140
|
-
* Check whether this is an unary OperatorNode:
|
|
141
|
-
* has exactly one argument, like `-a`.
|
|
142
|
-
* @return {boolean} Returns true when an unary operator node, false otherwise.
|
|
143
|
-
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
OperatorNode.prototype.isUnary = function () {
|
|
147
|
-
return this.args.length === 1;
|
|
148
|
-
};
|
|
149
|
-
/**
|
|
150
|
-
* Check whether this is a binary OperatorNode:
|
|
151
|
-
* has exactly two arguments, like `a + b`.
|
|
152
|
-
* @return {boolean} Returns true when a binary operator node, false otherwise.
|
|
153
|
-
*/
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
OperatorNode.prototype.isBinary = function () {
|
|
157
|
-
return this.args.length === 2;
|
|
158
|
-
};
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
159
40
|
/**
|
|
160
41
|
* Calculate which parentheses are necessary. Gets an OperatorNode
|
|
161
42
|
* (which is the root of the tree) and an Array of Nodes
|
|
@@ -173,7 +54,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
173
54
|
|
|
174
55
|
function calculateNecessaryParentheses(root, parenthesis, implicit, args, latex) {
|
|
175
56
|
// precedence of the root OperatorNode
|
|
176
|
-
var precedence = getPrecedence(root, parenthesis);
|
|
57
|
+
var precedence = getPrecedence(root, parenthesis, implicit);
|
|
177
58
|
var associativity = getAssociativity(root, parenthesis);
|
|
178
59
|
|
|
179
60
|
if (parenthesis === 'all' || args.length > 2 && root.getIdentifier() !== 'OperatorNode:add' && root.getIdentifier() !== 'OperatorNode:multiply') {
|
|
@@ -203,7 +84,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
203
84
|
// unary operators
|
|
204
85
|
{
|
|
205
86
|
// precedence of the operand
|
|
206
|
-
var operandPrecedence = getPrecedence(args[0], parenthesis); // handle special cases for LaTeX, where some of the parentheses aren't needed
|
|
87
|
+
var operandPrecedence = getPrecedence(args[0], parenthesis, implicit, root); // handle special cases for LaTeX, where some of the parentheses aren't needed
|
|
207
88
|
|
|
208
89
|
if (latex && operandPrecedence !== null) {
|
|
209
90
|
var operandIdentifier;
|
|
@@ -252,7 +133,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
252
133
|
var lhsParens; // left hand side needs parenthesis?
|
|
253
134
|
// precedence of the left hand side
|
|
254
135
|
|
|
255
|
-
var lhsPrecedence = getPrecedence(args[0], parenthesis); // is the root node associative with the left hand side
|
|
136
|
+
var lhsPrecedence = getPrecedence(args[0], parenthesis, implicit, root); // is the root node associative with the left hand side
|
|
256
137
|
|
|
257
138
|
var assocWithLhs = isAssociativeWith(root, args[0], parenthesis);
|
|
258
139
|
|
|
@@ -275,7 +156,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
275
156
|
var rhsParens; // right hand side needs parenthesis?
|
|
276
157
|
// precedence of the right hand side
|
|
277
158
|
|
|
278
|
-
var rhsPrecedence = getPrecedence(args[1], parenthesis); // is the root node associative with the right hand side?
|
|
159
|
+
var rhsPrecedence = getPrecedence(args[1], parenthesis, implicit, root); // is the root node associative with the right hand side?
|
|
279
160
|
|
|
280
161
|
var assocWithRhs = isAssociativeWith(root, args[1], parenthesis);
|
|
281
162
|
|
|
@@ -341,7 +222,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
341
222
|
default:
|
|
342
223
|
if (root.getIdentifier() === 'OperatorNode:add' || root.getIdentifier() === 'OperatorNode:multiply') {
|
|
343
224
|
result = args.map(function (arg) {
|
|
344
|
-
var argPrecedence = getPrecedence(arg, parenthesis);
|
|
225
|
+
var argPrecedence = getPrecedence(arg, parenthesis, implicit, root);
|
|
345
226
|
var assocWithArg = isAssociativeWith(root, arg, parenthesis);
|
|
346
227
|
var argAssociativity = getAssociativity(arg, parenthesis);
|
|
347
228
|
|
|
@@ -359,327 +240,483 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
|
359
240
|
}
|
|
360
241
|
|
|
361
242
|
break;
|
|
362
|
-
} //
|
|
363
|
-
//
|
|
364
|
-
//
|
|
365
|
-
|
|
243
|
+
} // Handles an edge case of parentheses with implicit multiplication
|
|
244
|
+
// of ConstantNode.
|
|
245
|
+
// In that case, parenthesize ConstantNodes that follow an unparenthesized
|
|
246
|
+
// expression, even though they normally wouldn't be printed.
|
|
366
247
|
|
|
367
|
-
if (args.length >= 2 && root.getIdentifier() === 'OperatorNode:multiply' && root.implicit && parenthesis === 'auto' && implicit === 'hide') {
|
|
368
|
-
result = args.map(function (arg, index) {
|
|
369
|
-
var isParenthesisNode = arg.getIdentifier() === 'ParenthesisNode';
|
|
370
248
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
249
|
+
if (args.length >= 2 && root.getIdentifier() === 'OperatorNode:multiply' && root.implicit && parenthesis !== 'all' && implicit === 'hide') {
|
|
250
|
+
for (var i = 1; i < result.length; ++i) {
|
|
251
|
+
if (startsWithConstant(args[i], parenthesis) && !result[i - 1] && (parenthesis !== 'keep' || !isParenthesisNode(args[i - 1]))) {
|
|
252
|
+
result[i] = true;
|
|
374
253
|
}
|
|
375
|
-
|
|
376
|
-
return false;
|
|
377
|
-
});
|
|
254
|
+
}
|
|
378
255
|
}
|
|
379
256
|
|
|
380
257
|
return result;
|
|
381
258
|
}
|
|
382
|
-
/**
|
|
383
|
-
* Get string representation.
|
|
384
|
-
* @param {Object} options
|
|
385
|
-
* @return {string} str
|
|
386
|
-
*/
|
|
387
259
|
|
|
260
|
+
class OperatorNode extends Node {
|
|
261
|
+
/**
|
|
262
|
+
* @constructor OperatorNode
|
|
263
|
+
* @extends {Node}
|
|
264
|
+
* An operator with two arguments, like 2+3
|
|
265
|
+
*
|
|
266
|
+
* @param {string} op Operator name, for example '+'
|
|
267
|
+
* @param {string} fn Function name, for example 'add'
|
|
268
|
+
* @param {Node[]} args Operator arguments
|
|
269
|
+
* @param {boolean} [implicit] Is this an implicit multiplication?
|
|
270
|
+
* @param {boolean} [isPercentage] Is this an percentage Operation?
|
|
271
|
+
*/
|
|
272
|
+
constructor(op, fn, args, implicit, isPercentage) {
|
|
273
|
+
super(); // validate input
|
|
274
|
+
|
|
275
|
+
if (typeof op !== 'string') {
|
|
276
|
+
throw new TypeError('string expected for parameter "op"');
|
|
277
|
+
}
|
|
388
278
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
var args = this.args;
|
|
393
|
-
var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
|
|
394
|
-
|
|
395
|
-
if (args.length === 1) {
|
|
396
|
-
// unary operators
|
|
397
|
-
var assoc = getAssociativity(this, parenthesis);
|
|
398
|
-
var operand = args[0].toString(options);
|
|
279
|
+
if (typeof fn !== 'string') {
|
|
280
|
+
throw new TypeError('string expected for parameter "fn"');
|
|
281
|
+
}
|
|
399
282
|
|
|
400
|
-
if (
|
|
401
|
-
|
|
402
|
-
}
|
|
283
|
+
if (!Array.isArray(args) || !args.every(isNode)) {
|
|
284
|
+
throw new TypeError('Array containing Nodes expected for parameter "args"');
|
|
285
|
+
}
|
|
403
286
|
|
|
287
|
+
this.implicit = implicit === true;
|
|
288
|
+
this.isPercentage = isPercentage === true;
|
|
289
|
+
this.op = op;
|
|
290
|
+
this.fn = fn;
|
|
291
|
+
this.args = args || [];
|
|
292
|
+
}
|
|
404
293
|
|
|
405
|
-
|
|
294
|
+
get type() {
|
|
295
|
+
return name;
|
|
296
|
+
}
|
|
406
297
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
298
|
+
get isOperatorNode() {
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Compile a node into a JavaScript function.
|
|
303
|
+
* This basically pre-calculates as much as possible and only leaves open
|
|
304
|
+
* calculations which depend on a dynamic scope with variables.
|
|
305
|
+
* @param {Object} math Math.js namespace with functions and constants.
|
|
306
|
+
* @param {Object} argNames An object with argument names as key and `true`
|
|
307
|
+
* as value. Used in the SymbolNode to optimize
|
|
308
|
+
* for arguments from user assigned functions
|
|
309
|
+
* (see FunctionAssignmentNode) or special symbols
|
|
310
|
+
* like `end` (see IndexNode).
|
|
311
|
+
* @return {function} Returns a function which can be called like:
|
|
312
|
+
* evalNode(scope: Object, args: Object, context: *)
|
|
313
|
+
*/
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
_compile(math, argNames) {
|
|
317
|
+
// validate fn
|
|
318
|
+
if (typeof this.fn !== 'string' || !isSafeMethod(math, this.fn)) {
|
|
319
|
+
if (!math[this.fn]) {
|
|
320
|
+
throw new Error('Function ' + this.fn + ' missing in provided namespace "math"');
|
|
321
|
+
} else {
|
|
322
|
+
throw new Error('No access to function "' + this.fn + '"');
|
|
323
|
+
}
|
|
324
|
+
}
|
|
414
325
|
|
|
326
|
+
var fn = getSafeProperty(math, this.fn);
|
|
327
|
+
var evalArgs = map(this.args, function (arg) {
|
|
328
|
+
return arg._compile(math, argNames);
|
|
329
|
+
});
|
|
415
330
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
331
|
+
if (evalArgs.length === 1) {
|
|
332
|
+
var evalArg0 = evalArgs[0];
|
|
333
|
+
return function evalOperatorNode(scope, args, context) {
|
|
334
|
+
return fn(evalArg0(scope, args, context));
|
|
335
|
+
};
|
|
336
|
+
} else if (evalArgs.length === 2) {
|
|
337
|
+
var _evalArg = evalArgs[0];
|
|
338
|
+
var evalArg1 = evalArgs[1];
|
|
339
|
+
return function evalOperatorNode(scope, args, context) {
|
|
340
|
+
return fn(_evalArg(scope, args, context), evalArg1(scope, args, context));
|
|
341
|
+
};
|
|
342
|
+
} else {
|
|
343
|
+
return function evalOperatorNode(scope, args, context) {
|
|
344
|
+
return fn.apply(null, map(evalArgs, function (evalArg) {
|
|
345
|
+
return evalArg(scope, args, context);
|
|
346
|
+
}));
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Execute a callback for each of the child nodes of this node
|
|
352
|
+
* @param {function(child: Node, path: string, parent: Node)} callback
|
|
353
|
+
*/
|
|
419
354
|
|
|
420
|
-
var rhs = args[1].toString(options); // right hand side
|
|
421
355
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
356
|
+
forEach(callback) {
|
|
357
|
+
for (var i = 0; i < this.args.length; i++) {
|
|
358
|
+
callback(this.args[i], 'args[' + i + ']', this);
|
|
425
359
|
}
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Create a new OperatorNode whose children are the results of calling
|
|
363
|
+
* the provided callback function for each child of the original node.
|
|
364
|
+
* @param {function(child: Node, path: string, parent: Node): Node} callback
|
|
365
|
+
* @returns {OperatorNode} Returns a transformed copy of the node
|
|
366
|
+
*/
|
|
426
367
|
|
|
427
|
-
if (parens[1]) {
|
|
428
|
-
// right hand side in parenthesis?
|
|
429
|
-
rhs = '(' + rhs + ')';
|
|
430
|
-
}
|
|
431
368
|
|
|
432
|
-
|
|
433
|
-
|
|
369
|
+
map(callback) {
|
|
370
|
+
var args = [];
|
|
371
|
+
|
|
372
|
+
for (var i = 0; i < this.args.length; i++) {
|
|
373
|
+
args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
|
|
434
374
|
}
|
|
435
375
|
|
|
436
|
-
return
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
|
|
376
|
+
return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Create a clone of this node, a shallow copy
|
|
380
|
+
* @return {OperatorNode}
|
|
381
|
+
*/
|
|
440
382
|
|
|
441
|
-
if (parens[index]) {
|
|
442
|
-
// put in parenthesis?
|
|
443
|
-
arg = '(' + arg + ')';
|
|
444
|
-
}
|
|
445
383
|
|
|
446
|
-
|
|
447
|
-
|
|
384
|
+
clone() {
|
|
385
|
+
return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Check whether this is an unary OperatorNode:
|
|
389
|
+
* has exactly one argument, like `-a`.
|
|
390
|
+
* @return {boolean}
|
|
391
|
+
* Returns true when an unary operator node, false otherwise.
|
|
392
|
+
*/
|
|
448
393
|
|
|
449
|
-
if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
|
|
450
|
-
return stringifiedArgs.join(' ');
|
|
451
|
-
}
|
|
452
394
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
// fallback to formatting as a function call
|
|
456
|
-
return this.fn + '(' + this.args.join(', ') + ')';
|
|
395
|
+
isUnary() {
|
|
396
|
+
return this.args.length === 1;
|
|
457
397
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
398
|
+
/**
|
|
399
|
+
* Check whether this is a binary OperatorNode:
|
|
400
|
+
* has exactly two arguments, like `a + b`.
|
|
401
|
+
* @return {boolean}
|
|
402
|
+
* Returns true when a binary operator node, false otherwise.
|
|
403
|
+
*/
|
|
463
404
|
|
|
464
405
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
};
|
|
474
|
-
};
|
|
475
|
-
/**
|
|
476
|
-
* Instantiate an OperatorNode from its JSON representation
|
|
477
|
-
* @param {Object} json An object structured like
|
|
478
|
-
* `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false, "isPercentage":false}`,
|
|
479
|
-
* where mathjs is optional
|
|
480
|
-
* @returns {OperatorNode}
|
|
481
|
-
*/
|
|
406
|
+
isBinary() {
|
|
407
|
+
return this.args.length === 2;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Get string representation.
|
|
411
|
+
* @param {Object} options
|
|
412
|
+
* @return {string} str
|
|
413
|
+
*/
|
|
482
414
|
|
|
483
415
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
* @param {Object} options
|
|
490
|
-
* @return {string} str
|
|
491
|
-
*/
|
|
416
|
+
_toString(options) {
|
|
417
|
+
var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
|
|
418
|
+
var implicit = options && options.implicit ? options.implicit : 'hide';
|
|
419
|
+
var args = this.args;
|
|
420
|
+
var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
|
|
492
421
|
|
|
422
|
+
if (args.length === 1) {
|
|
423
|
+
// unary operators
|
|
424
|
+
var assoc = getAssociativity(this, parenthesis);
|
|
425
|
+
var operand = args[0].toString(options);
|
|
493
426
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
var args = this.args;
|
|
498
|
-
var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
|
|
427
|
+
if (parens[0]) {
|
|
428
|
+
operand = '(' + operand + ')';
|
|
429
|
+
} // for example for "not", we want a space between operand and argument
|
|
499
430
|
|
|
500
|
-
if (args.length === 1) {
|
|
501
|
-
// unary operators
|
|
502
|
-
var assoc = getAssociativity(this, parenthesis);
|
|
503
|
-
var operand = args[0].toHTML(options);
|
|
504
431
|
|
|
505
|
-
|
|
506
|
-
operand = '<span class="math-parenthesis math-round-parenthesis">(</span>' + operand + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
507
|
-
}
|
|
432
|
+
var opIsNamed = /[a-zA-Z]+/.test(this.op);
|
|
508
433
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
} else if (args.length === 2) {
|
|
517
|
-
// binary operatoes
|
|
518
|
-
var lhs = args[0].toHTML(options); // left hand side
|
|
434
|
+
if (assoc === 'right') {
|
|
435
|
+
// prefix operator
|
|
436
|
+
return this.op + (opIsNamed ? ' ' : '') + operand;
|
|
437
|
+
} else if (assoc === 'left') {
|
|
438
|
+
// postfix
|
|
439
|
+
return operand + (opIsNamed ? ' ' : '') + this.op;
|
|
440
|
+
} // fall back to postfix
|
|
519
441
|
|
|
520
|
-
var rhs = args[1].toHTML(options); // right hand side
|
|
521
442
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
lhs =
|
|
525
|
-
}
|
|
443
|
+
return operand + this.op;
|
|
444
|
+
} else if (args.length === 2) {
|
|
445
|
+
var lhs = args[0].toString(options); // left hand side
|
|
526
446
|
|
|
527
|
-
|
|
528
|
-
// right hand side in parenthesis?
|
|
529
|
-
rhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + rhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
530
|
-
}
|
|
447
|
+
var rhs = args[1].toString(options); // right hand side
|
|
531
448
|
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
449
|
+
if (parens[0]) {
|
|
450
|
+
// left hand side in parenthesis?
|
|
451
|
+
lhs = '(' + lhs + ')';
|
|
452
|
+
}
|
|
535
453
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
454
|
+
if (parens[1]) {
|
|
455
|
+
// right hand side in parenthesis?
|
|
456
|
+
rhs = '(' + rhs + ')';
|
|
457
|
+
}
|
|
540
458
|
|
|
541
|
-
if (
|
|
542
|
-
|
|
543
|
-
arg = '<span class="math-parenthesis math-round-parenthesis">(</span>' + arg + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
459
|
+
if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
|
|
460
|
+
return lhs + ' ' + rhs;
|
|
544
461
|
}
|
|
545
462
|
|
|
546
|
-
return
|
|
547
|
-
})
|
|
463
|
+
return lhs + ' ' + this.op + ' ' + rhs;
|
|
464
|
+
} else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
|
|
465
|
+
var stringifiedArgs = args.map(function (arg, index) {
|
|
466
|
+
arg = arg.toString(options);
|
|
467
|
+
|
|
468
|
+
if (parens[index]) {
|
|
469
|
+
// put in parenthesis?
|
|
470
|
+
arg = '(' + arg + ')';
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return arg;
|
|
474
|
+
});
|
|
548
475
|
|
|
549
|
-
if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
|
|
550
476
|
if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
|
|
551
|
-
return stringifiedArgs.join('
|
|
477
|
+
return stringifiedArgs.join(' ');
|
|
552
478
|
}
|
|
553
479
|
|
|
554
|
-
return stringifiedArgs.join('
|
|
480
|
+
return stringifiedArgs.join(' ' + this.op + ' ');
|
|
555
481
|
} else {
|
|
556
482
|
// fallback to formatting as a function call
|
|
557
|
-
return
|
|
483
|
+
return this.fn + '(' + this.args.join(', ') + ')';
|
|
558
484
|
}
|
|
559
485
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
486
|
+
/**
|
|
487
|
+
* Get a JSON representation of the node
|
|
488
|
+
* @returns {Object}
|
|
489
|
+
*/
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
toJSON() {
|
|
493
|
+
return {
|
|
494
|
+
mathjs: name,
|
|
495
|
+
op: this.op,
|
|
496
|
+
fn: this.fn,
|
|
497
|
+
args: this.args,
|
|
498
|
+
implicit: this.implicit,
|
|
499
|
+
isPercentage: this.isPercentage
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Instantiate an OperatorNode from its JSON representation
|
|
504
|
+
* @param {Object} json
|
|
505
|
+
* An object structured like
|
|
506
|
+
* ```
|
|
507
|
+
* {"mathjs": "OperatorNode",
|
|
508
|
+
* "op": "+", "fn": "add", "args": [...],
|
|
509
|
+
* "implicit": false,
|
|
510
|
+
* "isPercentage":false}
|
|
511
|
+
* ```
|
|
512
|
+
* where mathjs is optional
|
|
513
|
+
* @returns {OperatorNode}
|
|
514
|
+
*/
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
static fromJSON(json) {
|
|
518
|
+
return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Get HTML representation.
|
|
522
|
+
* @param {Object} options
|
|
523
|
+
* @return {string} str
|
|
524
|
+
*/
|
|
566
525
|
|
|
567
526
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
var op = latexOperators[this.fn];
|
|
574
|
-
op = typeof op === 'undefined' ? this.op : op; // fall back to using this.op
|
|
527
|
+
toHTML(options) {
|
|
528
|
+
var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
|
|
529
|
+
var implicit = options && options.implicit ? options.implicit : 'hide';
|
|
530
|
+
var args = this.args;
|
|
531
|
+
var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
|
|
575
532
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
533
|
+
if (args.length === 1) {
|
|
534
|
+
// unary operators
|
|
535
|
+
var assoc = getAssociativity(this, parenthesis);
|
|
536
|
+
var operand = args[0].toHTML(options);
|
|
580
537
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
538
|
+
if (parens[0]) {
|
|
539
|
+
operand = '<span class="math-parenthesis math-round-parenthesis">(</span>' + operand + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
540
|
+
}
|
|
584
541
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
542
|
+
if (assoc === 'right') {
|
|
543
|
+
// prefix operator
|
|
544
|
+
return '<span class="math-operator math-unary-operator ' + 'math-lefthand-unary-operator">' + escape(this.op) + '</span>' + operand;
|
|
545
|
+
} else {
|
|
546
|
+
// postfix when assoc === 'left' or undefined
|
|
547
|
+
return operand + '<span class="math-operator math-unary-operator ' + 'math-righthand-unary-operator">' + escape(this.op) + '</span>';
|
|
548
|
+
}
|
|
549
|
+
} else if (args.length === 2) {
|
|
550
|
+
// binary operatoes
|
|
551
|
+
var lhs = args[0].toHTML(options); // left hand side
|
|
552
|
+
|
|
553
|
+
var rhs = args[1].toHTML(options); // right hand side
|
|
554
|
+
|
|
555
|
+
if (parens[0]) {
|
|
556
|
+
// left hand side in parenthesis?
|
|
557
|
+
lhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + lhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
if (parens[1]) {
|
|
561
|
+
// right hand side in parenthesis?
|
|
562
|
+
rhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + rhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
|
|
566
|
+
return lhs + '<span class="math-operator math-binary-operator ' + 'math-implicit-binary-operator"></span>' + rhs;
|
|
567
|
+
}
|
|
592
568
|
|
|
569
|
+
return lhs + '<span class="math-operator math-binary-operator ' + 'math-explicit-binary-operator">' + escape(this.op) + '</span>' + rhs;
|
|
570
|
+
} else {
|
|
571
|
+
var stringifiedArgs = args.map(function (arg, index) {
|
|
572
|
+
arg = arg.toHTML(options);
|
|
593
573
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
574
|
+
if (parens[index]) {
|
|
575
|
+
// put in parenthesis?
|
|
576
|
+
arg = '<span class="math-parenthesis math-round-parenthesis">(</span>' + arg + '<span class="math-parenthesis math-round-parenthesis">)</span>';
|
|
577
|
+
}
|
|
598
578
|
|
|
599
|
-
|
|
579
|
+
return arg;
|
|
580
|
+
});
|
|
600
581
|
|
|
601
|
-
|
|
602
|
-
|
|
582
|
+
if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
|
|
583
|
+
if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
|
|
584
|
+
return stringifiedArgs.join('<span class="math-operator math-binary-operator ' + 'math-implicit-binary-operator"></span>');
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
return stringifiedArgs.join('<span class="math-operator math-binary-operator ' + 'math-explicit-binary-operator">' + escape(this.op) + '</span>');
|
|
588
|
+
} else {
|
|
589
|
+
// fallback to formatting as a function call
|
|
590
|
+
return '<span class="math-function">' + escape(this.fn) + '</span><span class="math-paranthesis math-round-parenthesis">' + '(</span>' + stringifiedArgs.join('<span class="math-separator">,</span>') + '<span class="math-paranthesis math-round-parenthesis">)</span>';
|
|
591
|
+
}
|
|
603
592
|
}
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Get LaTeX representation
|
|
596
|
+
* @param {Object} options
|
|
597
|
+
* @return {string} str
|
|
598
|
+
*/
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
_toTex(options) {
|
|
602
|
+
var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
|
|
603
|
+
var implicit = options && options.implicit ? options.implicit : 'hide';
|
|
604
|
+
var args = this.args;
|
|
605
|
+
var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, true);
|
|
606
|
+
var op = latexOperators[this.fn];
|
|
607
|
+
op = typeof op === 'undefined' ? this.op : op; // fall back to using this.op
|
|
608
|
+
|
|
609
|
+
if (args.length === 1) {
|
|
610
|
+
// unary operators
|
|
611
|
+
var assoc = getAssociativity(this, parenthesis);
|
|
612
|
+
var operand = args[0].toTex(options);
|
|
613
|
+
|
|
614
|
+
if (parens[0]) {
|
|
615
|
+
operand = "\\left(".concat(operand, "\\right)");
|
|
616
|
+
}
|
|
604
617
|
|
|
605
|
-
|
|
618
|
+
if (assoc === 'right') {
|
|
619
|
+
// prefix operator
|
|
620
|
+
return op + operand;
|
|
621
|
+
} else if (assoc === 'left') {
|
|
622
|
+
// postfix operator
|
|
623
|
+
return operand + op;
|
|
624
|
+
} // fall back to postfix
|
|
606
625
|
|
|
607
|
-
var rhsTex = rhs.toTex(options);
|
|
608
626
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
627
|
+
return operand + op;
|
|
628
|
+
} else if (args.length === 2) {
|
|
629
|
+
// binary operators
|
|
630
|
+
var lhs = args[0]; // left hand side
|
|
612
631
|
|
|
632
|
+
var lhsTex = lhs.toTex(options);
|
|
613
633
|
|
|
614
|
-
|
|
634
|
+
if (parens[0]) {
|
|
635
|
+
lhsTex = "\\left(".concat(lhsTex, "\\right)");
|
|
636
|
+
}
|
|
615
637
|
|
|
616
|
-
|
|
617
|
-
lhsIdentifier = lhs.getIdentifier();
|
|
618
|
-
} else {
|
|
619
|
-
// Ignore ParenthesisNodes if in 'keep' mode
|
|
620
|
-
lhsIdentifier = lhs.getContent().getIdentifier();
|
|
621
|
-
}
|
|
638
|
+
var rhs = args[1]; // right hand side
|
|
622
639
|
|
|
623
|
-
|
|
624
|
-
case 'OperatorNode:divide':
|
|
625
|
-
// op contains '\\frac' at this point
|
|
626
|
-
return op + '{' + lhsTex + '}' + '{' + rhsTex + '}';
|
|
640
|
+
var rhsTex = rhs.toTex(options);
|
|
627
641
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
642
|
+
if (parens[1]) {
|
|
643
|
+
rhsTex = "\\left(".concat(rhsTex, "\\right)");
|
|
644
|
+
} // handle some exceptions (due to the way LaTeX works)
|
|
631
645
|
|
|
632
|
-
switch (lhsIdentifier) {
|
|
633
|
-
case 'ConditionalNode': //
|
|
634
646
|
|
|
635
|
-
|
|
636
|
-
lhsTex = "\\left(".concat(lhsTex, "\\right)");
|
|
637
|
-
}
|
|
647
|
+
var lhsIdentifier;
|
|
638
648
|
|
|
639
|
-
|
|
649
|
+
if (parenthesis === 'keep') {
|
|
650
|
+
lhsIdentifier = lhs.getIdentifier();
|
|
651
|
+
} else {
|
|
652
|
+
// Ignore ParenthesisNodes if in 'keep' mode
|
|
653
|
+
lhsIdentifier = lhs.getContent().getIdentifier();
|
|
654
|
+
}
|
|
640
655
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
656
|
+
switch (this.getIdentifier()) {
|
|
657
|
+
case 'OperatorNode:divide':
|
|
658
|
+
// op contains '\\frac' at this point
|
|
659
|
+
return op + '{' + lhsTex + '}' + '{' + rhsTex + '}';
|
|
645
660
|
|
|
646
|
-
|
|
661
|
+
case 'OperatorNode:pow':
|
|
662
|
+
lhsTex = '{' + lhsTex + '}';
|
|
663
|
+
rhsTex = '{' + rhsTex + '}';
|
|
647
664
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
665
|
+
switch (lhsIdentifier) {
|
|
666
|
+
case 'ConditionalNode': //
|
|
667
|
+
|
|
668
|
+
case 'OperatorNode:divide':
|
|
669
|
+
lhsTex = "\\left(".concat(lhsTex, "\\right)");
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
break;
|
|
673
|
+
|
|
674
|
+
case 'OperatorNode:multiply':
|
|
675
|
+
if (this.implicit && implicit === 'hide') {
|
|
676
|
+
return lhsTex + '~' + rhsTex;
|
|
677
|
+
}
|
|
652
678
|
|
|
653
|
-
if (parens[index]) {
|
|
654
|
-
arg = "\\left(".concat(arg, "\\right)");
|
|
655
679
|
}
|
|
656
680
|
|
|
657
|
-
return
|
|
658
|
-
})
|
|
681
|
+
return lhsTex + op + rhsTex;
|
|
682
|
+
} else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
|
|
683
|
+
var texifiedArgs = args.map(function (arg, index) {
|
|
684
|
+
arg = arg.toTex(options);
|
|
685
|
+
|
|
686
|
+
if (parens[index]) {
|
|
687
|
+
arg = "\\left(".concat(arg, "\\right)");
|
|
688
|
+
}
|
|
659
689
|
|
|
660
|
-
|
|
661
|
-
|
|
690
|
+
return arg;
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
if (this.getIdentifier() === 'OperatorNode:multiply' && this.implicit && implicit === 'hide') {
|
|
694
|
+
return texifiedArgs.join('~');
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
return texifiedArgs.join(op);
|
|
698
|
+
} else {
|
|
699
|
+
// fall back to formatting as a function call
|
|
700
|
+
// as this is a fallback, it doesn't use
|
|
701
|
+
// fancy function names
|
|
702
|
+
return '\\mathrm{' + this.fn + '}\\left(' + args.map(function (arg) {
|
|
703
|
+
return arg.toTex(options);
|
|
704
|
+
}).join(',') + '\\right)';
|
|
662
705
|
}
|
|
706
|
+
}
|
|
707
|
+
/**
|
|
708
|
+
* Get identifier.
|
|
709
|
+
* @return {string}
|
|
710
|
+
*/
|
|
663
711
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
// as this is a fallback, it doesn't use
|
|
668
|
-
// fancy function names
|
|
669
|
-
return '\\mathrm{' + this.fn + '}\\left(' + args.map(function (arg) {
|
|
670
|
-
return arg.toTex(options);
|
|
671
|
-
}).join(',') + '\\right)';
|
|
712
|
+
|
|
713
|
+
getIdentifier() {
|
|
714
|
+
return this.type + ':' + this.fn;
|
|
672
715
|
}
|
|
673
|
-
};
|
|
674
|
-
/**
|
|
675
|
-
* Get identifier.
|
|
676
|
-
* @return {string}
|
|
677
|
-
*/
|
|
678
716
|
|
|
717
|
+
}
|
|
679
718
|
|
|
680
|
-
OperatorNode
|
|
681
|
-
return this.type + ':' + this.fn;
|
|
682
|
-
};
|
|
719
|
+
_defineProperty(OperatorNode, "name", name);
|
|
683
720
|
|
|
684
721
|
return OperatorNode;
|
|
685
722
|
}, {
|