图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

899 lines
30 KiB

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