o
    GZht                     @  s   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 edZ
edZd/d
dZd0ddZd1ddZd2ddZd3ddZd4ddZd5ddZd0d d!Zd3d"d#Zd6d(d)Zd*d+ Zed,d7d-d.ZdS )8z& Generic SymPy-Independent Strategies     )annotations)CallableMapping)TypeVarstdout_S_Txreturnc                 C     | S N r
   r   r   D/var/www/auris/lib/python3.10/site-packages/sympy/strategies/core.pyidentity      r   ruleCallable[[_T], _T]c                      d fdd}|S )z0 Apply a rule repeatedly until it has no effect exprr	   r   c                   s0    | | }}||kr ||}}||ks|S r   r   )r   newoldr   r   r   exhaustive_rl   s
   zexhaust.<locals>.exhaustive_rlNr   r	   r   r	   r   )r   r   r   r   r   exhaust      r   Callable[[_S], _T]c                   s   i  d fdd}|S )	zMemoized version of a rule

    Notes
    =====

    This cache can grow infinitely, so it is not recommended to use this
    than ``functools.lru_cache`` unless you need very heavy computation.
    r   r   r   r	   c                   s$   |  v r |  S | }| | < |S r   r   r   resultcacher   r   r   memoized_rl%   s
   zmemoize.<locals>.memoized_rlNr   r   r   r	   r   )r   r#   r   r!   r   memoize   s   	r%   condCallable[[_T], bool]c                      d fdd}|S )z& Only apply rule if condition is true r   r	   r   c                   s    | r| S | S r   r   r   r&   r   r   r   conditioned_rl3   s   z!condition.<locals>.conditioned_rlNr   r   )r&   r   r+   r   r*   r   	condition/   s   r,   rulesc                    r   )zQ
    Compose a sequence of rules so that they apply to the expr sequentially
    r   r	   r   c                   s    D ]}|| } q| S r   r   )r   r   r-   r   r   chain_rl>   s   
zchain.<locals>.chain_rlNr   r   )r-   r/   r   r.   r   chain:   s   r0   Nc                   s    du rt   fdd}|S )z? Print out before and after expressions each time rule is used Nc                    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_rlJ   s   zdebug.<locals>.debug_rlr   )r   r6   r7   r   r5   r   debugE   s   r8   Callable[[_T], _T | None]c                   r   )z+ Return original expr if rule returns None r   r	   r   c                   s    | }|d u r
| S |S r   r   r   r   r   r   null_safe_rlV   s   znull_safe.<locals>.null_safe_rlNr   r   )r   r:   r   r   r   	null_safeT   r   r;   c                   r(   )z/ Return original expr if rule raises exception r   r	   r   c                   s"   z| W S   y   |  Y S w r   r   r)   	exceptionr   r   r   try_rl`   s
   
ztryit.<locals>.try_rlNr   r   )r   r=   r>   r   r<   r   tryit^   s   r?   c                    r   )z3 Try each of the rules until one works. Then stop. r   r	   r   c                   s&    D ]}|| }|| kr|  S q| S r   r   )r   rlr    r.   r   r   	do_one_rlj   s   zdo_one.<locals>.do_one_rlNr   r   )r-   rA   r   r.   r   do_oneh   s   rB   keyruledictMapping[_T, Callable[[_S], _S]]Callable[[_S], _S]c                   r(   )zA Select a rule based on the result of key called on the function r   r   r   c                   s     | t}|| S r   )getr   )r   r@   rC   rD   r   r   	switch_rlx   s   zswitch.<locals>.switch_rlN)r   r   r   r   r   )rC   rD   rI   r   rH   r   switchs   s   rJ   c                 C  r   r   r   r   r   r   r   	_identity   r   rK   )	objectivec                   s   d fdd}|S )	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
    r   r   r   r	   c                   s   t  fddD dS )Nc                   s   g | ]}| qS r   r   ).0r   r)   r   r   
<listcomp>   s    z-minimize.<locals>.minrule.<locals>.<listcomp>)rC   )minr)   rL   r-   r)   r   minrule   s   zminimize.<locals>.minruleNr$   r   )rL   r-   rQ   r   rP   r   minimize   s   rR   )r
   r	   r   r	   )r   r   r   r   )r   r   r   r   )r&   r'   r   r   r   r   )r-   r   r   r   r   )r   r9   r   r   )rC   r   rD   rE   r   rF   )r-   r   r   r   )__doc__
__future__r   collections.abcr   r   typingr   sysr   r   r	   r   r   r%   r,   r0   r8   r;   r?   rB   rJ   rK   rR   r   r   r   r   <module>   s(    












