test_random_matrix.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from sympy.concrete.products import Product
  2. from sympy.core.function import Lambda
  3. from sympy.core.numbers import (I, Rational, pi)
  4. from sympy.core.singleton import S
  5. from sympy.core.symbol import Dummy
  6. from sympy.functions.elementary.complexes import Abs
  7. from sympy.functions.elementary.exponential import exp
  8. from sympy.functions.elementary.miscellaneous import sqrt
  9. from sympy.integrals.integrals import Integral
  10. from sympy.matrices.dense import Matrix
  11. from sympy.matrices.expressions.matexpr import MatrixSymbol
  12. from sympy.matrices.expressions.trace import Trace
  13. from sympy.tensor.indexed import IndexedBase
  14. from sympy.stats import (GaussianUnitaryEnsemble as GUE, density,
  15. GaussianOrthogonalEnsemble as GOE,
  16. GaussianSymplecticEnsemble as GSE,
  17. joint_eigen_distribution,
  18. CircularUnitaryEnsemble as CUE,
  19. CircularOrthogonalEnsemble as COE,
  20. CircularSymplecticEnsemble as CSE,
  21. JointEigenDistribution,
  22. level_spacing_distribution,
  23. Normal, Beta)
  24. from sympy.stats.joint_rv_types import JointDistributionHandmade
  25. from sympy.stats.rv import RandomMatrixSymbol
  26. from sympy.stats.random_matrix_models import GaussianEnsemble, RandomMatrixPSpace
  27. from sympy.testing.pytest import raises
  28. def test_GaussianEnsemble():
  29. G = GaussianEnsemble('G', 3)
  30. assert density(G) == G.pspace.model
  31. raises(ValueError, lambda: GaussianEnsemble('G', 3.5))
  32. def test_GaussianUnitaryEnsemble():
  33. H = RandomMatrixSymbol('H', 3, 3)
  34. G = GUE('U', 3)
  35. assert density(G)(H) == sqrt(2)*exp(-3*Trace(H**2)/2)/(4*pi**Rational(9, 2))
  36. i, j = (Dummy('i', integer=True, positive=True),
  37. Dummy('j', integer=True, positive=True))
  38. l = IndexedBase('l')
  39. assert joint_eigen_distribution(G).dummy_eq(
  40. Lambda((l[1], l[2], l[3]),
  41. 27*sqrt(6)*exp(-3*(l[1]**2)/2 - 3*(l[2]**2)/2 - 3*(l[3]**2)/2)*
  42. Product(Abs(l[i] - l[j])**2, (j, i + 1, 3), (i, 1, 2))/(16*pi**Rational(3, 2))))
  43. s = Dummy('s')
  44. assert level_spacing_distribution(G).dummy_eq(Lambda(s, 32*s**2*exp(-4*s**2/pi)/pi**2))
  45. def test_GaussianOrthogonalEnsemble():
  46. H = RandomMatrixSymbol('H', 3, 3)
  47. _H = MatrixSymbol('_H', 3, 3)
  48. G = GOE('O', 3)
  49. assert density(G)(H) == exp(-3*Trace(H**2)/4)/Integral(exp(-3*Trace(_H**2)/4), _H)
  50. i, j = (Dummy('i', integer=True, positive=True),
  51. Dummy('j', integer=True, positive=True))
  52. l = IndexedBase('l')
  53. assert joint_eigen_distribution(G).dummy_eq(
  54. Lambda((l[1], l[2], l[3]),
  55. 9*sqrt(2)*exp(-3*l[1]**2/2 - 3*l[2]**2/2 - 3*l[3]**2/2)*
  56. Product(Abs(l[i] - l[j]), (j, i + 1, 3), (i, 1, 2))/(32*pi)))
  57. s = Dummy('s')
  58. assert level_spacing_distribution(G).dummy_eq(Lambda(s, s*pi*exp(-s**2*pi/4)/2))
  59. def test_GaussianSymplecticEnsemble():
  60. H = RandomMatrixSymbol('H', 3, 3)
  61. _H = MatrixSymbol('_H', 3, 3)
  62. G = GSE('O', 3)
  63. assert density(G)(H) == exp(-3*Trace(H**2))/Integral(exp(-3*Trace(_H**2)), _H)
  64. i, j = (Dummy('i', integer=True, positive=True),
  65. Dummy('j', integer=True, positive=True))
  66. l = IndexedBase('l')
  67. assert joint_eigen_distribution(G).dummy_eq(
  68. Lambda((l[1], l[2], l[3]),
  69. 162*sqrt(3)*exp(-3*l[1]**2/2 - 3*l[2]**2/2 - 3*l[3]**2/2)*
  70. Product(Abs(l[i] - l[j])**4, (j, i + 1, 3), (i, 1, 2))/(5*pi**Rational(3, 2))))
  71. s = Dummy('s')
  72. assert level_spacing_distribution(G).dummy_eq(Lambda(s, S(262144)*s**4*exp(-64*s**2/(9*pi))/(729*pi**3)))
  73. def test_CircularUnitaryEnsemble():
  74. CU = CUE('U', 3)
  75. j, k = (Dummy('j', integer=True, positive=True),
  76. Dummy('k', integer=True, positive=True))
  77. t = IndexedBase('t')
  78. assert joint_eigen_distribution(CU).dummy_eq(
  79. Lambda((t[1], t[2], t[3]),
  80. Product(Abs(exp(I*t[j]) - exp(I*t[k]))**2,
  81. (j, k + 1, 3), (k, 1, 2))/(48*pi**3))
  82. )
  83. def test_CircularOrthogonalEnsemble():
  84. CO = COE('U', 3)
  85. j, k = (Dummy('j', integer=True, positive=True),
  86. Dummy('k', integer=True, positive=True))
  87. t = IndexedBase('t')
  88. assert joint_eigen_distribution(CO).dummy_eq(
  89. Lambda((t[1], t[2], t[3]),
  90. Product(Abs(exp(I*t[j]) - exp(I*t[k])),
  91. (j, k + 1, 3), (k, 1, 2))/(48*pi**2))
  92. )
  93. def test_CircularSymplecticEnsemble():
  94. CS = CSE('U', 3)
  95. j, k = (Dummy('j', integer=True, positive=True),
  96. Dummy('k', integer=True, positive=True))
  97. t = IndexedBase('t')
  98. assert joint_eigen_distribution(CS).dummy_eq(
  99. Lambda((t[1], t[2], t[3]),
  100. Product(Abs(exp(I*t[j]) - exp(I*t[k]))**4,
  101. (j, k + 1, 3), (k, 1, 2))/(720*pi**3))
  102. )
  103. def test_JointEigenDistribution():
  104. A = Matrix([[Normal('A00', 0, 1), Normal('A01', 1, 1)],
  105. [Beta('A10', 1, 1), Beta('A11', 1, 1)]])
  106. assert JointEigenDistribution(A) == \
  107. JointDistributionHandmade(-sqrt(A[0, 0]**2 - 2*A[0, 0]*A[1, 1] + 4*A[0, 1]*A[1, 0] + A[1, 1]**2)/2 +
  108. A[0, 0]/2 + A[1, 1]/2, sqrt(A[0, 0]**2 - 2*A[0, 0]*A[1, 1] + 4*A[0, 1]*A[1, 0] + A[1, 1]**2)/2 + A[0, 0]/2 + A[1, 1]/2)
  109. raises(ValueError, lambda: JointEigenDistribution(Matrix([[1, 0], [2, 1]])))
  110. def test_issue_19841():
  111. G1 = GUE('U', 2)
  112. G2 = G1.xreplace({2: 2})
  113. assert G1.args == G2.args
  114. X = MatrixSymbol('X', 2, 2)
  115. G = GSE('U', 2)
  116. h_pspace = RandomMatrixPSpace('P', model=density(G))
  117. H = RandomMatrixSymbol('H', 2, 2, pspace=h_pspace)
  118. H2 = RandomMatrixSymbol('H', 2, 2, pspace=None)
  119. assert H.doit() == H
  120. assert (2*H).xreplace({H: X}) == 2*X
  121. assert (2*H).xreplace({H2: X}) == 2*H
  122. assert (2*H2).xreplace({H: X}) == 2*H2
  123. assert (2*H2).xreplace({H2: X}) == 2*X