nerdamer 1.1.13 → 2.0.0-rc.1
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/LICENSE.md +184 -0
- package/README.md +293 -312
- package/dist/bundle.js +2 -0
- package/dist/bundle.js.LICENSE.txt +7 -0
- package/dist/parser.js +2 -0
- package/dist/parser.js.LICENSE.txt +7 -0
- package/docs-data/parser-functions.json +1960 -0
- package/index.d.ts +10 -426
- package/output/algebra/adapters.d.ts +33 -0
- package/output/algebra/adapters.js +109 -0
- package/output/algebra/algorithms/arith.d.ts +84 -0
- package/output/algebra/algorithms/arith.js +323 -0
- package/output/algebra/algorithms/factor.d.ts +3 -0
- package/output/algebra/algorithms/factor.js +5 -0
- package/output/algebra/algorithms/factorMultivariate.d.ts +23 -0
- package/output/algebra/algorithms/factorMultivariate.js +2393 -0
- package/output/algebra/algorithms/factorUnivariate.d.ts +72 -0
- package/output/algebra/algorithms/factorUnivariate.js +1072 -0
- package/output/algebra/algorithms/gcd.d.ts +22 -0
- package/output/algebra/algorithms/gcd.js +690 -0
- package/output/algebra/algorithms/groebnerBase.d.ts +157 -0
- package/output/algebra/algorithms/groebnerBase.js +1166 -0
- package/output/algebra/algorithms/multiPoly/MultiPoly.d.ts +137 -0
- package/output/algebra/algorithms/multiPoly/MultiPoly.js +346 -0
- package/output/algebra/algorithms/poly.d.ts +228 -0
- package/output/algebra/algorithms/poly.js +1299 -0
- package/output/algebra/algorithms/rational.d.ts +17 -0
- package/output/algebra/algorithms/rational.js +115 -0
- package/output/algebra/factor/factor.d.ts +62 -0
- package/output/algebra/factor/factor.js +158 -0
- package/output/algebra/gcd/gcd.d.ts +29 -0
- package/output/algebra/gcd/gcd.js +141 -0
- package/output/algebra/groebner.d.ts +21 -0
- package/output/algebra/groebner.js +42 -0
- package/output/algebra/partfrac.d.ts +19 -0
- package/output/algebra/partfrac.js +398 -0
- package/output/algebra/polynomialize.d.ts +20 -0
- package/output/algebra/polynomialize.js +24 -0
- package/output/algebra/simplify/complexsimp.d.ts +7 -0
- package/output/algebra/simplify/complexsimp.js +24 -0
- package/output/algebra/simplify/factorCommon.d.ts +13 -0
- package/output/algebra/simplify/factorCommon.js +136 -0
- package/output/algebra/simplify/funcsimp.d.ts +26 -0
- package/output/algebra/simplify/funcsimp.js +633 -0
- package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
- package/output/algebra/simplify/invtrigrewrite.js +96 -0
- package/output/algebra/simplify/ratsimp.d.ts +21 -0
- package/output/algebra/simplify/ratsimp.js +140 -0
- package/output/algebra/simplify/simplify.d.ts +25 -0
- package/output/algebra/simplify/simplify.js +228 -0
- package/output/algebra/simplify/trigreduce.d.ts +38 -0
- package/output/algebra/simplify/trigreduce.js +424 -0
- package/output/algebra/simplify/trigrewrite.d.ts +17 -0
- package/output/algebra/simplify/trigrewrite.js +156 -0
- package/output/algebra/simplify/trigsimp.d.ts +11 -0
- package/output/algebra/simplify/trigsimp.js +369 -0
- package/output/algebra/simplify/utils.d.ts +32 -0
- package/output/algebra/simplify/utils.js +56 -0
- package/output/algebra/utils.d.ts +32 -0
- package/output/algebra/utils.js +48 -0
- package/output/api/advanced.d.ts +7 -0
- package/output/api/advanced.js +18 -0
- package/output/api/algebra.d.ts +17 -0
- package/output/api/algebra.js +32 -0
- package/output/api/assumptions.d.ts +4 -0
- package/output/api/assumptions.js +11 -0
- package/output/api/calculus.d.ts +9 -0
- package/output/api/calculus.js +21 -0
- package/output/api/core.d.ts +17 -0
- package/output/api/core.js +41 -0
- package/output/api/debug.d.ts +16 -0
- package/output/api/debug.js +23 -0
- package/output/api/parser.d.ts +85 -0
- package/output/api/parser.js +16 -0
- package/output/api/solve.d.ts +10 -0
- package/output/api/solve.js +16 -0
- package/output/api/structures.d.ts +10 -0
- package/output/api/structures.js +22 -0
- package/output/calculus/derivative/diff.d.ts +30 -0
- package/output/calculus/derivative/diff.js +238 -0
- package/output/calculus/fresnel.d.ts +16 -0
- package/output/calculus/fresnel.js +39 -0
- package/output/calculus/integrate/byParts.d.ts +18 -0
- package/output/calculus/integrate/byParts.js +339 -0
- package/output/calculus/integrate/bySubstitution.d.ts +135 -0
- package/output/calculus/integrate/bySubstitution.js +411 -0
- package/output/calculus/integrate/integrate.d.ts +38 -0
- package/output/calculus/integrate/integrate.js +652 -0
- package/output/calculus/integrate/integrationTable.d.ts +2 -0
- package/output/calculus/integrate/integrationTable.js +914 -0
- package/output/calculus/integrate/utils.d.ts +28 -0
- package/output/calculus/integrate/utils.js +96 -0
- package/output/calculus/laplace/ilaplace.d.ts +31 -0
- package/output/calculus/laplace/ilaplace.js +192 -0
- package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
- package/output/calculus/laplace/ilaplaceTable.js +200 -0
- package/output/calculus/laplace/laplace.d.ts +22 -0
- package/output/calculus/laplace/laplace.js +109 -0
- package/output/calculus/laplace/laplaceTable.d.ts +2 -0
- package/output/calculus/laplace/laplaceTable.js +187 -0
- package/output/calculus/limit/limit.d.ts +35 -0
- package/output/calculus/limit/limit.js +1183 -0
- package/output/calculus/limit/limitsTable.d.ts +2 -0
- package/output/calculus/limit/limitsTable.js +7 -0
- package/output/core/Settings.d.ts +32 -0
- package/output/core/Settings.js +68 -0
- package/output/core/adapters.d.ts +18 -0
- package/output/core/adapters.js +40 -0
- package/output/core/classes/assumption/Assumption.d.ts +218 -0
- package/output/core/classes/assumption/Assumption.js +605 -0
- package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
- package/output/core/classes/assumption/assertiveFunctions.js +64 -0
- package/output/core/classes/assumption/assume.d.ts +90 -0
- package/output/core/classes/assumption/assume.js +145 -0
- package/output/core/classes/collection/Collection.d.ts +107 -0
- package/output/core/classes/collection/Collection.js +231 -0
- package/output/core/classes/complex/Complex.d.ts +99 -0
- package/output/core/classes/complex/Complex.js +135 -0
- package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
- package/output/core/classes/decimalSet/DecimalSet.js +453 -0
- package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
- package/output/core/classes/dictionary/Dictionary.js +213 -0
- package/output/core/classes/equation/Equation.d.ts +256 -0
- package/output/core/classes/equation/Equation.js +350 -0
- package/output/core/classes/expression/CoeffObject.d.ts +100 -0
- package/output/core/classes/expression/CoeffObject.js +198 -0
- package/output/core/classes/expression/Expression.d.ts +1674 -0
- package/output/core/classes/expression/Expression.js +2332 -0
- package/output/core/classes/expression/analysis.d.ts +25 -0
- package/output/core/classes/expression/analysis.js +218 -0
- package/output/core/classes/expression/collect.d.ts +9 -0
- package/output/core/classes/expression/collect.js +49 -0
- package/output/core/classes/expression/format.d.ts +45 -0
- package/output/core/classes/expression/format.js +217 -0
- package/output/core/classes/expression/products.d.ts +23 -0
- package/output/core/classes/expression/products.js +115 -0
- package/output/core/classes/expression/shortcuts.d.ts +35 -0
- package/output/core/classes/expression/shortcuts.js +129 -0
- package/output/core/classes/expression/traversal.d.ts +31 -0
- package/output/core/classes/expression/traversal.js +216 -0
- package/output/core/classes/expression/trig.d.ts +25 -0
- package/output/core/classes/expression/trig.js +40 -0
- package/output/core/classes/expression/utils.d.ts +52 -0
- package/output/core/classes/expression/utils.js +189 -0
- package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
- package/output/core/classes/lookupTable/LookupTable.js +55 -0
- package/output/core/classes/matrix/Matrix.d.ts +227 -0
- package/output/core/classes/matrix/Matrix.js +889 -0
- package/output/core/classes/matrix/Sylvester.d.ts +11 -0
- package/output/core/classes/matrix/Sylvester.js +54 -0
- package/output/core/classes/matrix/functions.d.ts +26 -0
- package/output/core/classes/matrix/functions.js +52 -0
- package/output/core/classes/matrix/utils.d.ts +9 -0
- package/output/core/classes/matrix/utils.js +22 -0
- package/output/core/classes/parser/Parser.d.ts +480 -0
- package/output/core/classes/parser/Parser.js +1812 -0
- package/output/core/classes/parser/Token.d.ts +58 -0
- package/output/core/classes/parser/Token.js +137 -0
- package/output/core/classes/parser/constants.d.ts +160 -0
- package/output/core/classes/parser/constants.js +227 -0
- package/output/core/classes/parser/helpers.d.ts +21 -0
- package/output/core/classes/parser/helpers.js +42 -0
- package/output/core/classes/parser/operations/add.d.ts +15 -0
- package/output/core/classes/parser/operations/add.js +238 -0
- package/output/core/classes/parser/operations/comma.d.ts +7 -0
- package/output/core/classes/parser/operations/comma.js +11 -0
- package/output/core/classes/parser/operations/compare.d.ts +21 -0
- package/output/core/classes/parser/operations/compare.js +461 -0
- package/output/core/classes/parser/operations/divide.d.ts +2 -0
- package/output/core/classes/parser/operations/divide.js +72 -0
- package/output/core/classes/parser/operations/functions.d.ts +46 -0
- package/output/core/classes/parser/operations/functions.js +430 -0
- package/output/core/classes/parser/operations/multiply.d.ts +11 -0
- package/output/core/classes/parser/operations/multiply.js +321 -0
- package/output/core/classes/parser/operations/power.d.ts +48 -0
- package/output/core/classes/parser/operations/power.js +673 -0
- package/output/core/classes/parser/operations/subtract.d.ts +3 -0
- package/output/core/classes/parser/operations/subtract.js +35 -0
- package/output/core/classes/parser/preprocess.d.ts +14 -0
- package/output/core/classes/parser/preprocess.js +259 -0
- package/output/core/classes/parser/scripting/controlFlow.d.ts +121 -0
- package/output/core/classes/parser/scripting/controlFlow.js +355 -0
- package/output/core/classes/parser/scripting/evaluate.d.ts +10 -0
- package/output/core/classes/parser/scripting/evaluate.js +112 -0
- package/output/core/classes/parser/scripting/functions.d.ts +14 -0
- package/output/core/classes/parser/scripting/functions.js +59 -0
- package/output/core/classes/parser/scripting/scope.d.ts +35 -0
- package/output/core/classes/parser/scripting/scope.js +155 -0
- package/output/core/classes/parser/types.d.ts +125 -0
- package/output/core/classes/parser/types.js +2 -0
- package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
- package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
- package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
- package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
- package/output/core/classes/polynomial/Polynomial.d.ts +500 -0
- package/output/core/classes/polynomial/Polynomial.js +1149 -0
- package/output/core/classes/polynomial/Term.d.ts +222 -0
- package/output/core/classes/polynomial/Term.js +430 -0
- package/output/core/classes/polynomial/functions.d.ts +69 -0
- package/output/core/classes/polynomial/functions.js +126 -0
- package/output/core/classes/polynomial/utils.d.ts +62 -0
- package/output/core/classes/polynomial/utils.js +206 -0
- package/output/core/classes/rational/Rational.d.ts +504 -0
- package/output/core/classes/rational/Rational.js +779 -0
- package/output/core/classes/seq/SEQ.d.ts +13 -0
- package/output/core/classes/seq/SEQ.js +137 -0
- package/output/core/classes/valuesSet/ValuesSet.d.ts +179 -0
- package/output/core/classes/valuesSet/ValuesSet.js +381 -0
- package/output/core/classes/vector/Vector.d.ts +222 -0
- package/output/core/classes/vector/Vector.js +497 -0
- package/output/core/classes/vector/functions.d.ts +28 -0
- package/output/core/classes/vector/functions.js +47 -0
- package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
- package/output/core/common/classes/MathematicalAggregate.js +140 -0
- package/output/core/common/classes/Scope.d.ts +62 -0
- package/output/core/common/classes/Scope.js +122 -0
- package/output/core/common/classes/StructuredEntity.d.ts +55 -0
- package/output/core/common/classes/StructuredEntity.js +151 -0
- package/output/core/common/common.d.ts +63 -0
- package/output/core/common/common.js +279 -0
- package/output/core/common/functions/functions.d.ts +14 -0
- package/output/core/common/functions/functions.js +33 -0
- package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
- package/output/core/common/functions/structuredEntityUtils.js +40 -0
- package/output/core/converters/BaseConverter.d.ts +97 -0
- package/output/core/converters/BaseConverter.js +405 -0
- package/output/core/converters/Converter.d.ts +111 -0
- package/output/core/converters/Converter.js +802 -0
- package/output/core/converters/Pattern.d.ts +71 -0
- package/output/core/converters/Pattern.js +302 -0
- package/output/core/dispatch.d.ts +34 -0
- package/output/core/dispatch.js +304 -0
- package/output/core/errors.d.ts +531 -0
- package/output/core/errors.js +621 -0
- package/output/core/functions/bigint/bigint.d.ts +121 -0
- package/output/core/functions/bigint/bigint.js +392 -0
- package/output/core/functions/bigint/primeFactor.d.ts +49 -0
- package/output/core/functions/bigint/primeFactor.js +267 -0
- package/output/core/functions/bigint/primes.d.ts +1 -0
- package/output/core/functions/bigint/primes.js +11 -0
- package/output/core/functions/build/definitions.d.ts +12 -0
- package/output/core/functions/build/definitions.js +133 -0
- package/output/core/functions/build/index.d.ts +32 -0
- package/output/core/functions/build/index.js +136 -0
- package/output/core/functions/complex.d.ts +90 -0
- package/output/core/functions/complex.js +482 -0
- package/output/core/functions/decimal.d.ts +24 -0
- package/output/core/functions/decimal.js +664 -0
- package/output/core/functions/expand/expand.d.ts +42 -0
- package/output/core/functions/expand/expand.js +376 -0
- package/output/core/functions/fresnelNumeric.d.ts +12 -0
- package/output/core/functions/fresnelNumeric.js +123 -0
- package/output/core/functions/numeric.d.ts +140 -0
- package/output/core/functions/numeric.js +790 -0
- package/output/core/functions/rationalNormalization.d.ts +11 -0
- package/output/core/functions/rationalNormalization.js +117 -0
- package/output/core/functions/setFunction.d.ts +19 -0
- package/output/core/functions/setFunction.js +75 -0
- package/output/core/functions/string.d.ts +26 -0
- package/output/core/functions/string.js +101 -0
- package/output/core/functions/subst.d.ts +90 -0
- package/output/core/functions/subst.js +498 -0
- package/output/core/functions/utils.d.ts +24 -0
- package/output/core/functions/utils.js +51 -0
- package/output/core/types.d.ts +48 -0
- package/output/core/types.js +2 -0
- package/output/index.d.ts +339 -0
- package/output/index.js +715 -0
- package/output/math/defint/defintDecimal.d.ts +37 -0
- package/output/math/defint/defintDecimal.js +320 -0
- package/output/math/defint/defintNative.d.ts +57 -0
- package/output/math/defint/defintNative.js +292 -0
- package/output/math/geometry.d.ts +8 -0
- package/output/math/geometry.js +32 -0
- package/output/math/math.d.ts +655 -0
- package/output/math/math.js +1811 -0
- package/output/math/trig.d.ts +518 -0
- package/output/math/trig.js +1444 -0
- package/output/math/trunc.d.ts +19 -0
- package/output/math/trunc.js +36 -0
- package/output/math/utils.d.ts +60 -0
- package/output/math/utils.js +180 -0
- package/output/solve/classes/DecimalMatrix.d.ts +17 -0
- package/output/solve/classes/DecimalMatrix.js +86 -0
- package/output/solve/classes/FunctionSolver.d.ts +135 -0
- package/output/solve/classes/FunctionSolver.js +433 -0
- package/output/solve/classes/MultivariateSolver.d.ts +84 -0
- package/output/solve/classes/MultivariateSolver.js +240 -0
- package/output/solve/classes/PolynomialSolver.d.ts +85 -0
- package/output/solve/classes/PolynomialSolver.js +292 -0
- package/output/solve/classes/SolutionSet.d.ts +153 -0
- package/output/solve/classes/SolutionSet.js +357 -0
- package/output/solve/classes/Solver.d.ts +17 -0
- package/output/solve/classes/Solver.js +132 -0
- package/output/solve/classes/SymbolicSolver.d.ts +74 -0
- package/output/solve/classes/SymbolicSolver.js +601 -0
- package/output/solve/linsolve.d.ts +51 -0
- package/output/solve/linsolve.js +225 -0
- package/output/solve/solve.d.ts +34 -0
- package/output/solve/solve.js +260 -0
- package/output/solve/solveSystem.d.ts +31 -0
- package/output/solve/solveSystem.js +290 -0
- package/output/solve/utils.d.ts +9 -0
- package/output/solve/utils.js +62 -0
- package/output/utils/array.d.ts +42 -0
- package/output/utils/array.js +98 -0
- package/output/utils/debug.d.ts +131 -0
- package/output/utils/debug.js +295 -0
- package/output/utils/decimal.d.ts +3 -0
- package/output/utils/decimal.js +16 -0
- package/output/utils/numeric.d.ts +14 -0
- package/output/utils/numeric.js +51 -0
- package/output/utils/object.d.ts +26 -0
- package/output/utils/object.js +56 -0
- package/package.json +213 -57
- package/.travis.yml +0 -3
- package/Algebra.js +0 -4568
- package/BREAKING_CHANGES.md +0 -5
- package/CODE_OF_CONDUCT.md +0 -46
- package/CONTRIBUTING.md +0 -14
- package/Calculus.js +0 -2675
- package/Extra.js +0 -622
- package/Solve.js +0 -1783
- package/all.js +0 -16
- package/all.min.js +0 -1
- package/gulpfile.js +0 -16
- package/index.html +0 -158
- package/license.txt +0 -19
- package/nerdamer.core.js +0 -12510
- package/spec/LaTeX.spec.js +0 -302
- package/spec/TeXConvert.spec.js +0 -8
- package/spec/algebra.spec.js +0 -287
- package/spec/basic_parser.spec.js +0 -134
- package/spec/build.spec.js +0 -131
- package/spec/calculus.spec.js +0 -183
- package/spec/core.spec.js +0 -2970
- package/spec/extra.spec.js +0 -54
- package/spec/solve.spec.js +0 -126
- package/spec/support/jasmine.json +0 -11
- package/spec/support/utils.js +0 -42
- package/spec/text.spec.js +0 -132
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Expression } from '../classes/expression/Expression';
|
|
2
|
+
import { BaseConverter } from './BaseConverter';
|
|
3
|
+
import type { OptionsObject } from '../classes/parser/types';
|
|
4
|
+
import type { FracArray } from '../classes/parser/types';
|
|
5
|
+
import type { Rational } from '../classes/rational/Rational';
|
|
6
|
+
import type { ExpressionInput } from '../types';
|
|
7
|
+
export declare class Pattern extends BaseConverter {
|
|
8
|
+
private allEqualArguments;
|
|
9
|
+
private args;
|
|
10
|
+
private c;
|
|
11
|
+
private constCount;
|
|
12
|
+
private expression;
|
|
13
|
+
private multiplier;
|
|
14
|
+
private p;
|
|
15
|
+
private powerCount;
|
|
16
|
+
private referenceMap;
|
|
17
|
+
private reuseReferences;
|
|
18
|
+
private v;
|
|
19
|
+
private variables;
|
|
20
|
+
patternString: string;
|
|
21
|
+
references: {
|
|
22
|
+
[label: string]: Expression;
|
|
23
|
+
};
|
|
24
|
+
stack: Expression[];
|
|
25
|
+
constructor(expression: ExpressionInput, variables?: string[], options?: OptionsObject);
|
|
26
|
+
/**
|
|
27
|
+
* Shows the structure of a pattern with respect to x
|
|
28
|
+
* @param str
|
|
29
|
+
* @returns
|
|
30
|
+
*/
|
|
31
|
+
static showStructure(str: string, variable?: string): string;
|
|
32
|
+
protected convertPower(input: Expression, power: Expression, options: OptionsObject): string;
|
|
33
|
+
protected createConstantReference(input: Expression, toPower?: boolean): string;
|
|
34
|
+
protected createVariableReference(input: Expression, options: OptionsObject): string;
|
|
35
|
+
protected finalizePowerAndInput(power: Expression, input: Expression, _options?: OptionsObject): [Expression, Expression];
|
|
36
|
+
protected hasAsVariable(input: Expression): boolean;
|
|
37
|
+
protected isBracketed(v: string): boolean;
|
|
38
|
+
protected multiplyToMultiplier(input: Expression): void;
|
|
39
|
+
protected requiresMultiplicationSymbol(_input: Expression): boolean;
|
|
40
|
+
protected setMultiplier(m: Rational, multiplierArray: FracArray, _input: Expression, _options?: OptionsObject): void;
|
|
41
|
+
protected toFraction(n: string, d: string): string;
|
|
42
|
+
protected value(input: Expression, isInverted: boolean, isNegative: boolean, options: OptionsObject): FracArray;
|
|
43
|
+
private addReference;
|
|
44
|
+
private formatFunctionCall;
|
|
45
|
+
private getReferenceFromMap;
|
|
46
|
+
private handlePatternProduct;
|
|
47
|
+
private handlePatternSum;
|
|
48
|
+
private initializeVariables;
|
|
49
|
+
private nextConstant;
|
|
50
|
+
private nextPower;
|
|
51
|
+
/**
|
|
52
|
+
* Checks to make sure that all the arguments match
|
|
53
|
+
* @returns
|
|
54
|
+
*/
|
|
55
|
+
argumentsMatch(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Checks if one or more values equals a given value
|
|
58
|
+
* @param references
|
|
59
|
+
* @param value
|
|
60
|
+
* @returns
|
|
61
|
+
*/
|
|
62
|
+
equal(references: string, value: string): boolean;
|
|
63
|
+
equal(references: string[], value: string): boolean;
|
|
64
|
+
fromPattern(p: string): Expression;
|
|
65
|
+
/**
|
|
66
|
+
* Gets the value of a reference
|
|
67
|
+
* @param reference
|
|
68
|
+
* @returns
|
|
69
|
+
*/
|
|
70
|
+
get(reference: string): Expression;
|
|
71
|
+
}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pattern = void 0;
|
|
4
|
+
const array_1 = require("../../utils/array");
|
|
5
|
+
const Expression_1 = require("../classes/expression/Expression");
|
|
6
|
+
const shortcuts_1 = require("../classes/expression/shortcuts");
|
|
7
|
+
const constants_1 = require("../classes/parser/constants");
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const BaseConverter_1 = require("./BaseConverter");
|
|
10
|
+
class Pattern extends BaseConverter_1.BaseConverter {
|
|
11
|
+
// Caching elements
|
|
12
|
+
allEqualArguments = undefined;
|
|
13
|
+
args = [];
|
|
14
|
+
c;
|
|
15
|
+
constCount = 0;
|
|
16
|
+
expression;
|
|
17
|
+
multiplier = '';
|
|
18
|
+
p;
|
|
19
|
+
powerCount = 0;
|
|
20
|
+
referenceMap = {};
|
|
21
|
+
reuseReferences;
|
|
22
|
+
v;
|
|
23
|
+
variables = {};
|
|
24
|
+
patternString = '';
|
|
25
|
+
references = {};
|
|
26
|
+
stack = [];
|
|
27
|
+
constructor(expression, variables = [], options) {
|
|
28
|
+
super();
|
|
29
|
+
this.setMode('text');
|
|
30
|
+
this.expression = Expression_1.Expression.create(expression);
|
|
31
|
+
const defaults = {
|
|
32
|
+
constantSymbol: 'a',
|
|
33
|
+
powerSymbol: 'n',
|
|
34
|
+
variableSymbol: 'x',
|
|
35
|
+
reuseReferences: false,
|
|
36
|
+
};
|
|
37
|
+
const resolvedOptions = { ...defaults, ...options };
|
|
38
|
+
this.v = resolvedOptions.variableSymbol;
|
|
39
|
+
this.p = resolvedOptions.powerSymbol;
|
|
40
|
+
this.c = resolvedOptions.constantSymbol;
|
|
41
|
+
this.reuseReferences = resolvedOptions.reuseReferences;
|
|
42
|
+
this.initializeVariables(variables);
|
|
43
|
+
this.patternString = this.convert(this.expression, resolvedOptions);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Shows the structure of a pattern with respect to x
|
|
47
|
+
* @param str
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
50
|
+
static showStructure(str, variable = 'x') {
|
|
51
|
+
let output = `Input: ${str}\n`;
|
|
52
|
+
const pattern = new Pattern(str, [variable]);
|
|
53
|
+
output += `patternString: ${pattern.patternString}\n`;
|
|
54
|
+
output += 'references: {\n';
|
|
55
|
+
for (const r in pattern.references) {
|
|
56
|
+
output += ` ${r}: ${pattern.references[r]}\n`;
|
|
57
|
+
}
|
|
58
|
+
output += '}';
|
|
59
|
+
return output;
|
|
60
|
+
}
|
|
61
|
+
convertPower(input, power, options) {
|
|
62
|
+
if (input.isEXP()) {
|
|
63
|
+
// Explicitly include the multiplier
|
|
64
|
+
return this.inBrackets(this.convert(power, { ...options, ignoreMultiplier: false }));
|
|
65
|
+
}
|
|
66
|
+
// If it doesn't have a variable then it's just a constants and does not require a power
|
|
67
|
+
// Products don't carry powers at the upper level so it's always 1. No need to add it.
|
|
68
|
+
if (!this.hasAsVariable(input) || input.isProduct()) {
|
|
69
|
+
return '';
|
|
70
|
+
}
|
|
71
|
+
return this.createConstantReference(power, true);
|
|
72
|
+
}
|
|
73
|
+
createConstantReference(input, toPower = false) {
|
|
74
|
+
const isNumeric = input.isNUM();
|
|
75
|
+
// Namespace the cache key so constant and power references don't collide.
|
|
76
|
+
const key = `${toPower ? 'pow' : 'cnt'}_${input.text()}`;
|
|
77
|
+
if (!isNumeric) {
|
|
78
|
+
const existing = this.referenceMap[key];
|
|
79
|
+
if (existing) {
|
|
80
|
+
return existing;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const ref = toPower ? this.nextPower(input) : this.nextConstant(input);
|
|
84
|
+
this.addReference(ref, input);
|
|
85
|
+
if (!isNumeric) {
|
|
86
|
+
this.referenceMap[key] = ref;
|
|
87
|
+
}
|
|
88
|
+
return ref;
|
|
89
|
+
}
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
91
|
+
createVariableReference(input, options) {
|
|
92
|
+
const value = this.variables[input.value];
|
|
93
|
+
this.addReference(value, input);
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
finalizePowerAndInput(power, input, _options) {
|
|
97
|
+
// The power gets stripped from the input e.g. 2^x -> [2, x]
|
|
98
|
+
// This check fails because the power and not the base now contains the variable.
|
|
99
|
+
// Return an EXP with power one. This is a workable solution since this expression
|
|
100
|
+
// is short-lived.
|
|
101
|
+
let e = input.toLinearAndUnitMultiplier();
|
|
102
|
+
if (input.isEXP() && !e.isEXP() && this.hasAsVariable(power)) {
|
|
103
|
+
e = Expression_1.Expression.toEXP(e, (0, shortcuts_1.one)());
|
|
104
|
+
}
|
|
105
|
+
return [power, e];
|
|
106
|
+
}
|
|
107
|
+
hasAsVariable(input) {
|
|
108
|
+
if (input.isVAR()) {
|
|
109
|
+
return !!this.variables[input.value];
|
|
110
|
+
}
|
|
111
|
+
return Object.keys(this.variables).some(variable => input.hasVariable(variable));
|
|
112
|
+
}
|
|
113
|
+
isBracketed(v) {
|
|
114
|
+
return /^\(.+\)$/.test(v);
|
|
115
|
+
}
|
|
116
|
+
multiplyToMultiplier(input) {
|
|
117
|
+
this.references[this.multiplier] = this.references[this.multiplier].times(input);
|
|
118
|
+
}
|
|
119
|
+
requiresMultiplicationSymbol(_input) {
|
|
120
|
+
return true;
|
|
121
|
+
// return input.isSum() || input.isEXP();
|
|
122
|
+
}
|
|
123
|
+
setMultiplier(m, multiplierArray, _input, _options) {
|
|
124
|
+
const ref = this.createConstantReference(new Expression_1.Expression(m));
|
|
125
|
+
this.multiplier = ref;
|
|
126
|
+
multiplierArray[0] = ref;
|
|
127
|
+
}
|
|
128
|
+
toFraction(n, d) {
|
|
129
|
+
const wrapIfNeeded = (s) => {
|
|
130
|
+
if (/[*+]/.test(s) && !this.isBracketed(s)) {
|
|
131
|
+
return this.inBrackets(s);
|
|
132
|
+
}
|
|
133
|
+
return s;
|
|
134
|
+
};
|
|
135
|
+
return `${wrapIfNeeded(n)}/${wrapIfNeeded(d)}`;
|
|
136
|
+
}
|
|
137
|
+
value(input, isInverted, isNegative, options) {
|
|
138
|
+
const v = ['', ''];
|
|
139
|
+
const index = isInverted ? 1 : 0;
|
|
140
|
+
if (input.isNUM()) {
|
|
141
|
+
return v;
|
|
142
|
+
}
|
|
143
|
+
if (!this.hasAsVariable(input) && !input.isEXP()) {
|
|
144
|
+
this.multiplyToMultiplier(input);
|
|
145
|
+
return v;
|
|
146
|
+
}
|
|
147
|
+
if (input.isEXP()) {
|
|
148
|
+
const arg = input.getBase();
|
|
149
|
+
v[index] = this.inBrackets(this.convert(arg, { ...options, ignoreMultiplier: false }));
|
|
150
|
+
}
|
|
151
|
+
else if (input.isInf()) {
|
|
152
|
+
v[index] = constants_1.INFINITY[0];
|
|
153
|
+
}
|
|
154
|
+
else if (!(input.elements || input.args)) {
|
|
155
|
+
v[index] = this.createVariableReference(input, options);
|
|
156
|
+
}
|
|
157
|
+
else if (input.isFunction()) {
|
|
158
|
+
v[index] = this.formatFunctionCall(input, options);
|
|
159
|
+
}
|
|
160
|
+
else if (input.isSum()) {
|
|
161
|
+
v[index] = this.handlePatternSum(input, options);
|
|
162
|
+
}
|
|
163
|
+
else if (input.isProduct()) {
|
|
164
|
+
return this.handlePatternProduct(input, isInverted, options);
|
|
165
|
+
}
|
|
166
|
+
return v;
|
|
167
|
+
}
|
|
168
|
+
addReference(ref, input) {
|
|
169
|
+
if (!this.references[ref]) {
|
|
170
|
+
this.references[ref] = input;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
formatFunctionCall(input, options) {
|
|
174
|
+
const args = input.getArguments();
|
|
175
|
+
// Make a references to the arguments
|
|
176
|
+
this.args.push(args.map(x => x.text()).join(','));
|
|
177
|
+
// Ignoring the multiplier is explicitly false
|
|
178
|
+
const argList = args
|
|
179
|
+
.map(arg => this.convert(arg, { ...options, ignoreMultiplier: false }))
|
|
180
|
+
.join(', ');
|
|
181
|
+
return `${input.name}${this.inBrackets(argList)}`;
|
|
182
|
+
}
|
|
183
|
+
getReferenceFromMap(input, toPower = false) {
|
|
184
|
+
if (input && !input.isNUM()) {
|
|
185
|
+
const key = `${toPower ? 'pow' : 'cnt'}_${input.text()}`;
|
|
186
|
+
return this.referenceMap[key];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
handlePatternProduct(input, isInverted, options) {
|
|
190
|
+
const mul = this.getMultiplicationSymbol();
|
|
191
|
+
const numOutput = [];
|
|
192
|
+
const denOutput = [];
|
|
193
|
+
for (let element of input.elementsArray()) {
|
|
194
|
+
if (!this.hasAsVariable(element)) {
|
|
195
|
+
this.multiplyToMultiplier(element);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (element.isFunction(constants_1.WRAP)) {
|
|
199
|
+
element = element.getArguments()[0];
|
|
200
|
+
}
|
|
201
|
+
// FIX: Account for whether the entire product is inverted
|
|
202
|
+
const elementPowerSign = element.getPower().sign();
|
|
203
|
+
const isInDenominator = isInverted
|
|
204
|
+
? elementPowerSign !== -1 // If product is inverted, positive powers go to denominator
|
|
205
|
+
: elementPowerSign === -1; // Normal case: negative powers go to denominator
|
|
206
|
+
const target = isInDenominator ? denOutput : numOutput;
|
|
207
|
+
if (isInDenominator && !isInverted) {
|
|
208
|
+
element = element.invert();
|
|
209
|
+
}
|
|
210
|
+
else if (!isInDenominator && isInverted) {
|
|
211
|
+
// Element stays as-is when inverted product with positive power
|
|
212
|
+
}
|
|
213
|
+
let output = this.convert(element, { ...options, ignoreMultiplier: true });
|
|
214
|
+
if (element.isSum() && element.isLinear() && this.mode === 'text') {
|
|
215
|
+
output = this.inBrackets(output);
|
|
216
|
+
}
|
|
217
|
+
target.push(output);
|
|
218
|
+
}
|
|
219
|
+
return [numOutput.join(mul), denOutput.join(mul)];
|
|
220
|
+
}
|
|
221
|
+
handlePatternSum(input, options) {
|
|
222
|
+
let constants = (0, shortcuts_1.zero)();
|
|
223
|
+
const elements = input.elementsArray();
|
|
224
|
+
const converted = [];
|
|
225
|
+
for (const element of elements) {
|
|
226
|
+
if (this.hasAsVariable(element)) {
|
|
227
|
+
converted.push(this.convert(element, { ...options, ignoreMultiplier: false }));
|
|
228
|
+
// converted.push(this.convert(element, options));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
constants = constants.plus(element);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Add the constants if they're not zero
|
|
235
|
+
if (!constants.isZero()) {
|
|
236
|
+
converted.push(this.createConstantReference(constants));
|
|
237
|
+
}
|
|
238
|
+
return this.inBrackets(converted.join('+'));
|
|
239
|
+
}
|
|
240
|
+
initializeVariables(variables) {
|
|
241
|
+
let counter = 1;
|
|
242
|
+
variables
|
|
243
|
+
.slice()
|
|
244
|
+
.sort()
|
|
245
|
+
.forEach(x => {
|
|
246
|
+
this.variables[x] = this.v + counter++;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
nextConstant(constant) {
|
|
250
|
+
const existing = this.getReferenceFromMap(constant, /*toPower*/ false);
|
|
251
|
+
return this.reuseReferences && existing ? existing : `${this.c}${++this.constCount}`;
|
|
252
|
+
// return existing || `${this.c}${++this.constCount}`;
|
|
253
|
+
}
|
|
254
|
+
nextPower(power) {
|
|
255
|
+
const existing = this.getReferenceFromMap(power, /*toPower*/ true);
|
|
256
|
+
return this.reuseReferences && existing ? existing : `${this.p}${++this.powerCount}`;
|
|
257
|
+
// return existing || `${this.p}${++this.powerCount}`;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Checks to make sure that all the arguments match
|
|
261
|
+
* @returns
|
|
262
|
+
*/
|
|
263
|
+
argumentsMatch() {
|
|
264
|
+
if (this.allEqualArguments === undefined) {
|
|
265
|
+
this.allEqualArguments = (0, array_1.allEqual)(this.args);
|
|
266
|
+
}
|
|
267
|
+
return this.allEqualArguments;
|
|
268
|
+
}
|
|
269
|
+
equal(references, value) {
|
|
270
|
+
if (typeof references === 'string') {
|
|
271
|
+
return this.get(references).eq(value);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
if (references.length == 0) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
// The subsequent
|
|
278
|
+
for (let i = 0; i < references.length; i++) {
|
|
279
|
+
if (!this.get(references[i]).eq(value)) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
fromPattern(p) {
|
|
287
|
+
return Expression_1.Expression.create(p, this.references);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Gets the value of a reference
|
|
291
|
+
* @param reference
|
|
292
|
+
* @returns
|
|
293
|
+
*/
|
|
294
|
+
get(reference) {
|
|
295
|
+
const ref = this.references[reference];
|
|
296
|
+
if (!ref) {
|
|
297
|
+
throw new errors_1.MissingReferenceError((0, errors_1.message)('missingReference', { ref: reference }));
|
|
298
|
+
}
|
|
299
|
+
return ref;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
exports.Pattern = Pattern;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Scope } from './common/classes/Scope';
|
|
2
|
+
import type { ParserEntity } from './types';
|
|
3
|
+
export type RegisteredMathFunction = (...args: never[]) => ParserEntity;
|
|
4
|
+
export type ParserUsage = 'notation' | 'scripting';
|
|
5
|
+
export type ParserRegistrationLevel = 'system' | 'user';
|
|
6
|
+
export interface MathFunctionEntry {
|
|
7
|
+
/** The function to be called */
|
|
8
|
+
fn: RegisteredMathFunction;
|
|
9
|
+
/** The minimum arguments allowed. Use -1 for variadic. */
|
|
10
|
+
minArgs: number;
|
|
11
|
+
/** The maximum arguments allowed. Use -1 for variadic. */
|
|
12
|
+
maxArgs: number;
|
|
13
|
+
/** The maximum precision available for the function */
|
|
14
|
+
maxPrecision?: number;
|
|
15
|
+
/** Argument positions that explicitly accept Equation values. */
|
|
16
|
+
equationArgs?: number[];
|
|
17
|
+
/** Whether Vector and Matrix arguments are distributed element-wise. */
|
|
18
|
+
distElWise?: boolean;
|
|
19
|
+
/** Whether argument evaluation is controlled by the registered function. */
|
|
20
|
+
deferArguments?: boolean;
|
|
21
|
+
/** Optional syntax normalization applied to deferred argument scopes before evaluation. */
|
|
22
|
+
normalizeDeferredArguments?: (argumentScopes: Scope[]) => Scope[];
|
|
23
|
+
/** Whether bracketless notation consumes the rest of the current statement expression. */
|
|
24
|
+
bracketlessStatement?: boolean;
|
|
25
|
+
/** Whether parser dispatch consumes an escaping top-level RETURN from this function. */
|
|
26
|
+
returnBoundary?: boolean;
|
|
27
|
+
/** Whether the entry belongs to ordinary Nerdamer notation or Nerdamer scripting. */
|
|
28
|
+
usage: ParserUsage;
|
|
29
|
+
/** Whether this function was registered at the system or user level */
|
|
30
|
+
level: ParserRegistrationLevel;
|
|
31
|
+
}
|
|
32
|
+
export declare const mathFunctionRegistry: {
|
|
33
|
+
[functionName: string]: MathFunctionEntry;
|
|
34
|
+
};
|