
    wgZ                        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+ g dZ, e(jZ                  e      d        Z. e(jZ                  e"      d        Z. G d de      Z/ G d de      Z0 G d de      Z1 G d de      Z2 G d de      Z3 G d  d!e      Z4y)"    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                     | j                   }t        |      dk(  rt        t        |            | k(  ryt	        d |D              S )N   Fc              3   2   K   | ]  }t        |        y wN)r   ).0is     e/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/stats/symbolic_probability.py	<genexpr>z_.<locals>.<genexpr>   s     +y|+s   )free_symbolslennextiterany)xatomss     r(   _r1      s:    NNE
5zQ4U,1+U+++    c                      y)NT )r/   s    r(   r1   r1       s    r2   c                   4    e Zd ZdZdZddZd ZddZeZd Z	y)	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                     t        |      }|t        j                  | |      }n"t        |      }t        j                  | ||      }||_        |S r%   )r   r   __new__
_condition)clsprob	conditionkwargsobjs        r(   r7   zProbability.__new__@   sI    ~,,sD)C +I,,sD)4C"
r2   c                    | j                   d   }| j                  |j                  dd      }|j                  dd      }t        |t              rBt
        j                   | j                  |j                   d   |      j                  di |z
  S |j                  t              rt        |      j                  ||      S t        t              rt        |      }t        |      dk(  r7|d   k(  r/ddlm}  | | j                  |      j                  di |dd      S t%        fd	|D              rt'        |      S t'        |      j                         S $t        t(        t*        f      st-        d
z        dk(  s|t
        j.                  u rt
        j0                  S t        |t(        t*        f      st-        d
|z        |t
        j2                  u rt
        j                  S |rt5        ||      S #t'        t7        |            j                         S t        |      t9               k(  rt'        |      S t        |      j                  |      }t;        |d      r|r|j                         S |S )Nr   
numsamplesFevaluateTr@   r#   )BernoulliDistributionc              3   6   K   | ]  }t        |        y wr%   )r   )r&   rvgiven_conditions     r(   r)   z#Probability.doit.<locals>.<genexpr>]   s     Cb9R1Cs   z4%s is not a relational or combination of relationals)r?   doitr4   )argsr8   get
isinstancer   r	   OnefuncrF   hasr   r   probabilityr   r   r+   sympy.stats.frv_typesrB   r.   r   r   r   
ValueErrorfalseZerotruer   r   r   hasattr)	selfhintsr;   r?   r@   condrvrB   resultrE   s	           @r(   rF   zProbability.doitJ   sX   IIaL	//YY|U3
99Z.i%55 <499Y^^A%6-5 % 77;tE>CE E E ==,-)$00O6> 1 @ @ o|4#I.F6{aF1I$@G,-FTYYy-A-F-F-O-OQRTUVVCFCC"9o>>"9-2244&W0EFS&( ) ) e#yAGG';66M)j'%:;S " # #55LiZPP&uY@AFFHH )(y/::	"..y966"x;;= Mr2   c                 H    | j                  ||      j                  d      S )Nr;   FrA   rK   rF   rT   argr;   r<   s       r(   _eval_rewrite_as_Integralz%Probability._eval_rewrite_as_Integral   s#    yy	y2777GGr2   c                 H    | j                  t              j                         S r%   rewriter   rF   rT   s    r(   evaluate_integralzProbability.evaluate_integral       ||H%**,,r2   r%   )
__name__
__module____qualname____doc__is_commutativer7   rF   r]   _eval_rewrite_as_Sumrb   r4   r2   r(   r   r   %   s,    0 N3jH 5-r2   r   c                   H    e Zd ZdZd
dZd Zd Zd Zd
dZddZ	e	Z
d	 ZeZy)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                     t        |      }|j                  rddlm}  |||      S |$t	        |      s|S t        j                  | |      }n"t        |      }t        j                  | ||      }||_        |S )Nr   )ExpectationMatrix)r   	is_Matrix-sympy.stats.symbolic_multivariate_probabilityrl   r   r   r7   r8   )r9   exprr;   r<   rl   r=   s         r(   r7   zExpectation.__new__   sl    ~>>W$T955T?,,sD)C +I,,sD)4C"
r2   c                 4    | j                   d   j                  S Nr   rG   rh   ra   s    r(   _eval_is_commutativez Expectation._eval_is_commutative   s    yy|**+r2   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              ryg }g }|j                   D ]0  }t        |      r|j                  |        |j                  |       2 t        j
                  |      t        t        j
                  |            z  S | S )Nr   c              3   T   K   | ]  }t        |       j                          ! ywrY   Nr   r   r&   ar;   s     r(   r)   z%Expectation.expand.<locals>.<genexpr>   s)       ( !,A C J J L  (   %(c              3   T   K   | ]  }t        |       j                          ! ywrv   rw   rx   s     r(   r)   z%Expectation.expand.<locals>.<genexpr>   s)       / !,A C J J L  /rz   rY   )
rG   r8   r   rI   r   fromiter_expandr   appendr   )rT   rU   ro   expand_exprrD   nonrvry   r;   s          @r(   r   zExpectation.expand   s    yy|OO	KdC <<  (!YY ( ( ( dmk3'<<  /(-- / / / c"BEYY $Q<IIaLLLO	$
 <<&{3<<3Cy'YYYr2   c           
         |j                  dd      }| j                  }| j                  d   }|j                  dd      }|j                  dd      }|r |j                  di |}t	        |      rt        |t              r|S |r!|j                  dd      }t        ||||      S |j                  t              rt        |      j                  ||      S |+ | j                  t        ||            j                  di |S |j                  rbt        |j                  D cg c]F  }t        |t              s" | j                  ||      j                  di |n| j                  ||      H c} S |j                   r|j#                  t              r|S t        |      t%               k(  r| j                  |      S t        |      j                  ||	      }	t'        |	d
      r|r |	j                  di |S |	S c c}w )NdeepTr   r?   Fr@   evalf)r?   r   rA   rF   r4   )rH   r8   rG   rF   r   rI   r   r   rL   r   r   compute_expectationrK   r   is_Addr   is_Mulr0   r   rS   )
rT   rU   r   r;   ro   r?   r@   r   r\   rW   s
             r(   rF   zExpectation.doit   s   yy&OO	yy|YY|U3
99Z.499%u%D*T;"?KIIgt,EdI*ERR88'($<33D)DD  9499U43499BEBB ;;$(II/  &c;7 83	277@%@=AYYsI=VW / 0 0 ;;zz+&$<68#99T?"11$1J66"x6;;'''M/s   "AG9c           	         |j                  t              }t        |      dkD  r
t               t        |      dk(  r|S |j	                         }|j
                  t        d      |j                  }|j                  d   j                         r$t        |j                  j                               }nt        |j                  dz         }|j
                  j                  rt        |j                  ||      t        t!        ||      |      z  ||j
                  j"                  j$                  j&                  |j
                  j"                  j$                  j(                  f      S |j
                  j*                  rt        t-        |j                  ||      t        t!        ||      |      z  ||j
                  j"                  j$                  j&                  |j
                  j$                  j(                  f      S )Nr#   r   zProbability space not known_1)r0   r   r+   NotImplementedErrorpopr   rO   symbolnameisupperr
   loweris_Continuousr   replacer   r   domainsetinfsup	is_Finiter   )rT   r\   r;   r<   rvsrD   r   s          r(   _eval_rewrite_as_Probabilityz(Expectation._eval_rewrite_as_Probability'  s   ii%s8a<%''s8q=JWWY99:;;;;q>!!#FKK--/0FFKK$./F99""CKKF3K2vPY4ZZ]cegeneneueueyeye}e}  @B  @I  @I  @P  @P  @T  @T  @X  @X  ]Y  Z  Zyy""))3;;r62;r"f~y3YY\bdfdmdmdtdtdxdxd|d|  A  H  H  L  L  P  P  \Q  R  Rr2   c                 J    | j                  ||      j                  d|      S )NrY   F)r   r@   rZ   )rT   r\   r;   r@   r<   s        r(   r]   z%Expectation._eval_rewrite_as_Integral@  s%    yy	y277UX7VVr2   c                 H    | j                  t              j                         S r%   r_   ra   s    r(   rb   zExpectation.evaluate_integralE  rc   r2   r%   )NF)rd   re   rf   rg   r7   rs   r   rF   r   r]   ri   rb   evaluate_sumr4   r2   r(   r   r      s>    CJ,8(VR2W 5- %Lr2   r   c                   F    e Zd ZdZd
dZd Zd Zd
dZd
dZd
dZ	e	Z
d	 Zy)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                     t        |      }|j                  rddlm}  |||      S |t	        j
                  | |      }n"t        |      }t	        j
                  | ||      }||_        |S )Nr   )VarianceMatrix)r   rm   rn   r   r   r7   r8   )r9   r\   r;   r<   r   r=   s         r(   r7   zVariance.__new__{  s`    sm==T!#y11,,sC(C +I,,sC3C"
r2   c                 4    | j                   d   j                  S rq   rr   ra   s    r(   rs   zVariance._eval_is_commutative      yy|***r2   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              rg }g }|j                   D ]3  }t        |      r|j                  |        |j                  |dz         5 t        |      dk(  rt        j                  S t        j                  |      t        t        j                  |      	      z  S | S )Nr   c              3   R   K   | ]  }t        |      j                            y wr%   )r    r   )r&   xvr;   s     r(   r)   z"Variance.expand.<locals>.<genexpr>  s!     L2hr95<<>Ls   $'c                 <    dt        | dij                         z  S )N   r;   )r!   r   )r/   r;   s    r(   <lambda>z!Variance.expand.<locals>.<lambda>  s    Qz1'J	'J'Q'Q'S%S r2   r   )rG   r8   r   r	   rQ   rI   r   r   r~   map	itertoolscombinationsr   r+   r|   r    )
rT   rU   r\   rD   ry   	variancesmap_to_covarcovariancesr   r;   s
            @r(   r   zVariance.expand  s6   iilOO	~66Mc<(KS!BXX !Q<IIaL! LLMISLs<1G1GA1NOPK{**S!EBXX 'Q<IIaLLLA&	'
 2w!|vv<<&xR0@)'LLL r2   c                 H    t        |dz  |      }t        ||      dz  }||z
  S )Nr   r   )rT   r\   r;   r<   e1e2s         r(   _eval_rewrite_as_Expectationz%Variance._eval_rewrite_as_Expectation  s,    S!VY/BS),a/B7Nr2   c                 R    | j                  t              j                  t              S r%   r`   r   r   r[   s       r(   r   z%Variance._eval_rewrite_as_Probability      ||K(00==r2   c                 L    t        | j                  d   | j                  d      S )Nr   FrA   )r   rG   r8   r[   s       r(   r]   z"Variance._eval_rewrite_as_Integral  s    		!dooFFr2   c                 H    | j                  t              j                         S r%   r_   ra   s    r(   rb   zVariance.evaluate_integral  rc   r2   r%   )rd   re   rf   rg   r7   rs   r   r   r   r]   ri   rb   r4   r2   r(   r    r    J  s5    /`+B
>G 5-r2   r    c                   f    e Zd ZdZddZd Zd Zed        Zed        Z	ddZ
dd	Zdd
ZeZd Zy)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                 v   t        |      }t        |      }|j                  s|j                  rddlm}  ||||      S |j	                  dt
        j                        rt        ||gt              \  }}|t        j                  | ||      }n#t        |      }t        j                  | |||      }||_        |S )Nr   )CrossCovarianceMatrixr@   key)r   rm   rn   r   r   r   r@   sortedr   r   r7   r8   )r9   arg1arg2r;   r<   r   r=   s          r(   r7   zCovariance.__new__  s    ~~>>T^^[(tY??::j"3"<"<=t2BCJD$,,sD$/C +I,,sD$	:C"
r2   c                 4    | j                   d   j                  S rq   rr   ra   s    r(   rs   zCovariance._eval_is_commutative  r   r2   c                    | j                   d   }| j                   d   }| j                  }||k(  rt        ||      j                         S t	        |      st
        j                  S t	        |      st
        j                  S t        ||gt              \  }}t        |t              rt        |t              rt        |||      S | j                  |j                               }| j                  |j                               }|D 	
cg c]1  \  }}|D ]'  \  }	}
||	z  t        t        ||
gt              d|iz  ) 3 }}	}}}
t        j                  |      S c c}
}	}}w )Nr   r#   r   r;   )rG   r8   r    r   r   r	   rQ   r   r   rI   r   r!   _expand_single_argumentr   r|   )rT   rU   r   r   r;   coeff_rv_list1coeff_rv_list2ry   r1br2addendss               r(   r   zCovariance.expand  s>   yy|yy|OO	4<D),335566M66MT4L.>?
ddL)j|.LdD)4455dkkmD55dkkmD #1P P2P5<a Q3z62r(8H#I_U^__ P_ P P||G$$Ps   6E
c                    t        |t              rt        j                  |fgS t        |t              rsg }|j
                  D ]`  }t        |t              r!|j                  | j                  |             4t        |      s@|j                  t        j                  |f       b |S t        |t              r| j                  |      gS t        |      rt        j                  |fgS y r%   )
rI   r   r	   rJ   r   rG   r   r~   _get_mul_nonrv_rv_tupler   )r9   ro   outvalry   s       r(   r   z"Covariance._expand_single_argument  s     dL)UUDM?"c"FYY .a%MM#"="=a"@Aq\MM155!*-	. Mc"//566t_UUDM?" r2   c                     g }g }|j                   D ]0  }t        |      r|j                  |        |j                  |       2 t        j                  |      t        j                  |      fS r%   )rG   r   r~   r   r|   )r9   mrD   r   ry   s        r(   r   z"Covariance._get_mul_nonrv_rv_tuple-  s[     	 A|		!Q		 
 U#S\\"%566r2   c                 \    t        ||z  |      }t        ||      t        ||      z  }||z
  S r%   r   )rT   r   r   r;   r<   r   r   s          r(   r   z'Covariance._eval_rewrite_as_Expectation8  s3    dI.y)+dI*FFBwr2   c                 R    | j                  t              j                  t              S r%   r   rT   r   r   r;   r<   s        r(   r   z'Covariance._eval_rewrite_as_Probability=  r   r2   c                 h    t        | j                  d   | j                  d   | j                  d      S )Nr   r#   FrA   )r   rG   r8   r   s        r(   r]   z$Covariance._eval_rewrite_as_Integral@  s(    $))A,		!dooPUVVr2   c                 H    | j                  t              j                         S r%   r_   ra   s    r(   rb   zCovariance.evaluate_integralE  rc   r2   r%   )rd   re   rf   rg   r7   rs   r   classmethodr   r   r   r   r]   ri   rb   r4   r2   r(   r!   r!     s\    *X&+%2 # #$ 7 7
>W 5-r2   r!   c                   B     e Zd ZdZd fd	Zd ZddZddZddZ x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))

    c                     t        |      }t        |      }t        |      }|t        |      }t        | 	  | ||||      S t        | 	  | |||      S r%   r   superr7   )r9   Xncr;   r<   	__class__s         r(   r7   zMoment.__new__l  sZ    QKQKQK  +I7?31a;;7?31a00r2   c                 L     | j                  t              j                  di |S Nr4   r`   r   rF   rT   rU   s     r(   rF   zMoment.doitv  !    -t||K(--666r2   c                 &    t        ||z
  |z  |      S r%   r   rT   r   r   r   r;   r<   s         r(   r   z#Moment._eval_rewrite_as_Expectationy  s    AEA:y11r2   c                 R    | j                  t              j                  t              S r%   r   r   s         r(   r   z#Moment._eval_rewrite_as_Probability|  r   r2   c                 R    | j                  t              j                  t              S r%   r`   r   r   r   s         r(   r]   z Moment._eval_rewrite_as_Integral      ||K(00::r2   )r   N
rd   re   rf   rg   r7   rF   r   r   r]   __classcell__r   s   @r(   r   r   I  s"    !D172>;r2   r   c                   B     e Zd ZdZd fd	Zd ZddZddZddZ x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))

    c                     t        |      }t        |      }|t        |      }t        | 	  | |||      S t        | 	  | ||      S r%   r   )r9   r   r   r;   r<   r   s        r(   r7   zCentralMoment.__new__  sM    QKQK  +I7?31i887?31--r2   c                 L     | j                  t              j                  di |S r   r   r   s     r(   rF   zCentralMoment.doit  r   r2   c                 `    t        ||fi |}t        ||||fi |j                  t               S r%   )r   r   r`   )rT   r   r   r;   r<   mus         r(   r   z*CentralMoment._eval_rewrite_as_Expectation  s4    I00aB	4V4<<[IIr2   c                 R    | j                  t              j                  t              S r%   r   rT   r   r   r;   r<   s        r(   r   z*CentralMoment._eval_rewrite_as_Probability  r   r2   c                 R    | j                  t              j                  t              S r%   r   r   s        r(   r]   z'CentralMoment._eval_rewrite_as_Integral  r   r2   r%   r   r   s   @r(   r   r     s#    !D.7J>;r2   r   )5r   sympy.concrete.summationsr   sympy.core.addr   sympy.core.exprr   sympy.core.functionr   r}   sympy.core.mulr   sympy.core.relationalr   sympy.core.singletonr	   sympy.core.symbolr
   sympy.integrals.integralsr   sympy.logic.boolalgr   sympy.core.parametersr   sympy.core.sortingr   sympy.core.sympifyr   r   r   sympy.statsr   r   sympy.stats.rvr   r   r   r   r   r   r   r   r   r   __all__registerr1   r   r   r    r!   r   r   r4   r2   r(   <module>r     s     )    1  $ " $ . # 3 / ' , ' ,@ @ @ C D, , L! "`-$ `-F@%$ @%Dq-t q-hH- H-V7;T 7;t7;D 7;r2   