o
    8Va}                     @   sh   d Z dd Zdd Zdd Zdd Zd	d
 ZdddZdd Zdd Zdd Z	dd Z
edddZdS )z& Generic SymPy-Independent Strategies c                 C   s   | S N )xr   r   7/usr/lib/python3/dist-packages/sympy/strategies/core.py<lambda>   s    r   c                        fdd}|S )z0 Apply a rule repeatedly until it has no effect c                    s0    | | }}||kr ||}}||ks|S r   r   )exprnewoldruler   r   exhaustive_rl   s
   zexhaust.<locals>.exhaustive_rlr   )r   r   r   r
   r   exhaust   s   r   c                    s   i   fdd}|S )z Memoized version of a rule c                    s$   |  v r |  S | }| | < |S r   r   r   resultcacher   r   r   memoized_rl   s
   zmemoize.<locals>.memoized_rlr   )r   r   r   r   r   memoize   s   r   c                        fdd}|S )z& Only apply rule if condition is true c                    s    | r| S | S r   r   r   condr   r   r   conditioned_rl   s   z!condition.<locals>.conditioned_rlr   )r   r   r   r   r   r   	condition      r   c                     r   )zQ
    Compose a sequence of rules so that they apply to the expr sequentially
    c                    s    D ]}|| } q| S r   r   )r   r   rulesr   r   chain_rl'   s   
zchain.<locals>.chain_rlr   )r   r   r   r   r   chain#   s   r   Nc                    s*    du rddl m} |  fdd}|S )z? Print out before and after expressions each time rule is used N    )stdoutc                     sD   | d }| i |}||kr   dj    d||f  |S )Nr   z	Rule: %s
zIn:   %s
Out:  %s

)write__name__)argskwargsr   r   filer   r   r   debug_rl2   s   zdebug.<locals>.debug_rl)sysr    )r   r&   r    r'   r   r%   r   debug-   s
   r)   c                    r   )z+ Return original expr if rule returns None c                    s    | }|d u r
| S |S r   r   r   r
   r   r   null_safe_rl=   s   znull_safe.<locals>.null_safe_rlr   )r   r*   r   r
   r   	null_safe;      r+   c                    r   )z/ Return original expr if rule raises exception c                    s"   z| W S   y   |  Y S w r   r   r   	exceptionr   r   r   try_rlG   s
   
ztryit.<locals>.try_rlr   )r   r.   r/   r   r-   r   tryitE   r   r0   c                     r   )z3 Try each of the rules until one works. Then stop. c                    s&    D ]}|| }|| kr|  S q| S r   r   )r   rlr   r   r   r   	do_one_rlP   s   zdo_one.<locals>.do_one_rlr   )r   r2   r   r   r   do_oneN   r,   r3   c                    r   )zA Select a rule based on the result of key called on the function c                    s     | t}|| S r   )getidentity)r   r1   keyruledictr   r   	switch_rlZ   s   zswitch.<locals>.switch_rlr   )r7   r8   r9   r   r6   r   switchX   s   r:   )	objectivec                    r   )a-   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
    c                    s   t  fddD dS )Nc                    s   g | ]}| qS r   r   ).0r   r   r   r   
<listcomp>o   s    z-minimize.<locals>.minrule.<locals>.<listcomp>)r7   )minr   r;   r   r   r   minrulen   s   zminimize.<locals>.minruler   )r;   r   r@   r   r?   r   minimize_   s   rA   r   )__doc__r5   r   r   r   r   r)   r+   r0   r3   r:   rA   r   r   r   r   <module>   s    		


	
