ó
    ‹*£ht  ã                  óö   • S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	  \" S5      r
\" S5      rSS jrSS	 jrSS
 jr      SS jrSS jrSS jrSS jrSS jrSS jr      SS jrS r\S.   SS jjrg)z%Generic SymPy-Independent Strategies é    )Úannotations)ÚCallableÚMapping)ÚTypeVar©ÚstdoutÚ_SÚ_Tc                ó   • U $ ©N© ©Úxs    ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/strategies/core.pyÚidentityr      ó   € Ø€Hó    c                ó   ^ • SU 4S jjnU$ )z/Apply a rule repeatedly until it has no effect c                óD   >• T" U 5      U p!X:w  a  T" U5      Up!X:w  a  M  U$ r   r   )ÚexprÚnewÚoldÚrules      €r   Úexhaustive_rlÚexhaust.<locals>.exhaustive_rl   s*   ø€ Ù˜“:˜tˆSØ‹jÙ˜C“y #�ð �jàˆ
r   ©r   r
   Úreturnr
   r   )r   r   s   ` r   Úexhaustr      s   ø€ ÷ð
 Ðr   c                ó    ^ ^• 0 mSUU 4S jjnU$ )z³Memoized 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                ó8   >• U T;   a  TU    $ T" U 5      nUTU '   U$ r   r   )r   ÚresultÚcacher   s     €€r   Úmemoized_rlÚmemoize.<locals>.memoized_rl%   s+   ø€ Ø�5‹=Ø˜‘;Ðá˜$“ZˆFØ ˆE�$‰KØˆMr   ©r   r	   r   r
   r   )r   r#   r"   s   ` @r   Úmemoizer&      s   ù€ ð €E÷ð ð Ðr   c                ó   ^ ^• SU U4S jjnU$ )z%Only apply rule if condition is true c                ó2   >• T" U 5      (       a  T" U 5      $ U $ r   r   )r   Úcondr   s    €€r   Úconditioned_rlÚ!condition.<locals>.conditioned_rl3   s   ø€ Ù��:‰:Ù˜“:ÐØˆr   r   r   )r)   r   r*   s   `` r   Ú	conditionr,   /   s   ù€ ÷ð ð Ðr   c                 ó   ^ • SU 4S jjnU$ )zI
Compose a sequence of rules so that they apply to the expr sequentially
c                ó*   >• T H  nU" U 5      n M     U $ r   r   )r   r   Úruless     €r   Úchain_rlÚchain.<locals>.chain_rl>   s   ø€ ÛˆDÙ˜“:ŠDñ àˆr   r   r   )r/   r0   s   ` r   Úchainr2   :   s   ø€ ÷ð €Or   Nc                ó*   ^ ^• Tc  [         mUU 4S jnU$ )z>Print out before and after expressions each time rule is used c                 óœ   >• U S   nT" U 0 UD6nX2:w  a8  TR                  STR                  -  5        TR                  SU< SU< S35        U$ )Nr   z	Rule: %s
zIn:   z
Out:  z

)ÚwriteÚ__name__)ÚargsÚkwargsr   r!   Úfiler   s       €€r   Údebug_rlÚdebug.<locals>.debug_rlJ   sK   ø€ Ø�A‰wˆÙ�tÐ&˜vÑ&ˆØ‹>Ø�J‰J�| d§m¡mÑ3Ô4Ø�JŠJ³4»Ð@ÔAØˆr   r   )r   r9   r:   s   `` r   Údebugr<   E   s   ù€ à�|Üˆöð €Or   c                ó   ^ • SU 4S jjnU$ )z*Return original expr if rule returns None c                ó"   >• T" U 5      nUc  U $ U$ r   r   )r   r!   r   s     €r   Únull_safe_rlÚnull_safe.<locals>.null_safe_rlV   s   ø€ Ù�d“ˆØ‰>ØˆKØˆr   r   r   )r   r?   s   ` r   Ú	null_saferA   T   s   ø€ ÷ð
 Ðr   c                ó   ^ ^• SUU 4S jjnU$ )z.Return original expr if rule raises exception c                ó2   >•  T" U 5      $ ! T a    U s $ f = fr   r   )r   Ú	exceptionr   s    €€r   Útry_rlÚtryit.<locals>.try_rl`   s&   ø€ ð	Ù˜“:ÐøØó 	ØŠKð	ús   ƒ ‹•r   r   )r   rD   rE   s   `` r   ÚtryitrG   ^   s   ù€ ÷ð ð
 €Mr   c                 ó   ^ • SU 4S jjnU$ )z2Try each of the rules until one works. Then stop. c                ó<   >• T H  nU" U 5      nX :w  d  M  Us  $    U $ r   r   )r   Úrlr!   r/   s      €r   Ú	do_one_rlÚdo_one.<locals>.do_one_rlj   s'   ø€ ÛˆBÙ˜“XˆFØ�~Ø’ñ ð ˆr   r   r   )r/   rK   s   ` r   Údo_onerM   h   s   ø€ ÷ð Ðr   c                ó   ^ ^• SU U4S jjnU$ )z@Select a rule based on the result of key called on the function c                óL   >• TR                  T" U 5      [        5      nU" U 5      $ r   )Úgetr   )r   rJ   ÚkeyÚruledicts     €€r   Ú	switch_rlÚswitch.<locals>.switch_rlx   s    ø€ Ø�\‰\™#˜d›)¤XÓ.ˆÙ�$‹xˆr   )r   r	   r   r	   r   )rQ   rR   rS   s   `` r   ÚswitchrU   s   s   ù€ ÷
ð ð Ðr   c                ó   • U $ r   r   r   s    r   Ú	_identityrW   €   r   r   )Ú	objectivec                ó   ^ ^• SU U4S jjnU$ )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                óN   >• [        T Vs/ s H
  o" U 5      PM     snTS9$ s  snf )N)rQ   )Úmin)r   r   rX   r/   s     €€r   ÚminruleÚminimize.<locals>.minrule•   s&   ø€ Ü©5Ó1ª5 4�D˜–J©5Ñ1°yÑAÐAùÒ1s   ‹"r%   r   )rX   r/   r\   s   `` r   Úminimizer^   „   s   ù€ ÷"Bð Bà€Nr   )r   r
   r   r
   )r   úCallable[[_T], _T]r   r_   )r   úCallable[[_S], _T]r   r`   )r)   zCallable[[_T], bool]r   r_   r   r_   )r/   r_   r   r_   r   )r   zCallable[[_T], _T | None]r   r_   )rQ   r`   rR   zMapping[_T, Callable[[_S], _S]]r   zCallable[[_S], _S])r/   r`   r   r`   )Ú__doc__Ú
__future__r   Úcollections.abcr   r   Útypingr   Úsysr   r	   r
   r   r   r&   r,   r2   r<   rA   rG   rM   rU   rW   r^   r   r   r   Ú<module>rf      s­   ðÙ ,Ý "ß -Ý Ý ñ ˆTƒ]€ÙˆTƒ]€ôôôð*Ø
ðØ&8ðàôôôôôôðØ	ðà-ðð ôòð ñØðð ör   