U
    ZÊ¹jª.  ã                	   @  sÚ   U d dl mZ d dlmZ d dl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mZ d dd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeeeeeeeedœZded< dS )!é    )Úannotations)ÚCallable)ÚSÚAddÚExprÚBasicÚMulÚPowÚRational)Ú	fuzzy_not)ÚBoolean)ÚaskÚQTc                   s¨   t | tƒs| S | js2‡ fdd„| jD ƒ}| j|Ž } t| dƒrR|  ˆ ¡}|dk	rR|S | jj}t	 
|d¡}|dkrr| S || ˆ ƒ}|dksŒ| |kr�| S t |tƒsž|S t|ˆ ƒS )a  
    Simplify an expression using assumptions.

    Explanation
    ===========

    Unlike :func:`~.simplify` which performs structural simplification
    without any assumption, this function transforms the expression into
    the form which is only valid under certain assumptions. Note that
    ``simplify()`` is generally not done in refining process.

    Refining boolean expression involves reducing it to ``S.true`` or
    ``S.false``. Unlike :func:`~.ask`, the expression will not be reduced
    if the truth value cannot be determined.

    Examples
    ========

    >>> from sympy import refine, sqrt, Q
    >>> from sympy.abc import x
    >>> refine(sqrt(x**2), Q.real(x))
    Abs(x)
    >>> refine(sqrt(x**2), Q.positive(x))
    x

    >>> refine(Q.real(x), Q.positive(x))
    True
    >>> refine(Q.positive(x), Q.real(x))
    Q.positive(x)

    See Also
    ========

    sympy.simplify.simplify.simplify : Structural simplification without assumptions.
    sympy.assumptions.ask.ask : Query for boolean expressions using assumptions.
    c                   s   g | ]}t |ˆ ƒ‘qS © )Úrefine)Ú.0Úarg©Úassumptionsr   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/assumptions/refine.pyÚ
<listcomp>4   s     zrefine.<locals>.<listcomp>Ú_eval_refineN)Ú
isinstancer   Zis_AtomÚargsÚfuncÚhasattrr   Ú	__class__Ú__name__Úhandlers_dictÚgetr   r   )Úexprr   r   Zref_exprÚnameÚhandlerZnew_exprr   r   r   r      s&    %





r   c                   sÂ   ddl m} | jd }tt |¡ˆ ƒr>ttt |¡ˆ ƒƒr>|S tt |¡ˆ ƒrT| S t|t	ƒr¾‡ fdd„|jD ƒ}g }g }|D ]*}t||ƒrž| 
|jd ¡ q~| 
|¡ q~t	|Ž |t	|Ž ƒ S dS )aF  
    Handler for the absolute value.

    Examples
    ========

    >>> from sympy import Q, Abs
    >>> from sympy.assumptions.refine import refine_abs
    >>> from sympy.abc import x
    >>> refine_abs(Abs(x), Q.real(x))
    >>> refine_abs(Abs(x), Q.positive(x))
    x
    >>> refine_abs(Abs(x), Q.negative(x))
    -x

    r   ©ÚAbsc                   s   g | ]}t t|ƒˆ ƒ‘qS r   )r   Úabs)r   Úar   r   r   r   b   s     zrefine_abs.<locals>.<listcomp>N)Ú$sympy.functions.elementary.complexesr$   r   r   r   Úrealr   Únegativer   r   Úappend)r    r   r$   r   ÚrZnon_absZin_absÚir   r   r   Ú
refine_absG   s"    
ÿ

r-   c                 C  sÒ  ddl m} ddlm} t| j|ƒr`tt | jj	d ¡|ƒr`tt 
| j¡|ƒr`| jj	d | j S tt | j¡|ƒ�rÎ| jjrÊtt 
| j¡|ƒržt| jƒ| j S tt | j¡|ƒrÊ|| jƒt| jƒ| j  S t| jtƒrüt| jtƒrüt| jjƒ| jj| j  S | jtjk�rÎ| jj�rÎ| }| j ¡ \}}t|ƒ}tƒ }tƒ }t|ƒ}	|D ]@}
tt 
|
¡|ƒ�rh| |
¡ ntt |
¡|ƒ�rF| |
¡ �qF||8 }t|ƒd �r¶||8 }|tj d }n||8 }|d }||k�sÞt|ƒ|	k �rö| |¡ | jt|Ž  } d| j }tt 
|¡|ƒ�r&| ¡ �r&|| j9 }|j�rÀ| ¡ \}}|j�rÀ|jtjk�rÀtt |j¡|ƒ�rÀ|d d }tt 
|¡|ƒ�rŽ| j|j S tt |¡|ƒ�r°| j|jd  S | j|j|  S || k�rÎ| S dS )as  
    Handler for instances of Pow.

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.refine import refine_Pow
    >>> from sympy.abc import x,y,z
    >>> refine_Pow((-1)**x, Q.real(x))
    >>> refine_Pow((-1)**x, Q.even(x))
    1
    >>> refine_Pow((-1)**x, Q.odd(x))
    -1

    For powers of -1, even parts of the exponent can be simplified:

    >>> refine_Pow((-1)**(x+y), Q.even(x))
    (-1)**y
    >>> refine_Pow((-1)**(x+y+z), Q.odd(x) & Q.odd(z))
    (-1)**y
    >>> refine_Pow((-1)**(x+y+2), Q.odd(x))
    (-1)**(y + 1)
    >>> refine_Pow((-1)**(x+3), True)
    (-1)**(x + 1)

    r   r#   )Úsigné   é   N)r'   r$   Zsympy.functionsr.   r   Úbaser   r   r(   r   ZevenÚexpZ	is_numberr%   Zoddr
   r	   r   ÚNegativeOneZis_AddZas_coeff_addÚsetÚlenÚaddÚOner   Úcould_extract_minus_signZas_two_termsZis_PowÚinteger)r    r   r$   r.   ÚoldZcoeffZtermsZ
even_termsZ	odd_termsZinitial_number_of_termsÚtZ	new_coeffÚe2r,   Úpr   r   r   Ú
refine_Powm   sl    ÿ





r>   c                 C  s*  ddl m} | j\}}tt |¡t |¡@ |ƒr<||| ƒS tt |¡t |¡@ |ƒrh||| ƒtj	 S tt |¡t |¡@ |ƒr”||| ƒtj	 S tt 
|¡t |¡@ |ƒr´tj	S tt |¡t 
|¡@ |ƒrØtj	d S tt |¡t 
|¡@ |ƒ�r tj	 d S tt 
|¡t 
|¡@ |ƒ�r"tjS | S dS )aÃ  
    Handler for the atan2 function.

    Examples
    ========

    >>> from sympy import Q, atan2
    >>> from sympy.assumptions.refine import refine_atan2
    >>> from sympy.abc import x, y
    >>> refine_atan2(atan2(y,x), Q.real(y) & Q.positive(x))
    atan(y/x)
    >>> refine_atan2(atan2(y,x), Q.negative(y) & Q.negative(x))
    atan(y/x) - pi
    >>> refine_atan2(atan2(y,x), Q.positive(y) & Q.negative(x))
    atan(y/x) + pi
    >>> refine_atan2(atan2(y,x), Q.zero(y) & Q.negative(x))
    pi
    >>> refine_atan2(atan2(y,x), Q.positive(y) & Q.zero(x))
    pi/2
    >>> refine_atan2(atan2(y,x), Q.negative(y) & Q.zero(x))
    -pi/2
    >>> refine_atan2(atan2(y,x), Q.zero(y) & Q.zero(x))
    nan
    r   )Úatanr/   N)Z(sympy.functions.elementary.trigonometricr?   r   r   r   r(   Úpositiver)   r   ÚPiÚzeroÚNaN)r    r   r?   ÚyÚxr   r   r   Úrefine_atan2Ñ   s"    

rF   c                 C  s>   | j d }tt |¡|ƒr|S tt |¡|ƒr4tjS t| |ƒS )a  
    Handler for real part.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_re
    >>> from sympy import Q, re
    >>> from sympy.abc import x
    >>> refine_re(re(x), Q.real(x))
    x
    >>> refine_re(re(x), Q.imaginary(x))
    0
    r   )r   r   r   r(   Ú	imaginaryr   ÚZeroÚ_refine_reim©r    r   r   r   r   r   Ú	refine_reþ   s    
rK   c                 C  sF   | j d }tt |¡|ƒr tjS tt |¡|ƒr<tj | S t| |ƒS )a  
    Handler for imaginary part.

    Explanation
    ===========

    >>> from sympy.assumptions.refine import refine_im
    >>> from sympy import Q, im
    >>> from sympy.abc import x
    >>> refine_im(im(x), Q.real(x))
    0
    >>> refine_im(im(x), Q.imaginary(x))
    -I*x
    r   )	r   r   r   r(   r   rH   rG   ÚImaginaryUnitrI   rJ   r   r   r   Ú	refine_im  s    
rM   c                 C  s:   | j d }tt |¡|ƒr tjS tt |¡|ƒr6tjS dS )a"  
    Handler for complex argument

    Explanation
    ===========

    >>> from sympy.assumptions.refine import refine_arg
    >>> from sympy import Q, arg
    >>> from sympy.abc import x
    >>> refine_arg(arg(x), Q.positive(x))
    0
    >>> refine_arg(arg(x), Q.negative(x))
    pi
    r   N)r   r   r   r@   r   rH   r)   rA   )r    r   Zrgr   r   r   Ú
refine_arg+  s    
rN   c                 C  s.   | j dd�}|| kr*t||ƒ}||kr*|S d S )NT)Úcomplex)Úexpandr   )r    r   ÚexpandedZrefinedr   r   r   rI   B  s    
rI   c                 C  s¦   | j d }tt |¡|ƒr tjS tt |¡ƒrZtt |¡|ƒrDtjS tt 	|¡|ƒrZtj
S tt |¡ƒr¢| ¡ \}}tt |¡|ƒrŠtjS tt 	|¡|ƒr¢tj S | S )a*  
    Handler for sign.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_sign
    >>> from sympy import Symbol, Q, sign, im
    >>> x = Symbol('x', real = True)
    >>> expr = sign(x)
    >>> refine_sign(expr, Q.positive(x) & Q.nonzero(x))
    1
    >>> refine_sign(expr, Q.negative(x) & Q.nonzero(x))
    -1
    >>> refine_sign(expr, Q.zero(x))
    0
    >>> y = Symbol('y', imaginary = True)
    >>> expr = sign(y)
    >>> refine_sign(expr, Q.positive(im(y)))
    I
    >>> refine_sign(expr, Q.negative(im(y)))
    -I
    r   )r   r   r   rB   r   rH   r(   r@   r7   r)   r3   rG   Zas_real_imagrL   )r    r   r   Zarg_reZarg_imr   r   r   Úrefine_signM  s    
rR   c                 C  sH   ddl m} | j\}}}tt |¡|ƒrD||  ¡ r8| S ||||ƒS dS )aU  
    Handler for symmetric part.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_matrixelement
    >>> from sympy import MatrixSymbol, Q
    >>> X = MatrixSymbol('X', 3, 3)
    >>> refine_matrixelement(X[0, 1], Q.symmetric(X))
    X[0, 1]
    >>> refine_matrixelement(X[1, 0], Q.symmetric(X))
    X[0, 1]
    r   )ÚMatrixElementN)Z"sympy.matrices.expressions.matexprrS   r   r   r   Z	symmetricr8   )r    r   rS   Úmatrixr,   Újr   r   r   Úrefine_matrixelementv  s    rV   )r$   r	   Úatan2ÚreZimr   r.   rS   z*dict[str, Callable[[Expr, Boolean], Expr]]r   N)T)Ú
__future__r   Útypingr   Z
sympy.corer   r   r   r   r   r	   r
   Zsympy.core.logicr   Zsympy.logic.boolalgr   Zsympy.assumptionsr   r   r   r-   r>   rF   rK   rM   rN   rI   rR   rV   r   Ú__annotations__r   r   r   r   Ú<module>   s2    $
<&d-)ø