test_interval_functions.py 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. from sympy.external import import_module
  2. from sympy.plotting.intervalmath import (
  3. Abs, acos, acosh, And, asin, asinh, atan, atanh, ceil, cos, cosh,
  4. exp, floor, imax, imin, interval, log, log10, Or, sin, sinh, sqrt,
  5. tan, tanh,
  6. )
  7. np = import_module('numpy')
  8. if not np:
  9. disabled = True
  10. #requires Numpy. Hence included in interval_functions
  11. def test_interval_pow():
  12. a = 2**interval(1, 2) == interval(2, 4)
  13. assert a == (True, True)
  14. a = interval(1, 2)**interval(1, 2) == interval(1, 4)
  15. assert a == (True, True)
  16. a = interval(-1, 1)**interval(0.5, 2)
  17. assert a.is_valid is None
  18. a = interval(-2, -1) ** interval(1, 2)
  19. assert a.is_valid is False
  20. a = interval(-2, -1) ** (1.0 / 2)
  21. assert a.is_valid is False
  22. a = interval(-1, 1)**(1.0 / 2)
  23. assert a.is_valid is None
  24. a = interval(-1, 1)**(1.0 / 3) == interval(-1, 1)
  25. assert a == (True, True)
  26. a = interval(-1, 1)**2 == interval(0, 1)
  27. assert a == (True, True)
  28. a = interval(-1, 1) ** (1.0 / 29) == interval(-1, 1)
  29. assert a == (True, True)
  30. a = -2**interval(1, 1) == interval(-2, -2)
  31. assert a == (True, True)
  32. a = interval(1, 2, is_valid=False)**2
  33. assert a.is_valid is False
  34. a = (-3)**interval(1, 2)
  35. assert a.is_valid is False
  36. a = (-4)**interval(0.5, 0.5)
  37. assert a.is_valid is False
  38. assert ((-3)**interval(1, 1) == interval(-3, -3)) == (True, True)
  39. a = interval(8, 64)**(2.0 / 3)
  40. assert abs(a.start - 4) < 1e-10 # eps
  41. assert abs(a.end - 16) < 1e-10
  42. a = interval(-8, 64)**(2.0 / 3)
  43. assert abs(a.start - 4) < 1e-10 # eps
  44. assert abs(a.end - 16) < 1e-10
  45. def test_exp():
  46. a = exp(interval(-np.inf, 0))
  47. assert a.start == np.exp(-np.inf)
  48. assert a.end == np.exp(0)
  49. a = exp(interval(1, 2))
  50. assert a.start == np.exp(1)
  51. assert a.end == np.exp(2)
  52. a = exp(1)
  53. assert a.start == np.exp(1)
  54. assert a.end == np.exp(1)
  55. def test_log():
  56. a = log(interval(1, 2))
  57. assert a.start == 0
  58. assert a.end == np.log(2)
  59. a = log(interval(-1, 1))
  60. assert a.is_valid is None
  61. a = log(interval(-3, -1))
  62. assert a.is_valid is False
  63. a = log(-3)
  64. assert a.is_valid is False
  65. a = log(2)
  66. assert a.start == np.log(2)
  67. assert a.end == np.log(2)
  68. def test_log10():
  69. a = log10(interval(1, 2))
  70. assert a.start == 0
  71. assert a.end == np.log10(2)
  72. a = log10(interval(-1, 1))
  73. assert a.is_valid is None
  74. a = log10(interval(-3, -1))
  75. assert a.is_valid is False
  76. a = log10(-3)
  77. assert a.is_valid is False
  78. a = log10(2)
  79. assert a.start == np.log10(2)
  80. assert a.end == np.log10(2)
  81. def test_atan():
  82. a = atan(interval(0, 1))
  83. assert a.start == np.arctan(0)
  84. assert a.end == np.arctan(1)
  85. a = atan(1)
  86. assert a.start == np.arctan(1)
  87. assert a.end == np.arctan(1)
  88. def test_sin():
  89. a = sin(interval(0, np.pi / 4))
  90. assert a.start == np.sin(0)
  91. assert a.end == np.sin(np.pi / 4)
  92. a = sin(interval(-np.pi / 4, np.pi / 4))
  93. assert a.start == np.sin(-np.pi / 4)
  94. assert a.end == np.sin(np.pi / 4)
  95. a = sin(interval(np.pi / 4, 3 * np.pi / 4))
  96. assert a.start == np.sin(np.pi / 4)
  97. assert a.end == 1
  98. a = sin(interval(7 * np.pi / 6, 7 * np.pi / 4))
  99. assert a.start == -1
  100. assert a.end == np.sin(7 * np.pi / 6)
  101. a = sin(interval(0, 3 * np.pi))
  102. assert a.start == -1
  103. assert a.end == 1
  104. a = sin(interval(np.pi / 3, 7 * np.pi / 4))
  105. assert a.start == -1
  106. assert a.end == 1
  107. a = sin(np.pi / 4)
  108. assert a.start == np.sin(np.pi / 4)
  109. assert a.end == np.sin(np.pi / 4)
  110. a = sin(interval(1, 2, is_valid=False))
  111. assert a.is_valid is False
  112. def test_cos():
  113. a = cos(interval(0, np.pi / 4))
  114. assert a.start == np.cos(np.pi / 4)
  115. assert a.end == 1
  116. a = cos(interval(-np.pi / 4, np.pi / 4))
  117. assert a.start == np.cos(-np.pi / 4)
  118. assert a.end == 1
  119. a = cos(interval(np.pi / 4, 3 * np.pi / 4))
  120. assert a.start == np.cos(3 * np.pi / 4)
  121. assert a.end == np.cos(np.pi / 4)
  122. a = cos(interval(3 * np.pi / 4, 5 * np.pi / 4))
  123. assert a.start == -1
  124. assert a.end == np.cos(3 * np.pi / 4)
  125. a = cos(interval(0, 3 * np.pi))
  126. assert a.start == -1
  127. assert a.end == 1
  128. a = cos(interval(- np.pi / 3, 5 * np.pi / 4))
  129. assert a.start == -1
  130. assert a.end == 1
  131. a = cos(interval(1, 2, is_valid=False))
  132. assert a.is_valid is False
  133. def test_tan():
  134. a = tan(interval(0, np.pi / 4))
  135. assert a.start == 0
  136. # must match lib_interval definition of tan:
  137. assert a.end == np.sin(np.pi / 4)/np.cos(np.pi / 4)
  138. a = tan(interval(np.pi / 4, 3 * np.pi / 4))
  139. #discontinuity
  140. assert a.is_valid is None
  141. def test_sqrt():
  142. a = sqrt(interval(1, 4))
  143. assert a.start == 1
  144. assert a.end == 2
  145. a = sqrt(interval(0.01, 1))
  146. assert a.start == np.sqrt(0.01)
  147. assert a.end == 1
  148. a = sqrt(interval(-1, 1))
  149. assert a.is_valid is None
  150. a = sqrt(interval(-3, -1))
  151. assert a.is_valid is False
  152. a = sqrt(4)
  153. assert (a == interval(2, 2)) == (True, True)
  154. a = sqrt(-3)
  155. assert a.is_valid is False
  156. def test_imin():
  157. a = imin(interval(1, 3), interval(2, 5), interval(-1, 3))
  158. assert a.start == -1
  159. assert a.end == 3
  160. a = imin(-2, interval(1, 4))
  161. assert a.start == -2
  162. assert a.end == -2
  163. a = imin(5, interval(3, 4), interval(-2, 2, is_valid=False))
  164. assert a.start == 3
  165. assert a.end == 4
  166. def test_imax():
  167. a = imax(interval(-2, 2), interval(2, 7), interval(-3, 9))
  168. assert a.start == 2
  169. assert a.end == 9
  170. a = imax(8, interval(1, 4))
  171. assert a.start == 8
  172. assert a.end == 8
  173. a = imax(interval(1, 2), interval(3, 4), interval(-2, 2, is_valid=False))
  174. assert a.start == 3
  175. assert a.end == 4
  176. def test_sinh():
  177. a = sinh(interval(-1, 1))
  178. assert a.start == np.sinh(-1)
  179. assert a.end == np.sinh(1)
  180. a = sinh(1)
  181. assert a.start == np.sinh(1)
  182. assert a.end == np.sinh(1)
  183. def test_cosh():
  184. a = cosh(interval(1, 2))
  185. assert a.start == np.cosh(1)
  186. assert a.end == np.cosh(2)
  187. a = cosh(interval(-2, -1))
  188. assert a.start == np.cosh(-1)
  189. assert a.end == np.cosh(-2)
  190. a = cosh(interval(-2, 1))
  191. assert a.start == 1
  192. assert a.end == np.cosh(-2)
  193. a = cosh(1)
  194. assert a.start == np.cosh(1)
  195. assert a.end == np.cosh(1)
  196. def test_tanh():
  197. a = tanh(interval(-3, 3))
  198. assert a.start == np.tanh(-3)
  199. assert a.end == np.tanh(3)
  200. a = tanh(3)
  201. assert a.start == np.tanh(3)
  202. assert a.end == np.tanh(3)
  203. def test_asin():
  204. a = asin(interval(-0.5, 0.5))
  205. assert a.start == np.arcsin(-0.5)
  206. assert a.end == np.arcsin(0.5)
  207. a = asin(interval(-1.5, 1.5))
  208. assert a.is_valid is None
  209. a = asin(interval(-2, -1.5))
  210. assert a.is_valid is False
  211. a = asin(interval(0, 2))
  212. assert a.is_valid is None
  213. a = asin(interval(2, 5))
  214. assert a.is_valid is False
  215. a = asin(0.5)
  216. assert a.start == np.arcsin(0.5)
  217. assert a.end == np.arcsin(0.5)
  218. a = asin(1.5)
  219. assert a.is_valid is False
  220. def test_acos():
  221. a = acos(interval(-0.5, 0.5))
  222. assert a.start == np.arccos(0.5)
  223. assert a.end == np.arccos(-0.5)
  224. a = acos(interval(-1.5, 1.5))
  225. assert a.is_valid is None
  226. a = acos(interval(-2, -1.5))
  227. assert a.is_valid is False
  228. a = acos(interval(0, 2))
  229. assert a.is_valid is None
  230. a = acos(interval(2, 5))
  231. assert a.is_valid is False
  232. a = acos(0.5)
  233. assert a.start == np.arccos(0.5)
  234. assert a.end == np.arccos(0.5)
  235. a = acos(1.5)
  236. assert a.is_valid is False
  237. def test_ceil():
  238. a = ceil(interval(0.2, 0.5))
  239. assert a.start == 1
  240. assert a.end == 1
  241. a = ceil(interval(0.5, 1.5))
  242. assert a.start == 1
  243. assert a.end == 2
  244. assert a.is_valid is None
  245. a = ceil(interval(-5, 5))
  246. assert a.is_valid is None
  247. a = ceil(5.4)
  248. assert a.start == 6
  249. assert a.end == 6
  250. def test_floor():
  251. a = floor(interval(0.2, 0.5))
  252. assert a.start == 0
  253. assert a.end == 0
  254. a = floor(interval(0.5, 1.5))
  255. assert a.start == 0
  256. assert a.end == 1
  257. assert a.is_valid is None
  258. a = floor(interval(-5, 5))
  259. assert a.is_valid is None
  260. a = floor(5.4)
  261. assert a.start == 5
  262. assert a.end == 5
  263. def test_asinh():
  264. a = asinh(interval(1, 2))
  265. assert a.start == np.arcsinh(1)
  266. assert a.end == np.arcsinh(2)
  267. a = asinh(0.5)
  268. assert a.start == np.arcsinh(0.5)
  269. assert a.end == np.arcsinh(0.5)
  270. def test_acosh():
  271. a = acosh(interval(3, 5))
  272. assert a.start == np.arccosh(3)
  273. assert a.end == np.arccosh(5)
  274. a = acosh(interval(0, 3))
  275. assert a.is_valid is None
  276. a = acosh(interval(-3, 0.5))
  277. assert a.is_valid is False
  278. a = acosh(0.5)
  279. assert a.is_valid is False
  280. a = acosh(2)
  281. assert a.start == np.arccosh(2)
  282. assert a.end == np.arccosh(2)
  283. def test_atanh():
  284. a = atanh(interval(-0.5, 0.5))
  285. assert a.start == np.arctanh(-0.5)
  286. assert a.end == np.arctanh(0.5)
  287. a = atanh(interval(0, 3))
  288. assert a.is_valid is None
  289. a = atanh(interval(-3, -2))
  290. assert a.is_valid is False
  291. a = atanh(0.5)
  292. assert a.start == np.arctanh(0.5)
  293. assert a.end == np.arctanh(0.5)
  294. a = atanh(1.5)
  295. assert a.is_valid is False
  296. def test_Abs():
  297. assert (Abs(interval(-0.5, 0.5)) == interval(0, 0.5)) == (True, True)
  298. assert (Abs(interval(-3, -2)) == interval(2, 3)) == (True, True)
  299. assert (Abs(-3) == interval(3, 3)) == (True, True)
  300. def test_And():
  301. args = [(True, True), (True, False), (True, None)]
  302. assert And(*args) == (True, False)
  303. args = [(False, True), (None, None), (True, True)]
  304. assert And(*args) == (False, None)
  305. def test_Or():
  306. args = [(True, True), (True, False), (False, None)]
  307. assert Or(*args) == (True, True)
  308. args = [(None, None), (False, None), (False, False)]
  309. assert Or(*args) == (None, None)