X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/4162c0430092e0ba2b8d8d62b5de24cdd71abe3b..ce8dda550018a59520e2d632f10d3fe5650e9d0d:/linpy/linexprs.py?ds=sidebyside diff --git a/linpy/linexprs.py b/linpy/linexprs.py index 3c00f22..ccfbbfa 100644 --- a/linpy/linexprs.py +++ b/linpy/linexprs.py @@ -20,14 +20,16 @@ import functools import numbers import re -from collections import OrderedDict, defaultdict, Mapping +from collections import defaultdict, Mapping, OrderedDict from fractions import Fraction, gcd __all__ = [ + 'Dummy', 'LinExpr', - 'Symbol', 'Dummy', 'symbols', 'Rational', + 'Symbol', + 'symbols', ] @@ -59,8 +61,8 @@ class LinExpr: def __new__(cls, coefficients=None, constant=0): """ Return a linear expression from a dictionary or a sequence, that maps - symbols to their coefficients, and a constant term. The coefficients and - the constant term must be rational numbers. + symbols to their coefficients, and a constant term. The coefficients + and the constant term must be rational numbers. For example, the linear expression x + 2*y + 1 can be constructed using one of the following instructions: @@ -79,9 +81,9 @@ class LinExpr: >>> LinExpr('x + 2y + 1') A linear expression with a single symbol of coefficient 1 and no - constant term is automatically subclassed as a Symbol instance. A linear - expression with no symbol, only a constant term, is automatically - subclassed as a Rational instance. + constant term is automatically subclassed as a Symbol instance. A + linear expression with no symbol, only a constant term, is + automatically subclassed as a Rational instance. """ if isinstance(coefficients, str): if constant != 0: @@ -105,8 +107,9 @@ class LinExpr: symbol, coefficient = coefficients[0] if coefficient == 1: return symbol - coefficients = [(symbol, Fraction(coefficient)) - for symbol, coefficient in coefficients if coefficient != 0] + coefficients = [(symbol_, Fraction(coefficient_)) + for symbol_, coefficient_ in coefficients + if coefficient_ != 0] coefficients.sort(key=lambda item: item[0].sortkey()) self = object().__new__(cls) self._coefficients = OrderedDict(coefficients) @@ -223,7 +226,8 @@ class LinExpr: Return the product of the linear expression by a rational. """ if isinstance(other, numbers.Rational): - coefficients = ((symbol, coefficient * other) + coefficients = ( + (symbol, coefficient * other) for symbol, coefficient in self._coefficients.items()) constant = self._constant * other return LinExpr(coefficients, constant) @@ -236,7 +240,8 @@ class LinExpr: Return the quotient of the linear expression by a rational. """ if isinstance(other, numbers.Rational): - coefficients = ((symbol, coefficient / other) + coefficients = ( + (symbol, coefficient / other) for symbol, coefficient in self._coefficients.items()) constant = self._constant / other return LinExpr(coefficients, constant) @@ -280,7 +285,7 @@ class LinExpr: make all values integer. """ lcd = functools.reduce(lambda a, b: a*b // gcd(a, b), - [value.denominator for value in self.values()]) + [value.denominator for value in self.values()]) return self * lcd def subs(self, symbol, expression=None): @@ -306,7 +311,7 @@ class LinExpr: for symbol in substitutions: if not isinstance(symbol, Symbol): raise TypeError('symbols must be Symbol instances') - result = self._constant + result = Rational(self._constant) for symbol, coefficient in self._coefficients.items(): expression = substitutions.get(symbol, symbol) result += coefficient * expression @@ -405,10 +410,12 @@ class LinExpr: symbol = Symbol(symbol.name) coefficients.append((symbol, coefficient)) else: - raise TypeError('non-linear expression: {!r}'.format(expression)) + raise TypeError('non-linear expression: {!r}'.format( + expression)) expression = LinExpr(coefficients, constant) if not isinstance(expression, cls): - raise TypeError('cannot convert to a {} instance'.format(cls.__name__)) + raise TypeError('cannot convert to a {} instance'.format( + cls.__name__)) return expression def tosympy(self):