ó
¡¼™\c        >   @  s×  d  d l  m Z m Z d  d l m Z d  d l m Z d  d l m Z m	 Z	 d  d l
 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	 l m Z 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$ d  d l% m& Z& d e# f d „  ƒ  YZ' d e' f d „  ƒ  YZ( d e' f d „  ƒ  YZ) d e' f d „  ƒ  YZ* d „  Z+ d „  Z, d e' f d „  ƒ  YZ- d e' f d „  ƒ  YZ. d e/ f d „  ƒ  YZ0 d e f d „  ƒ  YZ1 e1 ƒ  Z2 e2 d  „ Z3 xÛe e e j4 e) e j4 ƒ ƒ f e& e  e( e j5 ƒ e e j6 e( e j6 ƒ ƒ ƒ f e e  e( e j7 ƒ e j7 ƒ f e e  e( e j8 ƒ e j8 ƒ f e e  e( e j7 ƒ e j7 ƒ f e e  e( e j9 ƒ e j9 ƒ f e e  e( e j: ƒ e j9 ƒ f e e0 d! „  ƒ f e e0 d" „  ƒ f e e0 d# „  ƒ f e e0 d$ „  ƒ f e e. e j; ƒ f e e  e( e j; ƒ e j; ƒ f e e  e( e j< e j: Bƒ e  e* e j< ƒ e j< ƒ ƒ f e e  e( e j: ƒ e j: ƒ f e e  e( e j: ƒ e j: ƒ f e e  e( e j: ƒ e  e* e j= ƒ e j= ƒ ƒ f e e  e( e j: ƒ e  e* e j= ƒ e j= ƒ ƒ f e e  e( e j> ƒ e j> ƒ f e e  e( e j> ƒ e j> ƒ f e e j? f e e e( e j4 ƒ e j4 ƒ f e e  e( e j@ ƒ e e) e jA ƒ e jA ƒ ƒ f e e  e( e jA ƒ e jA ƒ f e e  e( e jB ƒ e jB ƒ f e e  e( e j@ ƒ e j@ ƒ f e e  e* e j@ ƒ e j@ ƒ f e e  e( e j@ ƒ e j@ ƒ f e e  e* e j> ƒ e j@ ƒ f e e  e( e j@ ƒ e j@ ƒ f e e- e j8 ƒ f e e- e j4 ƒ f e e- e j7 ƒ f e e- e j? ƒ f e e- e jC ƒ f e e- e jD ƒ f e e- e j> ƒ f e e- e j= ƒ f e e- e jA ƒ f e e- e jB ƒ f e e- e j@ ƒ f e e- e j< ƒ f e e- e j8 ƒ f e e- e j4 ƒ f e e- e j7 ƒ f e e- e j? ƒ f e e- e jC ƒ f e e- e jD ƒ f e e- e j> ƒ f e e- e j= ƒ f e e- e j< ƒ f e e- e j8 ƒ f e e- e j4 ƒ f e e- e j7 ƒ f e e- e j? ƒ f e e- e jC ƒ f e e- e jD ƒ f e e- e j> ƒ f e e- e j= ƒ f e e- e j< ƒ f g< D] \ ZE ZF e3 eE eF ƒ q¶Wd% S(&   iÿÿÿÿ(   t   print_functiont   division(   t   defaultdict(   t   Q(   t	   Predicatet   AppliedPredicate(   t   Addt   Mult   Powt   Integert   Numbert   NumberSymbol(   t   MutableMapping(   t   ImaginaryUnit(   t   fuzzy_ort	   fuzzy_and(   t	   Transform(   t   _sympify(   t   Abs(   t
   Equivalentt   Impliest   Andt   Ort   BooleanFunctiont   Not(   t   MatMult   UnevaluatedOnFreec           B  s    e  Z d  Z d „  Z d „  Z RS(   s  
    Represents a Boolean function that remains unevaluated on free predicates

    This is intended to be a superclass of other classes, which define the
    behavior on singly applied predicates.

    A free predicate is a predicate that is not applied, or a combination
    thereof. For example, Q.zero or Or(Q.positive, Q.negative).

    A singly applied predicate is a free predicate applied everywhere to a
    single expression. For instance, Q.zero(x) and Or(Q.positive(x*y),
    Q.negative(x*y)) are singly applied, but Or(Q.positive(x), Q.negative(y))
    and Or(Q.positive, Q.negative(y)) are not.

    The boolean literals True and False are considered to be both free and
    singly applied.

    This class raises ValueError unless the input is a free predicate or a
    singly applied predicate.

    On a free predicate, this class remains unevaluated. On a singly applied
    predicate, the method apply() is called and returned, or the original
    expression returned if apply() returns None. When apply() is called,
    self.expr is set to the unique expression that the predicates are applied
    at. self.pred is set to the free form of the predicate.

    The typical usage is to create this class with free predicates and
    evaluate it using .rcall().

    c         C  s  t  | ƒ } | j t ƒ } | j t ƒ } | rE | rE t d ƒ ‚ n  | ss t j |  | ƒ } | | _ d  | _	 | Sd „  | Dƒ } t
 | ƒ d k r¤ t d ƒ ‚ n  t j |  | ƒ } | j ƒ  | _	 | j t d „  d „  ƒ ƒ | _ | j ƒ  } | d  k r| S| S(   Ns4   arg must be either completely free or singly appliedc         S  s   h  |  ] } | j  d  ’ q S(   i    (   t   args(   t   .0t   pred(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pys	   <setcomp>@   s   	 i   sD   The AppliedPredicates in arg must be applied to a single expression.c         S  s   |  j  S(   N(   t   func(   t   e(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   <lambda>E   t    c         S  s   t  |  t ƒ S(   N(   t
   isinstanceR   (   R   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR    E   s    (   R   t   atomsR   R   t
   ValueErrorR   t   __new__R   t   Nonet   exprt   lent   popt   xreplaceR   t   apply(   t   clst   argt
   predicatest   applied_predicatest   objt   predicate_argst   applied(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR%   4   s(    		!c         C  s   d  S(   N(    (   t   self(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR+   L   s    (   t   __name__t
   __module__t   __doc__R%   R+   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR      s   	t   AllArgsc           B  s   e  Z d  Z d „  Z RS(   sP  
    Class representing vectorizing a predicate over all the .args of an
    expression

    See the docstring of UnevaluatedOnFree for more information on this
    class.

    The typical usage is to evaluate predicates with expressions using .rcall().

    Example
    =======

    >>> from sympy.assumptions.sathandlers import AllArgs
    >>> from sympy import symbols, Q
    >>> x, y = symbols('x y')
    >>> a = AllArgs(Q.positive | Q.negative)
    >>> a
    AllArgs(Q.negative | Q.positive)
    >>> a.rcall(x*y)
    (Q.negative(x) | Q.positive(x)) & (Q.negative(y) | Q.positive(y))
    c         C  s/   t  g  |  j j D] } |  j j | ƒ ^ q Œ  S(   N(   R   R'   R   R   t   rcall(   R3   R-   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR+   g   s    (   R4   R5   R6   R+   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR7   P   s   t   AnyArgsc           B  s   e  Z d  Z d „  Z RS(   sT  
    Class representing vectorizing a predicate over any of the .args of an
    expression.

    See the docstring of UnevaluatedOnFree for more information on this
    class.

    The typical usage is to evaluate predicates with expressions using .rcall().

    Example
    =======

    >>> from sympy.assumptions.sathandlers import AnyArgs
    >>> from sympy import symbols, Q
    >>> x, y = symbols('x y')
    >>> a = AnyArgs(Q.positive & Q.negative)
    >>> a
    AnyArgs(Q.negative & Q.positive)
    >>> a.rcall(x*y)
    (Q.negative(x) & Q.positive(x)) | (Q.negative(y) & Q.positive(y))
    c         C  s/   t  g  |  j j D] } |  j j | ƒ ^ q Œ  S(   N(   R   R'   R   R   R8   (   R3   R-   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR+   ‚   s    (   R4   R5   R6   R+   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR9   k   s   t   ExactlyOneArgc           B  s   e  Z d  Z d „  Z RS(   sS  
    Class representing a predicate holding on exactly one of the .args of an
    expression.

    See the docstring of UnevaluatedOnFree for more information on this
    class.

    The typical usage is to evaluate predicate with expressions using
    .rcall().

    Example
    =======

    >>> from sympy.assumptions.sathandlers import ExactlyOneArg
    >>> from sympy import symbols, Q
    >>> x, y = symbols('x y')
    >>> a = ExactlyOneArg(Q.positive)
    >>> a
    ExactlyOneArg(Q.positive)
    >>> a.rcall(x*y)
    (Q.positive(x) & ~Q.positive(y)) | (Q.positive(y) & ~Q.positive(x))
    c         C  s†   |  j  } |  j } g  | j D] } | j | ƒ ^ q } t g  t t | ƒ ƒ D]2 } t | | t t	 | |  | | d ƒ Œ ^ qM Œ  S(   Ni   (
   R'   R   R   R8   R   t   rangeR(   R   t   mapR   (   R3   R'   R   R-   t	   pred_argst   i(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR+      s
    		%(   R4   R5   R6   R+   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR:   †   s   c         C  s  t  |  t ƒ s |  S|  j d } d  } |  j t j k rS t | j | j	 g ƒ } n  |  j t j
 k rq | j } n  |  j t j k rž t | j | j g ƒ } n  |  j t j k rË t | j | j g ƒ } n  |  j t j k rø t | j | j g ƒ } n  |  j t j k r4t t | j | j g ƒ | j g ƒ } n  |  j t j k rR| j } n  |  j t j k rp| j } n  |  j t j k rŽ| j } n  |  j t j k r¬| j } n  |  j t j k rÊ| j } n  |  j t j k rè| j  } n  |  j t j! k r| j" } n  | d  k r|  S| S(   Ni    (#   R"   R   R   R&   R   R   t   positiveR   t	   is_finitet   is_positivet   zerot   is_zerot   negativet   is_negativet   nonpositivet   is_nonpositivet   nonzerot
   is_nonzerot   nonnegativeR   t   is_nonnegativet   rationalt   is_rationalt
   irrationalt   is_irrationalt   event   is_event   oddt   is_oddt   integert
   is_integert	   imaginaryt   is_imaginaryt   commutativet   is_commutative(   R0   R   t   ret(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   _old_assump_replacer®   sD    c         C  s   |  j  t t ƒ ƒ S(   sû   
    Replace assumptions of expressions replaced with their values in the old
    assumptions (like Q.negative(-1) => True). Useful because some direct
    computations for numeric objects is defined most conveniently in the old
    assumptions.

    (   R*   R   R[   (   R   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   evaluate_old_assumpÜ   s    t   CheckOldAssumpc           B  s   e  Z d  „  Z RS(   c         C  s!   t  |  j d t |  j d ƒ ƒ S(   Ni    (   R   R   R\   (   R3   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR+   è   s    (   R4   R5   R+   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR]   ç   s   t   CheckIsPrimec           B  s   e  Z d  „  Z RS(   c         C  s-   d d l  m } t |  j d | |  j ƒ ƒ S(   Niÿÿÿÿ(   t   isprimei    (   t   sympyR_   R   R   R'   (   R3   R_   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR+   í   s    (   R4   R5   R+   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR^   ì   s   t   CustomLambdac           B  s    e  Z d  Z d „  Z d „  Z RS(   sn   
    Interface to lambda with rcall

    Workaround until we get a better way to represent certain facts.
    c         C  s   | |  _  d  S(   N(   t   lamda(   R3   Rb   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   __init__ø   s    c         G  s   |  j  | Œ  S(   N(   Rb   (   R3   R   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR8   û   s    (   R4   R5   R6   Rc   R8   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyRa   ò   s   	t   ClassFactRegistryc           B  sP   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   sÐ   
    Register handlers against classes

    ``registry[C] = handler`` registers ``handler`` for class
    ``C``. ``registry[C]`` returns a set of handlers for class ``C``, or any
    of its superclasses.
    c         C  s5   | p	 i  } t  t | ƒ |  _ t t |  ƒ j ƒ  d  S(   N(   R   t	   frozensett   dt   superRd   Rc   (   R3   Rf   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyRc     s    c         C  s   t  | ƒ |  j | <d  S(   N(   Re   Rf   (   R3   t   keyt   item(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   __setitem__  s    c         C  sH   |  j  | } x4 |  j  D]) } t | | ƒ r | |  j  | O} q q W| S(   N(   Rf   t
   issubclass(   R3   Rh   RZ   t   k(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   __getitem__  s
    c         C  s   |  j  | =d  S(   N(   Rf   (   R3   Rh   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   __delitem__  s    c         C  s   |  j  j ƒ  S(   N(   Rf   t   __iter__(   R3   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyRo     s    c         C  s   t  |  j ƒ S(   N(   R(   Rf   (   R3   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   __len__  s    c         C  s   t  |  j ƒ S(   N(   t   reprRf   (   R3   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   __repr__  s    N(   R4   R5   R6   R&   Rc   Rj   Rm   Rn   Ro   Rp   Rr   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyRd   ÿ   s   					c         C  s   | |  c | h O<d  S(   N(    (   t   klasst   factt   registry(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   register_fact&  s    c         C  sB   t  t j |  j ƒ t j |  j ƒ @t j |  j ƒ @t j |  ƒ ƒ S(   N(   R   R   t   realt   baseRP   t   expRJ   (   t   power(    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR    3  s   c         C  sB   t  t j |  j ƒ t j |  j ƒ @t j |  j ƒ @t j |  ƒ ƒ S(   N(   R   R   RJ   Rx   RR   Ry   (   Rz   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR    5  R!   c         C  sB   t  t j |  j ƒ t j |  j ƒ @t j |  j ƒ @t j |  ƒ ƒ S(   N(   R   R   RF   Rx   RR   Ry   RJ   (   Rz   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR    6  R!   c         C  s2   t  t j |  ƒ t j |  j ƒ t j |  j ƒ @ƒ S(   N(   R   R   RB   Rx   R?   Ry   (   Rz   (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyR    :  R!   N(G   t
   __future__R    R   t   collectionsR   t   sympy.assumptions.askR   t   sympy.assumptions.assumeR   R   t
   sympy.coreR   R   R   R	   R
   R   t   sympy.core.compatibilityR   t   sympy.core.numbersR   t   sympy.core.logicR   R   t   sympy.core.rulesR   t   sympy.core.sympifyR   t$   sympy.functions.elementary.complexesR   t   sympy.logic.boolalgR   R   R   R   R   R   t   sympy.matrices.expressionsR   R   R7   R9   R:   R[   R\   R]   R^   t   objectRa   Rd   t   fact_registryRv   RB   t   squaret
   invertibleR?   RD   RX   Rw   t   primeRV   RN   RL   RJ   RT   RP   RR   RH   RF   Rs   Rt   (    (    (    s<   lib/python2.7/site-packages/sympy/assumptions/sathandlers.pyt   <module>   s°   ..;(	.	$	07!! 0  "