ó
¡¼™\c           @  sŸ   d  Z  d d l m Z m Z d d l m Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d d	 „ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d S(   s&    Generic SymPy-Independent Strategies iÿÿÿÿ(   t   print_functiont   division(   t   get_function_namec         C  s   |  S(   N(    (   t   x(    (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   <lambda>   t    c           s   ‡  f d †  } | S(   s0    Apply a rule repeatedly until it has no effect c           s=   ˆ  |  ƒ |  } } x# | | k r8 ˆ  | ƒ | } } q W| S(   N(    (   t   exprt   newt   old(   t   rule(    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   exhaustive_rl
   s    (    (   R	   R
   (    (   R	   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   exhaust   s    c           s   i  ‰  ‡  ‡ f d †  } | S(   s    Memoized version of a rule c           s2   |  ˆ  k r ˆ  |  Sˆ |  ƒ } | ˆ  |  <| Sd  S(   N(    (   R   t   result(   t   cacheR	   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   memoized_rl   s
    
(    (   R	   R   (    (   R   R	   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   memoize   s    c           s   ‡  ‡ f d †  } | S(   s&    Only apply rule if condition is true c           s   ˆ  |  ƒ r ˆ |  ƒ S|  Sd  S(   N(    (   R   (   t   condR	   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   conditioned_rl   s    
(    (   R   R	   R   (    (   R   R	   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt	   condition   s    c            s   ‡  f d †  } | S(   sQ   
    Compose a sequence of rules so that they apply to the expr sequentially
    c           s!   x ˆ  D] } | |  ƒ }  q W|  S(   N(    (   R   R	   (   t   rules(    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   chain_rl*   s    (    (   R   R   (    (   R   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   chain&   s    c           s;   ˆ  d k r% d d l m } | ‰  n  ‡  ‡ f d †  } | S(   s?    Print out before and after expressions each time rule is used iÿÿÿÿ(   t   stdoutc            sZ   |  d } ˆ |  | Ž  } | | k rV ˆ  j  d t ˆ ƒ ƒ ˆ  j  d | | f ƒ n  | S(   Ni    s	   Rule: %s
s   In:   %s
Out:  %s

(   t   writeR   (   t   argst   kwargsR   R   (   t   fileR	   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   debug_rl5   s    
N(   t   Nonet   sysR   (   R	   R   R   R   (    (   R   R	   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   debug0   s
    	c           s   ‡  f d †  } | S(   s+    Return original expr if rule returns None c           s$   ˆ  |  ƒ } | d  k r |  S| Sd  S(   N(   R   (   R   R   (   R	   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   null_safe_rl@   s    (    (   R	   R   (    (   R	   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt	   null_safe>   s    c           s   ‡  f d †  } | S(   s/    Return original expr if rule raises exception c           s'   y ˆ  |  ƒ SWn t  k
 r" |  SXd  S(   N(   t	   Exception(   R   (   R	   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   try_rlJ   s    (    (   R	   R"   (    (   R	   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   tryitH   s    c            s   ‡  f d †  } | S(   s3    Try each of the rules until one works. Then stop. c           s1   x* ˆ  D]" } | |  ƒ } | |  k r | Sq W|  S(   N(    (   R   t   rlR   (   R   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt	   do_one_rlS   s
    (    (   R   R%   (    (   R   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   do_oneQ   s    c           s   ‡  ‡ f d †  } | S(   sA    Select a rule based on the result of key called on the function c           s"   ˆ j  ˆ  |  ƒ t ƒ } | |  ƒ S(   N(   t   gett   identity(   R   R$   (   t   keyt   ruledict(    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt	   switch_rl]   s    (    (   R)   R*   R+   (    (   R)   R*   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   switch[   s    c         C  s   |  S(   N(    (   R   (    (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyR   b   R   c            s(   | j  d t ƒ ‰  ‡  ‡ f d †  } | S(   s-   Select result of rules that minimizes objective

    >>> from sympy.strategies import minimize
    >>> inc = lambda x: x + 1
    >>> dec = lambda x: x - 1
    >>> rl = minimize(inc, dec)
    >>> rl(4)
    3

    >>> rl = minimize(inc, dec, objective=lambda x: -x)  # maximize
    >>> rl(4)
    5
    t	   objectivec           s)   t  g  ˆ D] } | |  ƒ ^ q
 d ˆ  ƒS(   NR)   (   t   min(   R   R	   (   R-   R   (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   minrulet   s    (   R'   R(   (   R   R   R/   (    (   R-   R   s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   minimized   s    N(   t   __doc__t
   __future__R    R   t   sympy.core.compatibilityR   R(   R   R   R   R   R   R   R    R#   R&   R,   R0   (    (    (    s4   lib/python2.7/site-packages/sympy/strategies/core.pyt   <module>   s   							
	
			
		