math-exercises 2.0.7 → 2.0.9

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 (99) hide show
  1. package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts +6 -0
  2. package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts.map +1 -1
  3. package/lib/exercises/complex/argumentFromAlgebraicComplex.js +62 -51
  4. package/lib/exercises/complex/index.d.ts +1 -0
  5. package/lib/exercises/complex/index.d.ts.map +1 -1
  6. package/lib/exercises/complex/index.js +1 -0
  7. package/lib/exercises/functions/exponential/expEquation.d.ts +1 -0
  8. package/lib/exercises/functions/exponential/expEquation.d.ts.map +1 -1
  9. package/lib/exercises/functions/logarithm/index.d.ts +1 -0
  10. package/lib/exercises/functions/logarithm/index.d.ts.map +1 -1
  11. package/lib/exercises/functions/logarithm/index.js +1 -1
  12. package/lib/exercises/functions/logarithm/log10PowerSimplifying.d.ts.map +1 -1
  13. package/lib/exercises/functions/logarithm/log10PowerSimplifying.js +3 -2
  14. package/lib/exercises/functions/logarithm/logPowerEquation.d.ts +7 -1
  15. package/lib/exercises/functions/logarithm/logPowerEquation.d.ts.map +1 -1
  16. package/lib/exercises/functions/logarithm/logPowerEquation.js +47 -17
  17. package/lib/exercises/trigonometry/associatePoint.d.ts +7 -0
  18. package/lib/exercises/trigonometry/associatePoint.d.ts.map +1 -0
  19. package/lib/exercises/trigonometry/associatePoint.js +64 -0
  20. package/lib/exercises/trigonometry/index.d.ts +1 -0
  21. package/lib/exercises/trigonometry/index.d.ts.map +1 -1
  22. package/lib/exercises/trigonometry/index.js +1 -0
  23. package/lib/exercises/trigonometry/remarkableValues.d.ts +1 -1
  24. package/lib/exercises/trigonometry/remarkableValues.d.ts.map +1 -1
  25. package/lib/exercises/trigonometry/remarkableValues.js +9 -7
  26. package/lib/index.d.ts +13 -3
  27. package/lib/index.d.ts.map +1 -1
  28. package/lib/math/numbers/nombre.js +1 -1
  29. package/lib/math/numbers/reals/extendedRingElement.d.ts +2 -1
  30. package/lib/math/numbers/reals/extendedRingElement.d.ts.map +1 -1
  31. package/lib/math/polynomials/trinom.d.ts +2 -2
  32. package/lib/math/trigonometry/remarkableValue.d.ts +3 -10
  33. package/lib/math/trigonometry/remarkableValue.d.ts.map +1 -1
  34. package/lib/math/trigonometry/remarkableValue.js +5 -15
  35. package/lib/math/trigonometry/remarkableValues.d.ts +7 -1
  36. package/lib/math/trigonometry/remarkableValues.d.ts.map +1 -1
  37. package/lib/math/trigonometry/remarkableValues.js +63 -13
  38. package/lib/math/utils/arithmetic/gcd.js +1 -1
  39. package/lib/server.js +1 -7
  40. package/lib/tree/nodes/algebraicNode.d.ts +3 -0
  41. package/lib/tree/nodes/algebraicNode.d.ts.map +1 -1
  42. package/lib/tree/nodes/functions/absNode.d.ts +3 -1
  43. package/lib/tree/nodes/functions/absNode.d.ts.map +1 -1
  44. package/lib/tree/nodes/functions/absNode.js +5 -1
  45. package/lib/tree/nodes/functions/cosNode.d.ts +3 -1
  46. package/lib/tree/nodes/functions/cosNode.d.ts.map +1 -1
  47. package/lib/tree/nodes/functions/cosNode.js +21 -0
  48. package/lib/tree/nodes/functions/expNode.d.ts +3 -1
  49. package/lib/tree/nodes/functions/expNode.d.ts.map +1 -1
  50. package/lib/tree/nodes/functions/expNode.js +4 -0
  51. package/lib/tree/nodes/functions/log10Node.d.ts +3 -1
  52. package/lib/tree/nodes/functions/log10Node.d.ts.map +1 -1
  53. package/lib/tree/nodes/functions/log10Node.js +28 -0
  54. package/lib/tree/nodes/functions/logNode.d.ts +3 -1
  55. package/lib/tree/nodes/functions/logNode.d.ts.map +1 -1
  56. package/lib/tree/nodes/functions/logNode.js +32 -0
  57. package/lib/tree/nodes/functions/oppositeNode.d.ts +3 -0
  58. package/lib/tree/nodes/functions/oppositeNode.d.ts.map +1 -1
  59. package/lib/tree/nodes/functions/oppositeNode.js +7 -0
  60. package/lib/tree/nodes/functions/sinNode.d.ts +3 -1
  61. package/lib/tree/nodes/functions/sinNode.d.ts.map +1 -1
  62. package/lib/tree/nodes/functions/sinNode.js +21 -0
  63. package/lib/tree/nodes/functions/sqrtNode.d.ts +3 -0
  64. package/lib/tree/nodes/functions/sqrtNode.d.ts.map +1 -1
  65. package/lib/tree/nodes/functions/sqrtNode.js +41 -0
  66. package/lib/tree/nodes/geometry/lengthNode.d.ts +5 -1
  67. package/lib/tree/nodes/geometry/lengthNode.d.ts.map +1 -1
  68. package/lib/tree/nodes/geometry/lengthNode.js +12 -1
  69. package/lib/tree/nodes/node.d.ts +1 -0
  70. package/lib/tree/nodes/node.d.ts.map +1 -1
  71. package/lib/tree/nodes/node.js +14 -1
  72. package/lib/tree/nodes/numbers/constantNode.d.ts +3 -0
  73. package/lib/tree/nodes/numbers/constantNode.d.ts.map +1 -1
  74. package/lib/tree/nodes/numbers/constantNode.js +7 -0
  75. package/lib/tree/nodes/numbers/numberNode.d.ts +3 -0
  76. package/lib/tree/nodes/numbers/numberNode.d.ts.map +1 -1
  77. package/lib/tree/nodes/numbers/numberNode.js +7 -0
  78. package/lib/tree/nodes/operators/addNode.d.ts +3 -0
  79. package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
  80. package/lib/tree/nodes/operators/addNode.js +173 -0
  81. package/lib/tree/nodes/operators/divideNode.d.ts +3 -0
  82. package/lib/tree/nodes/operators/divideNode.d.ts.map +1 -1
  83. package/lib/tree/nodes/operators/divideNode.js +12 -0
  84. package/lib/tree/nodes/operators/fractionNode.d.ts +3 -0
  85. package/lib/tree/nodes/operators/fractionNode.d.ts.map +1 -1
  86. package/lib/tree/nodes/operators/fractionNode.js +86 -0
  87. package/lib/tree/nodes/operators/multiplyNode.d.ts +5 -0
  88. package/lib/tree/nodes/operators/multiplyNode.d.ts.map +1 -1
  89. package/lib/tree/nodes/operators/multiplyNode.js +127 -10
  90. package/lib/tree/nodes/operators/powerNode.d.ts +3 -0
  91. package/lib/tree/nodes/operators/powerNode.d.ts.map +1 -1
  92. package/lib/tree/nodes/operators/powerNode.js +46 -0
  93. package/lib/tree/nodes/operators/substractNode.d.ts +3 -0
  94. package/lib/tree/nodes/operators/substractNode.d.ts.map +1 -1
  95. package/lib/tree/nodes/operators/substractNode.js +12 -0
  96. package/lib/tree/nodes/variables/variableNode.d.ts +3 -0
  97. package/lib/tree/nodes/variables/variableNode.d.ts.map +1 -1
  98. package/lib/tree/nodes/variables/variableNode.js +10 -0
  99. package/package.json +1 -1
@@ -4,6 +4,7 @@ exports.SinNode = exports.isSinNode = void 0;
4
4
  // import { sin } from "mathjs";
5
5
  const node_1 = require("../node");
6
6
  const functionNode_1 = require("./functionNode");
7
+ const remarkableValues_1 = require("../../../math/trigonometry/remarkableValues");
7
8
  function isSinNode(a) {
8
9
  return (0, functionNode_1.isFunctionNode)(a) && a.id === functionNode_1.FunctionsIds.sin;
9
10
  }
@@ -13,6 +14,7 @@ class SinNode {
13
14
  this.id = functionNode_1.FunctionsIds.opposite;
14
15
  this.child = child;
15
16
  this.type = node_1.NodeType.function;
17
+ this.isNumeric = child.isNumeric;
16
18
  }
17
19
  toMathString() {
18
20
  return `sin(${this.child.toMathString()})`;
@@ -35,10 +37,29 @@ class SinNode {
35
37
  return this.toEquivalentNodes().map((node) => node.toTex());
36
38
  }
37
39
  simplify() {
40
+ const simplifiedChild = this.child.simplify();
41
+ if (!(0, node_1.hasVariableNode)(simplifiedChild)) {
42
+ const value = simplifiedChild.evaluate({});
43
+ const moduled = Math.abs(value % (2 * Math.PI));
44
+ const trigoPoint = remarkableValues_1.remarkableTrigoValues.find((value) => value.angle.evaluate({}) === moduled);
45
+ if (!trigoPoint)
46
+ return this;
47
+ else
48
+ return trigoPoint.cos;
49
+ }
50
+ else {
51
+ //écrire les regles albgeiruqe
52
+ //chaque simplification doit relancer tout le simplify
53
+ //cos(x+2PI)
54
+ //cos(-x)
55
+ }
38
56
  return this;
39
57
  }
40
58
  evaluate(vars) {
41
59
  return Math.sin(this.child.evaluate(vars));
42
60
  }
61
+ equals(node) {
62
+ return isSinNode(node) && node.child.equals(this.child);
63
+ }
43
64
  }
44
65
  exports.SinNode = SinNode;
@@ -7,11 +7,14 @@ export declare class SqrtNode implements FunctionNode {
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
9
  opts?: NodeOptions;
10
+ isNumeric: boolean;
10
11
  constructor(child: AlgebraicNode, opts?: NodeOptions);
11
12
  toMathString(): string;
12
13
  toTex(): string;
13
14
  toEquivalentNodes(opts?: NodeOptions): AlgebraicNode[];
14
15
  toAllValidTexs(): string[];
15
16
  evaluate(vars: Record<string, number>): number;
17
+ simplify(): AlgebraicNode;
18
+ equals(node: AlgebraicNode): boolean;
16
19
  }
17
20
  //# sourceMappingURL=sqrtNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqrtNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/sqrtNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAK5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,QAAQ,CAEjD;AACD,qBAAa,QAAS,YAAW,YAAY;IAC3C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;gBAEP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAMpD,YAAY,IAAI,MAAM;IAMtB,KAAK,IAAI,MAAM;IAIf,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAwBtD,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"sqrtNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/sqrtNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAK5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,QAAQ,CAEjD;AACD,qBAAa,QAAS,YAAW,YAAY;IAC3C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAOpD,YAAY,IAAI,MAAM;IAMtB,KAAK,IAAI,MAAM;IAIf,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAwBtD,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,QAAQ;IAmCR,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAGrC"}
@@ -8,6 +8,7 @@ const real_1 = require("../../../math/numbers/reals/real");
8
8
  const numberNode_1 = require("../numbers/numberNode");
9
9
  const multiplyNode_1 = require("../operators/multiplyNode");
10
10
  const isInt_1 = require("../../../utils/isInt");
11
+ const operatorComposition_1 = require("../../../tree/utilities/operatorComposition");
11
12
  function isSqrtNode(a) {
12
13
  return (0, functionNode_1.isFunctionNode)(a) && a.id === functionNode_1.FunctionsIds.sqrt;
13
14
  }
@@ -18,6 +19,7 @@ class SqrtNode {
18
19
  this.child = child;
19
20
  this.type = node_1.NodeType.function;
20
21
  this.opts = opts;
22
+ this.isNumeric = child.isNumeric;
21
23
  }
22
24
  toMathString() {
23
25
  return `sqr(${this.child.toMathString()})`;
@@ -53,5 +55,44 @@ class SqrtNode {
53
55
  evaluate(vars) {
54
56
  return Math.sqrt(this.child.evaluate(vars));
55
57
  }
58
+ simplify() {
59
+ const simplifiedChild = this.child.simplify();
60
+ const copy = new SqrtNode(simplifiedChild, this.opts);
61
+ const externals = [];
62
+ //ex [3, x^2] pour sqrt(3x^2)
63
+ //TODO fractions
64
+ const recursive = (node) => {
65
+ if ((0, multiplyNode_1.isMultiplyNode)(node)) {
66
+ recursive(node.leftChild);
67
+ recursive(node.rightChild);
68
+ }
69
+ else {
70
+ externals.push(node);
71
+ }
72
+ };
73
+ recursive(copy.child);
74
+ const simplifyExternalNodes = (a) => {
75
+ if ((0, numberNode_1.isNumberNode)(a)) {
76
+ const sqrt = new real_1.SquareRoot(a.value);
77
+ return sqrt.simplify().toTree();
78
+ }
79
+ //TODO diviser par 2 les puissances (dont exp)
80
+ return new SqrtNode(a);
81
+ };
82
+ const simplifyIteration = () => {
83
+ for (let i = 0; i < externals.length; i++) {
84
+ const simplified = simplifyExternalNodes(externals[i]);
85
+ externals[i] = simplified;
86
+ return;
87
+ }
88
+ };
89
+ simplifyIteration();
90
+ if (externals.length === 1)
91
+ return externals[0];
92
+ return (0, operatorComposition_1.operatorComposition)(multiplyNode_1.MultiplyNode, externals).simplify();
93
+ }
94
+ equals(node) {
95
+ return isSqrtNode(node) && node.child.equals(this.child);
96
+ }
56
97
  }
57
98
  exports.SqrtNode = SqrtNode;
@@ -1,9 +1,11 @@
1
1
  import { AlgebraicNode } from "../algebraicNode";
2
- import { NodeOptions, NodeType } from "../node";
2
+ import { Node, NodeOptions, NodeType } from "../node";
3
+ export declare function isLengthNode(a: Node): a is LengthNode;
3
4
  export declare class LengthNode implements AlgebraicNode {
4
5
  opts?: NodeOptions | undefined;
5
6
  segmentName: string;
6
7
  type: NodeType;
8
+ isNumeric: boolean;
7
9
  constructor(segmentName: string, opts?: NodeOptions);
8
10
  toAllValidTexs(): string[];
9
11
  toEquivalentNodes(opts?: NodeOptions): LengthNode[];
@@ -11,5 +13,7 @@ export declare class LengthNode implements AlgebraicNode {
11
13
  toMathjs(): string;
12
14
  toTex(): string;
13
15
  evaluate(vars: Record<string, number>): number;
16
+ simplify(): this;
17
+ equals(node: AlgebraicNode): boolean;
14
18
  }
15
19
  //# sourceMappingURL=lengthNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lengthNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/geometry/lengthNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhD,qBAAa,UAAW,YAAW,aAAa;IAC9C,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;gBAEH,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW;IASnD,cAAc;IAId,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW;IAOpC,YAAY;IAGZ,QAAQ;IAIR,KAAK;IAIL,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAQtC"}
1
+ {"version":3,"file":"lengthNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/geometry/lengthNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAErD;AACD,qBAAa,UAAW,YAAW,aAAa;IAC9C,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW;IAUnD,cAAc;IAId,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW;IAOpC,YAAY;IAGZ,QAAQ;IAIR,KAAK;IAIL,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -1,12 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LengthNode = void 0;
3
+ exports.LengthNode = exports.isLengthNode = void 0;
4
4
  const node_1 = require("../node");
5
+ function isLengthNode(a) {
6
+ return a.type === node_1.NodeType.mesure;
7
+ }
8
+ exports.isLengthNode = isLengthNode;
5
9
  class LengthNode {
6
10
  constructor(segmentName, opts) {
7
11
  this.type = node_1.NodeType.mesure;
8
12
  this.opts = opts;
9
13
  this.segmentName = segmentName;
14
+ this.isNumeric = false;
10
15
  }
11
16
  // toAllTexs() {
12
17
  // return [this.segmentName, this.segmentName.split("").reverse().join()];
@@ -36,5 +41,11 @@ class LengthNode {
36
41
  throw Error(`Can't evaluate length ${this.segmentName}`);
37
42
  return value;
38
43
  }
44
+ simplify() {
45
+ return this;
46
+ }
47
+ equals(node) {
48
+ return isLengthNode(node) && node.segmentName === this.segmentName;
49
+ }
39
50
  }
40
51
  exports.LengthNode = LengthNode;
@@ -31,4 +31,5 @@ export interface Node {
31
31
  toAllValidTexs: (opts?: NodeOptions) => string[];
32
32
  toTex: () => string;
33
33
  }
34
+ export declare const hasVariableNode: (n: Node) => boolean;
34
35
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/node.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,GAAG,IAAA;IACH,UAAU,IAAA;IACV,KAAK,IAAA;IACL,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,OAAO,KAAA;IACP,MAAM,KAAA;CACP;AACD,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AACF,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,KAAK,IAAI,EAAE,CAAC;IAClD,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;IACjD,KAAK,EAAE,MAAM,MAAM,CAAC;CAGrB"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/node.ts"],"names":[],"mappings":"AAIA,oBAAY,QAAQ;IAClB,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,GAAG,IAAA;IACH,UAAU,IAAA;IACV,KAAK,IAAA;IACL,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,OAAO,KAAA;IACP,MAAM,KAAA;CACP;AACD,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AACF,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,KAAK,IAAI,EAAE,CAAC;IAClD,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;IACjD,KAAK,EAAE,MAAM,MAAM,CAAC;CAGrB;AAED,eAAO,MAAM,eAAe,MAAO,IAAI,KAAG,OAMzC,CAAC"}
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NodeType = void 0;
3
+ exports.hasVariableNode = exports.NodeType = void 0;
4
+ const functionNode_1 = require("./functions/functionNode");
5
+ const operatorNode_1 = require("./operators/operatorNode");
6
+ const variableNode_1 = require("./variables/variableNode");
4
7
  var NodeType;
5
8
  (function (NodeType) {
6
9
  NodeType[NodeType["number"] = 0] = "number";
@@ -16,3 +19,13 @@ var NodeType;
16
19
  NodeType[NodeType["belongs"] = 10] = "belongs";
17
20
  NodeType[NodeType["vector"] = 11] = "vector";
18
21
  })(NodeType || (exports.NodeType = NodeType = {}));
22
+ const hasVariableNode = (n) => {
23
+ if ((0, variableNode_1.isVariableNode)(n))
24
+ return true;
25
+ if ((0, operatorNode_1.isOperatorNode)(n))
26
+ return (0, exports.hasVariableNode)(n.leftChild) || (0, exports.hasVariableNode)(n.rightChild);
27
+ if ((0, functionNode_1.isFunctionNode)(n))
28
+ return (0, exports.hasVariableNode)(n.child);
29
+ return false;
30
+ };
31
+ exports.hasVariableNode = hasVariableNode;
@@ -6,11 +6,14 @@ export declare class ConstantNode implements AlgebraicNode {
6
6
  mathString: string;
7
7
  value: number;
8
8
  type: NodeType;
9
+ isNumeric: boolean;
9
10
  constructor(tex: string, mathString: string, value: number);
10
11
  toMathString(): string;
11
12
  toTex(): string;
12
13
  toAllValidTexs(): string[];
13
14
  toEquivalentNodes(): this[];
14
15
  evaluate(vars: Record<string, number>): number;
16
+ simplify(): this;
17
+ equals(node: AlgebraicNode): boolean;
15
18
  }
16
19
  //# sourceMappingURL=constantNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constantNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/numbers/constantNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,aAAa;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAqB;gBAEvB,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAM1D,YAAY,IAAI,MAAM;IAGtB,KAAK,IAAI,MAAM;IAMf,cAAc;IAGd,iBAAiB;IAGjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"constantNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/numbers/constantNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,aAAa;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAqB;IACnC,SAAS,EAAE,OAAO,CAAC;gBACP,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAO1D,YAAY,IAAI,MAAM;IAGtB,KAAK,IAAI,MAAM;IAMf,cAAc;IAGd,iBAAiB;IAGjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -13,6 +13,7 @@ class ConstantNode {
13
13
  this.tex = tex;
14
14
  this.mathString = mathString;
15
15
  this.value = value;
16
+ this.isNumeric = true;
16
17
  }
17
18
  toMathString() {
18
19
  return `${this.mathString}`;
@@ -32,5 +33,11 @@ class ConstantNode {
32
33
  evaluate(vars) {
33
34
  return this.value;
34
35
  }
36
+ simplify() {
37
+ return this;
38
+ }
39
+ equals(node) {
40
+ return isConstantNode(node) && node.tex === this.tex;
41
+ }
35
42
  }
36
43
  exports.ConstantNode = ConstantNode;
@@ -6,6 +6,7 @@ export declare class NumberNode implements AlgebraicNode {
6
6
  mathString: string;
7
7
  value: number;
8
8
  type: NodeType;
9
+ isNumeric: boolean;
9
10
  constructor(value: number, tex?: string, mathString?: string);
10
11
  toMathString(): string;
11
12
  toTex(): string;
@@ -13,5 +14,7 @@ export declare class NumberNode implements AlgebraicNode {
13
14
  toAllValidTexs(): string[];
14
15
  toEquivalentNodes(): this[];
15
16
  evaluate(vars: Record<string, number>): number;
17
+ simplify(): this;
18
+ equals(node: AlgebraicNode): boolean;
16
19
  }
17
20
  //# sourceMappingURL=numberNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"numberNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/numbers/numberNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAErD;AAED,qBAAa,UAAW,YAAW,aAAa;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAmB;gBAErB,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAM5D,YAAY,IAAI,MAAM;IAGtB,KAAK,IAAI,MAAM;IAGf,QAAQ;IAGR,cAAc;IAOd,iBAAiB;IAGjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"numberNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/numbers/numberNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAErD;AAED,qBAAa,UAAW,YAAW,aAAa;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAmB;IACjC,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAO5D,YAAY,IAAI,MAAM;IAGtB,KAAK,IAAI,MAAM;IAGf,QAAQ;IAGR,cAAc;IAOd,iBAAiB;IAGjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -12,6 +12,7 @@ class NumberNode {
12
12
  this.value = value;
13
13
  this.tex = tex || (value + "").replace(".", ",");
14
14
  this.mathString = mathString || this.value + "";
15
+ this.isNumeric = true;
15
16
  }
16
17
  toMathString() {
17
18
  return `${this.mathString}`;
@@ -36,5 +37,11 @@ class NumberNode {
36
37
  evaluate(vars) {
37
38
  return this.value;
38
39
  }
40
+ simplify() {
41
+ return this;
42
+ }
43
+ equals(node) {
44
+ return isNumberNode(node) && node.value === this.value;
45
+ }
39
46
  }
40
47
  exports.NumberNode = NumberNode;
@@ -8,6 +8,7 @@ export declare class AddNode implements CommutativeOperatorNode {
8
8
  rightChild: AlgebraicNode;
9
9
  type: NodeType;
10
10
  opts?: NodeOptions;
11
+ isNumeric: boolean;
11
12
  constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode, opts?: NodeOptions);
12
13
  shuffle: () => void;
13
14
  toMathString(): string;
@@ -16,5 +17,7 @@ export declare class AddNode implements CommutativeOperatorNode {
16
17
  toAllValidTexs(opts?: NodeOptions): string[];
17
18
  toTex(): string;
18
19
  evaluate(vars: Record<string, number>): number;
20
+ simplify(): AlgebraicNode;
21
+ equals(node: AlgebraicNode): boolean;
19
22
  }
20
23
  //# sourceMappingURL=addNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/addNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AAMD,qBAAa,OAAQ,YAAW,uBAAuB;IACrD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAQpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAoCtD,SAAS,IAAI,MAAM,EAAE;IAIrB,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAK5C,KAAK,IAAI,MAAM;IAIf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAMtC"}
1
+ {"version":3,"file":"addNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/addNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AAMD,qBAAa,OAAQ,YAAW,uBAAuB;IACrD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IASpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAoCtD,SAAS,IAAI,MAAM,EAAE;IAIrB,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAK5C,KAAK,IAAI,MAAM;IAIf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMrC,QAAQ,IAAI,aAAa;IAwKzB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAUrC"}
@@ -8,6 +8,11 @@ const coinFlip_1 = require("../../../utils/coinFlip");
8
8
  const permutations_1 = require("../../../utils/permutations");
9
9
  const cartesianProducts_1 = require("../../../utils/cartesianProducts");
10
10
  const operatorComposition_1 = require("../../../tree/utilities/operatorComposition");
11
+ const substractNode_1 = require("./substractNode");
12
+ const oppositeNode_1 = require("../functions/oppositeNode");
13
+ const numberNode_1 = require("../numbers/numberNode");
14
+ const multiplyNode_1 = require("./multiplyNode");
15
+ const fractionNode_1 = require("./fractionNode");
11
16
  function isAddNode(a) {
12
17
  return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.add;
13
18
  }
@@ -28,6 +33,7 @@ class AddNode {
28
33
  this.rightChild = rightChild;
29
34
  this.type = node_1.NodeType.operator;
30
35
  this.opts = opts;
36
+ this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
31
37
  }
32
38
  toMathString() {
33
39
  return `${this.leftChild.toMathString()} + (${this.rightChild.toMathString()})`;
@@ -78,5 +84,172 @@ class AddNode {
78
84
  evaluate(vars) {
79
85
  return this.leftChild.evaluate(vars) + this.rightChild.evaluate(vars);
80
86
  }
87
+ // toMathjs() {
88
+ // return add(this.leftChild.toMathjs(), this.rightChild.toMathjs());
89
+ // }
90
+ simplify() {
91
+ const leftSimplified = this.leftChild.simplify();
92
+ const rightSimplified = this.rightChild.simplify();
93
+ const copy = new AddNode(leftSimplified, rightSimplified, this.opts);
94
+ /**get externals nodes
95
+ */
96
+ let externals = [];
97
+ const recursive = (node) => {
98
+ if (isAddNode(node)) {
99
+ recursive(node.leftChild);
100
+ recursive(node.rightChild);
101
+ }
102
+ else if ((0, substractNode_1.isSubstractNode)(node)) {
103
+ recursive(node.leftChild);
104
+ recursive(new oppositeNode_1.OppositeNode(node.rightChild));
105
+ }
106
+ else {
107
+ externals.push(node);
108
+ }
109
+ };
110
+ recursive(copy);
111
+ externals = externals.filter((node) => !(0, numberNode_1.isNumberNode)(node) || node.value !== 0);
112
+ if (!externals.length)
113
+ return new numberNode_1.NumberNode(0);
114
+ if (externals.length === 1)
115
+ return externals[0];
116
+ const simplifyExternalNodes = (a, b) => {
117
+ if ((0, fractionNode_1.isFractionNode)(a) && (0, fractionNode_1.isFractionNode)(b)) {
118
+ //c/d + e/f = cf+ed / df
119
+ const c = a.leftChild;
120
+ const d = a.rightChild;
121
+ const e = b.leftChild;
122
+ const f = b.rightChild;
123
+ return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify();
124
+ }
125
+ if ((0, fractionNode_1.isFractionNode)(a)) {
126
+ //c/d + b
127
+ const c = a.leftChild;
128
+ const d = a.rightChild;
129
+ return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, b)), d).simplify();
130
+ }
131
+ if ((0, fractionNode_1.isFractionNode)(b)) {
132
+ //c/d + a
133
+ const c = b.leftChild;
134
+ const d = b.rightChild;
135
+ return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, a)), d).simplify();
136
+ }
137
+ if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
138
+ return new numberNode_1.NumberNode(a.value + b.value);
139
+ }
140
+ if ((0, oppositeNode_1.isOppositeNode)(a) && (0, numberNode_1.isNumberNode)(a.child) && (0, numberNode_1.isNumberNode)(b)) {
141
+ return new numberNode_1.NumberNode(-a.child.value + b.value);
142
+ }
143
+ if ((0, oppositeNode_1.isOppositeNode)(b) && (0, numberNode_1.isNumberNode)(b.child) && (0, numberNode_1.isNumberNode)(a)) {
144
+ return new numberNode_1.NumberNode(-b.child.value + a.value);
145
+ }
146
+ if ((0, oppositeNode_1.isOppositeNode)(a) &&
147
+ (0, numberNode_1.isNumberNode)(a.child) &&
148
+ (0, oppositeNode_1.isOppositeNode)(b) &&
149
+ (0, numberNode_1.isNumberNode)(b.child)) {
150
+ return new numberNode_1.NumberNode(a.child.value + b.child.value);
151
+ }
152
+ //gérer opposites, fractions
153
+ const aSubExternals = [];
154
+ const bSubExternals = [];
155
+ const getAMultiplyExternals = (a) => {
156
+ if ((0, multiplyNode_1.isMultiplyNode)(a)) {
157
+ getAMultiplyExternals(a.leftChild);
158
+ getAMultiplyExternals(a.rightChild);
159
+ }
160
+ else if ((0, oppositeNode_1.isOppositeNode)(a)) {
161
+ //on transofmre les opposites en -1
162
+ aSubExternals.push(new numberNode_1.NumberNode(-1));
163
+ getAMultiplyExternals(a.child);
164
+ }
165
+ else {
166
+ aSubExternals.push(a);
167
+ }
168
+ };
169
+ const getBMultiplyExternals = (b) => {
170
+ if ((0, multiplyNode_1.isMultiplyNode)(b)) {
171
+ getBMultiplyExternals(b.leftChild);
172
+ getBMultiplyExternals(b.rightChild);
173
+ }
174
+ else if ((0, oppositeNode_1.isOppositeNode)(b)) {
175
+ //on transofmre les opposites en -1
176
+ bSubExternals.push(new numberNode_1.NumberNode(-1));
177
+ getBMultiplyExternals(b.child);
178
+ }
179
+ else {
180
+ bSubExternals.push(b);
181
+ }
182
+ };
183
+ getAMultiplyExternals(a);
184
+ getBMultiplyExternals(b);
185
+ const factors = [];
186
+ for (let i = 0; i < aSubExternals.length; i++) {
187
+ const left = aSubExternals[i];
188
+ for (let j = 0; j < bSubExternals.length; j++) {
189
+ const right = bSubExternals[j];
190
+ if (left.equals(right)) {
191
+ factors.push(left);
192
+ aSubExternals.splice(i, 1);
193
+ bSubExternals.splice(j, 1);
194
+ i--;
195
+ j--;
196
+ }
197
+ }
198
+ }
199
+ //si aucun facteur on return le add node simplifié
200
+ if (!factors.length)
201
+ return copy;
202
+ const factorsNode = factors.length === 1
203
+ ? factors[0]
204
+ : (0, operatorComposition_1.operatorComposition)(multiplyNode_1.MultiplyNode, factors);
205
+ // if (!aSubExternals.length && !bSubExternals.length) return factorsNode;
206
+ const aNode = aSubExternals.length === 0
207
+ ? new numberNode_1.NumberNode(1)
208
+ : aSubExternals.length === 1
209
+ ? aSubExternals[0]
210
+ : (0, operatorComposition_1.operatorComposition)(AddNode, aSubExternals);
211
+ const bNode = bSubExternals.length === 0
212
+ ? new numberNode_1.NumberNode(1)
213
+ : bSubExternals.length === 1
214
+ ? bSubExternals[0]
215
+ : (0, operatorComposition_1.operatorComposition)(AddNode, bSubExternals);
216
+ const addNode = new AddNode(aNode, bNode);
217
+ return new multiplyNode_1.MultiplyNode(addNode, factorsNode).simplify();
218
+ };
219
+ //pour chaque paire on essaye de simplifier,
220
+ //chaque simplification déclenche le reboot du process
221
+ const simplifyIteration = () => {
222
+ for (let i = 0; i < externals.length - 1; i++) {
223
+ const left = externals[i];
224
+ for (let j = i + 1; j < externals.length; j++) {
225
+ const right = externals[j];
226
+ const simplified = simplifyExternalNodes(left, right);
227
+ if (simplified) {
228
+ externals[i] = simplified;
229
+ externals.splice(j, 1);
230
+ if ((0, numberNode_1.isNumberNode)(simplified) && simplified.value === 0) {
231
+ externals.splice(i, 1);
232
+ }
233
+ simplifyIteration();
234
+ return;
235
+ }
236
+ }
237
+ }
238
+ };
239
+ simplifyIteration();
240
+ if (!externals.length)
241
+ return new numberNode_1.NumberNode(0);
242
+ if (externals.length === 1)
243
+ return externals[0];
244
+ return (0, operatorComposition_1.operatorComposition)(AddNode, externals);
245
+ }
246
+ equals(node) {
247
+ //!incorrect, il faut plutot vérifier qu'ils ont les meme externals
248
+ return (isAddNode(node) &&
249
+ ((node.leftChild.equals(this.leftChild) &&
250
+ node.rightChild.equals(this.rightChild)) ||
251
+ (node.leftChild.equals(this.rightChild) &&
252
+ node.rightChild.equals(this.leftChild))));
253
+ }
81
254
  }
82
255
  exports.AddNode = AddNode;
@@ -7,6 +7,7 @@ export declare class DivideNode implements OperatorNode {
7
7
  leftChild: AlgebraicNode;
8
8
  rightChild: AlgebraicNode;
9
9
  type: NodeType;
10
+ isNumeric: boolean;
10
11
  /**
11
12
  * @param leftChild num
12
13
  * @param rightChild denum
@@ -17,5 +18,7 @@ export declare class DivideNode implements OperatorNode {
17
18
  toAllValidTexs(): string[];
18
19
  toTex(): string;
19
20
  evaluate(vars: Record<string, number>): number;
21
+ simplify(): this;
22
+ equals(node: AlgebraicNode): boolean;
20
23
  }
21
24
  //# sourceMappingURL=divideNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"divideNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/divideNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAErD;AA0BD,qBAAa,UAAW,YAAW,YAAY;IAC7C,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf;;;OAGG;gBAES,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa;IAO/D,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW;IAYpC,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAGf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAMtC"}
1
+ {"version":3,"file":"divideNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/divideNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAErD;AA0BD,qBAAa,UAAW,YAAW,YAAY;IAC7C,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;gBAES,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa;IAQ/D,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW;IAYpC,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAGf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAO3B"}
@@ -38,6 +38,7 @@ class DivideNode {
38
38
  this.leftChild = leftChild;
39
39
  this.rightChild = rightChild;
40
40
  this.type = node_1.NodeType.operator;
41
+ this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
41
42
  }
42
43
  toMathString() {
43
44
  return `(${this.leftChild.toMathString()}) / (${this.rightChild.toMathString()})`;
@@ -62,5 +63,16 @@ class DivideNode {
62
63
  evaluate(vars) {
63
64
  return this.leftChild.evaluate(vars) / this.rightChild.evaluate(vars);
64
65
  }
66
+ // toMathjs() {
67
+ // return divide(this.leftChild.toMathjs(), this.rightChild.toMathjs());
68
+ // }
69
+ simplify() {
70
+ return this;
71
+ }
72
+ equals(node) {
73
+ return (isDivideNode(node) &&
74
+ node.leftChild.equals(this.leftChild) &&
75
+ node.rightChild.equals(this.rightChild));
76
+ }
65
77
  }
66
78
  exports.DivideNode = DivideNode;
@@ -12,6 +12,7 @@ export declare class FractionNode implements OperatorNode {
12
12
  leftChild: AlgebraicNode;
13
13
  rightChild: AlgebraicNode;
14
14
  type: NodeType;
15
+ isNumeric: boolean;
15
16
  constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode, opts?: NodeOptions);
16
17
  toMathString(): string;
17
18
  toInversed(): FractionNode;
@@ -19,5 +20,7 @@ export declare class FractionNode implements OperatorNode {
19
20
  toAllValidTexs(opts?: NodeOptions): string[];
20
21
  toTex(): string;
21
22
  evaluate(vars: Record<string, number>): number;
23
+ simplify(): AlgebraicNode;
24
+ equals(node: AlgebraicNode): boolean;
22
25
  }
23
26
  //# sourceMappingURL=fractionNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fractionNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/fractionNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAK3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,YAAY;IAC/C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;gBAEb,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IASpB,YAAY,IAAI,MAAM;IAItB,UAAU;IAGV,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW;IA2BpC,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAI5C,KAAK,IAAI,MAAM;IAaf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAMtC"}
1
+ {"version":3,"file":"fractionNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/fractionNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAK3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,YAAY;IAC/C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAUpB,YAAY,IAAI,MAAM;IAItB,UAAU;IAGV,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW;IA2BpC,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAI5C,KAAK,IAAI,MAAM;IAaf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMrC,QAAQ,IAAI,aAAa;IA6EzB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAOrC"}