
    g(                        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ee          Z G d dee          Z G d dee          ZdS )    N)Add)Expr)expand)Mul)S)
ShapeError)
MatrixExpr)MatMul)
ZeroMatrix)RandomSymbol	is_random)_sympify)Variance
CovarianceExpectationc                   6    e Zd ZdZddZed             Z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                     t          |          }|'t          |          s|S t          j        | |          }n%t          |          }t          j        | ||          }|j        |_        ||_        |S N)r   r   r   __new__shape_shape
_condition)clsexpr	conditionobjs       i/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/stats/symbolic_multivariate_probability.pyr   zExpectationMatrix.__new__8   sn    ~~T?? ,sD))CC ++I,sD)44CZ
"
    c                     | j         S r   r   selfs    r   r   zExpectationMatrix.shapeF   
    {r   c                    | j         d         }| j        t          |          s|S t          |t                    r%t	          j        fd|j         D                       S t          |          }t          |t                    r%t	          j        fd|j         D                       S t          |t          t          f          rg }g }g }|j         D ]}t          |          rE|r|	                    |           n|	                    |           g }|
                    |           V|j        r|
                    |           s|
                    |           t          |          dk    r| S t          j        |          t          t          j        |                    z  t          j        |          z  S | S )Nr   c              3   ^   K   | ]'}t          |                                           V  (dS r   Nr   r   .0ar   s     r   	<genexpr>z+ExpectationMatrix.expand.<locals>.<genexpr>Q   sP        (  ( !,A C C C J J L L  (  (  (  (  (  (r   c              3   ^   K   | ]'}t          |                                           V  (dS r'   r)   r*   s     r   r-   z+ExpectationMatrix.expand.<locals>.<genexpr>V   sP        /  / !,A C C C J J L L  /  /  /  /  /  /r   r(   )argsr   r   
isinstancer   fromiter_expandr   r
   extendappend	is_Matrixlenr   )	r#   hintsr   expand_exprrvnonrvpostnonr,   r   s	           @r   r   zExpectationMatrix.expandJ   s   y|O	 	KdC   	(<  (  (  (  (!Y (  (  ( ( ( ( dmmk3'' 	?<  /  /  /  /(- /  /  / / / / sFm,, 	?BEGY $ $Q<< 
$ .		'****W--- GIIaLLLL[ $NN1%%%%LLOOOO 5zzQ<&&{3<3C3C'() () () )),g)>)>? ? r   r   __name__
__module____qualname____doc__r   propertyr   r    r   r   r   r      s]        % %L      X( ( ( ( (r   r   c                   6    e Zd ZdZddZed             Z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                 V   t          |          }d|j        vrt          d          |j        d         dk    r|j        d         |j        d         fn|j        d         |j        d         f}|rt          j        | ||          }nt          j        | |          }||_        ||_        |S )N   Expression is not a vectorr   r   r   r   r   r   r   r   )r   argr   r   r   s        r   r   zVarianceMatrix.__new__   s    smmCI9:::03	!0A0A1sy|,,	RSVYV_`aVbGc 	),sC33CC,sC((C
"
r   c                     | j         S r   r!   r"   s    r   r   zVarianceMatrix.shape   r$   r   c           	        	 | j         d         }| j        	t          |          st          | j         S t          |t                    r| S t          |t                    ryg }|j         D ]&}t          |          r|                    |           't          	fd|D              }	fd}t          t          |t          j        |d                     }||z   S t          |t          t          f          rg }g }|j         D ]<}t          |          r|                    |           '|                    |           =t          |          dk    rt          | j         S t          |          dk    r| S t          |          dk    r| S t          j        |          t!          t          j        |          	          z  t          j        |                                          z  S | S )Nr   c              3   \   K   | ]&}t          |                                          V  'd S r   )r   r   )r+   xvr   s     r   r-   z(VarianceMatrix.expand.<locals>.<genexpr>   s9      LL2hr955<<>>LLLLLLr   c                 F    dt          | di                                z  S )N   r   )r   r   )xr   s    r   <lambda>z'VarianceMatrix.expand.<locals>.<lambda>   s%    Qz1'J	'J'J'Q'Q'S'S%S r   rO   rF   )r/   r   r   r   r   r0   r   r   r4   map	itertoolscombinationsr   r
   r6   r1   r   	transpose)
r#   r7   rI   r9   r,   	variancesmap_to_covarcovariancesr:   r   s
            @r   r   zVarianceMatrix.expand   s   ilO	~~ 	+tz**c<(( 	IKS!! 	IBX ! !Q<< !IIaLLLLLLLLLLMISSSSLs<1GA1N1NOOPK{**c6]++ 	IEBX $ $Q<< $IIaLLLLLLOOOO2ww!||!4:..5zzQ2ww{{<&&xR0@0@%(' (' '(+U(;(;'F'F'H'HI I r   r   r<   rB   r   r   rD   rD   t   s\         4   "   X& & & & &r   rD   c                   b    e Zd ZdZddZed             Zd Zed             Z	e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                    t          |          }t          |          }d|j        vs%d|j        vs|j        d         |j        d         k    rt          d          |j        d         dk    r+|j        d         dk    r|j        d         |j        d         fnd}|rt          j        | |||          }nt          j        | ||          }||_        ||_        |S )NrF   rG   r   )rF   rF   rH   )r   arg1arg2r   r   r   s         r   r   zCrossCovarianceMatrix.__new__   s    ~~~~TZQdj%8%8djmtzZ[}>\>\9:::26*Q-12D2DTUZ[I[I[A
1.. 	  	0,sD$	::CC,sD$//C
"
r   c                     | j         S r   r!   r"   s    r   r   zCrossCovarianceMatrix.shape   r$   r   c                 H   | j         d         }| j         d         }| j        ||k    r"t          |                                          S t	          |          rt	          |          st          | j         S t          |t                    r&t          |t                    rt          ||          S | 
                    |                                          }| 
                    |                                          fd|D             }t          j        |          S )Nr   rF   c           	      z    g | ]7\  }}D ]/\  }}|t          ||           z  |                                z  08S )r(   )rZ   rU   )r+   r,   r1br2coeff_rv_list2r   s        r   
<listcomp>z0CrossCovarianceMatrix.expand.<locals>.<listcomp>  sp     P P P2P P5<a *2rYGGGGU P P P Pr   )r/   r   rD   r   r   r   r   r0   r   rZ   _expand_single_argumentr   r1   )r#   r7   r\   r]   coeff_rv_list1addendsrd   r   s         @@r   r   zCrossCovarianceMatrix.expand  s    y|y|O	4<<!$	2299;;; 	+ioo 	+tz**dL)) 	@j|.L.L 	@(tY???55dkkmmDD55dkkmmDDP P P P P"0P P P|G$$$r   c                    t          |t                    rt          j        |fgS t          |t                    rg }|j        D ]w}t          |t          t          f          r)|                    | 	                    |                     Gt          |          r!|                    t          j        |f           x|S t          |t          t          f          r| 	                    |          gS t          |          rt          j        |fgS d S r   )r0   r   r   Oner   r/   r   r
   r4   _get_mul_nonrv_rv_tupler   )r   r   outvalr,   s       r   rf   z-CrossCovarianceMatrix._expand_single_argument  s    dL)) 	#UDM?"c"" 	#FY . .a#v// .MM#"="=a"@"@AAAAq\\ .MM15!*---MsFm,, 	#//5566t__ 	#UDM?"	# 	#r   c                     g }g }|j         D ]<}t          |          r|                    |           '|                    |           =t          j        |          t          j        |          fS r   )r/   r   r4   r   r1   )r   mr9   r:   r,   s        r   rk   z-CrossCovarianceMatrix._get_mul_nonrv_rv_tuple+  sl     	  	 A||  		!QU##S\"%5%566r   r   )r=   r>   r?   r@   r   rA   r   r   classmethodrf   rk   rB   r   r   rZ   rZ      s         >   &   X% % %* # # [#$ 7 7 [7 7 7r   rZ   ) rS   sympy.core.addr   sympy.core.exprr   sympy.core.functionr   r2   sympy.core.mulr   sympy.core.singletonr   sympy.matrices.exceptionsr   "sympy.matrices.expressions.matexprr	   !sympy.matrices.expressions.matmulr
   "sympy.matrices.expressions.specialr   sympy.stats.rvr   r   sympy.core.sympifyr    sympy.stats.symbolic_probabilityr   r   r   r   rD   rZ   rB   r   r   <module>r|      s                         1 1 1 1 1 1       " " " " " " 0 0 0 0 0 0 9 9 9 9 9 9 4 4 4 4 4 4 9 9 9 9 9 9 2 2 2 2 2 2 2 2 ' ' ' ' ' ' N N N N N N N N N Na a a a aZ a a aFV V V V VXz V V Vph7 h7 h7 h7 h7J
 h7 h7 h7 h7 h7r   