test_intervalmath.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. from sympy.plotting.intervalmath import interval
  2. from sympy.testing.pytest import raises
  3. def test_interval():
  4. assert (interval(1, 1) == interval(1, 1, is_valid=True)) == (True, True)
  5. assert (interval(1, 1) == interval(1, 1, is_valid=False)) == (True, False)
  6. assert (interval(1, 1) == interval(1, 1, is_valid=None)) == (True, None)
  7. assert (interval(1, 1.5) == interval(1, 2)) == (None, True)
  8. assert (interval(0, 1) == interval(2, 3)) == (False, True)
  9. assert (interval(0, 1) == interval(1, 2)) == (None, True)
  10. assert (interval(1, 2) != interval(1, 2)) == (False, True)
  11. assert (interval(1, 3) != interval(2, 3)) == (None, True)
  12. assert (interval(1, 3) != interval(-5, -3)) == (True, True)
  13. assert (
  14. interval(1, 3, is_valid=False) != interval(-5, -3)) == (True, False)
  15. assert (interval(1, 3, is_valid=None) != interval(-5, 3)) == (None, None)
  16. assert (interval(4, 4) != 4) == (False, True)
  17. assert (interval(1, 1) == 1) == (True, True)
  18. assert (interval(1, 3, is_valid=False) == interval(1, 3)) == (True, False)
  19. assert (interval(1, 3, is_valid=None) == interval(1, 3)) == (True, None)
  20. inter = interval(-5, 5)
  21. assert (interval(inter) == interval(-5, 5)) == (True, True)
  22. assert inter.width == 10
  23. assert 0 in inter
  24. assert -5 in inter
  25. assert 5 in inter
  26. assert interval(0, 3) in inter
  27. assert interval(-6, 2) not in inter
  28. assert -5.05 not in inter
  29. assert 5.3 not in inter
  30. interb = interval(-float('inf'), float('inf'))
  31. assert 0 in inter
  32. assert inter in interb
  33. assert interval(0, float('inf')) in interb
  34. assert interval(-float('inf'), 5) in interb
  35. assert interval(-1e50, 1e50) in interb
  36. assert (
  37. -interval(-1, -2, is_valid=False) == interval(1, 2)) == (True, False)
  38. raises(ValueError, lambda: interval(1, 2, 3))
  39. def test_interval_add():
  40. assert (interval(1, 2) + interval(2, 3) == interval(3, 5)) == (True, True)
  41. assert (1 + interval(1, 2) == interval(2, 3)) == (True, True)
  42. assert (interval(1, 2) + 1 == interval(2, 3)) == (True, True)
  43. compare = (1 + interval(0, float('inf')) == interval(1, float('inf')))
  44. assert compare == (True, True)
  45. a = 1 + interval(2, 5, is_valid=False)
  46. assert a.is_valid is False
  47. a = 1 + interval(2, 5, is_valid=None)
  48. assert a.is_valid is None
  49. a = interval(2, 5, is_valid=False) + interval(3, 5, is_valid=None)
  50. assert a.is_valid is False
  51. a = interval(3, 5) + interval(-1, 1, is_valid=None)
  52. assert a.is_valid is None
  53. a = interval(2, 5, is_valid=False) + 1
  54. assert a.is_valid is False
  55. def test_interval_sub():
  56. assert (interval(1, 2) - interval(1, 5) == interval(-4, 1)) == (True, True)
  57. assert (interval(1, 2) - 1 == interval(0, 1)) == (True, True)
  58. assert (1 - interval(1, 2) == interval(-1, 0)) == (True, True)
  59. a = 1 - interval(1, 2, is_valid=False)
  60. assert a.is_valid is False
  61. a = interval(1, 4, is_valid=None) - 1
  62. assert a.is_valid is None
  63. a = interval(1, 3, is_valid=False) - interval(1, 3)
  64. assert a.is_valid is False
  65. a = interval(1, 3, is_valid=None) - interval(1, 3)
  66. assert a.is_valid is None
  67. def test_interval_inequality():
  68. assert (interval(1, 2) < interval(3, 4)) == (True, True)
  69. assert (interval(1, 2) < interval(2, 4)) == (None, True)
  70. assert (interval(1, 2) < interval(-2, 0)) == (False, True)
  71. assert (interval(1, 2) <= interval(2, 4)) == (True, True)
  72. assert (interval(1, 2) <= interval(1.5, 6)) == (None, True)
  73. assert (interval(2, 3) <= interval(1, 2)) == (None, True)
  74. assert (interval(2, 3) <= interval(1, 1.5)) == (False, True)
  75. assert (
  76. interval(1, 2, is_valid=False) <= interval(-2, 0)) == (False, False)
  77. assert (interval(1, 2, is_valid=None) <= interval(-2, 0)) == (False, None)
  78. assert (interval(1, 2) <= 1.5) == (None, True)
  79. assert (interval(1, 2) <= 3) == (True, True)
  80. assert (interval(1, 2) <= 0) == (False, True)
  81. assert (interval(5, 8) > interval(2, 3)) == (True, True)
  82. assert (interval(2, 5) > interval(1, 3)) == (None, True)
  83. assert (interval(2, 3) > interval(3.1, 5)) == (False, True)
  84. assert (interval(-1, 1) == 0) == (None, True)
  85. assert (interval(-1, 1) == 2) == (False, True)
  86. assert (interval(-1, 1) != 0) == (None, True)
  87. assert (interval(-1, 1) != 2) == (True, True)
  88. assert (interval(3, 5) > 2) == (True, True)
  89. assert (interval(3, 5) < 2) == (False, True)
  90. assert (interval(1, 5) < 2) == (None, True)
  91. assert (interval(1, 5) > 2) == (None, True)
  92. assert (interval(0, 1) > 2) == (False, True)
  93. assert (interval(1, 2) >= interval(0, 1)) == (True, True)
  94. assert (interval(1, 2) >= interval(0, 1.5)) == (None, True)
  95. assert (interval(1, 2) >= interval(3, 4)) == (False, True)
  96. assert (interval(1, 2) >= 0) == (True, True)
  97. assert (interval(1, 2) >= 1.2) == (None, True)
  98. assert (interval(1, 2) >= 3) == (False, True)
  99. assert (2 > interval(0, 1)) == (True, True)
  100. a = interval(-1, 1, is_valid=False) < interval(2, 5, is_valid=None)
  101. assert a == (True, False)
  102. a = interval(-1, 1, is_valid=None) < interval(2, 5, is_valid=False)
  103. assert a == (True, False)
  104. a = interval(-1, 1, is_valid=None) < interval(2, 5, is_valid=None)
  105. assert a == (True, None)
  106. a = interval(-1, 1, is_valid=False) > interval(-5, -2, is_valid=None)
  107. assert a == (True, False)
  108. a = interval(-1, 1, is_valid=None) > interval(-5, -2, is_valid=False)
  109. assert a == (True, False)
  110. a = interval(-1, 1, is_valid=None) > interval(-5, -2, is_valid=None)
  111. assert a == (True, None)
  112. def test_interval_mul():
  113. assert (
  114. interval(1, 5) * interval(2, 10) == interval(2, 50)) == (True, True)
  115. a = interval(-1, 1) * interval(2, 10) == interval(-10, 10)
  116. assert a == (True, True)
  117. a = interval(-1, 1) * interval(-5, 3) == interval(-5, 5)
  118. assert a == (True, True)
  119. assert (interval(1, 3) * 2 == interval(2, 6)) == (True, True)
  120. assert (3 * interval(-1, 2) == interval(-3, 6)) == (True, True)
  121. a = 3 * interval(1, 2, is_valid=False)
  122. assert a.is_valid is False
  123. a = 3 * interval(1, 2, is_valid=None)
  124. assert a.is_valid is None
  125. a = interval(1, 5, is_valid=False) * interval(1, 2, is_valid=None)
  126. assert a.is_valid is False
  127. def test_interval_div():
  128. div = interval(1, 2, is_valid=False) / 3
  129. assert div == interval(-float('inf'), float('inf'), is_valid=False)
  130. div = interval(1, 2, is_valid=None) / 3
  131. assert div == interval(-float('inf'), float('inf'), is_valid=None)
  132. div = 3 / interval(1, 2, is_valid=None)
  133. assert div == interval(-float('inf'), float('inf'), is_valid=None)
  134. a = interval(1, 2) / 0
  135. assert a.is_valid is False
  136. a = interval(0.5, 1) / interval(-1, 0)
  137. assert a.is_valid is None
  138. a = interval(0, 1) / interval(0, 1)
  139. assert a.is_valid is None
  140. a = interval(-1, 1) / interval(-1, 1)
  141. assert a.is_valid is None
  142. a = interval(-1, 2) / interval(0.5, 1) == interval(-2.0, 4.0)
  143. assert a == (True, True)
  144. a = interval(0, 1) / interval(0.5, 1) == interval(0.0, 2.0)
  145. assert a == (True, True)
  146. a = interval(-1, 0) / interval(0.5, 1) == interval(-2.0, 0.0)
  147. assert a == (True, True)
  148. a = interval(-0.5, -0.25) / interval(0.5, 1) == interval(-1.0, -0.25)
  149. assert a == (True, True)
  150. a = interval(0.5, 1) / interval(0.5, 1) == interval(0.5, 2.0)
  151. assert a == (True, True)
  152. a = interval(0.5, 4) / interval(0.5, 1) == interval(0.5, 8.0)
  153. assert a == (True, True)
  154. a = interval(-1, -0.5) / interval(0.5, 1) == interval(-2.0, -0.5)
  155. assert a == (True, True)
  156. a = interval(-4, -0.5) / interval(0.5, 1) == interval(-8.0, -0.5)
  157. assert a == (True, True)
  158. a = interval(-1, 2) / interval(-2, -0.5) == interval(-4.0, 2.0)
  159. assert a == (True, True)
  160. a = interval(0, 1) / interval(-2, -0.5) == interval(-2.0, 0.0)
  161. assert a == (True, True)
  162. a = interval(-1, 0) / interval(-2, -0.5) == interval(0.0, 2.0)
  163. assert a == (True, True)
  164. a = interval(-0.5, -0.25) / interval(-2, -0.5) == interval(0.125, 1.0)
  165. assert a == (True, True)
  166. a = interval(0.5, 1) / interval(-2, -0.5) == interval(-2.0, -0.25)
  167. assert a == (True, True)
  168. a = interval(0.5, 4) / interval(-2, -0.5) == interval(-8.0, -0.25)
  169. assert a == (True, True)
  170. a = interval(-1, -0.5) / interval(-2, -0.5) == interval(0.25, 2.0)
  171. assert a == (True, True)
  172. a = interval(-4, -0.5) / interval(-2, -0.5) == interval(0.25, 8.0)
  173. assert a == (True, True)
  174. a = interval(-5, 5, is_valid=False) / 2
  175. assert a.is_valid is False
  176. def test_hashable():
  177. '''
  178. test that interval objects are hashable.
  179. this is required in order to be able to put them into the cache, which
  180. appears to be necessary for plotting in py3k. For details, see:
  181. https://github.com/sympy/sympy/pull/2101
  182. https://github.com/sympy/sympy/issues/6533
  183. '''
  184. hash(interval(1, 1))
  185. hash(interval(1, 1, is_valid=True))
  186. hash(interval(-4, -0.5))
  187. hash(interval(-2, -0.5))
  188. hash(interval(0.25, 8.0))