U
    ZÊ¹jÒ(  ã                   @   sÞ   d dl 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 d dlmZ d dlmZmZmZ G dd„ deeƒZG dd„ deeƒZG dd„ deeƒZdS )é    N)ÚAdd)ÚExpr)Úexpand)ÚMul)ÚS)Ú
ShapeError)Ú
MatrixExpr)ÚMatMul)Ú
ZeroMatrix)ÚRandomSymbolÚ	is_random)Ú_sympify)ÚVarianceÚ
CovarianceÚExpectationc                   @   s.   e Zd ZdZd	dd„Zedd„ ƒZdd„ ZdS )
ÚExpectationMatrixa0  
    Expectation of a random matrix expression.

    Examples
    ========

    >>> from sympy.stats import ExpectationMatrix, Normal
    >>> from sympy.stats.rv import RandomMatrixSymbol
    >>> from sympy import symbols, MatrixSymbol, Matrix
    >>> k = symbols("k")
    >>> A, B = MatrixSymbol("A", k, k), MatrixSymbol("B", k, k)
    >>> X, Y = RandomMatrixSymbol("X", k, 1), RandomMatrixSymbol("Y", k, 1)
    >>> ExpectationMatrix(X)
    ExpectationMatrix(X)
    >>> ExpectationMatrix(A*X).shape
    (k, 1)

    To expand the expectation in its expression, use ``expand()``:

    >>> ExpectationMatrix(A*X + B*Y).expand()
    A*ExpectationMatrix(X) + B*ExpectationMatrix(Y)
    >>> ExpectationMatrix((X + Y)*(X - Y).T).expand()
    ExpectationMatrix(X*X.T) - ExpectationMatrix(X*Y.T) + ExpectationMatrix(Y*X.T) - ExpectationMatrix(Y*Y.T)

    To evaluate the ``ExpectationMatrix``, use ``doit()``:

    >>> N11, N12 = Normal('N11', 11, 1), Normal('N12', 12, 1)
    >>> N21, N22 = Normal('N21', 21, 1), Normal('N22', 22, 1)
    >>> M11, M12 = Normal('M11', 1, 1), Normal('M12', 2, 1)
    >>> M21, M22 = Normal('M21', 3, 1), Normal('M22', 4, 1)
    >>> x1 = Matrix([[N11, N12], [N21, N22]])
    >>> x2 = Matrix([[M11, M12], [M21, M22]])
    >>> ExpectationMatrix(x1 + x2).doit()
    Matrix([
    [12, 14],
    [24, 26]])

    Nc                 C   sR   t |ƒ}|d kr*t|ƒs|S t | |¡}nt |ƒ}t | ||¡}|j|_||_|S ©N)r   r   r   Ú__new__ÚshapeÚ_shapeÚ
_condition)ÚclsÚexprÚ	conditionÚobj© r   úl/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/stats/symbolic_multivariate_probability.pyr   8   s    zExpectationMatrix.__new__c                 C   s   | j S r   ©r   ©Úselfr   r   r   r   F   s    zExpectationMatrix.shapec                    s  | j d }| j‰ t|ƒs|S t|tƒr@t ‡ fdd„|j D ƒ¡S t|ƒ}t|tƒrlt ‡ fdd„|j D ƒ¡S t|ttfƒ�rg }g }g }|j D ]R}t|ƒrÄ|rª| 	|¡ n
| 	|¡ g }| 
|¡ qŽ|jrÖ| 
|¡ qŽ| 
|¡ qŽt|ƒdkrò| S t |¡tt |¡ˆ d� t |¡ S | S )Nr   c                 3   s   | ]}t |ˆ d � ¡ V  qdS ©©r   N©r   r   ©Ú.0Úar!   r   r   Ú	<genexpr>Q   s   ÿz+ExpectationMatrix.expand.<locals>.<genexpr>c                 3   s   | ]}t |ˆ d � ¡ V  qdS r    r"   r#   r!   r   r   r&   V   s   ÿr!   )Úargsr   r   Ú
isinstancer   ÚfromiterÚ_expandr   r	   ÚextendÚappendZ	is_MatrixÚlenr   )r   Úhintsr   Zexpand_exprÚrvÚnonrvZpostnonr%   r   r!   r   r   J   sF    

ÿ
ÿ

ÿÿzExpectationMatrix.expand)N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r   r   r   r   r      s
   &

r   c                   @   s.   e Zd ZdZd	dd„Zedd„ ƒZdd„ ZdS )
ÚVarianceMatrixak  
    Variance of a random matrix probability expression. Also known as
    Covariance matrix, auto-covariance matrix, dispersion matrix,
    or variance-covariance matrix.

    Examples
    ========

    >>> from sympy.stats import VarianceMatrix
    >>> from sympy.stats.rv import RandomMatrixSymbol
    >>> from sympy import symbols, MatrixSymbol
    >>> k = symbols("k")
    >>> A, B = MatrixSymbol("A", k, k), MatrixSymbol("B", k, k)
    >>> X, Y = RandomMatrixSymbol("X", k, 1), RandomMatrixSymbol("Y", k, 1)
    >>> VarianceMatrix(X)
    VarianceMatrix(X)
    >>> VarianceMatrix(X).shape
    (k, k)

    To expand the variance in its expression, use ``expand()``:

    >>> VarianceMatrix(A*X).expand()
    A*VarianceMatrix(X)*A.T
    >>> VarianceMatrix(A*X + B*Y).expand()
    2*A*CrossCovarianceMatrix(X, Y)*B.T + A*VarianceMatrix(X)*A.T + B*VarianceMatrix(Y)*B.T
    Nc                 C   s€   t |ƒ}d|jkrtdƒ‚|jd dkr<|jd |jd fn|jd |jd f}|rdt | ||¡}nt | |¡}||_||_|S )Né   úExpression is not a vectorr   ©r   r   r   r   r   r   r   )r   Úargr   r   r   r   r   r   r   �   s    
6zVarianceMatrix.__new__c                 C   s   | j S r   r   r   r   r   r   r       s    zVarianceMatrix.shapec           	         sD  | j d }| j‰ t|ƒs"t| jŽ S t|tƒr0| S t|tƒrœg }|j D ]}t|ƒrD| |¡ qDt‡ fdd„|D ƒŽ }‡ fdd„}tt	|t
 |d¡ƒŽ }|| S t|ttfƒ�r@g }g }|j D ]"}t|ƒrÒ| |¡ qº| |¡ qºt|ƒdkrôt| jŽ S t|ƒdk�r| S t|ƒdk�r| S t |¡tt |¡ˆ ƒ t |¡ ¡  S | S )Nr   c                 3   s   | ]}t |ˆ ƒ ¡ V  qd S r   )r   r   )r$   Zxvr!   r   r   r&   ²   s     z(VarianceMatrix.expand.<locals>.<genexpr>c                    s   dt | dˆ iŽ ¡  S )Né   r   )r   r   )Úxr!   r   r   Ú<lambda>³   ó    z'VarianceMatrix.expand.<locals>.<lambda>r<   r8   )r'   r   r   r
   r   r(   r   r   r,   ÚmapÚ	itertoolsÚcombinationsr   r	   r-   r)   r   Ú	transpose)	r   r.   r;   r/   r%   Z	variancesZmap_to_covarZcovariancesr0   r   r!   r   r   ¤   sD    






ÿÿzVarianceMatrix.expand)Nr1   r   r   r   r   r7   t   s
   

r7   c                   @   sF   e Zd ZdZddd„Zedd„ ƒZdd„ Zed	d
„ ƒZ	edd„ ƒZ
dS )ÚCrossCovarianceMatrixaÈ  
    Covariance of a random matrix probability expression.

    Examples
    ========

    >>> from sympy.stats import CrossCovarianceMatrix
    >>> from sympy.stats.rv import RandomMatrixSymbol
    >>> from sympy import symbols, MatrixSymbol
    >>> k = symbols("k")
    >>> A, B = MatrixSymbol("A", k, k), MatrixSymbol("B", k, k)
    >>> C, D = MatrixSymbol("C", k, k), MatrixSymbol("D", k, k)
    >>> X, Y = RandomMatrixSymbol("X", k, 1), RandomMatrixSymbol("Y", k, 1)
    >>> Z, W = RandomMatrixSymbol("Z", k, 1), RandomMatrixSymbol("W", k, 1)
    >>> CrossCovarianceMatrix(X, Y)
    CrossCovarianceMatrix(X, Y)
    >>> CrossCovarianceMatrix(X, Y).shape
    (k, k)

    To expand the covariance in its expression, use ``expand()``:

    >>> CrossCovarianceMatrix(X + Y, Z).expand()
    CrossCovarianceMatrix(X, Z) + CrossCovarianceMatrix(Y, Z)
    >>> CrossCovarianceMatrix(A*X, Y).expand()
    A*CrossCovarianceMatrix(X, Y)
    >>> CrossCovarianceMatrix(A*X, B.T*Y).expand()
    A*CrossCovarianceMatrix(X, Y)*B
    >>> CrossCovarianceMatrix(A*X + B*Y, C.T*Z + D.T*W).expand()
    A*CrossCovarianceMatrix(X, W)*D + A*CrossCovarianceMatrix(X, Z)*C + B*CrossCovarianceMatrix(Y, W)*D + B*CrossCovarianceMatrix(Y, Z)*C

    Nc                 C   s¨   t |ƒ}t |ƒ}d|jks8d|jks8|jd |jd kr@tdƒ‚|jd dkrp|jd dkrp|jd |jd fnd}|rŠt | |||¡}nt | ||¡}||_||_|S )Nr8   r9   r   )r8   r8   r:   )r   Úarg1Úarg2r   r   r   r   r   r   r   ì   s    (0ÿzCrossCovarianceMatrix.__new__c                 C   s   | j S r   r   r   r   r   r   r   ÿ   s    zCrossCovarianceMatrix.shapec                    s¤   | j d }| j d }| j‰||kr0t|ˆƒ ¡ S t|ƒr@t|ƒsJt| jŽ S t|tƒrjt|tƒrjt	||ˆƒS |  
| ¡ ¡}|  
| ¡ ¡‰ ‡ ‡fdd„|D ƒ}t |¡S )Nr   r8   c              	      s8   g | ]0\}}ˆ D ]"\}}|t ||ˆd � | ¡  ‘qqS )r!   )rD   rC   )r$   r%   Úr1ÚbÚr2©Zcoeff_rv_list2r   r   r   Ú
<listcomp>  s     ÿz0CrossCovarianceMatrix.expand.<locals>.<listcomp>)r'   r   r7   r   r   r
   r   r(   r   rD   Ú_expand_single_argumentr   r)   )r   r.   rE   rF   Zcoeff_rv_list1Zaddendsr   rJ   r   r     s    


ÿzCrossCovarianceMatrix.expandc                 C   sž   t |tƒrtj|fgS t |tƒrlg }|jD ]<}t |ttfƒrN| |  	|¡¡ q*t
|ƒr*| tj|f¡ q*|S t |ttfƒr†|  	|¡gS t
|ƒrštj|fgS d S r   )r(   r   r   ZOner   r'   r   r	   r,   Ú_get_mul_nonrv_rv_tupler   )r   r   Zoutvalr%   r   r   r   rL     s    


z-CrossCovarianceMatrix._expand_single_argumentc                 C   sF   g }g }|j D ]"}t|ƒr&| |¡ q| |¡ qt |¡t |¡fS r   )r'   r   r,   r   r)   )r   Úmr/   r0   r%   r   r   r   rM   +  s    
z-CrossCovarianceMatrix._get_mul_nonrv_rv_tuple)N)r2   r3   r4   r5   r   r6   r   r   ÚclassmethodrL   rM   r   r   r   r   rD   Ì   s   


rD   ) rA   Zsympy.core.addr   Zsympy.core.exprr   Zsympy.core.functionr   r*   Zsympy.core.mulr   Zsympy.core.singletonr   Zsympy.matrices.exceptionsr   Z"sympy.matrices.expressions.matexprr   Z!sympy.matrices.expressions.matmulr	   Z"sympy.matrices.expressions.specialr
   Zsympy.stats.rvr   r   Zsympy.core.sympifyr   Z sympy.stats.symbolic_probabilityr   r   r   r   r7   rD   r   r   r   r   Ú<module>   s   cX