From b24069a72dd7aa0ecc68847d0b7831015c81dc77 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 1 Oct 2018 11:55:35 +0200 Subject: [PATCH] Fix(compute): split multiply between compute and type --- mapytex/calculus/core/compute/multiply.py | 64 ---------- mapytex/calculus/core/typing/multiply.py | 138 ++++++++++++++++++++++ 2 files changed, 138 insertions(+), 64 deletions(-) create mode 100644 mapytex/calculus/core/typing/multiply.py diff --git a/mapytex/calculus/core/compute/multiply.py b/mapytex/calculus/core/compute/multiply.py index f622695..08089aa 100644 --- a/mapytex/calculus/core/compute/multiply.py +++ b/mapytex/calculus/core/compute/multiply.py @@ -145,70 +145,6 @@ def mofraction_mofraction(left, right): denom = Tree("*", left.denominator, right.denominator) return Tree("/", num, denom) -@multiply.register((MOnumber, MOFraction), MOstr) -@special_case(multiply_filter) -def moscalar_mostr(left, right): - """ Multiply a scalar with a letter to create a MOMonomial - - >>> a = MOnumber(2) - >>> b = MOstr('x') - >>> multiply(a, b) - - >>> a = MOFraction(1, 5) - >>> multiply(a, b) - - """ - return MOMonomial(left, right) - -@multiply.register(MOstr, (MOnumber, MOFraction)) -@special_case(multiply_filter) -def mostr_moscalar(left, right): - """ Multiply a scalar with a letter to create a MOMonomial - - >>> a = MOstr('x') - >>> b = MOnumber(2) - >>> multiply(a, b) - - >>> b = MOFraction(1, 5) - >>> multiply(a, b) - - """ - return MOMonomial(right, left) - -@multiply.register((MOnumber, MOFraction), MOstrPower) -@special_case(multiply_filter) -def moscalar_mostrpower(left, right): - """ Multiply a scalar with a MOstrPower - - >>> a = MOnumber(4) - >>> x = MOstrPower('x', 4) - >>> print(multiply(a, x)) - * - > 4 - > ^ - | > x - | > 4 - - """ - return MOMonomial(left, right) - -@multiply.register(MOstrPower, (MOnumber, MOFraction)) -@special_case(multiply_filter) -def mostrpower_moscalar(left, right): - """ Multiply a MOstrPower with a scalar - - >>> a = MOnumber(4) - >>> x = MOstrPower('x', 4) - >>> print(multiply(x, a)) - * - > 4 - > ^ - | > x - | > 4 - - """ - return MOMonomial(right, left) - @multiply.register((MOnumber, MOFraction), MOMonomial) @special_case(multiply_filter) def moscalar_monomonial(left, right): diff --git a/mapytex/calculus/core/typing/multiply.py b/mapytex/calculus/core/typing/multiply.py new file mode 100644 index 0000000..6867150 --- /dev/null +++ b/mapytex/calculus/core/typing/multiply.py @@ -0,0 +1,138 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# +# Copyright © 2017 lafrite +# +# Distributed under terms of the MIT license. + +""" +Multiply MO with typing +""" + +from multipledispatch import Dispatcher +from ..tree import Tree +from ..MO.mo import MO, MOnumber, MOstr +from ..MO.fraction import MOFraction +from ..MO.monomial import MOstrPower, MOMonomial +from .exceptions import MultiplyError +from .filters import special_case + +multiply_doc = """ Multiply MOs + +:param left: left MO +:param right: right MO +:returns: Tree or MO + +""" + +multiply = Dispatcher("multiply", doc=multiply_doc) + +def multiply_filter(left, right): + """ Automatic multiply on MO + + :param left: MO + :param right: MO + :returns: MO if it is a special case, nothing other wise + + >>> a = MOnumber(1) + >>> b = MOFraction(1, 2) + >>> multiply(a, b) + + >>> multiply(b, a) + + >>> a = MOnumber(0) + >>> b = MOFraction(1, 2) + >>> multiply(a, b) + + """ + try: + if left == 0: + return left + except TypeError: + pass + try: + if right == 0: + return right + except TypeError: + pass + + try: + if left == 1: + return right + except TypeError: + pass + try: + if right == 1: + return left + except TypeError: + pass + +@multiply.register((MOnumber, MOFraction), MOstr) +@special_case(multiply_filter) +def moscalar_mostr(left, right): + """ Multiply a scalar with a letter to create a MOMonomial + + >>> a = MOnumber(2) + >>> b = MOstr('x') + >>> multiply(a, b) + + >>> a = MOFraction(1, 5) + >>> multiply(a, b) + + """ + return MOMonomial(left, right) + +@multiply.register(MOstr, (MOnumber, MOFraction)) +@special_case(multiply_filter) +def mostr_moscalar(left, right): + """ Multiply a scalar with a letter to create a MOMonomial + + >>> a = MOstr('x') + >>> b = MOnumber(2) + >>> multiply(a, b) + + >>> b = MOFraction(1, 5) + >>> multiply(a, b) + + """ + return MOMonomial(right, left) + +@multiply.register((MOnumber, MOFraction), MOstrPower) +@special_case(multiply_filter) +def moscalar_mostrpower(left, right): + """ Multiply a scalar with a MOstrPower + + >>> a = MOnumber(4) + >>> x = MOstrPower('x', 4) + >>> print(multiply(a, x)) + * + > 4 + > ^ + | > x + | > 4 + + """ + return MOMonomial(left, right) + +@multiply.register(MOstrPower, (MOnumber, MOFraction)) +@special_case(multiply_filter) +def mostrpower_moscalar(left, right): + """ Multiply a MOstrPower with a scalar + + >>> a = MOnumber(4) + >>> x = MOstrPower('x', 4) + >>> print(multiply(x, a)) + * + > 4 + > ^ + | > x + | > 4 + + """ + return MOMonomial(right, left) + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del