B
    [e              
   @   s   d dl mZmZ d dlmZmZmZmZ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eeeeeeeeed	ZdS )    )print_functiondivision)SAddExprBasicMul)QaskTc                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.

    Gives the form of expr that would be obtained if symbols
    in it were replaced by explicit numerical expressions satisfying
    the assumptions.

    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

    c                s   g | ]}t | qS  )refine).0arg)assumptionsr   7lib/python3.7/site-packages/sympy/assumptions/refine.py
<listcomp>   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nameZhandlerZnew_exprr   )r   r   r      s&    





r   c       	         s   ddl m} ddlm} | jd }tt| rJ|tt| rJ|S tt| r`| S t	|t
r· fdd|jD }g }g }x2|D ]*}t	||r||jd  q|| qW t
| |t
|  S dS )aV  
    Handler for the absolute value.

    Examples
    ========

    >>> from sympy import Symbol, Q, refine, 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   )	fuzzy_not)Absc                s   g | ]}t t| qS r   )r   abs)r   a)r   r   r   r   K   s    zrefine_abs.<locals>.<listcomp>N)Zsympy.core.logicr   Zsympyr   r   r
   r	   realnegativer   r   append)	r   r   r   r   r   rZnon_absZin_absir   )r   r   
refine_abs/   s"    



r&   c             C   s  ddl m}m} ddlm} ddlm} t| j|rpt	t
| jjd |rpt	t
| j|rp| jjd | j S t	t
| j|r| jjrt	t
| j|rt| j| j S t	t
| j|r|| jt| j| j  S t| j|rt| j|krt| jj| jj| j  S | jtjkr| jjr| }| j \}}t|}tg }	tg }
t|}xH|D ]@}t	t
||r|	| nt	t
||rb|
| qbW ||	8 }t|
d r||
8 }|tj d }n||
8 }|d }||kst||k r|| | jt|  } d| j }t	t
||rD| rD|| j9 }|jr| \}}|jr|jtjkrt	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 )a`  
    Handler for instances of Pow.

    >>> from sympy import Symbol, 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   )PowRational)r   )sign      N) 
sympy.corer'   r(   Z$sympy.functions.elementary.complexesr   Zsympy.functionsr)   r   baser
   r	   r!   r   ZevenZexpZ	is_numberr   Zoddtyper   ZNegativeOneZis_AddZas_coeff_addsetlenaddZOner   Zcould_extract_minus_signZas_two_termsZis_PowZinteger)r   r   r'   r(   r   r)   oldZcoeffZtermsZ
even_termsZ	odd_termsZinitial_number_of_termstZ	new_coeffZe2r%   pr   r   r   
refine_PowV   sl    






r5   c             C   s6  ddl m} ddlm} | j\}}tt|t|@ |rH||| S tt	|t	|@ |rt||| |j
 S tt|t	|@ |r||| |j
 S tt|t	|@ |r|j
S tt|t|@ |r|j
d S tt	|t|@ |r|j
 d S tt|t|@ |r.|jS | S dS )a  
    Handler for the atan2 function

    Examples
    ========

    >>> from sympy import Symbol, Q, refine, 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   )atan)r   r*   N)Z(sympy.functions.elementary.trigonometricr6   r,   r   r   r
   r	   r!   Zpositiver"   ZPiZzeroZNaN)r   r   r6   r   yxr   r   r   refine_atan2   s$    

r9   c             C   s   t t| |S )z
    Handler for Relational

    >>> from sympy.assumptions.refine import refine_Relational
    >>> from sympy.assumptions.ask import Q
    >>> from sympy.abc import x
    >>> refine_Relational(x<0, ~Q.is_true(x<0))
    False
    )r
   r	   Zis_true)r   r   r   r   r   refine_Relational   s    
r:   )	r   r'   Zatan2ZEqualityZ
UnequalityZGreaterThanZLessThanZStrictGreaterThanZStrictLessThanN)T)Z
__future__r   r   r,   r   r   r   r   r   Zsympy.assumptionsr	   r
   r   r&   r5   r9   r:   r   r   r   r   r   <module>   s    
)'b.