o
    ÿÅ&iÕ  ã                   @   s   ddd„Z dd„ ZdS )Úprintc                    sd   ˆsdd„ ‰nˆdkrdg‰‡fdd„‰ˆsdd„ ‰nˆdkr(dg‰‡fdd	„‰‡ ‡‡fd
d„}|S )az  
    Returns a wrapped copy of *f* that monitors evaluation by calling
    *input* with every input (*args*, *kwargs*) passed to *f* and
    *output* with every value returned from *f*. The default action
    (specify using the special string value ``'print'``) is to print
    inputs and outputs to stdout, along with the total evaluation
    count::

        >>> from mpmath import *
        >>> mp.dps = 5; mp.pretty = False
        >>> diff(monitor(exp), 1)   # diff will eval f(x-h) and f(x+h)
        in  0 (mpf('0.99999999906867742538452148'),) {}
        out 0 mpf('2.7182818259274480055282064')
        in  1 (mpf('1.0000000009313225746154785'),) {}
        out 1 mpf('2.7182818309906424675501024')
        mpf('2.7182808')

    To disable either the input or the output handler, you may
    pass *None* as argument.

    Custom input and output handlers may be used e.g. to store
    results for later analysis::

        >>> mp.dps = 15
        >>> input = []
        >>> output = []
        >>> findroot(monitor(sin, input.append, output.append), 3.0)
        mpf('3.1415926535897932')
        >>> len(input)  # Count number of evaluations
        9
        >>> print(input[3]); print(output[3])
        ((mpf('3.1415076583334066'),), {})
        8.49952562843408e-5
        >>> print(input[4]); print(output[4])
        ((mpf('3.1415928201669122'),), {})
        -1.66577118985331e-7

    c                 S   ó   d S ©N© ©Úvr   r   ú;C:\wamp64\www\opt\env\Lib\site-packages\mpmath/usertools.pyÚ<lambda>*   ó    zmonitor.<locals>.<lambda>r   é    c                    s2   | \}}t dˆ d ||f ƒ ˆ d  d7  < d S )Nzin  %s %r %rr
   é   ©r   )ÚvalueÚargsÚkwargs)Úincountr   r   Úinput-   s   zmonitor.<locals>.inputc                 S   r   r   r   r   r   r   r   r   2   r	   c                    s(   t dˆ d | f ƒ ˆ d  d7  < d S )Nz	out %s %rr
   r   r   )r   )Úoutcountr   r   Úoutput5   s   zmonitor.<locals>.outputc                     s&   ˆ| |fƒ ˆ | i |¤Ž}ˆ|ƒ |S r   r   )r   r   r   )Úfr   r   r   r   Úf_monitored8   s   zmonitor.<locals>.f_monitoredr   )r   r   r   r   r   )r   r   r   r   r   r   Úmonitor   s   '

r   c                    s   ˆ  d¡}dˆv rˆd= ˆsˆr-tˆƒdkr$ˆs$ˆd ‰ ‡ ‡fdd„}n‡‡‡fdd„}nˆ}ddlm} |ƒ }|ƒ }|ƒ }|| }	|	dksH|rJ|	S td	ƒD ]/}
|ƒ }|ƒ  |ƒ  |ƒ  |ƒ  |ƒ  |ƒ  |ƒ  |ƒ  |ƒ  |ƒ  |ƒ }t|	|| d
 ƒ}	qN|	S )zò
    Returns time elapsed for evaluating ``f()``. Optionally arguments
    may be passed to time the execution of ``f(*args, **kwargs)``.

    If the first call is very quick, ``f`` is called
    repeatedly and the best time is returned.
    Úoncer   r
   c                      s   ˆˆ ƒS r   r   r   )Úargr   r   r   r   M   s    ztiming.<locals>.<lambda>c                      s   ˆˆ i ˆ¤ŽS r   r   r   )r   r   r   r   r   r   O   s    )Údefault_timergš™™™™™©?é   é
   )ÚgetÚlenZtimeitr   ÚrangeÚmin)r   r   r   r   ÚgÚclockÚt1r   Út2ÚtÚir   )r   r   r   r   r   Útiming?   s&   
<r&   N)r   r   )r   r&   r   r   r   r   Ú<module>   s   
=