@pie-framework/math-validation 1.4.3 → 2.0.0-next.20261110063142

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 (71) hide show
  1. package/LICENSE +233 -0
  2. package/README.md +41 -110
  3. package/dist/conversion/ast-to-mathjs.d.ts +3 -0
  4. package/dist/conversion/error.d.ts +4 -0
  5. package/dist/conversion/flatten.d.ts +1 -0
  6. package/{lib → dist}/conversion/latex-to-ast.d.ts +13 -12
  7. package/{lib → dist}/conversion/lexer.d.ts +5 -5
  8. package/dist/difference.d.ts +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.js +1594 -0
  11. package/dist/latex-equal.d.ts +2 -0
  12. package/dist/literal/index.d.ts +3 -0
  13. package/dist/log.d.ts +1 -0
  14. package/dist/mathjs.d.ts +11 -0
  15. package/{lib → dist}/node-sort.d.ts +1 -1
  16. package/dist/options.d.ts +13 -0
  17. package/{lib → dist}/symbolic/compare-compound-inequations.d.ts +2 -2
  18. package/{lib → dist}/symbolic/compare-equations.d.ts +1 -1
  19. package/dist/symbolic/index.d.ts +1 -0
  20. package/dist/symbolic/simplify.d.ts +2 -0
  21. package/{lib → dist}/symbolic/utils.d.ts +3 -3
  22. package/dist/value.d.ts +6 -0
  23. package/package.json +28 -56
  24. package/lib/conversion/ast-to-mathjs.d.ts +0 -12
  25. package/lib/conversion/ast-to-mathjs.js +0 -329
  26. package/lib/conversion/ast-to-mathjs.js.map +0 -1
  27. package/lib/conversion/error.d.ts +0 -5
  28. package/lib/conversion/error.js +0 -13
  29. package/lib/conversion/error.js.map +0 -1
  30. package/lib/conversion/flatten.d.ts +0 -12
  31. package/lib/conversion/flatten.js +0 -103
  32. package/lib/conversion/flatten.js.map +0 -1
  33. package/lib/conversion/latex-to-ast.js +0 -1479
  34. package/lib/conversion/latex-to-ast.js.map +0 -1
  35. package/lib/conversion/lexer.js +0 -135
  36. package/lib/conversion/lexer.js.map +0 -1
  37. package/lib/conversion/util.d.ts +0 -3
  38. package/lib/conversion/util.js +0 -36
  39. package/lib/conversion/util.js.map +0 -1
  40. package/lib/demo.d.ts +0 -4
  41. package/lib/demo.js +0 -173
  42. package/lib/demo.js.map +0 -1
  43. package/lib/difference.d.ts +0 -2
  44. package/lib/difference.js +0 -24
  45. package/lib/difference.js.map +0 -1
  46. package/lib/index.d.ts +0 -5
  47. package/lib/index.js +0 -9
  48. package/lib/index.js.map +0 -1
  49. package/lib/latex-equal.d.ts +0 -10
  50. package/lib/latex-equal.js +0 -41
  51. package/lib/latex-equal.js.map +0 -1
  52. package/lib/literal/index.d.ts +0 -10
  53. package/lib/literal/index.js +0 -22
  54. package/lib/literal/index.js.map +0 -1
  55. package/lib/log.d.ts +0 -1
  56. package/lib/log.js +0 -14
  57. package/lib/log.js.map +0 -1
  58. package/lib/mathjs.d.ts +0 -3
  59. package/lib/mathjs.js +0 -9
  60. package/lib/mathjs.js.map +0 -1
  61. package/lib/node-sort.js +0 -236
  62. package/lib/node-sort.js.map +0 -1
  63. package/lib/symbolic/compare-compound-inequations.js +0 -68
  64. package/lib/symbolic/compare-compound-inequations.js.map +0 -1
  65. package/lib/symbolic/compare-equations.js +0 -106
  66. package/lib/symbolic/compare-equations.js.map +0 -1
  67. package/lib/symbolic/index.d.ts +0 -4
  68. package/lib/symbolic/index.js +0 -340
  69. package/lib/symbolic/index.js.map +0 -1
  70. package/lib/symbolic/utils.js +0 -323
  71. package/lib/symbolic/utils.js.map +0 -1
@@ -1,340 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isMathEqual = exports.simplify = void 0;
4
- const log_1 = require("../log");
5
- const mathjs_1 = require("../mathjs");
6
- const mathjs_2 = require("mathjs");
7
- const node_sort_1 = require("../node-sort");
8
- const compare_equations_1 = require("./compare-equations");
9
- const compare_compound_inequations_1 = require("./compare-compound-inequations");
10
- const m = mathjs_1.mathjs;
11
- const log = (0, log_1.logger)("mv:symbolic");
12
- // an angle counts as k quarter turns (90°, 180°, ...) only when it is one up to floating-point error,
13
- // which keeps angles that are only close, like 89.9999°, 1.5708 or 9090.001°, from being matched
14
- const ANGLE_TOLERANCE = 1e-9;
15
- // angles are evaluated as plain numbers, the Fraction config used elsewhere cannot represent pi
16
- const numeric = (0, mathjs_2.create)(mathjs_2.all);
17
- // tolerances for floating-point noise from trig functions, pi and angle conversions (PIE-905);
18
- // the noise grows with the angle, e.g. sin(2pi) = -2.4e-16, sin(200pi) = 3.9e-15, tan(36045°) - 1 = -5.4e-14,
19
- // so a value is accepted only when it agrees with the target to about 13 significant digits
20
- const RELATIVE_EPSILON = 1e-13;
21
- // floor for comparisons with 0, where a relative tolerance alone would require an exact match;
22
- // it covers residues such as sin(200pi) and cos(100.5pi) while still rejecting 0 vs 0.0000000000001
23
- const ABSOLUTE_EPSILON = 1e-14;
24
- const { simplify: ms, rationalize } = mathjs_1.mathjs;
25
- const SIMPLIFY_RULES = [
26
- { l: "n1^(1/n2)", r: "nthRoot(n1, n2)" },
27
- { l: "sqrt(n1)", r: "nthRoot(n1, 2)" },
28
- { l: "nthRoot(-1, 2)", r: "i" },
29
- { l: "(v1-v2)/n", r: "v1/n-v2/n" },
30
- { l: "(v1-n)/n", r: "v1/n-1" },
31
- { l: "n/n1-c1", r: "(n-c1*n1)/n1" },
32
- { l: "i^2", r: "-1" },
33
- { l: "pi", r: "3.141592653589793" },
34
- { l: "n/(n*n1)", r: "1/n1" },
35
- { l: "c1/(c2*(n3))", r: "(c1/c2)*(1/n3)" },
36
- { l: "n1/(n(n+1)+1(n+1))", r: "n1/((n+1)^2)" },
37
- // perfect square formula
38
- { l: "(n1 + n2) ^ 2", r: "(n1 ^ 2) + 2*n1*n2 + (n2 ^ 2)" },
39
- { l: "tzn(n1, n2)", r: "n1" },
40
- { l: "n1/(-n2)", r: "-(n1/n2)" },
41
- { l: "sin(n*pi)", r: "0" },
42
- // logarithm rules
43
- { l: "log(n1*n2, n3)", r: "log(n1, n3)+log(n2,n3)" },
44
- { l: "log(n1/n2, n3)", r: "log(n1, n3)-log(n2,n3)" },
45
- { l: "log(n1^n2, n3)", r: "n2*log(n1,n3)" },
46
- // trigonometry: defining relations for tangent, cotangent, secant, and cosecant in terms of sine and cosine
47
- { l: "sin(n)/cos(n)", r: "tan(n)" },
48
- { l: "csc(n)", r: "1/sin(n)" },
49
- { l: "sec(n)", r: "1/cos(n)" },
50
- { l: "cot(n)", r: "1/tan(n)", r1: "cos(n)/sin(n)" },
51
- { l: "1/tan(n)", r: "cos(n)/sin(n)" },
52
- // TO DO: the Pythagorean formula for sines and cosines.
53
- // inverse trigonometric functions relations
54
- { l: "n1 == asin(n)", r: "n == sin(n1)" },
55
- { l: "n1 == acos(n)", r: "n == cos(n1)" },
56
- { l: "n1 == atan(n)", r: "n == tan(n1)" },
57
- { l: "n1 == acot(n)", r: "n == cot(n1)" },
58
- { l: "n1 == asec(n)", r: "n == sec(n1)" },
59
- { l: "n1 == acsc(n)", r: "n == csc(n1)" },
60
- // relationships between trigonometric functions and inverse trigonometric functions
61
- { l: "sin(asin(n))", r: "n" },
62
- { l: "cos(acos(n))", r: "n" },
63
- { l: "tan(atan(n))", r: "n" },
64
- { l: "sin(acsc(n))", r: "1/n" },
65
- { l: "cos(asec(n))", r: "1/n" },
66
- { l: "tan(acot(n))", r: "1/n" },
67
- ];
68
- const simplify = (v) => {
69
- const rules = SIMPLIFY_RULES.concat(ms.rules);
70
- return ms(v, rules); //.concat(SIMPLIFY_RULES));
71
- };
72
- exports.simplify = simplify;
73
- const hasSymbol = (node, matches) => {
74
- let found = false;
75
- // the name of a function such as sqrt is a symbol too, under the path "fn"
76
- node.traverse((n, path) => {
77
- found = found || (n.isSymbolNode && path !== "fn" && matches(n.name));
78
- });
79
- return found;
80
- };
81
- // evaluates a constant expression as a plain number, undefined if it has variables;
82
- // any symbol other than pi and Infinity is a variable, even names mathjs knows as constants such as e, E or phi
83
- const evaluateNumber = (node) => {
84
- if (hasSymbol(node, (name) => name !== "pi" && name !== "Infinity")) {
85
- return undefined;
86
- }
87
- try {
88
- const value = numeric.evaluate(node.toString());
89
- return typeof value === "number" ? value : undefined;
90
- }
91
- catch (e) {
92
- return undefined;
93
- }
94
- };
95
- // returns k when the constant angle is (within tolerance) a multiple k of pi/2
96
- const quarterTurns = (angle) => {
97
- const value = evaluateNumber(angle);
98
- if (value === undefined || !isFinite(value)) {
99
- return undefined;
100
- }
101
- const turns = value / (Math.PI / 2);
102
- const k = Math.round(turns);
103
- return Math.abs(turns - k) <= ANGLE_TOLERANCE * Math.max(1, Math.abs(k))
104
- ? k
105
- : undefined;
106
- };
107
- // replace trigonometric functions evaluated at an angle where they are zero or undefined
108
- // with their exact value, so that tan(90°) becomes Infinity instead of a large finite number
109
- const snapTrigonometricValues = (node) => {
110
- let changed = false;
111
- const r = node.transform((n) => {
112
- var _a;
113
- if (!n.isFunctionNode || ((_a = n.args) === null || _a === void 0 ? void 0 : _a.length) !== 1) {
114
- return n;
115
- }
116
- const k = quarterTurns(n.args[0]);
117
- if (k === undefined) {
118
- return n;
119
- }
120
- const odd = Math.abs(k) % 2 === 1;
121
- let snapped = n;
122
- switch (n.fn.name) {
123
- case "sin":
124
- snapped = odd ? n : new m.ConstantNode(0);
125
- break;
126
- case "cos":
127
- snapped = odd ? new m.ConstantNode(0) : n;
128
- break;
129
- case "tan":
130
- snapped = odd ? new m.SymbolNode("Infinity") : new m.ConstantNode(0);
131
- break;
132
- case "cot":
133
- snapped = odd ? new m.ConstantNode(0) : new m.SymbolNode("Infinity");
134
- break;
135
- case "sec":
136
- snapped = odd ? new m.SymbolNode("Infinity") : n;
137
- break;
138
- case "csc":
139
- snapped = odd ? n : new m.SymbolNode("Infinity");
140
- break;
141
- }
142
- changed = changed || snapped !== n;
143
- return snapped;
144
- });
145
- // keep the original node when nothing was replaced, later steps rely on its identity
146
- return { r: changed ? r : node, changed };
147
- };
148
- const normalize = (a) => {
149
- const snapped = snapTrigonometricValues(a);
150
- let r = snapped.r;
151
- // simplify and rationalize treat Infinity as a variable (1 / Infinity + 3 becomes (1 + 3 * Infinity) / Infinity)
152
- // and keep the sign of a division by zero, so a constant expression with an Infinity or a division by zero is evaluated before it is normalized;
153
- // other constant expressions keep their exact value, such as 1/3 in sin(0) + 1/3
154
- const snappedValue = snapped.changed ? evaluateNumber(r) : undefined;
155
- const valueWithSnappedTrigonometry = snappedValue !== undefined &&
156
- (!isFinite(snappedValue) || hasSymbol(r, (name) => name === "Infinity"))
157
- ? snappedValue
158
- : undefined;
159
- let onlyConstant = true;
160
- let containsFunctionNode = false;
161
- let containsArrayNode = false;
162
- let pi = false;
163
- let containsInverseFlag = false;
164
- r.traverse(function (node, path, parent) {
165
- if (node.isArrayNode) {
166
- containsArrayNode = true;
167
- node.items = node.items.map((item) => (0, exports.simplify)(item));
168
- }
169
- if (node.isSymbolNode) {
170
- pi = pi || node.name === "pi";
171
- containsInverseFlag = containsInverseFlag || node.name === "f^{-1}";
172
- }
173
- });
174
- if (r.args) {
175
- r.args = r.args.map((arg) => {
176
- if (!arg.isFunctionNode &&
177
- !arg.isArrayNode &&
178
- !containsInverseFlag &&
179
- !pi) {
180
- try {
181
- arg = (0, exports.simplify)(arg);
182
- }
183
- catch (e) {
184
- // ok;
185
- }
186
- }
187
- containsFunctionNode = containsFunctionNode || arg.isFunctionNode;
188
- onlyConstant = onlyConstant && !!arg.isConstantNode;
189
- return arg;
190
- });
191
- if (containsFunctionNode || containsInverseFlag) {
192
- r.args = r.args.map((arg) => {
193
- if (!arg.isFunctionNode && !arg.isArrayNode) {
194
- try {
195
- arg = rationalize((0, exports.simplify)(arg), {}, true).expression;
196
- }
197
- catch (e) {
198
- // ok;
199
- }
200
- }
201
- return arg;
202
- });
203
- }
204
- }
205
- if (r.fn !== "equal") {
206
- try {
207
- onlyConstant = false;
208
- r = rationalize(r, {}, true).expression;
209
- }
210
- catch (_a) { }
211
- }
212
- if (r.conditionals && r.params) {
213
- r.params = r.params.map((param) => (0, node_sort_1.sort)((0, exports.simplify)(param)));
214
- }
215
- if (!containsArrayNode && !onlyConstant) {
216
- // overcome TypeError
217
- try {
218
- r = (0, exports.simplify)(r);
219
- }
220
- catch (e) { }
221
- }
222
- log("[normalize] input: ", a.toString(), "output: ", r.toString());
223
- // an undefined value has no sign, so -tan(90°) and -1/cos(90°) are Infinity as well;
224
- // an indeterminate result such as tan(90°) - tan(90°) or 0 * tan(90°) is NaN and must not simplify to a number
225
- if (valueWithSnappedTrigonometry !== undefined) {
226
- r = isNaN(valueWithSnappedTrigonometry)
227
- ? new m.SymbolNode("NaN")
228
- : isFinite(valueWithSnappedTrigonometry)
229
- ? new m.ConstantNode(valueWithSnappedTrigonometry)
230
- : new m.SymbolNode("Infinity");
231
- }
232
- if (r.toString() === "Infinity") {
233
- r = new m.SymbolNode("Infinity");
234
- }
235
- return r;
236
- };
237
- // numeric value of an expression without variables, such as 5, -5 or -1/2; undefined for anything else
238
- const constantValue = (node) => {
239
- if (node.filter((n) => n.isSymbolNode).length > 0) {
240
- return undefined;
241
- }
242
- try {
243
- const result = node.evaluate();
244
- // equations and inequalities without variables evaluate to booleans
245
- if (typeof result === "boolean") {
246
- return undefined;
247
- }
248
- const value = +result;
249
- return Number.isFinite(value) ? value : undefined;
250
- }
251
- catch (e) {
252
- return undefined;
253
- }
254
- };
255
- const areNearlyEqual = (a, b) => Math.abs(a - b) <
256
- ABSOLUTE_EPSILON + RELATIVE_EPSILON * Math.max(Math.abs(a), Math.abs(b));
257
- const isIndeterminate = (node) => (node === null || node === void 0 ? void 0 : node.isSymbolNode) && node.name === "NaN";
258
- const isMathEqual = (a, b) => {
259
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
260
- let as;
261
- let bs;
262
- if ((a === null || a === void 0 ? void 0 : a.isUnit) && (b === null || b === void 0 ? void 0 : b.isUnit)) {
263
- try {
264
- return m.equal(a, b);
265
- }
266
- catch (e) {
267
- log("[isMathEqual] Error comparing units:", (_a = a === null || a === void 0 ? void 0 : a.toString) === null || _a === void 0 ? void 0 : _a.call(a), (_b = b === null || b === void 0 ? void 0 : b.toString) === null || _b === void 0 ? void 0 : _b.call(b), e);
268
- return false;
269
- }
270
- }
271
- if ((a === null || a === void 0 ? void 0 : a.isUnit) || (b === null || b === void 0 ? void 0 : b.isUnit)) {
272
- log("[isMathEqual] Mismatched unit comparison:", (_c = a === null || a === void 0 ? void 0 : a.toString) === null || _c === void 0 ? void 0 : _c.call(a), (_d = b === null || b === void 0 ? void 0 : b.toString) === null || _d === void 0 ? void 0 : _d.call(b));
273
- return false;
274
- }
275
- // apply sort if we are not in a relationalNode
276
- as = a.conditionals ? normalize(a) : (0, node_sort_1.sort)(normalize(a));
277
- bs = b.conditionals ? normalize(b) : (0, node_sort_1.sort)(normalize(b));
278
- log("[isMathEqual]", as.toString(), "==?", bs.toString());
279
- // an indeterminate result such as tan(90°) - tan(90°) is not equal to anything, not even another indeterminate result
280
- if (isIndeterminate(as) || isIndeterminate(bs)) {
281
- return false;
282
- }
283
- const isSortingEnough = (0, node_sort_1.sort)(a).equals((0, node_sort_1.sort)(b));
284
- const isTexEnough = as.toTex().trim() === bs.toTex().trim();
285
- let equality = isTexEnough || as.equals(bs) || isSortingEnough;
286
- if (equality) {
287
- return true;
288
- }
289
- // compare constant results numerically, allowing only for floating-point noise
290
- const aValue = constantValue(as);
291
- const bValue = constantValue(bs);
292
- if (aValue !== undefined && bValue !== undefined) {
293
- return areNearlyEqual(aValue, bValue);
294
- }
295
- // if both expressions are equations
296
- if (as.fn === "equal" && bs.fn === "equal") {
297
- return (0, compare_equations_1.compareEquations)(as, bs, false);
298
- }
299
- // if both expressions are inequalities treat greater sign as equal sign
300
- if ((as.fn === "larger" && bs.fn === "larger") ||
301
- (as.fn === "largerEq" && bs.fn === "largerEq")) {
302
- // solving a 2 way inequality is the same as solving an equation, we can treat the greater sign as an equal sign
303
- // the difference is that solution should be plotted on a number line (or interval)
304
- // if we have the same signs and the same direction, the interval will always be the same, starting with the solution
305
- as.fn = "equal";
306
- bs.fn = "equal";
307
- as.op = "=";
308
- bs.op = "=";
309
- return (0, compare_equations_1.compareEquations)(as, bs, true);
310
- }
311
- // check for compound inequalities/3-way inequalities
312
- if (
313
- //@ts-ignore
314
- ((_e = as === null || as === void 0 ? void 0 : as.conditionals) === null || _e === void 0 ? void 0 : _e.length) === ((_f = bs === null || bs === void 0 ? void 0 : bs.conditionals) === null || _f === void 0 ? void 0 : _f.length) &&
315
- //@ts-ignore
316
- ((_g = as === null || as === void 0 ? void 0 : as.conditionals) === null || _g === void 0 ? void 0 : _g.length) === 2 &&
317
- //@ts-ignore
318
- ((_h = as === null || as === void 0 ? void 0 : as.conditionals) === null || _h === void 0 ? void 0 : _h.toString()) === ((_j = bs === null || bs === void 0 ? void 0 : bs.conditionals) === null || _j === void 0 ? void 0 : _j.toString())) {
319
- const params = [
320
- "smaller",
321
- "smallerEq",
322
- "larger",
323
- "largerEq",
324
- "equal",
325
- "unequal",
326
- ];
327
- const paramsIncludedA = params.some((param) =>
328
- //@ts-ignore
329
- as.conditionals.includes(param));
330
- const paramsIncludedB = params.some((param) =>
331
- //@ts-ignore
332
- bs.conditionals.includes(param));
333
- if (paramsIncludedA && paramsIncludedB) {
334
- return (0, compare_compound_inequations_1.compareCompoundInequations)(as, bs);
335
- }
336
- }
337
- return equality;
338
- };
339
- exports.isMathEqual = isMathEqual;
340
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/symbolic/index.ts"],"names":[],"mappings":"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"}