ó
Ąź\c           @  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 e d  Z d   Z d   Z d   Z d   Z i	 e d	 6e d
 6e d 6e d 6e d 6e d 6e d 6e d 6e d 6Z d S(   i˙˙˙˙(   t   print_functiont   division(   t   St   Addt   Exprt   Basict   Mul(   t   Qt   askc         C  sý   t  |  t  s |  S|  j sS g  |  j D] } t | |  ^ q& } |  j |   }  n  t |  d  r |  j |  } | d k	 r | Sn  |  j	 j
 } t j | d  } | d k r˛ |  S| |  |  } | d k sŮ |  | k rÝ |  St  | t  sđ | St | |  S(   sŤ  
    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

    t   _eval_refineN(   t
   isinstanceR   t   is_Atomt   argst   refinet   funct   hasattrR	   t   Nonet	   __class__t   __name__t   handlers_dictt   getR   (   t   exprt   assumptionst   argR   t   ref_exprt   namet   handlert   new_expr(    (    s7   lib/python2.7/site-packages/sympy/assumptions/refine.pyR      s&    	%c   
      C  s,  d d l  m } d d l m } |  j d } t t j |  |  rg | t t j |  |   rg | St t j |  |  r | St	 | t
  r(g  | j D] } t t |  |  ^ q } g  } g  } xA | D]9 }	 t	 |	 |  rý | j |	 j d  qŃ | j |	  qŃ Wt
 |   | t
 |    Sd S(   sV  
    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

    i˙˙˙˙(   t	   fuzzy_not(   t   Absi    N(   t   sympy.core.logicR   t   sympyR   R   R   R   t   realt   negativeR
   R   R   t   abst   append(
   R   R   R   R   R   t   at   rt   non_abst   in_abst   i(    (    s7   lib/python2.7/site-packages/sympy/assumptions/refine.pyt
   refine_abs/   s"    +c         C  s˙  d d l  m } m } d d l m } d d l m } t |  j |  r t	 t
 j |  j j d  |  r t	 t
 j |  j  |  r |  j j d |  j Sn  t	 t
 j |  j  |  rű|  j j r2t	 t
 j |  j  |  ró t |  j  |  j St	 t
 j |  j  |  r2| |  j  t |  j  |  j Sn  t |  j |  r}t |  j  | k r}t |  j j  |  j j |  j Sn  |  j t j k rű|  j j rř|  } |  j j   \ } } t |  } t g   }	 t g   }
 t |  } x^ | D]V } t	 t
 j |  |  r|	 j |  qít	 t
 j |  |  rí|
 j |  qíqíW| |	 8} t |
  d r| |
 8} | t j d } n | |
 8} | d } | | k sąt |  | k  rÔ| j |  |  j t |   }  n  d |  j } t	 t
 j |  |  r| j   r| |  j 9} qn  | j râ| j   \ } } | j râ| j t j k rât	 t
 j | j  |  rß| d d } t	 t
 j |  |  r|  j | j St	 t
 j |  |  rÇ|  j | j d S|  j | j | Sqßqân  | |  k rő|  Sqřqűn  d S(	   s`  
    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)

    i˙˙˙˙(   t   Powt   Rational(   R   (   t   signi    i   i   N(    t
   sympy.coreR*   R+   t$   sympy.functions.elementary.complexesR   t   sympy.functionsR,   R
   t   baseR   R   R    R   t   event   expt	   is_numberR"   t   oddt   typeR   t   NegativeOnet   is_Addt   as_coeff_addt   sett   lent   addt   OneR   t   could_extract_minus_signt   as_two_termst   is_Powt   integer(   R   R   R*   R+   R   R,   t   oldt   coefft   termst
   even_termst	   odd_termst   initial_number_of_termst   tt	   new_coefft   e2R(   t   p(    (    s7   lib/python2.7/site-packages/sympy/assumptions/refine.pyt
   refine_PowV   sl    "$$



	c         C  s  d d l  m } d d l m } |  j \ } } t t j |  t j |  @|  rb | | |  St t j	 |  t j	 |  @|  r | | |  | j
 St t j |  t j	 |  @|  rÖ | | |  | j
 St t j |  t j	 |  @|  r| j
 St t j |  t j |  @|  r2| j
 d St t j	 |  t j |  @|  rc| j
 d St t j |  t j |  @|  r| j S|  Sd S(   sŇ  
    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
    i˙˙˙˙(   t   atan(   R   i   N(   t(   sympy.functions.elementary.trigonometricRL   R-   R   R   R   R   R    t   positiveR!   t   Pit   zerot   NaN(   R   R   RL   R   t   yt   x(    (    s7   lib/python2.7/site-packages/sympy/assumptions/refine.pyt   refine_atan2¸   s$    %%%%%%%c         C  s   t  t j |   |  S(   sć   
    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   t   is_true(   R   R   (    (    s7   lib/python2.7/site-packages/sympy/assumptions/refine.pyt   refine_Relationalć   s    
R   R*   t   atan2t   Equalityt
   Unequalityt   GreaterThant   LessThant   StrictGreaterThant   StrictLessThanN(   t
   __future__R    R   R-   R   R   R   R   R   t   sympy.assumptionsR   R   t   TrueR   R)   RK   RT   RV   R   (    (    (    s7   lib/python2.7/site-packages/sympy/assumptions/refine.pyt   <module>   s"   ()	'	b	.	