test_sets.py 65 KB

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