m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1653 lines
63 KiB

6 months ago
  1. from sympy.concrete.summations import Sum
  2. from sympy.core.add import Add
  3. from sympy.core.function import Lambda
  4. from sympy.core.numbers import (Float, I, Rational, nan, oo, pi, zoo)
  5. from sympy.core.power import Pow
  6. from sympy.core.singleton import S
  7. from sympy.core.symbol import (Symbol, symbols)
  8. from sympy.core.sympify import sympify
  9. from sympy.functions.elementary.miscellaneous import (Max, Min, sqrt)
  10. from sympy.functions.elementary.piecewise import Piecewise
  11. from sympy.functions.elementary.trigonometric import (cos, sin)
  12. from sympy.logic.boolalg import (false, true)
  13. from sympy.matrices.dense import Matrix
  14. from sympy.polys.rootoftools import rootof
  15. from sympy.sets.contains import Contains
  16. from sympy.sets.fancysets import (ImageSet, Range)
  17. from sympy.sets.sets import (Complement, DisjointUnion, FiniteSet, Intersection, Interval, ProductSet, Set, SymmetricDifference, Union, imageset)
  18. from mpmath import mpi
  19. from sympy.core.expr import unchanged
  20. from sympy.core.relational import Eq, Ne, Le, Lt, LessThan
  21. from sympy.logic import And, Or, Xor
  22. from sympy.testing.pytest import raises, XFAIL, warns_deprecated_sympy
  23. from sympy.abc import x, y, z, m, n
  24. EmptySet = S.EmptySet
  25. def test_imageset():
  26. ints = S.Integers
  27. assert imageset(x, x - 1, S.Naturals) is S.Naturals0
  28. assert imageset(x, x + 1, S.Naturals0) is S.Naturals
  29. assert imageset(x, abs(x), S.Naturals0) is S.Naturals0
  30. assert imageset(x, abs(x), S.Naturals) is S.Naturals
  31. assert imageset(x, abs(x), S.Integers) is S.Naturals0
  32. # issue 16878a
  33. r = symbols('r', real=True)
  34. assert imageset(x, (x, x), S.Reals)._contains((1, r)) == None
  35. assert imageset(x, (x, x), S.Reals)._contains((1, 2)) == False
  36. assert (r, r) in imageset(x, (x, x), S.Reals)
  37. assert 1 + I in imageset(x, x + I, S.Reals)
  38. assert {1} not in imageset(x, (x,), S.Reals)
  39. assert (1, 1) not in imageset(x, (x,), S.Reals)
  40. raises(TypeError, lambda: imageset(x, ints))
  41. raises(ValueError, lambda: imageset(x, y, z, ints))
  42. raises(ValueError, lambda: imageset(Lambda(x, cos(x)), y))
  43. assert (1, 2) in imageset(Lambda((x, y), (x, y)), ints, ints)
  44. raises(ValueError, lambda: imageset(Lambda(x, x), ints, ints))
  45. assert imageset(cos, ints) == ImageSet(Lambda(x, cos(x)), ints)
  46. def f(x):
  47. return cos(x)
  48. assert imageset(f, ints) == imageset(x, cos(x), ints)
  49. f = lambda x: cos(x)
  50. assert imageset(f, ints) == ImageSet(Lambda(x, cos(x)), ints)
  51. assert imageset(x, 1, ints) == FiniteSet(1)
  52. assert imageset(x, y, ints) == {y}
  53. assert imageset((x, y), (1, z), ints, S.Reals) == {(1, z)}
  54. clash = Symbol('x', integer=true)
  55. assert (str(imageset(lambda x: x + clash, Interval(-2, 1)).lamda.expr)
  56. in ('x0 + x', 'x + x0'))
  57. x1, x2 = symbols("x1, x2")
  58. assert imageset(lambda x, y:
  59. Add(x, y), Interval(1, 2), Interval(2, 3)).dummy_eq(
  60. ImageSet(Lambda((x1, x2), x1 + x2),
  61. Interval(1, 2), Interval(2, 3)))
  62. def test_is_empty():
  63. for s in [S.Naturals, S.Naturals0, S.Integers, S.Rationals, S.Reals,
  64. S.UniversalSet]:
  65. assert s.is_empty is False
  66. assert S.EmptySet.is_empty is True
  67. def test_is_finiteset():
  68. for s in [S.Naturals, S.Naturals0, S.Integers, S.Rationals, S.Reals,
  69. S.UniversalSet]:
  70. assert s.is_finite_set is False
  71. assert S.EmptySet.is_finite_set is True
  72. assert FiniteSet(1, 2).is_finite_set is True
  73. assert Interval(1, 2).is_finite_set is False
  74. assert Interval(x, y).is_finite_set is None
  75. assert ProductSet(FiniteSet(1), FiniteSet(2)).is_finite_set is True
  76. assert ProductSet(FiniteSet(1), Interval(1, 2)).is_finite_set is False
  77. assert ProductSet(FiniteSet(1), Interval(x, y)).is_finite_set is None
  78. assert Union(Interval(0, 1), Interval(2, 3)).is_finite_set is False
  79. assert Union(FiniteSet(1), Interval(2, 3)).is_finite_set is False
  80. assert Union(FiniteSet(1), FiniteSet(2)).is_finite_set is True
  81. assert Union(FiniteSet(1), Interval(x, y)).is_finite_set is None
  82. assert Intersection(Interval(x, y), FiniteSet(1)).is_finite_set is True
  83. assert Intersection(Interval(x, y), Interval(1, 2)).is_finite_set is None
  84. assert Intersection(FiniteSet(x), FiniteSet(y)).is_finite_set is True
  85. assert Complement(FiniteSet(1), Interval(x, y)).is_finite_set is True
  86. assert Complement(Interval(x, y), FiniteSet(1)).is_finite_set is None
  87. assert Complement(Interval(1, 2), FiniteSet(x)).is_finite_set is False
  88. assert DisjointUnion(Interval(-5, 3), FiniteSet(x, y)).is_finite_set is False
  89. assert DisjointUnion(S.EmptySet, FiniteSet(x, y), S.EmptySet).is_finite_set is True
  90. def test_deprecated_is_EmptySet():
  91. with warns_deprecated_sympy():
  92. S.EmptySet.is_EmptySet
  93. with warns_deprecated_sympy():
  94. FiniteSet(1).is_EmptySet
  95. def test_interval_arguments():
  96. assert Interval(0, oo) == Interval(0, oo, False, True)
  97. assert Interval(0, oo).right_open is true
  98. assert Interval(-oo, 0) == Interval(-oo, 0, True, False)
  99. assert Interval(-oo, 0).left_open is true
  100. assert Interval(oo, -oo) == S.EmptySet
  101. assert Interval(oo, oo) == S.EmptySet
  102. assert Interval(-oo, -oo) == S.EmptySet
  103. assert Interval(oo, x) == S.EmptySet
  104. assert Interval(oo, oo) == S.EmptySet
  105. assert Interval(x, -oo) == S.EmptySet
  106. assert Interval(x, x) == {x}
  107. assert isinstance(Interval(1, 1), FiniteSet)
  108. e = Sum(x, (x, 1, 3))
  109. assert isinstance(Interval(e, e), FiniteSet)
  110. assert Interval(1, 0) == S.EmptySet
  111. assert Interval(1, 1).measure == 0
  112. assert Interval(1, 1, False, True) == S.EmptySet
  113. assert Interval(1, 1, True, False) == S.EmptySet
  114. assert Interval(1, 1, True, True) == S.EmptySet
  115. assert isinstance(Interval(0, Symbol('a')), Interval)
  116. assert Interval(Symbol('a', positive=True), 0) == S.EmptySet
  117. raises(ValueError, lambda: Interval(0, S.ImaginaryUnit))
  118. raises(ValueError, lambda: Interval(0, Symbol('z', extended_real=False)))
  119. raises(ValueError, lambda: Interval(x, x + S.ImaginaryUnit))
  120. raises(NotImplementedError, lambda: Interval(0, 1, And(x, y)))
  121. raises(NotImplementedError, lambda: Interval(0, 1, False, And(x, y)))
  122. raises(NotImplementedError, lambda: Interval(0, 1, z, And(x, y)))
  123. def test_interval_symbolic_end_points():
  124. a = Symbol('a', real=True)
  125. assert Union(Interval(0, a), Interval(0, 3)).sup == Max(a, 3)
  126. assert Union(Interval(a, 0), Interval(-3, 0)).inf == Min(-3, a)
  127. assert Interval(0, a).contains(1) == LessThan(1, a)
  128. def test_interval_is_empty():
  129. x, y = symbols('x, y')
  130. r = Symbol('r', real=True)
  131. p = Symbol('p', positive=True)
  132. n = Symbol('n', negative=True)
  133. nn = Symbol('nn', nonnegative=True)
  134. assert Interval(1, 2).is_empty == False
  135. assert Interval(3, 3).is_empty == False # FiniteSet
  136. assert Interval(r, r).is_empty == False # FiniteSet
  137. assert Interval(r, r + nn).is_empty == False
  138. assert Interval(x, x).is_empty == False
  139. assert Interval(1, oo).is_empty == False
  140. assert Interval(-oo, oo).is_empty == False
  141. assert Interval(-oo, 1).is_empty == False
  142. assert Interval(x, y).is_empty == None
  143. assert Interval(r, oo).is_empty == False # real implies finite
  144. assert Interval(n, 0).is_empty == False
  145. assert Interval(n, 0, left_open=True).is_empty == False
  146. assert Interval(p, 0).is_empty == True # EmptySet
  147. assert Interval(nn, 0).is_empty == None
  148. assert Interval(n, p).is_empty == False
  149. assert Interval(0, p, left_open=True).is_empty == False
  150. assert Interval(0, p, right_open=True).is_empty == False
  151. assert Interval(0, nn, left_open=True).is_empty == None
  152. assert Interval(0, nn, right_open=True).is_empty == None
  153. def test_union():
  154. assert Union(Interval(1, 2), Interval(2, 3)) == Interval(1, 3)
  155. assert Union(Interval(1, 2), Interval(2, 3, True)) == Interval(1, 3)
  156. assert Union(Interval(1, 3), Interval(2, 4)) == Interval(1, 4)
  157. assert Union(Interval(1, 2), Interval(1, 3)) == Interval(1, 3)
  158. assert Union(Interval(1, 3), Interval(1, 2)) == Interval(1, 3)
  159. assert Union(Interval(1, 3, False, True), Interval(1, 2)) == \
  160. Interval(1, 3, False, True)
  161. assert Union(Interval(1, 3), Interval(1, 2, False, True)) == Interval(1, 3)
  162. assert Union(Interval(1, 2, True), Interval(1, 3)) == Interval(1, 3)
  163. assert Union(Interval(1, 2, True), Interval(1, 3, True)) == \
  164. Interval(1, 3, True)
  165. assert Union(Interval(1, 2, True), Interval(1, 3, True, True)) == \
  166. Interval(1, 3, True, True)
  167. assert Union(Interval(1, 2, True, True), Interval(1, 3, True)) == \
  168. Interval(1, 3, True)
  169. assert Union(Interval(1, 3), Interval(2, 3)) == Interval(1, 3)
  170. assert Union(Interval(1, 3, False, True), Interval(2, 3)) == \
  171. Interval(1, 3)
  172. assert Union(Interval(1, 2, False, True), Interval(2, 3, True)) != \
  173. Interval(1, 3)
  174. assert Union(Interval(1, 2), S.EmptySet) == Interval(1, 2)
  175. assert Union(S.EmptySet) == S.EmptySet
  176. assert Union(Interval(0, 1), *[FiniteSet(1.0/n) for n in range(1, 10)]) == \
  177. Interval(0, 1)
  178. # issue #18241:
  179. x = Symbol('x')
  180. assert Union(Interval(0, 1), FiniteSet(1, x)) == Union(
  181. Interval(0, 1), FiniteSet(x))
  182. assert unchanged(Union, Interval(0, 1), FiniteSet(2, x))
  183. assert Interval(1, 2).union(Interval(2, 3)) == \
  184. Interval(1, 2) + Interval(2, 3)
  185. assert Interval(1, 2).union(Interval(2, 3)) == Interval(1, 3)
  186. assert Union(Set()) == Set()
  187. assert FiniteSet(1) + FiniteSet(2) + FiniteSet(3) == FiniteSet(1, 2, 3)
  188. assert FiniteSet('ham') + FiniteSet('eggs') == FiniteSet('ham', 'eggs')
  189. assert FiniteSet(1, 2, 3) + S.EmptySet == FiniteSet(1, 2, 3)
  190. assert FiniteSet(1, 2, 3) & FiniteSet(2, 3, 4) == FiniteSet(2, 3)
  191. assert FiniteSet(1, 2, 3) | FiniteSet(2, 3, 4) == FiniteSet(1, 2, 3, 4)
  192. assert FiniteSet(1, 2, 3) & S.EmptySet == S.EmptySet
  193. assert FiniteSet(1, 2, 3) | S.EmptySet == FiniteSet(1, 2, 3)
  194. x = Symbol("x")
  195. y = Symbol("y")
  196. z = Symbol("z")
  197. assert S.EmptySet | FiniteSet(x, FiniteSet(y, z)) == \
  198. FiniteSet(x, FiniteSet(y, z))
  199. # Test that Intervals and FiniteSets play nicely
  200. assert Interval(1, 3) + FiniteSet(2) == Interval(1, 3)
  201. assert Interval(1, 3, True, True) + FiniteSet(3) == \
  202. Interval(1, 3, True, False)
  203. X = Interval(1, 3) + FiniteSet(5)
  204. Y = Interval(1, 2) + FiniteSet(3)
  205. XandY = X.intersect(Y)
  206. assert 2 in X and 3 in X and 3 in XandY
  207. assert XandY.is_subset(X) and XandY.is_subset(Y)
  208. raises(TypeError, lambda: Union(1, 2, 3))
  209. assert X.is_iterable is False
  210. # issue 7843
  211. assert Union(S.EmptySet, FiniteSet(-sqrt(-I), sqrt(-I))) == \
  212. FiniteSet(-sqrt(-I), sqrt(-I))
  213. assert Union(S.Reals, S.Integers) == S.Reals
  214. def test_union_iter():
  215. # Use Range because it is ordered
  216. u = Union(Range(3), Range(5), Range(4), evaluate=False)
  217. # Round robin
  218. assert list(u) == [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4]
  219. def test_union_is_empty():
  220. assert (Interval(x, y) + FiniteSet(1)).is_empty == False
  221. assert (Interval(x, y) + Interval(-x, y)).is_empty == None
  222. def test_difference():
  223. assert Interval(1, 3) - Interval(1, 2) == Interval(2, 3, True)
  224. assert Interval(1, 3) - Interval(2, 3) == Interval(1, 2, False, True)
  225. assert Interval(1, 3, True) - Interval(2, 3) == Interval(1, 2, True, True)
  226. assert Interval(1, 3, True) - Interval(2, 3, True) == \
  227. Interval(1, 2, True, False)
  228. assert Interval(0, 2) - FiniteSet(1) == \
  229. Union(Interval(0, 1, False, True), Interval(1, 2, True, False))
  230. # issue #18119
  231. assert S.Reals - FiniteSet(I) == S.Reals
  232. assert S.Reals - FiniteSet(-I, I) == S.Reals
  233. assert Interval(0, 10) - FiniteSet(-I, I) == Interval(0, 10)
  234. assert Interval(0, 10) - FiniteSet(1, I) == Union(
  235. Interval.Ropen(0, 1), Interval.Lopen(1, 10))
  236. assert S.Reals - FiniteSet(1, 2 + I, x, y**2) == Complement(
  237. Union(Interval.open(-oo, 1), Interval.open(1, oo)), FiniteSet(x, y**2),
  238. evaluate=False)
  239. assert FiniteSet(1, 2, 3) - FiniteSet(2) == FiniteSet(1, 3)
  240. assert FiniteSet('ham', 'eggs') - FiniteSet('eggs') == FiniteSet('ham')
  241. assert FiniteSet(1, 2, 3, 4) - Interval(2, 10, True, False) == \
  242. FiniteSet(1, 2)
  243. assert FiniteSet(1, 2, 3, 4) - S.EmptySet == FiniteSet(1, 2, 3, 4)
  244. assert Union(Interval(0, 2), FiniteSet(2, 3, 4)) - Interval(1, 3) == \
  245. Union(Interval(0, 1, False, True), FiniteSet(4))
  246. assert -1 in S.Reals - S.Naturals
  247. def test_Complement():
  248. A = FiniteSet(1, 3, 4)
  249. B = FiniteSet(3, 4)
  250. C = Interval(1, 3)
  251. D = Interval(1, 2)
  252. assert Complement(A, B, evaluate=False).is_iterable is True
  253. assert Complement(A, C, evaluate=False).is_iterable is True
  254. assert Complement(C, D, evaluate=False).is_iterable is None
  255. assert FiniteSet(*Complement(A, B, evaluate=False)) == FiniteSet(1)
  256. assert FiniteSet(*Complement(A, C, evaluate=False)) == FiniteSet(4)
  257. raises(TypeError, lambda: FiniteSet(*Complement(C, A, evaluate=False)))
  258. assert Complement(Interval(1, 3), Interval(1, 2)) == Interval(2, 3, True)
  259. assert Complement(FiniteSet(1, 3, 4), FiniteSet(3, 4)) == FiniteSet(1)
  260. assert Complement(Union(Interval(0, 2), FiniteSet(2, 3, 4)),
  261. Interval(1, 3)) == \
  262. Union(Interval(0, 1, False, True), FiniteSet(4))
  263. assert 3 not in Complement(Interval(0, 5), Interval(1, 4), evaluate=False)
  264. assert -1 in Complement(S.Reals, S.Naturals, evaluate=False)
  265. assert 1 not in Complement(S.Reals, S.Naturals, evaluate=False)
  266. assert Complement(S.Integers, S.UniversalSet) == EmptySet
  267. assert S.UniversalSet.complement(S.Integers) == EmptySet
  268. assert (0 not in S.Reals.intersect(S.Integers - FiniteSet(0)))
  269. assert S.EmptySet - S.Integers == S.EmptySet
  270. assert (S.Integers - FiniteSet(0)) - FiniteSet(1) == S.Integers - FiniteSet(0, 1)
  271. assert S.Reals - Union(S.Naturals, FiniteSet(pi)) == \
  272. Intersection(S.Reals - S.Naturals, S.Reals - FiniteSet(pi))
  273. # issue 12712
  274. assert Complement(FiniteSet(x, y, 2), Interval(-10, 10)) == \
  275. Complement(FiniteSet(x, y), Interval(-10, 10))
  276. A = FiniteSet(*symbols('a:c'))
  277. B = FiniteSet(*symbols('d:f'))
  278. assert unchanged(Complement, ProductSet(A, A), B)
  279. A2 = ProductSet(A, A)
  280. B3 = ProductSet(B, B, B)
  281. assert A2 - B3 == A2
  282. assert B3 - A2 == B3
  283. def test_set_operations_nonsets():
  284. '''Tests that e.g. FiniteSet(1) * 2 raises TypeError'''
  285. ops = [
  286. lambda a, b: a + b,
  287. lambda a, b: a - b,
  288. lambda a, b: a * b,
  289. lambda a, b: a / b,
  290. lambda a, b: a // b,
  291. lambda a, b: a | b,
  292. lambda a, b: a & b,
  293. lambda a, b: a ^ b,
  294. # FiniteSet(1) ** 2 gives a ProductSet
  295. #lambda a, b: a ** b,
  296. ]
  297. Sx = FiniteSet(x)
  298. Sy = FiniteSet(y)
  299. sets = [
  300. {1},
  301. FiniteSet(1),
  302. Interval(1, 2),
  303. Union(Sx, Interval(1, 2)),
  304. Intersection(Sx, Sy),
  305. Complement(Sx, Sy),
  306. ProductSet(Sx, Sy),
  307. S.EmptySet,
  308. ]
  309. nums = [0, 1, 2, S(0), S(1), S(2)]
  310. for si in sets:
  311. for ni in nums:
  312. for op in ops:
  313. raises(TypeError, lambda : op(si, ni))
  314. raises(TypeError, lambda : op(ni, si))
  315. raises(TypeError, lambda: si ** object())
  316. raises(TypeError, lambda: si ** {1})
  317. def test_complement():
  318. assert Complement({1, 2}, {1}) == {2}
  319. assert Interval(0, 1).complement(S.Reals) == \
  320. Union(Interval(-oo, 0, True, True), Interval(1, oo, True, True))
  321. assert Interval(0, 1, True, False).complement(S.Reals) == \
  322. Union(Interval(-oo, 0, True, False), Interval(1, oo, True, True))
  323. assert Interval(0, 1, False, True).complement(S.Reals) == \
  324. Union(Interval(-oo, 0, True, True), Interval(1, oo, False, True))
  325. assert Interval(0, 1, True, True).complement(S.Reals) == \
  326. Union(Interval(-oo, 0, True, False), Interval(1, oo, False, True))
  327. assert S.UniversalSet.complement(S.EmptySet) == S.EmptySet
  328. assert S.UniversalSet.complement(S.Reals) == S.EmptySet
  329. assert S.UniversalSet.complement(S.UniversalSet) == S.EmptySet
  330. assert S.EmptySet.complement(S.Reals) == S.Reals
  331. assert Union(Interval(0, 1), Interval(2, 3)).complement(S.Reals) == \
  332. Union(Interval(-oo, 0, True, True), Interval(1, 2, True, True),
  333. Interval(3, oo, True, True))
  334. assert FiniteSet(0).complement(S.Reals) == \
  335. Union(Interval(-oo, 0, True, True), Interval(0, oo, True, True))
  336. assert (FiniteSet(5) + Interval(S.NegativeInfinity,
  337. 0)).complement(S.Reals) == \
  338. Interval(0, 5, True, True) + Interval(5, S.Infinity, True, True)
  339. assert FiniteSet(1, 2, 3).complement(S.Reals) == \
  340. Interval(S.NegativeInfinity, 1, True, True) + \
  341. Interval(1, 2, True, True) + Interval(2, 3, True, True) +\
  342. Interval(3, S.Infinity, True, True)
  343. assert FiniteSet(x).complement(S.Reals) == Complement(S.Reals, FiniteSet(x))
  344. assert FiniteSet(0, x).complement(S.Reals) == Complement(Interval(-oo, 0, True, True) +
  345. Interval(0, oo, True, True)
  346. , FiniteSet(x), evaluate=False)
  347. square = Interval(0, 1) * Interval(0, 1)
  348. notsquare = square.complement(S.Reals*S.Reals)
  349. assert all(pt in square for pt in [(0, 0), (.5, .5), (1, 0), (1, 1)])
  350. assert not any(
  351. pt in notsquare for pt in [(0, 0), (.5, .5), (1, 0), (1, 1)])
  352. assert not any(pt in square for pt in [(-1, 0), (1.5, .5), (10, 10)])
  353. assert all(pt in notsquare for pt in [(-1, 0), (1.5, .5), (10, 10)])
  354. def test_intersect1():
  355. assert all(S.Integers.intersection(i) is i for i in
  356. (S.Naturals, S.Naturals0))
  357. assert all(i.intersection(S.Integers) is i for i in
  358. (S.Naturals, S.Naturals0))
  359. s = S.Naturals0
  360. assert S.Naturals.intersection(s) is S.Naturals
  361. assert s.intersection(S.Naturals) is S.Naturals
  362. x = Symbol('x')
  363. assert Interval(0, 2).intersect(Interval(1, 2)) == Interval(1, 2)
  364. assert Interval(0, 2).intersect(Interval(1, 2, True)) == \
  365. Interval(1, 2, True)
  366. assert Interval(0, 2, True).intersect(Interval(1, 2)) == \
  367. Interval(1, 2, False, False)
  368. assert Interval(0, 2, True, True).intersect(Interval(1, 2)) == \
  369. Interval(1, 2, False, True)
  370. assert Interval(0, 2).intersect(Union(Interval(0, 1), Interval(2, 3))) == \
  371. Union(Interval(0, 1), Interval(2, 2))
  372. assert FiniteSet(1, 2).intersect(FiniteSet(1, 2, 3)) == FiniteSet(1, 2)
  373. assert FiniteSet(1, 2, x).intersect(FiniteSet(x)) == FiniteSet(x)
  374. assert FiniteSet('ham', 'eggs').intersect(FiniteSet('ham')) == \
  375. FiniteSet('ham')
  376. assert FiniteSet(1, 2, 3, 4, 5).intersect(S.EmptySet) == S.EmptySet
  377. assert Interval(0, 5).intersect(FiniteSet(1, 3)) == FiniteSet(1, 3)
  378. assert Interval(0, 1, True, True).intersect(FiniteSet(1)) == S.EmptySet
  379. assert Union(Interval(0, 1), Interval(2, 3)).intersect(Interval(1, 2)) == \
  380. Union(Interval(1, 1), Interval(2, 2))
  381. assert Union(Interval(0, 1), Interval(2, 3)).intersect(Interval(0, 2)) == \
  382. Union(Interval(0, 1), Interval(2, 2))
  383. assert Union(Interval(0, 1), Interval(2, 3)).intersect(Interval(1, 2, True, True)) == \
  384. S.EmptySet
  385. assert Union(Interval(0, 1), Interval(2, 3)).intersect(S.EmptySet) == \
  386. S.EmptySet
  387. assert Union(Interval(0, 5), FiniteSet('ham')).intersect(FiniteSet(2, 3, 4, 5, 6)) == \
  388. Intersection(FiniteSet(2, 3, 4, 5, 6), Union(FiniteSet('ham'), Interval(0, 5)))
  389. assert Intersection(FiniteSet(1, 2, 3), Interval(2, x), Interval(3, y)) == \
  390. Intersection(FiniteSet(3), Interval(2, x), Interval(3, y), evaluate=False)
  391. assert Intersection(FiniteSet(1, 2), Interval(0, 3), Interval(x, y)) == \
  392. Intersection({1, 2}, Interval(x, y), evaluate=False)
  393. assert Intersection(FiniteSet(1, 2, 4), Interval(0, 3), Interval(x, y)) == \
  394. Intersection({1, 2}, Interval(x, y), evaluate=False)
  395. # XXX: Is the real=True necessary here?
  396. # https://github.com/sympy/sympy/issues/17532
  397. m, n = symbols('m, n', real=True)
  398. assert Intersection(FiniteSet(m), FiniteSet(m, n), Interval(m, m+1)) == \
  399. FiniteSet(m)
  400. # issue 8217
  401. assert Intersection(FiniteSet(x), FiniteSet(y)) == \
  402. Intersection(FiniteSet(x), FiniteSet(y), evaluate=False)
  403. assert FiniteSet(x).intersect(S.Reals) == \
  404. Intersection(S.Reals, FiniteSet(x), evaluate=False)
  405. # tests for the intersection alias
  406. assert Interval(0, 5).intersection(FiniteSet(1, 3)) == FiniteSet(1, 3)
  407. assert Interval(0, 1, True, True).intersection(FiniteSet(1)) == S.EmptySet
  408. assert Union(Interval(0, 1), Interval(2, 3)).intersection(Interval(1, 2)) == \
  409. Union(Interval(1, 1), Interval(2, 2))
  410. def test_intersection():
  411. # iterable
  412. i = Intersection(FiniteSet(1, 2, 3), Interval(2, 5), evaluate=False)
  413. assert i.is_iterable
  414. assert set(i) == {S(2), S(3)}
  415. # challenging intervals
  416. x = Symbol('x', real=True)
  417. i = Intersection(Interval(0, 3), Interval(x, 6))
  418. assert (5 in i) is False
  419. raises(TypeError, lambda: 2 in i)
  420. # Singleton special cases
  421. assert Intersection(Interval(0, 1), S.EmptySet) == S.EmptySet
  422. assert Intersection(Interval(-oo, oo), Interval(-oo, x)) == Interval(-oo, x)
  423. # Products
  424. line = Interval(0, 5)
  425. i = Intersection(line**2, line**3, evaluate=False)
  426. assert (2, 2) not in i
  427. assert (2, 2, 2) not in i
  428. raises(TypeError, lambda: list(i))
  429. a = Intersection(Intersection(S.Integers, S.Naturals, evaluate=False), S.Reals, evaluate=False)
  430. assert a._argset == frozenset([Intersection(S.Naturals, S.Integers, evaluate=False), S.Reals])
  431. assert Intersection(S.Complexes, FiniteSet(S.ComplexInfinity)) == S.EmptySet
  432. # issue 12178
  433. assert Intersection() == S.UniversalSet
  434. # issue 16987
  435. assert Intersection({1}, {1}, {x}) == Intersection({1}, {x})
  436. def test_issue_9623():
  437. n = Symbol('n')
  438. a = S.Reals
  439. b = Interval(0, oo)
  440. c = FiniteSet(n)
  441. assert Intersection(a, b, c) == Intersection(b, c)
  442. assert Intersection(Interval(1, 2), Interval(3, 4), FiniteSet(n)) == EmptySet
  443. def test_is_disjoint():
  444. assert Interval(0, 2).is_disjoint(Interval(1, 2)) == False
  445. assert Interval(0, 2).is_disjoint(Interval(3, 4)) == True
  446. def test_ProductSet__len__():
  447. A = FiniteSet(1, 2)
  448. B = FiniteSet(1, 2, 3)
  449. assert ProductSet(A).__len__() == 2
  450. assert ProductSet(A).__len__() is not S(2)
  451. assert ProductSet(A, B).__len__() == 6
  452. assert ProductSet(A, B).__len__() is not S(6)
  453. def test_ProductSet():
  454. # ProductSet is always a set of Tuples
  455. assert ProductSet(S.Reals) == S.Reals ** 1
  456. assert ProductSet(S.Reals, S.Reals) == S.Reals ** 2
  457. assert ProductSet(S.Reals, S.Reals, S.Reals) == S.Reals ** 3
  458. assert ProductSet(S.Reals) != S.Reals
  459. assert ProductSet(S.Reals, S.Reals) == S.Reals * S.Reals
  460. assert ProductSet(S.Reals, S.Reals, S.Reals) != S.Reals * S.Reals * S.Reals
  461. assert ProductSet(S.Reals, S.Reals, S.Reals) == (S.Reals * S.Reals * S.Reals).flatten()
  462. assert 1 not in ProductSet(S.Reals)
  463. assert (1,) in ProductSet(S.Reals)
  464. assert 1 not in ProductSet(S.Reals, S.Reals)
  465. assert (1, 2) in ProductSet(S.Reals, S.Reals)
  466. assert (1, I) not in ProductSet(S.Reals, S.Reals)
  467. assert (1, 2, 3) in ProductSet(S.Reals, S.Reals, S.Reals)
  468. assert (1, 2, 3) in S.Reals ** 3
  469. assert (1, 2, 3) not in S.Reals * S.Reals * S.Reals
  470. assert ((1, 2), 3) in S.Reals * S.Reals * S.Reals
  471. assert (1, (2, 3)) not in S.Reals * S.Reals * S.Reals
  472. assert (1, (2, 3)) in S.Reals * (S.Reals * S.Reals)
  473. assert ProductSet() == FiniteSet(())
  474. assert ProductSet(S.Reals, S.EmptySet) == S.EmptySet
  475. # See GH-17458
  476. for ni in range(5):
  477. Rn = ProductSet(*(S.Reals,) * ni)
  478. assert (1,) * ni in Rn
  479. assert 1 not in Rn
  480. assert (S.Reals * S.Reals) * S.Reals != S.Reals * (S.Reals * S.Reals)
  481. S1 = S.Reals
  482. S2 = S.Integers
  483. x1 = pi
  484. x2 = 3
  485. assert x1 in S1
  486. assert x2 in S2
  487. assert (x1, x2) in S1 * S2
  488. S3 = S1 * S2
  489. x3 = (x1, x2)
  490. assert x3 in S3
  491. assert (x3, x3) in S3 * S3
  492. assert x3 + x3 not in S3 * S3
  493. raises(ValueError, lambda: S.Reals**-1)
  494. with warns_deprecated_sympy():
  495. ProductSet(FiniteSet(s) for s in range(2))
  496. raises(TypeError, lambda: ProductSet(None))
  497. S1 = FiniteSet(1, 2)
  498. S2 = FiniteSet(3, 4)
  499. S3 = ProductSet(S1, S2)
  500. assert (S3.as_relational(x, y)
  501. == And(S1.as_relational(x), S2.as_relational(y))
  502. == And(Or(Eq(x, 1), Eq(x, 2)), Or(Eq(y, 3), Eq(y, 4))))
  503. raises(ValueError, lambda: S3.as_relational(x))
  504. raises(ValueError, lambda: S3.as_relational(x, 1))
  505. raises(ValueError, lambda: ProductSet(Interval(0, 1)).as_relational(x, y))
  506. Z2 = ProductSet(S.Integers, S.Integers)
  507. assert Z2.contains((1, 2)) is S.true
  508. assert Z2.contains((1,)) is S.false
  509. assert Z2.contains(x) == Contains(x, Z2, evaluate=False)
  510. assert Z2.contains(x).subs(x, 1) is S.false
  511. assert Z2.contains((x, 1)).subs(x, 2) is S.true
  512. assert Z2.contains((x, y)) == Contains((x, y), Z2, evaluate=False)
  513. assert unchanged(Contains, (x, y), Z2)
  514. assert Contains((1, 2), Z2) is S.true
  515. def test_ProductSet_of_single_arg_is_not_arg():
  516. assert unchanged(ProductSet, Interval(0, 1))
  517. assert unchanged(ProductSet, ProductSet(Interval(0, 1)))
  518. def test_ProductSet_is_empty():
  519. assert ProductSet(S.Integers, S.Reals).is_empty == False
  520. assert ProductSet(Interval(x, 1), S.Reals).is_empty == None
  521. def test_interval_subs():
  522. a = Symbol('a', real=True)
  523. assert Interval(0, a).subs(a, 2) == Interval(0, 2)
  524. assert Interval(a, 0).subs(a, 2) == S.EmptySet
  525. def test_interval_to_mpi():
  526. assert Interval(0, 1).to_mpi() == mpi(0, 1)
  527. assert Interval(0, 1, True, False).to_mpi() == mpi(0, 1)
  528. assert type(Interval(0, 1).to_mpi()) == type(mpi(0, 1))
  529. def test_set_evalf():
  530. assert Interval(S(11)/64, S.Half).evalf() == Interval(
  531. Float('0.171875'), Float('0.5'))
  532. assert Interval(x, S.Half, right_open=True).evalf() == Interval(
  533. x, Float('0.5'), right_open=True)
  534. assert Interval(-oo, S.Half).evalf() == Interval(-oo, Float('0.5'))
  535. assert FiniteSet(2, x).evalf() == FiniteSet(Float('2.0'), x)
  536. def test_measure():
  537. a = Symbol('a', real=True)
  538. assert Interval(1, 3).measure == 2
  539. assert Interval(0, a).measure == a
  540. assert Interval(1, a).measure == a - 1
  541. assert Union(Interval(1, 2), Interval(3, 4)).measure == 2
  542. assert Union(Interval(1, 2), Interval(3, 4), FiniteSet(5, 6, 7)).measure \
  543. == 2
  544. assert FiniteSet(1, 2, oo, a, -oo, -5).measure == 0
  545. assert S.EmptySet.measure == 0
  546. square = Interval(0, 10) * Interval(0, 10)
  547. offsetsquare = Interval(5, 15) * Interval(5, 15)
  548. band = Interval(-oo, oo) * Interval(2, 4)
  549. assert square.measure == offsetsquare.measure == 100
  550. assert (square + offsetsquare).measure == 175 # there is some overlap
  551. assert (square - offsetsquare).measure == 75
  552. assert (square * FiniteSet(1, 2, 3)).measure == 0
  553. assert (square.intersect(band)).measure == 20
  554. assert (square + band).measure is oo
  555. assert (band * FiniteSet(1, 2, 3)).measure is nan
  556. def test_is_subset():
  557. assert Interval(0, 1).is_subset(Interval(0, 2)) is True
  558. assert Interval(0, 3).is_subset(Interval(0, 2)) is False
  559. assert Interval(0, 1).is_subset(FiniteSet(0, 1)) is False
  560. assert FiniteSet(1, 2).is_subset(FiniteSet(1, 2, 3, 4))
  561. assert FiniteSet(4, 5).is_subset(FiniteSet(1, 2, 3, 4)) is False
  562. assert FiniteSet(1).is_subset(Interval(0, 2))
  563. assert FiniteSet(1, 2).is_subset(Interval(0, 2, True, True)) is False
  564. assert (Interval(1, 2) + FiniteSet(3)).is_subset(
  565. Interval(0, 2, False, True) + FiniteSet(2, 3))
  566. assert Interval(3, 4).is_subset(Union(Interval(0, 1), Interval(2, 5))) is True
  567. assert Interval(3, 6).is_subset(Union(Interval(0, 1), Interval(2, 5))) is False
  568. assert FiniteSet(1, 2, 3, 4).is_subset(Interval(0, 5)) is True
  569. assert S.EmptySet.is_subset(FiniteSet(1, 2, 3)) is True
  570. assert Interval(0, 1).is_subset(S.EmptySet) is False
  571. assert S.EmptySet.is_subset(S.EmptySet) is True
  572. raises(ValueError, lambda: S.EmptySet.is_subset(1))
  573. # tests for the issubset alias
  574. assert FiniteSet(1, 2, 3, 4).issubset(Interval(0, 5)) is True
  575. assert S.EmptySet.issubset(FiniteSet(1, 2, 3)) is True
  576. assert S.Naturals.is_subset(S.Integers)
  577. assert S.Naturals0.is_subset(S.Integers)
  578. assert FiniteSet(x).is_subset(FiniteSet(y)) is None
  579. assert FiniteSet(x).is_subset(FiniteSet(y).subs(y, x)) is True
  580. assert FiniteSet(x).is_subset(FiniteSet(y).subs(y, x+1)) is False
  581. assert Interval(0, 1).is_subset(Interval(0, 1, left_open=True)) is False
  582. assert Interval(-2, 3).is_subset(Union(Interval(-oo, -2), Interval(3, oo))) is False
  583. n = Symbol('n', integer=True)
  584. assert Range(-3, 4, 1).is_subset(FiniteSet(-10, 10)) is False
  585. assert Range(S(10)**100).is_subset(FiniteSet(0, 1, 2)) is False
  586. assert Range(6, 0, -2).is_subset(FiniteSet(2, 4, 6)) is True
  587. assert Range(1, oo).is_subset(FiniteSet(1, 2)) is False
  588. assert Range(-oo, 1).is_subset(FiniteSet(1)) is False
  589. assert Range(3).is_subset(FiniteSet(0, 1, n)) is None
  590. assert Range(n, n + 2).is_subset(FiniteSet(n, n + 1)) is True
  591. assert Range(5).is_subset(Interval(0, 4, right_open=True)) is False
  592. #issue 19513
  593. assert imageset(Lambda(n, 1/n), S.Integers).is_subset(S.Reals) is None
  594. def test_is_proper_subset():
  595. assert Interval(0, 1).is_proper_subset(Interval(0, 2)) is True
  596. assert Interval(0, 3).is_proper_subset(Interval(0, 2)) is False
  597. assert S.EmptySet.is_proper_subset(FiniteSet(1, 2, 3)) is True
  598. raises(ValueError, lambda: Interval(0, 1).is_proper_subset(0))
  599. def test_is_superset():
  600. assert Interval(0, 1).is_superset(Interval(0, 2)) == False
  601. assert Interval(0, 3).is_superset(Interval(0, 2))
  602. assert FiniteSet(1, 2).is_superset(FiniteSet(1, 2, 3, 4)) == False
  603. assert FiniteSet(4, 5).is_superset(FiniteSet(1, 2, 3, 4)) == False
  604. assert FiniteSet(1).is_superset(Interval(0, 2)) == False
  605. assert FiniteSet(1, 2).is_superset(Interval(0, 2, True, True)) == False
  606. assert (Interval(1, 2) + FiniteSet(3)).is_superset(
  607. Interval(0, 2, False, True) + FiniteSet(2, 3)) == False
  608. assert Interval(3, 4).is_superset(Union(Interval(0, 1), Interval(2, 5))) == False
  609. assert FiniteSet(1, 2, 3, 4).is_superset(Interval(0, 5)) == False
  610. assert S.EmptySet.is_superset(FiniteSet(1, 2, 3)) == False
  611. assert Interval(0, 1).is_superset(S.EmptySet) == True
  612. assert S.EmptySet.is_superset(S.EmptySet) == True
  613. raises(ValueError, lambda: S.EmptySet.is_superset(1))
  614. # tests for the issuperset alias
  615. assert Interval(0, 1).issuperset(S.EmptySet) == True
  616. assert S.EmptySet.issuperset(S.EmptySet) == True
  617. def test_is_proper_superset():
  618. assert Interval(0, 1).is_proper_superset(Interval(0, 2)) is False
  619. assert Interval(0, 3).is_proper_superset(Interval(0, 2)) is True
  620. assert FiniteSet(1, 2, 3).is_proper_superset(S.EmptySet) is True
  621. raises(ValueError, lambda: Interval(0, 1).is_proper_superset(0))
  622. def test_contains():
  623. assert Interval(0, 2).contains(1) is S.true
  624. assert Interval(0, 2).contains(3) is S.false
  625. assert Interval(0, 2, True, False).contains(0) is S.false
  626. assert Interval(0, 2, True, False).contains(2) is S.true
  627. assert Interval(0, 2, False, True).contains(0) is S.true
  628. assert Interval(0, 2, False, True).contains(2) is S.false
  629. assert Interval(0, 2, True, True).contains(0) is S.false
  630. assert Interval(0, 2, True, True).contains(2) is S.false
  631. assert (Interval(0, 2) in Interval(0, 2)) is False
  632. assert FiniteSet(1, 2, 3).contains(2) is S.true
  633. assert FiniteSet(1, 2, Symbol('x')).contains(Symbol('x')) is S.true
  634. assert FiniteSet(y)._contains(x) is None
  635. raises(TypeError, lambda: x in FiniteSet(y))
  636. assert FiniteSet({x, y})._contains({x}) is None
  637. assert FiniteSet({x, y}).subs(y, x)._contains({x}) is True
  638. assert FiniteSet({x, y}).subs(y, x+1)._contains({x}) is False
  639. # issue 8197
  640. from sympy.abc import a, b
  641. assert isinstance(FiniteSet(b).contains(-a), Contains)
  642. assert isinstance(FiniteSet(b).contains(a), Contains)
  643. assert isinstance(FiniteSet(a).contains(1), Contains)
  644. raises(TypeError, lambda: 1 in FiniteSet(a))
  645. # issue 8209
  646. rad1 = Pow(Pow(2, Rational(1, 3)) - 1, Rational(1, 3))
  647. rad2 = Pow(Rational(1, 9), Rational(1, 3)) - Pow(Rational(2, 9), Rational(1, 3)) + Pow(Rational(4, 9), Rational(1, 3))
  648. s1 = FiniteSet(rad1)
  649. s2 = FiniteSet(rad2)
  650. assert s1 - s2 == S.EmptySet
  651. items = [1, 2, S.Infinity, S('ham'), -1.1]
  652. fset = FiniteSet(*items)
  653. assert all(item in fset for item in items)
  654. assert all(fset.contains(item) is S.true for item in items)
  655. assert Union(Interval(0, 1), Interval(2, 5)).contains(3) is S.true
  656. assert Union(Interval(0, 1), Interval(2, 5)).contains(6) is S.false
  657. assert Union(Interval(0, 1), FiniteSet(2, 5)).contains(3) is S.false
  658. assert S.EmptySet.contains(1) is S.false
  659. assert FiniteSet(rootof(x**3 + x - 1, 0)).contains(S.Infinity) is S.false
  660. assert rootof(x**5 + x**3 + 1, 0) in S.Reals
  661. assert not rootof(x**5 + x**3 + 1, 1) in S.Reals
  662. # non-bool results
  663. assert Union(Interval(1, 2), Interval(3, 4)).contains(x) == \
  664. Or(And(S.One <= x, x <= 2), And(S(3) <= x, x <= 4))
  665. assert Intersection(Interval(1, x), Interval(2, 3)).contains(y) == \
  666. And(y <= 3, y <= x, S.One <= y, S(2) <= y)
  667. assert (S.Complexes).contains(S.ComplexInfinity) == S.false
  668. def test_interval_symbolic():
  669. x = Symbol('x')
  670. e = Interval(0, 1)
  671. assert e.contains(x) == And(S.Zero <= x, x <= 1)
  672. raises(TypeError, lambda: x in e)
  673. e = Interval(0, 1, True, True)
  674. assert e.contains(x) == And(S.Zero < x, x < 1)
  675. c = Symbol('c', real=False)
  676. assert Interval(x, x + 1).contains(c) == False
  677. e = Symbol('e', extended_real=True)
  678. assert Interval(-oo, oo).contains(e) == And(
  679. S.NegativeInfinity < e, e < S.Infinity)
  680. def test_union_contains():
  681. x = Symbol('x')
  682. i1 = Interval(0, 1)
  683. i2 = Interval(2, 3)
  684. i3 = Union(i1, i2)
  685. assert i3.as_relational(x) == Or(And(S.Zero <= x, x <= 1), And(S(2) <= x, x <= 3))
  686. raises(TypeError, lambda: x in i3)
  687. e = i3.contains(x)
  688. assert e == i3.as_relational(x)
  689. assert e.subs(x, -0.5) is false
  690. assert e.subs(x, 0.5) is true
  691. assert e.subs(x, 1.5) is false
  692. assert e.subs(x, 2.5) is true
  693. assert e.subs(x, 3.5) is false
  694. U = Interval(0, 2, True, True) + Interval(10, oo) + FiniteSet(-1, 2, 5, 6)
  695. assert all(el not in U for el in [0, 4, -oo])
  696. assert all(el in U for el in [2, 5, 10])
  697. def test_is_number():
  698. assert Interval(0, 1).is_number is False
  699. assert Set().is_number is False
  700. def test_Interval_is_left_unbounded():
  701. assert Interval(3, 4).is_left_unbounded is False
  702. assert Interval(-oo, 3).is_left_unbounded is True
  703. assert Interval(Float("-inf"), 3).is_left_unbounded is True
  704. def test_Interval_is_right_unbounded():
  705. assert Interval(3, 4).is_right_unbounded is False
  706. assert Interval(3, oo).is_right_unbounded is True
  707. assert Interval(3, Float("+inf")).is_right_unbounded is True
  708. def test_Interval_as_relational():
  709. x = Symbol('x')
  710. assert Interval(-1, 2, False, False).as_relational(x) == \
  711. And(Le(-1, x), Le(x, 2))
  712. assert Interval(-1, 2, True, False).as_relational(x) == \
  713. And(Lt(-1, x), Le(x, 2))
  714. assert Interval(-1, 2, False, True).as_relational(x) == \
  715. And(Le(-1, x), Lt(x, 2))
  716. assert Interval(-1, 2, True, True).as_relational(x) == \
  717. And(Lt(-1, x), Lt(x, 2))
  718. assert Interval(-oo, 2, right_open=False).as_relational(x) == And(Lt(-oo, x), Le(x, 2))
  719. assert Interval(-oo, 2, right_open=True).as_relational(x) == And(Lt(-oo, x), Lt(x, 2))
  720. assert Interval(-2, oo, left_open=False).as_relational(x) == And(Le(-2, x), Lt(x, oo))
  721. assert Interval(-2, oo, left_open=True).as_relational(x) == And(Lt(-2, x), Lt(x, oo))
  722. assert Interval(-oo, oo).as_relational(x) == And(Lt(-oo, x), Lt(x, oo))
  723. x = Symbol('x', real=True)
  724. y = Symbol('y', real=True)
  725. assert Interval(x, y).as_relational(x) == (x <= y)
  726. assert Interval(y, x).as_relational(x) == (y <= x)
  727. def test_Finite_as_relational():
  728. x = Symbol('x')
  729. y = Symbol('y')
  730. assert FiniteSet(1, 2).as_relational(x) == Or(Eq(x, 1), Eq(x, 2))
  731. assert FiniteSet(y, -5).as_relational(x) == Or(Eq(x, y), Eq(x, -5))
  732. def test_Union_as_relational():
  733. x = Symbol('x')
  734. assert (Interval(0, 1) + FiniteSet(2)).as_relational(x) == \
  735. Or(And(Le(0, x), Le(x, 1)), Eq(x, 2))
  736. assert (Interval(0, 1, True, True) + FiniteSet(1)).as_relational(x) == \
  737. And(Lt(0, x), Le(x, 1))
  738. assert Or(x < 0, x > 0).as_set().as_relational(x) == \
  739. And((x > -oo), (x < oo), Ne(x, 0))
  740. assert (Interval.Ropen(1, 3) + Interval.Lopen(3, 5)
  741. ).as_relational(x) == And((x > 1), (x < 5), Ne(x, 3))
  742. def test_Intersection_as_relational():
  743. x = Symbol('x')
  744. assert (Intersection(Interval(0, 1), FiniteSet(2),
  745. evaluate=False).as_relational(x)
  746. == And(And(Le(0, x), Le(x, 1)), Eq(x, 2)))
  747. def test_Complement_as_relational():
  748. x = Symbol('x')
  749. expr = Complement(Interval(0, 1), FiniteSet(2), evaluate=False)
  750. assert expr.as_relational(x) == \
  751. And(Le(0, x), Le(x, 1), Ne(x, 2))
  752. @XFAIL
  753. def test_Complement_as_relational_fail():
  754. x = Symbol('x')
  755. expr = Complement(Interval(0, 1), FiniteSet(2), evaluate=False)
  756. # XXX This example fails because 0 <= x changes to x >= 0
  757. # during the evaluation.
  758. assert expr.as_relational(x) == \
  759. (0 <= x) & (x <= 1) & Ne(x, 2)
  760. def test_SymmetricDifference_as_relational():
  761. x = Symbol('x')
  762. expr = SymmetricDifference(Interval(0, 1), FiniteSet(2), evaluate=False)
  763. assert expr.as_relational(x) == Xor(Eq(x, 2), Le(0, x) & Le(x, 1))
  764. def test_EmptySet():
  765. assert S.EmptySet.as_relational(Symbol('x')) is S.false
  766. assert S.EmptySet.intersect(S.UniversalSet) == S.EmptySet
  767. assert S.EmptySet.boundary == S.EmptySet
  768. def test_finite_basic():
  769. x = Symbol('x')
  770. A = FiniteSet(1, 2, 3)
  771. B = FiniteSet(3, 4, 5)
  772. AorB = Union(A, B)
  773. AandB = A.intersect(B)
  774. assert A.is_subset(AorB) and B.is_subset(AorB)
  775. assert AandB.is_subset(A)
  776. assert AandB == FiniteSet(3)
  777. assert A.inf == 1 and A.sup == 3
  778. assert AorB.inf == 1 and AorB.sup == 5
  779. assert FiniteSet(x, 1, 5).sup == Max(x, 5)
  780. assert FiniteSet(x, 1, 5).inf == Min(x, 1)
  781. # issue 7335
  782. assert FiniteSet(S.EmptySet) != S.EmptySet
  783. assert FiniteSet(FiniteSet(1, 2, 3)) != FiniteSet(1, 2, 3)
  784. assert FiniteSet((1, 2, 3)) != FiniteSet(1, 2, 3)
  785. # Ensure a variety of types can exist in a FiniteSet
  786. assert FiniteSet((1, 2), A, -5, x, 'eggs', x**2)
  787. assert (A > B) is False
  788. assert (A >= B) is False
  789. assert (A < B) is False
  790. assert (A <= B) is False
  791. assert AorB > A and AorB > B
  792. assert AorB >= A and AorB >= B
  793. assert A >= A and A <= A
  794. assert A >= AandB and B >= AandB
  795. assert A > AandB and B > AandB
  796. def test_product_basic():
  797. H, T = 'H', 'T'
  798. unit_line = Interval(0, 1)
  799. d6 = FiniteSet(1, 2, 3, 4, 5, 6)
  800. d4 = FiniteSet(1, 2, 3, 4)
  801. coin = FiniteSet(H, T)
  802. square = unit_line * unit_line
  803. assert (0, 0) in square
  804. assert 0 not in square
  805. assert (H, T) in coin ** 2
  806. assert (.5, .5, .5) in (square * unit_line).flatten()
  807. assert ((.5, .5), .5) in square * unit_line
  808. assert (H, 3, 3) in (coin * d6 * d6).flatten()
  809. assert ((H, 3), 3) in coin * d6 * d6
  810. HH, TT = sympify(H), sympify(T)
  811. assert set(coin**2) == {(HH, HH), (HH, TT), (TT, HH), (TT, TT)}
  812. assert (d4*d4).is_subset(d6*d6)
  813. assert square.complement(Interval(-oo, oo)*Interval(-oo, oo)) == Union(
  814. (Interval(-oo, 0, True, True) +
  815. Interval(1, oo, True, True))*Interval(-oo, oo),
  816. Interval(-oo, oo)*(Interval(-oo, 0, True, True) +
  817. Interval(1, oo, True, True)))
  818. assert (Interval(-5, 5)**3).is_subset(Interval(-10, 10)**3)
  819. assert not (Interval(-10, 10)**3).is_subset(Interval(-5, 5)**3)
  820. assert not (Interval(-5, 5)**2).is_subset(Interval(-10, 10)**3)
  821. assert (Interval(.2, .5)*FiniteSet(.5)).is_subset(square) # segment in square
  822. assert len(coin*coin*coin) == 8
  823. assert len(S.EmptySet*S.EmptySet) == 0
  824. assert len(S.EmptySet*coin) == 0
  825. raises(TypeError, lambda: len(coin*Interval(0, 2)))
  826. def test_real():
  827. x = Symbol('x', real=True)
  828. I = Interval(0, 5)
  829. J = Interval(10, 20)
  830. A = FiniteSet(1, 2, 30, x, S.Pi)
  831. B = FiniteSet(-4, 0)
  832. C = FiniteSet(100)
  833. D = FiniteSet('Ham', 'Eggs')
  834. assert all(s.is_subset(S.Reals) for s in [I, J, A, B, C])
  835. assert not D.is_subset(S.Reals)
  836. assert all((a + b).is_subset(S.Reals) for a in [I, J, A, B, C] for b in [I, J, A, B, C])
  837. assert not any((a + D).is_subset(S.Reals) for a in [I, J, A, B, C, D])
  838. assert not (I + A + D).is_subset(S.Reals)
  839. def test_supinf():
  840. x = Symbol('x', real=True)
  841. y = Symbol('y', real=True)
  842. assert (Interval(0, 1) + FiniteSet(2)).sup == 2
  843. assert (Interval(0, 1) + FiniteSet(2)).inf == 0
  844. assert (Interval(0, 1) + FiniteSet(x)).sup == Max(1, x)
  845. assert (Interval(0, 1) + FiniteSet(x)).inf == Min(0, x)
  846. assert FiniteSet(5, 1, x).sup == Max(5, x)
  847. assert FiniteSet(5, 1, x).inf == Min(1, x)
  848. assert FiniteSet(5, 1, x, y).sup == Max(5, x, y)
  849. assert FiniteSet(5, 1, x, y).inf == Min(1, x, y)
  850. assert FiniteSet(5, 1, x, y, S.Infinity, S.NegativeInfinity).sup == \
  851. S.Infinity
  852. assert FiniteSet(5, 1, x, y, S.Infinity, S.NegativeInfinity).inf == \
  853. S.NegativeInfinity
  854. assert FiniteSet('Ham', 'Eggs').sup == Max('Ham', 'Eggs')
  855. def test_universalset():
  856. U = S.UniversalSet
  857. x = Symbol('x')
  858. assert U.as_relational(x) is S.true
  859. assert U.union(Interval(2, 4)) == U
  860. assert U.intersect(Interval(2, 4)) == Interval(2, 4)
  861. assert U.measure is S.Infinity
  862. assert U.boundary == S.EmptySet
  863. assert U.contains(0) is S.true
  864. def test_Union_of_ProductSets_shares():
  865. line = Interval(0, 2)
  866. points = FiniteSet(0, 1, 2)
  867. assert Union(line * line, line * points) == line * line
  868. def test_Interval_free_symbols():
  869. # issue 6211
  870. assert Interval(0, 1).free_symbols == set()
  871. x = Symbol('x', real=True)
  872. assert Interval(0, x).free_symbols == {x}
  873. def test_image_interval():
  874. x = Symbol('x', real=True)
  875. a = Symbol('a', real=True)
  876. assert imageset(x, 2*x, Interval(-2, 1)) == Interval(-4, 2)
  877. assert imageset(x, 2*x, Interval(-2, 1, True, False)) == \
  878. Interval(-4, 2, True, False)
  879. assert imageset(x, x**2, Interval(-2, 1, True, False)) == \
  880. Interval(0, 4, False, True)
  881. assert imageset(x, x**2, Interval(-2, 1)) == Interval(0, 4)
  882. assert imageset(x, x**2, Interval(-2, 1, True, False)) == \
  883. Interval(0, 4, False, True)
  884. assert imageset(x, x**2, Interval(-2, 1, True, True)) == \
  885. Interval(0, 4, False, True)
  886. assert imageset(x, (x - 2)**2, Interval(1, 3)) == Interval(0, 1)
  887. assert imageset(x, 3*x**4 - 26*x**3 + 78*x**2 - 90*x, Interval(0, 4)) == \
  888. Interval(-35, 0) # Multiple Maxima
  889. assert imageset(x, x + 1/x, Interval(-oo, oo)) == Interval(-oo, -2) \
  890. + Interval(2, oo) # Single Infinite discontinuity
  891. assert imageset(x, 1/x + 1/(x-1)**2, Interval(0, 2, True, False)) == \
  892. Interval(Rational(3, 2), oo, False) # Multiple Infinite discontinuities
  893. # Test for Python lambda
  894. assert imageset(lambda x: 2*x, Interval(-2, 1)) == Interval(-4, 2)
  895. assert imageset(Lambda(x, a*x), Interval(0, 1)) == \
  896. ImageSet(Lambda(x, a*x), Interval(0, 1))
  897. assert imageset(Lambda(x, sin(cos(x))), Interval(0, 1)) == \
  898. ImageSet(Lambda(x, sin(cos(x))), Interval(0, 1))
  899. def test_image_piecewise():
  900. f = Piecewise((x, x <= -1), (1/x**2, x <= 5), (x**3, True))
  901. f1 = Piecewise((0, x <= 1), (1, x <= 2), (2, True))
  902. assert imageset(x, f, Interval(-5, 5)) == Union(Interval(-5, -1), Interval(Rational(1, 25), oo))
  903. assert imageset(x, f1, Interval(1, 2)) == FiniteSet(0, 1)
  904. @XFAIL # See: https://github.com/sympy/sympy/pull/2723#discussion_r8659826
  905. def test_image_Intersection():
  906. x = Symbol('x', real=True)
  907. y = Symbol('y', real=True)
  908. assert imageset(x, x**2, Interval(-2, 0).intersect(Interval(x, y))) == \
  909. Interval(0, 4).intersect(Interval(Min(x**2, y**2), Max(x**2, y**2)))
  910. def test_image_FiniteSet():
  911. x = Symbol('x', real=True)
  912. assert imageset(x, 2*x, FiniteSet(1, 2, 3)) == FiniteSet(2, 4, 6)
  913. def test_image_Union():
  914. x = Symbol('x', real=True)
  915. assert imageset(x, x**2, Interval(-2, 0) + FiniteSet(1, 2, 3)) == \
  916. (Interval(0, 4) + FiniteSet(9))
  917. def test_image_EmptySet():
  918. x = Symbol('x', real=True)
  919. assert imageset(x, 2*x, S.EmptySet) == S.EmptySet
  920. def test_issue_5724_7680():
  921. assert I not in S.Reals # issue 7680
  922. assert Interval(-oo, oo).contains(I) is S.false
  923. def test_boundary():
  924. assert FiniteSet(1).boundary == FiniteSet(1)
  925. assert all(Interval(0, 1, left_open, right_open).boundary == FiniteSet(0, 1)
  926. for left_open in (true, false) for right_open in (true, false))
  927. def test_boundary_Union():
  928. assert (Interval(0, 1) + Interval(2, 3)).boundary == FiniteSet(0, 1, 2, 3)
  929. assert ((Interval(0, 1, False, True)
  930. + Interval(1, 2, True, False)).boundary == FiniteSet(0, 1, 2))
  931. assert (Interval(0, 1) + FiniteSet(2)).boundary == FiniteSet(0, 1, 2)
  932. assert Union(Interval(0, 10), Interval(5, 15), evaluate=False).boundary \
  933. == FiniteSet(0, 15)
  934. assert Union(Interval(0, 10), Interval(0, 1), evaluate=False).boundary \
  935. == FiniteSet(0, 10)
  936. assert Union(Interval(0, 10, True, True),
  937. Interval(10, 15, True, True), evaluate=False).boundary \
  938. == FiniteSet(0, 10, 15)
  939. @XFAIL
  940. def test_union_boundary_of_joining_sets():
  941. """ Testing the boundary of unions is a hard problem """
  942. assert Union(Interval(0, 10), Interval(10, 15), evaluate=False).boundary \
  943. == FiniteSet(0, 15)
  944. def test_boundary_ProductSet():
  945. open_square = Interval(0, 1, True, True) ** 2
  946. assert open_square.boundary == (FiniteSet(0, 1) * Interval(0, 1)
  947. + Interval(0, 1) * FiniteSet(0, 1))
  948. second_square = Interval(1, 2, True, True) * Interval(0, 1, True, True)
  949. assert (open_square + second_square).boundary == (
  950. FiniteSet(0, 1) * Interval(0, 1)
  951. + FiniteSet(1, 2) * Interval(0, 1)
  952. + Interval(0, 1) * FiniteSet(0, 1)
  953. + Interval(1, 2) * FiniteSet(0, 1))
  954. def test_boundary_ProductSet_line():
  955. line_in_r2 = Interval(0, 1) * FiniteSet(0)
  956. assert line_in_r2.boundary == line_in_r2
  957. def test_is_open():
  958. assert Interval(0, 1, False, False).is_open is False
  959. assert Interval(0, 1, True, False).is_open is False
  960. assert Interval(0, 1, True, True).is_open is True
  961. assert FiniteSet(1, 2, 3).is_open is False
  962. def test_is_closed():
  963. assert Interval(0, 1, False, False).is_closed is True
  964. assert Interval(0, 1, True, False).is_closed is False
  965. assert FiniteSet(1, 2, 3).is_closed is True
  966. def test_closure():
  967. assert Interval(0, 1, False, True).closure == Interval(0, 1, False, False)
  968. def test_interior():
  969. assert Interval(0, 1, False, True).interior == Interval(0, 1, True, True)
  970. def test_issue_7841():
  971. raises(TypeError, lambda: x in S.Reals)
  972. def test_Eq():
  973. assert Eq(Interval(0, 1), Interval(0, 1))
  974. assert Eq(Interval(0, 1), Interval(0, 2)) == False
  975. s1 = FiniteSet(0, 1)
  976. s2 = FiniteSet(1, 2)
  977. assert Eq(s1, s1)
  978. assert Eq(s1, s2) == False
  979. assert Eq(s1*s2, s1*s2)
  980. assert Eq(s1*s2, s2*s1) == False
  981. assert unchanged(Eq, FiniteSet({x, y}), FiniteSet({x}))
  982. assert Eq(FiniteSet({x, y}).subs(y, x), FiniteSet({x})) is S.true
  983. assert Eq(FiniteSet({x, y}), FiniteSet({x})).subs(y, x) is S.true
  984. assert Eq(FiniteSet({x, y}).subs(y, x+1), FiniteSet({x})) is S.false
  985. assert Eq(FiniteSet({x, y}), FiniteSet({x})).subs(y, x+1) is S.false
  986. assert Eq(ProductSet({1}, {2}), Interval(1, 2)) is S.false
  987. assert Eq(ProductSet({1}), ProductSet({1}, {2})) is S.false
  988. assert Eq(FiniteSet(()), FiniteSet(1)) is S.false
  989. assert Eq(ProductSet(), FiniteSet(1)) is S.false
  990. i1 = Interval(0, 1)
  991. i2 = Interval(x, y)
  992. assert unchanged(Eq, ProductSet(i1, i1), ProductSet(i2, i2))
  993. def test_SymmetricDifference():
  994. A = FiniteSet(0, 1, 2, 3, 4, 5)
  995. B = FiniteSet(2, 4, 6, 8, 10)
  996. C = Interval(8, 10)
  997. assert SymmetricDifference(A, B, evaluate=False).is_iterable is True
  998. assert SymmetricDifference(A, C, evaluate=False).is_iterable is None
  999. assert FiniteSet(*SymmetricDifference(A, B, evaluate=False)) == \
  1000. FiniteSet(0, 1, 3, 5, 6, 8, 10)
  1001. raises(TypeError,
  1002. lambda: FiniteSet(*SymmetricDifference(A, C, evaluate=False)))
  1003. assert SymmetricDifference(FiniteSet(0, 1, 2, 3, 4, 5), \
  1004. FiniteSet(2, 4, 6, 8, 10)) == FiniteSet(0, 1, 3, 5, 6, 8, 10)
  1005. assert SymmetricDifference(FiniteSet(2, 3, 4), FiniteSet(2, 3, 4 ,5)) \
  1006. == FiniteSet(5)
  1007. assert FiniteSet(1, 2, 3, 4, 5) ^ FiniteSet(1, 2, 5, 6) == \
  1008. FiniteSet(3, 4, 6)
  1009. assert Set(S(1), S(2), S(3)) ^ Set(S(2), S(3), S(4)) == Union(Set(S(1), S(2), S(3)) - Set(S(2), S(3), S(4)), \
  1010. Set(S(2), S(3), S(4)) - Set(S(1), S(2), S(3)))
  1011. assert Interval(0, 4) ^ Interval(2, 5) == Union(Interval(0, 4) - \
  1012. Interval(2, 5), Interval(2, 5) - Interval(0, 4))
  1013. def test_issue_9536():
  1014. from sympy.functions.elementary.exponential import log
  1015. a = Symbol('a', real=True)
  1016. assert FiniteSet(log(a)).intersect(S.Reals) == Intersection(S.Reals, FiniteSet(log(a)))
  1017. def test_issue_9637():
  1018. n = Symbol('n')
  1019. a = FiniteSet(n)
  1020. b = FiniteSet(2, n)
  1021. assert Complement(S.Reals, a) == Complement(S.Reals, a, evaluate=False)
  1022. assert Complement(Interval(1, 3), a) == Complement(Interval(1, 3), a, evaluate=False)
  1023. assert Complement(Interval(1, 3), b) == \
  1024. Complement(Union(Interval(1, 2, False, True), Interval(2, 3, True, False)), a)
  1025. assert Complement(a, S.Reals) == Complement(a, S.Reals, evaluate=False)
  1026. assert Complement(a, Interval(1, 3)) == Complement(a, Interval(1, 3), evaluate=False)
  1027. def test_issue_9808():
  1028. # See https://github.com/sympy/sympy/issues/16342
  1029. assert Complement(FiniteSet(y), FiniteSet(1)) == Complement(FiniteSet(y), FiniteSet(1), evaluate=False)
  1030. assert Complement(FiniteSet(1, 2, x), FiniteSet(x, y, 2, 3)) == \
  1031. Complement(FiniteSet(1), FiniteSet(y), evaluate=False)
  1032. def test_issue_9956():
  1033. assert Union(Interval(-oo, oo), FiniteSet(1)) == Interval(-oo, oo)
  1034. assert Interval(-oo, oo).contains(1) is S.true
  1035. def test_issue_Symbol_inter():
  1036. i = Interval(0, oo)
  1037. r = S.Reals
  1038. mat = Matrix([0, 0, 0])
  1039. assert Intersection(r, i, FiniteSet(m), FiniteSet(m, n)) == \
  1040. Intersection(i, FiniteSet(m))
  1041. assert Intersection(FiniteSet(1, m, n), FiniteSet(m, n, 2), i) == \
  1042. Intersection(i, FiniteSet(m, n))
  1043. assert Intersection(FiniteSet(m, n, x), FiniteSet(m, z), r) == \
  1044. Intersection(Intersection({m, z}, {m, n, x}), r)
  1045. assert Intersection(FiniteSet(m, n, 3), FiniteSet(m, n, x), r) == \
  1046. Intersection(FiniteSet(3, m, n), FiniteSet(m, n, x), r, evaluate=False)
  1047. assert Intersection(FiniteSet(m, n, 3), FiniteSet(m, n, 2, 3), r) == \
  1048. Intersection(FiniteSet(3, m, n), r)
  1049. assert Intersection(r, FiniteSet(mat, 2, n), FiniteSet(0, mat, n)) == \
  1050. Intersection(r, FiniteSet(n))
  1051. assert Intersection(FiniteSet(sin(x), cos(x)), FiniteSet(sin(x), cos(x), 1), r) == \
  1052. Intersection(r, FiniteSet(sin(x), cos(x)))
  1053. assert Intersection(FiniteSet(x**2, 1, sin(x)), FiniteSet(x**2, 2, sin(x)), r) == \
  1054. Intersection(r, FiniteSet(x**2, sin(x)))
  1055. def test_issue_11827():
  1056. assert S.Naturals0**4
  1057. def test_issue_10113():
  1058. f = x**2/(x**2 - 4)
  1059. assert imageset(x, f, S.Reals) == Union(Interval(-oo, 0), Interval(1, oo, True, True))
  1060. assert imageset(x, f, Interval(-2, 2)) == Interval(-oo, 0)
  1061. assert imageset(x, f, Interval(-2, 3)) == Union(Interval(-oo, 0), Interval(Rational(9, 5), oo))
  1062. def test_issue_10248():
  1063. raises(
  1064. TypeError, lambda: list(Intersection(S.Reals, FiniteSet(x)))
  1065. )
  1066. A = Symbol('A', real=True)
  1067. assert list(Intersection(S.Reals, FiniteSet(A))) == [A]
  1068. def test_issue_9447():
  1069. a = Interval(0, 1) + Interval(2, 3)
  1070. assert Complement(S.UniversalSet, a) == Complement(
  1071. S.UniversalSet, Union(Interval(0, 1), Interval(2, 3)), evaluate=False)
  1072. assert Complement(S.Naturals, a) == Complement(
  1073. S.Naturals, Union(Interval(0, 1), Interval(2, 3)), evaluate=False)
  1074. def test_issue_10337():
  1075. assert (FiniteSet(2) == 3) is False
  1076. assert (FiniteSet(2) != 3) is True
  1077. raises(TypeError, lambda: FiniteSet(2) < 3)
  1078. raises(TypeError, lambda: FiniteSet(2) <= 3)
  1079. raises(TypeError, lambda: FiniteSet(2) > 3)
  1080. raises(TypeError, lambda: FiniteSet(2) >= 3)
  1081. def test_issue_10326():
  1082. bad = [
  1083. EmptySet,
  1084. FiniteSet(1),
  1085. Interval(1, 2),
  1086. S.ComplexInfinity,
  1087. S.ImaginaryUnit,
  1088. S.Infinity,
  1089. S.NaN,
  1090. S.NegativeInfinity,
  1091. ]
  1092. interval = Interval(0, 5)
  1093. for i in bad:
  1094. assert i not in interval
  1095. x = Symbol('x', real=True)
  1096. nr = Symbol('nr', extended_real=False)
  1097. assert x + 1 in Interval(x, x + 4)
  1098. assert nr not in Interval(x, x + 4)
  1099. assert Interval(1, 2) in FiniteSet(Interval(0, 5), Interval(1, 2))
  1100. assert Interval(-oo, oo).contains(oo) is S.false
  1101. assert Interval(-oo, oo).contains(-oo) is S.false
  1102. def test_issue_2799():
  1103. U = S.UniversalSet
  1104. a = Symbol('a', real=True)
  1105. inf_interval = Interval(a, oo)
  1106. R = S.Reals
  1107. assert U + inf_interval == inf_interval + U
  1108. assert U + R == R + U
  1109. assert R + inf_interval == inf_interval + R
  1110. def test_issue_9706():
  1111. assert Interval(-oo, 0).closure == Interval(-oo, 0, True, False)
  1112. assert Interval(0, oo).closure == Interval(0, oo, False, True)
  1113. assert Interval(-oo, oo).closure == Interval(-oo, oo)
  1114. def test_issue_8257():
  1115. reals_plus_infinity = Union(Interval(-oo, oo), FiniteSet(oo))
  1116. reals_plus_negativeinfinity = Union(Interval(-oo, oo), FiniteSet(-oo))
  1117. assert Interval(-oo, oo) + FiniteSet(oo) == reals_plus_infinity
  1118. assert FiniteSet(oo) + Interval(-oo, oo) == reals_plus_infinity
  1119. assert Interval(-oo, oo) + FiniteSet(-oo) == reals_plus_negativeinfinity
  1120. assert FiniteSet(-oo) + Interval(-oo, oo) == reals_plus_negativeinfinity
  1121. def test_issue_10931():
  1122. assert S.Integers - S.Integers == EmptySet
  1123. assert S.Integers - S.Reals == EmptySet
  1124. def test_issue_11174():
  1125. soln = Intersection(Interval(-oo, oo), FiniteSet(-x), evaluate=False)
  1126. assert Intersection(FiniteSet(-x), S.Reals) == soln
  1127. soln = Intersection(S.Reals, FiniteSet(x), evaluate=False)
  1128. assert Intersection(FiniteSet(x), S.Reals) == soln
  1129. def test_issue_18505():
  1130. assert ImageSet(Lambda(n, sqrt(pi*n/2 - 1 + pi/2)), S.Integers).contains(0) == \
  1131. Contains(0, ImageSet(Lambda(n, sqrt(pi*n/2 - 1 + pi/2)), S.Integers))
  1132. def test_finite_set_intersection():
  1133. # The following should not produce recursion errors
  1134. # Note: some of these are not completely correct. See
  1135. # https://github.com/sympy/sympy/issues/16342.
  1136. assert Intersection(FiniteSet(-oo, x), FiniteSet(x)) == FiniteSet(x)
  1137. assert Intersection._handle_finite_sets([FiniteSet(-oo, x), FiniteSet(0, x)]) == FiniteSet(x)
  1138. assert Intersection._handle_finite_sets([FiniteSet(-oo, x), FiniteSet(x)]) == FiniteSet(x)
  1139. assert Intersection._handle_finite_sets([FiniteSet(2, 3, x, y), FiniteSet(1, 2, x)]) == \
  1140. Intersection._handle_finite_sets([FiniteSet(1, 2, x), FiniteSet(2, 3, x, y)]) == \
  1141. Intersection(FiniteSet(1, 2, x), FiniteSet(2, 3, x, y)) == \
  1142. Intersection(FiniteSet(1, 2, x), FiniteSet(2, x, y))
  1143. assert FiniteSet(1+x-y) & FiniteSet(1) == \
  1144. FiniteSet(1) & FiniteSet(1+x-y) == \
  1145. Intersection(FiniteSet(1+x-y), FiniteSet(1), evaluate=False)
  1146. assert FiniteSet(1) & FiniteSet(x) == FiniteSet(x) & FiniteSet(1) == \
  1147. Intersection(FiniteSet(1), FiniteSet(x), evaluate=False)
  1148. assert FiniteSet({x}) & FiniteSet({x, y}) == \
  1149. Intersection(FiniteSet({x}), FiniteSet({x, y}), evaluate=False)
  1150. def test_union_intersection_constructor():
  1151. # The actual exception does not matter here, so long as these fail
  1152. sets = [FiniteSet(1), FiniteSet(2)]
  1153. raises(Exception, lambda: Union(sets))
  1154. raises(Exception, lambda: Intersection(sets))
  1155. raises(Exception, lambda: Union(tuple(sets)))
  1156. raises(Exception, lambda: Intersection(tuple(sets)))
  1157. raises(Exception, lambda: Union(i for i in sets))
  1158. raises(Exception, lambda: Intersection(i for i in sets))
  1159. # Python sets are treated the same as FiniteSet
  1160. # The union of a single set (of sets) is the set (of sets) itself
  1161. assert Union(set(sets)) == FiniteSet(*sets)
  1162. assert Intersection(set(sets)) == FiniteSet(*sets)
  1163. assert Union({1}, {2}) == FiniteSet(1, 2)
  1164. assert Intersection({1, 2}, {2, 3}) == FiniteSet(2)
  1165. def test_Union_contains():
  1166. assert zoo not in Union(
  1167. Interval.open(-oo, 0), Interval.open(0, oo))
  1168. @XFAIL
  1169. def test_issue_16878b():
  1170. # in intersection_sets for (ImageSet, Set) there is no code
  1171. # that handles the base_set of S.Reals like there is
  1172. # for Integers
  1173. assert imageset(x, (x, x), S.Reals).is_subset(S.Reals**2) is True
  1174. def test_DisjointUnion():
  1175. assert DisjointUnion(FiniteSet(1, 2, 3), FiniteSet(1, 2, 3), FiniteSet(1, 2, 3)).rewrite(Union) == (FiniteSet(1, 2, 3) * FiniteSet(0, 1, 2))
  1176. assert DisjointUnion(Interval(1, 3), Interval(2, 4)).rewrite(Union) == Union(Interval(1, 3) * FiniteSet(0), Interval(2, 4) * FiniteSet(1))
  1177. assert DisjointUnion(Interval(0, 5), Interval(0, 5)).rewrite(Union) == Union(Interval(0, 5) * FiniteSet(0), Interval(0, 5) * FiniteSet(1))
  1178. assert DisjointUnion(Interval(-1, 2), S.EmptySet, S.EmptySet).rewrite(Union) == Interval(-1, 2) * FiniteSet(0)
  1179. assert DisjointUnion(Interval(-1, 2)).rewrite(Union) == Interval(-1, 2) * FiniteSet(0)
  1180. assert DisjointUnion(S.EmptySet, Interval(-1, 2), S.EmptySet).rewrite(Union) == Interval(-1, 2) * FiniteSet(1)
  1181. assert DisjointUnion(Interval(-oo, oo)).rewrite(Union) == Interval(-oo, oo) * FiniteSet(0)
  1182. assert DisjointUnion(S.EmptySet).rewrite(Union) == S.EmptySet
  1183. assert DisjointUnion().rewrite(Union) == S.EmptySet
  1184. raises(TypeError, lambda: DisjointUnion(Symbol('n')))
  1185. x = Symbol("x")
  1186. y = Symbol("y")
  1187. z = Symbol("z")
  1188. assert DisjointUnion(FiniteSet(x), FiniteSet(y, z)).rewrite(Union) == (FiniteSet(x) * FiniteSet(0)) + (FiniteSet(y, z) * FiniteSet(1))
  1189. def test_DisjointUnion_is_empty():
  1190. assert DisjointUnion(S.EmptySet).is_empty is True
  1191. assert DisjointUnion(S.EmptySet, S.EmptySet).is_empty is True
  1192. assert DisjointUnion(S.EmptySet, FiniteSet(1, 2, 3)).is_empty is False
  1193. def test_DisjointUnion_is_iterable():
  1194. assert DisjointUnion(S.Integers, S.Naturals, S.Rationals).is_iterable is True
  1195. assert DisjointUnion(S.EmptySet, S.Reals).is_iterable is False
  1196. assert DisjointUnion(FiniteSet(1, 2, 3), S.EmptySet, FiniteSet(x, y)).is_iterable is True
  1197. assert DisjointUnion(S.EmptySet, S.EmptySet).is_iterable is False
  1198. def test_DisjointUnion_contains():
  1199. assert (0, 0) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1200. assert (0, 1) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1201. assert (0, 2) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1202. assert (1, 0) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1203. assert (1, 1) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1204. assert (1, 2) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1205. assert (2, 0) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1206. assert (2, 1) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1207. assert (2, 2) in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1208. assert (0, 1, 2) not in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1209. assert (0, 0.5) not in DisjointUnion(FiniteSet(0.5))
  1210. assert (0, 5) not in DisjointUnion(FiniteSet(0, 1, 2), FiniteSet(0, 1, 2), FiniteSet(0, 1, 2))
  1211. assert (x, 0) in DisjointUnion(FiniteSet(x, y, z), S.EmptySet, FiniteSet(y))
  1212. assert (y, 0) in DisjointUnion(FiniteSet(x, y, z), S.EmptySet, FiniteSet(y))
  1213. assert (z, 0) in DisjointUnion(FiniteSet(x, y, z), S.EmptySet, FiniteSet(y))
  1214. assert (y, 2) in DisjointUnion(FiniteSet(x, y, z), S.EmptySet, FiniteSet(y))
  1215. assert (0.5, 0) in DisjointUnion(Interval(0, 1), Interval(0, 2))
  1216. assert (0.5, 1) in DisjointUnion(Interval(0, 1), Interval(0, 2))
  1217. assert (1.5, 0) not in DisjointUnion(Interval(0, 1), Interval(0, 2))
  1218. assert (1.5, 1) in DisjointUnion(Interval(0, 1), Interval(0, 2))
  1219. def test_DisjointUnion_iter():
  1220. D = DisjointUnion(FiniteSet(3, 5, 7, 9), FiniteSet(x, y, z))
  1221. it = iter(D)
  1222. L1 = [(x, 1), (y, 1), (z, 1)]
  1223. L2 = [(3, 0), (5, 0), (7, 0), (9, 0)]
  1224. nxt = next(it)
  1225. assert nxt in L2
  1226. L2.remove(nxt)
  1227. nxt = next(it)
  1228. assert nxt in L1
  1229. L1.remove(nxt)
  1230. nxt = next(it)
  1231. assert nxt in L2
  1232. L2.remove(nxt)
  1233. nxt = next(it)
  1234. assert nxt in L1
  1235. L1.remove(nxt)
  1236. nxt = next(it)
  1237. assert nxt in L2
  1238. L2.remove(nxt)
  1239. nxt = next(it)
  1240. assert nxt in L1
  1241. L1.remove(nxt)
  1242. nxt = next(it)
  1243. assert nxt in L2
  1244. L2.remove(nxt)
  1245. raises(StopIteration, lambda: next(it))
  1246. raises(ValueError, lambda: iter(DisjointUnion(Interval(0, 1), S.EmptySet)))
  1247. def test_DisjointUnion_len():
  1248. assert len(DisjointUnion(FiniteSet(3, 5, 7, 9), FiniteSet(x, y, z))) == 7
  1249. assert len(DisjointUnion(S.EmptySet, S.EmptySet, FiniteSet(x, y, z), S.EmptySet)) == 3
  1250. raises(ValueError, lambda: len(DisjointUnion(Interval(0, 1), S.EmptySet)))
  1251. def test_issue_20089():
  1252. B = FiniteSet(FiniteSet(1, 2), FiniteSet(1))
  1253. assert 1 not in B
  1254. assert 1.0 not in B
  1255. assert not Eq(1, FiniteSet(1, 2))
  1256. assert FiniteSet(1) in B
  1257. A = FiniteSet(1, 2)
  1258. assert A in B
  1259. assert B.issubset(B)
  1260. assert not A.issubset(B)
  1261. assert 1 in A
  1262. C = FiniteSet(FiniteSet(1, 2), FiniteSet(1), 1, 2)
  1263. assert A.issubset(C)
  1264. assert B.issubset(C)
  1265. def test_issue_19378():
  1266. a = FiniteSet(1, 2)
  1267. b = ProductSet(a, a)
  1268. c = FiniteSet((1, 1), (1, 2), (2, 1), (2, 2))
  1269. assert b.is_subset(c) is True
  1270. d = FiniteSet(1)
  1271. assert b.is_subset(d) is False
  1272. assert Eq(c, b).simplify() is S.true
  1273. assert Eq(a, c).simplify() is S.false
  1274. assert Eq({1}, {x}).simplify() == Eq({1}, {x})
  1275. def test_intersection_symbolic():
  1276. n = Symbol('n')
  1277. # These should not throw an error
  1278. assert isinstance(Intersection(Range(n), Range(100)), Intersection)
  1279. assert isinstance(Intersection(Range(n), Interval(1, 100)), Intersection)
  1280. assert isinstance(Intersection(Range(100), Interval(1, n)), Intersection)
  1281. @XFAIL
  1282. def test_intersection_symbolic_failing():
  1283. n = Symbol('n', integer=True, positive=True)
  1284. assert Intersection(Range(10, n), Range(4, 500, 5)) == Intersection(
  1285. Range(14, n), Range(14, 500, 5))
  1286. assert Intersection(Interval(10, n), Range(4, 500, 5)) == Intersection(
  1287. Interval(14, n), Range(14, 500, 5))
  1288. def test_issue_20379():
  1289. #https://github.com/sympy/sympy/issues/20379
  1290. x = pi - 3.14159265358979
  1291. assert FiniteSet(x).evalf(2) == FiniteSet(Float('3.23108914886517e-15', 2))
  1292. def test_finiteset_simplify():
  1293. S = FiniteSet(1, cos(1)**2 + sin(1)**2)
  1294. assert S.simplify() == {1}