"""
if not isinstance(symbol, Symbol):
raise TypeError('symbol must be a Symbol instance')
- return Rational(self._coefficients.get(symbol, 0))
+ return self._coefficients.get(symbol, Fraction(0))
__getitem__ = coefficient
Iterate over the pairs (symbol, value) of linear terms in the
expression. The constant term is ignored.
"""
- for symbol, coefficient in self._coefficients.items():
- yield symbol, Rational(coefficient)
+ yield from self._coefficients.items()
@property
def constant(self):
"""
The constant term of the expression.
"""
- return Rational(self._constant)
+ return self._constant
@property
def symbols(self):
Iterate over the coefficient values in the expression, and the constant
term.
"""
- for coefficient in self._coefficients.values():
- yield Rational(coefficient)
- yield Rational(self._constant)
+ yield from self._coefficients.values()
+ yield self._constant
def __bool__(self):
return True
@classmethod
def fromsympy(cls, expr):
"""
- Create a linear expression from a sympy expression. Raise ValueError is
+ Create a linear expression from a sympy expression. Raise TypeError is
the sympy expression is not linear.
"""
import sympy
coefficient = Fraction(coefficient.p, coefficient.q)
if symbol == sympy.S.One:
constant = coefficient
+ elif isinstance(symbol, sympy.Dummy):
+ # we cannot properly convert dummy symbols
+ raise TypeError('cannot convert dummy symbols')
elif isinstance(symbol, sympy.Symbol):
symbol = Symbol(symbol.name)
coefficients.append((symbol, coefficient))
else:
- raise ValueError('non-linear expression: {!r}'.format(expr))
- return LinExpr(coefficients, constant)
+ raise TypeError('non-linear expression: {!r}'.format(expr))
+ expr = LinExpr(coefficients, constant)
+ if not isinstance(expr, cls):
+ raise TypeError('cannot convert to a {} instance'.format(cls.__name__))
+ return expr
def tosympy(self):
"""
def _repr_latex_(self):
return '$${}$$'.format(self.name)
- @classmethod
- def fromsympy(cls, expr):
- import sympy
- if isinstance(expr, sympy.Dummy):
- return Dummy(expr.name)
- elif isinstance(expr, sympy.Symbol):
- return Symbol(expr.name)
- else:
- raise TypeError('expr must be a sympy.Symbol instance')
-
def symbols(names):
"""
else:
return '$$\\frac{{{}}}{{{}}}$$'.format(self.numerator,
self.denominator)
-
- @classmethod
- def fromsympy(cls, expr):
- import sympy
- if isinstance(expr, sympy.Rational):
- return Rational(expr.p, expr.q)
- elif isinstance(expr, numbers.Rational):
- return Rational(expr)
- else:
- raise TypeError('expr must be a sympy.Rational instance')