From 78e781be62c416f6045606c77ea5f255c69254f8 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 8 Oct 2018 17:57:17 +0200 Subject: [PATCH] Feat(compute): Start compute with power --- mapytex/calculus/core/compute/__init__.py | 8 +- mapytex/calculus/core/compute/power.py | 91 +++++++++++++++++++++++ 2 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 mapytex/calculus/core/compute/power.py diff --git a/mapytex/calculus/core/compute/__init__.py b/mapytex/calculus/core/compute/__init__.py index 3ea9ff6..1b7f10d 100644 --- a/mapytex/calculus/core/compute/__init__.py +++ b/mapytex/calculus/core/compute/__init__.py @@ -12,9 +12,10 @@ Computing with MO from .exceptions import ComputeError from .add import add +from .divide import divide from .minus import minus from .multiply import multiply -from .divide import divide +from .power import power from ..MO.mo import MOnumber, MOstr from ..MO.fraction import MOFraction @@ -26,10 +27,11 @@ from tabulate import tabulate MOS = [ MOnumber, MOstr, MOFraction, MOstrPower, MOMonomial ] OPERATIONS = { - "+": add, - "-": minus, + "+": add, + "-": minus, "*": multiply, "/": divide, + "^": power, } def compute(node, left_v, right_v): diff --git a/mapytex/calculus/core/compute/power.py b/mapytex/calculus/core/compute/power.py new file mode 100644 index 0000000..89522ef --- /dev/null +++ b/mapytex/calculus/core/compute/power.py @@ -0,0 +1,91 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# +# Copyright © 2017 lafrite +# +# Distributed under terms of the MIT license. + +""" +Power with MO +""" + +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 .filters import special_case + +power_doc = """ Power of MOs + +:param left: left MO +:param right: right MO +:returns: Tree or MO + +""" + +power = Dispatcher("power", doc=power_doc) + +def power_filter(left, right): + """ Automatic power on MO + + :param left: MO + :param right: MO + :returns: MO if it is a special case, nothing other wise + + >>> a = MOnumber(5) + >>> b = MOnumber(1) + >>> power(a, b) + + >>> a = MOnumber(5) + >>> b = MOnumber(0) + >>> power(a, b) + + >>> a = MOFraction(1, 2) + >>> b = MOnumber(1) + >>> power(a, b) + + >>> a = MOFraction(1, 2) + >>> b = MOnumber(0) + >>> power(a, b) + + """ + try: + if right == 0: + return MOnumber(1) + elif right == 1: + return left + except TypeError: + pass + +@power.register(MOnumber, MOnumber) +@special_case(power_filter) +def monumber_monumber(left, right): + """ Simply power values + + >>> a = MOnumber(4) + >>> b = MOnumber(6) + >>> power(a, b) + + + """ + return MO.factory(left.value ** right.value) + +@power.register(MOFraction, MOnumber) +@special_case(power_filter) +def mofraction_monumber(left, right): + """ Return division Tree with on the numertor MOnumber times numerator of MOFraction + + >>> a = MOFraction(3, 2) + >>> b = MOnumber(2) + >>> print(power(a, b)) + """ + raise NotImplementedError + + + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del