ó
9­\c           @   s  d  d l  Z  d  d l m Z m Z m Z m Z m Z m Z m Z 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 d d	 d
 d g Z d e f d „  ƒ  YZ d	 e f d „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿN(   t   Exprt   Addt   Mult   St   Integralt   Eqt   Sumt   Symbol(   t   default_sort_key(   t   global_evaluate(   t   _sympify(   t   variancet
   covariance(   t   RandomSymbolt   probabilityt   expectationt   Probabilityt   Expectationt   Variancet
   Covariancec           B   s;   e  Z d  Z d d „ Z d d „ Z d d „ Z d „  Z RS(   s  
    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))
    c         K   s[   t  | ƒ } | d  k r- t j |  | ƒ } n! t  | ƒ } t j |  | | ƒ } | | _ | S(   N(   R
   t   NoneR    t   __new__t
   _condition(   t   clst   probt	   conditiont   kwargst   obj(    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR   %   s    	c         K   s   t  | | d t ƒS(   Nt   evaluate(   R   t   False(   t   selft   argR   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   _eval_rewrite_as_Integral/   s    c         K   s   t  | | d t ƒS(   NR   (   R   R   (   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   _eval_rewrite_as_Sum2   s    c         C   s   |  j  t ƒ j ƒ  S(   N(   t   rewriteR   t   doit(   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   evaluate_integral5   s    N(   t   __name__t
   __module__t   __doc__R   R   R    R!   R$   (    (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR      s
   
c           B   sP   e  Z d  Z d d „ Z d „  Z d d „ Z d d „ Z d d „ Z d „  Z	 RS(   sÔ  
    Symbolic expression for the expectation.

    Examples
    ========

    >>> from sympy.stats import Expectation, Normal, Probability
    >>> from sympy import symbols, Integral
    >>> 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))

    This class is aware of some properties of the expectation:

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

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

    >>> Expectation(X + Y).doit()
    Expectation(X) + Expectation(Y)
    >>> Expectation(a*X + Y).doit()
    a*Expectation(X) + Expectation(Y)
    >>> Expectation(a*X + Y)
    Expectation(a*X + Y)
    c         K   sn   t  | ƒ } | d  k r@ | j t ƒ s+ | St j |  | ƒ } n! t  | ƒ } t j |  | | ƒ } | | _ | S(   N(   R
   R   t   hasR   R    R   R   (   R   t   exprR   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR   g   s    	c         K   sø   |  j  d } |  j } | j t ƒ s) | St | t ƒ rj t g  | j  D] } t | d | ƒj ƒ  ^ qE Œ  St | t ƒ rô g  } g  } xL | j  D]A } t | t ƒ s³ | j t ƒ rÃ | j	 | ƒ q | j	 | ƒ q Wt | Œ  t t | Œ  d | ƒS|  S(   Ni    R   (
   t   argsR   R(   R   t
   isinstanceR   R   R#   R   t   append(   R   t   hintsR)   R   t   at   rvt   nonrv(    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR#   s   s    	2 c         K   sv  | j  t ƒ } t | ƒ d k r- t ƒ  ‚ n  t | ƒ d k rC | S| j ƒ  } | j d  k rm t d ƒ ‚ n  | j } | j	 d j
 ƒ  r¡ t | j	 j ƒ  ƒ } n t | j	 d ƒ } | j j rt | j | | ƒ t t | | ƒ | ƒ | | j j j j | j j j j f ƒ S| j j r%t ‚ nM t | j | | ƒ t t | | ƒ | ƒ | | j j j j | j j j f ƒ Sd  S(   Ni   i    s   Probability space not knownt   _1(   t   atomsR   t   lent   NotImplementedErrort   popt   pspaceR   t
   ValueErrort   symbolt   namet   isupperR   t   lowert   is_ContinuousR   t   replaceR   R   t   domaint   sett   inft   supt	   is_FiniteR   (   R   R   R   R   t   rvsR/   R8   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   _eval_rewrite_as_Probabilityˆ   s"    	P	c         K   s   t  | d | d t ƒS(   NR   R   (   R   R   (   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR    ¡   s    c         K   s   |  j  t ƒ S(   N(   R"   R   (   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR!   ¤   s    c         C   s   |  j  t ƒ j ƒ  S(   N(   R"   R   R#   (   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR$   §   s    N(
   R%   R&   R'   R   R   R#   RD   R    R!   R$   (    (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR   9   s   ,	c           B   s\   e  Z d  Z d d „ Z d „  Z d d „ Z d d „ Z d d „ Z d d „ Z	 d „  Z
 RS(	   s°  
    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 ``doit()``:

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

    c         K   s[   t  | ƒ } | d  k r- t j |  | ƒ } n! t  | ƒ } t j |  | | ƒ } | | _ | S(   N(   R
   R   R    R   R   (   R   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR   Ü   s    	c   	         sv  |  j  d } |  j ‰  | j t ƒ s, t j St | t ƒ r? |  St | t ƒ rÝ g  } x0 | j  D]% } | j t ƒ r^ | j | ƒ q^ q^ Wt t	 ‡  f d †  | ƒ Œ  } ‡  f d †  } t t	 | t
 j | d ƒ ƒ Œ  } | | St | t ƒ rrg  } g  } xA | j  D]6 } | j t ƒ r'| j | ƒ q| j | d ƒ qWt | ƒ d k rUt j St | Œ  t t | Œ  ˆ  ƒ S|  S(   Ni    c            s   t  |  ˆ  ƒ j ƒ  S(   N(   R   R#   (   t   xv(   R   (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   <lambda>ô   t    c            s   d t  d ˆ  |  Œ j ƒ  S(   Ni   R   (   R   R#   (   t   x(   R   (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyRF   õ   RG   i   (   R*   R   R(   R   R   t   ZeroR+   R   R,   t   mapt	   itertoolst   combinationsR   R3   R   (	   R   R-   R   R/   R.   t	   variancest   map_to_covart   covariancesR0   (    (   R   s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR#   æ   s4    	!c         K   s.   t  | d | ƒ } t  | | ƒ d } | | S(   Ni   (   R   (   R   R   R   R   t   e1t   e2(    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   _eval_rewrite_as_Expectation  s    c         K   s   |  j  t ƒ j  t ƒ S(   N(   R"   R   R   (   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyRD     s    c         K   s   t  |  j d |  j d t ƒS(   Ni    R   (   R   R*   R   R   (   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR      s    c         K   s   |  j  t ƒ S(   N(   R"   R   (   R   R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR!     s    c         C   s   |  j  t ƒ j ƒ  S(   N(   R"   R   R#   (   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR$     s    N(   R%   R&   R'   R   R   R#   RR   RD   R    R!   R$   (    (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR   «   s   0
	!c           B   sz   e  Z d  Z d
 d „ Z d „  Z e d „  ƒ Z e d „  ƒ Z d
 d „ Z	 d
 d „ Z
 d
 d „ Z d
 d „ Z d	 „  Z RS(   s  
    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 ``doit()``:

    >>> 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).doit()
    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).doit()
    Variance(X)
    >>> Covariance(a*X, b*Y).doit()
    a*b*Covariance(X, Y)
    c         K   s¤   t  | ƒ } t  | ƒ } | j d t d ƒ rO t | | g d t ƒ\ } } n  | d  k rs t j |  | | ƒ } n$ t  | ƒ } t j |  | | | ƒ } | | _ | S(   NR   i    t   key(	   R
   R5   R	   t   sortedR   R   R    R   R   (   R   t   arg1t   arg2R   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR   F  s    !	c         K   sF  |  j  d } |  j  d } |  j } | | k rB t | | ƒ j ƒ  S| j t ƒ sX t j S| j t ƒ sn t j St | | g d t	 ƒ\ } } t
 | t ƒ rº t
 | t ƒ rº t | | | ƒ S|  j | j ƒ  ƒ } |  j | j ƒ  ƒ } g  | D]K \ } } | D]8 \ }	 }
 | |	 t d | t | |
 g d t	 ƒŒ ^ qû që } t | Œ  S(   Ni    i   RS   R   (   R*   R   R   R#   R(   R   R   RI   RT   R   R+   R   t   _expand_single_argumentt   expandR   (   R   R-   RU   RV   R   t   coeff_rv_list1t   coeff_rv_list2R.   t   r1t   bt   r2t   addends(    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR#   U  s"    	Uc         C   sÞ   t  | t ƒ r t j | f g St  | t ƒ rœ g  } xa | j D]V } t  | t ƒ rl | j |  j | ƒ ƒ q> t  | t ƒ r> | j t j | f ƒ q> q> W| St  | t ƒ r» |  j | ƒ g S| j	 t ƒ rÚ t j | f g Sd  S(   N(
   R+   R   R   t   OneR   R*   R   R,   t   _get_mul_nonrv_rv_tupleR(   (   R   R)   t   outvalR.   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyRW   n  s    c         C   sb   g  } g  } x= | j  D]2 } | j t ƒ r; | j | ƒ q | j | ƒ q Wt | Œ  t | Œ  f S(   N(   R*   R(   R   R,   R   (   R   t   mR/   R0   R.   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR`     s    c         K   s7   t  | | | ƒ } t  | | ƒ t  | | ƒ } | | S(   N(   R   (   R   RU   RV   R   R   RP   RQ   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyRR   Œ  s    c         K   s   |  j  t ƒ j  t ƒ S(   N(   R"   R   R   (   R   RU   RV   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyRD   ‘  s    c         K   s'   t  |  j d |  j d |  j d t ƒS(   Ni    i   R   (   R   R*   R   R   (   R   RU   RV   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR    ”  s    c         K   s   |  j  t ƒ S(   N(   R"   R   (   R   RU   RV   R   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR!   —  s    c         C   s   |  j  t ƒ j ƒ  S(   N(   R"   R   R#   (   R   (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR$   š  s    N(   R%   R&   R'   R   R   R#   t   classmethodRW   R`   RR   RD   R    R!   R$   (    (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyR     s   +	(   RK   t   sympyR    R   R   R   R   R   R   R   t   sympy.core.compatibilityR   t   sympy.core.evaluateR	   t   sympy.core.sympifyR
   t   sympy.statsR   R   t   sympy.stats.rvR   R   R   t   __all__R   R   R   R   (    (    (    s?   lib/python2.7/site-packages/sympy/stats/symbolic_probability.pyt   <module>   s   :,rn