test_sets.py 67 KB

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