
    wgt                        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y)z& Generic SymPy-Independent Strategies     )annotations)CallableMapping)TypeVarstdout_S_Tc                    | S N xs    Z/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/strategies/core.pyidentityr          H    c                     d fd}|S )z0 Apply a rule repeatedly until it has no effect c                F     |       | }}||k7  r |      |}}||k7  r|S r   r   )exprnewoldrules      r   exhaustive_rlzexhaust.<locals>.exhaustive_rl   s2    :tSSjCy#C Sj
r   r   r
   returnr
   r   )r   r   s   ` r   exhaustr      s    
 r   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.
    c                4    | v r|    S  |       }|| <   |S r   r   )r   resultcacher   s     r   memoized_rlzmemoize.<locals>.memoized_rl%   s+    5=;$ZF E$KMr   r   r	   r   r
   r   )r   r"   r!   s   ` @r   memoizer$      s     E r   c                     d fd}|S )z& Only apply rule if condition is true c                (     |       r |       S | S r   r   )r   condr   s    r   conditioned_rlz!condition.<locals>.conditioned_rl3   s    ::r   r   r   )r'   r   r(   s   `` r   	conditionr)   /   s     r   c                      d fd}|S )zQ
    Compose a sequence of rules so that they apply to the expr sequentially
    c                &    D ]
  } ||       }  | S r   r   )r   r   ruless     r   chain_rlzchain.<locals>.chain_rl>   s      	D:D	r   r   r   )r,   r-   s   ` r   chainr.   :   s     Or   Nc                &     t          fd}|S )z? Print out before and after expressions each time rule is used c                     | d   } | i |}||k7  r6j                  dj                  z         j                  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   sM    Awt&v&T>JJ|dmm34JJ4@Ar   r   )r   r5   r6   s   `` r   debugr7   E   s    | Or   c                     d fd}|S )z+ Return original expr if rule returns None 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 c                0    	  |       S # $ r | cY S w xY wr   r   )r   	exceptionr   s    r   try_rlztryit.<locals>.try_rl`   s&    	: 	K	s    r   r   )r   r>   r?   s   `` r   tryitr@   ^   s    
 Mr   c                      d fd}|S )z3 Try each of the rules until one works. Then stop. c                8    D ]  } ||       }|| k7  s|c S  | S r   r   )r   rlr    r,   s      r   	do_one_rlzdo_one.<locals>.do_one_rlj   s.     	BXF~	 r   r   r   )r,   rD   s   ` r   do_onerE   h   s     r   c                     d fd}|S )zA Select a rule based on the result of key called on the function c                L    j                   |       t              } ||       S r   )getr   )r   rC   keyruledicts     r   	switch_rlzswitch.<locals>.switch_rlx   s     \\#d)X.$xr   )r   r	   r   r	   r   )rI   rJ   rK   s   `` r   switchrL   s   s    
 r   c                    | S r   r   r   s    r   	_identityrN      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
    c                P    t        D cg c]
  } ||        c}      S c c}w )N)rI   )min)r   r   rO   r,   s     r   minrulezminimize.<locals>.minrule   s"    514DJ1yAA1s   #r#   r   )rO   r,   rS   s   `` r   minimizerT      s    "BNr   )r   r
   r   r
   )r   Callable[[_T], _T]r   rU   )r   Callable[[_S], _T]r   rV   )r'   zCallable[[_T], bool]r   rU   r   rU   )r,   rU   r   rU   r   )r   zCallable[[_T], _T | None]r   rU   )rI   rV   rJ   zMapping[_T, Callable[[_S], _S]]r   zCallable[[_S], _S])r,   rV   r   rV   )__doc__
__future__r   collections.abcr   r   typingr   sysr   r	   r
   r   r   r$   r)   r.   r7   r;   r@   rE   rL   rN   rT   r   r   r   <module>r\      s    , " -   T]T]*
&8	-   r   