
    wg;                     8   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z m!Z!m"Z"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) g dZ* e#jV                  e"      d        Z, G d de      Z- G d de-      Z. G d de.      Z/ G d de.      Z0 G d de.      Z1d  Z2d! Z3d" Z4d# Z5 G d$ d%e-      Z6 G d& d'e6      Z7 G d( d)e6      Z8 G d* d+e6      Z9d, Z:d- Z;d. Z<d/ Z=d0 Z>d1 Z?d2 Z@y3)4    )Product)Sum)Basic)Lambda)Ipi)S)Dummy)Abs)exp)gamma)Integral)MatrixSymbol)Trace)IndexedBase)_sympify)_symbol_converterDensityRandomMatrixSymbol	is_random)JointDistributionHandmade)RandomMatrixPSpace)ArrayComprehension)CircularEnsembleCircularUnitaryEnsembleCircularOrthogonalEnsembleCircularSymplecticEnsembleGaussianEnsembleGaussianUnitaryEnsembleGaussianOrthogonalEnsembleGaussianSymplecticEnsemblejoint_eigen_distributionJointEigenDistributionlevel_spacing_distributionc                      y)NT )xs    e/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/stats/random_matrix_models.py_r)   #   s        c                   H    e Zd ZdZddZ ed       Z ed       Zd Zd Z	y)	RandomMatrixEnsembleModelz
    Base class for random matrix ensembles.
    It acts as an umbrella and contains
    the methods common to all the ensembles
    defined in sympy.stats.random_matrix_models.
    Nc                     t        |      t        |      }}|j                  dk(  rt        d|z        t	        j
                  | ||      S )NFzGDimension of the random matrices must be integers, received %s instead.)r   r   
is_integer
ValueErrorr   __new__)clssymdims      r(   r0   z!RandomMatrixEnsembleModel.__new__/   sQ    $S)8C=S>>U" ABEG H H}}S#s++r*   c                      | j                   d   S )Nr   argsselfs    r(   <lambda>z"RandomMatrixEnsembleModel.<lambda>6   s    499Q< r*   c                      | j                   d   S )N   r5   r7   s    r(   r9   z"RandomMatrixEnsembleModel.<lambda>7   s    diil r*   c                     t        |      S N)r   r8   exprs     r(   densityz!RandomMatrixEnsembleModel.density9   s    t}r*   c                 $    | j                  |      S r=   )r@   r>   s     r(   __call__z"RandomMatrixEnsembleModel.__call__<   s    ||D!!r*   r=   )
__name__
__module____qualname____doc__r0   propertysymbol	dimensionr@   rB   r&   r*   r(   r,   r,   (   s.    , /0F23I"r*   r,   c                       e Zd ZdZd Zd Zy)GaussianEnsembleModela  
    Abstract class for Gaussian ensembles.
    Contains the properties common to all the
    gaussian ensembles.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Random_matrix#Gaussian_ensembles
    .. [2] https://arxiv.org/pdf/1712.07903.pdf
    c                     t        |      }fd}t        ddd      }t         ||      |d|f      j                         }d|z  z  |z  |dz
  z  dz  |dz  z   z  }dt        z  |dz  z  }||z  |z  S )a  
        Helper function for computing normalization
        constant for joint probability density of eigen
        values of Gaussian ensembles.

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Selberg_integral#Mehta's_integral
        c                     t        dt        |       z  dz  z         t        t        j                  t        d      z  z         z  S )Nr;      )r   r	   One)jbetas    r(   r9   zGGaussianEnsembleModel._compute_normalization_constant.<locals>.<lambda>W   s7    eAQqT	!O4U1554!9;L5MM r*   rP   Tintegerpositiver;   rN      )r	   r
   r   doitr   )r8   rQ   n	prod_termrP   term1term2term3s    `      r(   _compute_normalization_constantz5GaussianEnsembleModel._compute_normalization_constantK   s     aDM	#td3	!q!Qi0557DFtAvq1u~a/!A#5621u}u$$r*   c           
      `   | j                   }| j                  ||      }t        d      }t        ddd      }t        ddd      }t        ddd      }t	        t        |       dz  t        ||   dz  |d|f      j                         z        }t        |t        t        ||   ||   z
        |z  ||dz   |f            }	t         |	|      j                         |d|dz
  f      j                         }
t        ||   |d|f      j                         }t        t        |      ||
z  |z        S )	z
        Helper function for computing the joint
        probability distribution of eigen values
        of the random matrix.
        liTrR   rP   krN   r;   )rI   r\   r   r
   r   r	   r   rV   r   r   r   r   tuple)r8   rQ   rW   Zbnr^   r_   rP   r`   rY   sub_termrZ   symss               r(   !_compute_joint_eigen_distributionz7GaussianEnsembleModel._compute_joint_eigen_distribution^   s"    NN224;#td3#td3#td3adU1WAaD!GaAY 7 < < >>?!WS1!%5t%;aQ]KL((*Q1q5M:??A!!A$Aq	2779eDkEEM3#677r*   N)rC   rD   rE   rF   r\   re   r&   r*   r(   rK   rK   ?   s    
%&8r*   rK   c                   .    e Zd Zed        Zd Zd Zd Zy)GaussianUnitaryEnsembleModelc                 n    | j                   }dt        |      dz  z  t        t        |dz        dz  z  z  S NrN   )rI   r	   r   )r8   rW   s     r(   normalization_constantz3GaussianUnitaryEnsembleModel.normalization_constantq   s2    NN1Q46{R!AqD'!)_,,r*   c                     | j                   | j                  }}t        d|       }t        d|||      } t	        |t        t        |       dz  t        |dz        z        |z        |      S NPmodelHpspacerN   rI   rj   r   r   r   r   r	   r   )r8   r?   rW   ZGUEh_pspacerp   s         r(   r@   z$GaussianUnitaryEnsembleModel.densityv   f    ..$"="=4%c6sAq:9vaadU1WuQT{23D89$??r*   c                 6    | j                  t        d            S ri   re   r	   r7   s    r(   r"   z5GaussianUnitaryEnsembleModel.joint_eigen_distribution|       55ad;;r*   c                     t        d      }dt        dz  z  |dz  z  t        dt        z  |dz  z        z  }t        ||      S )Ns    rN   r
   r   r   r   r8   r{   fs      r(   r$   z7GaussianUnitaryEnsembleModel.level_spacing_distribution   sC    #JAX1c2b5!Q$,//a|r*   NrC   rD   rE   rG   rj   r@   r"   r$   r&   r*   r(   rg   rg   p   s$    - -@<r*   rg   c                   .    e Zd Zed        Zd Zd Zd Zy)GaussianOrthogonalEnsembleModelc           	          | j                   }t        d||      }t        t        t	        |       dz  t        |dz        z              S )N_HrU   rN   rI   r   r   r   r	   r   r8   rW   r   s      r(   rj   z6GaussianOrthogonalEnsembleModel.normalization_constant   s@    NN$1%QqTE!GeBEl2344r*   c                     | j                   | j                  }}t        d|       }t        d|||      } t	        |t        t        |       dz  t        |dz        z        |z        |      S )Nrm   rn   rp   rq   rU   rN   rs   )r8   r?   rW   ZGOEru   rp   s         r(   r@   z'GaussianOrthogonalEnsembleModel.density   rv   r*   c                 @    | j                  t        j                        S r=   re   r	   rO   r7   s    r(   r"   z8GaussianOrthogonalEnsembleModel.joint_eigen_distribution       55aee<<r*   c                 |    t        d      }t        dz  |z  t        t         dz  |dz  z        z  }t        ||      S )Nr{   rN   rU   r~   r   s      r(   r$   z:GaussianOrthogonalEnsembleModel.level_spacing_distribution   s<    #JT1HS2#a%A&&a|r*   Nr   r&   r*   r(   r   r      s$    5 5
@=r*   r   c                   .    e Zd Zed        Zd Zd Zd Zy)GaussianSymplecticEnsembleModelc           	          | j                   }t        d||      }t        t        t	        |       t        |dz        z              S )Nr   rN   r   r   s      r(   rj   z6GaussianSymplecticEnsembleModel.normalization_constant   s<    NN$1%QqTEE"a%L0122r*   c                     | j                   | j                  }}t        d|       }t        d|||      } t	        |t        t        |       t        |dz        z        |z        |      S rl   rs   )r8   r?   rW   ZGSEru   rp   s         r(   r@   z'GaussianSymplecticEnsembleModel.density   sb    ..$"="=4%c6sAq:7vaadUU1a4[01$67==r*   c                 6    | j                  t        d            S NrU   rx   r7   s    r(   r"   z8GaussianSymplecticEnsembleModel.joint_eigen_distribution   ry   r*   c                     t        d      }t        d      dz  t        d      dz  t        dz  z  z  |dz  z  t        ddt        z  z  |dz  z        z  }t	        ||      S )	Nr{   rN            rU   i	   )r
   r	   r   r   r   r   s      r(   r$   z:GaussianSymplecticEnsembleModel.level_spacing_distribution   s^    #JdBh!A$'BE*+ad3CadQT8I4JJa|r*   Nr   r&   r*   r(   r   r      s#    3 3
><r*   r   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S Nrn   rq   )r   r   rK   r   r   r2   r3   ro   rmps       r(   r   r      =     %x}C!#s+E
S
.Cc3C88r*   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S )a-  
    Represents Gaussian Unitary Ensembles.

    Examples
    ========

    >>> from sympy.stats import GaussianUnitaryEnsemble as GUE, density
    >>> from sympy import MatrixSymbol
    >>> G = GUE('U', 2)
    >>> X = MatrixSymbol('X', 2, 2)
    >>> density(G)(X)
    exp(-Trace(X**2))/(2*pi**2)
    rn   rq   )r   r   rg   r   r   r   s       r(   r   r      s?     !%x}C(c2E
S
.Cc3C88r*   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S )aN  
    Represents Gaussian Orthogonal Ensembles.

    Examples
    ========

    >>> from sympy.stats import GaussianOrthogonalEnsemble as GOE, density
    >>> from sympy import MatrixSymbol
    >>> G = GOE('U', 2)
    >>> X = MatrixSymbol('X', 2, 2)
    >>> density(G)(X)
    exp(-Trace(X**2)/2)/Integral(exp(-Trace(_H**2)/2), _H)
    rn   rq   )r   r   r   r   r   r   s       r(   r    r       ?     !%x}C+C5E
S
.Cc3C88r*   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S )aN  
    Represents Gaussian Symplectic Ensembles.

    Examples
    ========

    >>> from sympy.stats import GaussianSymplecticEnsemble as GSE, density
    >>> from sympy import MatrixSymbol
    >>> G = GSE('U', 2)
    >>> X = MatrixSymbol('X', 2, 2)
    >>> density(G)(X)
    exp(-2*Trace(X**2))/Integral(exp(-2*Trace(_H**2)), _H)
    rn   rq   )r   r   r   r   r   r   s       r(   r!   r!      r   r*   c                       e Zd ZdZd Zd Zy)CircularEnsembleModelz
    Abstract class for Circular ensembles.
    Contains the properties and methods
    common to all the circular ensembles.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Circular_ensemble
    c                     t        d| z        )NzeSupport for Haar measure hasn't been implemented yet, therefore the density of %s cannot be computed.)NotImplementedErrorr>   s     r(   r@   zCircularEnsembleModel.density   s!     " #;<@#B C 	Cr*   c                 R   | j                   }dt        z  |z  t        ||z  dz  dz         t        t        |dz  dz               |z  z  z  }t	        d      }t        dd      t        dd      t        dd      }}}t        ||   |d|f      j                         }t        t        t        t        t        ||   z        t        t        ||   z        z
        |z  ||dz   |f      j                         |d|dz
  f      j                         }	t        t        |      |	|z        S )	z
        Helper function to compute the joint distribution of phases
        of the complex eigen values of matrices belonging to any
        circular ensembles.
        rN   r;   tr_   T)rS   rP   r`   )rI   r   r   r	   r   r
   r   rV   r   r   r   r   r   ra   )
r8   rQ   rW   rb   r   r_   rP   r`   rd   r   s
             r(   re   z7CircularEnsembleModel._compute_joint_eigen_distribution   s    NN"qy5aA.qtAvz1B/CQ/FFGd+U3-Ed+ 1!!A$Aq	2779GCAadFc!AaD&k 9:D@1a!eQ-PUUW1q5M##'46 	
eDk1S5))r*   N)rC   rD   rE   rF   r@   re   r&   r*   r(   r   r      s    	C*r*   r   c                       e Zd Zd Zy)CircularUnitaryEnsembleModelc                 6    | j                  t        d            S ri   rx   r7   s    r(   r"   z5CircularUnitaryEnsembleModel.joint_eigen_distribution  ry   r*   NrC   rD   rE   r"   r&   r*   r(   r   r         <r*   r   c                       e Zd Zd Zy)CircularOrthogonalEnsembleModelc                 @    | j                  t        j                        S r=   r   r7   s    r(   r"   z8CircularOrthogonalEnsembleModel.joint_eigen_distribution  r   r*   Nr   r&   r*   r(   r   r     s    =r*   r   c                       e Zd Zd Zy)CircularSymplecticEnsembleModelc                 6    | j                  t        d            S r   rx   r7   s    r(   r"   z8CircularSymplecticEnsembleModel.joint_eigen_distribution  ry   r*   Nr   r&   r*   r(   r   r     r   r*   r   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S r   )r   r   r   r   r   r   s       r(   r   r     r   r*   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S )a8  
    Represents Circular Unitary Ensembles.

    Examples
    ========

    >>> from sympy.stats import CircularUnitaryEnsemble as CUE
    >>> from sympy.stats import joint_eigen_distribution
    >>> C = CUE('U', 1)
    >>> joint_eigen_distribution(C)
    Lambda(t[1], Product(Abs(exp(I*t[_j]) - exp(I*t[_k]))**2, (_j, _k + 1, 1), (_k, 1, 0))/(2*pi))

    Note
    ====

    As can be seen above in the example, density of CiruclarUnitaryEnsemble
    is not evaluated because the exact definition is based on haar measure of
    unitary group which is not unique.
    rn   rq   )r   r   r   r   r   r   s       r(   r   r   !  s?    ( !%x}C(c2E
S
.Cc3C88r*   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S )a>  
    Represents Circular Orthogonal Ensembles.

    Examples
    ========

    >>> from sympy.stats import CircularOrthogonalEnsemble as COE
    >>> from sympy.stats import joint_eigen_distribution
    >>> C = COE('O', 1)
    >>> joint_eigen_distribution(C)
    Lambda(t[1], Product(Abs(exp(I*t[_j]) - exp(I*t[_k])), (_j, _k + 1, 1), (_k, 1, 0))/(2*pi))

    Note
    ====

    As can be seen above in the example, density of CiruclarOrthogonalEnsemble
    is not evaluated because the exact definition is based on haar measure of
    unitary group which is not unique.
    rn   rq   )r   r   r   r   r   r   s       r(   r   r   :  ?    ( !%x}C+C5E
S
.Cc3C88r*   c                 ~    t        |       t        |      }} t        | |      }t        | |      }t	        | |||      S )aA  
    Represents Circular Symplectic Ensembles.

    Examples
    ========

    >>> from sympy.stats import CircularSymplecticEnsemble as CSE
    >>> from sympy.stats import joint_eigen_distribution
    >>> C = CSE('S', 1)
    >>> joint_eigen_distribution(C)
    Lambda(t[1], Product(Abs(exp(I*t[_j]) - exp(I*t[_k]))**4, (_j, _k + 1, 1), (_k, 1, 0))/(2*pi))

    Note
    ====

    As can be seen above in the example, density of CiruclarSymplecticEnsemble
    is not evaluated because the exact definition is based on haar measure of
    unitary group which is not unique.
    rn   rq   )r   r   r   r   r   r   s       r(   r   r   S  r   r*   c                     t        | t              st        d| z        | j                  j                  j                         S )aA  
    For obtaining joint probability distribution
    of eigen values of random matrix.

    Parameters
    ==========

    mat: RandomMatrixSymbol
        The matrix symbol whose eigen values are to be considered.

    Returns
    =======

    Lambda

    Examples
    ========

    >>> from sympy.stats import GaussianUnitaryEnsemble as GUE
    >>> from sympy.stats import joint_eigen_distribution
    >>> U = GUE('U', 2)
    >>> joint_eigen_distribution(U)
    Lambda((l[1], l[2]), exp(-l[1]**2 - l[2]**2)*Product(Abs(l[_i] - l[_j])**2, (_j, _i + 1, 2), (_i, 1, 1))/pi)
    z&%s is not of type, RandomMatrixSymbol.)
isinstancer   r/   rr   ro   r"   mats    r(   r"   r"   l  s9    2 c-.A3GHH::4466r*   c                     | j                  d      }t        d t        |      D              st        d      t	        | S )a  
    Creates joint distribution of eigen values of matrices with random
    expressions.

    Parameters
    ==========

    mat: Matrix
        The matrix under consideration.

    Returns
    =======

    JointDistributionHandmade

    Examples
    ========

    >>> from sympy.stats import Normal, JointEigenDistribution
    >>> from sympy import Matrix
    >>> A = [[Normal('A00', 0, 1), Normal('A01', 0, 1)],
    ... [Normal('A10', 0, 1), Normal('A11', 0, 1)]]
    >>> JointEigenDistribution(Matrix(A))
    JointDistributionHandmade(-sqrt(A00**2 - 2*A00*A11 + 4*A01*A10 + A11**2)/2
    + A00/2 + A11/2, sqrt(A00**2 - 2*A00*A11 + 4*A01*A10 + A11**2)/2 + A00/2 + A11/2)

    T)multiplec              3   2   K   | ]  }t        |        y wr=   )r   ).0eigenvals     r(   	<genexpr>z)JointEigenDistribution.<locals>.<genexpr>  s     Bxy"Bs   zWEigen values do not have any random expression, joint distribution cannot be generated.)	eigenvalsallsetr/   r   )r   r   s     r(   r#   r#     sF    8 t,IB3y>BB C D 	D$i00r*   c                 J    | j                   j                  j                         S )a  
    For obtaining distribution of level spacings.

    Parameters
    ==========

    mat: RandomMatrixSymbol
        The random matrix symbol whose eigen values are
        to be considered for finding the level spacings.

    Returns
    =======

    Lambda

    Examples
    ========

    >>> from sympy.stats import GaussianUnitaryEnsemble as GUE
    >>> from sympy.stats import level_spacing_distribution
    >>> U = GUE('U', 2)
    >>> level_spacing_distribution(U)
    Lambda(_s, 32*_s**2*exp(-4*_s**2/pi)/pi**2)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Random_matrix#Distribution_of_level_spacings
    )rr   ro   r$   r   s    r(   r$   r$     s    < ::6688r*   N)Asympy.concrete.productsr   sympy.concrete.summationsr   sympy.core.basicr   sympy.core.functionr   sympy.core.numbersr   r   sympy.core.singletonr	   sympy.core.symbolr
   $sympy.functions.elementary.complexesr   &sympy.functions.elementary.exponentialr   'sympy.functions.special.gamma_functionsr   sympy.integrals.integralsr   "sympy.matrices.expressions.matexprr    sympy.matrices.expressions.tracer   sympy.tensor.indexedr   sympy.core.sympifyr   sympy.stats.rvr   r   r   r   sympy.stats.joint_rv_typesr   sympy.stats.random_matrixr   sympy.tensor.arrayr   __all__registerr)   r,   rK   rg   r   r   r   r   r    r!   r   r   r   r   r   r   r   r   r"   r#   r$   r&   r*   r(   <module>r      s   + ) " & & " # 4 6 9 . ; 2 , ' T T @ 8 1 &' (" "./85 /8b#8 (&; *&; *99&9&9& *5  *D<#8 <=&; =<&; <99292927: 1D9r*   