U
    ZÊ¹jt  ã                   @  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/bwave/python/venv/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 )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.
    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&   



þ