test_polyoptions.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. """Tests for options manager for :class:`Poly` and public API functions. """
  2. from sympy.polys.polyoptions import (
  3. Options, Expand, Gens, Wrt, Sort, Order, Field, Greedy, Domain,
  4. Split, Gaussian, Extension, Modulus, Symmetric, Strict, Auto,
  5. Frac, Formal, Polys, Include, All, Gen, Symbols, Method)
  6. from sympy.polys.orderings import lex
  7. from sympy.polys.domains import FF, GF, ZZ, QQ, QQ_I, RR, CC, EX
  8. from sympy.polys.polyerrors import OptionError, GeneratorsError
  9. from sympy.core.numbers import (I, Integer)
  10. from sympy.core.symbol import Symbol
  11. from sympy.functions.elementary.miscellaneous import sqrt
  12. from sympy.testing.pytest import raises
  13. from sympy.abc import x, y, z
  14. def test_Options_clone():
  15. opt = Options((x, y, z), {'domain': 'ZZ'})
  16. assert opt.gens == (x, y, z)
  17. assert opt.domain == ZZ
  18. assert ('order' in opt) is False
  19. new_opt = opt.clone({'gens': (x, y), 'order': 'lex'})
  20. assert opt.gens == (x, y, z)
  21. assert opt.domain == ZZ
  22. assert ('order' in opt) is False
  23. assert new_opt.gens == (x, y)
  24. assert new_opt.domain == ZZ
  25. assert ('order' in new_opt) is True
  26. def test_Expand_preprocess():
  27. assert Expand.preprocess(False) is False
  28. assert Expand.preprocess(True) is True
  29. assert Expand.preprocess(0) is False
  30. assert Expand.preprocess(1) is True
  31. raises(OptionError, lambda: Expand.preprocess(x))
  32. def test_Expand_postprocess():
  33. opt = {'expand': True}
  34. Expand.postprocess(opt)
  35. assert opt == {'expand': True}
  36. def test_Gens_preprocess():
  37. assert Gens.preprocess((None,)) == ()
  38. assert Gens.preprocess((x, y, z)) == (x, y, z)
  39. assert Gens.preprocess(((x, y, z),)) == (x, y, z)
  40. a = Symbol('a', commutative=False)
  41. raises(GeneratorsError, lambda: Gens.preprocess((x, x, y)))
  42. raises(GeneratorsError, lambda: Gens.preprocess((x, y, a)))
  43. def test_Gens_postprocess():
  44. opt = {'gens': (x, y)}
  45. Gens.postprocess(opt)
  46. assert opt == {'gens': (x, y)}
  47. def test_Wrt_preprocess():
  48. assert Wrt.preprocess(x) == ['x']
  49. assert Wrt.preprocess('') == []
  50. assert Wrt.preprocess(' ') == []
  51. assert Wrt.preprocess('x,y') == ['x', 'y']
  52. assert Wrt.preprocess('x y') == ['x', 'y']
  53. assert Wrt.preprocess('x, y') == ['x', 'y']
  54. assert Wrt.preprocess('x , y') == ['x', 'y']
  55. assert Wrt.preprocess(' x, y') == ['x', 'y']
  56. assert Wrt.preprocess(' x, y') == ['x', 'y']
  57. assert Wrt.preprocess([x, y]) == ['x', 'y']
  58. raises(OptionError, lambda: Wrt.preprocess(','))
  59. raises(OptionError, lambda: Wrt.preprocess(0))
  60. def test_Wrt_postprocess():
  61. opt = {'wrt': ['x']}
  62. Wrt.postprocess(opt)
  63. assert opt == {'wrt': ['x']}
  64. def test_Sort_preprocess():
  65. assert Sort.preprocess([x, y, z]) == ['x', 'y', 'z']
  66. assert Sort.preprocess((x, y, z)) == ['x', 'y', 'z']
  67. assert Sort.preprocess('x > y > z') == ['x', 'y', 'z']
  68. assert Sort.preprocess('x>y>z') == ['x', 'y', 'z']
  69. raises(OptionError, lambda: Sort.preprocess(0))
  70. raises(OptionError, lambda: Sort.preprocess({x, y, z}))
  71. def test_Sort_postprocess():
  72. opt = {'sort': 'x > y'}
  73. Sort.postprocess(opt)
  74. assert opt == {'sort': 'x > y'}
  75. def test_Order_preprocess():
  76. assert Order.preprocess('lex') == lex
  77. def test_Order_postprocess():
  78. opt = {'order': True}
  79. Order.postprocess(opt)
  80. assert opt == {'order': True}
  81. def test_Field_preprocess():
  82. assert Field.preprocess(False) is False
  83. assert Field.preprocess(True) is True
  84. assert Field.preprocess(0) is False
  85. assert Field.preprocess(1) is True
  86. raises(OptionError, lambda: Field.preprocess(x))
  87. def test_Field_postprocess():
  88. opt = {'field': True}
  89. Field.postprocess(opt)
  90. assert opt == {'field': True}
  91. def test_Greedy_preprocess():
  92. assert Greedy.preprocess(False) is False
  93. assert Greedy.preprocess(True) is True
  94. assert Greedy.preprocess(0) is False
  95. assert Greedy.preprocess(1) is True
  96. raises(OptionError, lambda: Greedy.preprocess(x))
  97. def test_Greedy_postprocess():
  98. opt = {'greedy': True}
  99. Greedy.postprocess(opt)
  100. assert opt == {'greedy': True}
  101. def test_Domain_preprocess():
  102. assert Domain.preprocess(ZZ) == ZZ
  103. assert Domain.preprocess(QQ) == QQ
  104. assert Domain.preprocess(EX) == EX
  105. assert Domain.preprocess(FF(2)) == FF(2)
  106. assert Domain.preprocess(ZZ[x, y]) == ZZ[x, y]
  107. assert Domain.preprocess('Z') == ZZ
  108. assert Domain.preprocess('Q') == QQ
  109. assert Domain.preprocess('ZZ') == ZZ
  110. assert Domain.preprocess('QQ') == QQ
  111. assert Domain.preprocess('EX') == EX
  112. assert Domain.preprocess('FF(23)') == FF(23)
  113. assert Domain.preprocess('GF(23)') == GF(23)
  114. raises(OptionError, lambda: Domain.preprocess('Z[]'))
  115. assert Domain.preprocess('Z[x]') == ZZ[x]
  116. assert Domain.preprocess('Q[x]') == QQ[x]
  117. assert Domain.preprocess('R[x]') == RR[x]
  118. assert Domain.preprocess('C[x]') == CC[x]
  119. assert Domain.preprocess('ZZ[x]') == ZZ[x]
  120. assert Domain.preprocess('QQ[x]') == QQ[x]
  121. assert Domain.preprocess('RR[x]') == RR[x]
  122. assert Domain.preprocess('CC[x]') == CC[x]
  123. assert Domain.preprocess('Z[x,y]') == ZZ[x, y]
  124. assert Domain.preprocess('Q[x,y]') == QQ[x, y]
  125. assert Domain.preprocess('R[x,y]') == RR[x, y]
  126. assert Domain.preprocess('C[x,y]') == CC[x, y]
  127. assert Domain.preprocess('ZZ[x,y]') == ZZ[x, y]
  128. assert Domain.preprocess('QQ[x,y]') == QQ[x, y]
  129. assert Domain.preprocess('RR[x,y]') == RR[x, y]
  130. assert Domain.preprocess('CC[x,y]') == CC[x, y]
  131. raises(OptionError, lambda: Domain.preprocess('Z()'))
  132. assert Domain.preprocess('Z(x)') == ZZ.frac_field(x)
  133. assert Domain.preprocess('Q(x)') == QQ.frac_field(x)
  134. assert Domain.preprocess('ZZ(x)') == ZZ.frac_field(x)
  135. assert Domain.preprocess('QQ(x)') == QQ.frac_field(x)
  136. assert Domain.preprocess('Z(x,y)') == ZZ.frac_field(x, y)
  137. assert Domain.preprocess('Q(x,y)') == QQ.frac_field(x, y)
  138. assert Domain.preprocess('ZZ(x,y)') == ZZ.frac_field(x, y)
  139. assert Domain.preprocess('QQ(x,y)') == QQ.frac_field(x, y)
  140. assert Domain.preprocess('Q<I>') == QQ.algebraic_field(I)
  141. assert Domain.preprocess('QQ<I>') == QQ.algebraic_field(I)
  142. assert Domain.preprocess('Q<sqrt(2), I>') == QQ.algebraic_field(sqrt(2), I)
  143. assert Domain.preprocess(
  144. 'QQ<sqrt(2), I>') == QQ.algebraic_field(sqrt(2), I)
  145. raises(OptionError, lambda: Domain.preprocess('abc'))
  146. def test_Domain_postprocess():
  147. raises(GeneratorsError, lambda: Domain.postprocess({'gens': (x, y),
  148. 'domain': ZZ[y, z]}))
  149. raises(GeneratorsError, lambda: Domain.postprocess({'gens': (),
  150. 'domain': EX}))
  151. raises(GeneratorsError, lambda: Domain.postprocess({'domain': EX}))
  152. def test_Split_preprocess():
  153. assert Split.preprocess(False) is False
  154. assert Split.preprocess(True) is True
  155. assert Split.preprocess(0) is False
  156. assert Split.preprocess(1) is True
  157. raises(OptionError, lambda: Split.preprocess(x))
  158. def test_Split_postprocess():
  159. raises(NotImplementedError, lambda: Split.postprocess({'split': True}))
  160. def test_Gaussian_preprocess():
  161. assert Gaussian.preprocess(False) is False
  162. assert Gaussian.preprocess(True) is True
  163. assert Gaussian.preprocess(0) is False
  164. assert Gaussian.preprocess(1) is True
  165. raises(OptionError, lambda: Gaussian.preprocess(x))
  166. def test_Gaussian_postprocess():
  167. opt = {'gaussian': True}
  168. Gaussian.postprocess(opt)
  169. assert opt == {
  170. 'gaussian': True,
  171. 'domain': QQ_I,
  172. }
  173. def test_Extension_preprocess():
  174. assert Extension.preprocess(True) is True
  175. assert Extension.preprocess(1) is True
  176. assert Extension.preprocess([]) is None
  177. assert Extension.preprocess(sqrt(2)) == {sqrt(2)}
  178. assert Extension.preprocess([sqrt(2)]) == {sqrt(2)}
  179. assert Extension.preprocess([sqrt(2), I]) == {sqrt(2), I}
  180. raises(OptionError, lambda: Extension.preprocess(False))
  181. raises(OptionError, lambda: Extension.preprocess(0))
  182. def test_Extension_postprocess():
  183. opt = {'extension': {sqrt(2)}}
  184. Extension.postprocess(opt)
  185. assert opt == {
  186. 'extension': {sqrt(2)},
  187. 'domain': QQ.algebraic_field(sqrt(2)),
  188. }
  189. opt = {'extension': True}
  190. Extension.postprocess(opt)
  191. assert opt == {'extension': True}
  192. def test_Modulus_preprocess():
  193. assert Modulus.preprocess(23) == 23
  194. assert Modulus.preprocess(Integer(23)) == 23
  195. raises(OptionError, lambda: Modulus.preprocess(0))
  196. raises(OptionError, lambda: Modulus.preprocess(x))
  197. def test_Modulus_postprocess():
  198. opt = {'modulus': 5}
  199. Modulus.postprocess(opt)
  200. assert opt == {
  201. 'modulus': 5,
  202. 'domain': FF(5),
  203. }
  204. opt = {'modulus': 5, 'symmetric': False}
  205. Modulus.postprocess(opt)
  206. assert opt == {
  207. 'modulus': 5,
  208. 'domain': FF(5, False),
  209. 'symmetric': False,
  210. }
  211. def test_Symmetric_preprocess():
  212. assert Symmetric.preprocess(False) is False
  213. assert Symmetric.preprocess(True) is True
  214. assert Symmetric.preprocess(0) is False
  215. assert Symmetric.preprocess(1) is True
  216. raises(OptionError, lambda: Symmetric.preprocess(x))
  217. def test_Symmetric_postprocess():
  218. opt = {'symmetric': True}
  219. Symmetric.postprocess(opt)
  220. assert opt == {'symmetric': True}
  221. def test_Strict_preprocess():
  222. assert Strict.preprocess(False) is False
  223. assert Strict.preprocess(True) is True
  224. assert Strict.preprocess(0) is False
  225. assert Strict.preprocess(1) is True
  226. raises(OptionError, lambda: Strict.preprocess(x))
  227. def test_Strict_postprocess():
  228. opt = {'strict': True}
  229. Strict.postprocess(opt)
  230. assert opt == {'strict': True}
  231. def test_Auto_preprocess():
  232. assert Auto.preprocess(False) is False
  233. assert Auto.preprocess(True) is True
  234. assert Auto.preprocess(0) is False
  235. assert Auto.preprocess(1) is True
  236. raises(OptionError, lambda: Auto.preprocess(x))
  237. def test_Auto_postprocess():
  238. opt = {'auto': True}
  239. Auto.postprocess(opt)
  240. assert opt == {'auto': True}
  241. def test_Frac_preprocess():
  242. assert Frac.preprocess(False) is False
  243. assert Frac.preprocess(True) is True
  244. assert Frac.preprocess(0) is False
  245. assert Frac.preprocess(1) is True
  246. raises(OptionError, lambda: Frac.preprocess(x))
  247. def test_Frac_postprocess():
  248. opt = {'frac': True}
  249. Frac.postprocess(opt)
  250. assert opt == {'frac': True}
  251. def test_Formal_preprocess():
  252. assert Formal.preprocess(False) is False
  253. assert Formal.preprocess(True) is True
  254. assert Formal.preprocess(0) is False
  255. assert Formal.preprocess(1) is True
  256. raises(OptionError, lambda: Formal.preprocess(x))
  257. def test_Formal_postprocess():
  258. opt = {'formal': True}
  259. Formal.postprocess(opt)
  260. assert opt == {'formal': True}
  261. def test_Polys_preprocess():
  262. assert Polys.preprocess(False) is False
  263. assert Polys.preprocess(True) is True
  264. assert Polys.preprocess(0) is False
  265. assert Polys.preprocess(1) is True
  266. raises(OptionError, lambda: Polys.preprocess(x))
  267. def test_Polys_postprocess():
  268. opt = {'polys': True}
  269. Polys.postprocess(opt)
  270. assert opt == {'polys': True}
  271. def test_Include_preprocess():
  272. assert Include.preprocess(False) is False
  273. assert Include.preprocess(True) is True
  274. assert Include.preprocess(0) is False
  275. assert Include.preprocess(1) is True
  276. raises(OptionError, lambda: Include.preprocess(x))
  277. def test_Include_postprocess():
  278. opt = {'include': True}
  279. Include.postprocess(opt)
  280. assert opt == {'include': True}
  281. def test_All_preprocess():
  282. assert All.preprocess(False) is False
  283. assert All.preprocess(True) is True
  284. assert All.preprocess(0) is False
  285. assert All.preprocess(1) is True
  286. raises(OptionError, lambda: All.preprocess(x))
  287. def test_All_postprocess():
  288. opt = {'all': True}
  289. All.postprocess(opt)
  290. assert opt == {'all': True}
  291. def test_Gen_postprocess():
  292. opt = {'gen': x}
  293. Gen.postprocess(opt)
  294. assert opt == {'gen': x}
  295. def test_Symbols_preprocess():
  296. raises(OptionError, lambda: Symbols.preprocess(x))
  297. def test_Symbols_postprocess():
  298. opt = {'symbols': [x, y, z]}
  299. Symbols.postprocess(opt)
  300. assert opt == {'symbols': [x, y, z]}
  301. def test_Method_preprocess():
  302. raises(OptionError, lambda: Method.preprocess(10))
  303. def test_Method_postprocess():
  304. opt = {'method': 'f5b'}
  305. Method.postprocess(opt)
  306. assert opt == {'method': 'f5b'}