mathjs 14.5.3 → 14.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/HISTORY.md +21 -1
  2. package/lib/browser/math.js +1 -1
  3. package/lib/browser/math.js.LICENSE.txt +2 -2
  4. package/lib/browser/math.js.map +1 -1
  5. package/lib/cjs/core/function/config.js +0 -1
  6. package/lib/cjs/entry/dependenciesAny/dependenciesToBest.generated.js +17 -0
  7. package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +2 -0
  8. package/lib/cjs/entry/dependenciesAny.generated.js +7 -0
  9. package/lib/cjs/entry/impureFunctionsAny.generated.js +1 -0
  10. package/lib/cjs/entry/pureFunctionsAny.generated.js +7 -3
  11. package/lib/cjs/expression/Parser.js +35 -1
  12. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +2 -0
  13. package/lib/cjs/expression/embeddedDocs/function/units/toBest.js +14 -0
  14. package/lib/cjs/expression/node/FunctionAssignmentNode.js +3 -1
  15. package/lib/cjs/expression/parse.js +1 -1
  16. package/lib/cjs/factoriesAny.js +7 -0
  17. package/lib/cjs/function/arithmetic/sign.js +1 -1
  18. package/lib/cjs/function/matrix/range.js +7 -5
  19. package/lib/cjs/function/unit/toBest.js +53 -0
  20. package/lib/cjs/header.js +2 -2
  21. package/lib/cjs/type/matrix/DenseMatrix.js +21 -17
  22. package/lib/cjs/type/string.js +4 -4
  23. package/lib/cjs/type/unit/Unit.js +106 -19
  24. package/lib/cjs/version.js +1 -1
  25. package/lib/esm/core/function/config.js +0 -1
  26. package/lib/esm/entry/dependenciesAny/dependenciesToBest.generated.js +10 -0
  27. package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +2 -0
  28. package/lib/esm/entry/dependenciesAny.generated.js +1 -0
  29. package/lib/esm/entry/impureFunctionsAny.generated.js +2 -1
  30. package/lib/esm/entry/pureFunctionsAny.generated.js +6 -2
  31. package/lib/esm/expression/Parser.js +35 -1
  32. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +2 -0
  33. package/lib/esm/expression/embeddedDocs/function/units/toBest.js +8 -0
  34. package/lib/esm/expression/node/FunctionAssignmentNode.js +3 -1
  35. package/lib/esm/expression/parse.js +1 -1
  36. package/lib/esm/factoriesAny.js +1 -0
  37. package/lib/esm/function/arithmetic/sign.js +1 -1
  38. package/lib/esm/function/matrix/range.js +7 -5
  39. package/lib/esm/function/unit/toBest.js +47 -0
  40. package/lib/esm/type/matrix/DenseMatrix.js +21 -17
  41. package/lib/esm/type/string.js +4 -4
  42. package/lib/esm/type/unit/Unit.js +106 -19
  43. package/lib/esm/version.js +1 -1
  44. package/package.json +15 -16
  45. package/types/index.d.ts +50 -1
  46. package/types/tslint.json +0 -6
@@ -17,6 +17,7 @@ import { numberDependencies } from './dependenciesNumber.generated.js';
17
17
  import { powDependencies } from './dependenciesPow.generated.js';
18
18
  import { roundDependencies } from './dependenciesRound.generated.js';
19
19
  import { subtractScalarDependencies } from './dependenciesSubtractScalar.generated.js';
20
+ import { toBestDependencies } from './dependenciesToBest.generated.js';
20
21
  import { createUnitClass } from '../../factoriesAny.js';
21
22
  export var UnitDependencies = {
22
23
  BigNumberDependencies,
@@ -34,5 +35,6 @@ export var UnitDependencies = {
34
35
  powDependencies,
35
36
  roundDependencies,
36
37
  subtractScalarDependencies,
38
+ toBestDependencies,
37
39
  createUnitClass
38
40
  };
@@ -340,6 +340,7 @@ export { tanhDependencies } from './dependenciesAny/dependenciesTanh.generated.j
340
340
  export { tauDependencies } from './dependenciesAny/dependenciesTau.generated.js';
341
341
  export { thomsonCrossSectionDependencies } from './dependenciesAny/dependenciesThomsonCrossSection.generated.js';
342
342
  export { toDependencies } from './dependenciesAny/dependenciesTo.generated.js';
343
+ export { toBestDependencies } from './dependenciesAny/dependenciesToBest.generated.js';
343
344
  export { traceDependencies } from './dependenciesAny/dependenciesTrace.generated.js';
344
345
  export { transposeDependencies } from './dependenciesAny/dependenciesTranspose.generated.js';
345
346
  export { trueDependencies } from './dependenciesAny/dependenciesTrue.generated.js';
@@ -7,7 +7,7 @@ import { config } from './configReadonly.js';
7
7
  import { createNode, createObjectNode, createOperatorNode, createParenthesisNode, createRelationalNode, createArrayNode, createBlockNode, createConditionalNode, createConstantNode, createRangeNode, createReviver, createChainClass, createFunctionAssignmentNode, createChain, createAccessorNode, createAssignmentNode, createIndexNode, createSymbolNode, createFunctionNode, createParse, createResolve, createSimplifyConstant, createCompile, createSimplifyCore, createEvaluate, createHelpClass, createParserClass, createSimplify, createSymbolicEqual, createLeafCount, createParser, createRationalize, createDerivative, createHelp, createMapSlicesTransform, createFilterTransform, createForEachTransform, createMapTransform, createOrTransform, createAndTransform, createConcatTransform, createIndexTransform, createPrintTransform, createSumTransform, createBitAndTransform, createMinTransform, createSubsetTransform, createBitOrTransform, createCumSumTransform, createDiffTransform, createMaxTransform, createRangeTransform, createRowTransform, createColumnTransform, createMeanTransform, createQuantileSeqTransform, createVarianceTransform, createStdTransform } from '../factoriesAny.js';
8
8
  import { BigNumber, Complex, e, _false, fineStructure, Fraction, i, _Infinity, LN10, LOG10E, Matrix, _NaN, _null, phi, Range, ResultSet, SQRT1_2,
9
9
  // eslint-disable-line camelcase
10
- sackurTetrode, tau, _true, version, DenseMatrix, efimovFactor, LN2, pi, replacer, SQRT2, typed, weakMixingAngle, abs, acos, acot, acsc, addScalar, arg, asech, asinh, atan, atanh, bigint, bitNot, boolean, clone, combinations, complex, conj, cos, cot, csc, cube, equalScalar, erf, exp, expm1, filter, flatten, forEach, format, getMatrixDataType, hex, im, isInteger, isNegative, isPositive, isZero, LOG2E, lgamma, log10, log2, map, multiplyScalar, not, number, oct, pickRandom, print, random, re, sec, sign, sin, SparseMatrix, splitUnit, square, string, subtractScalar, tan, typeOf, acosh, acsch, asec, bignumber, combinationsWithRep, cosh, csch, isNaN, isPrime, mapSlices, matrix, matrixFromFunction, ones, randomInt, reshape, sech, sinh, sparse, sqrt, squeeze, tanh, transpose, xgcd, zeros, acoth, asin, bin, concat, coth, ctranspose, diag, dotMultiply, equal, fraction, identity, isNumeric, kron, largerEq, leftShift, mode, nthRoot, numeric, prod, resize, rightArithShift, round, size, smaller, to, unaryMinus, unequal, xor, add, atan2, bitAnd, bitOr, bitXor, cbrt, compare, compareText, count, deepEqual, divideScalar, dotDivide, equalText, floor, gcd, hasNumericValue, hypot, ImmutableDenseMatrix, Index, larger, log, lsolve, matrixFromColumns, max, min, mod, nthRoots, or, partitionSelect, qr, rightLogShift, smallerEq, subset, subtract, trace, usolve, catalan, compareNatural, composition, diff, distance, dot, FibonacciHeap, index, invmod, lcm, log1p, lsolveAll, matrixFromRows, multiply, range, row, setCartesian, setDistinct, setIsSubset, setPowerset, slu, sort, unaryPlus, usolveAll, zpk2tf, and, ceil, column, cross, det, fix, inv, pinv, pow, setDifference, setMultiplicity, setSymDifference, Spa, sqrtm, sum, Unit, vacuumImpedance, wienDisplacement, atomicMass, bohrMagneton, boltzmann, conductanceQuantum, coulomb, createUnit, deuteronMass, dotPow, electricConstant, elementaryCharge, expm, faraday, fft, gamma, gravitationConstant, hartreeEnergy, ifft, inverseConductanceQuantum, klitzing, loschmidt, magneticConstant, molarMass, molarPlanckConstant, neutronMass, nuclearMagneton, planckCharge, planckLength, planckTemperature, protonMass, quantumOfCirculation, reducedPlanckConstant, rydberg, secondRadiation, setSize, speedOfLight, stefanBoltzmann, thomsonCrossSection, avogadro, bohrRadius, coulombConstant, divide, electronMass, factorial, firstRadiation, gravity, intersect, lup, magneticFluxQuantum, molarMassC12, multinomial, permutations, planckMass, polynomialRoot, setIntersect, solveODE, stirlingS2, unit, bellNumbers, cumsum, eigs, fermiCoupling, gasConstant, kldivergence, lusolve, mean, molarVolume, planckConstant, quantileSeq, setUnion, variance, classicalElectronRadius, median, corr, freqz, mad, std, zeta, norm, rotationMatrix, planckTime, schur, rotate, sylvester, lyap } from './pureFunctionsAny.generated.js';
10
+ sackurTetrode, tau, _true, version, DenseMatrix, efimovFactor, LN2, pi, replacer, SQRT2, typed, weakMixingAngle, abs, acos, acot, acsc, addScalar, arg, asech, asinh, atan, atanh, bigint, bitNot, boolean, clone, combinations, complex, conj, cos, cot, csc, cube, equalScalar, erf, exp, expm1, filter, flatten, forEach, format, getMatrixDataType, hex, im, isInteger, isNegative, isPositive, isZero, LOG2E, lgamma, log10, log2, map, multiplyScalar, not, number, oct, pickRandom, print, random, re, sec, sign, sin, SparseMatrix, splitUnit, square, string, subtractScalar, tan, toBest, typeOf, acosh, acsch, asec, bignumber, combinationsWithRep, cosh, csch, isNaN, isPrime, mapSlices, matrix, matrixFromFunction, ones, randomInt, reshape, sech, sinh, sparse, sqrt, squeeze, tanh, transpose, xgcd, zeros, acoth, asin, bin, concat, coth, ctranspose, diag, dotMultiply, equal, fraction, identity, isNumeric, kron, largerEq, leftShift, mode, nthRoot, numeric, prod, resize, rightArithShift, round, size, smaller, to, unaryMinus, unequal, xor, add, atan2, bitAnd, bitOr, bitXor, cbrt, compare, compareText, count, deepEqual, divideScalar, dotDivide, equalText, floor, gcd, hasNumericValue, hypot, ImmutableDenseMatrix, Index, larger, log, lsolve, matrixFromColumns, max, min, mod, nthRoots, or, partitionSelect, qr, rightLogShift, smallerEq, subset, subtract, trace, usolve, catalan, compareNatural, composition, diff, distance, dot, FibonacciHeap, index, invmod, lcm, log1p, lsolveAll, matrixFromRows, multiply, range, row, setCartesian, setDistinct, setIsSubset, setPowerset, slu, sort, unaryPlus, usolveAll, zpk2tf, and, ceil, column, cross, det, fix, inv, pinv, pow, setDifference, setMultiplicity, setSymDifference, Spa, sqrtm, sum, Unit, vacuumImpedance, wienDisplacement, atomicMass, bohrMagneton, boltzmann, conductanceQuantum, coulomb, createUnit, deuteronMass, dotPow, electricConstant, elementaryCharge, expm, faraday, fft, gamma, gravitationConstant, hartreeEnergy, ifft, inverseConductanceQuantum, klitzing, loschmidt, magneticConstant, molarMass, molarPlanckConstant, neutronMass, nuclearMagneton, planckCharge, planckLength, planckTemperature, protonMass, quantumOfCirculation, reducedPlanckConstant, rydberg, secondRadiation, setSize, speedOfLight, stefanBoltzmann, thomsonCrossSection, avogadro, bohrRadius, coulombConstant, divide, electronMass, factorial, firstRadiation, gravity, intersect, lup, magneticFluxQuantum, molarMassC12, multinomial, permutations, planckMass, polynomialRoot, setIntersect, solveODE, stirlingS2, unit, bellNumbers, cumsum, eigs, fermiCoupling, gasConstant, kldivergence, lusolve, mean, molarVolume, planckConstant, quantileSeq, setUnion, variance, classicalElectronRadius, median, corr, freqz, mad, std, zeta, norm, rotationMatrix, planckTime, schur, rotate, sylvester, lyap } from './pureFunctionsAny.generated.js';
11
11
  var math = {}; // NOT pure!
12
12
  var mathWithTransform = {}; // NOT pure!
13
13
  var classes = {}; // NOT pure!
@@ -322,6 +322,7 @@ _extends(math, {
322
322
  string,
323
323
  subtractScalar,
324
324
  tan,
325
+ toBest,
325
326
  typeOf,
326
327
  acosh,
327
328
  acsch,
@@ -5,7 +5,7 @@
5
5
  import { config } from './configReadonly.js';
6
6
  import { createBigNumberClass, createComplexClass, createE, createFalse, createFineStructure, createFractionClass, createI, createInfinity, createLN10, createLOG10E, createMatrixClass, createNaN, createNull, createPhi, createRangeClass, createResultSet, createSQRT1_2,
7
7
  // eslint-disable-line camelcase
8
- createSackurTetrode, createTau, createTrue, createVersion, createDenseMatrixClass, createEfimovFactor, createLN2, createPi, createReplacer, createSQRT2, createTyped, createWeakMixingAngle, createAbs, createAcos, createAcot, createAcsc, createAddScalar, createArg, createAsech, createAsinh, createAtan, createAtanh, createBigint, createBitNot, createBoolean, createClone, createCombinations, createComplex, createConj, createCos, createCot, createCsc, createCube, createEqualScalar, createErf, createExp, createExpm1, createFilter, createFlatten, createForEach, createFormat, createGetMatrixDataType, createHex, createIm, createIsInteger, createIsNegative, createIsPositive, createIsZero, createLOG2E, createLgamma, createLog10, createLog2, createMap, createMultiplyScalar, createNot, createNumber, createOct, createPickRandom, createPrint, createRandom, createRe, createSec, createSign, createSin, createSparseMatrixClass, createSplitUnit, createSquare, createString, createSubtractScalar, createTan, createTypeOf, createAcosh, createAcsch, createAsec, createBignumber, createCombinationsWithRep, createCosh, createCsch, createIsNaN, createIsPrime, createMapSlices, createMatrix, createMatrixFromFunction, createOnes, createRandomInt, createReshape, createSech, createSinh, createSparse, createSqrt, createSqueeze, createTanh, createTranspose, createXgcd, createZeros, createAcoth, createAsin, createBin, createConcat, createCoth, createCtranspose, createDiag, createDotMultiply, createEqual, createFraction, createIdentity, createIsNumeric, createKron, createLargerEq, createLeftShift, createMode, createNthRoot, createNumeric, createProd, createResize, createRightArithShift, createRound, createSize, createSmaller, createTo, createUnaryMinus, createUnequal, createXor, createAdd, createAtan2, createBitAnd, createBitOr, createBitXor, createCbrt, createCompare, createCompareText, createCount, createDeepEqual, createDivideScalar, createDotDivide, createEqualText, createFloor, createGcd, createHasNumericValue, createHypot, createImmutableDenseMatrixClass, createIndexClass, createLarger, createLog, createLsolve, createMatrixFromColumns, createMax, createMin, createMod, createNthRoots, createOr, createPartitionSelect, createQr, createRightLogShift, createSmallerEq, createSubset, createSubtract, createTrace, createUsolve, createCatalan, createCompareNatural, createComposition, createDiff, createDistance, createDot, createFibonacciHeapClass, createIndex, createInvmod, createLcm, createLog1p, createLsolveAll, createMatrixFromRows, createMultiply, createRange, createRow, createSetCartesian, createSetDistinct, createSetIsSubset, createSetPowerset, createSlu, createSort, createUnaryPlus, createUsolveAll, createZpk2tf, createAnd, createCeil, createColumn, createCross, createDet, createFix, createInv, createPinv, createPow, createSetDifference, createSetMultiplicity, createSetSymDifference, createSpaClass, createSqrtm, createSum, createUnitClass, createVacuumImpedance, createWienDisplacement, createAtomicMass, createBohrMagneton, createBoltzmann, createConductanceQuantum, createCoulomb, createCreateUnit, createDeuteronMass, createDotPow, createElectricConstant, createElementaryCharge, createExpm, createFaraday, createFft, createGamma, createGravitationConstant, createHartreeEnergy, createIfft, createInverseConductanceQuantum, createKlitzing, createLoschmidt, createMagneticConstant, createMolarMass, createMolarPlanckConstant, createNeutronMass, createNuclearMagneton, createPlanckCharge, createPlanckLength, createPlanckTemperature, createProtonMass, createQuantumOfCirculation, createReducedPlanckConstant, createRydberg, createSecondRadiation, createSetSize, createSpeedOfLight, createStefanBoltzmann, createThomsonCrossSection, createAvogadro, createBohrRadius, createCoulombConstant, createDivide, createElectronMass, createFactorial, createFirstRadiation, createGravity, createIntersect, createLup, createMagneticFluxQuantum, createMolarMassC12, createMultinomial, createPermutations, createPlanckMass, createPolynomialRoot, createSetIntersect, createSolveODE, createStirlingS2, createUnitFunction, createBellNumbers, createCumSum, createEigs, createFermiCoupling, createGasConstant, createKldivergence, createLusolve, createMean, createMolarVolume, createPlanckConstant, createQuantileSeq, createSetUnion, createVariance, createClassicalElectronRadius, createMedian, createCorr, createFreqz, createMad, createStd, createZeta, createNorm, createRotationMatrix, createPlanckTime, createSchur, createRotate, createSylvester, createLyap } from '../factoriesAny.js';
8
+ createSackurTetrode, createTau, createTrue, createVersion, createDenseMatrixClass, createEfimovFactor, createLN2, createPi, createReplacer, createSQRT2, createTyped, createWeakMixingAngle, createAbs, createAcos, createAcot, createAcsc, createAddScalar, createArg, createAsech, createAsinh, createAtan, createAtanh, createBigint, createBitNot, createBoolean, createClone, createCombinations, createComplex, createConj, createCos, createCot, createCsc, createCube, createEqualScalar, createErf, createExp, createExpm1, createFilter, createFlatten, createForEach, createFormat, createGetMatrixDataType, createHex, createIm, createIsInteger, createIsNegative, createIsPositive, createIsZero, createLOG2E, createLgamma, createLog10, createLog2, createMap, createMultiplyScalar, createNot, createNumber, createOct, createPickRandom, createPrint, createRandom, createRe, createSec, createSign, createSin, createSparseMatrixClass, createSplitUnit, createSquare, createString, createSubtractScalar, createTan, createToBest, createTypeOf, createAcosh, createAcsch, createAsec, createBignumber, createCombinationsWithRep, createCosh, createCsch, createIsNaN, createIsPrime, createMapSlices, createMatrix, createMatrixFromFunction, createOnes, createRandomInt, createReshape, createSech, createSinh, createSparse, createSqrt, createSqueeze, createTanh, createTranspose, createXgcd, createZeros, createAcoth, createAsin, createBin, createConcat, createCoth, createCtranspose, createDiag, createDotMultiply, createEqual, createFraction, createIdentity, createIsNumeric, createKron, createLargerEq, createLeftShift, createMode, createNthRoot, createNumeric, createProd, createResize, createRightArithShift, createRound, createSize, createSmaller, createTo, createUnaryMinus, createUnequal, createXor, createAdd, createAtan2, createBitAnd, createBitOr, createBitXor, createCbrt, createCompare, createCompareText, createCount, createDeepEqual, createDivideScalar, createDotDivide, createEqualText, createFloor, createGcd, createHasNumericValue, createHypot, createImmutableDenseMatrixClass, createIndexClass, createLarger, createLog, createLsolve, createMatrixFromColumns, createMax, createMin, createMod, createNthRoots, createOr, createPartitionSelect, createQr, createRightLogShift, createSmallerEq, createSubset, createSubtract, createTrace, createUsolve, createCatalan, createCompareNatural, createComposition, createDiff, createDistance, createDot, createFibonacciHeapClass, createIndex, createInvmod, createLcm, createLog1p, createLsolveAll, createMatrixFromRows, createMultiply, createRange, createRow, createSetCartesian, createSetDistinct, createSetIsSubset, createSetPowerset, createSlu, createSort, createUnaryPlus, createUsolveAll, createZpk2tf, createAnd, createCeil, createColumn, createCross, createDet, createFix, createInv, createPinv, createPow, createSetDifference, createSetMultiplicity, createSetSymDifference, createSpaClass, createSqrtm, createSum, createUnitClass, createVacuumImpedance, createWienDisplacement, createAtomicMass, createBohrMagneton, createBoltzmann, createConductanceQuantum, createCoulomb, createCreateUnit, createDeuteronMass, createDotPow, createElectricConstant, createElementaryCharge, createExpm, createFaraday, createFft, createGamma, createGravitationConstant, createHartreeEnergy, createIfft, createInverseConductanceQuantum, createKlitzing, createLoschmidt, createMagneticConstant, createMolarMass, createMolarPlanckConstant, createNeutronMass, createNuclearMagneton, createPlanckCharge, createPlanckLength, createPlanckTemperature, createProtonMass, createQuantumOfCirculation, createReducedPlanckConstant, createRydberg, createSecondRadiation, createSetSize, createSpeedOfLight, createStefanBoltzmann, createThomsonCrossSection, createAvogadro, createBohrRadius, createCoulombConstant, createDivide, createElectronMass, createFactorial, createFirstRadiation, createGravity, createIntersect, createLup, createMagneticFluxQuantum, createMolarMassC12, createMultinomial, createPermutations, createPlanckMass, createPolynomialRoot, createSetIntersect, createSolveODE, createStirlingS2, createUnitFunction, createBellNumbers, createCumSum, createEigs, createFermiCoupling, createGasConstant, createKldivergence, createLusolve, createMean, createMolarVolume, createPlanckConstant, createQuantileSeq, createSetUnion, createVariance, createClassicalElectronRadius, createMedian, createCorr, createFreqz, createMad, createStd, createZeta, createNorm, createRotationMatrix, createPlanckTime, createSchur, createRotate, createSylvester, createLyap } from '../factoriesAny.js';
9
9
  export var BigNumber = /* #__PURE__ */createBigNumberClass({
10
10
  config
11
11
  });
@@ -300,6 +300,9 @@ export var subtractScalar = /* #__PURE__ */createSubtractScalar({
300
300
  export var tan = /* #__PURE__ */createTan({
301
301
  typed
302
302
  });
303
+ export var toBest = /* #__PURE__ */createToBest({
304
+ typed
305
+ });
303
306
  export var typeOf = /* #__PURE__ */createTypeOf({
304
307
  typed
305
308
  });
@@ -1177,7 +1180,8 @@ export var Unit = /* #__PURE__ */createUnitClass({
1177
1180
  number,
1178
1181
  pow,
1179
1182
  round,
1180
- subtractScalar
1183
+ subtractScalar,
1184
+ toBest
1181
1185
  });
1182
1186
  export var vacuumImpedance = /* #__PURE__ */createVacuumImpedance({
1183
1187
  BigNumber,
@@ -1,4 +1,5 @@
1
1
  import { factory } from '../utils/factory.js';
2
+ import { isFunction } from '../utils/is.js';
2
3
  import { createEmptyMap, toObject } from '../utils/map.js';
3
4
  var name = 'Parser';
4
5
  var dependencies = ['evaluate', 'parse'];
@@ -154,7 +155,40 @@ export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref =
154
155
  Parser.prototype.clear = function () {
155
156
  this.scope.clear();
156
157
  };
158
+ Parser.prototype.toJSON = function () {
159
+ var json = {
160
+ mathjs: 'Parser',
161
+ variables: {},
162
+ functions: {}
163
+ };
164
+ for (var [_name2, value] of this.scope) {
165
+ if (isFunction(value)) {
166
+ if (!isExpressionFunction(value)) {
167
+ throw new Error("Cannot serialize external function ".concat(_name2));
168
+ }
169
+ json.functions[_name2] = "".concat(value.syntax, " = ").concat(value.expr);
170
+ } else {
171
+ json.variables[_name2] = value;
172
+ }
173
+ }
174
+ return json;
175
+ };
176
+ Parser.fromJSON = function (json) {
177
+ var parser = new Parser();
178
+ Object.entries(json.variables).forEach(_ref2 => {
179
+ var [name, value] = _ref2;
180
+ return parser.set(name, value);
181
+ });
182
+ Object.entries(json.functions).forEach(_ref3 => {
183
+ var [_name, fn] = _ref3;
184
+ return parser.evaluate(fn);
185
+ });
186
+ return parser;
187
+ };
157
188
  return Parser;
158
189
  }, {
159
190
  isClass: true
160
- });
191
+ });
192
+ function isExpressionFunction(value) {
193
+ return typeof value === 'function' && typeof value.syntax === 'string' && typeof value.expr === 'string';
194
+ }
@@ -229,6 +229,7 @@ import { sinhDocs } from './function/trigonometry/sinh.js';
229
229
  import { tanDocs } from './function/trigonometry/tan.js';
230
230
  import { tanhDocs } from './function/trigonometry/tanh.js';
231
231
  import { toDocs } from './function/units/to.js';
232
+ import { toBestDocs } from './function/units/toBest.js';
232
233
  import { binDocs } from './function/utils/bin.js';
233
234
  import { cloneDocs } from './function/utils/clone.js';
234
235
  import { formatDocs } from './function/utils/format.js';
@@ -712,6 +713,7 @@ export var embeddedDocs = {
712
713
  tanh: tanhDocs,
713
714
  // functions - units
714
715
  to: toDocs,
716
+ toBest: toBestDocs,
715
717
  // functions - utils
716
718
  clone: cloneDocs,
717
719
  format: formatDocs,
@@ -0,0 +1,8 @@
1
+ export var toBestDocs = {
2
+ name: 'toBest',
3
+ category: 'Units',
4
+ syntax: ['toBest(x)', 'toBest(x, unitList)', 'toBest(x, unitList, options)'],
5
+ description: 'Converts to the most appropriate display unit.',
6
+ examples: ['toBest(unit(5000, "m"))', 'toBest(unit(3500000, "W"))', 'toBest(unit(0.000000123, "A"))', 'toBest(unit(10, "m"), "cm")', 'toBest(unit(10, "m"), "mm,km", {offset: 1.5})'],
7
+ seealso: []
8
+ };
@@ -98,7 +98,8 @@ export var createFunctionAssignmentNode = /* #__PURE__ */factory(name, dependenc
98
98
  });
99
99
 
100
100
  // compile the function expression with the child args
101
- var evalExpr = this.expr._compile(math, childArgNames);
101
+ var expr = this.expr;
102
+ var evalExpr = expr._compile(math, childArgNames);
102
103
  var name = this.name;
103
104
  var params = this.params;
104
105
  var signature = join(this.types, ',');
@@ -114,6 +115,7 @@ export var createFunctionAssignmentNode = /* #__PURE__ */factory(name, dependenc
114
115
  };
115
116
  var fn = typed(name, signatures);
116
117
  fn.syntax = syntax;
118
+ fn.expr = expr.toString();
117
119
  scope.set(name, fn);
118
120
  return fn;
119
121
  };
@@ -47,7 +47,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
47
47
  * node1.compile().evaluate() // 5
48
48
  *
49
49
  * let scope = {a:3, b:4}
50
- * const node2 = math.parse('a * b') // 12
50
+ * const node2 = math.parse('a * b')
51
51
  * node2.evaluate(scope) // 12
52
52
  * const code2 = node2.compile()
53
53
  * code2.evaluate(scope) // 12
@@ -107,6 +107,7 @@ export { createOct } from './function/string/oct.js';
107
107
  export { createHex } from './function/string/hex.js';
108
108
  export { createPrint } from './function/string/print.js';
109
109
  export { createTo } from './function/unit/to.js';
110
+ export { createToBest } from './function/unit/toBest.js';
110
111
  export { createIsPrime } from './function/utils/isPrime.js';
111
112
  export { createNumeric } from './function/utils/numeric.js';
112
113
  export { createDivideScalar } from './function/arithmetic/divideScalar.js';
@@ -52,7 +52,7 @@ export var createSign = /* #__PURE__ */factory(name, dependencies, _ref => {
52
52
  return x > 0n ? 1n : x < 0n ? -1n : 0n;
53
53
  },
54
54
  Fraction: function Fraction(x) {
55
- return new _Fraction(x.s);
55
+ return x.n === 0n ? new _Fraction(0) : new _Fraction(x.s);
56
56
  },
57
57
  // deep map collection, skip zeros since sign(0) = 0
58
58
  'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),
@@ -16,7 +16,7 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
16
16
  isPositive
17
17
  } = _ref;
18
18
  /**
19
- * Create an array from a range.
19
+ * Create a matrix or array containing a range of values.
20
20
  * By default, the range end is excluded. This can be customized by providing
21
21
  * an extra parameter `includeEnd`.
22
22
  *
@@ -44,10 +44,12 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
44
44
  * - `includeEnd: boolean`
45
45
  * Option to specify whether to include the end or not. False by default.
46
46
  *
47
- * Note that the return type of the range is taken from the type of
48
- * the start/end. If only one these is a built-in `number` type, it will
49
- * be promoted to the type of the other endpoint. However, in the case of
50
- * Unit values, both endpoints must have compatible units, and the return
47
+ * The function returns a `DenseMatrix` when the library is configured with
48
+ * `config = { matrix: 'Matrix' }, and returns an Array otherwise.
49
+ * Note that the type of the returned values is taken from the type of the
50
+ * provided start/end value. If only one of these is a built-in `number` type,
51
+ * it will be promoted to the type of the other endpoint. However, in the case
52
+ * of Unit values, both endpoints must have compatible units, and the return
51
53
  * value will have compatible units as well.
52
54
  *
53
55
  * Examples:
@@ -0,0 +1,47 @@
1
+ import { factory } from '../../utils/factory.js';
2
+ var name = 'toBest';
3
+ var dependencies = ['typed'];
4
+ export var createToBest = /* #__PURE__ */factory(name, dependencies, _ref => {
5
+ var {
6
+ typed
7
+ } = _ref;
8
+ /**
9
+ * Converts a unit to the most appropriate display unit.
10
+ * When no preferred units are provided, the function automatically find the best prefix.
11
+ * When preferred units are provided, it converts to
12
+ * the unit that gives a value closest to 1.
13
+ *
14
+ * Syntax:
15
+ *
16
+ * math.toBest(unit)
17
+ * math.toBest(unit, unitList)
18
+ * math.toBest(unit, unitList, options)
19
+ *
20
+ * Where:
21
+ * - `unitList` is an optional array of preferred target units as string or Unit.
22
+ * - `options` is an optional object with options, formed as follows:
23
+ * - `offset`: number | BigNumber
24
+ *
25
+ * Examples:
26
+ *
27
+ * math.unit(0.05, 'm').toBest(['cm', 'mm']) // returns Unit 5 cm
28
+ * math.unit(2 / 3, 'cm').toBest() // returns Unit 0.6666666666666666 cm
29
+ * math.unit(10, 'm').toBest(['mm', 'km'], { offset: 1.5 }) // returns Unit 10000 mm
30
+ *
31
+ * See also:
32
+ *
33
+ * unit, to, format
34
+ *
35
+ * @param {Unit} x The unit to be converted
36
+ * @param {Array<string>} [unitList=[]] Optional array of preferred target units
37
+ * @param {Object} [options] Optional options object
38
+ * @return {Unit} Value converted to the best matching unit
39
+ */
40
+ return typed(name, {
41
+ Unit: x => x.toBest(),
42
+ 'Unit, string': (x, unitList) => x.toBest(unitList.split(',')),
43
+ 'Unit, string, Object': (x, unitList, options) => x.toBest(unitList.split(','), options),
44
+ 'Unit, Array': (x, unitList) => x.toBest(unitList),
45
+ 'Unit, Array, Object': (x, unitList, options) => x.toBest(unitList, options)
46
+ });
47
+ });
@@ -672,24 +672,28 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
672
672
  }
673
673
  return;
674
674
  }
675
- var index = [];
676
- var _recurse = function* recurse(value, depth) {
677
- if (depth < maxDepth) {
678
- for (var _i9 = 0; _i9 < value.length; _i9++) {
679
- index[depth] = _i9;
680
- yield* _recurse(value[_i9], depth + 1);
681
- }
682
- } else {
683
- for (var _i0 = 0; _i0 < value.length; _i0++) {
684
- index[depth] = _i0;
685
- yield {
686
- value: value[_i0],
687
- index: index.slice()
688
- };
689
- }
675
+
676
+ // Multi-dimensional matrix: iterate over all elements
677
+ var index = Array(maxDepth + 1).fill(0);
678
+ var totalElements = this._size.reduce((a, b) => a * b, 1);
679
+ for (var count = 0; count < totalElements; count++) {
680
+ // Traverse to the current element using indices
681
+ var current = this._data;
682
+ for (var d = 0; d < maxDepth; d++) {
683
+ current = current[index[d]];
690
684
  }
691
- };
692
- yield* _recurse(this._data, 0);
685
+ yield {
686
+ value: current[index[maxDepth]],
687
+ index: index.slice()
688
+ };
689
+
690
+ // Increment indices for next element
691
+ for (var _d = maxDepth; _d >= 0; _d--) {
692
+ index[_d]++;
693
+ if (index[_d] < this._size[_d]) break;
694
+ index[_d] = 0;
695
+ }
696
+ }
693
697
  };
694
698
 
695
699
  /**
@@ -17,13 +17,13 @@ export var createString = /* #__PURE__ */factory(name, dependencies, _ref => {
17
17
  *
18
18
  * Examples:
19
19
  *
20
- * math.string(4.2) // returns string '4.2'
21
- * math.string(math.complex(3, 2) // returns string '3 + 2i'
20
+ * math.string(4.2) // returns string '4.2'
21
+ * math.string(math.complex(3, 2)) // returns string '3 + 2i'
22
22
  *
23
23
  * const u = math.unit(5, 'km')
24
- * math.string(u.to('m')) // returns string '5000 m'
24
+ * math.string(u.to('m')) // returns string '5000 m'
25
25
  *
26
- * math.string([true, false]) // returns ['true', 'false']
26
+ * math.string([true, false]) // returns ['true', 'false']
27
27
  *
28
28
  * See also:
29
29
  *
@@ -9,7 +9,7 @@ import { endsWith } from '../../utils/string.js';
9
9
  import { clone, hasOwnProperty } from '../../utils/object.js';
10
10
  import { createBigNumberPi as createPi } from '../../utils/bignumber/constants.js';
11
11
  var name = 'Unit';
12
- var dependencies = ['?on', 'config', 'addScalar', 'subtractScalar', 'multiplyScalar', 'divideScalar', 'pow', 'abs', 'fix', 'round', 'equal', 'isNumeric', 'format', 'number', 'Complex', 'BigNumber', 'Fraction'];
12
+ var dependencies = ['?on', 'config', 'addScalar', 'subtractScalar', 'multiplyScalar', 'divideScalar', 'pow', 'abs', 'fix', 'round', 'equal', 'isNumeric', 'format', 'toBest', 'number', 'Complex', 'BigNumber', 'Fraction'];
13
13
  export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref => {
14
14
  var {
15
15
  on,
@@ -25,6 +25,7 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
25
25
  equal,
26
26
  isNumeric,
27
27
  format,
28
+ toBest,
28
29
  number: _number,
29
30
  Complex,
30
31
  BigNumber: _BigNumber,
@@ -1041,6 +1042,54 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
1041
1042
  return str;
1042
1043
  };
1043
1044
 
1045
+ /**
1046
+ * Get a unit, with optional formatting options.
1047
+ * @memberof Unit
1048
+ * @param {string[] | Unit[]} [units] Array of units strings or valueLess Unit objects in wich choose the best one
1049
+ * @param {Object} [options] Options for parsing the unit. See parseUnit for details.
1050
+ *
1051
+ * @return {Unit} Returns a new Unit with the given value and unit.
1052
+ */
1053
+ Unit.prototype.toBest = function () {
1054
+ var unitList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1055
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1056
+ if (unitList && !Array.isArray(unitList)) {
1057
+ throw new Error('Invalid unit type. Expected string or Unit.');
1058
+ }
1059
+ var startPrefixes = this.units[0].unit.prefixes;
1060
+ if (unitList && unitList.length > 0) {
1061
+ var unitObjects = unitList.map(u => {
1062
+ var unit = null;
1063
+ if (typeof u === 'string') {
1064
+ unit = Unit.parse(u);
1065
+ if (!unit) {
1066
+ throw new Error('Invalid unit type. Expected compatible string or Unit.');
1067
+ }
1068
+ } else if (!isUnit(u)) {
1069
+ throw new Error('Invalid unit type. Expected compatible string or Unit.');
1070
+ }
1071
+ if (unit === null) {
1072
+ unit = u.clone();
1073
+ }
1074
+ try {
1075
+ this.to(unit.formatUnits());
1076
+ return unit;
1077
+ } catch (e) {
1078
+ throw new Error('Invalid unit type. Expected compatible string or Unit.');
1079
+ }
1080
+ });
1081
+ var prefixes = unitObjects.map(el => el.units[0].prefix);
1082
+ this.units[0].unit.prefixes = prefixes.reduce((acc, prefix) => {
1083
+ acc[prefix.name] = prefix;
1084
+ return acc;
1085
+ }, {});
1086
+ this.units[0].prefix = prefixes[0];
1087
+ }
1088
+ var result = formatBest(this, options).simp;
1089
+ this.units[0].unit.prefixes = startPrefixes;
1090
+ result.fixPrefix = true;
1091
+ return result;
1092
+ };
1044
1093
  /**
1045
1094
  * Get a string representation of the Unit, with optional formatting options.
1046
1095
  * @memberof Unit
@@ -1051,11 +1100,54 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
1051
1100
  * @return {string}
1052
1101
  */
1053
1102
  Unit.prototype.format = function (options) {
1103
+ var {
1104
+ simp,
1105
+ valueStr,
1106
+ unitStr
1107
+ } = formatBest(this, options);
1108
+ var str = valueStr;
1109
+ if (simp.value && isComplex(simp.value)) {
1110
+ str = '(' + str + ')'; // Surround complex values with ( ) to enable better parsing
1111
+ }
1112
+ if (unitStr.length > 0 && str.length > 0) {
1113
+ str += ' ';
1114
+ }
1115
+ str += unitStr;
1116
+ return str;
1117
+ };
1118
+
1119
+ /**
1120
+ * Helper function to normalize a unit for conversion and formatting
1121
+ * @param {Unit} unit The unit to be normalized
1122
+ * @return {Object} Object with normalized unit and value
1123
+ * @private
1124
+ */
1125
+ function formatBest(unit) {
1126
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1054
1127
  // Simplfy the unit list, unless it is valueless or was created directly in the
1055
1128
  // constructor or as the result of to or toSI
1056
- var simp = this.skipAutomaticSimplification || this.value === null ? this.clone() : this.simplify();
1129
+ var simp = unit.skipAutomaticSimplification || unit.value === null ? unit.clone() : unit.simplify();
1057
1130
 
1058
1131
  // Apply some custom logic for handling VA and VAR. The goal is to express the value of the unit as a real value, if possible. Otherwise, use a real-valued unit instead of a complex-valued one.
1132
+ handleVAandVARUnits(simp);
1133
+ // Now apply the best prefix
1134
+ // Units must have only one unit and not have the fixPrefix flag set
1135
+ applyBestPrefixIfNeeded(simp, options.offset);
1136
+ var value = simp._denormalize(simp.value);
1137
+ var valueStr = simp.value !== null ? format(value, options || {}) : '';
1138
+ var unitStr = simp.formatUnits();
1139
+ return {
1140
+ simp,
1141
+ valueStr,
1142
+ unitStr
1143
+ };
1144
+ }
1145
+
1146
+ /**
1147
+ * Helper to handle VA and VAR units
1148
+ * @param {Unit} simp The unit to be normalized
1149
+ */
1150
+ function handleVAandVARUnits(simp) {
1059
1151
  var isImaginary = false;
1060
1152
  if (typeof simp.value !== 'undefined' && simp.value !== null && isComplex(simp.value)) {
1061
1153
  // TODO: Make this better, for example, use relative magnitude of re and im rather than absolute
@@ -1072,37 +1164,32 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
1072
1164
  }
1073
1165
  }
1074
1166
  }
1167
+ }
1075
1168
 
1076
- // Now apply the best prefix
1077
- // Units must have only one unit and not have the fixPrefix flag set
1169
+ /**
1170
+ * Helper to apply the best prefix if needed
1171
+ * @param {Unit} simp The unit to be normalized
1172
+ */
1173
+ function applyBestPrefixIfNeeded(simp, offset) {
1078
1174
  if (simp.units.length === 1 && !simp.fixPrefix) {
1079
1175
  // Units must have integer powers, otherwise the prefix will change the
1080
1176
  // outputted value by not-an-integer-power-of-ten
1081
1177
  if (Math.abs(simp.units[0].power - Math.round(simp.units[0].power)) < 1e-14) {
1082
1178
  // Apply the best prefix
1083
- simp.units[0].prefix = simp._bestPrefix();
1179
+ simp.units[0].prefix = simp._bestPrefix(offset);
1084
1180
  }
1085
1181
  }
1086
- var value = simp._denormalize(simp.value);
1087
- var str = simp.value !== null ? format(value, options || {}) : '';
1088
- var unitStr = simp.formatUnits();
1089
- if (simp.value && isComplex(simp.value)) {
1090
- str = '(' + str + ')'; // Surround complex values with ( ) to enable better parsing
1091
- }
1092
- if (unitStr.length > 0 && str.length > 0) {
1093
- str += ' ';
1094
- }
1095
- str += unitStr;
1096
- return str;
1097
- };
1182
+ }
1098
1183
 
1099
1184
  /**
1100
1185
  * Calculate the best prefix using current value.
1101
1186
  * @memberof Unit
1102
1187
  * @returns {Object} prefix
1188
+ * @param {number} [offset] Optional offset for the best prefix calculation (default 1.2)
1103
1189
  * @private
1104
1190
  */
1105
1191
  Unit.prototype._bestPrefix = function () {
1192
+ var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.2;
1106
1193
  if (this.units.length !== 1) {
1107
1194
  throw new Error('Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!');
1108
1195
  }
@@ -1125,7 +1212,7 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
1125
1212
  return bestPrefix;
1126
1213
  }
1127
1214
  var power = this.units[0].power;
1128
- var bestDiff = Math.log(absValue / Math.pow(bestPrefix.value * absUnitValue, power)) / Math.LN10 - 1.2;
1215
+ var bestDiff = Math.log(absValue / Math.pow(bestPrefix.value * absUnitValue, power)) / Math.LN10 - offset;
1129
1216
  if (bestDiff > -2.200001 && bestDiff < 1.800001) return bestPrefix; // Allow the original prefix
1130
1217
  bestDiff = Math.abs(bestDiff);
1131
1218
  var prefixes = this.units[0].unit.prefixes;
@@ -1133,7 +1220,7 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
1133
1220
  if (hasOwnProperty(prefixes, p)) {
1134
1221
  var prefix = prefixes[p];
1135
1222
  if (prefix.scientific) {
1136
- var diff = Math.abs(Math.log(absValue / Math.pow(prefix.value * absUnitValue, power)) / Math.LN10 - 1.2);
1223
+ var diff = Math.abs(Math.log(absValue / Math.pow(prefix.value * absUnitValue, power)) / Math.LN10 - offset);
1137
1224
  if (diff < bestDiff || diff === bestDiff && prefix.name.length < bestPrefix.name.length) {
1138
1225
  // choose the prefix with the smallest diff, or if equal, choose the one
1139
1226
  // with the shortest name (can happen with SHORTLONG for example)
@@ -1,3 +1,3 @@
1
- export var version = '14.5.3';
1
+ export var version = '14.7.0';
2
2
  // Note: This file is automatically generated when building math.js.
3
3
  // Changes made in this file will be overwritten.