diff --git a/pymath/calculus/abstract_polynom.py b/pymath/calculus/abstract_polynom.py index 28a6a62..f976f39 100644 --- a/pymath/calculus/abstract_polynom.py +++ b/pymath/calculus/abstract_polynom.py @@ -313,7 +313,7 @@ class AbstractPolynom(Explicable): 6 x^{ 2 } + ( 7 + 5 ) x + 3 6 x^{ 2 } + 12 x + 3 >>> Q.steps - [< AbstractPolynom x [[1, 2], [3, 4, 5], 6]>, < AbstractPolynom x [< [1, 2, +] >, < [3, 4, +, 5, +] >, 6]>, < AbstractPolynom x [3, < [7, 5, +] >, 6]>] + [< AbstractPolynom x [[1, 2], [3, 4, 5], 6]>, < AbstractPolynom x [< Expression [1, 2, +]>, < Expression [3, 4, +, 5, +]>, 6]>, < AbstractPolynom x [3, < Expression [7, 5, +]>, 6]>] """ # TODO: It doesn't not compute quick enough |ven. févr. 27 18:04:01 CET @@ -393,7 +393,7 @@ class AbstractPolynom(Explicable): 3 x^{ 2 } + ( 2 + 5 ) x + 1 + 4 3 x^{ 2 } + 7 x + 5 >>> R.steps - [< [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, 5, 'x', *, 4, +, +] >, < AbstractPolynom x [[1, 4], [2, 5], 3]>, < AbstractPolynom x [< [1, 4, +] >, < [2, 5, +] >, 3]>] + [< Expression [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, 5, 'x', *, 4, +, +]>, < AbstractPolynom x [[1, 4], [2, 5], 3]>, < AbstractPolynom x [< Expression [1, 4, +]>, < Expression [2, 5, +]>, 3]>] """ o_poly = self.conv2poly(other) @@ -418,7 +418,7 @@ class AbstractPolynom(Explicable): >>> Q < AbstractPolynom x [-1, -2, -3]> >>> Q.steps - [< [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, -] >] + [< Expression [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, -]>] """ ini_step = [Expression(self.postfix_tokens + [op.sub1])] ans = AbstractPolynom([-i for i in self._coef], @@ -442,7 +442,7 @@ class AbstractPolynom(Explicable): ( 3 - 6 ) x^{ 2 } + ( 2 - 5 ) x + 1 - 4 - 3 x^{ 2 } - 3 x - 3 >>> R.steps - [< [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, 6, 'x', 2, ^, *, 5, 'x', *, +, 4, +, -] >, < [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, 6, 'x', 2, ^, *, -, 5, 'x', *, -, 4, -, +] >, < AbstractPolynom x [[1, -4], [2, -5], [3, -6]]>, < AbstractPolynom x [< [1, -4, +] >, < [2, -5, +] >, < [3, -6, +] >]>] + [< Expression [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, 6, 'x', 2, ^, *, 5, 'x', *, +, 4, +, -]>, < Expression [3, 'x', 2, ^, *, 2, 'x', *, +, 1, +, 6, 'x', 2, ^, *, -, 5, 'x', *, -, 4, -, +]>, < AbstractPolynom x [[1, -4], [2, -5], [3, -6]]>, < AbstractPolynom x [< Expression [1, -4, +]>, < Expression [2, -5, +]>, < Expression [3, -6, +]>]>] """ o_poly = self.conv2poly(other) ini_step = [Expression(self.postfix_tokens + @@ -471,21 +471,21 @@ class AbstractPolynom(Explicable): 2 \times 3 x + 3 6 x + 3 >>> (p*3).steps - [< [2, 'x', *, 1, +, 3, *] >, < AbstractPolynom x [3, < [2, 3, *] >]>] + [< Expression [2, 'x', *, 1, +, 3, *]>, < AbstractPolynom x [3, < Expression [2, 3, *]>]>] >>> q = AbstractPolynom([0,0,4]) >>> q*3 < AbstractPolynom x [0, 0, 12]> >>> (q*3).steps - [< [4, 'x', 2, ^, *, 3, *] >, < AbstractPolynom x [0, 0, < [4, 3, *] >]>] + [< Expression [4, 'x', 2, ^, *, 3, *]>, < AbstractPolynom x [0, 0, < Expression [4, 3, *]>]>] >>> r = AbstractPolynom([0,1]) >>> r*3 < AbstractPolynom x [0, 3]> >>> (r*3).steps - [< ['x', 3, *] >] + [< Expression ['x', 3, *]>] >>> p*q < AbstractPolynom x [0, 0, 4, 8]> >>> (p*q).steps - [< [2, 'x', *, 1, +, 4, 'x', 2, ^, *, *] >, < AbstractPolynom x [0, 0, 4, < [2, 4, *] >]>] + [< Expression [2, 'x', *, 1, +, 4, 'x', 2, ^, *, *]>, < AbstractPolynom x [0, 0, 4, < Expression [2, 4, *]>]>] >>> p*r < AbstractPolynom x [0, 1, 2]> >>> P = AbstractPolynom([1,2,3]) @@ -536,12 +536,12 @@ class AbstractPolynom(Explicable): >>> p**2 < AbstractPolynom x [0, 0, 0, 0, 9]> >>> (p**2).steps - [< [3, 'x', 2, ^, *, 2, ^] >, < AbstractPolynom x [0, 0, 0, 0, < [3, 2, ^] >]>] + [< Expression [3, 'x', 2, ^, *, 2, ^]>, < AbstractPolynom x [0, 0, 0, 0, < Expression [3, 2, ^]>]>] >>> p = AbstractPolynom([1,2]) >>> p**2 < AbstractPolynom x [1, 4, 4]> >>> (p**2).steps - [< [2, 'x', *, 1, +, 2, ^] >, < [2, 'x', *, 1, +, 2, 'x', *, 1, +, *] >, < AbstractPolynom x [1, [2, 2], < [2, 2, *] >]>, < AbstractPolynom x [1, < [2, 2, +] >, 4]>] + [< Expression [2, 'x', *, 1, +, 2, ^]>, < Expression [2, 'x', *, 1, +, 2, 'x', *, 1, +, *]>, < AbstractPolynom x [1, [2, 2], < Expression [2, 2, *]>]>, < AbstractPolynom x [1, < Expression [2, 2, +]>, 4]>] >>> p = AbstractPolynom([0,0,1]) >>> p**3 < AbstractPolynom x [0, 0, 0, 0, 0, 0, 1]> diff --git a/pymath/calculus/expression.py b/pymath/calculus/expression.py index 863156e..4879f1b 100644 --- a/pymath/calculus/expression.py +++ b/pymath/calculus/expression.py @@ -24,7 +24,7 @@ def pstf_factory(pstf_tokens): >>> from .operator import op >>> pstf_t = [2, 3, op.add] >>> pstf_factory(pstf_t) - < [2, 3, +] > + < Expression [2, 3, +]> >>> pstf_factory([2]) 2 >>> type(pstf_factory([2])) @@ -84,11 +84,11 @@ class Expression(Explicable): >>> with Expression.tmp_render(): ... for i in exp.simplify().explain(): ... i - < [2, 3, 5, /, *] > - < [2, < Fraction 3 / 5>, *] > - < [< Fraction 3 / 5>, 2, *] > - < [3, 2, *, 5, /] > - < [6, 5, /] > + < Expression [2, 3, 5, /, *]> + < Expression [2, < Fraction 3 / 5>, *]> + < Expression [< Fraction 3 / 5>, 2, *]> + < Expression [3, 2, *, 5, /]> + < Expression [6, 5, /]> >>> from .render import txt >>> with Expression.tmp_render(txt): ... for i in exp.simplify().explain(): @@ -152,10 +152,6 @@ class Expression(Explicable): """ return self.STR_RENDER(self.postfix_tokens) - def __repr__(self): - return " ".join(["<", str(self.__class__), - str(self.postfix_tokens), ">"]) - def simplify(self): """ Compute entirely the expression and return the result with .steps attribute """ try: @@ -262,7 +258,7 @@ class Expression(Explicable): >>> f = Expression('3*4+5') >>> f1 = f.simplify() >>> Expression.develop_steps([e1, f1, op.add]) - [< [1, 2, +, 3, 4, *, 5, +, +] >, < [3, 12, 5, +, +] >] + [< Expression [1, 2, +, 3, 4, *, 5, +, +]>, < Expression [3, 12, 5, +, +]>] >>> e = Expression('1+2') >>> e1 = e.simplify() >>> f = Expression('3*4+5') @@ -270,7 +266,7 @@ class Expression(Explicable): >>> g = Expression('6+7') >>> g1 = g.simplify() >>> Expression.develop_steps([e1, f1, op.add, g1, op.mul]) - [< [1, 2, +, 3, 4, *, 5, +, +, 6, 7, +, *] >, < [3, 12, 5, +, +, 13, *] >] + [< Expression [1, 2, +, 3, 4, *, 5, +, +, 6, 7, +, *]>, < Expression [3, 12, 5, +, +, 13, *]>] """ with Expression.tmp_render(): tmp_steps = list(Explicable().merge_history(tokenList)) diff --git a/pymath/calculus/fraction.py b/pymath/calculus/fraction.py index 10abc6b..a40ef46 100644 --- a/pymath/calculus/fraction.py +++ b/pymath/calculus/fraction.py @@ -129,29 +129,29 @@ class Fraction(Explicable): >>> f + g < Fraction 7 / 6> >>> print("\\n".join([repr(i) for i in (f+g).steps])) - < [1, 2, /, 2, 3, /, +] > - < [1, 3, *, 2, 3, *, /, 2, 2, *, 3, 2, *, /, +] > - < [3, 6, /, 4, 6, /, +] > - < [< Fraction 3 / 6>, < Fraction 4 / 6>, +] > - < [3, 6, /, 4, 6, /, +] > - < [3, 4, +, 6, /] > + < Expression [1, 2, /, 2, 3, /, +]> + < Expression [1, 3, *, 2, 3, *, /, 2, 2, *, 3, 2, *, /, +]> + < Expression [3, 6, /, 4, 6, /, +]> + < Expression [< Fraction 3 / 6>, < Fraction 4 / 6>, +]> + < Expression [3, 6, /, 4, 6, /, +]> + < Expression [3, 4, +, 6, /]> >>> f + 2 < Fraction 5 / 2> >>> print("\\n".join([repr(i) for i in (f+2).steps])) - < [1, 2, /, 2, +] > - < [1, 1, *, 2, 1, *, /, 2, 2, *, 1, 2, *, /, +] > - < [1, 2, /, 4, 2, /, +] > - < [< Fraction 1 / 2>, < Fraction 4 / 2>, +] > - < [1, 2, /, 4, 2, /, +] > - < [1, 4, +, 2, /] > + < Expression [1, 2, /, 2, +]> + < Expression [1, 1, *, 2, 1, *, /, 2, 2, *, 1, 2, *, /, +]> + < Expression [1, 2, /, 4, 2, /, +]> + < Expression [< Fraction 1 / 2>, < Fraction 4 / 2>, +]> + < Expression [1, 2, /, 4, 2, /, +]> + < Expression [1, 4, +, 2, /]> >>> f = Fraction(3, 4) >>> g = Fraction(5, 4) >>> f + g 2 >>> print("\\n".join([repr(i) for i in (f+g).steps])) - < [3, 4, /, 5, 4, /, +] > - < [3, 5, +, 4, /] > - < [8, 4, /] > + < Expression [3, 4, /, 5, 4, /, +]> + < Expression [3, 5, +, 4, /]> + < Expression [8, 4, /]> >>> f+0 < Fraction 3 / 4> >>> (f+0).steps @@ -214,12 +214,12 @@ class Fraction(Explicable): >>> f - g < Fraction -1 / 6> >>> print("\\n".join([repr(i) for i in (f-g).steps])) - < [1, 2, /, 2, 3, /, -] > - < [1, 3, *, 2, 3, *, /, 2, 2, *, 3, 2, *, /, -] > - < [3, 6, /, 4, 6, /, -] > - < [< Fraction 3 / 6>, < Fraction 4 / 6>, -] > - < [3, 6, /, 4, 6, /, -] > - < [3, 4, -, 6, /] > + < Expression [1, 2, /, 2, 3, /, -]> + < Expression [1, 3, *, 2, 3, *, /, 2, 2, *, 3, 2, *, /, -]> + < Expression [3, 6, /, 4, 6, /, -]> + < Expression [< Fraction 3 / 6>, < Fraction 4 / 6>, -]> + < Expression [3, 6, /, 4, 6, /, -]> + < Expression [3, 4, -, 6, /]> >>> f - 0 < Fraction 1 / 2> >>> (f-0).steps @@ -287,7 +287,7 @@ class Fraction(Explicable): >>> -f < Fraction 1 / 2> >>> (-f).steps - [< [-1, -2, /] >] + [< Expression [-1, -2, /]>] """ f = Fraction(-self._num, self._denom) @@ -303,24 +303,24 @@ class Fraction(Explicable): >>> f*g < Fraction 1 / 3> >>> print("\\n".join([repr(i) for i in (f*g).steps])) - < [< Fraction 1 / 2>, < Fraction 2 / 3>, *] > - < [1, 2, *, 2, 3, *, /] > - < [1, 3, /] > + < Expression [< Fraction 1 / 2>, < Fraction 2 / 3>, *]> + < Expression [1, 2, *, 2, 3, *, /]> + < Expression [1, 3, /]> >>> f * 0 0 >>> (f*0).steps - [< [< Fraction 1 / 2>, 0, *] >] + [< Expression [< Fraction 1 / 2>, 0, *]>] >>> f*1 < Fraction 1 / 2> >>> (f*1).steps - [< [< Fraction 1 / 2>, 1, *] >] + [< Expression [< Fraction 1 / 2>, 1, *]>] >>> f*4 2 >>> print("\\n".join([repr(i) for i in (f*4).steps])) - < [< Fraction 1 / 2>, 4, *] > - < [1, 2, *, 2, *, 1, 2, *, /] > - < [1, 2, *, 1, /] > - < [2, 1, /] > + < Expression [< Fraction 1 / 2>, 4, *]> + < Expression [1, 2, *, 2, *, 1, 2, *, /]> + < Expression [1, 2, *, 1, /]> + < Expression [2, 1, /]> """ steps = [Expression([self, other, op.mul])] @@ -437,26 +437,26 @@ class Fraction(Explicable): >>> f**0 1 >>> (f**0).steps - [< [< Fraction 3 / 4>, 0, ^] >] + [< Expression [< Fraction 3 / 4>, 0, ^]>] >>> f**1 < Fraction 3 / 4> >>> (f**1).steps - [< [< Fraction 3 / 4>, 1, ^] >] + [< Expression [< Fraction 3 / 4>, 1, ^]>] >>> f**3 < Fraction 27 / 64> >>> print("\\n".join([repr(i) for i in (f**3).steps])) - < [< Fraction 3 / 4>, 3, ^] > - < [3, 3, ^, 4, 3, ^, /] > - < [27, 64, /] > + < Expression [< Fraction 3 / 4>, 3, ^]> + < Expression [3, 3, ^, 4, 3, ^, /]> + < Expression [27, 64, /]> >>> f = Fraction(6, 4) >>> f**3 < Fraction 27 / 8> >>> print("\\n".join([repr(i) for i in (f**3).steps])) - < [< Fraction 6 / 4>, 3, ^] > - < [6, 3, ^, 4, 3, ^, /] > - < [216, 64, /] > - < [216, 64, /] > - < [27, 8, *, 8, 8, *, /] > + < Expression [< Fraction 6 / 4>, 3, ^]> + < Expression [6, 3, ^, 4, 3, ^, /]> + < Expression [216, 64, /]> + < Expression [216, 64, /]> + < Expression [27, 8, *, 8, 8, *, /]> """ if not isinstance(power, int): diff --git a/pymath/calculus/render.py b/pymath/calculus/render.py index 70459b6..e87560e 100644 --- a/pymath/calculus/render.py +++ b/pymath/calculus/render.py @@ -139,6 +139,12 @@ class Renderable(object): Renderable.set_render(self.old_render) return TmpRenderEnv() + def __repr__(self): + return "< {cls} {pstf_tokens}>".format( + cls = str(self.__class__).split('.')[-1][:-2], + pstf_tokens = str(self.postfix_tokens) + ) + def __eq__(self, other): """ Two Renderable objects are the same if they have same postfix_tokens """ try: