add read me
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,415 @@
|
||||
from sympy.external import import_module
|
||||
from sympy.plotting.intervalmath import (
|
||||
Abs, acos, acosh, And, asin, asinh, atan, atanh, ceil, cos, cosh,
|
||||
exp, floor, imax, imin, interval, log, log10, Or, sin, sinh, sqrt,
|
||||
tan, tanh,
|
||||
)
|
||||
|
||||
np = import_module('numpy')
|
||||
if not np:
|
||||
disabled = True
|
||||
|
||||
|
||||
#requires Numpy. Hence included in interval_functions
|
||||
|
||||
|
||||
def test_interval_pow():
|
||||
a = 2**interval(1, 2) == interval(2, 4)
|
||||
assert a == (True, True)
|
||||
a = interval(1, 2)**interval(1, 2) == interval(1, 4)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, 1)**interval(0.5, 2)
|
||||
assert a.is_valid is None
|
||||
a = interval(-2, -1) ** interval(1, 2)
|
||||
assert a.is_valid is False
|
||||
a = interval(-2, -1) ** (1.0 / 2)
|
||||
assert a.is_valid is False
|
||||
a = interval(-1, 1)**(1.0 / 2)
|
||||
assert a.is_valid is None
|
||||
a = interval(-1, 1)**(1.0 / 3) == interval(-1, 1)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, 1)**2 == interval(0, 1)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, 1) ** (1.0 / 29) == interval(-1, 1)
|
||||
assert a == (True, True)
|
||||
a = -2**interval(1, 1) == interval(-2, -2)
|
||||
assert a == (True, True)
|
||||
|
||||
a = interval(1, 2, is_valid=False)**2
|
||||
assert a.is_valid is False
|
||||
|
||||
a = (-3)**interval(1, 2)
|
||||
assert a.is_valid is False
|
||||
a = (-4)**interval(0.5, 0.5)
|
||||
assert a.is_valid is False
|
||||
assert ((-3)**interval(1, 1) == interval(-3, -3)) == (True, True)
|
||||
|
||||
a = interval(8, 64)**(2.0 / 3)
|
||||
assert abs(a.start - 4) < 1e-10 # eps
|
||||
assert abs(a.end - 16) < 1e-10
|
||||
a = interval(-8, 64)**(2.0 / 3)
|
||||
assert abs(a.start - 4) < 1e-10 # eps
|
||||
assert abs(a.end - 16) < 1e-10
|
||||
|
||||
|
||||
def test_exp():
|
||||
a = exp(interval(-np.inf, 0))
|
||||
assert a.start == np.exp(-np.inf)
|
||||
assert a.end == np.exp(0)
|
||||
a = exp(interval(1, 2))
|
||||
assert a.start == np.exp(1)
|
||||
assert a.end == np.exp(2)
|
||||
a = exp(1)
|
||||
assert a.start == np.exp(1)
|
||||
assert a.end == np.exp(1)
|
||||
|
||||
|
||||
def test_log():
|
||||
a = log(interval(1, 2))
|
||||
assert a.start == 0
|
||||
assert a.end == np.log(2)
|
||||
a = log(interval(-1, 1))
|
||||
assert a.is_valid is None
|
||||
a = log(interval(-3, -1))
|
||||
assert a.is_valid is False
|
||||
a = log(-3)
|
||||
assert a.is_valid is False
|
||||
a = log(2)
|
||||
assert a.start == np.log(2)
|
||||
assert a.end == np.log(2)
|
||||
|
||||
|
||||
def test_log10():
|
||||
a = log10(interval(1, 2))
|
||||
assert a.start == 0
|
||||
assert a.end == np.log10(2)
|
||||
a = log10(interval(-1, 1))
|
||||
assert a.is_valid is None
|
||||
a = log10(interval(-3, -1))
|
||||
assert a.is_valid is False
|
||||
a = log10(-3)
|
||||
assert a.is_valid is False
|
||||
a = log10(2)
|
||||
assert a.start == np.log10(2)
|
||||
assert a.end == np.log10(2)
|
||||
|
||||
|
||||
def test_atan():
|
||||
a = atan(interval(0, 1))
|
||||
assert a.start == np.arctan(0)
|
||||
assert a.end == np.arctan(1)
|
||||
a = atan(1)
|
||||
assert a.start == np.arctan(1)
|
||||
assert a.end == np.arctan(1)
|
||||
|
||||
|
||||
def test_sin():
|
||||
a = sin(interval(0, np.pi / 4))
|
||||
assert a.start == np.sin(0)
|
||||
assert a.end == np.sin(np.pi / 4)
|
||||
|
||||
a = sin(interval(-np.pi / 4, np.pi / 4))
|
||||
assert a.start == np.sin(-np.pi / 4)
|
||||
assert a.end == np.sin(np.pi / 4)
|
||||
|
||||
a = sin(interval(np.pi / 4, 3 * np.pi / 4))
|
||||
assert a.start == np.sin(np.pi / 4)
|
||||
assert a.end == 1
|
||||
|
||||
a = sin(interval(7 * np.pi / 6, 7 * np.pi / 4))
|
||||
assert a.start == -1
|
||||
assert a.end == np.sin(7 * np.pi / 6)
|
||||
|
||||
a = sin(interval(0, 3 * np.pi))
|
||||
assert a.start == -1
|
||||
assert a.end == 1
|
||||
|
||||
a = sin(interval(np.pi / 3, 7 * np.pi / 4))
|
||||
assert a.start == -1
|
||||
assert a.end == 1
|
||||
|
||||
a = sin(np.pi / 4)
|
||||
assert a.start == np.sin(np.pi / 4)
|
||||
assert a.end == np.sin(np.pi / 4)
|
||||
|
||||
a = sin(interval(1, 2, is_valid=False))
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_cos():
|
||||
a = cos(interval(0, np.pi / 4))
|
||||
assert a.start == np.cos(np.pi / 4)
|
||||
assert a.end == 1
|
||||
|
||||
a = cos(interval(-np.pi / 4, np.pi / 4))
|
||||
assert a.start == np.cos(-np.pi / 4)
|
||||
assert a.end == 1
|
||||
|
||||
a = cos(interval(np.pi / 4, 3 * np.pi / 4))
|
||||
assert a.start == np.cos(3 * np.pi / 4)
|
||||
assert a.end == np.cos(np.pi / 4)
|
||||
|
||||
a = cos(interval(3 * np.pi / 4, 5 * np.pi / 4))
|
||||
assert a.start == -1
|
||||
assert a.end == np.cos(3 * np.pi / 4)
|
||||
|
||||
a = cos(interval(0, 3 * np.pi))
|
||||
assert a.start == -1
|
||||
assert a.end == 1
|
||||
|
||||
a = cos(interval(- np.pi / 3, 5 * np.pi / 4))
|
||||
assert a.start == -1
|
||||
assert a.end == 1
|
||||
|
||||
a = cos(interval(1, 2, is_valid=False))
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_tan():
|
||||
a = tan(interval(0, np.pi / 4))
|
||||
assert a.start == 0
|
||||
# must match lib_interval definition of tan:
|
||||
assert a.end == np.sin(np.pi / 4)/np.cos(np.pi / 4)
|
||||
|
||||
a = tan(interval(np.pi / 4, 3 * np.pi / 4))
|
||||
#discontinuity
|
||||
assert a.is_valid is None
|
||||
|
||||
|
||||
def test_sqrt():
|
||||
a = sqrt(interval(1, 4))
|
||||
assert a.start == 1
|
||||
assert a.end == 2
|
||||
|
||||
a = sqrt(interval(0.01, 1))
|
||||
assert a.start == np.sqrt(0.01)
|
||||
assert a.end == 1
|
||||
|
||||
a = sqrt(interval(-1, 1))
|
||||
assert a.is_valid is None
|
||||
|
||||
a = sqrt(interval(-3, -1))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = sqrt(4)
|
||||
assert (a == interval(2, 2)) == (True, True)
|
||||
|
||||
a = sqrt(-3)
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_imin():
|
||||
a = imin(interval(1, 3), interval(2, 5), interval(-1, 3))
|
||||
assert a.start == -1
|
||||
assert a.end == 3
|
||||
|
||||
a = imin(-2, interval(1, 4))
|
||||
assert a.start == -2
|
||||
assert a.end == -2
|
||||
|
||||
a = imin(5, interval(3, 4), interval(-2, 2, is_valid=False))
|
||||
assert a.start == 3
|
||||
assert a.end == 4
|
||||
|
||||
|
||||
def test_imax():
|
||||
a = imax(interval(-2, 2), interval(2, 7), interval(-3, 9))
|
||||
assert a.start == 2
|
||||
assert a.end == 9
|
||||
|
||||
a = imax(8, interval(1, 4))
|
||||
assert a.start == 8
|
||||
assert a.end == 8
|
||||
|
||||
a = imax(interval(1, 2), interval(3, 4), interval(-2, 2, is_valid=False))
|
||||
assert a.start == 3
|
||||
assert a.end == 4
|
||||
|
||||
|
||||
def test_sinh():
|
||||
a = sinh(interval(-1, 1))
|
||||
assert a.start == np.sinh(-1)
|
||||
assert a.end == np.sinh(1)
|
||||
|
||||
a = sinh(1)
|
||||
assert a.start == np.sinh(1)
|
||||
assert a.end == np.sinh(1)
|
||||
|
||||
|
||||
def test_cosh():
|
||||
a = cosh(interval(1, 2))
|
||||
assert a.start == np.cosh(1)
|
||||
assert a.end == np.cosh(2)
|
||||
a = cosh(interval(-2, -1))
|
||||
assert a.start == np.cosh(-1)
|
||||
assert a.end == np.cosh(-2)
|
||||
|
||||
a = cosh(interval(-2, 1))
|
||||
assert a.start == 1
|
||||
assert a.end == np.cosh(-2)
|
||||
|
||||
a = cosh(1)
|
||||
assert a.start == np.cosh(1)
|
||||
assert a.end == np.cosh(1)
|
||||
|
||||
|
||||
def test_tanh():
|
||||
a = tanh(interval(-3, 3))
|
||||
assert a.start == np.tanh(-3)
|
||||
assert a.end == np.tanh(3)
|
||||
|
||||
a = tanh(3)
|
||||
assert a.start == np.tanh(3)
|
||||
assert a.end == np.tanh(3)
|
||||
|
||||
|
||||
def test_asin():
|
||||
a = asin(interval(-0.5, 0.5))
|
||||
assert a.start == np.arcsin(-0.5)
|
||||
assert a.end == np.arcsin(0.5)
|
||||
|
||||
a = asin(interval(-1.5, 1.5))
|
||||
assert a.is_valid is None
|
||||
a = asin(interval(-2, -1.5))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = asin(interval(0, 2))
|
||||
assert a.is_valid is None
|
||||
|
||||
a = asin(interval(2, 5))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = asin(0.5)
|
||||
assert a.start == np.arcsin(0.5)
|
||||
assert a.end == np.arcsin(0.5)
|
||||
|
||||
a = asin(1.5)
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_acos():
|
||||
a = acos(interval(-0.5, 0.5))
|
||||
assert a.start == np.arccos(0.5)
|
||||
assert a.end == np.arccos(-0.5)
|
||||
|
||||
a = acos(interval(-1.5, 1.5))
|
||||
assert a.is_valid is None
|
||||
a = acos(interval(-2, -1.5))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = acos(interval(0, 2))
|
||||
assert a.is_valid is None
|
||||
|
||||
a = acos(interval(2, 5))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = acos(0.5)
|
||||
assert a.start == np.arccos(0.5)
|
||||
assert a.end == np.arccos(0.5)
|
||||
|
||||
a = acos(1.5)
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_ceil():
|
||||
a = ceil(interval(0.2, 0.5))
|
||||
assert a.start == 1
|
||||
assert a.end == 1
|
||||
|
||||
a = ceil(interval(0.5, 1.5))
|
||||
assert a.start == 1
|
||||
assert a.end == 2
|
||||
assert a.is_valid is None
|
||||
|
||||
a = ceil(interval(-5, 5))
|
||||
assert a.is_valid is None
|
||||
|
||||
a = ceil(5.4)
|
||||
assert a.start == 6
|
||||
assert a.end == 6
|
||||
|
||||
|
||||
def test_floor():
|
||||
a = floor(interval(0.2, 0.5))
|
||||
assert a.start == 0
|
||||
assert a.end == 0
|
||||
|
||||
a = floor(interval(0.5, 1.5))
|
||||
assert a.start == 0
|
||||
assert a.end == 1
|
||||
assert a.is_valid is None
|
||||
|
||||
a = floor(interval(-5, 5))
|
||||
assert a.is_valid is None
|
||||
|
||||
a = floor(5.4)
|
||||
assert a.start == 5
|
||||
assert a.end == 5
|
||||
|
||||
|
||||
def test_asinh():
|
||||
a = asinh(interval(1, 2))
|
||||
assert a.start == np.arcsinh(1)
|
||||
assert a.end == np.arcsinh(2)
|
||||
|
||||
a = asinh(0.5)
|
||||
assert a.start == np.arcsinh(0.5)
|
||||
assert a.end == np.arcsinh(0.5)
|
||||
|
||||
|
||||
def test_acosh():
|
||||
a = acosh(interval(3, 5))
|
||||
assert a.start == np.arccosh(3)
|
||||
assert a.end == np.arccosh(5)
|
||||
|
||||
a = acosh(interval(0, 3))
|
||||
assert a.is_valid is None
|
||||
a = acosh(interval(-3, 0.5))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = acosh(0.5)
|
||||
assert a.is_valid is False
|
||||
|
||||
a = acosh(2)
|
||||
assert a.start == np.arccosh(2)
|
||||
assert a.end == np.arccosh(2)
|
||||
|
||||
|
||||
def test_atanh():
|
||||
a = atanh(interval(-0.5, 0.5))
|
||||
assert a.start == np.arctanh(-0.5)
|
||||
assert a.end == np.arctanh(0.5)
|
||||
|
||||
a = atanh(interval(0, 3))
|
||||
assert a.is_valid is None
|
||||
|
||||
a = atanh(interval(-3, -2))
|
||||
assert a.is_valid is False
|
||||
|
||||
a = atanh(0.5)
|
||||
assert a.start == np.arctanh(0.5)
|
||||
assert a.end == np.arctanh(0.5)
|
||||
|
||||
a = atanh(1.5)
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_Abs():
|
||||
assert (Abs(interval(-0.5, 0.5)) == interval(0, 0.5)) == (True, True)
|
||||
assert (Abs(interval(-3, -2)) == interval(2, 3)) == (True, True)
|
||||
assert (Abs(-3) == interval(3, 3)) == (True, True)
|
||||
|
||||
|
||||
def test_And():
|
||||
args = [(True, True), (True, False), (True, None)]
|
||||
assert And(*args) == (True, False)
|
||||
|
||||
args = [(False, True), (None, None), (True, True)]
|
||||
assert And(*args) == (False, None)
|
||||
|
||||
|
||||
def test_Or():
|
||||
args = [(True, True), (True, False), (False, None)]
|
||||
assert Or(*args) == (True, True)
|
||||
args = [(None, None), (False, None), (False, False)]
|
||||
assert Or(*args) == (None, None)
|
||||
@@ -0,0 +1,150 @@
|
||||
from sympy.core.symbol import Symbol
|
||||
from sympy.plotting.intervalmath import interval
|
||||
from sympy.plotting.intervalmath.interval_membership import intervalMembership
|
||||
from sympy.plotting.experimental_lambdify import experimental_lambdify
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
|
||||
def test_creation():
|
||||
assert intervalMembership(True, True)
|
||||
raises(TypeError, lambda: intervalMembership(True))
|
||||
raises(TypeError, lambda: intervalMembership(True, True, True))
|
||||
|
||||
|
||||
def test_getitem():
|
||||
a = intervalMembership(True, False)
|
||||
assert a[0] is True
|
||||
assert a[1] is False
|
||||
raises(IndexError, lambda: a[2])
|
||||
|
||||
|
||||
def test_str():
|
||||
a = intervalMembership(True, False)
|
||||
assert str(a) == 'intervalMembership(True, False)'
|
||||
assert repr(a) == 'intervalMembership(True, False)'
|
||||
|
||||
|
||||
def test_equivalence():
|
||||
a = intervalMembership(True, True)
|
||||
b = intervalMembership(True, False)
|
||||
assert (a == b) is False
|
||||
assert (a != b) is True
|
||||
|
||||
a = intervalMembership(True, False)
|
||||
b = intervalMembership(True, False)
|
||||
assert (a == b) is True
|
||||
assert (a != b) is False
|
||||
|
||||
|
||||
def test_not():
|
||||
x = Symbol('x')
|
||||
|
||||
r1 = x > -1
|
||||
r2 = x <= -1
|
||||
|
||||
i = interval
|
||||
|
||||
f1 = experimental_lambdify((x,), r1)
|
||||
f2 = experimental_lambdify((x,), r2)
|
||||
|
||||
tt = i(-0.1, 0.1, is_valid=True)
|
||||
tn = i(-0.1, 0.1, is_valid=None)
|
||||
tf = i(-0.1, 0.1, is_valid=False)
|
||||
|
||||
assert f1(tt) == ~f2(tt)
|
||||
assert f1(tn) == ~f2(tn)
|
||||
assert f1(tf) == ~f2(tf)
|
||||
|
||||
nt = i(0.9, 1.1, is_valid=True)
|
||||
nn = i(0.9, 1.1, is_valid=None)
|
||||
nf = i(0.9, 1.1, is_valid=False)
|
||||
|
||||
assert f1(nt) == ~f2(nt)
|
||||
assert f1(nn) == ~f2(nn)
|
||||
assert f1(nf) == ~f2(nf)
|
||||
|
||||
ft = i(1.9, 2.1, is_valid=True)
|
||||
fn = i(1.9, 2.1, is_valid=None)
|
||||
ff = i(1.9, 2.1, is_valid=False)
|
||||
|
||||
assert f1(ft) == ~f2(ft)
|
||||
assert f1(fn) == ~f2(fn)
|
||||
assert f1(ff) == ~f2(ff)
|
||||
|
||||
|
||||
def test_boolean():
|
||||
# There can be 9*9 test cases in full mapping of the cartesian product.
|
||||
# But we only consider 3*3 cases for simplicity.
|
||||
s = [
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(True, True)
|
||||
]
|
||||
|
||||
# Reduced tests for 'And'
|
||||
a1 = [
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(True, True)
|
||||
]
|
||||
a1_iter = iter(a1)
|
||||
for i in range(len(s)):
|
||||
for j in range(len(s)):
|
||||
assert s[i] & s[j] == next(a1_iter)
|
||||
|
||||
# Reduced tests for 'Or'
|
||||
a1 = [
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(None, False),
|
||||
intervalMembership(True, False),
|
||||
intervalMembership(None, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(True, None),
|
||||
intervalMembership(True, False),
|
||||
intervalMembership(True, None),
|
||||
intervalMembership(True, True)
|
||||
]
|
||||
a1_iter = iter(a1)
|
||||
for i in range(len(s)):
|
||||
for j in range(len(s)):
|
||||
assert s[i] | s[j] == next(a1_iter)
|
||||
|
||||
# Reduced tests for 'Xor'
|
||||
a1 = [
|
||||
intervalMembership(False, False),
|
||||
intervalMembership(None, False),
|
||||
intervalMembership(True, False),
|
||||
intervalMembership(None, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(True, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(False, True)
|
||||
]
|
||||
a1_iter = iter(a1)
|
||||
for i in range(len(s)):
|
||||
for j in range(len(s)):
|
||||
assert s[i] ^ s[j] == next(a1_iter)
|
||||
|
||||
# Reduced tests for 'Not'
|
||||
a1 = [
|
||||
intervalMembership(True, False),
|
||||
intervalMembership(None, None),
|
||||
intervalMembership(False, True)
|
||||
]
|
||||
a1_iter = iter(a1)
|
||||
for i in range(len(s)):
|
||||
assert ~s[i] == next(a1_iter)
|
||||
|
||||
|
||||
def test_boolean_errors():
|
||||
a = intervalMembership(True, True)
|
||||
raises(ValueError, lambda: a & 1)
|
||||
raises(ValueError, lambda: a | 1)
|
||||
raises(ValueError, lambda: a ^ 1)
|
||||
@@ -0,0 +1,213 @@
|
||||
from sympy.plotting.intervalmath import interval
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
|
||||
def test_interval():
|
||||
assert (interval(1, 1) == interval(1, 1, is_valid=True)) == (True, True)
|
||||
assert (interval(1, 1) == interval(1, 1, is_valid=False)) == (True, False)
|
||||
assert (interval(1, 1) == interval(1, 1, is_valid=None)) == (True, None)
|
||||
assert (interval(1, 1.5) == interval(1, 2)) == (None, True)
|
||||
assert (interval(0, 1) == interval(2, 3)) == (False, True)
|
||||
assert (interval(0, 1) == interval(1, 2)) == (None, True)
|
||||
assert (interval(1, 2) != interval(1, 2)) == (False, True)
|
||||
assert (interval(1, 3) != interval(2, 3)) == (None, True)
|
||||
assert (interval(1, 3) != interval(-5, -3)) == (True, True)
|
||||
assert (
|
||||
interval(1, 3, is_valid=False) != interval(-5, -3)) == (True, False)
|
||||
assert (interval(1, 3, is_valid=None) != interval(-5, 3)) == (None, None)
|
||||
assert (interval(4, 4) != 4) == (False, True)
|
||||
assert (interval(1, 1) == 1) == (True, True)
|
||||
assert (interval(1, 3, is_valid=False) == interval(1, 3)) == (True, False)
|
||||
assert (interval(1, 3, is_valid=None) == interval(1, 3)) == (True, None)
|
||||
inter = interval(-5, 5)
|
||||
assert (interval(inter) == interval(-5, 5)) == (True, True)
|
||||
assert inter.width == 10
|
||||
assert 0 in inter
|
||||
assert -5 in inter
|
||||
assert 5 in inter
|
||||
assert interval(0, 3) in inter
|
||||
assert interval(-6, 2) not in inter
|
||||
assert -5.05 not in inter
|
||||
assert 5.3 not in inter
|
||||
interb = interval(-float('inf'), float('inf'))
|
||||
assert 0 in inter
|
||||
assert inter in interb
|
||||
assert interval(0, float('inf')) in interb
|
||||
assert interval(-float('inf'), 5) in interb
|
||||
assert interval(-1e50, 1e50) in interb
|
||||
assert (
|
||||
-interval(-1, -2, is_valid=False) == interval(1, 2)) == (True, False)
|
||||
raises(ValueError, lambda: interval(1, 2, 3))
|
||||
|
||||
|
||||
def test_interval_add():
|
||||
assert (interval(1, 2) + interval(2, 3) == interval(3, 5)) == (True, True)
|
||||
assert (1 + interval(1, 2) == interval(2, 3)) == (True, True)
|
||||
assert (interval(1, 2) + 1 == interval(2, 3)) == (True, True)
|
||||
compare = (1 + interval(0, float('inf')) == interval(1, float('inf')))
|
||||
assert compare == (True, True)
|
||||
a = 1 + interval(2, 5, is_valid=False)
|
||||
assert a.is_valid is False
|
||||
a = 1 + interval(2, 5, is_valid=None)
|
||||
assert a.is_valid is None
|
||||
a = interval(2, 5, is_valid=False) + interval(3, 5, is_valid=None)
|
||||
assert a.is_valid is False
|
||||
a = interval(3, 5) + interval(-1, 1, is_valid=None)
|
||||
assert a.is_valid is None
|
||||
a = interval(2, 5, is_valid=False) + 1
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_interval_sub():
|
||||
assert (interval(1, 2) - interval(1, 5) == interval(-4, 1)) == (True, True)
|
||||
assert (interval(1, 2) - 1 == interval(0, 1)) == (True, True)
|
||||
assert (1 - interval(1, 2) == interval(-1, 0)) == (True, True)
|
||||
a = 1 - interval(1, 2, is_valid=False)
|
||||
assert a.is_valid is False
|
||||
a = interval(1, 4, is_valid=None) - 1
|
||||
assert a.is_valid is None
|
||||
a = interval(1, 3, is_valid=False) - interval(1, 3)
|
||||
assert a.is_valid is False
|
||||
a = interval(1, 3, is_valid=None) - interval(1, 3)
|
||||
assert a.is_valid is None
|
||||
|
||||
|
||||
def test_interval_inequality():
|
||||
assert (interval(1, 2) < interval(3, 4)) == (True, True)
|
||||
assert (interval(1, 2) < interval(2, 4)) == (None, True)
|
||||
assert (interval(1, 2) < interval(-2, 0)) == (False, True)
|
||||
assert (interval(1, 2) <= interval(2, 4)) == (True, True)
|
||||
assert (interval(1, 2) <= interval(1.5, 6)) == (None, True)
|
||||
assert (interval(2, 3) <= interval(1, 2)) == (None, True)
|
||||
assert (interval(2, 3) <= interval(1, 1.5)) == (False, True)
|
||||
assert (
|
||||
interval(1, 2, is_valid=False) <= interval(-2, 0)) == (False, False)
|
||||
assert (interval(1, 2, is_valid=None) <= interval(-2, 0)) == (False, None)
|
||||
assert (interval(1, 2) <= 1.5) == (None, True)
|
||||
assert (interval(1, 2) <= 3) == (True, True)
|
||||
assert (interval(1, 2) <= 0) == (False, True)
|
||||
assert (interval(5, 8) > interval(2, 3)) == (True, True)
|
||||
assert (interval(2, 5) > interval(1, 3)) == (None, True)
|
||||
assert (interval(2, 3) > interval(3.1, 5)) == (False, True)
|
||||
|
||||
assert (interval(-1, 1) == 0) == (None, True)
|
||||
assert (interval(-1, 1) == 2) == (False, True)
|
||||
assert (interval(-1, 1) != 0) == (None, True)
|
||||
assert (interval(-1, 1) != 2) == (True, True)
|
||||
|
||||
assert (interval(3, 5) > 2) == (True, True)
|
||||
assert (interval(3, 5) < 2) == (False, True)
|
||||
assert (interval(1, 5) < 2) == (None, True)
|
||||
assert (interval(1, 5) > 2) == (None, True)
|
||||
assert (interval(0, 1) > 2) == (False, True)
|
||||
assert (interval(1, 2) >= interval(0, 1)) == (True, True)
|
||||
assert (interval(1, 2) >= interval(0, 1.5)) == (None, True)
|
||||
assert (interval(1, 2) >= interval(3, 4)) == (False, True)
|
||||
assert (interval(1, 2) >= 0) == (True, True)
|
||||
assert (interval(1, 2) >= 1.2) == (None, True)
|
||||
assert (interval(1, 2) >= 3) == (False, True)
|
||||
assert (2 > interval(0, 1)) == (True, True)
|
||||
a = interval(-1, 1, is_valid=False) < interval(2, 5, is_valid=None)
|
||||
assert a == (True, False)
|
||||
a = interval(-1, 1, is_valid=None) < interval(2, 5, is_valid=False)
|
||||
assert a == (True, False)
|
||||
a = interval(-1, 1, is_valid=None) < interval(2, 5, is_valid=None)
|
||||
assert a == (True, None)
|
||||
a = interval(-1, 1, is_valid=False) > interval(-5, -2, is_valid=None)
|
||||
assert a == (True, False)
|
||||
a = interval(-1, 1, is_valid=None) > interval(-5, -2, is_valid=False)
|
||||
assert a == (True, False)
|
||||
a = interval(-1, 1, is_valid=None) > interval(-5, -2, is_valid=None)
|
||||
assert a == (True, None)
|
||||
|
||||
|
||||
def test_interval_mul():
|
||||
assert (
|
||||
interval(1, 5) * interval(2, 10) == interval(2, 50)) == (True, True)
|
||||
a = interval(-1, 1) * interval(2, 10) == interval(-10, 10)
|
||||
assert a == (True, True)
|
||||
|
||||
a = interval(-1, 1) * interval(-5, 3) == interval(-5, 5)
|
||||
assert a == (True, True)
|
||||
|
||||
assert (interval(1, 3) * 2 == interval(2, 6)) == (True, True)
|
||||
assert (3 * interval(-1, 2) == interval(-3, 6)) == (True, True)
|
||||
|
||||
a = 3 * interval(1, 2, is_valid=False)
|
||||
assert a.is_valid is False
|
||||
|
||||
a = 3 * interval(1, 2, is_valid=None)
|
||||
assert a.is_valid is None
|
||||
|
||||
a = interval(1, 5, is_valid=False) * interval(1, 2, is_valid=None)
|
||||
assert a.is_valid is False
|
||||
|
||||
|
||||
def test_interval_div():
|
||||
div = interval(1, 2, is_valid=False) / 3
|
||||
assert div == interval(-float('inf'), float('inf'), is_valid=False)
|
||||
|
||||
div = interval(1, 2, is_valid=None) / 3
|
||||
assert div == interval(-float('inf'), float('inf'), is_valid=None)
|
||||
|
||||
div = 3 / interval(1, 2, is_valid=None)
|
||||
assert div == interval(-float('inf'), float('inf'), is_valid=None)
|
||||
a = interval(1, 2) / 0
|
||||
assert a.is_valid is False
|
||||
a = interval(0.5, 1) / interval(-1, 0)
|
||||
assert a.is_valid is None
|
||||
a = interval(0, 1) / interval(0, 1)
|
||||
assert a.is_valid is None
|
||||
|
||||
a = interval(-1, 1) / interval(-1, 1)
|
||||
assert a.is_valid is None
|
||||
|
||||
a = interval(-1, 2) / interval(0.5, 1) == interval(-2.0, 4.0)
|
||||
assert a == (True, True)
|
||||
a = interval(0, 1) / interval(0.5, 1) == interval(0.0, 2.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, 0) / interval(0.5, 1) == interval(-2.0, 0.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-0.5, -0.25) / interval(0.5, 1) == interval(-1.0, -0.25)
|
||||
assert a == (True, True)
|
||||
a = interval(0.5, 1) / interval(0.5, 1) == interval(0.5, 2.0)
|
||||
assert a == (True, True)
|
||||
a = interval(0.5, 4) / interval(0.5, 1) == interval(0.5, 8.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, -0.5) / interval(0.5, 1) == interval(-2.0, -0.5)
|
||||
assert a == (True, True)
|
||||
a = interval(-4, -0.5) / interval(0.5, 1) == interval(-8.0, -0.5)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, 2) / interval(-2, -0.5) == interval(-4.0, 2.0)
|
||||
assert a == (True, True)
|
||||
a = interval(0, 1) / interval(-2, -0.5) == interval(-2.0, 0.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, 0) / interval(-2, -0.5) == interval(0.0, 2.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-0.5, -0.25) / interval(-2, -0.5) == interval(0.125, 1.0)
|
||||
assert a == (True, True)
|
||||
a = interval(0.5, 1) / interval(-2, -0.5) == interval(-2.0, -0.25)
|
||||
assert a == (True, True)
|
||||
a = interval(0.5, 4) / interval(-2, -0.5) == interval(-8.0, -0.25)
|
||||
assert a == (True, True)
|
||||
a = interval(-1, -0.5) / interval(-2, -0.5) == interval(0.25, 2.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-4, -0.5) / interval(-2, -0.5) == interval(0.25, 8.0)
|
||||
assert a == (True, True)
|
||||
a = interval(-5, 5, is_valid=False) / 2
|
||||
assert a.is_valid is False
|
||||
|
||||
def test_hashable():
|
||||
'''
|
||||
test that interval objects are hashable.
|
||||
this is required in order to be able to put them into the cache, which
|
||||
appears to be necessary for plotting in py3k. For details, see:
|
||||
|
||||
https://github.com/sympy/sympy/pull/2101
|
||||
https://github.com/sympy/sympy/issues/6533
|
||||
'''
|
||||
hash(interval(1, 1))
|
||||
hash(interval(1, 1, is_valid=True))
|
||||
hash(interval(-4, -0.5))
|
||||
hash(interval(-2, -0.5))
|
||||
hash(interval(0.25, 8.0))
|
||||
Reference in New Issue
Block a user