80 lines
1.8 KiB
Python
80 lines
1.8 KiB
Python
|
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)
|