Decorator for computing special cases

This commit is contained in:
2018-03-17 11:55:32 +03:00
parent f4422c6d1a
commit 3f3e52cdf8
4 changed files with 134 additions and 34 deletions

View File

@@ -15,7 +15,7 @@ from ..tree import Tree
from ..MO.mo import MO, MOnumber
from ..MO.fraction import MOFraction
from .exceptions import DivideError
from .type_filter import args_are
from .filters import special_case
divide_doc = """ Dividing MOs
@@ -27,7 +27,42 @@ divide_doc = """ Dividing MOs
divide = Dispatcher("divide", doc=divide_doc)
def divide_filter(left, right):
""" Automatic divide on MO
>>> a = MOnumber(4)
>>> b = MOnumber(1)
>>> divide(a, b)
<MOnumber 4>
>>> a = MOnumber(0)
>>> b = MOnumber(1)
>>> divide(a, b)
<MOnumber 0>
>>> a = MOnumber(4)
>>> b = MOnumber(0)
>>> divide(a, b)
Traceback (most recent call last):
...
mapytex.calculus.core.compute.exceptions.DivideError: Division by zero
"""
try:
if left == 0:
return left
except TypeError:
pass
try:
if right == 1:
return left
except TypeError:
pass
try:
if right == 0:
raise DivideError("Division by zero")
except TypeError:
pass
@divide.register(MOnumber, MOnumber)
@special_case(divide_filter)
def monumber_monumber(left, right):
""" Divide 2 monumbers and return a MOFraction
@@ -39,6 +74,7 @@ def monumber_monumber(left, right):
return MOFraction(left, right)
@divide.register(MOnumber, MOFraction)
@special_case(divide_filter)
def monumber_mofraction(left, right):
""" Divide a monumber and a mofraction by inverting MOFraction
@@ -63,6 +99,7 @@ def monumber_mofraction(left, right):
return Tree("*", left, right.inverse())
@divide.register(MOFraction, MOnumber)
@special_case(divide_filter)
def mofraction_monumber(left, right):
""" Divide a monumber and a mofraction by inverting MOnumber
@@ -82,6 +119,7 @@ def mofraction_monumber(left, right):
return Tree("*", left, right_fraction)
@divide.register(MOFraction, MOFraction)
@special_case(divide_filter)
def mofraction_mofraction(left, right):
""" Divide two mofractions by inverting right MOFraction
@@ -99,37 +137,6 @@ def mofraction_mofraction(left, right):
"""
return Tree("*", left, right.inverse())
#def divide(left, right):
# """ Perform the addition of left and right
#
# :param left: left MO
# :param right: right MO
# :returns: Tree or MO
#
# >>> a = MOnumber(4)
# >>> b = MOnumber(6)
# >>> divide(a, b)
# <MOFraction 4 / 6>
# >>> b = MOnumber(0)
# >>> divide(a, b)
# Traceback (most recent call last):
# ...
# mapytex.calculus.core.compute.exceptions.DivideError: Division by zero
#
# """
# try:
# right.value
# except AttributeError:
# pass
# else:
# if right.value == 0:
# raise DivideError("Division by zero")
#
# if right.value == 1:
# return left
#
# return MULFUNCTIONS[(type(left), type(right))](left, right)
# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4: