
    gt                        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
Zd$dZd%dZd&dZd'dZd(dZd)dZd$dZd'dZd*dZd  Zed!d+d"ZdS ),z& Generic SymPy-Independent Strategies     )annotations)CallableMapping)TypeVarstdout_S_Txreturnc                    | S N r   s    Q/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/strategies/core.pyidentityr          H    ruleCallable[[_T], _T]c                     d fd}|S )z0 Apply a rule repeatedly until it has no effect exprr
   r   c                T     |           | }}||k    r |          |}}||k    |S r   r   )r   newoldr   s      r   exhaustive_rlzexhaust.<locals>.exhaustive_rl   s>    4::tSSjjtCyy#C Sjj
r   r   r
   r   r
   r   )r   r   s   ` r   exhaustr      s)         
 r   Callable[[_S], _T]c                     i d f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                @    | v r|          S  |           }|| <   |S r   r   )r   resultcacher   s     r   memoized_rlzmemoize.<locals>.memoized_rl%   s1    5==;T$ZZF E$KMr   r   r	   r   r
   r   )r   r$   r#   s   ` @r   memoizer&      s6     E       r   condCallable[[_T], bool]c                     d fd}|S )z& Only apply rule if condition is true r   r
   r   c                4     |           r |           S | S r   r   )r   r'   r   s    r   conditioned_rlz!condition.<locals>.conditioned_rl3   s&    4:: 	4::r   r   r   )r'   r   r+   s   `` r   	conditionr,   /   s/           r   rulesc                      d fd}|S )zQ
    Compose a sequence of rules so that they apply to the expr sequentially
    r   r
   r   c                (    D ]} ||           } | S r   r   )r   r   r-   s     r   chain_rlzchain.<locals>.chain_rl>   s&     	 	D4::DDr   r   r   )r-   r0   s   ` r   chainr1   :   s(          Or   Nc                (     t            fd}|S )z? Print out before and after expressions each time rule is used Nc                     | d         } | i |}||k    r9                     dj        z                                  d|d|d           |S )Nr   z	Rule: %s
zIn:   z
Out:  z

)write__name__)argskwargsr   r"   filer   s       r   debug_rlzdebug.<locals>.debug_rlJ   sh    Awt&v&&T>>JJ|dm3444JJJ444@AAAr   r   )r   r8   r9   s   `` r   debugr:   E   s3    |      Or   Callable[[_T], _T | None]c                     d fd}|S )z+ Return original expr if rule returns None r   r
   r   c                &     |           }|| S |S r   r   )r   r"   r   s     r   null_safe_rlznull_safe.<locals>.null_safe_rlV   s    d>Kr   r   r   )r   r>   s   ` r   	null_safer?   T   s)         
 r   c                     d fd}|S )z/ Return original expr if rule raises exception r   r
   r   c                6    	  |           S # $ r | cY S w xY wr   r   )r   	exceptionr   s    r   try_rlztryit.<locals>.try_rl`   s:    	4:: 	 	 	KKK	s   
 r   r   )r   rB   rC   s   `` r   tryitrD   ^   s.          
 Mr   c                      d fd}|S )z3 Try each of the rules until one works. Then stop. r   r
   r   c                <    D ]} ||           }|| k    r|c S | S r   r   )r   rlr"   r-   s      r   	do_one_rlzdo_one.<locals>.do_one_rlj   s;     	 	BRXXF~~ r   r   r   )r-   rH   s   ` r   do_onerI   h   s)          r   keyruledictMapping[_T, Callable[[_S], _S]]Callable[[_S], _S]c                     d fd}|S )zA Select a rule based on the result of key called on the function r   r	   r   c                b                          |           t                    } ||           S r   )getr   )r   rG   rJ   rK   s     r   	switch_rlzswitch.<locals>.switch_rlx   s+    \\##d))X..r$xxr   )r   r	   r   r	   r   )rJ   rK   rQ   s   `` r   switchrR   s   s/    
       r   c                    | S r   r   r   s    r   	_identityrT      r   r   )	objectivec                     d f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                @     t           fdD                       S )Nc                &    g | ]} |          S r   r   ).0r   r   s     r   
<listcomp>z-minimize.<locals>.minrule.<locals>.<listcomp>   s!    1114DDJJ111r   )rJ   )min)r   rU   r-   s   `r   minrulezminimize.<locals>.minrule   s,    11115111yAAAAr   r%   r   )rU   r-   r\   s   `` r   minimizer]      s3    "B B B B B B BNr   )r   r
   r   r
   )r   r   r   r   )r   r   r   r   )r'   r(   r   r   r   r   )r-   r   r   r   r   )r   r;   r   r   )rJ   r   rK   rL   r   rM   )r-   r   r   r   )__doc__
__future__r   collections.abcr   r   typingr   sysr   r	   r
   r   r   r&   r,   r1   r:   r?   rD   rI   rR   rT   r]   r   r   r   <module>rc      sy   , , " " " " " " - - - - - - - -             WT]]WT]]         *                               r   