U
    ZÊ¹jâZ  ã                   @   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 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*m+Z+ ddddgZ,e( -e¡dd„ ƒZ.e( -e"¡dd„ ƒZ.G dd„ deƒZ/G dd„ deƒZ0G dd„ deƒZ1G dd„ deƒZ2G dd„ deƒZ3G d d!„ d!eƒZ4dS )"é    N)ÚSum)ÚAdd)ÚExpr)Úexpand)ÚMul)ÚEq)ÚS)ÚSymbol)ÚIntegral)ÚNot)Úglobal_parameters)Údefault_sort_key)Ú_sympify)Ú
Relational)ÚBoolean)ÚvarianceÚ
covariance)
ÚRandomSymbolÚpspaceÚ	dependentÚgivenÚ
sampling_EÚRandomIndexedSymbolÚ	is_randomÚPSpaceÚ
sampling_PÚrandom_symbolsÚProbabilityÚExpectationÚVarianceÚ
Covariancec                 C   s8   | j }t|ƒdkr&tt|ƒƒ| kr&dS tdd„ |D ƒƒS )Né   Fc                 s   s   | ]}t |ƒV  qd S ©N)r   )Ú.0Úi© r%   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/stats/symbolic_probability.pyÚ	<genexpr>   s     z_.<locals>.<genexpr>)Zfree_symbolsÚlenÚnextÚiterÚany)ÚxÚatomsr%   r%   r&   Ú_   s    r.   c                 C   s   dS )NTr%   ©r,   r%   r%   r&   r.       s    c                   @   s<   e Zd ZdZdZddd„Zdd„ Zddd	„ZeZd
d„ Z	dS )r   a  
    Symbolic expression for the probability.

    Examples
    ========

    >>> from sympy.stats import Probability, Normal
    >>> from sympy import Integral
    >>> X = Normal("X", 0, 1)
    >>> prob = Probability(X > 1)
    >>> prob
    Probability(X > 1)

    Integral representation:

    >>> prob.rewrite(Integral)
    Integral(sqrt(2)*exp(-_z**2/2)/(2*sqrt(pi)), (_z, 1, oo))

    Evaluation of the integral:

    >>> prob.evaluate_integral()
    sqrt(2)*(-sqrt(2)*sqrt(pi)*erf(sqrt(2)/2) + sqrt(2)*sqrt(pi))/(4*sqrt(pi))
    TNc                 K   s>   t |ƒ}|d krt | |¡}nt |ƒ}t | ||¡}||_|S r"   )r   r   Ú__new__Ú
_condition)ÚclsZprobÚ	conditionÚkwargsÚobjr%   r%   r&   r0   @   s    zProbability.__new__c                    sÚ  | j d }| j‰ | dd¡}| dd¡}t|tƒrVtj| j|j d ˆ |d�jf |Ž S | 	t
¡rtt|ƒj|ˆ |d�S tˆ tƒrðt|ƒ}t|ƒdkrÄ|d ˆ krÄddlm} ||  |¡jf |ŽddƒS t‡ fd	d
„|D ƒƒrät|ˆ ƒS t|ƒ ¡ S ˆ d k	�rtˆ ttfƒ�stdˆ  ƒ‚ˆ dk�s,|tjk�r2tjS t|ttfƒ�sNtd| ƒ‚|tjk�r`tjS |�rtt|ˆ |d�S ˆ d k	�r�tt|ˆ ƒƒ ¡ S t|ƒtƒ k�rªt|ˆ ƒS t|ƒ |¡}t|dƒ�rÒ|�rÒ| ¡ S |S d S )Nr   Ú
numsamplesFÚevaluateT©r7   r!   )ÚBernoulliDistributionc                 3   s   | ]}t |ˆ ƒV  qd S r"   )r   )r#   Úrv©Zgiven_conditionr%   r&   r'   ]   s     z#Probability.doit.<locals>.<genexpr>z4%s is not a relational or combination of relationals)r6   Údoit)Úargsr1   ÚgetÚ
isinstancer   r   ÚOneÚfuncr<   Úhasr   r   Zprobabilityr   r   r(   Zsympy.stats.frv_typesr9   r+   r   r   r   Ú
ValueErrorÚfalseÚZeroÚtruer   r   r   Úhasattr)ÚselfÚhintsr3   r6   r7   Zcondrvr9   Úresultr%   r;   r&   r<   J   s\    

ÿÿ
ÿ


ÿÿÿ

zProbability.doitc                 K   s   | j ||d�jdd�S )N©r3   Fr8   ©rA   r<   ©rH   Úargr3   r4   r%   r%   r&   Ú_eval_rewrite_as_Integral   s    z%Probability._eval_rewrite_as_Integralc                 C   s   |   t¡ ¡ S r"   ©Úrewriter
   r<   ©rH   r%   r%   r&   Úevaluate_integral„   s    zProbability.evaluate_integral)N)N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úis_commutativer0   r<   rO   Ú_eval_rewrite_as_SumrS   r%   r%   r%   r&   r   %   s   

5
c                   @   sV   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zddd„Zddd„Z	e	Z
dd„ ZeZdS )r   a(  
    Symbolic expression for the expectation.

    Examples
    ========

    >>> from sympy.stats import Expectation, Normal, Probability, Poisson
    >>> from sympy import symbols, Integral, Sum
    >>> mu = symbols("mu")
    >>> sigma = symbols("sigma", positive=True)
    >>> X = Normal("X", mu, sigma)
    >>> Expectation(X)
    Expectation(X)
    >>> Expectation(X).evaluate_integral().simplify()
    mu

    To get the integral expression of the expectation:

    >>> Expectation(X).rewrite(Integral)
    Integral(sqrt(2)*X*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo))

    The same integral expression, in more abstract terms:

    >>> Expectation(X).rewrite(Probability)
    Integral(x*Probability(Eq(X, x)), (x, -oo, oo))

    To get the Summation expression of the expectation for discrete random variables:

    >>> lamda = symbols('lamda', positive=True)
    >>> Z = Poisson('Z', lamda)
    >>> Expectation(Z).rewrite(Sum)
    Sum(Z*lamda**Z*exp(-lamda)/factorial(Z), (Z, 0, oo))

    This class is aware of some properties of the expectation:

    >>> from sympy.abc import a
    >>> Expectation(a*X)
    Expectation(a*X)
    >>> Y = Normal("Y", 1, 2)
    >>> Expectation(X + Y)
    Expectation(X + Y)

    To expand the ``Expectation`` into its expression, use ``expand()``:

    >>> Expectation(X + Y).expand()
    Expectation(X) + Expectation(Y)
    >>> Expectation(a*X + Y).expand()
    a*Expectation(X) + Expectation(Y)
    >>> Expectation(a*X + Y)
    Expectation(a*X + Y)
    >>> Expectation((X + Y)*(X - Y)).expand()
    Expectation(X**2) - Expectation(Y**2)

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

    >>> Expectation(X + Y).doit()
    mu + 1
    >>> Expectation(X + Expectation(Y + Expectation(2*X))).doit()
    3*mu + 1

    To prevent evaluating nested ``Expectation``, use ``doit(deep=False)``

    >>> Expectation(X + Expectation(Y)).doit(deep=False)
    mu + Expectation(Expectation(Y))
    >>> Expectation(X + Expectation(Y + Expectation(2*X))).doit(deep=False)
    mu + Expectation(Expectation(Expectation(2*X) + Y))

    Nc                 K   sf   t |ƒ}|jr$ddlm} |||ƒS |d krFt|ƒs8|S t | |¡}nt |ƒ}t | ||¡}||_|S )Nr   )ÚExpectationMatrix)r   Ú	is_MatrixÚ-sympy.stats.symbolic_multivariate_probabilityrZ   r   r   r0   r1   )r2   Úexprr3   r4   rZ   r5   r%   r%   r&   r0   Î   s    
zExpectation.__new__c                 C   s   | j d jS ©Nr   ©r=   rX   rR   r%   r%   r&   Ú_eval_is_commutativeÝ   s    z Expectation._eval_is_commutativec                    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ƒrÄg }g }|j D ]"}t|ƒrœ| |¡ q„| |¡ q„t |¡t	t |¡ˆ d� S | S )Nr   c                 3   s   | ]}t |ˆ d � ¡ V  qdS ©rK   N©r   r   ©r#   ÚarK   r%   r&   r'   è   s   ÿz%Expectation.expand.<locals>.<genexpr>c                 3   s   | ]}t |ˆ d � ¡ V  qdS ra   rb   rc   rK   r%   r&   r'   í   s   ÿrK   )
r=   r1   r   r?   r   ÚfromiterÚ_expandr   Úappendr   )rH   rI   r]   Zexpand_exprr:   Únonrvrd   r%   rK   r&   r   à   s,    

ÿ
ÿ

zExpectation.expandc                    s<  ˆ  dd¡}ˆj‰ ˆjd }ˆ  dd¡}ˆ  dd¡}|rD|jf ˆŽ}t|ƒrVt|tƒrZ|S |rzˆ  dd¡}t|ˆ ||d�S | t	¡r”t
|ƒ |ˆ ¡S ˆ d k	r´ˆ t|ˆ ƒ¡jf ˆŽS |jrÖt‡ ‡‡fd	d
„|jD ƒŽ S |jrê| t¡rê|S t
|ƒtƒ k�rˆ |¡S t
|ƒj||d�}t|dƒ�r4|�r4|jf ˆŽS |S d S )NÚdeepTr   r6   Fr7   Úevalf)r6   rj   c                    s6   g | ].}t |tƒs&ˆ |ˆ ¡jf ˆŽn
ˆ |ˆ ¡‘qS r%   )r?   r   rA   r<   )r#   rN   ©r3   rI   rH   r%   r&   Ú
<listcomp>  s   ÿÿz$Expectation.doit.<locals>.<listcomp>r8   r<   )r>   r1   r=   r<   r   r?   r   r   rB   r   r   Zcompute_expectationrA   r   Zis_Addr   Zis_Mulr-   r   rG   )rH   rI   ri   r]   r6   r7   rj   rJ   r%   rk   r&   r<   ü   s:    

þ

zExpectation.doitc                 K   s   |  t¡}t|ƒdkrtƒ ‚t|ƒdkr,|S | ¡ }|jd krFtdƒ‚|j}|jd  	¡ rjt
|j ¡ ƒ}nt
|jd ƒ}|jjr¸t| ||¡tt||ƒ|ƒ ||jjjj|jjjjfƒS |jjrÆt‚n6t| ||¡tt||ƒ|ƒ ||jjjj|jjjfƒS d S )Nr!   r   zProbability space not knownZ_1)r-   r   r(   ÚNotImplementedErrorÚpopr   rC   ÚsymbolÚnameÚisupperr	   ÚlowerZis_Continuousr
   Úreplacer   r   ÚdomainÚsetÚinfÚsupZ	is_Finiter   )rH   rN   r3   r4   Zrvsr:   ro   r%   r%   r&   Ú_eval_rewrite_as_Probability'  s"    

8z(Expectation._eval_rewrite_as_ProbabilityFc                 K   s   | j ||d�jd|d�S )NrK   F)ri   r7   rL   )rH   rN   r3   r7   r4   r%   r%   r&   rO   @  s    z%Expectation._eval_rewrite_as_Integralc                 C   s   |   t¡ ¡ S r"   rP   rR   r%   r%   r&   rS   E  s    zExpectation.evaluate_integral)N)N)NF)rT   rU   rV   rW   r0   r`   r   r<   rx   rO   rY   rS   Zevaluate_sumr%   r%   r%   r&   r   ˆ   s   E
+

c                   @   sT   e Zd ZdZddd„Zdd„ Zdd„ Zdd	d
„Zddd„Zddd„Z	e	Z
dd„ ZdS )r   a¶  
    Symbolic expression for the variance.

    Examples
    ========

    >>> from sympy import symbols, Integral
    >>> from sympy.stats import Normal, Expectation, Variance, Probability
    >>> mu = symbols("mu", positive=True)
    >>> sigma = symbols("sigma", positive=True)
    >>> X = Normal("X", mu, sigma)
    >>> Variance(X)
    Variance(X)
    >>> Variance(X).evaluate_integral()
    sigma**2

    Integral representation of the underlying calculations:

    >>> Variance(X).rewrite(Integral)
    Integral(sqrt(2)*(X - Integral(sqrt(2)*X*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)))**2*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo))

    Integral representation, without expanding the PDF:

    >>> Variance(X).rewrite(Probability)
    -Integral(x*Probability(Eq(X, x)), (x, -oo, oo))**2 + Integral(x**2*Probability(Eq(X, x)), (x, -oo, oo))

    Rewrite the variance in terms of the expectation

    >>> Variance(X).rewrite(Expectation)
    -Expectation(X)**2 + Expectation(X**2)

    Some transformations based on the properties of the variance may happen:

    >>> from sympy.abc import a
    >>> Y = Normal("Y", 0, 1)
    >>> Variance(a*X)
    Variance(a*X)

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

    >>> Variance(a*X).expand()
    a**2*Variance(X)
    >>> Variance(X + Y)
    Variance(X + Y)
    >>> Variance(X + Y).expand()
    2*Covariance(X, Y) + Variance(X) + Variance(Y)

    Nc                 K   sZ   t |ƒ}|jr$ddlm} |||ƒS |d kr:t | |¡}nt |ƒ}t | ||¡}||_|S )Nr   )ÚVarianceMatrix)r   r[   r\   ry   r   r0   r1   )r2   rN   r3   r4   ry   r5   r%   r%   r&   r0   {  s    
zVariance.__new__c                 C   s   | j d jS r^   r_   rR   r%   r%   r&   r`   ‰  s    zVariance._eval_is_commutativec           	         s
  | j d }| j‰ t|ƒstjS t|tƒr,| S t|tƒr˜g }|j D ]}t|ƒr@| |¡ q@t‡ fdd„|D ƒŽ }‡ fdd„}tt	|t
 |d¡ƒŽ }|| S t|tƒ�rg }g }|j D ]&}t|ƒrÊ| |¡ q²| |d ¡ q²t|ƒdkrìtjS t |¡tt |¡ˆ ƒ S | S )Nr   c                 3   s   | ]}t |ˆ ƒ ¡ V  qd S r"   )r   r   )r#   ZxvrK   r%   r&   r'   š  s     z"Variance.expand.<locals>.<genexpr>c                    s   dt | dˆ iŽ ¡  S )Né   r3   )r    r   r/   rK   r%   r&   Ú<lambda>›  ó    z!Variance.expand.<locals>.<lambda>rz   )r=   r1   r   r   rE   r?   r   r   rg   ÚmapÚ	itertoolsÚcombinationsr   r(   re   r   )	rH   rI   rN   r:   rd   Z	variancesZmap_to_covarZcovariancesrh   r%   rK   r&   r   Œ  s4    




zVariance.expandc                 K   s$   t |d |ƒ}t ||ƒd }|| S )Nrz   ©r   )rH   rN   r3   r4   Úe1Úe2r%   r%   r&   Ú_eval_rewrite_as_Expectation­  s    z%Variance._eval_rewrite_as_Expectationc                 K   s   |   t¡  t¡S r"   ©rQ   r   r   rM   r%   r%   r&   rx   ²  s    z%Variance._eval_rewrite_as_Probabilityc                 K   s   t | jd | jdd�S )Nr   Fr8   )r   r=   r1   rM   r%   r%   r&   rO   µ  s    z"Variance._eval_rewrite_as_Integralc                 C   s   |   t¡ ¡ S r"   rP   rR   r%   r%   r&   rS   º  s    zVariance.evaluate_integral)N)N)N)N)rT   rU   rV   rW   r0   r`   r   rƒ   rx   rO   rY   rS   r%   r%   r%   r&   r   J  s   0
!


c                   @   sl   e Zd ZdZddd„Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	ddd„Z
ddd„Zddd„ZeZdd„ ZdS )r    a˜  
    Symbolic expression for the covariance.

    Examples
    ========

    >>> from sympy.stats import Covariance
    >>> from sympy.stats import Normal
    >>> X = Normal("X", 3, 2)
    >>> Y = Normal("Y", 0, 1)
    >>> Z = Normal("Z", 0, 1)
    >>> W = Normal("W", 0, 1)
    >>> cexpr = Covariance(X, Y)
    >>> cexpr
    Covariance(X, Y)

    Evaluate the covariance, `X` and `Y` are independent,
    therefore zero is the result:

    >>> cexpr.evaluate_integral()
    0

    Rewrite the covariance expression in terms of expectations:

    >>> from sympy.stats import Expectation
    >>> cexpr.rewrite(Expectation)
    Expectation(X*Y) - Expectation(X)*Expectation(Y)

    In order to expand the argument, use ``expand()``:

    >>> from sympy.abc import a, b, c, d
    >>> Covariance(a*X + b*Y, c*Z + d*W)
    Covariance(a*X + b*Y, c*Z + d*W)
    >>> Covariance(a*X + b*Y, c*Z + d*W).expand()
    a*c*Covariance(X, Z) + a*d*Covariance(W, X) + b*c*Covariance(Y, Z) + b*d*Covariance(W, Y)

    This class is aware of some properties of the covariance:

    >>> Covariance(X, X).expand()
    Variance(X)
    >>> Covariance(a*X, b*Y).expand()
    a*b*Covariance(X, Y)
    Nc                 K   s�   t |ƒ}t |ƒ}|js|jr4ddlm} ||||ƒS | dtj¡rVt||gtd�\}}|d krnt	 
| ||¡}nt |ƒ}t	 
| |||¡}||_|S )Nr   )ÚCrossCovarianceMatrixr7   ©Úkey)r   r[   r\   r…   rn   r   r7   Úsortedr   r   r0   r1   )r2   Úarg1Úarg2r3   r4   r…   r5   r%   r%   r&   r0   ë  s    zCovariance.__new__c                 C   s   | j d jS r^   r_   rR   r%   r%   r&   r`   þ  s    zCovariance._eval_is_commutativec                    sº   | j d }| j d }| j‰||kr0t|ˆƒ ¡ S t|ƒs>tjS t|ƒsLtjS t||gtd�\}}t	|t
ƒr€t	|t
ƒr€t||ˆƒS |  | ¡ ¡}|  | ¡ ¡‰ ‡ ‡fdd„|D ƒ}t |¡S )Nr   r!   r†   c              	      s@   g | ]8\}}ˆ D ]*\}}|| t t||gtd �dˆiŽ ‘qqS )r†   r3   )r    rˆ   r   )r#   rd   Úr1ÚbÚr2©Zcoeff_rv_list2r3   r%   r&   rl     s     ÿz%Covariance.expand.<locals>.<listcomp>)r=   r1   r   r   r   r   rE   rˆ   r   r?   r   r    Ú_expand_single_argumentr   re   )rH   rI   r‰   rŠ   Zcoeff_rv_list1Zaddendsr%   rŽ   r&   r     s$    

ÿzCovariance.expandc                 C   s–   t |tƒrtj|fgS t |tƒrhg }|jD ]8}t |tƒrJ| |  |¡¡ q*t	|ƒr*| tj|f¡ q*|S t |tƒr~|  |¡gS t	|ƒr’tj|fgS d S r"   )
r?   r   r   r@   r   r=   r   rg   Ú_get_mul_nonrv_rv_tupler   )r2   r]   Zoutvalrd   r%   r%   r&   r�     s    




z"Covariance._expand_single_argumentc                 C   sF   g }g }|j D ]"}t|ƒr&| |¡ q| |¡ qt |¡t |¡fS r"   )r=   r   rg   r   re   )r2   Úmr:   rh   rd   r%   r%   r&   r�   -  s    
z"Covariance._get_mul_nonrv_rv_tuplec                 K   s*   t || |ƒ}t ||ƒt ||ƒ }|| S r"   r€   )rH   r‰   rŠ   r3   r4   r�   r‚   r%   r%   r&   rƒ   8  s    z'Covariance._eval_rewrite_as_Expectationc                 K   s   |   t¡  t¡S r"   r„   ©rH   r‰   rŠ   r3   r4   r%   r%   r&   rx   =  s    z'Covariance._eval_rewrite_as_Probabilityc                 K   s   t | jd | jd | jdd�S )Nr   r!   Fr8   )r   r=   r1   r’   r%   r%   r&   rO   @  s    z$Covariance._eval_rewrite_as_Integralc                 C   s   |   t¡ ¡ S r"   rP   rR   r%   r%   r&   rS   E  s    zCovariance.evaluate_integral)N)N)N)N)rT   rU   rV   rW   r0   r`   r   Úclassmethodr�   r�   rƒ   rx   rO   rY   rS   r%   r%   r%   r&   r    ¾  s   ,






c                       sH   e Zd ZdZd‡ fdd„	Zdd„ Zddd	„Zdd
d„Zddd„Z‡  Z	S )ÚMomenta�  
    Symbolic class for Moment

    Examples
    ========

    >>> from sympy import Symbol, Integral
    >>> from sympy.stats import Normal, Expectation, Probability, Moment
    >>> mu = Symbol('mu', real=True)
    >>> sigma = Symbol('sigma', positive=True)
    >>> X = Normal('X', mu, sigma)
    >>> M = Moment(X, 3, 1)

    To evaluate the result of Moment use `doit`:

    >>> M.doit()
    mu**3 - 3*mu**2 + 3*mu*sigma**2 + 3*mu - 3*sigma**2 - 1

    Rewrite the Moment expression in terms of Expectation:

    >>> M.rewrite(Expectation)
    Expectation((X - 1)**3)

    Rewrite the Moment expression in terms of Probability:

    >>> M.rewrite(Probability)
    Integral((x - 1)**3*Probability(Eq(X, x)), (x, -oo, oo))

    Rewrite the Moment expression in terms of Integral:

    >>> M.rewrite(Integral)
    Integral(sqrt(2)*(X - 1)**3*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo))

    r   Nc                    sR   t |ƒ}t |ƒ}t |ƒ}|d k	r<t |ƒ}tƒ  | ||||¡S tƒ  | |||¡S d S r"   ©r   Úsuperr0   )r2   ÚXÚnÚcr3   r4   ©Ú	__class__r%   r&   r0   l  s    zMoment.__new__c                 K   s   |   t¡jf |ŽS r"   ©rQ   r   r<   ©rH   rI   r%   r%   r&   r<   v  s    zMoment.doitc                 K   s   t || | |ƒS r"   r€   ©rH   r—   r˜   r™   r3   r4   r%   r%   r&   rƒ   y  s    z#Moment._eval_rewrite_as_Expectationc                 K   s   |   t¡  t¡S r"   r„   rž   r%   r%   r&   rx   |  s    z#Moment._eval_rewrite_as_Probabilityc                 K   s   |   t¡  t¡S r"   ©rQ   r   r
   rž   r%   r%   r&   rO     s    z Moment._eval_rewrite_as_Integral)r   N)r   N)r   N)r   N©
rT   rU   rV   rW   r0   r<   rƒ   rx   rO   Ú__classcell__r%   r%   rš   r&   r”   I  s   "


r”   c                       sH   e Zd ZdZd‡ fdd„	Zdd„ Zddd„Zdd	d
„Zddd„Z‡  Z	S )ÚCentralMomenta'  
    Symbolic class Central Moment

    Examples
    ========

    >>> from sympy import Symbol, Integral
    >>> from sympy.stats import Normal, Expectation, Probability, CentralMoment
    >>> mu = Symbol('mu', real=True)
    >>> sigma = Symbol('sigma', positive=True)
    >>> X = Normal('X', mu, sigma)
    >>> CM = CentralMoment(X, 4)

    To evaluate the result of CentralMoment use `doit`:

    >>> CM.doit().simplify()
    3*sigma**4

    Rewrite the CentralMoment expression in terms of Expectation:

    >>> CM.rewrite(Expectation)
    Expectation((-Expectation(X) + X)**4)

    Rewrite the CentralMoment expression in terms of Probability:

    >>> CM.rewrite(Probability)
    Integral((x - Integral(x*Probability(True), (x, -oo, oo)))**4*Probability(Eq(X, x)), (x, -oo, oo))

    Rewrite the CentralMoment expression in terms of Integral:

    >>> CM.rewrite(Integral)
    Integral(sqrt(2)*(X - Integral(sqrt(2)*X*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo)))**4*exp(-(X - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma), (X, -oo, oo))

    Nc                    sF   t |ƒ}t |ƒ}|d k	r2t |ƒ}tƒ  | |||¡S tƒ  | ||¡S d S r"   r•   )r2   r—   r˜   r3   r4   rš   r%   r&   r0   ¦  s    zCentralMoment.__new__c                 K   s   |   t¡jf |ŽS r"   rœ   r�   r%   r%   r&   r<   ¯  s    zCentralMoment.doitc                 K   s&   t ||f|Ž}t||||f|Ž t ¡S r"   )r   r”   rQ   )rH   r—   r˜   r3   r4   Úmur%   r%   r&   rƒ   ²  s    z*CentralMoment._eval_rewrite_as_Expectationc                 K   s   |   t¡  t¡S r"   r„   ©rH   r—   r˜   r3   r4   r%   r%   r&   rx   ¶  s    z*CentralMoment._eval_rewrite_as_Probabilityc                 K   s   |   t¡  t¡S r"   rŸ   r¤   r%   r%   r&   rO   ¹  s    z'CentralMoment._eval_rewrite_as_Integral)N)N)N)Nr    r%   r%   rš   r&   r¢   ƒ  s   "	

r¢   )5r~   Zsympy.concrete.summationsr   Zsympy.core.addr   Zsympy.core.exprr   Zsympy.core.functionr   rf   Zsympy.core.mulr   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.core.symbolr	   Zsympy.integrals.integralsr
   Zsympy.logic.boolalgr   Zsympy.core.parametersr   Zsympy.core.sortingr   Zsympy.core.sympifyr   r   r   Zsympy.statsr   r   Zsympy.stats.rvr   r   r   r   r   r   r   r   r   r   Ú__all__Úregisterr.   r   r   r   r    r”   r¢   r%   r%   r%   r&   Ú<module>   s<   0

c Ct :