#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2017 lafrite # # Distributed under terms of the MIT license. """ Add MO with typing """ from multipledispatch import Dispatcher from ..tree import Tree from ..MO.mo import MO, MOnumber, MOstr from ..MO.monomial import MOstrPower, MOMonomial from ..MO.polynomial import MOpolynomial from ..MO.fraction import MOFraction add_doc = """ Add MOs :param left: left MO :param right: right MO :returns: Tree or MO """ add = Dispatcher("add", doc=add_doc) @add.register((MOnumber, MOFraction), MOstr) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOnumber(2) >>> b = MOstr('x') >>> add(a, b) >>> a = MOFraction(1, 5) >>> add(a, b) """ return MOpolynomial(right, [left, 1]) @add.register(MOstr, (MOnumber, MOFraction)) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOstr('x') >>> b = MOnumber(2) >>> add(a, b) >>> b = MOFraction(1, 5) >>> add(a, b) """ return MOpolynomial(left, [right, 1]) @add.register((MOnumber, MOFraction), MOstrPower) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOnumber(2) >>> b = MOstrPower('x', 3) >>> add(a, b) >>> a = MOFraction(1, 5) >>> add(a, b) """ return MOpolynomial(right.variable, {0: left, right.power: 1}) @add.register(MOstrPower, (MOnumber, MOFraction)) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOstrPower('x', 3) >>> b = MOnumber(2) >>> add(a, b) >>> b = MOFraction(1, 5) >>> add(a, b) """ return MOpolynomial(left.variable, {0: right, left.power: 1}) @add.register((MOnumber, MOFraction), MOMonomial) def moscalar_mostr(left, right): """ add a scalar with a MOMonomial to create a MOpolynomial >>> a = MOnumber(2) >>> b = MOMonomial(3, 'x', 4) >>> add(a, b) >>> a = MOFraction(1, 5) >>> add(a, b) """ return MOpolynomial(right.variable, {0: left, right.power: right.coefficient} ) @add.register(MOMonomial, (MOnumber, MOFraction)) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOMonomial(3, 'x', 4) >>> b = MOnumber(2) >>> add(a, b) >>> b = MOFraction(1, 5) >>> add(a, b) """ return MOpolynomial(left.variable, {0: right, left.power: left.coeffient} ) @add.register(MOstr, MOstrPower) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOstr('x') >>> b = MOstrPower('x', 3) >>> add(a, b) >>> b = MOstrPower('x', 2) >>> add(a, b) """ if left != right.variable: raise return MOpolynomial(left , {1: 1, right.power: 1}) @add.register(MOstrPower, MOstr) def moscalar_mostr(left, right): """ add a scalar with a letter to create a MOpolynomial >>> a = MOstrPower('x', 3) >>> b = MOstr('x') >>> add(a, b) >>> a = MOstrPower('x', 2) >>> add(a, b) """ if right != left.variable: raise return MOpolynomial(right , {1: 1, left.power: 1}) # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: # cursor: 16 del