diff --git a/mapytex/calculus/API/__init__.py b/mapytex/calculus/API/__init__.py index 2fe24f1..6c50b5b 100644 --- a/mapytex/calculus/API/__init__.py +++ b/mapytex/calculus/API/__init__.py @@ -83,16 +83,37 @@ x^7 >>> e = Expression.from_str("2x^2+2x+3x") >>> e_simplified = e.simplify() +>>> print(e_simplified) +2x^2 + 5x +>>> for s in e_simplified.explain(): +... print(s) +2x^2 + 2x + 3x +2x^2 + (2 + 3) * x +2x^2 + 5x """ from .expression import Expression if __name__ == "__main__": - e = Expression.from_str("2x^2+3x+4x^2") - print(e) - e_simplified = e.simplify() - print(e_simplified) - + e = Expression.from_str("2x^2+2x+3x") + print(e._tree.map_on_leaf(lambda x:(x,))) + for _ in range(5): + print("-"*10) + e = e._optimize() + try: + print(e._tree.map_on_leaf(lambda x:(x,))) + except AttributeError: + print(e) + e = e._typing() + try: + print(e._tree.map_on_leaf(lambda x:(x,))) + except AttributeError: + print(e) + e = e._compute() + try: + print(e._tree.map_on_leaf(lambda x:(x,))) + except AttributeError: + print(e) # ----------------------------- diff --git a/mapytex/calculus/API/expression.py b/mapytex/calculus/API/expression.py index bb16279..01b91fa 100644 --- a/mapytex/calculus/API/expression.py +++ b/mapytex/calculus/API/expression.py @@ -91,6 +91,37 @@ class Expression(object): def _optimize(self, exclude_nodes=["\\", "**"]): """ Return a copy of self with an optimize tree + :example: + >>> e = Expression.from_str("2x^2+2x+3x") + >>> print(e._tree) + + + > + + | > * + | | > 2 + | | > ^ + | | | > x + | | | > 2 + | > * + | | > 2 + | | > x + > * + | > 3 + | > x + >>> print(e._optimize()._tree) + + + > * + | > 2 + | > ^ + | | > x + | | > 2 + > + + | > * + | | > 2 + | | > x + | > * + | | > 3 + | | > x + """ try: # TODO: need to test exclude_nodes |ven. oct. 5 08:51:02 CEST 2018 @@ -180,7 +211,8 @@ class Expression(object): comp_exp = typed_exp._compute() if typed_exp == comp_exp: - return self + typed_exp.set_ancestor(self._ancestor) + return typed_exp else: comp_exp.set_ancestor(self) return comp_exp.simplify(optimize=optimize) diff --git a/mapytex/calculus/core/__init__.py b/mapytex/calculus/core/__init__.py index 1adcf5c..fe95811 100644 --- a/mapytex/calculus/core/__init__.py +++ b/mapytex/calculus/core/__init__.py @@ -35,9 +35,11 @@ Abstracts tools for calculs manipulations | > 3 | > 4 >>> print(t.apply_on_last_level(compute)) -Traceback (most recent call last): - ... -NotImplementedError: Can't divide 2 int. Need to create a Fraction instead ++ + > 2 + > / + | > 3 + | > 4 >>> tt = t.apply_on_last_level(typing) >>> print(tt.apply_on_last_level(compute)) + diff --git a/mapytex/calculus/core/tree.py b/mapytex/calculus/core/tree.py index beb65b3..a6157eb 100644 --- a/mapytex/calculus/core/tree.py +++ b/mapytex/calculus/core/tree.py @@ -330,6 +330,8 @@ class Tree(object): try: left_applied = self.left_value.\ apply_on_last_level(function) + except NotImplementedError: + left_applied = self.left_value except AttributeError: left_applied = self.left_value left_is_leaf = 1 @@ -338,6 +340,8 @@ class Tree(object): try: right_applied = self.right_value.\ apply_on_last_level(function) + except NotImplementedError: + right_applied = self.right_value except AttributeError: right_applied = self.right_value right_is_leaf = 1