From d72a2be175fd8892b052e6ee40ff69ba27129e0e Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Wed, 30 Oct 2019 21:12:58 +0100 Subject: [PATCH] Feat: Polynomial are displayed in nicer order! --- mapytex/calculus/API/__init__.py | 16 +++++++------ mapytex/calculus/API/expression.py | 4 ++-- mapytex/calculus/API/tokens/polynomial.py | 6 ++--- mapytex/calculus/API/tokens/token.py | 2 +- mapytex/calculus/core/MO/polynomial.py | 10 ++++---- mapytex/calculus/core/tree.py | 28 +++++++++++++++++++++-- mapytex/calculus/core/typing/add.py | 28 +++++++++++------------ 7 files changed, 61 insertions(+), 33 deletions(-) diff --git a/mapytex/calculus/API/__init__.py b/mapytex/calculus/API/__init__.py index bc39654..79ceb81 100644 --- a/mapytex/calculus/API/__init__.py +++ b/mapytex/calculus/API/__init__.py @@ -84,19 +84,20 @@ x^7 >>> e = Expression.from_str("1+2x^2+3x+4+5x") >>> e_simplified = e.simplify() >>> e_simplified - + >>> for s in e_simplified.explain(): ... print(s) 1 + 2x^2 + 3x + 4 + 5x -1 + 2x^2 + 3x + 4 + 5x -1 + 4 + 2x^2 + 3x + 5x -5 + 2x^2 + (3 + 5) * x -5 + 2x^2 + 8x +2x^2 + 3x + 1 + 4 + 5x +2x^2 + 3x + 5x + 1 + 4 +2x^2 + (3 + 5) * x + 5 +2x^2 + 8x + 5 + >>> e = Expression.from_str("(2x+3)^2") >>> e_simplified = e.simplify() >>> e_simplified - + >>> for s in e_simplified.explain(): ... print(s) (2x + 3)^2 @@ -105,7 +106,8 @@ x^7 2 * 2 * x^(1 + 1) + 3 * 2 * x + 3 * 2 * x + 9 6x + 6x + 4x^2 + 9 (6 + 6) * x + 4x^2 + 9 -12x + 4x^2 + 9 +4x^2 + 12x + 9 + """ diff --git a/mapytex/calculus/API/expression.py b/mapytex/calculus/API/expression.py index 7179f11..fe55096 100644 --- a/mapytex/calculus/API/expression.py +++ b/mapytex/calculus/API/expression.py @@ -104,7 +104,7 @@ class Expression(object): >>> e = Expression.from_str("2x + 1 + 5x^2") >>> e - + >>> e = Expression.from_str("2x + 1 + 5x") >>> e @@ -468,7 +468,7 @@ class Expression(object): >>> f("u_n") >>> f(f) - + """ tree = self._tree variable = (set(tree.get_leafs(extract_variable)) - {None}).pop() diff --git a/mapytex/calculus/API/tokens/polynomial.py b/mapytex/calculus/API/tokens/polynomial.py index e9d2616..4be7203 100644 --- a/mapytex/calculus/API/tokens/polynomial.py +++ b/mapytex/calculus/API/tokens/polynomial.py @@ -104,12 +104,12 @@ class Polynomial(Token): >>> P >>> P.differentiate() - + >>> for s in P.differentiate().explain(): ... print(s) 0 + 2 + 3 * 2x 2 + 3 * 2 * x - 2 + 6x + 6x + 2 """ return Expression(self._mo.differentiate()).simplify() @@ -212,7 +212,7 @@ class Quadratic(Polynomial): 4 - 12 - 8 >>> P.differentiate() - + >>> P.roots [] diff --git a/mapytex/calculus/API/tokens/token.py b/mapytex/calculus/API/tokens/token.py index d032112..8bb70b7 100644 --- a/mapytex/calculus/API/tokens/token.py +++ b/mapytex/calculus/API/tokens/token.py @@ -174,7 +174,7 @@ class Token(object): >>> a = Integer(3) >>> c = a - "x" >>> c - + """ return self._operate(other, "-") diff --git a/mapytex/calculus/core/MO/polynomial.py b/mapytex/calculus/core/MO/polynomial.py index dd74b92..73005c4 100644 --- a/mapytex/calculus/core/MO/polynomial.py +++ b/mapytex/calculus/core/MO/polynomial.py @@ -6,6 +6,7 @@ # # Distributed under terms of the MIT license. +from collections import OrderedDict from mapytex.calculus.core.tree import Tree from . import MO, MOstr from .mo import Molecule @@ -57,8 +58,9 @@ class MOpolynomial(Molecule): raise TypeError("Coefs needs to be a dictionnary or a list") self._coefs = _coefs - monomials = {} - for deg, coef in self._coefs.items(): + monomials = OrderedDict() + for deg in sorted(self._coefs.keys()): + coef = self._coefs[deg] if deg == 0: monomials[deg] = coef elif deg == 1 and coef == 1: @@ -120,9 +122,9 @@ class MOpolynomial(Molecule): :example: >>> p = MOpolynomial('x', [1, 2, 3]) >>> p.monomials - {: , : , : } + OrderedDict([(, ), (, ), (, )]) >>> p.monomials.values() - dict_values([, , ]) + odict_values([, , ]) """ return self._monomials diff --git a/mapytex/calculus/core/tree.py b/mapytex/calculus/core/tree.py index 3b38e4f..090cab0 100644 --- a/mapytex/calculus/core/tree.py +++ b/mapytex/calculus/core/tree.py @@ -77,13 +77,22 @@ class Tree: > * | > 3 | > n - >>> t = Tree.from_str("2+{n}*x", random=True) + >>> t = Tree.from_str("2+{n}x", random=True) >>> print(t) + > 2 > * | > {n} | > x + >>> t = Tree.from_str("{a}({b}x+{c})", random=True) + >>> print(t) + * + > {a} + > + + | > * + | | > {b} + | | > x + | > {c} """ @@ -954,7 +963,22 @@ class MutableTree(Tree): | | > 8 | | > 3 | > x - + >>> t = MutableTree.from_str("{b}*x+{c}", random=True) + >>> print(t) + + + > * + | > {b} + | > x + > {c} + >>> t = MutableTree.from_str("{a}*({b}*x+{c})", random=True) + >>> print(t) + * + > {a} + > + + | > * + | | > {b} + | | > x + | > {c} """ if random: str_2_mut_tree = rdstr2(cls.sink) diff --git a/mapytex/calculus/core/typing/add.py b/mapytex/calculus/core/typing/add.py index dc4842b..6daa038 100644 --- a/mapytex/calculus/core/typing/add.py +++ b/mapytex/calculus/core/typing/add.py @@ -95,10 +95,10 @@ def moscalar_momonomial(left, right): >>> a = MOnumber(2) >>> b = MOMonomial(3, 'x', 4) >>> add(a, b) - + >>> a = MOFraction(1, 5) >>> add(a, b) - + """ return MOpolynomial(right.variable, {right.power: right.coefficient, 0: left}) @@ -126,10 +126,10 @@ def moscalar_mopolynomial(left, right): >>> a = MOnumber(2) >>> b = MOpolynomial('x', [0, 2, 3]) >>> add(a, b) - + >>> a = MOFraction(1, 5) >>> add(a, b) - + """ if 0 in right.coefficients.keys(): raise NotImplementedError( @@ -237,7 +237,7 @@ def mostr_mopolynomial(left, right): >>> a = MOstr("x") >>> b = MOpolynomial('x', [1, 0, 3]) >>> add(a, b) - + """ if 1 in right.coefficients.keys(): raise NotImplementedError("Polynomial with no constant, calculus to do") @@ -255,7 +255,7 @@ def mopolynomial_mostr(left, right): >>> a = MOpolynomial('x', [1, 0, 3]) >>> b = MOstr("x") >>> add(a, b) - + """ if 1 in left.coefficients.keys(): raise NotImplementedError("Polynomial with no constant, calculus to do") @@ -272,7 +272,7 @@ def mostrpower_mopolynomial(left, right): >>> a = MOstrPower("x", 2) >>> b = MOpolynomial('x', [1, 2, 0, 4]) >>> add(a, b) - + """ if left.power in right.coefficients.keys(): raise NotImplementedError("Degree in common, need to compute") @@ -290,7 +290,7 @@ def mopolynomial_mostrpower(left, right): >>> a = MOpolynomial('x', [1, 2, 0, 4]) >>> b = MOstrPower("x", 2) >>> add(a, b) - + """ if right.power in left.coefficients.keys(): raise NotImplementedError("Degree in common, need to compute") @@ -307,7 +307,7 @@ def momonomial_mopolynomial(left, right): >>> a = MOMonomial(3, "x", 2) >>> b = MOpolynomial('x', [1, 2, 0, 4]) >>> add(a, b) - + """ if left.power in right.coefficients.keys(): raise NotImplementedError("Degree in common, need to compute") @@ -325,7 +325,7 @@ def mopolynomial_momonomial(left, right): >>> a = MOpolynomial('x', [1, 2, 0, 4]) >>> b = MOMonomial(3, "x", 2) >>> add(a, b) - + """ if right.power in left.coefficients.keys(): raise NotImplementedError("Degree in common, need to compute") @@ -342,9 +342,9 @@ def mopolynomial_mopolynomial(left, right): >>> a = MOpolynomial('x', [1, 0, 3]) >>> b = MOpolynomial('x', [0, 2, 0, 4]) >>> add(a, b) - + >>> add(b, a) - + """ common_degree = set(left.monomials.keys()).intersection(right.monomials.keys()) if common_degree: @@ -361,7 +361,7 @@ def mostr_monomial(left, right): >>> a = MOstr('x') >>> b = MOMonomial(3, 'x', 4) >>> add(a, b) - + """ if right.power == 1: raise NotImplementedError("Monomial is deg 1, need to compute") @@ -391,7 +391,7 @@ def mostrpower_monomial(left, right): >>> a = MOstrPower('x', 2) >>> b = MOMonomial(3, 'x', 4) >>> add(a, b) - + """ if left.power == right.power: raise NotImplementedError(