ó
¡¼™\c           @  sž   d  Z  d d l m Z 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 d d l m Z m Z m Z d „  Z d	 e d „ Z d S(
   s'   Tools for arithmetic error propagation.iÿÿÿÿ(   t   print_functiont   division(   t   repeatt   combinations(   t   St   Symbolt   Addt   Mult   simplifyt   Powt   exp(   t   RandomSymbolt   Variancet
   Covariancec         C  s$   t  |  j ƒ d k r  |  j d S|  S(   Ni    (   t   lent   args(   t   var(    (    s5   lib/python2.7/site-packages/sympy/stats/error_prop.pyt   <lambda>   t    c         C  s›  |  j  } t | ƒ d k r‚ |  | k r1 t d ƒ St |  t ƒ rP t |  ƒ j ƒ  St |  t ƒ ru t t |  ƒ ƒ j ƒ  St d ƒ Sn  t | ƒ } t t	 t
 | t | | ƒ t | | ƒ ƒ ƒ } t |  t ƒ r9t | Œ  } | r—g  t | d ƒ D]1 \ } } d t t | ƒ t | ƒ ƒ j ƒ  ^ qì }	 | t |	 Œ  7} q—n^t |  t ƒ rg  t | | ƒ D] \ }
 } | |
 d ^ qX}	 t |  d t |	 Œ  ƒ } | r—g  t t | d ƒ t | d ƒ ƒ D]E \ \ }
 } \ } } d t t | ƒ t | ƒ ƒ j ƒ  |
 | ^ qº}	 | t |	 Œ  7} q—n| t |  t ƒ ra| d } | d |  | | d d } t | ƒ } n6 t |  t ƒ r‹t | d |  d ƒ } n t |  ƒ } | S(   s¸  Symbolically propagates variance (`\sigma^2`) for expressions.
    This is computed as as seen in [1]_.

    Parameters
    ==========

    expr : Expr
        A sympy expression to compute the variance for.
    consts : sequence of Symbols, optional
        Represents symbols that are known constants in the expr,
        and thus have zero variance. All symbols not in consts are
        assumed to be variant.
    include_covar : bool, optional
        Flag for whether or not to include covariances, default=False.

    Returns
    =======

    var_expr : Expr
        An expression for the total variance of the expr.
        The variance for the original symbols (e.g. x) are represented
        via instance of the Variance symbol (e.g. Variance(x)).

    Examples
    ========

    >>> from sympy import symbols, exp
    >>> from sympy.stats.error_prop import variance_prop
    >>> x, y = symbols('x y')

    >>> variance_prop(x + y)
    Variance(x) + Variance(y)

    >>> variance_prop(x * y)
    x**2*Variance(y) + y**2*Variance(x)

    >>> variance_prop(exp(2*x))
    4*exp(4*x)*Variance(x)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Propagation_of_uncertainty

    i    i   i   (   R   R   R   t
   isinstanceR   R   t   doitR   t   listt   mapt   variance_propR   R   R   R   t   _arg0_or_varR   t   zipR   R	   R
   (   t   exprt   constst   include_covarR   t   nargst   var_argst   var_exprt   xt   yt   termst   at   vt   b(    (    s5   lib/python2.7/site-packages/sympy/stats/error_prop.pyR      sD    .	
D0[
N(    (   t   __doc__t
   __future__R    R   t	   itertoolsR   R   t   sympyR   R   R   R   R   R	   R
   t    sympy.stats.symbolic_probabilityR   R   R   R   t   FalseR   (    (    (    s5   lib/python2.7/site-packages/sympy/stats/error_prop.pyt   <module>   s   4	