I am done

This commit is contained in:
2024-10-30 22:14:35 +01:00
parent 720dc28c09
commit 40e2a747cf
36901 changed files with 5011519 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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))