test_dagger.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from sympy.core.expr import Expr
  2. from sympy.core.mul import Mul
  3. from sympy.core.numbers import (I, Integer)
  4. from sympy.core.symbol import symbols
  5. from sympy.functions.elementary.complexes import conjugate
  6. from sympy.matrices.dense import Matrix
  7. from sympy.physics.quantum.dagger import adjoint, Dagger
  8. from sympy.external import import_module
  9. from sympy.testing.pytest import skip
  10. from sympy.physics.quantum.operator import Operator, IdentityOperator
  11. def test_scalars():
  12. x = symbols('x', complex=True)
  13. assert Dagger(x) == conjugate(x)
  14. assert Dagger(I*x) == -I*conjugate(x)
  15. i = symbols('i', real=True)
  16. assert Dagger(i) == i
  17. p = symbols('p')
  18. assert isinstance(Dagger(p), adjoint)
  19. i = Integer(3)
  20. assert Dagger(i) == i
  21. A = symbols('A', commutative=False)
  22. assert Dagger(A).is_commutative is False
  23. def test_matrix():
  24. x = symbols('x')
  25. m = Matrix([[I, x*I], [2, 4]])
  26. assert Dagger(m) == m.H
  27. def test_dagger_mul():
  28. O = Operator('O')
  29. I = IdentityOperator()
  30. assert Dagger(O)*O == Dagger(O)*O
  31. assert Dagger(O)*O*I == Mul(Dagger(O), O)*I
  32. assert Dagger(O)*Dagger(O) == Dagger(O)**2
  33. assert Dagger(O)*Dagger(I) == Dagger(O)
  34. class Foo(Expr):
  35. def _eval_adjoint(self):
  36. return I
  37. def test_eval_adjoint():
  38. f = Foo()
  39. d = Dagger(f)
  40. assert d == I
  41. np = import_module('numpy')
  42. def test_numpy_dagger():
  43. if not np:
  44. skip("numpy not installed.")
  45. a = np.array([[1.0, 2.0j], [-1.0j, 2.0]])
  46. adag = a.copy().transpose().conjugate()
  47. assert (Dagger(a) == adag).all()
  48. scipy = import_module('scipy', import_kwargs={'fromlist': ['sparse']})
  49. def test_scipy_sparse_dagger():
  50. if not np:
  51. skip("numpy not installed.")
  52. if not scipy:
  53. skip("scipy not installed.")
  54. else:
  55. sparse = scipy.sparse
  56. a = sparse.csr_matrix([[1.0 + 0.0j, 2.0j], [-1.0j, 2.0 + 0.0j]])
  57. adag = a.copy().transpose().conjugate()
  58. assert np.linalg.norm((Dagger(a) - adag).todense()) == 0.0