U
    ZÊ¹jÁU  ã                   @   sz  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„ deƒZ#dd„ Z$G dd„ dƒZ%G dd„ dƒZ&G dd„ dƒZ'e%e'e'e&dœZ(G dd„ de eƒZ)G dd„ de)ƒZ*dd„ Z+G dd„ de)ƒZ,dd„ Z-G d d!„ d!e)ƒZ.d"d#„ Z/G d$d%„ d%e)ƒZ0d&d'„ Z1d(S ))é    )Ú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                   @   sf   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZ	edd„ ƒZ
dd„ Zddd„ZdS )ÚMatrixPSpacezD
    Represents probability space for
    Matrix Distributions.
    c                 C   s@   t |ƒ}t|ƒt|ƒ }}|jr&|js.tdƒ‚t | ||||¡S )NzDimensions should be integers)r   r	   Ú
is_integerÚ
ValueErrorr   Ú__new__)ÚclsÚsymÚdistributionZdim_nZdim_m© r"   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/stats/matrix_distributions.pyr      s
    zMatrixPSpace.__new__c                 C   s
   | j d S )Né   ©Úargs©Úselfr"   r"   r#   Ú<lambda>    ó    zMatrixPSpace.<lambda>c                 C   s
   | j d S ©Nr   r%   r'   r"   r"   r#   r)   !   r*   c                 C   s   t | j| jjƒS ©N)r   Úsymbolr!   Úsetr'   r"   r"   r#   Údomain#   s    zMatrixPSpace.domainc                 C   s   t | j| jd | jd | ƒS )Né   é   )r   r-   r&   r'   r"   r"   r#   Úvalue'   s    zMatrixPSpace.valuec                 C   s   | j hS r,   )r2   r'   r"   r"   r#   Úvalues+   s    zMatrixPSpace.valuesc                 G   s4   |  t¡}t|ƒdks t|tƒs(tdƒ‚| j |¡S )Nr$   ztCurrently, no algorithm has been implemented to handle general expressions containing multiple matrix distributions.)Zatomsr   ÚlenÚ
isinstanceÚNotImplementedErrorr!   Úpdf)r(   Úexprr&   Zrmsr"   r"   r#   Úcompute_density/   s    
zMatrixPSpace.compute_densityr"   ÚscipyNc                 C   s   | j | jj|||d�iS )zu
        Internal sample method

        Returns dictionary mapping RandomMatrixSymbol to realization value.
        )ÚlibraryÚseed)r2   r!   Úsample)r(   Úsizer;   r<   r"   r"   r#   r=   7   s    zMatrixPSpace.sample)r"   r:   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr!   r-   r/   r2   r3   r9   r=   r"   r"   r"   r#   r      s   


r   c                 C   sB   t tt|ƒƒ}||Ž }|j|Ž  |j}t| ||d |d ƒ}|jS )Nr   r$   )ÚlistÚmapr   ÚcheckÚ	dimensionr   r2   )r-   r   r&   ÚdistÚdimZpspacer"   r"   r#   Úrv@   s    
rJ   c                   @   s&   e Zd ZdZddd„Zedd„ ƒZdS )ÚSampleMatrixScipyz7Returns the sample from scipy of the given distributionNc                 C   s   |   |||¡S r,   )Ú_sample_scipy©r   rH   r>   r<   r"   r"   r#   r   K   s    zSampleMatrixScipy.__new__c           
         s°   ddl m‰  ddl}‡ fdd„‡ fdd„dœ}dd„ d	d„ dœ}| ¡ }|jj|krXdS |dksjt|tƒrz|jj	|d
�}n|}||jj |t
|ƒ|ƒ}	|	 |||jj |ƒ ¡S )zSample from SciPy.r   )ÚstatsNc                    s    ˆ j jt| jƒt| jtƒ|d�S )N)ZdfÚscaler>   )ZwishartÚrvsÚintÚnr   Úscale_matrixÚfloat©rH   r>   Ú
rand_state©Zscipy_statsr"   r#   r)   U   s    
 ÿz1SampleMatrixScipy._sample_scipy.<locals>.<lambda>c                    s.   ˆ j jt| jtƒt| jtƒt| jtƒ||d�S )N)ZmeanÚrowcovÚcolcovr>   Zrandom_state)Zmatrix_normalrP   r   Úlocation_matrixrT   Úscale_matrix_1Úscale_matrix_2rU   rW   r"   r#   r)   W   s   


  ý©ÚWishartDistributionÚMatrixNormalDistributionc                 S   s   | j jS r,   ©rS   Úshape©rH   r"   r"   r#   r)   ^   r*   c                 S   s   | j jS r,   ©rZ   ra   rb   r"   r"   r#   r)   _   r*   ©r<   )r:   rN   ÚnumpyÚkeysÚ	__class__r?   r5   rQ   ÚrandomÚdefault_rngr   Úreshape)
r   rH   r>   r<   re   Zscipy_rv_mapÚsample_shapeÚ	dist_listrV   Úsampr"   rW   r#   rL   N   s     

ý
þzSampleMatrixScipy._sample_scipy)N)r?   r@   rA   rB   r   ÚclassmethodrL   r"   r"   r"   r#   rK   I   s   
rK   c                   @   s&   e Zd ZdZddd„Zedd„ ƒZdS )ÚSampleMatrixNumpyz7Returns the sample from numpy of the given distributionNc                 C   s   |   |||¡S r,   )Ú_sample_numpyrM   r"   r"   r#   r   s   s    zSampleMatrixNumpy.__new__c           
      C   s€   i }i }|  ¡ }|jj|kr dS ddl}|dks:t|tƒrJ|jj|d�}n|}||jj |t|ƒ|ƒ}	|	 	|||jj |ƒ ¡S )zSample from NumPy.Nr   rd   )
rf   rg   r?   re   r5   rQ   rh   ri   r   rj   )
r   rH   r>   r<   Znumpy_rv_maprk   rl   re   rV   rm   r"   r"   r#   rp   v   s    zSampleMatrixNumpy._sample_numpy)N)r?   r@   rA   rB   r   rn   rp   r"   r"   r"   r#   ro   o   s   
ro   c                   @   s&   e Zd ZdZddd„Zedd„ ƒZdS )ÚSampleMatrixPymcz6Returns the sample from pymc of the given distributionNc                 C   s   |   |||¡S r,   )Ú_sample_pymcrM   r"   r"   r#   r   ‘   s    zSampleMatrixPymc.__new__c           	   	      sä   zddl ‰ W n tk
r(   ddl‰ Y nX ‡ fdd„‡ fdd„dœ}dd„ dd„ d	œ}| ¡ }|jj|krndS ddl}| d
¡ |j	¡ ˆ  
¡ �4 ||jj |ƒ ˆ jt|ƒdd|ddd�d }W 5 Q R X | |||jj |ƒ ¡S )zSample from PyMC.r   Nc                    s0   ˆ j dt| jtƒt| jtƒt| jtƒ| jjd�S )NÚX)ÚmurX   rY   ra   )ÚMatrixNormalr   rZ   rT   r[   r\   ra   rb   ©Úpymcr"   r#   r)   �   s
   


üz/SampleMatrixPymc._sample_pymc.<locals>.<lambda>c                    s   ˆ j dt| jƒt| jtƒd�S )Nrs   )Únur   )ZWishartBartlettrQ   rR   r   rS   rT   rb   rv   r"   r#   r)   ¢   s    
ÿ)r_   r^   c                 S   s   | j jS r,   r`   rb   r"   r"   r#   r)   §   r*   c                 S   s   | j jS r,   rc   rb   r"   r"   r#   r)   ¨   r*   r]   rw   r$   F)ZdrawsÚchainsZprogressbarZrandom_seedZreturn_inferencedataZcompute_convergence_checksrs   )rw   ÚImportErrorÚpymc3rf   rg   r?   ÚloggingÚ	getLoggerÚsetLevelÚERRORZModelr=   r   rj   )	r   rH   r>   r<   Zpymc_rv_maprk   rl   r|   Úsampsr"   rv   r#   rr   ”   s&    

úþ
(zSampleMatrixPymc._sample_pymc)N)r?   r@   rA   rB   r   rn   rr   r"   r"   r"   r#   rq   Ž   s   
rq   )r:   r{   rw   re   c                   @   s6   e Zd ZdZdd„ Zedd„ ƒZdd„ Zddd„Zd
S )ÚMatrixDistributionz1
    Abstract class for Matrix Distribution.
    c                 G   s   dd„ |D ƒ}t j| f|žŽ S )Nc                 S   s&   g | ]}t |tƒrt|ƒnt|ƒ‘qS r"   )r5   rD   r
   r	   )Ú.0Úargr"   r"   r#   Ú
<listcomp>Æ   s   ÿz.MatrixDistribution.__new__.<locals>.<listcomp>)r   r   )r   r&   r"   r"   r#   r   Å   s    ÿzMatrixDistribution.__new__c                  G   s   d S r,   r"   r%   r"   r"   r#   rF   Ê   s    zMatrixDistribution.checkc                 C   s   t |tƒrt|ƒ}|  |¡S r,   )r5   rD   r
   r7   )r(   r8   r"   r"   r#   Ú__call__Î   s    
zMatrixDistribution.__call__r"   r:   Nc                 C   sl   ddddg}||kr$t dt|ƒ ƒ‚t|ƒs8td| ƒ‚t| | ||ƒ}|dk	rT|S t d| jj|f ƒ‚dS )	zo
        Internal sample method

        Returns dictionary mapping RandomSymbol to realization value.
        r:   re   r{   rw   z&Sampling from %s is not supported yet.zFailed to import %sNz4Sampling for %s is not currently implemented from %s)r6   Ústrr   r   Ú_get_sample_class_matrixrvrg   r?   )r(   r>   r;   r<   Ú	librariesr€   r"   r"   r#   r=   Ó   s    ÿ
ÿÿzMatrixDistribution.sample)r"   r:   N)	r?   r@   rA   rB   r   ÚstaticmethodrF   r…   r=   r"   r"   r"   r#   r�   Á   s   
r�   c                   @   s<   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdd	„ Z	d
S )ÚMatrixGammaDistribution©ÚalphaÚbetarS   c                 C   s>   t |tƒst|jdƒ t|jdƒ t| jdƒ t|jdƒ d S )Nú+The shape matrix must be positive definite.úShould be square matrixú#Shape parameter should be positive.z#Scale parameter should be positive.©r5   r   r   Úis_positive_definiteÚ	is_squareÚis_positiver‹   r"   r"   r#   rF   õ   s
    
zMatrixGammaDistribution.checkc                 C   s   | j jd }t||tjƒS r+   ©rS   ra   r   r   ÚReals©r(   Úkr"   r"   r#   r.   ÿ   s    zMatrixGammaDistribution.setc                 C   s   | j jS r,   r`   r'   r"   r"   r#   rG     s    z!MatrixGammaDistribution.dimensionc           
      C   sº   | j | j| j  }}}|jd }t|tƒr2t|ƒ}t|ttfƒsPt	dt
|ƒ ƒ‚t|ƒ | | }tt|ƒƒ|||  t||ƒ  }t|ƒ|  }t|ƒ|t|d ƒd   }	|| |	 S )Nr   ú4%s should be an isinstance of Matrix or MatrixSymbolr$   r0   )rŒ   r�   rS   ra   r5   rD   r
   r   r   r   r†   r   r   r   r   r   r   )
r(   ÚxrŒ   r�   rS   ÚpÚsigma_inv_xÚterm1Úterm2Úterm3r"   r"   r#   r7     s    

ÿ"zMatrixGammaDistribution.pdfN©
r?   r@   rA   Z	_argnamesr‰   rF   rC   r.   rG   r7   r"   r"   r"   r#   rŠ   ñ   s   
	

rŠ   c                 C   s$   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

    )r5   rD   r
   rJ   rŠ   )r-   rŒ   r�   rS   r"   r"   r#   ÚMatrixGamma  s    +
r¡   c                   @   s<   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdd	„ Z	d
S )r^   ©rR   rS   c                 C   s2   t |tƒst|jdƒ t|jdƒ t| jdƒ d S )NrŽ   r�   r�   r‘   r¢   r"   r"   r#   rF   L  s    
zWishartDistribution.checkc                 C   s   | j jd }t||tjƒS r+   r•   r—   r"   r"   r#   r.   U  s    zWishartDistribution.setc                 C   s   | j jS r,   r`   r'   r"   r"   r#   rG   Z  s    zWishartDistribution.dimensionc           	      C   sÎ   | j | j }}|jd }t|tƒr*t|ƒ}t|ttfƒsHtdt	|ƒ ƒ‚t
|ƒ | tdƒ }tt|ƒƒd|| tdƒ  t|tdƒ |ƒ  }t|ƒ| tdƒ  }t|ƒt|| d ƒd  }|| | S )Nr   r™   r0   r$   )rR   rS   ra   r5   rD   r
   r   r   r   r†   r   r   r   r   r   r   )	r(   rš   rR   rS   r›   rœ   r�   rž   rŸ   r"   r"   r#   r7   ^  s    

ÿ2zWishartDistribution.pdfNr    r"   r"   r"   r#   r^   H  s   


r^   c                 C   s"   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

    )r5   rD   r
   rJ   r^   )r-   rR   rS   r"   r"   r#   ÚWishartl  s    (
r£   c                   @   s<   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdd	„ Z	d
S )r_   )rZ   r[   r\   c                 C   s¤   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|ƒt|ƒf ƒ t|jd |kdt|ƒt|ƒf ƒ d S )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 %s x %sú)Scale matrix 2 should be of shape %s x %s)r5   r   r   r’   r“   ra   r†   )rZ   r[   r\   rR   r›   r"   r"   r#   rF   Ÿ  s    



ÿÿzMatrixNormalDistribution.checkc                 C   s   | j j\}}t||tjƒS r,   ©rZ   ra   r   r   r–   ©r(   rR   r›   r"   r"   r#   r.   ²  s    zMatrixNormalDistribution.setc                 C   s   | j jS r,   rc   r'   r"   r"   r#   rG   ·  s    z"MatrixNormalDistribution.dimensionc           
      C   sÒ   | j | j| j  }}}|j\}}t|tƒr2t|ƒ}t|ttfƒsPt	dt
|ƒ ƒ‚t|ƒt|| ƒ t|ƒ ||  }tt|ƒ tdƒ ƒ}dt t|| ƒd  t|ƒt|ƒd   t|ƒt|ƒd   }	||	 S )Nr™   r0   )rZ   r[   r\   ra   r5   rD   r
   r   r   r   r†   r   r   r   r   r   r   r   )
r(   rš   ÚMÚUÚVrR   r›   r�   ÚnumZdenr"   r"   r#   r7   »  s    

ÿ$@zMatrixNormalDistribution.pdfNr    r"   r"   r"   r#   r_   ›  s   


r_   c                 C   sL   t |tƒrt|ƒ}t |tƒr$t|ƒ}t |tƒr6t|ƒ}|||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

    )r5   rD   r
   rJ   r_   )r-   rZ   r[   r\   r&   r"   r"   r#   ru   È  s    )



ru   c                   @   s<   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdd	„ Z	d
S )ÚMatrixStudentTDistribution)rx   rZ   r[   r\   c                 C   sÄ   t |tƒst|jdkdƒ t |tƒs4t|jdkdƒ t|jdkdƒ t|jdkdƒ |jd }|jd }t|jd |kdt|ƒt|ƒf ƒ t|jd |kdt|ƒt|ƒf ƒ t| jdkd	ƒ d S )
NFrŽ   r¤   r¥   r   r$   r¦   r§   z#Degrees of freedom must be positive)r5   r   r   r’   r“   ra   r†   r”   )rx   rZ   r[   r\   rR   r›   r"   r"   r#   rF     s    



ÿÿz MatrixStudentTDistribution.checkc                 C   s   | j j\}}t||tjƒS r,   r¨   r©   r"   r"   r#   r.     s    zMatrixStudentTDistribution.setc                 C   s   | j jS r,   rc   r'   r"   r"   r#   rG     s    z$MatrixStudentTDistribution.dimensionc           
      C   s  ddl m} t|tƒrt|ƒ}t|ttfƒs<tdt|ƒ ƒ‚| j	| j
| j| jf\}}}}|j\}}t|| | d d |ƒt|ƒ| d   t|ƒ| d   t|| d  t|| d d |ƒ  }	|	t||ƒt|ƒ||  t|ƒ t|| ƒ  ƒ|| | d  d   S )Nr   )Úeyer™   r$   r0   )Zsympy.matrices.denser¯   r5   rD   r
   r   r   r   r†   rx   rZ   r[   r\   ra   r   r   r   r   r   )
r(   rš   r¯   rx   rª   ÚOmegaÚSigmarR   r›   ÚKr"   r"   r#   r7     s    
ÿ
<$ÿ0ÿzMatrixStudentTDistribution.pdfNr    r"   r"   r"   r#   r®   ý  s   


r®   c                 C   sN   t |tƒrt|ƒ}t |tƒr$t|ƒ}t |tƒr6t|ƒ}||||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

    )r5   rD   r
   rJ   r®   )r-   rx   rZ   r[   r\   r&   r"   r"   r#   ÚMatrixStudentT/  s    ,


r³   N)2Úmathr   Zsympy.core.basicr   Zsympy.core.numbersr   Zsympy.core.singletonr   Z&sympy.functions.elementary.exponentialr   Z'sympy.functions.special.gamma_functionsr   Zsympy.core.sympifyr   r	   Zsympy.matricesr
   r   r   r   r   r   r   r   r   Zsympy.stats.rvr   r   r   r   r   r   r   Zsympy.externalr   r   rJ   rK   ro   rq   r‡   r�   rŠ   r¡   r^   r£   r_   ru   r®   r³   r"   r"   r"   r#   Ú<module>   s8   ,$,	&)ü0%2$/-52