Ë
    7^(hÁU  ã                   ó¦  — 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 d dlmZmZmZmZmZmZmZmZmZ d d	lmZmZmZmZmZmZm Z  d d
l!m"Z"  G d„ de«      Z#d„ Z$ G d„ d«      Z% G d„ d«      Z& G d„ d«      Z'e%e'e'e&dœZ( G d„ de e«      Z) G d„ de)«      Z*d„ Z+ G d„ de)«      Z,d„ Z- G d„ de)«      Z.d„ Z/ G d „ d!e)«      Z0d"„ Z1y#)$é    )Úprod)ÚBasic)Úpi)ÚS)Úexp)Ú
multigamma)ÚsympifyÚ_sympify)	ÚImmutableMatrixÚInverseÚTraceÚDeterminantÚMatrixSymbolÚ
MatrixBaseÚ	TransposeÚ	MatrixSetÚmatrix2numpy)Ú_value_checkÚRandomMatrixSymbolÚNamedArgsMixinÚPSpaceÚ_symbol_converterÚMatrixDomainÚDistribution)Úimport_modulec                   óx   — e Zd ZdZd„ Z ed„ «      Z ed„ «      Zed„ «       Zed„ «       Z	ed„ «       Z
d„ Zdd
„Zy	)ÚMatrixPSpacezD
    Represents probability space for
    Matrix Distributions.
    c                 ó¼   — t        |«      }t        |«      t        |«      }}|j                  r|j                  st        d«      ‚t	        j
                  | ||||«      S )NzDimensions should be integers)r   r
   Ú
is_integerÚ
ValueErrorr   Ú__new__)ÚclsÚsymÚdistributionÚdim_nÚdim_ms        ú^/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/stats/matrix_distributions.pyr!   zMatrixPSpace.__new__   sQ   € Ü Ó$ˆÜ “¬°«ˆuˆØ× Ò  U×%5Ò%5ÜÐ<Ó=Ð=Ü�}‰}˜S # |°U¸EÓBÐBó    c                 ó    — | j                   d   S )Né   ©Úargs©Úselfs    r'   ú<lambda>zMatrixPSpace.<lambda>    s   € ¨¯©°1©€ r(   c                 ó    — | j                   d   S ©Nr   r+   r-   s    r'   r/   zMatrixPSpace.<lambda>!   s   €  4§9¡9¨Q¡<€ r(   c                 óV   — t        | j                  | j                  j                  «      S ©N)r   Úsymbolr$   Úsetr-   s    r'   ÚdomainzMatrixPSpace.domain#   s   € ä˜DŸK™K¨×):Ñ):×)>Ñ)>Ó?Ð?r(   c                 óf   — t        | j                  | j                  d   | j                  d   | «      S )Né   é   )r   r4   r,   r-   s    r'   ÚvaluezMatrixPSpace.value'   s'   € ä! $§+¡+¨t¯y©y¸©|¸T¿Y¹YÀq¹\È4ÓPÐPr(   c                 ó   — | j                   hS r3   )r:   r-   s    r'   ÚvalueszMatrixPSpace.values+   s   € à—
‘
ˆ|Ðr(   c                 ó´   — |j                  t        «      }t        |«      dkD  st        |t        «      st	        d«      ‚| j
                  j                  |«      S )Nr*   ztCurrently, no algorithm has been implemented to handle general expressions containing multiple matrix distributions.)Úatomsr   ÚlenÚ
isinstanceÚNotImplementedErrorr$   Úpdf)r.   Úexprr,   Úrmss       r'   Úcompute_densityzMatrixPSpace.compute_density/   sQ   € Ø�j‰jÔ+Ó,ˆÜˆs‹8�aŠ<¤
¨4Ô1CÔ DÜ%ð '5ó 6ð 6ð × Ñ ×$Ñ$ TÓ*Ð*r(   Nc                 óV   — | j                   | j                  j                  |||¬«      iS )zu
        Internal sample method

        Returns dictionary mapping RandomMatrixSymbol to realization value.
        )ÚlibraryÚseed)r:   r$   Úsample)r.   ÚsizerG   rH   s       r'   rI   zMatrixPSpace.sample7   s,   € ð —
‘
˜D×-Ñ-×4Ñ4°TÀ7ÐQUÐ4ÓVÐWÐWr(   ©© ÚscipyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   Úpropertyr$   r4   r6   r:   r<   rE   rI   rL   r(   r'   r   r      sn   „ ñòCñ Ñ5Ó6€LÙÑ/Ó0€Fàñ@ó ð@ð ñQó ðQð ñó ðò+ôXr(   r   c                 ó´   — t        t        t        |«      «      } ||Ž } |j                  |Ž  |j                  }t        | ||d   |d   «      }|j                  S )Nr   r*   )ÚlistÚmapr	   ÚcheckÚ	dimensionr   r:   )r4   r"   r,   ÚdistÚdimÚpspaces         r'   Úrvr[   @   sU   € Ü””G˜TÓ"Ó#€DÙ�ˆ:€DØ€D‡J�J�ÑØ
�.‰.€CÜ˜& $¨¨A©°°A±Ó7€FØ�<‰<Ðr(   c                   ó(   — e Zd ZdZdd„Zed„ «       Zy)ÚSampleMatrixScipyz7Returns the sample from scipy of the given distributionNc                 ó(   — | j                  |||«      S r3   )Ú_sample_scipy©r"   rX   rJ   rH   s       r'   r!   zSampleMatrixScipy.__new__K   ó   € Ø× Ñ   t¨TÓ2Ð2r(   c                 ó¦  ‡
— ddl mŠ
 ddl}ˆ
fd„ˆ
fd„dœ}d„ d„ dœ}|j                  «       }|j                  j
                  |vry|�t        |t        «      r|j                  j                  |¬	«      }n|} ||j                  j
                     |t        |«      |«      }	|	j                  | ||j                  j
                     |«      z   «      S )
zSample from SciPy.r   )ÚstatsNc                 ó–   •— ‰j                   j                  t        | j                  «      t	        | j
                  t        «      |¬«      S )N)ÚdfÚscalerJ   )ÚwishartÚrvsÚintÚnr   Úscale_matrixÚfloat©rX   rJ   Ú
rand_stateÚscipy_statss      €r'   r/   z1SampleMatrixScipy._sample_scipy.<locals>.<lambda>U   s>   ø€ À+×BUÑBU×BYÑBYÜ�t—v‘v“;¤l°4×3DÑ3DÄeÓ&LÐSWð CZó CY€ r(   c                 óÔ   •— ‰j                   j                  t        | j                  t        «      t        | j
                  t        «      t        | j                  t        «      ||¬«      S )N)ÚmeanÚrowcovÚcolcovrJ   Úrandom_state)Úmatrix_normalrh   r   Úlocation_matrixrl   Úscale_matrix_1Úscale_matrix_2rm   s      €r'   r/   z1SampleMatrixScipy._sample_scipy.<locals>.<lambda>W   sV   ø€ À{×G`ÑG`×GdÑGdÜ! $×"6Ñ"6¼Ó>Ü# D×$7Ñ$7¼Ó?Ü# D×$7Ñ$7¼Ó?ÀdÐYcð Heó He€ r(   ©ÚWishartDistributionÚMatrixNormalDistributionc                 ó.   — | j                   j                  S r3   ©rk   Úshape©rX   s    r'   r/   z1SampleMatrixScipy._sample_scipy.<locals>.<lambda>^   ó   € °×0AÑ0A×0GÑ0G€ r(   c                 ó.   — | j                   j                  S r3   ©rv   r~   r   s    r'   r/   z1SampleMatrixScipy._sample_scipy.<locals>.<lambda>_   ó   € °d×6JÑ6J×6PÑ6P€ r(   ©rH   )rM   rc   ÚnumpyÚkeysÚ	__class__rN   r@   ri   ÚrandomÚdefault_rngr   Úreshape)r"   rX   rJ   rH   r…   Úscipy_rv_mapÚsample_shapeÚ	dist_listrn   Úsampro   s             @r'   r_   zSampleMatrixScipy._sample_scipyN   sË   ø€ õ 	/Ûó$Yó)eñ
ˆñ $HÙ)Pñ
ˆð
 !×%Ñ%Ó'ˆ	à�>‰>×"Ñ"¨)Ñ3Øàˆ<œ: d¬CÔ0ØŸ™×1Ñ1°tÐ1Ó<‰JàˆJØ4ˆ|˜DŸN™N×3Ñ3Ñ4°T¼4À»:ÀzÓRˆØ�|‰|˜DÐ#H <°·±×0GÑ0GÑ#HÈÓ#NÑNÓOÐOr(   r3   )rN   rO   rP   rQ   r!   Úclassmethodr_   rL   r(   r'   r]   r]   I   s    „ ÙAó3ð ñPó ñPr(   r]   c                   ó(   — e Zd ZdZdd„Zed„ «       Zy)ÚSampleMatrixNumpyz7Returns the sample from numpy of the given distributionNc                 ó(   — | j                  |||«      S r3   )Ú_sample_numpyr`   s       r'   r!   zSampleMatrixNumpy.__new__s   ra   r(   c                 ó|  — i }i }|j                  «       }|j                  j                  |vryddl}|�t	        |t
        «      r|j                  j                  |¬«      }n|} ||j                  j                     |t        |«      |«      }	|	j                  | ||j                  j                     |«      z   «      S )zSample from NumPy.Nr   r„   )
r†   r‡   rN   r…   r@   ri   rˆ   r‰   r   rŠ   )
r"   rX   rJ   rH   Únumpy_rv_maprŒ   r�   r…   rn   rŽ   s
             r'   r“   zSampleMatrixNumpy._sample_numpyv   s°   € ð
ˆð
ˆð !×%Ñ%Ó'ˆ	à�>‰>×"Ñ"¨)Ñ3ØãØˆ<œ: d¬CÔ0ØŸ™×1Ñ1°tÐ1Ó<‰JàˆJØ4ˆ|˜DŸN™N×3Ñ3Ñ4°T¼4À»:ÀzÓRˆØ�|‰|˜DÐ#H <°·±×0GÑ0GÑ#HÈÓ#NÑNÓOÐOr(   r3   )rN   rO   rP   rQ   r!   r�   r“   rL   r(   r'   r‘   r‘   o   s    „ ÙAó3ð ñPó ñPr(   r‘   c                   ó(   — e Zd ZdZdd„Zed„ «       Zy)ÚSampleMatrixPymcz6Returns the sample from pymc of the given distributionNc                 ó(   — | j                  |||«      S r3   )Ú_sample_pymcr`   s       r'   r!   zSampleMatrixPymc.__new__‘   s   € Ø×Ñ  d¨DÓ1Ð1r(   c           	      ó8  ‡	— 	 ddl Š	ˆ	fd„ˆ	fd„dœ}d„ d„ dœ}|j                  «       }|j                  j
                  |vryddl}|j                  d	«      j                  |j                  «       ‰	j                  «       5   ||j                  j
                     |«       ‰	j                  t        |«      d
d|dd¬«      d   }ddd«       j                  | ||j                  j
                     |«      z   «      S # t        $ r ddlŠ	Y �Œw xY w# 1 sw Y   ŒNxY w)zSample from PyMC.r   Nc           	      óè   •— ‰j                  dt        | j                  t        «      t        | j                  t        «      t        | j
                  t        «      | j                  j                  ¬«      S )NÚX)Úmurr   rs   r~   )ÚMatrixNormalr   rv   rl   rw   rx   r~   ©rX   Úpymcs    €r'   r/   z/SampleMatrixPymc._sample_pymc.<locals>.<lambda>�   sY   ø€ °T×5FÑ5FÀsÜ × 4Ñ 4´eÓ<Ü# D×$7Ñ$7¼Ó?Ü# D×$7Ñ$7¼Ó?Ø×*Ñ*×0Ñ0ð	 6Gó 62€ r(   c                 ó‚   •— ‰j                  dt        | j                  «      t        | j                  t
        «      ¬«      S )Nrœ   )Únur   )ÚWishartBartlettri   rj   r   rk   rl   rŸ   s    €r'   r/   z/SampleMatrixPymc._sample_pymc.<locals>.<lambda>¢   s5   ø€ °×0DÑ0DÀSÜ�t—v‘v“;¤,¨t×/@Ñ/@Ä%Ó"Hð 1Eó 1J€ r(   )r{   rz   c                 ó.   — | j                   j                  S r3   r}   r   s    r'   r/   z/SampleMatrixPymc._sample_pymc.<locals>.<lambda>§   r€   r(   c                 ó.   — | j                   j                  S r3   r‚   r   s    r'   r/   z/SampleMatrixPymc._sample_pymc.<locals>.<lambda>¨   rƒ   r(   ry   r    r*   F)ÚdrawsÚchainsÚprogressbarÚrandom_seedÚreturn_inferencedataÚcompute_convergence_checksrœ   )r    ÚImportErrorÚpymc3r†   r‡   rN   ÚloggingÚ	getLoggerÚsetLevelÚERRORÚModelrI   r   rŠ   )
r"   rX   rJ   rH   Úpymc_rv_maprŒ   r�   r®   Úsampsr    s
            @r'   r™   zSampleMatrixPymc._sample_pymc”   s#  ø€ ð	!Ûó)2ó
$Jñ
ˆñ $HÙ)Pñ
ˆð
  ×$Ñ$Ó&ˆ	à�>‰>×"Ñ"¨)Ñ3ØÛØ×Ñ˜&Ó!×*Ñ*¨7¯=©=Ô9Ø�Z‰Z‹\ñ 	dØ0ˆK˜Ÿ™×/Ñ/Ñ0°Ô6Ø—K‘K¤d¨4£j¸ÈÐ[_Ðv{ð  Y^�Kó  _ð  `cñ  dˆE÷	dð �}‰}˜TÐ$I L°·±×1HÑ1HÑ$IÈ$Ó$OÑOÓPÐPøô5 ò 	!Þ ð	!ú÷.	dð 	dús   ƒC< Â ADÃ<DÄDÄDr3   )rN   rO   rP   rQ   r!   r�   r™   rL   r(   r'   r—   r—   Ž   s    „ Ù@ó2ð ñQó ñQr(   r—   )rM   r­   r    r…   c                   ó4   — e Zd ZdZd„ Zed„ «       Zd„ Zdd„Zy)ÚMatrixDistributionz1
    Abstract class for Matrix Distribution.
    c                 óž   — |D �cg c](  }t        |t        «      rt        |«      n
t        |«      ‘Œ* }}t	        j
                  | g|¢­Ž S c c}w r3   )r@   rT   r   r
   r   r!   )r"   r,   Úargs      r'   r!   zMatrixDistribution.__new__Å   sR   € à.2ö4Ø'*ô )3°3¼Ô(=” Ô$Ü˜c“]ñ#ð 4ˆð 4ä�}‰}˜SÐ( 4Ò(Ð(ùò4s   …-A
c                   ó   — y r3   rL   r+   s    r'   rV   zMatrixDistribution.checkÊ   s   € àr(   c                 óZ   — t        |t        «      rt        |«      }| j                  |«      S r3   )r@   rT   r   rB   )r.   rC   s     r'   Ú__call__zMatrixDistribution.__call__Î   s$   € Ü�dœDÔ!Ü" 4Ó(ˆDØ�x‰x˜‹~Ðr(   Nc                 óä   — g d¢}||vrt        dt        |«      z  «      ‚t        |«      st        d|z  «      ‚t	        |   | ||«      }|�|S t        d| j
                  j                  ›d|›�«      ‚)zo
        Internal sample method

        Returns dictionary mapping RandomSymbol to realization value.
        )rM   r…   r­   r    z&Sampling from %s is not supported yet.zFailed to import %szSampling for z# is not currently implemented from )rA   Ústrr   r    Ú_get_sample_class_matrixrvr‡   rN   )r.   rJ   rG   rH   Ú	librariesr´   s         r'   rI   zMatrixDistribution.sampleÓ   s…   € ò 8ˆ	Ø˜)Ñ#Ü%Ð&NÜ*-¨g«,ñ'7ó 8ð 8ä˜WÔ%ÜÐ2°WÑ<Ó=Ð=ä*¨7Ñ3°D¸$ÀÓEˆàÐØˆLÝ!à—>‘>×*Ó*©Gð5óð 	r(   rK   )	rN   rO   rP   rQ   r!   ÚstaticmethodrV   r»   rI   rL   r(   r'   r¶   r¶   Á   s*   „ ñò)ð
 ñó ðòô
r(   r¶   c                   óF   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zd„ Z	y)ÚMatrixGammaDistribution©ÚalphaÚbetark   c                 óÔ   — t        |t        «      st        |j                  d«       t        |j                  d«       t        | j
                  d«       t        |j
                  d«       y )Nú+The shape matrix must be positive definite.úShould be square matrixú#Shape parameter should be positive.z#Scale parameter should be positive.©r@   r   r   Úis_positive_definiteÚ	is_squareÚis_positiverÃ   s      r'   rV   zMatrixGammaDistribution.checkõ   sX   € ä˜,¬Ô5Ü˜×:Ñ:ð =4ô 5ä�\×+Ñ+ð .ô 	ä�U×&Ñ&Ð(MÔNÜ�T×%Ñ%Ð'LÕMr(   c                 ój   — | j                   j                  d   }t        ||t        j                  «      S r1   ©rk   r~   r   r   ÚReals©r.   Úks     r'   r5   zMatrixGammaDistribution.setÿ   ó+   € à×Ñ×#Ñ# AÑ&ˆÜ˜˜AœqŸw™wÓ'Ð'r(   c                 ó.   — | j                   j                  S r3   r}   r-   s    r'   rW   z!MatrixGammaDistribution.dimension  ó   € à× Ñ ×&Ñ&Ð&r(   c                 óÞ  — | j                   | j                  | j                  }}}|j                  d   }t	        |t
        «      rt        |«      }t	        |t        t        f«      st        dt        |«      z  «      ‚t        |«       |z  |z  }t        t        |«      «      |||z  z  t        ||«      z  z  }t        |«      | z  }t        |«      |t!        |dz   «      dz  z
  z  }	||z  |	z  S )Nr   ú4%s should be an isinstance of Matrix or MatrixSymbolr*   r8   )rÄ   rÅ   rk   r~   r@   rT   r   r   r   r    r½   r   r   r   r   r   r   )
r.   ÚxrÄ   rÅ   rk   ÚpÚsigma_inv_xÚterm1Úterm2Úterm3s
             r'   rB   zMatrixGammaDistribution.pdf  sì   € Ø$(§J¡J°·	±	¸4×;LÑ;L�\ˆtˆØ×Ñ˜qÑ!ˆÜ�aœÔÜ Ó"ˆAÜ˜!œj¬,Ð7Ô8Üð &Ü(+¨A«ñ/ó 0ð 0ä Ó-Ð-¨aÑ/°$Ñ6ˆÜ”E˜+Ó&Ó'¨$°°5±©/¼ZÈÈqÓ=QÑ)QÑRˆÜ˜\Ó*¨u¨fÑ5ˆÜ˜Q“ 5¬1¨Q°©U«8°A©:Ñ#5Ñ6ˆØ�u‰}˜uÑ$Ð$r(   N©
rN   rO   rP   Ú	_argnamesrÀ   rV   rR   r5   rW   rB   rL   r(   r'   rÂ   rÂ   ñ   sH   „ à1€IàñNó ðNð ñ(ó ð(ð ñ'ó ð'ó%r(   rÂ   c                 ó`   — t        |t        «      rt        |«      }t        | t        |||f«      S )a  
    Creates a random variable with Matrix Gamma Distribution.

    The density of the said distribution can be found at [1].

    Parameters
    ==========

    alpha: Positive Real number
        Shape Parameter
    beta: Positive Real number
        Scale Parameter
    scale_matrix: Positive definite real square matrix
        Scale Matrix

    Returns
    =======

    RandomSymbol

    Examples
    ========

    >>> from sympy.stats import density, MatrixGamma
    >>> from sympy import MatrixSymbol, symbols
    >>> a, b = symbols('a b', positive=True)
    >>> M = MatrixGamma('M', a, b, [[2, 1], [1, 2]])
    >>> X = MatrixSymbol('X', 2, 2)
    >>> density(M)(X).doit()
    exp(Trace(Matrix([
    [-2/3,  1/3],
    [ 1/3, -2/3]])*X)/b)*Determinant(X)**(a - 3/2)/(3**a*sqrt(pi)*b**(2*a)*gamma(a)*gamma(a - 1/2))
    >>> density(M)([[1, 0], [0, 1]]).doit()
    exp(-4/(3*b))/(3**a*sqrt(pi)*b**(2*a)*gamma(a)*gamma(a - 1/2))


    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Matrix_gamma_distribution

    )r@   rT   r   r[   rÂ   )r4   rÄ   rÅ   rk   s       r'   ÚMatrixGammará     s0   € ôV �,¤Ô%Ü& |Ó4ˆÜˆfÔ-°°t¸\Ð/JÓKÐKr(   c                   óF   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zd„ Z	y)rz   ©rj   rk   c                 ó¨   — t        |t        «      st        |j                  d«       t        |j                  d«       t        | j
                  d«       y )NrÇ   rÈ   rÉ   rÊ   rã   s     r'   rV   zWishartDistribution.checkL  sE   € ä˜,¬Ô5Ü˜×:Ñ:ð =4ô 5ä�\×+Ñ+ð .ô 	ä�Q—]‘]Ð$IÕJr(   c                 ój   — | j                   j                  d   }t        ||t        j                  «      S r1   rÏ   rÑ   s     r'   r5   zWishartDistribution.setU  rÓ   r(   c                 ó.   — | j                   j                  S r3   r}   r-   s    r'   rW   zWishartDistribution.dimensionZ  rÕ   r(   c                 ó   — | j                   | j                  }}|j                  d   }t        |t        «      rt        |«      }t        |t        t        f«      st        dt        |«      z  «      ‚t        |«       |z  t        d«      z  }t        t        |«      «      d||z  t        d«      z  z  t        |t        d«      z  |«      z  z  }t        |«      | t        d«      z  z  }t        |«      t        ||z
  dz
  «      dz  z  }||z  |z  S )Nr   r×   r8   r*   )rj   rk   r~   r@   rT   r   r   r   r    r½   r   r   r   r   r   r   )	r.   rØ   rj   rk   rÙ   rÚ   rÛ   rÜ   rÝ   s	            r'   rB   zWishartDistribution.pdf^  sÿ   € ØŸ&™& $×"3Ñ"3ˆ<ˆØ×Ñ˜qÑ!ˆÜ�aœÔÜ Ó"ˆAÜ˜!œj¬,Ð7Ô8Üð &Ü(+¨A«ñ/ó 0ð 0ä Ó-Ð-¨aÑ/´!°A³$Ñ6ˆÜ”E˜+Ó&Ó'¨!¨a°©c´!°A³$©h©-¼:ÀaÌÈ!ËÁfÈaÓ;PÑ)PÑQˆÜ˜\Ó*¨q¨b´°1³©gÑ6ˆÜ˜Q“¤1 Q¨¡U¨Q¡Y£<°¡>Ñ2ˆØ�u‰}˜uÑ$Ð$r(   NrÞ   rL   r(   r'   rz   rz   H  sH   „ à%€IàñKó ðKð ñ(ó ð(ð ñ'ó ð'ó%r(   rz   c                 ó^   — t        |t        «      rt        |«      }t        | t        ||f«      S )aÉ  
    Creates a random variable with Wishart Distribution.

    The density of the said distribution can be found at [1].

    Parameters
    ==========

    n: Positive Real number
        Represents degrees of freedom
    scale_matrix: Positive definite real square matrix
        Scale Matrix

    Returns
    =======

    RandomSymbol

    Examples
    ========

    >>> from sympy.stats import density, Wishart
    >>> from sympy import MatrixSymbol, symbols
    >>> n = symbols('n', positive=True)
    >>> W = Wishart('W', n, [[2, 1], [1, 2]])
    >>> X = MatrixSymbol('X', 2, 2)
    >>> density(W)(X).doit()
    exp(Trace(Matrix([
    [-1/3,  1/6],
    [ 1/6, -1/3]])*X))*Determinant(X)**(n/2 - 3/2)/(2**n*3**(n/2)*sqrt(pi)*gamma(n/2)*gamma(n/2 - 1/2))
    >>> density(W)([[1, 0], [0, 1]]).doit()
    exp(-2/3)/(2**n*3**(n/2)*sqrt(pi)*gamma(n/2)*gamma(n/2 - 1/2))

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Wishart_distribution

    )r@   rT   r   r[   rz   )r4   rj   rk   s      r'   ÚWishartré   l  s.   € ôP �,¤Ô%Ü& |Ó4ˆÜˆfÔ)¨A¨|Ð+<Ó=Ð=r(   c                   óF   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zd„ Z	y)r{   )rv   rw   rx   c           	      ó   — t        |t        «      st        |j                  d«       t        |t        «      st        |j                  d«       t        |j                  d«       t        |j                  d«       | j
                  d   }| j
                  d   }t        |j
                  d   |k(  dt        |«      ›dt        |«      ›�«       t        |j
                  d   |k(  dt        |«      ›dt        |«      ›�«       y )	NrÇ   ú)Scale matrix 1 should be be square matrixú)Scale matrix 2 should be be square matrixr   r*   ú"Scale matrix 1 should be of shape ú x ú"Scale matrix 2 should be of shape )r@   r   r   rË   rÌ   r~   r½   )rv   rw   rx   rj   rÙ   s        r'   rV   zMatrixNormalDistribution.checkŸ  sâ   € ä˜.¬,Ô7Ü˜×<Ñ<ð ?4ô 5ä˜.¬,Ô7Ü˜×<Ñ<ð ?4ô 5ä�^×-Ñ-ð 0ô 	ä�^×-Ñ-ð 0ô 	à×!Ñ! !Ñ$ˆØ×!Ñ! !Ñ$ˆÜ�^×)Ñ)¨!Ñ,°Ò1Ü! !�f¤c¨!¤fð4.ô 	/ä�^×)Ñ)¨!Ñ,°Ò1Ü! !�f¤c¨!¤fð4.õ 	/r(   c                 ój   — | j                   j                  \  }}t        ||t        j                  «      S r3   ©rv   r~   r   r   rÐ   ©r.   rj   rÙ   s      r'   r5   zMatrixNormalDistribution.set²  ó*   € à×#Ñ#×)Ñ)‰ˆˆ1Ü˜˜AœqŸw™wÓ'Ð'r(   c                 ó.   — | j                   j                  S r3   r‚   r-   s    r'   rW   z"MatrixNormalDistribution.dimension·  ó   € à×#Ñ#×)Ñ)Ð)r(   c                 ó>  — | j                   | j                  | j                  }}}|j                  \  }}t	        |t
        «      rt        |«      }t	        |t        t        f«      st        dt        |«      z  «      ‚t        |«      t        ||z
  «      z  t        |«      z  ||z
  z  }t        t        |«       t        d«      z  «      }dt         z  t        ||z  «      dz  z  t#        |«      t        |«      dz  z  z  t#        |«      t        |«      dz  z  z  }	||	z  S )Nr×   r8   )rv   rw   rx   r~   r@   rT   r   r   r   r    r½   r   r   r   r   r   r   r   )
r.   rØ   ÚMÚUÚVrj   rÙ   rÛ   ÚnumÚdens
             r'   rB   zMatrixNormalDistribution.pdf»  s  € Ø×&Ñ&¨×(;Ñ(;¸T×=PÑ=Pˆaˆ1ˆØ�w‰w‰ˆˆ1Ü�aœÔÜ Ó"ˆAÜ˜!œj¬,Ð7Ô8Üð &Ü(+¨A«ñ/ó 0ð 0ä˜“
œ9 Q¨¡UÓ+Ñ+¬G°A«JÑ6¸¸A¹Ñ>ˆÜ”5˜“<�-¤ !£Ñ$Ó%ˆØ”‰t”q˜˜1™“v˜a‘xÑ ¤;¨q£>´A°a³D¸±FÑ#;Ñ;¼kÈ!»nÌqÐQRËtÐTUÉvÑ>VÑVˆØ�3‰wˆr(   NrÞ   rL   r(   r'   r{   r{   ›  sF   „ àG€Iàñ/ó ð/ð$ ñ(ó ð(ð ñ*ó ð*ór(   r{   c                 óÐ   — t        |t        «      rt        |«      }t        |t        «      rt        |«      }t        |t        «      rt        |«      }|||f}t        | t        |«      S )a·  
    Creates a random variable with Matrix Normal Distribution.

    The density of the said distribution can be found at [1].

    Parameters
    ==========

    location_matrix: Real ``n x p`` matrix
        Represents degrees of freedom
    scale_matrix_1: Positive definite matrix
        Scale Matrix of shape ``n x n``
    scale_matrix_2: Positive definite matrix
        Scale Matrix of shape ``p x p``

    Returns
    =======

    RandomSymbol

    Examples
    ========

    >>> from sympy import MatrixSymbol
    >>> from sympy.stats import density, MatrixNormal
    >>> M = MatrixNormal('M', [[1, 2]], [1], [[1, 0], [0, 1]])
    >>> X = MatrixSymbol('X', 1, 2)
    >>> density(M)(X).doit()
    exp(-Trace((Matrix([
    [-1],
    [-2]]) + X.T)*(Matrix([[-1, -2]]) + X))/2)/(2*pi)
    >>> density(M)([[3, 4]]).doit()
    exp(-4)/(2*pi)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Matrix_normal_distribution

    )r@   rT   r   r[   r{   )r4   rv   rw   rx   r,   s        r'   rž   rž   È  s]   € ôR �/¤4Ô(Ü)¨/Ó:ˆÜ�.¤$Ô'Ü(¨Ó8ˆÜ�.¤$Ô'Ü(¨Ó8ˆØ˜^¨^Ð<€DÜˆfÔ.°Ó5Ð5r(   c                   óF   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zd„ Z	y)ÚMatrixStudentTDistribution)r¢   rv   rw   rx   c           	      óJ  — t        |t        «      st        |j                  dk7  d«       t        |t        «      st        |j                  dk7  d«       t        |j                  dk7  d«       t        |j                  dk7  d«       |j
                  d   }|j
                  d   }t        |j
                  d   |k(  dt        |«      ›dt        |«      ›�«       t        |j
                  d   |k(  d	t        |«      ›dt        |«      ›�«       t        | j                  dk7  d
«       y )NFrÇ   rì   rí   r   r*   rî   rï   rð   z#Degrees of freedom must be positive)r@   r   r   rË   rÌ   r~   r½   rÍ   )r¢   rv   rw   rx   rj   rÙ   s         r'   rV   z MatrixStudentTDistribution.check  s  € ä˜.¬,Ô7Ü˜×<Ñ<ÀÑEð Hbô cä˜.¬,Ô7Ü˜×<Ñ<ÀÑEð Hbô cä�^×-Ñ-°Ñ6ð 9Bô 	Cä�^×-Ñ-°Ñ6ð 9Bô 	Cà×!Ñ! !Ñ$ˆØ×!Ñ! !Ñ$ˆÜ�^×)Ñ)¨!Ñ,°Ò1ÜJMÈaÍ&ÔRUÐVWÔRXð4Zô 	[ä�^×)Ñ)¨!Ñ,°Ò1ÜJMÈaÍ&ÔRUÐVWÔRXð4Zô 	[ä�R—^‘^ uÑ,Ð.SÕTr(   c                 ój   — | j                   j                  \  }}t        ||t        j                  «      S r3   rò   ró   s      r'   r5   zMatrixStudentTDistribution.set  rô   r(   c                 ó.   — | j                   j                  S r3   r‚   r-   s    r'   rW   z$MatrixStudentTDistribution.dimension  rö   r(   c           	      óŒ  — ddl m} t        |t        «      rt	        |«      }t        |t
        t        f«      st        dt        |«      z  «      ‚| j                  | j                  | j                  | j                  f\  }}}}|j                  \  }}t        ||z   |z   dz
  dz  |«      t        |«      | dz  z  z  t        |«      | dz  z  z  t         ||z  dz  z  t        ||z   dz
  dz  |«      z  z  }	|	t         ||«      t#        |«      ||z
  z  t#        |«      z  t%        ||z
  «      z  z   «      ||z   |z   dz
   dz  z  z  S )Nr   )Úeyer×   r*   r8   )Úsympy.matrices.denser  r@   rT   r   r   r   r    r½   r¢   rv   rw   rx   r~   r   r   r   r   r   )
r.   rØ   r  r¢   rø   ÚOmegaÚSigmarj   rÙ   ÚKs
             r'   rB   zMatrixStudentTDistribution.pdf  sY  € Ý,Ü�aœÔÜ Ó"ˆAÜ˜!œj¬,Ð7Ô8Üð /Ü14°Q³ñ8ó 9ð 9à"Ÿg™g t×';Ñ';¸T×=PÑ=PÐRV×ReÑReÐeÑˆˆAˆu�eØ�w‰w‰ˆˆ1ä˜˜Q™ ™
 Q™¨Ñ)¨1Ó-´¸EÓ0BÀaÀRÈÁTÑ0JÑJÌ[ÐY^ÓM_ÐcdÐbdÐefÑbfÑMgÑgÜ�a˜‘c˜!‘e‰}œz¨2°©6°A©:°q©.¸!Ó<Ñ<ñ>ˆà”K¡ A£¬°«¸¸Q¹Ñ)?ÄÈÃÑ)NÌyÐYZÐ]^ÑY^ÓO_Ñ)_Ñ _Ó`Ø˜‘F˜Q‘J ‘MÐ" 1Ñ$ñ&ñ &ð 	&r(   NrÞ   rL   r(   r'   rÿ   rÿ   ý  sH   „ àM€IàñUó ðUð& ñ(ó ð(ð ñ*ó ð*ó&r(   rÿ   c                 óÒ   — t        |t        «      rt        |«      }t        |t        «      rt        |«      }t        |t        «      rt        |«      }||||f}t        | t        |«      S )a˜  
    Creates a random variable with Matrix Gamma Distribution.

    The density of the said distribution can be found at [1].

    Parameters
    ==========

    nu: Positive Real number
        degrees of freedom
    location_matrix: Positive definite real square matrix
        Location Matrix of shape ``n x p``
    scale_matrix_1: Positive definite real square matrix
        Scale Matrix of shape ``p x p``
    scale_matrix_2: Positive definite real square matrix
        Scale Matrix of shape ``n x n``

    Returns
    =======

    RandomSymbol

    Examples
    ========

    >>> from sympy import MatrixSymbol,symbols
    >>> from sympy.stats import density, MatrixStudentT
    >>> v = symbols('v',positive=True)
    >>> M = MatrixStudentT('M', v, [[1, 2]], [[1, 0], [0, 1]], [1])
    >>> X = MatrixSymbol('X', 1, 2)
    >>> density(M)(X)
    gamma(v/2 + 1)*Determinant((Matrix([[-1, -2]]) + X)*(Matrix([
    [-1],
    [-2]]) + X.T) + Matrix([[1]]))**(-v/2 - 1)/(pi**1.0*gamma(v/2)*Determinant(Matrix([[1]]))**1.0*Determinant(Matrix([
    [1, 0],
    [0, 1]]))**0.5)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Matrix_t-distribution

    )r@   rT   r   r[   rÿ   )r4   r¢   rv   rw   rx   r,   s         r'   ÚMatrixStudentTr
  /  s_   € ôX �/¤4Ô(Ü)¨/Ó:ˆÜ�.¤$Ô'Ü(¨Ó8ˆÜ�.¤$Ô'Ü(¨Ó8ˆØ� °Ð@€DÜˆfÔ0°$Ó7Ð7r(   N)2Úmathr   Úsympy.core.basicr   Úsympy.core.numbersr   Úsympy.core.singletonr   Ú&sympy.functions.elementary.exponentialr   Ú'sympy.functions.special.gamma_functionsr   Úsympy.core.sympifyr	   r
   Úsympy.matricesr   r   r   r   r   r   r   r   r   Úsympy.stats.rvr   r   r   r   r   r   r   Úsympy.externalr   r   r[   r]   r‘   r—   r¾   r¶   rÂ   rá   rz   ré   r{   rž   rÿ   r
  rL   r(   r'   ú<module>r     sí   ðÝ å "Ý !Ý "Ý 6Ý >ß 0÷*÷ *õ *÷K÷ Kñ Kå (ô)X�6ô )XòX÷#Pñ #P÷LPñ P÷>&Qñ &QðR ØØØñ	Ð ô'˜ ~ô 'ô`#%Ð0ô #%òJ-Lôd"%Ð,ô "%òH*>ô^+Ð1ô +òZ06ôj.&Ð!3ô .&ód38r(   