
    g;                     r   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#j+        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@d3S )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                     dS )NT )xs    \/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/stats/random_matrix_models.py_r)   #   s    4    c                   V    e Zd ZdZddZ ed           Z ed           Zd Zd Z	dS )	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__/   s^    $S))8C==S>U"" ABEG H H H}S#s+++r*   c                     | j         d         S )Nr   argsselfs    r(   <lambda>z"RandomMatrixEnsembleModel.<lambda>6   s    49Q< r*   c                     | j         d         S )N   r5   r7   s    r(   r9   z"RandomMatrixEnsembleModel.<lambda>7   s    dil r*   c                      t          |          S N)r   r8   exprs     r(   densityz!RandomMatrixEnsembleModel.density9   s    t}}r*   c                 ,    |                      |          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,   (   sx         , , , , X//00F2233I  " " " " "r*   r,   c                       e Zd ZdZd Zd ZdS )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                                          }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   s?    eAQqTT	!O44U154!9;L5M5M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     aDDMMMM	#td333		!q!Qi005577DFtAvq1u~a/!A#5621u}u$$r*   c           
         | j         }|                     ||          }t          d          }t          ddd          }t          ddd          }t          ddd          }t	          t          |           dz  t          ||         dz  |d|f                                          z            }t          |t          t          ||         ||         z
            |z  ||dz   |f                    }	t           |	|                                          |d|dz
  f                                          }
t          ||         |d|f                                          }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^   sd    N224;;#td333#td333#td333addU1WAaD!GaAY 7 7 < < > >>??!WS1!%5%5t%;aQ]KKLL((**Q1q5M::??AA!!A$Aq	227799eDkkEEM3#6777r*   N)rC   rD   rE   rF   r\   re   r&   r*   r(   rK   rK   ?   s<        
 
% % %&8 8 8 8 8r*   rK   c                   6    e Zd Zed             Zd Zd Zd ZdS )GaussianUnitaryEnsembleModelc                 v    | 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   s4    N1Q44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   z    .$"=4%c666sAq:::9vaaddU1WuQT{{233D899$???r*   c                 F    |                      t          d                    S ri   re   r	   r7   s    r(   r"   z5GaussianUnitaryEnsembleModel.joint_eigen_distribution|       55add;;;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   sJ    #JJAX1c2b5!Q$,///a||r*   NrC   rD   rE   rG   rj   r@   r"   r$   r&   r*   r(   rg   rg   p   s]        - - X-@ @ @< < <    r*   rg   c                   6    e Zd Zed             Zd Zd Zd ZdS )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   sK    N$1%%QqTTE!GeBEll2334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                 @    |                      t          j                  S r=   re   r	   rO   r7   s    r(   r"   z8GaussianOrthogonalEnsembleModel.joint_eigen_distribution       55ae<<<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   sC    #JJT1HS2#a%A&&&a||r*   Nr   r&   r*   r(   r   r      s]        5 5 X5
@ @ @= = =    r*   r   c                   6    e Zd Zed             Zd Zd Zd ZdS )GaussianSymplecticEnsembleModelc           	          | j         }t          d||          }t          t          t	          |           t          |dz            z                      S )Nr   rN   r   r   s      r(   rj   z6GaussianSymplecticEnsembleModel.normalization_constant   sG    N$1%%QqTTEE"a%LL0112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   sv    .$"=4%c666sAq:::7vaaddUU1a4[[011$677===r*   c                 F    |                      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   si    #JJddBh!A$$'BE*+ad3CadQT8I4J4JJa||r*   Nr   r&   r*   r(   r   r      sZ        3 3 X3
> > >< < <    r*   r   c                     t          |           t          |          }} t          | |          }t          | |          }t	          | |||          S Nrn   rq   )r   r   rK   r   r   r2   r3   ro   rmps       r(   r   r      Q     %%x}}C!#s++E
S
.
.
.Cc3C88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      sS     !%%x}}C(c22E
S
.
.
.Cc3C88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       S     !%%x}}C+C55E
S
.
.
.Cc3C88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dS )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 	Cr*   c                    | 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                                          }t          t          t          t          t          ||         z            t          t          ||         z            z
            |z  ||dz   |f                                          |d|dz
  f                                          }	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   sO    N"qy5aA..qtAvz1B1B/C/CQ/FFGd+++U3-E-E-Ed+++ 1!!A$Aq	227799GCAadFc!AaD&kk 9::D@1a!eQ-PPUUWW1q5M# ##'466 	
eDkk1S5)))r*   N)rC   rD   rE   rF   r@   re   r&   r*   r(   r   r      s?        	 	C C C* * * * *r*   r   c                       e Zd Zd ZdS )CircularUnitaryEnsembleModelc                 F    |                      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dS )CircularOrthogonalEnsembleModelc                 @    |                      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dS )CircularSymplecticEnsembleModelc                 F    |                      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   !  sS    ( !%%x}}C(c22E
S
.
.
.Cc3C88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   :  S    ( !%%x}}C+C55E
S
.
.
.Cc3C88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                                        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  sC    2 c-.. IA3GHHH:44666r*   c                     |                      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   4   K   | ]}t          |          V  d S r=   )r   ).0eigenvals     r(   	<genexpr>z)JointEigenDistribution.<locals>.<genexpr>  s*      BBxy""BBBBBBr*   zWEigen values do not have any random expression, joint distribution cannot be generated.)	eigenvalsallsetr/   r   )r   r   s     r(   r#   r#     sc    8 t,,IBB3y>>BBBBB D C D D 	D$i00r*   c                 >    | 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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 4 4 4 4 4 6 6 6 6 6 6 9 9 9 9 9 9 . . . . . . ; ; ; ; ; ; 2 2 2 2 2 2 , , , , , , ' ' ' ' ' ' T T T T T T T T T T T T @ @ @ @ @ @ 8 8 8 8 8 8 1 1 1 1 1 1   &''  ('" " " " " " " "./8 /8 /8 /8 /85 /8 /8 /8b    #8   (    &;   *    &;   *9 9 99 9 9&9 9 9&9 9 9& *  *  *  *  *5  *  *  *D< < < < <#8 < < <= = = = =&; = = =< < < < <&; < < <9 9 99 9 929 9 929 9 927 7 7: 1  1  1D9 9 9 9 9r*   