U
    ZÊ¹jó  ã                   @   sž   d Z ddlmZ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mZ ddlmZ dd„ Zddd„ZdS )z'Tools for arithmetic error propagation.é    )ÚrepeatÚcombinations)ÚAdd)ÚMul)ÚPow)ÚS)ÚSymbol)Úexp)Úsimplify)ÚRandomSymbolÚVarianceÚ
Covariance)Ú	is_randomc                 C   s   t | jƒdkr| jd S | S )Nr   )ÚlenÚargs)Úvar© r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/stats/error_prop.pyÚ<lambda>   ó    r   r   Fc           
      C   s‚  | j }t|ƒdkrT| |kr tjS t| ƒr4t| ƒ ¡ S t| tƒrNtt	| ƒƒ ¡ S tjS t|ƒ}t
tt|t||ƒt||ƒƒƒ}t| tƒr²t|Ž }|r°dd„ t|dƒD ƒ}|t|Ž 7 }nÌt| tƒ�rdd„ t||ƒD ƒ}t| d t|Ž  ƒ}|�r~dd„ tt|dƒt|dƒƒD ƒ}|t|Ž 7 }ndt| tƒ�rT|d }|d | | |d  d  }	t|	ƒ}n*t| tƒ�rvt|d | d  ƒ}nt| ƒ}|S )a¸  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

    r   c                 S   s*   g | ]"\}}d t t|ƒt|ƒƒ ¡  ‘qS ©é   ©r   Ú_arg0_or_varÚexpand)Ú.0ÚxÚyr   r   r   Ú
<listcomp>P   s   ÿz!variance_prop.<locals>.<listcomp>r   c                 S   s   g | ]\}}||d   ‘qS r   r   )r   ÚaÚvr   r   r   r   T   s     c                 S   s:   g | ]2\\}}\}}d t t|ƒt|ƒƒ ¡  ||  ‘qS r   r   )r   r   Úbr   r   r   r   r   r   W   s   ÿé   )r   r   r   ZZeror   r   ZdoitÚ
isinstancer   r   ÚlistÚmapÚvariance_propr   r   r   r   Úzipr
   r   r	   )
ÚexprZconstsZinclude_covarr   ÚnargsZvar_argsZvar_exprZtermsr!   r    r   r   r   r&      sL    .
ÿ
ÿ
ÿÿ
r&   N)r   F)Ú__doc__Ú	itertoolsr   r   Zsympy.core.addr   Zsympy.core.mulr   Zsympy.core.powerr   Zsympy.core.singletonr   Zsympy.core.symbolr   Z&sympy.functions.elementary.exponentialr	   Zsympy.simplify.simplifyr
   Z sympy.stats.symbolic_probabilityr   r   r   Zsympy.stats.rvr   r   r&   r   r   r   r   Ú<module>   s   