
    sg(                         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y)    N)Add)Expr)expand)Mul)S)
ShapeError)
MatrixExpr)MatMul)
ZeroMatrix)RandomSymbol	is_random)_sympify)Variance
CovarianceExpectationc                   .    e Zd ZdZddZed        Zd Zy)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       `/var/www/html/venv/lib/python3.12/site-packages/sympy/stats/symbolic_multivariate_probability.pyr   zExpectationMatrix.__new__8   s`    ~T?,,sD)C +I,,sD)4CZZ
"
    c                     | j                   S r   r   selfs    r   r   zExpectationMatrix.shapeF       {{r   c                 F   | 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 ]u  }t        |      r9|r|j                  |       n|j                  |       g }|j                  |       G|j                  r|j                  |       e|j                  |       w t        |      dk(  r| S t        j
                  |      t        t        j
                  |            z  t        j
                  |      z  S | S )Nr   c              3   T   K   | ]  }t        |       j                          ! ywr   Nr   r   .0ar   s     r   	<genexpr>z+ExpectationMatrix.expand.<locals>.<genexpr>Q   s)       ( !,A C J J L  (   %(c              3   T   K   | ]  }t        |       j                          ! ywr'   r)   r*   s     r   r-   z+ExpectationMatrix.expand.<locals>.<genexpr>V   s)       / !,A C J J 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   sa   yy|OO	KdC <<  (!YY ( ( ( dmk3'<<  /(-- / / / sFm,BEGYY $Q<		'*W- GIIaL[[NN1%LLO$ 5zQ<<&{3<<3C'() )),g)>? ? r   r   __name__
__module____qualname____doc__r   propertyr   r    r   r   r   r      s&    %L  (r   r   c                   .    e Zd ZdZddZed        Zd Zy)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                 f   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    smCII9::03		!0A1syy|,		RSVYV_V_`aVbGc,,sC3C,,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              rqg }|j                   D ]  }t        |      s|j                  |       ! t        	fd|D         }	fd}t        t        |t        j                  |d             }||z   S t        |t        t        f      rg }g }|j                   D ]0  }t        |      r|j                  |        |j                  |       2 t        |      dk(  rt        | j                   S t        |      dk(  r| S t        |      dkD  r| S t        j                  |      t!        t        j                  |      	      z  t        j                  |      j#                         z  S | S )Nr   c              3   R   K   | ]  }t        |      j                            y wr   )r   r   )r+   xvr   s     r   r-   z(VarianceMatrix.expand.<locals>.<genexpr>   s!     L2hr95<<>Ls   $'c                 <    dt        | dij                         z  S )N   r   )r   r   )xr   s    r   <lambda>z'VarianceMatrix.expand.<locals>.<lambda>   s    Qz1'J	'J'Q'Q'S%S r   rP   rG   )r0   r   r   r   r   r1   r   r   r5   map	itertoolscombinationsr   r
   r7   r2   r   	transpose)
r#   r8   rJ   r:   r,   	variancesmap_to_covarcovariancesr;   r   s
            @r   r   zVarianceMatrix.expand   s   iilOO	~tzz**c<(KS!BXX !Q<IIaL! LLMISLs<1G1GA1NOPK{**c6]+EBXX $Q<IIaLLLO	$
 2w!|!4::..5zQ2w{<<&xR0@%(' '(+U(;'F'F'HI I r   r   r=   rC   r   r   rE   rE   t   s%    4"  &r   rE   c                   N    e Zd ZdZddZed        Zd Zed        Z	ed        Z
y)	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   k7  rt        d      |j                  d   dk(  r0|j                  d   dk(  r|j                  d   |j                  d   fnd}|rt        j                  | |||      }nt        j                  | ||      }||_        ||_        |S )NrG   rH   r   )rG   rG   rI   )r   arg1arg2r   r   r   s         r   r   zCrossCovarianceMatrix.__new__   s    ~~TZZQdjj%8djjmtzzZ[}>\9::26**Q-12DTUZ[I[A

1. 	 ,,sD$	:C,,sD$/C
"
r   c                     | j                   S r   r!   r"   s    r   r   zCrossCovarianceMatrix.shape   r$   r   c                 x   | j                   d   }| j                   d   }| j                  }||k(  rt        ||      j                         S t	        |      rt	        |      st        | j                   S t        |t              rt        |t              rt        |||      S | j                  |j                               }| j                  |j                               }|D 	
cg c]1  \  }}|D ]'  \  }	}
|t        ||
|      z  |	j                         z  ) 3 }}	}}}
t        j                  |      S c c}
}	}}w )Nr   rG   r(   )r0   r   rE   r   r   r   r   r1   r   r[   _expand_single_argumentrV   r   r2   )r#   r8   r]   r^   r   coeff_rv_list1coeff_rv_list2r,   r1br2addendss               r   r   zCrossCovarianceMatrix.expand  s   yy|yy|OO	4<!$	299;;iotzz**dL)j|.L(tY??55dkkmD55dkkmD #1P P2P5<a *2rYGGU PU P P||G$$Ps   $6D4
c                    t        |t              rt        j                  |fgS t        |t              ryg }|j
                  D ]f  }t        |t        t        f      r!|j                  | j                  |             :t        |      sF|j                  t        j                  |f       h |S t        |t        t        f      r| j                  |      gS t        |      rt        j                  |fgS y r   )r1   r   r   Oner   r0   r   r
   r5   _get_mul_nonrv_rv_tupler   )r   r   outvalr,   s       r   ra   z-CrossCovarianceMatrix._expand_single_argument  s     dL)UUDM?"c"FYY .a#v/MM#"="=a"@Aq\MM155!*-	. MsFm,//566t_UUDM?" r   c                     g }g }|j                   D ]0  }t        |      r|j                  |        |j                  |       2 t        j                  |      t        j                  |      fS r   )r0   r   r5   r   r2   )r   mr:   r;   r,   s        r   rj   z-CrossCovarianceMatrix._get_mul_nonrv_rv_tuple+  s[     	 A|		!Q		 
 U#S\\"%566r   r   )r>   r?   r@   rA   r   rB   r   r   classmethodra   rj   rC   r   r   r[   r[      sM    >&  %* # #$ 7 7r   r[   ) rT   sympy.core.addr   sympy.core.exprr   sympy.core.functionr   r3   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   rE   r[   rC   r   r   <module>r{      sa        1  " 0 9 4 9 2 ' N NaZ aFVXz Vph7J
 h7r   