U
    9%et                     @  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d	d
ZdddddZdddddZddddddZdddddZd-ddZdddddZddddd Zdddd!d"Zdd#d$d%d&d'Zd(d) Zed*dddd+d,ZdS ).z& Generic SymPy-Independent Strategies     )annotations)CallableMapping)TypeVarstdout_S_T)xreturnc                 C  s   | S N r
   r   r   T/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/strategies/core.pyidentity   s    r   zCallable[[_T], _T])ruler   c                   s   ddd fdd}|S )z0 Apply a rule repeatedly until it has no effect r	   exprr   c                   s*    | |  }}||kr& || }}q|S r   r   )r   newoldr   r   r   exhaustive_rl   s    zexhaust.<locals>.exhaustive_rlr   )r   r   r   r   r   exhaust   s    r   zCallable[[_S], _T]c                   s   i  dd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   c                   s(   |  kr |  S | }| | < |S d S r   r   r   resultcacher   r   r   memoized_rl%   s
    zmemoize.<locals>.memoized_rlr   )r   r   r   r   r   memoize   s    	r   zCallable[[_T], bool])condr   r   c                   s   ddd fdd}|S )z& Only apply rule if condition is true r	   r   c                   s    | r| S | S r   r   r   r   r   r   r   conditioned_rl3   s    z!condition.<locals>.conditioned_rlr   )r   r   r"   r   r!   r   	condition/   s    r#   )rulesr   c                    s   ddd fdd}|S )zQ
    Compose a sequence of rules so that they apply to the expr sequentially
    r	   r   c                   s    D ]}|| } q| S r   r   )r   r   r$   r   r   chain_rl>   s    
zchain.<locals>.chain_rlr   )r$   r&   r   r%   r   chain:   s    r'   Nc                   s    dkrt   fdd}|S )z? Print out before and after expressions each time rule is used Nc                    s@   | d }| |}||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   r-   r.   r   r,   r   debugE   s    r/   zCallable[[_T], _T | None]c                   s   ddd fdd}|S )z+ Return original expr if rule returns None r	   r   c                   s    | }|d kr| S |S r   r   r   r   r   r   null_safe_rlV   s    znull_safe.<locals>.null_safe_rlr   )r   r0   r   r   r   	null_safeT   s    r1   c                   s   ddd fdd}|S )z/ Return original expr if rule raises exception r	   r   c                   s(   z
| W S   k
r"   |  Y S X d S r   r   r    	exceptionr   r   r   try_rl`   s    
ztryit.<locals>.try_rlr   )r   r3   r4   r   r2   r   tryit^   s    r5   c                    s   ddd fdd}|S )z3 Try each of the rules until one works. Then stop. 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_rlr   )r$   r7   r   r%   r   do_oneh   s    r8   zMapping[_T, Callable[[_S], _S]]zCallable[[_S], _S])keyruledictr   c                   s   ddd fdd}|S )zA Select a rule based on the result of key called on the function r   r   c                   s     | t}|| S r   )getr   )r   r6   r9   r:   r   r   	switch_rlx   s    zswitch.<locals>.switch_rlr   )r9   r:   r=   r   r<   r   switchs   s    r>   c                 C  s   | S r   r   r   r   r   r   	_identity   s    r?   )	objectivec                   s   dd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   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>)r9   )minr    r@   r$   r    r   minrule   s    zminimize.<locals>.minruler   )r@   r$   rE   r   rD   r   minimize   s    rF   )N)__doc__
__future__r   collections.abcr   r   typingr   sysr   r   r	   r   r   r   r#   r'   r/   r1   r5   r8   r>   r?   rF   r   r   r   r   <module>   s&   



