test_printing.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. # -*- encoding: utf-8 -*-
  2. """
  3. TODO:
  4. * Address Issue 2251, printing of spin states
  5. """
  6. from __future__ import annotations
  7. from typing import Any
  8. from sympy.physics.quantum.anticommutator import AntiCommutator
  9. from sympy.physics.quantum.cg import CG, Wigner3j, Wigner6j, Wigner9j
  10. from sympy.physics.quantum.commutator import Commutator
  11. from sympy.physics.quantum.constants import hbar
  12. from sympy.physics.quantum.dagger import Dagger
  13. from sympy.physics.quantum.gate import CGate, CNotGate, IdentityGate, UGate, XGate
  14. from sympy.physics.quantum.hilbert import ComplexSpace, FockSpace, HilbertSpace, L2
  15. from sympy.physics.quantum.innerproduct import InnerProduct
  16. from sympy.physics.quantum.operator import Operator, OuterProduct, DifferentialOperator
  17. from sympy.physics.quantum.qexpr import QExpr
  18. from sympy.physics.quantum.qubit import Qubit, IntQubit
  19. from sympy.physics.quantum.spin import Jz, J2, JzBra, JzBraCoupled, JzKet, JzKetCoupled, Rotation, WignerD
  20. from sympy.physics.quantum.state import Bra, Ket, TimeDepBra, TimeDepKet
  21. from sympy.physics.quantum.tensorproduct import TensorProduct
  22. from sympy.physics.quantum.sho1d import RaisingOp
  23. from sympy.core.function import (Derivative, Function)
  24. from sympy.core.numbers import oo
  25. from sympy.core.power import Pow
  26. from sympy.core.singleton import S
  27. from sympy.core.symbol import (Symbol, symbols)
  28. from sympy.matrices.dense import Matrix
  29. from sympy.sets.sets import Interval
  30. from sympy.testing.pytest import XFAIL
  31. # Imports used in srepr strings
  32. from sympy.physics.quantum.spin import JzOp
  33. from sympy.printing import srepr
  34. from sympy.printing.pretty import pretty as xpretty
  35. from sympy.printing.latex import latex
  36. MutableDenseMatrix = Matrix
  37. ENV: dict[str, Any] = {}
  38. exec('from sympy import *', ENV)
  39. exec('from sympy.physics.quantum import *', ENV)
  40. exec('from sympy.physics.quantum.cg import *', ENV)
  41. exec('from sympy.physics.quantum.spin import *', ENV)
  42. exec('from sympy.physics.quantum.hilbert import *', ENV)
  43. exec('from sympy.physics.quantum.qubit import *', ENV)
  44. exec('from sympy.physics.quantum.qexpr import *', ENV)
  45. exec('from sympy.physics.quantum.gate import *', ENV)
  46. exec('from sympy.physics.quantum.constants import *', ENV)
  47. def sT(expr, string):
  48. """
  49. sT := sreprTest
  50. from sympy/printing/tests/test_repr.py
  51. """
  52. assert srepr(expr) == string
  53. assert eval(string, ENV) == expr
  54. def pretty(expr):
  55. """ASCII pretty-printing"""
  56. return xpretty(expr, use_unicode=False, wrap_line=False)
  57. def upretty(expr):
  58. """Unicode pretty-printing"""
  59. return xpretty(expr, use_unicode=True, wrap_line=False)
  60. def test_anticommutator():
  61. A = Operator('A')
  62. B = Operator('B')
  63. ac = AntiCommutator(A, B)
  64. ac_tall = AntiCommutator(A**2, B)
  65. assert str(ac) == '{A,B}'
  66. assert pretty(ac) == '{A,B}'
  67. assert upretty(ac) == '{A,B}'
  68. assert latex(ac) == r'\left\{A,B\right\}'
  69. sT(ac, "AntiCommutator(Operator(Symbol('A')),Operator(Symbol('B')))")
  70. assert str(ac_tall) == '{A**2,B}'
  71. ascii_str = \
  72. """\
  73. / 2 \\\n\
  74. <A ,B>\n\
  75. \\ /\
  76. """
  77. ucode_str = \
  78. """\
  79. ⎧ 2 ⎫\n\
  80. ⎨A ,B⎬\n\
  81. ⎩ ⎭\
  82. """
  83. assert pretty(ac_tall) == ascii_str
  84. assert upretty(ac_tall) == ucode_str
  85. assert latex(ac_tall) == r'\left\{A^{2},B\right\}'
  86. sT(ac_tall, "AntiCommutator(Pow(Operator(Symbol('A')), Integer(2)),Operator(Symbol('B')))")
  87. def test_cg():
  88. cg = CG(1, 2, 3, 4, 5, 6)
  89. wigner3j = Wigner3j(1, 2, 3, 4, 5, 6)
  90. wigner6j = Wigner6j(1, 2, 3, 4, 5, 6)
  91. wigner9j = Wigner9j(1, 2, 3, 4, 5, 6, 7, 8, 9)
  92. assert str(cg) == 'CG(1, 2, 3, 4, 5, 6)'
  93. ascii_str = \
  94. """\
  95. 5,6 \n\
  96. C \n\
  97. 1,2,3,4\
  98. """
  99. ucode_str = \
  100. """\
  101. 5,6 \n\
  102. C \n\
  103. 1,2,3,4\
  104. """
  105. assert pretty(cg) == ascii_str
  106. assert upretty(cg) == ucode_str
  107. assert latex(cg) == 'C^{5,6}_{1,2,3,4}'
  108. assert latex(cg ** 2) == R'\left(C^{5,6}_{1,2,3,4}\right)^{2}'
  109. sT(cg, "CG(Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6))")
  110. assert str(wigner3j) == 'Wigner3j(1, 2, 3, 4, 5, 6)'
  111. ascii_str = \
  112. """\
  113. /1 3 5\\\n\
  114. | |\n\
  115. \\2 4 6/\
  116. """
  117. ucode_str = \
  118. """\
  119. ⎛1 3 5⎞\n\
  120. ⎜ ⎟\n\
  121. ⎝2 4 6⎠\
  122. """
  123. assert pretty(wigner3j) == ascii_str
  124. assert upretty(wigner3j) == ucode_str
  125. assert latex(wigner3j) == \
  126. r'\left(\begin{array}{ccc} 1 & 3 & 5 \\ 2 & 4 & 6 \end{array}\right)'
  127. sT(wigner3j, "Wigner3j(Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6))")
  128. assert str(wigner6j) == 'Wigner6j(1, 2, 3, 4, 5, 6)'
  129. ascii_str = \
  130. """\
  131. /1 2 3\\\n\
  132. < >\n\
  133. \\4 5 6/\
  134. """
  135. ucode_str = \
  136. """\
  137. ⎧1 2 3⎫\n\
  138. ⎨ ⎬\n\
  139. ⎩4 5 6⎭\
  140. """
  141. assert pretty(wigner6j) == ascii_str
  142. assert upretty(wigner6j) == ucode_str
  143. assert latex(wigner6j) == \
  144. r'\left\{\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right\}'
  145. sT(wigner6j, "Wigner6j(Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6))")
  146. assert str(wigner9j) == 'Wigner9j(1, 2, 3, 4, 5, 6, 7, 8, 9)'
  147. ascii_str = \
  148. """\
  149. /1 2 3\\\n\
  150. | |\n\
  151. <4 5 6>\n\
  152. | |\n\
  153. \\7 8 9/\
  154. """
  155. ucode_str = \
  156. """\
  157. ⎧1 2 3⎫\n\
  158. ⎪ ⎪\n\
  159. ⎨4 5 6⎬\n\
  160. ⎪ ⎪\n\
  161. ⎩7 8 9⎭\
  162. """
  163. assert pretty(wigner9j) == ascii_str
  164. assert upretty(wigner9j) == ucode_str
  165. assert latex(wigner9j) == \
  166. r'\left\{\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right\}'
  167. sT(wigner9j, "Wigner9j(Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6), Integer(7), Integer(8), Integer(9))")
  168. def test_commutator():
  169. A = Operator('A')
  170. B = Operator('B')
  171. c = Commutator(A, B)
  172. c_tall = Commutator(A**2, B)
  173. assert str(c) == '[A,B]'
  174. assert pretty(c) == '[A,B]'
  175. assert upretty(c) == '[A,B]'
  176. assert latex(c) == r'\left[A,B\right]'
  177. sT(c, "Commutator(Operator(Symbol('A')),Operator(Symbol('B')))")
  178. assert str(c_tall) == '[A**2,B]'
  179. ascii_str = \
  180. """\
  181. [ 2 ]\n\
  182. [A ,B]\
  183. """
  184. ucode_str = \
  185. """\
  186. ⎡ 2 ⎤\n\
  187. ⎣A ,B⎦\
  188. """
  189. assert pretty(c_tall) == ascii_str
  190. assert upretty(c_tall) == ucode_str
  191. assert latex(c_tall) == r'\left[A^{2},B\right]'
  192. sT(c_tall, "Commutator(Pow(Operator(Symbol('A')), Integer(2)),Operator(Symbol('B')))")
  193. def test_constants():
  194. assert str(hbar) == 'hbar'
  195. assert pretty(hbar) == 'hbar'
  196. assert upretty(hbar) == 'ℏ'
  197. assert latex(hbar) == r'\hbar'
  198. sT(hbar, "HBar()")
  199. def test_dagger():
  200. x = symbols('x')
  201. expr = Dagger(x)
  202. assert str(expr) == 'Dagger(x)'
  203. ascii_str = \
  204. """\
  205. +\n\
  206. x \
  207. """
  208. ucode_str = \
  209. """\
  210. †\n\
  211. x \
  212. """
  213. assert pretty(expr) == ascii_str
  214. assert upretty(expr) == ucode_str
  215. assert latex(expr) == r'x^{\dagger}'
  216. sT(expr, "Dagger(Symbol('x'))")
  217. @XFAIL
  218. def test_gate_failing():
  219. a, b, c, d = symbols('a,b,c,d')
  220. uMat = Matrix([[a, b], [c, d]])
  221. g = UGate((0,), uMat)
  222. assert str(g) == 'U(0)'
  223. def test_gate():
  224. a, b, c, d = symbols('a,b,c,d')
  225. uMat = Matrix([[a, b], [c, d]])
  226. q = Qubit(1, 0, 1, 0, 1)
  227. g1 = IdentityGate(2)
  228. g2 = CGate((3, 0), XGate(1))
  229. g3 = CNotGate(1, 0)
  230. g4 = UGate((0,), uMat)
  231. assert str(g1) == '1(2)'
  232. assert pretty(g1) == '1 \n 2'
  233. assert upretty(g1) == '1 \n 2'
  234. assert latex(g1) == r'1_{2}'
  235. sT(g1, "IdentityGate(Integer(2))")
  236. assert str(g1*q) == '1(2)*|10101>'
  237. ascii_str = \
  238. """\
  239. 1 *|10101>\n\
  240. 2 \
  241. """
  242. ucode_str = \
  243. """\
  244. 1 ⋅❘10101⟩\n\
  245. 2 \
  246. """
  247. assert pretty(g1*q) == ascii_str
  248. assert upretty(g1*q) == ucode_str
  249. assert latex(g1*q) == r'1_{2} {\left|10101\right\rangle }'
  250. sT(g1*q, "Mul(IdentityGate(Integer(2)), Qubit(Integer(1),Integer(0),Integer(1),Integer(0),Integer(1)))")
  251. assert str(g2) == 'C((3,0),X(1))'
  252. ascii_str = \
  253. """\
  254. C /X \\\n\
  255. 3,0\\ 1/\
  256. """
  257. ucode_str = \
  258. """\
  259. C ⎛X ⎞\n\
  260. 3,0⎝ 1⎠\
  261. """
  262. assert pretty(g2) == ascii_str
  263. assert upretty(g2) == ucode_str
  264. assert latex(g2) == r'C_{3,0}{\left(X_{1}\right)}'
  265. sT(g2, "CGate(Tuple(Integer(3), Integer(0)),XGate(Integer(1)))")
  266. assert str(g3) == 'CNOT(1,0)'
  267. ascii_str = \
  268. """\
  269. CNOT \n\
  270. 1,0\
  271. """
  272. ucode_str = \
  273. """\
  274. CNOT \n\
  275. 1,0\
  276. """
  277. assert pretty(g3) == ascii_str
  278. assert upretty(g3) == ucode_str
  279. assert latex(g3) == r'\text{CNOT}_{1,0}'
  280. sT(g3, "CNotGate(Integer(1),Integer(0))")
  281. ascii_str = \
  282. """\
  283. U \n\
  284. 0\
  285. """
  286. ucode_str = \
  287. """\
  288. U \n\
  289. 0\
  290. """
  291. assert str(g4) == \
  292. """\
  293. U((0,),Matrix([\n\
  294. [a, b],\n\
  295. [c, d]]))\
  296. """
  297. assert pretty(g4) == ascii_str
  298. assert upretty(g4) == ucode_str
  299. assert latex(g4) == r'U_{0}'
  300. sT(g4, "UGate(Tuple(Integer(0)),ImmutableDenseMatrix([[Symbol('a'), Symbol('b')], [Symbol('c'), Symbol('d')]]))")
  301. def test_hilbert():
  302. h1 = HilbertSpace()
  303. h2 = ComplexSpace(2)
  304. h3 = FockSpace()
  305. h4 = L2(Interval(0, oo))
  306. assert str(h1) == 'H'
  307. assert pretty(h1) == 'H'
  308. assert upretty(h1) == 'H'
  309. assert latex(h1) == r'\mathcal{H}'
  310. sT(h1, "HilbertSpace()")
  311. assert str(h2) == 'C(2)'
  312. ascii_str = \
  313. """\
  314. 2\n\
  315. C \
  316. """
  317. ucode_str = \
  318. """\
  319. 2\n\
  320. C \
  321. """
  322. assert pretty(h2) == ascii_str
  323. assert upretty(h2) == ucode_str
  324. assert latex(h2) == r'\mathcal{C}^{2}'
  325. sT(h2, "ComplexSpace(Integer(2))")
  326. assert str(h3) == 'F'
  327. assert pretty(h3) == 'F'
  328. assert upretty(h3) == 'F'
  329. assert latex(h3) == r'\mathcal{F}'
  330. sT(h3, "FockSpace()")
  331. assert str(h4) == 'L2(Interval(0, oo))'
  332. ascii_str = \
  333. """\
  334. 2\n\
  335. L \
  336. """
  337. ucode_str = \
  338. """\
  339. 2\n\
  340. L \
  341. """
  342. assert pretty(h4) == ascii_str
  343. assert upretty(h4) == ucode_str
  344. assert latex(h4) == r'{\mathcal{L}^2}\left( \left[0, \infty\right) \right)'
  345. sT(h4, "L2(Interval(Integer(0), oo, false, true))")
  346. assert str(h1 + h2) == 'H+C(2)'
  347. ascii_str = \
  348. """\
  349. 2\n\
  350. H + C \
  351. """
  352. ucode_str = \
  353. """\
  354. 2\n\
  355. H ⊕ C \
  356. """
  357. assert pretty(h1 + h2) == ascii_str
  358. assert upretty(h1 + h2) == ucode_str
  359. assert latex(h1 + h2)
  360. sT(h1 + h2, "DirectSumHilbertSpace(HilbertSpace(),ComplexSpace(Integer(2)))")
  361. assert str(h1*h2) == "H*C(2)"
  362. ascii_str = \
  363. """\
  364. 2\n\
  365. H x C \
  366. """
  367. ucode_str = \
  368. """\
  369. 2\n\
  370. H ⨂ C \
  371. """
  372. assert pretty(h1*h2) == ascii_str
  373. assert upretty(h1*h2) == ucode_str
  374. assert latex(h1*h2)
  375. sT(h1*h2,
  376. "TensorProductHilbertSpace(HilbertSpace(),ComplexSpace(Integer(2)))")
  377. assert str(h1**2) == 'H**2'
  378. ascii_str = \
  379. """\
  380. x2\n\
  381. H \
  382. """
  383. ucode_str = \
  384. """\
  385. ⨂2\n\
  386. H \
  387. """
  388. assert pretty(h1**2) == ascii_str
  389. assert upretty(h1**2) == ucode_str
  390. assert latex(h1**2) == r'{\mathcal{H}}^{\otimes 2}'
  391. sT(h1**2, "TensorPowerHilbertSpace(HilbertSpace(),Integer(2))")
  392. def test_innerproduct():
  393. x = symbols('x')
  394. ip1 = InnerProduct(Bra(), Ket())
  395. ip2 = InnerProduct(TimeDepBra(), TimeDepKet())
  396. ip3 = InnerProduct(JzBra(1, 1), JzKet(1, 1))
  397. ip4 = InnerProduct(JzBraCoupled(1, 1, (1, 1)), JzKetCoupled(1, 1, (1, 1)))
  398. ip_tall1 = InnerProduct(Bra(x/2), Ket(x/2))
  399. ip_tall2 = InnerProduct(Bra(x), Ket(x/2))
  400. ip_tall3 = InnerProduct(Bra(x/2), Ket(x))
  401. assert str(ip1) == '<psi|psi>'
  402. assert pretty(ip1) == '<psi|psi>'
  403. assert upretty(ip1) == '⟨ψ❘ψ⟩'
  404. assert latex(
  405. ip1) == r'\left\langle \psi \right. {\left|\psi\right\rangle }'
  406. sT(ip1, "InnerProduct(Bra(Symbol('psi')),Ket(Symbol('psi')))")
  407. assert str(ip2) == '<psi;t|psi;t>'
  408. assert pretty(ip2) == '<psi;t|psi;t>'
  409. assert upretty(ip2) == '⟨ψ;t❘ψ;t⟩'
  410. assert latex(ip2) == \
  411. r'\left\langle \psi;t \right. {\left|\psi;t\right\rangle }'
  412. sT(ip2, "InnerProduct(TimeDepBra(Symbol('psi'),Symbol('t')),TimeDepKet(Symbol('psi'),Symbol('t')))")
  413. assert str(ip3) == "<1,1|1,1>"
  414. assert pretty(ip3) == '<1,1|1,1>'
  415. assert upretty(ip3) == '⟨1,1❘1,1⟩'
  416. assert latex(ip3) == r'\left\langle 1,1 \right. {\left|1,1\right\rangle }'
  417. sT(ip3, "InnerProduct(JzBra(Integer(1),Integer(1)),JzKet(Integer(1),Integer(1)))")
  418. assert str(ip4) == "<1,1,j1=1,j2=1|1,1,j1=1,j2=1>"
  419. assert pretty(ip4) == '<1,1,j1=1,j2=1|1,1,j1=1,j2=1>'
  420. assert upretty(ip4) == '⟨1,1,j₁=1,j₂=1❘1,1,j₁=1,j₂=1⟩'
  421. assert latex(ip4) == \
  422. r'\left\langle 1,1,j_{1}=1,j_{2}=1 \right. {\left|1,1,j_{1}=1,j_{2}=1\right\rangle }'
  423. sT(ip4, "InnerProduct(JzBraCoupled(Integer(1),Integer(1),Tuple(Integer(1), Integer(1)),Tuple(Tuple(Integer(1), Integer(2), Integer(1)))),JzKetCoupled(Integer(1),Integer(1),Tuple(Integer(1), Integer(1)),Tuple(Tuple(Integer(1), Integer(2), Integer(1)))))")
  424. assert str(ip_tall1) == '<x/2|x/2>'
  425. ascii_str = \
  426. """\
  427. / | \\ \n\
  428. / x|x \\\n\
  429. \\ -|- /\n\
  430. \\2|2/ \
  431. """
  432. ucode_str = \
  433. """\
  434. ╱ │ ╲ \n\
  435. ╱ x│x ╲\n\
  436. ╲ ─│─ ╱\n\
  437. ╲2│2╱ \
  438. """
  439. assert pretty(ip_tall1) == ascii_str
  440. assert upretty(ip_tall1) == ucode_str
  441. assert latex(ip_tall1) == \
  442. r'\left\langle \frac{x}{2} \right. {\left|\frac{x}{2}\right\rangle }'
  443. sT(ip_tall1, "InnerProduct(Bra(Mul(Rational(1, 2), Symbol('x'))),Ket(Mul(Rational(1, 2), Symbol('x'))))")
  444. assert str(ip_tall2) == '<x|x/2>'
  445. ascii_str = \
  446. """\
  447. / | \\ \n\
  448. / |x \\\n\
  449. \\ x|- /\n\
  450. \\ |2/ \
  451. """
  452. ucode_str = \
  453. """\
  454. ╱ │ ╲ \n\
  455. ╱ │x ╲\n\
  456. ╲ x│─ ╱\n\
  457. ╲ │2╱ \
  458. """
  459. assert pretty(ip_tall2) == ascii_str
  460. assert upretty(ip_tall2) == ucode_str
  461. assert latex(ip_tall2) == \
  462. r'\left\langle x \right. {\left|\frac{x}{2}\right\rangle }'
  463. sT(ip_tall2,
  464. "InnerProduct(Bra(Symbol('x')),Ket(Mul(Rational(1, 2), Symbol('x'))))")
  465. assert str(ip_tall3) == '<x/2|x>'
  466. ascii_str = \
  467. """\
  468. / | \\ \n\
  469. / x| \\\n\
  470. \\ -|x /\n\
  471. \\2| / \
  472. """
  473. ucode_str = \
  474. """\
  475. ╱ │ ╲ \n\
  476. ╱ x│ ╲\n\
  477. ╲ ─│x ╱\n\
  478. ╲2│ ╱ \
  479. """
  480. assert pretty(ip_tall3) == ascii_str
  481. assert upretty(ip_tall3) == ucode_str
  482. assert latex(ip_tall3) == \
  483. r'\left\langle \frac{x}{2} \right. {\left|x\right\rangle }'
  484. sT(ip_tall3,
  485. "InnerProduct(Bra(Mul(Rational(1, 2), Symbol('x'))),Ket(Symbol('x')))")
  486. def test_operator():
  487. a = Operator('A')
  488. b = Operator('B', Symbol('t'), S.Half)
  489. inv = a.inv()
  490. f = Function('f')
  491. x = symbols('x')
  492. d = DifferentialOperator(Derivative(f(x), x), f(x))
  493. op = OuterProduct(Ket(), Bra())
  494. assert str(a) == 'A'
  495. assert pretty(a) == 'A'
  496. assert upretty(a) == 'A'
  497. assert latex(a) == 'A'
  498. sT(a, "Operator(Symbol('A'))")
  499. assert str(inv) == 'A**(-1)'
  500. ascii_str = \
  501. """\
  502. -1\n\
  503. A \
  504. """
  505. ucode_str = \
  506. """\
  507. -1\n\
  508. A \
  509. """
  510. assert pretty(inv) == ascii_str
  511. assert upretty(inv) == ucode_str
  512. assert latex(inv) == r'A^{-1}'
  513. sT(inv, "Pow(Operator(Symbol('A')), Integer(-1))")
  514. assert str(d) == 'DifferentialOperator(Derivative(f(x), x),f(x))'
  515. ascii_str = \
  516. """\
  517. /d \\\n\
  518. DifferentialOperator|--(f(x)),f(x)|\n\
  519. \\dx /\
  520. """
  521. ucode_str = \
  522. """\
  523. ⎛d ⎞\n\
  524. DifferentialOperator⎜──(f(x)),f(x)⎟\n\
  525. ⎝dx ⎠\
  526. """
  527. assert pretty(d) == ascii_str
  528. assert upretty(d) == ucode_str
  529. assert latex(d) == \
  530. r'DifferentialOperator\left(\frac{d}{d x} f{\left(x \right)},f{\left(x \right)}\right)'
  531. sT(d, "DifferentialOperator(Derivative(Function('f')(Symbol('x')), Tuple(Symbol('x'), Integer(1))),Function('f')(Symbol('x')))")
  532. assert str(b) == 'Operator(B,t,1/2)'
  533. assert pretty(b) == 'Operator(B,t,1/2)'
  534. assert upretty(b) == 'Operator(B,t,1/2)'
  535. assert latex(b) == r'Operator\left(B,t,\frac{1}{2}\right)'
  536. sT(b, "Operator(Symbol('B'),Symbol('t'),Rational(1, 2))")
  537. assert str(op) == '|psi><psi|'
  538. assert pretty(op) == '|psi><psi|'
  539. assert upretty(op) == '❘ψ⟩⟨ψ❘'
  540. assert latex(op) == r'{\left|\psi\right\rangle }{\left\langle \psi\right|}'
  541. sT(op, "OuterProduct(Ket(Symbol('psi')),Bra(Symbol('psi')))")
  542. def test_qexpr():
  543. q = QExpr('q')
  544. assert str(q) == 'q'
  545. assert pretty(q) == 'q'
  546. assert upretty(q) == 'q'
  547. assert latex(q) == r'q'
  548. sT(q, "QExpr(Symbol('q'))")
  549. def test_qubit():
  550. q1 = Qubit('0101')
  551. q2 = IntQubit(8)
  552. assert str(q1) == '|0101>'
  553. assert pretty(q1) == '|0101>'
  554. assert upretty(q1) == '❘0101⟩'
  555. assert latex(q1) == r'{\left|0101\right\rangle }'
  556. sT(q1, "Qubit(Integer(0),Integer(1),Integer(0),Integer(1))")
  557. assert str(q2) == '|8>'
  558. assert pretty(q2) == '|8>'
  559. assert upretty(q2) == '❘8⟩'
  560. assert latex(q2) == r'{\left|8\right\rangle }'
  561. sT(q2, "IntQubit(8)")
  562. def test_spin():
  563. lz = JzOp('L')
  564. ket = JzKet(1, 0)
  565. bra = JzBra(1, 0)
  566. cket = JzKetCoupled(1, 0, (1, 2))
  567. cbra = JzBraCoupled(1, 0, (1, 2))
  568. cket_big = JzKetCoupled(1, 0, (1, 2, 3))
  569. cbra_big = JzBraCoupled(1, 0, (1, 2, 3))
  570. rot = Rotation(1, 2, 3)
  571. bigd = WignerD(1, 2, 3, 4, 5, 6)
  572. smalld = WignerD(1, 2, 3, 0, 4, 0)
  573. assert str(lz) == 'Lz'
  574. ascii_str = \
  575. """\
  576. L \n\
  577. z\
  578. """
  579. ucode_str = \
  580. """\
  581. L \n\
  582. z\
  583. """
  584. assert pretty(lz) == ascii_str
  585. assert upretty(lz) == ucode_str
  586. assert latex(lz) == 'L_z'
  587. sT(lz, "JzOp(Symbol('L'))")
  588. assert str(J2) == 'J2'
  589. ascii_str = \
  590. """\
  591. 2\n\
  592. J \
  593. """
  594. ucode_str = \
  595. """\
  596. 2\n\
  597. J \
  598. """
  599. assert pretty(J2) == ascii_str
  600. assert upretty(J2) == ucode_str
  601. assert latex(J2) == r'J^2'
  602. sT(J2, "J2Op(Symbol('J'))")
  603. assert str(Jz) == 'Jz'
  604. ascii_str = \
  605. """\
  606. J \n\
  607. z\
  608. """
  609. ucode_str = \
  610. """\
  611. J \n\
  612. z\
  613. """
  614. assert pretty(Jz) == ascii_str
  615. assert upretty(Jz) == ucode_str
  616. assert latex(Jz) == 'J_z'
  617. sT(Jz, "JzOp(Symbol('J'))")
  618. assert str(ket) == '|1,0>'
  619. assert pretty(ket) == '|1,0>'
  620. assert upretty(ket) == '❘1,0⟩'
  621. assert latex(ket) == r'{\left|1,0\right\rangle }'
  622. sT(ket, "JzKet(Integer(1),Integer(0))")
  623. assert str(bra) == '<1,0|'
  624. assert pretty(bra) == '<1,0|'
  625. assert upretty(bra) == '⟨1,0❘'
  626. assert latex(bra) == r'{\left\langle 1,0\right|}'
  627. sT(bra, "JzBra(Integer(1),Integer(0))")
  628. assert str(cket) == '|1,0,j1=1,j2=2>'
  629. assert pretty(cket) == '|1,0,j1=1,j2=2>'
  630. assert upretty(cket) == '❘1,0,j₁=1,j₂=2⟩'
  631. assert latex(cket) == r'{\left|1,0,j_{1}=1,j_{2}=2\right\rangle }'
  632. sT(cket, "JzKetCoupled(Integer(1),Integer(0),Tuple(Integer(1), Integer(2)),Tuple(Tuple(Integer(1), Integer(2), Integer(1))))")
  633. assert str(cbra) == '<1,0,j1=1,j2=2|'
  634. assert pretty(cbra) == '<1,0,j1=1,j2=2|'
  635. assert upretty(cbra) == '⟨1,0,j₁=1,j₂=2❘'
  636. assert latex(cbra) == r'{\left\langle 1,0,j_{1}=1,j_{2}=2\right|}'
  637. sT(cbra, "JzBraCoupled(Integer(1),Integer(0),Tuple(Integer(1), Integer(2)),Tuple(Tuple(Integer(1), Integer(2), Integer(1))))")
  638. assert str(cket_big) == '|1,0,j1=1,j2=2,j3=3,j(1,2)=3>'
  639. # TODO: Fix non-unicode pretty printing
  640. # i.e. j1,2 -> j(1,2)
  641. assert pretty(cket_big) == '|1,0,j1=1,j2=2,j3=3,j1,2=3>'
  642. assert upretty(cket_big) == '❘1,0,j₁=1,j₂=2,j₃=3,j₁,₂=3⟩'
  643. assert latex(cket_big) == \
  644. r'{\left|1,0,j_{1}=1,j_{2}=2,j_{3}=3,j_{1,2}=3\right\rangle }'
  645. sT(cket_big, "JzKetCoupled(Integer(1),Integer(0),Tuple(Integer(1), Integer(2), Integer(3)),Tuple(Tuple(Integer(1), Integer(2), Integer(3)), Tuple(Integer(1), Integer(3), Integer(1))))")
  646. assert str(cbra_big) == '<1,0,j1=1,j2=2,j3=3,j(1,2)=3|'
  647. assert pretty(cbra_big) == '<1,0,j1=1,j2=2,j3=3,j1,2=3|'
  648. assert upretty(cbra_big) == '⟨1,0,j₁=1,j₂=2,j₃=3,j₁,₂=3❘'
  649. assert latex(cbra_big) == \
  650. r'{\left\langle 1,0,j_{1}=1,j_{2}=2,j_{3}=3,j_{1,2}=3\right|}'
  651. sT(cbra_big, "JzBraCoupled(Integer(1),Integer(0),Tuple(Integer(1), Integer(2), Integer(3)),Tuple(Tuple(Integer(1), Integer(2), Integer(3)), Tuple(Integer(1), Integer(3), Integer(1))))")
  652. assert str(rot) == 'R(1,2,3)'
  653. assert pretty(rot) == 'R (1,2,3)'
  654. assert upretty(rot) == 'ℛ (1,2,3)'
  655. assert latex(rot) == r'\mathcal{R}\left(1,2,3\right)'
  656. sT(rot, "Rotation(Integer(1),Integer(2),Integer(3))")
  657. assert str(bigd) == 'WignerD(1, 2, 3, 4, 5, 6)'
  658. ascii_str = \
  659. """\
  660. 1 \n\
  661. D (4,5,6)\n\
  662. 2,3 \
  663. """
  664. ucode_str = \
  665. """\
  666. 1 \n\
  667. D (4,5,6)\n\
  668. 2,3 \
  669. """
  670. assert pretty(bigd) == ascii_str
  671. assert upretty(bigd) == ucode_str
  672. assert latex(bigd) == r'D^{1}_{2,3}\left(4,5,6\right)'
  673. sT(bigd, "WignerD(Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6))")
  674. assert str(smalld) == 'WignerD(1, 2, 3, 0, 4, 0)'
  675. ascii_str = \
  676. """\
  677. 1 \n\
  678. d (4)\n\
  679. 2,3 \
  680. """
  681. ucode_str = \
  682. """\
  683. 1 \n\
  684. d (4)\n\
  685. 2,3 \
  686. """
  687. assert pretty(smalld) == ascii_str
  688. assert upretty(smalld) == ucode_str
  689. assert latex(smalld) == r'd^{1}_{2,3}\left(4\right)'
  690. sT(smalld, "WignerD(Integer(1), Integer(2), Integer(3), Integer(0), Integer(4), Integer(0))")
  691. def test_state():
  692. x = symbols('x')
  693. bra = Bra()
  694. ket = Ket()
  695. bra_tall = Bra(x/2)
  696. ket_tall = Ket(x/2)
  697. tbra = TimeDepBra()
  698. tket = TimeDepKet()
  699. assert str(bra) == '<psi|'
  700. assert pretty(bra) == '<psi|'
  701. assert upretty(bra) == '⟨ψ❘'
  702. assert latex(bra) == r'{\left\langle \psi\right|}'
  703. sT(bra, "Bra(Symbol('psi'))")
  704. assert str(ket) == '|psi>'
  705. assert pretty(ket) == '|psi>'
  706. assert upretty(ket) == '❘ψ⟩'
  707. assert latex(ket) == r'{\left|\psi\right\rangle }'
  708. sT(ket, "Ket(Symbol('psi'))")
  709. assert str(bra_tall) == '<x/2|'
  710. ascii_str = \
  711. """\
  712. / |\n\
  713. / x|\n\
  714. \\ -|\n\
  715. \\2|\
  716. """
  717. ucode_str = \
  718. """\
  719. ╱ │\n\
  720. ╱ x│\n\
  721. ╲ ─│\n\
  722. ╲2│\
  723. """
  724. assert pretty(bra_tall) == ascii_str
  725. assert upretty(bra_tall) == ucode_str
  726. assert latex(bra_tall) == r'{\left\langle \frac{x}{2}\right|}'
  727. sT(bra_tall, "Bra(Mul(Rational(1, 2), Symbol('x')))")
  728. assert str(ket_tall) == '|x/2>'
  729. ascii_str = \
  730. """\
  731. | \\ \n\
  732. |x \\\n\
  733. |- /\n\
  734. |2/ \
  735. """
  736. ucode_str = \
  737. """\
  738. │ ╲ \n\
  739. │x ╲\n\
  740. │─ ╱\n\
  741. │2╱ \
  742. """
  743. assert pretty(ket_tall) == ascii_str
  744. assert upretty(ket_tall) == ucode_str
  745. assert latex(ket_tall) == r'{\left|\frac{x}{2}\right\rangle }'
  746. sT(ket_tall, "Ket(Mul(Rational(1, 2), Symbol('x')))")
  747. assert str(tbra) == '<psi;t|'
  748. assert pretty(tbra) == '<psi;t|'
  749. assert upretty(tbra) == '⟨ψ;t❘'
  750. assert latex(tbra) == r'{\left\langle \psi;t\right|}'
  751. sT(tbra, "TimeDepBra(Symbol('psi'),Symbol('t'))")
  752. assert str(tket) == '|psi;t>'
  753. assert pretty(tket) == '|psi;t>'
  754. assert upretty(tket) == '❘ψ;t⟩'
  755. assert latex(tket) == r'{\left|\psi;t\right\rangle }'
  756. sT(tket, "TimeDepKet(Symbol('psi'),Symbol('t'))")
  757. def test_tensorproduct():
  758. tp = TensorProduct(JzKet(1, 1), JzKet(1, 0))
  759. assert str(tp) == '|1,1>x|1,0>'
  760. assert pretty(tp) == '|1,1>x |1,0>'
  761. assert upretty(tp) == '❘1,1⟩⨂ ❘1,0⟩'
  762. assert latex(tp) == \
  763. r'{{\left|1,1\right\rangle }}\otimes {{\left|1,0\right\rangle }}'
  764. sT(tp, "TensorProduct(JzKet(Integer(1),Integer(1)), JzKet(Integer(1),Integer(0)))")
  765. def test_big_expr():
  766. f = Function('f')
  767. x = symbols('x')
  768. e1 = Dagger(AntiCommutator(Operator('A') + Operator('B'), Pow(DifferentialOperator(Derivative(f(x), x), f(x)), 3))*TensorProduct(Jz**2, Operator('A') + Operator('B')))*(JzBra(1, 0) + JzBra(1, 1))*(JzKet(0, 0) + JzKet(1, -1))
  769. e2 = Commutator(Jz**2, Operator('A') + Operator('B'))*AntiCommutator(Dagger(Operator('C')*Operator('D')), Operator('E').inv()**2)*Dagger(Commutator(Jz, J2))
  770. e3 = Wigner3j(1, 2, 3, 4, 5, 6)*TensorProduct(Commutator(Operator('A') + Dagger(Operator('B')), Operator('C') + Operator('D')), Jz - J2)*Dagger(OuterProduct(Dagger(JzBra(1, 1)), JzBra(1, 0)))*TensorProduct(JzKetCoupled(1, 1, (1, 1)) + JzKetCoupled(1, 0, (1, 1)), JzKetCoupled(1, -1, (1, 1)))
  771. e4 = (ComplexSpace(1)*ComplexSpace(2) + FockSpace()**2)*(L2(Interval(
  772. 0, oo)) + HilbertSpace())
  773. assert str(e1) == '(Jz**2)x(Dagger(A) + Dagger(B))*{Dagger(DifferentialOperator(Derivative(f(x), x),f(x)))**3,Dagger(A) + Dagger(B)}*(<1,0| + <1,1|)*(|0,0> + |1,-1>)'
  774. ascii_str = \
  775. """\
  776. / 3 \\ \n\
  777. |/ +\\ | \n\
  778. 2 / + +\\ <| /d \\ | + +> \n\
  779. /J \\ x \\A + B /*||DifferentialOperator|--(f(x)),f(x)| | ,A + B |*(<1,0| + <1,1|)*(|0,0> + |1,-1>)\n\
  780. \\ z/ \\\\ \\dx / / / \
  781. """
  782. ucode_str = \
  783. """\
  784. ⎧ 3 ⎫ \n\
  785. ⎪⎛ †⎞ ⎪ \n\
  786. 2 ⎛ † †⎞ ⎨⎜ ⎛d ⎞ ⎟ † †⎬ \n\
  787. ⎛J ⎞ ⨂ ⎝A + B ⎠⋅⎪⎜DifferentialOperator⎜──(f(x)),f(x)⎟ ⎟ ,A + B ⎪⋅(⟨1,0❘ + ⟨1,1❘)⋅(❘0,0⟩ + ❘1,-1⟩)\n\
  788. ⎝ z⎠ ⎩⎝ ⎝dx ⎠ ⎠ ⎭ \
  789. """
  790. assert pretty(e1) == ascii_str
  791. assert upretty(e1) == ucode_str
  792. assert latex(e1) == \
  793. r'{J_z^{2}}\otimes \left({A^{\dagger} + B^{\dagger}}\right) \left\{\left(DifferentialOperator\left(\frac{d}{d x} f{\left(x \right)},f{\left(x \right)}\right)^{\dagger}\right)^{3},A^{\dagger} + B^{\dagger}\right\} \left({\left\langle 1,0\right|} + {\left\langle 1,1\right|}\right) \left({\left|0,0\right\rangle } + {\left|1,-1\right\rangle }\right)'
  794. sT(e1, "Mul(TensorProduct(Pow(JzOp(Symbol('J')), Integer(2)), Add(Dagger(Operator(Symbol('A'))), Dagger(Operator(Symbol('B'))))), AntiCommutator(Pow(Dagger(DifferentialOperator(Derivative(Function('f')(Symbol('x')), Tuple(Symbol('x'), Integer(1))),Function('f')(Symbol('x')))), Integer(3)),Add(Dagger(Operator(Symbol('A'))), Dagger(Operator(Symbol('B'))))), Add(JzBra(Integer(1),Integer(0)), JzBra(Integer(1),Integer(1))), Add(JzKet(Integer(0),Integer(0)), JzKet(Integer(1),Integer(-1))))")
  795. assert str(e2) == '[Jz**2,A + B]*{E**(-2),Dagger(D)*Dagger(C)}*[J2,Jz]'
  796. ascii_str = \
  797. """\
  798. [ 2 ] / -2 + +\\ [ 2 ]\n\
  799. [/J \\ ,A + B]*<E ,D *C >*[J ,J ]\n\
  800. [\\ z/ ] \\ / [ z]\
  801. """
  802. ucode_str = \
  803. """\
  804. ⎡ 2 ⎤ ⎧ -2 † †⎫ ⎡ 2 ⎤\n\
  805. ⎢⎛J ⎞ ,A + B⎥⋅⎨E ,D ⋅C ⎬⋅⎢J ,J ⎥\n\
  806. ⎣⎝ z⎠ ⎦ ⎩ ⎭ ⎣ z⎦\
  807. """
  808. assert pretty(e2) == ascii_str
  809. assert upretty(e2) == ucode_str
  810. assert latex(e2) == \
  811. r'\left[J_z^{2},A + B\right] \left\{E^{-2},D^{\dagger} C^{\dagger}\right\} \left[J^2,J_z\right]'
  812. sT(e2, "Mul(Commutator(Pow(JzOp(Symbol('J')), Integer(2)),Add(Operator(Symbol('A')), Operator(Symbol('B')))), AntiCommutator(Pow(Operator(Symbol('E')), Integer(-2)),Mul(Dagger(Operator(Symbol('D'))), Dagger(Operator(Symbol('C'))))), Commutator(J2Op(Symbol('J')),JzOp(Symbol('J'))))")
  813. assert str(e3) == \
  814. "Wigner3j(1, 2, 3, 4, 5, 6)*[Dagger(B) + A,C + D]x(-J2 + Jz)*|1,0><1,1|*(|1,0,j1=1,j2=1> + |1,1,j1=1,j2=1>)x|1,-1,j1=1,j2=1>"
  815. ascii_str = \
  816. """\
  817. [ + ] / 2 \\ \n\
  818. /1 3 5\\*[B + A,C + D]x |- J + J |*|1,0><1,1|*(|1,0,j1=1,j2=1> + |1,1,j1=1,j2=1>)x |1,-1,j1=1,j2=1>\n\
  819. | | \\ z/ \n\
  820. \\2 4 6/ \
  821. """
  822. ucode_str = \
  823. """\
  824. ⎡ † ⎤ ⎛ 2 ⎞ \n\
  825. ⎛1 3 5⎞⋅⎣B + A,C + D⎦⨂ ⎜- J + J ⎟⋅❘1,0⟩⟨1,1❘⋅(❘1,0,j₁=1,j₂=1⟩ + ❘1,1,j₁=1,j₂=1⟩)⨂ ❘1,-1,j₁=1,j₂=1⟩\n\
  826. ⎜ ⎟ ⎝ z⎠ \n\
  827. ⎝2 4 6⎠ \
  828. """
  829. assert pretty(e3) == ascii_str
  830. assert upretty(e3) == ucode_str
  831. assert latex(e3) == \
  832. r'\left(\begin{array}{ccc} 1 & 3 & 5 \\ 2 & 4 & 6 \end{array}\right) {\left[B^{\dagger} + A,C + D\right]}\otimes \left({- J^2 + J_z}\right) {\left|1,0\right\rangle }{\left\langle 1,1\right|} \left({{\left|1,0,j_{1}=1,j_{2}=1\right\rangle } + {\left|1,1,j_{1}=1,j_{2}=1\right\rangle }}\right)\otimes {{\left|1,-1,j_{1}=1,j_{2}=1\right\rangle }}'
  833. sT(e3, "Mul(Wigner3j(Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6)), TensorProduct(Commutator(Add(Dagger(Operator(Symbol('B'))), Operator(Symbol('A'))),Add(Operator(Symbol('C')), Operator(Symbol('D')))), Add(Mul(Integer(-1), J2Op(Symbol('J'))), JzOp(Symbol('J')))), OuterProduct(JzKet(Integer(1),Integer(0)),JzBra(Integer(1),Integer(1))), TensorProduct(Add(JzKetCoupled(Integer(1),Integer(0),Tuple(Integer(1), Integer(1)),Tuple(Tuple(Integer(1), Integer(2), Integer(1)))), JzKetCoupled(Integer(1),Integer(1),Tuple(Integer(1), Integer(1)),Tuple(Tuple(Integer(1), Integer(2), Integer(1))))), JzKetCoupled(Integer(1),Integer(-1),Tuple(Integer(1), Integer(1)),Tuple(Tuple(Integer(1), Integer(2), Integer(1))))))")
  834. assert str(e4) == '(C(1)*C(2)+F**2)*(L2(Interval(0, oo))+H)'
  835. ascii_str = \
  836. """\
  837. // 1 2\\ x2\\ / 2 \\\n\
  838. \\\\C x C / + F / x \\L + H/\
  839. """
  840. ucode_str = \
  841. """\
  842. ⎛⎛ 1 2⎞ ⨂2⎞ ⎛ 2 ⎞\n\
  843. ⎝⎝C ⨂ C ⎠ ⊕ F ⎠ ⨂ ⎝L ⊕ H⎠\
  844. """
  845. assert pretty(e4) == ascii_str
  846. assert upretty(e4) == ucode_str
  847. assert latex(e4) == \
  848. r'\left(\left(\mathcal{C}^{1}\otimes \mathcal{C}^{2}\right)\oplus {\mathcal{F}}^{\otimes 2}\right)\otimes \left({\mathcal{L}^2}\left( \left[0, \infty\right) \right)\oplus \mathcal{H}\right)'
  849. sT(e4, "TensorProductHilbertSpace((DirectSumHilbertSpace(TensorProductHilbertSpace(ComplexSpace(Integer(1)),ComplexSpace(Integer(2))),TensorPowerHilbertSpace(FockSpace(),Integer(2)))),(DirectSumHilbertSpace(L2(Interval(Integer(0), oo, false, true)),HilbertSpace())))")
  850. def _test_sho1d():
  851. ad = RaisingOp('a')
  852. assert pretty(ad) == ' \N{DAGGER}\na '
  853. assert latex(ad) == 'a^{\\dagger}'