|
|
from sympy.core.numbers import oo, Infinity, NegativeInfinity from sympy.core.singleton import S from sympy.core import Basic, Expr from sympy.multipledispatch import Dispatcher from sympy.sets import Interval, FiniteSet
# XXX: The functions in this module are clearly not tested and are broken in a # number of ways.
_set_add = Dispatcher('_set_add') _set_sub = Dispatcher('_set_sub')
@_set_add.register(Basic, Basic) def _(x, y): return None
@_set_add.register(Expr, Expr) def _(x, y): return x+y
@_set_add.register(Interval, Interval) def _(x, y): """
Additions in interval arithmetic https://en.wikipedia.org/wiki/Interval_arithmetic """
return Interval(x.start + y.start, x.end + y.end, x.left_open or y.left_open, x.right_open or y.right_open)
@_set_add.register(Interval, Infinity) def _(x, y): if x.start is S.NegativeInfinity: return Interval(-oo, oo) return FiniteSet({S.Infinity})
@_set_add.register(Interval, NegativeInfinity) def _(x, y): if x.end is S.Infinity: return Interval(-oo, oo) return FiniteSet({S.NegativeInfinity})
@_set_sub.register(Basic, Basic) def _(x, y): return None
@_set_sub.register(Expr, Expr) def _(x, y): return x-y
@_set_sub.register(Interval, Interval) def _(x, y): """
Subtractions in interval arithmetic https://en.wikipedia.org/wiki/Interval_arithmetic """
return Interval(x.start - y.end, x.end - y.start, x.left_open or y.right_open, x.right_open or y.left_open)
@_set_sub.register(Interval, Infinity) def _(x, y): if x.start is S.NegativeInfinity: return Interval(-oo, oo) return FiniteSet(-oo)
@_set_sub.register(Interval, NegativeInfinity) def _(x, y): if x.start is S.NegativeInfinity: return Interval(-oo, oo) return FiniteSet(-oo)
|