o
    Eb)                     @   s&  d Z ddlZddlmZmZmZmZmZmZm	Z	 ddl
mZ ddlZddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ G dd dZdd Zdd Zdd Z dd Z!dd Z"G dd dZ#G dd dZ$G dd dZ%G dd dZ&G dd  d Z'G d!d" d"Z(dS )#z7
Unit tests for optimization routines from minpack.py.
    N)assert_assert_almost_equalassert_array_equalassert_array_almost_equalassert_allcloseassert_warnssuppress_warnings)raises)arrayfloat64)
ThreadPool)optimize)lambertw)leastsq	curve_fitfixed_point)OptimizeWarningc                   @   s    e Zd ZdZdd Zdd ZdS )ReturnShapezThis class exists to create a callable that does not have a '__name__' attribute.

    __init__ takes the argument 'shape', which should be a tuple of ints. When an instance
    is called with a single argument 'x', it returns numpy.ones(shape).
    c                 C   s
   || _ d S N)shape)selfr    r   C/usr/lib/python3/dist-packages/scipy/optimize/tests/test_minpack.py__init__   s   
zReturnShape.__init__c                 C   s   t | jS r   )nponesr   )r   xr   r   r   __call__      zReturnShape.__call__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    r   c                 C   s
   t |S )zUA function that returns an array of ones of the given shape.
    `x` is ignored.
    )r   r   )r   r   r   r   r   
dummy_func"   s   
r#   c                 C   s@   t t| }|dd | W  d    S 1 sw   Y  d S )Nc                 S   s   |  S r   r   )fr   r   r   <lambda>+   s    z#sequence_parallel.<locals>.<lambda>)r   lenmap)ZfsZpoolr   r   r   sequence_parallel)   s   $r(   c                 C   s6   || d  }t |dd |d  |  | f}|S )a  Evaluate non-linear equation system representing
    the pressures and flows in a system of n parallel pipes::

        f_i = P_i - P_0, for i = 1..n
        f_0 = sum(Q_i) - Qtot

    where Q_i is the flow rate in pipe i and P_i the pressure in that pipe.
    Pressure is modeled as a P=kQ**2 where k is a valve coefficient and
    Q is the flow rate.

    Parameters
    ----------
    flow_rates : float
        A 1-D array of n flow rates [kg/s].
    k : float
        A 1-D array of n valve coefficients [1/kg m].
    Qtot : float
        A scalar, the total input flow rate [kg/s].

    Returns
    -------
    F : float
        A 1-D array, F[i] == f_i.

          Nr   )r   Zhstacksum)
flow_ratesQtotkPFr   r   r   pressure_network2   s   &r1   c                 C   s   t | }t| dd d |dd  d| d  |d   }t||f}|d |d|d d|d f< d|d|d |d f< t|||d ddf< |S )a  Return the jacobian of the equation system F(flow_rates)
    computed by `pressure_network` with respect to
    *flow_rates*. See `pressure_network` for the detailed
    description of parrameters.

    Returns
    -------
    jac : float
        *n* by *n* matrix ``df_i/dQ_i`` where ``n = len(flow_rates)``
        and *f_i* and *Q_i* are described in the doc for `pressure_network`
    r*   Nr)   r   )r&   r   diagemptyr   )r,   r-   r.   nZpdiffjacr   r   r   pressure_network_jacobianQ   s   6 r6   c                 C   s   t | ||t| ||fS r   )r1   r6   )r,   r-   r.   r   r   r   pressure_network_fun_and_gradh   s   

r7   c                   @   st   e Z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d Zdd Zdd ZdS )
TestFSolvec                 C   s\   t dd}d}tg d}tjt|||fdd\}}}}t|t d t|dk| d S )N         ?       @        r<   r=   Targsfull_outputr*   )	r   fullr
   r   fsolver1   r   r   r   )r   r.   r-   initial_guessfinal_flowsinfoiermesgr   r   r   !test_pressure_network_no_gradientn   s   
z,TestFSolve.test_pressure_network_no_gradientc                 C   sF   t dd}d}tg d}tjt|||ftd}t|t d d S )Nr9   r:   r;   r?   fprime)	r   rA   r
   r   rB   r1   r6   r   r   r   r.   r-   rC   rD   r   r   r   #test_pressure_network_with_gradienty   s   
z.TestFSolve.test_pressure_network_with_gradientc                 C   $   t d}ddg}tttj|| d S Nr*         ?r<   r   assert_raises	TypeErrorr   rB   r   funcx0r   r   r   test_wrong_shape_func_callable      z)TestFSolve.test_wrong_shape_func_callablec                 C       ddg}t ttjt|dd d S NrO   r<   )r*   r?   )rQ   rR   r   rB   r#   r   rU   r   r   r   test_wrong_shape_func_function      z)TestFSolve.test_wrong_shape_func_functionc                 C   ,   t d}t d}tttj|ddg|d d S )Nr*   r)   r)   r   rU   rJ   rP   r   rT   
deriv_funcr   r   r    test_wrong_shape_fprime_callable      z+TestFSolve.test_wrong_shape_fprime_callablec                 C   ,   dd }dd }t ttj|ddg|d d S )Nc                 S   
   t | dS N)r)   r#   r   r   r   r   r%         
 z=TestFSolve.test_wrong_shape_fprime_function.<locals>.<lambda>c                 S   rg   N)   rm   ri   rj   r   r   r   r%      rk   r   r*   ra   )rQ   rR   r   rB   rb   r   r   r    test_wrong_shape_fprime_function   re   z+TestFSolve.test_wrong_shape_fprime_functionc                 C   J   dd }t tdd tj|dgd W d    d S 1 sw   Y  d S )Nc                  W      t dNI raised
ValueErrorr[   r   r   r   rT         z,TestFSolve.test_func_can_raise.<locals>.funcrr   matchr   rU   rQ   rt   r   rB   r   rT   r   r   r   test_func_can_raise      "zTestFSolve.test_func_can_raisec                 C   T   dd }dd }t tdd tj|dg|d W d    d S 1 s#w   Y  d S )	Nc                 S      | t dg S N
   r   r
   rj   r   r   r   r%          z0TestFSolve.test_Dfun_can_raise.<locals>.<lambda>c                  W   rp   rq   rs   r[   r   r   r   rc      ru   z2TestFSolve.test_Dfun_can_raise.<locals>.deriv_funcrr   rv   r   ra   ry   rb   r   r   r   test_Dfun_can_raise   
   "zTestFSolve.test_Dfun_can_raisec                 C   s<   dd }t |tddgtj}t||ddgdd d S )Nc                 S   s(   t j| d d | d d gt jdd S )Nr   d   r*   i  Zdtyper)   )r   r
   float32rj   r   r   r   r%      s   ( z)TestFSolve.test_float32.<locals>.<lambda>r*   r   MbP?atol)r   rB   r   r
   r   r   )r   rT   pr   r   r   test_float32   s   zTestFSolve.test_float32c           	         sh    fdd}t dd}d}tg d}tj||||fdd\}}}}t|t d t|dk| d S )	Nc                            t|  S r   )rH   r1   r[   r   r   r   rT         z,TestFSolve.test_reentrant_func.<locals>.funcr9   r:   r;   Tr>   r*   )r   rA   r
   r   rB   r   r   r   )	r   rT   r.   r-   rC   rD   rE   rF   rG   r   r   r   test_reentrant_func   s   
zTestFSolve.test_reentrant_funcc                    sR    fdd}t dd}d}tg d}tjt|||f|d}t|t d d S )Nc                     r   r   )rL   r6   r[   r   r   r   rc      r   z3TestFSolve.test_reentrant_Dfunc.<locals>.deriv_funcr9   r:   r;   rI   )r   rA   r
   r   rB   r1   r   r   )r   rc   r.   r-   rC   rD   r   r   r   test_reentrant_Dfunc   s   
zTestFSolve.test_reentrant_Dfuncc                 C      t | jgd S r   )r(   rH   r   r   r   r   test_concurrent_no_gradient      z&TestFSolve.test_concurrent_no_gradientc                 C   r   r   )r(   rL   r   r   r   r   test_concurrent_with_gradient   r   z(TestFSolve.test_concurrent_with_gradientN)r   r    r!   rH   rL   rV   r]   rd   rn   r{   r   r   r   r   r   r   r   r   r   r   r8   m   s    
	r8   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestRootHybrc                 C   H   t dd}d}tg d}tjt|d||fdj}t|t d d S )Nr9   r:   r;   hybrmethodr?   	r   rA   r
   r   rootr1   r   r   r   rK   r   r   r   rH         z.TestRootHybr.test_pressure_network_no_gradientc                 C   sL   t dd}d}tg dg}tjt|||fdtdj}t|t 	d d S )Nr9   r:   r;   r   r?   r   r5   )
r   rA   r
   r   r   r1   r6   r   r   r   rK   r   r   r   rL      s   z0TestRootHybr.test_pressure_network_with_gradientc                 C   sJ   t dd}d}tg d}tjt|||fdddj}t|t d d S )Nr9   r:   r;   r   Tr   )	r   rA   r
   r   r   r7   r   r   r   rK   r   r   r   ,test_pressure_network_with_gradient_combined   s   z9TestRootHybr.test_pressure_network_with_gradient_combinedN)r   r    r!   rH   rL   r   r   r   r   r   r      s    	
r   c                   @   s   e Zd Zdd ZdS )
TestRootLMc                 C   r   )Nr9   r:   r;   lmr   r   rK   r   r   r   rH      r   z,TestRootLM.test_pressure_network_no_gradientN)r   r    r!   rH   r   r   r   r   r      s    r   c                   @   s   e Z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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'S )(TestLeastSqc                 C   sj   t ddd}d\}}}|| _|||f| _||d  ||  | }t jd |dt j|j  | _d S )Nr   r   (   )g@*   g33333sr)   g{Gz?)	r   linspacer   abcrandomseedZstandard_normalr   y_meas)r   r   abcZy_truer   r   r   setup_method   s   
zTestLeastSq.setup_methodc                 C   s*   |\}}}|||d  ||  |  }|S Nr)   r   )r   r   yr   r   r   r   errr   r   r   	residuals  s   
zTestLeastSq.residualsc                 C   s   t |d |t |gj S r   )r   vstackZ	ones_likeT)r   Z_pZ_yr   r   r   r   residuals_jacobian  s   zTestLeastSq.residuals_jacobianc                 C   sN   t g d}t| j|| j| jfd\}}t|dv d|  t|| jdd d S )Nr   r   r   r[   r*   r)   rm   r9   solution not found (ier=%d)r)   Zdecimalr
   r   r   r   r   r   r   r   r   p0
params_fitrF   r   r   r   
test_basic  s   

zTestLeastSq.test_basicc                 C   sR   t g d}t| j|| j| jf| jd\}}t|dv d|  t|| jdd d S )Nr   r?   Dfunr   r   r)   r   )	r
   r   r   r   r   r   r   r   r   r   r   r   r   test_basic_with_gradient  s   

z$TestLeastSq.test_basic_with_gradientc                 C   sL   t g dg}t| j|| j| jfdd}|\}}}}}t|dv d|  d S )Nr   Tr>   r   solution not found: %s)r
   r   r   r   r   r   )r   r   r@   r   cov_xinfodictrG   rF   r   r   r   test_full_output!  s   
zTestLeastSq.test_full_outputc           	      C   sd   t g dtd}t |dd}t| j|| j| jfdd}|\}}}}}t|dv d|  t|| d S )Nr   r   T)copyr>   r   r   )r
   r   r   r   r   r   r   r   )	r   r   Zp0_copyr@   r   r   r   rG   rF   r   r   r   test_input_untouched)  s   
z TestLeastSq.test_input_untouchedc                 C   rM   rN   r   rQ   rR   r   r   rS   r   r   r   rV   3  rW   z*TestLeastSq.test_wrong_shape_func_callablec                 C   rX   rY   )rQ   rR   r   r   r#   r\   r   r   r   r]   :  r^   z*TestLeastSq.test_wrong_shape_func_functionc                 C   r_   )Nr*   r`   r   rU   r   r   rb   r   r   r   test_wrong_shape_Dfun_callable@  re   z*TestLeastSq.test_wrong_shape_Dfun_callablec                 C   rf   )Nc                 S   rg   rh   ri   rj   r   r   r   r%   F  rk   z<TestLeastSq.test_wrong_shape_Dfun_function.<locals>.<lambda>c                 S   rg   rl   ri   rj   r   r   r   r%   G  rk   r   r*   r   rQ   rR   r   r   rb   r   r   r   test_wrong_shape_Dfun_functionE  re   z*TestLeastSq.test_wrong_shape_Dfun_functionc                 C   s   dd }t jg dt jd}t jg dt jd}t g d}tj||||fd\}}t|dv  t||||d	  d
||||d	   k  d S )Nc                 S   s@   | d t || d  d  d| d d    | d  }|| S )Nr   r*   r)   r<   rm   r   exp)r   r   r   qr   r   r   rT   L  s   8z&TestLeastSq.test_float32.<locals>.func)
g?gw/?g%C?gNbX9?gHzG?gM?gZd;O?gS?g~jt?gV-?r   )
gJ4?gN@aÓ?g^K=?gMO?g?g?W[?gl?g{Pk?g rh?gׁsF?)      ?r   r   r   r[   r   r)   g-C6?)r   r
   r   r   r   r   r+   )r   rT   r   r   r   Zp1Zsuccessr   r   r   r   J  s   

4zTestLeastSq.test_float32c                 C   ro   )Nc                  W   rp   rq   rs   r[   r   r   r   rT   [  ru   z-TestLeastSq.test_func_can_raise.<locals>.funcrr   rv   r   rx   rQ   rt   r   r   rz   r   r   r   r{   Z  r|   zTestLeastSq.test_func_can_raisec                 C   r}   )	Nc                 S   r~   r   r   rj   r   r   r   r%   b  r   z1TestLeastSq.test_Dfun_can_raise.<locals>.<lambda>c                  W   rp   rq   rs   r[   r   r   r   rc   d  ru   z3TestLeastSq.test_Dfun_can_raise.<locals>.deriv_funcrr   rv   r   r   r   rb   r   r   r   r   a  r   zTestLeastSq.test_Dfun_can_raisec                    sX    fdd}t g d}t|| j jfd\}}t|dv d|  t| jdd d S )	Nc                             j|  S r   )r   r   r[   r   r   r   rT   k     
z-TestLeastSq.test_reentrant_func.<locals>.funcr   r[   r   r   r)   r   )r
   r   r   r   r   r   r   )r   rT   r   r   rF   r   r   r   r   j  s   

zTestLeastSq.test_reentrant_funcc                    s\    fdd}t g d}t j| j jf|d\}}t|dv d|  t| jdd d S )	Nc                     r   r   )r   r   r[   r   r   r   rc   w  r   z3TestLeastSq.test_reentrant_Dfun.<locals>.deriv_funcr   r   r   r   r)   r   r   )r   rc   r   r   rF   r   r   r   test_reentrant_Dfunv  s   

zTestLeastSq.test_reentrant_Dfunc                 C   r   r   )r(   r   r   r   r   r   r     r   z'TestLeastSq.test_concurrent_no_gradientc                 C   r   r   )r(   r   r   r   r   r   r     r   z)TestLeastSq.test_concurrent_with_gradientc                 C   sL   dd }t tdd tj|ddgd W d    d S 1 sw   Y  d S )Nc                 S   s   d| d d d  d S )Nr)   r   rm   r*   r   rj   r   r   r   rT     s   z=TestLeastSq.test_func_input_output_length_check.<locals>.funcz+Improper input: func input vector length N=rv   r   r*   rx   r   rz   r   r   r   #test_func_input_output_length_check  s   "z/TestLeastSq.test_func_input_output_length_checkN)r   r    r!   r   r   r   r   r   r   r   rV   r]   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r      s(    		
	r   c                   @   s   e Z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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+d, Zd-d. Zd/d0 Zd1S )2TestCurveFitc                 C   s    t g d| _t g d| _d S )N)r   g	@      #@gffffff+@)r   r<         @g      @)r
   r   r   r   r   r   r   r     s   zTestCurveFit.setup_methodc           
      C   s   dd }t || j| j\}}tt|dk t|jdk t|d ddd t|d	 d
dd t || j| jddd}|\}}}}}	t|| d S )Nc                 S   s   | | S r   r   r   r   r   r   r   rT     ru   z,TestCurveFit.test_one_argument.<locals>.funcr*   )r*   r*   r   g3ı.n?r9   r   )r   r   g-C6Z?F)r@   check_finite)r   r   r   r   r&   r   r   r   )
r   rT   poptpcovrespopt2pcov2r   errmsgrF   r   r   r   test_one_argument  s   zTestCurveFit.test_one_argumentc                 C   sj   dd }t || j| j\}}tt|dk t|jdk t|ddgdd t|d	d
gd
dggdd d S )Nc                 S   s   || |  S r   r   r   r   r   r   r   r   rT     r   z,TestCurveFit.test_two_argument.<locals>.funcr)   r`   c]K?-?r9   r   䃞ͪϵ?T㥛 b=y?)r   r   r   r   r&   r   r   )r   rT   r   r   r   r   r   test_two_argument  s   
zTestCurveFit.test_two_argumentc                 C   sh   G dd d}| }t |j| j| j\}}t|jdk t|ddgdd t|dd	gd	d
ggdd d S )Nc                   @   s   e Zd ZdZdd ZdS )z8TestCurveFit.test_func_is_classmethod.<locals>.test_selfzThis class tests if curve_fit passes the correct number of
               arguments when the model function is a class instance method.
            c                 S   s   |||  S r   r   )r   r   r   r   r   r   r   rT     r   z=TestCurveFit.test_func_is_classmethod.<locals>.test_self.funcN)r   r    r!   r"   rT   r   r   r   r   	test_self  s    r   r`   r   r   r9   r   r   r   r   )r   rT   r   r   r   r   r   )r   r   Ztest_self_instr   r   r   r   r   test_func_is_classmethod  s   
z%TestCurveFit.test_func_is_classmethodc                 C   sP   g d}g d}g d}g d}dd }t ||||dd\}}t||d	d
 d S )N)
gB`"@gZd;@gQ@g#~j@g/$@g;O@g @g@gZd;@g)\@)
     ؊@g     (@g     @g     X@g     t@g     @g     @g     8@g     @g     H@)g^w8}@gU]}@     X@r   g29l?r   )g䃞j@gj@gT{7@g|'fɘ@g ƞ?g'ˊ@c                 S   sL   |t | | d  d|d    |t | | d  d|d     | S )Nr)   r<   r   )r   rU   Zx1ZA0ZA1sigmar   r   r   r   f_double_gauss  s
   ""z9TestCurveFit.test_regression_2639.<locals>.f_double_gaussi'  )maxfevgh㈵>rtol)r   r   )r   r   r   guessZgoodr   r   r   r   r   r   test_regression_2639  s   z!TestCurveFit.test_regression_2639c              
   C   s
  t g d}t g d}t g d}dd }dD ]}t|||ddg||d	\}}t t |}t|d
dgdd t|||ddgd| |d	\}}t t |}t|d
dgdd t|||ddg|d|d\}}t t |}	t|	ddgdd t|||ddgd| d|d\}}t t |}	t|	ddgdd qdd }
t t jgd dd}t /}|	t
d t|
||ddg|d\}}t||d d |d d ddgd\}}W d    n1 sw   Y  t|jdk t|| t|jdk t|| d S )N)r   r*   r)   rm   r9      )r*   r*   r            )r*   r)   r*   r)   r*   r)   c                 S      ||  | S r   r   r   r   r   r   r$     r   z!TestCurveFit.test_pcov.<locals>.fr   trfdogboxr)   r   )r   r   r   gN"q?g~uM/N?r   r   rm   T)r   r   absolute_sigmar   gO=N?g5=`6?g[u|?g-/i@c                 S      ||  S r   r   r   r   r   r   f_flat  ru   z&TestCurveFit.test_pcov.<locals>.f_flatr9   z3Covariance of the parameters could not be estimated)r   r   r   r`   )r   r
   r   sqrtr2   r   infZreshaper   filterr   r   r   r   )r   xdataydatar   r$   r   r   r   Zperr_scaledZperrr   Zpcov_expectedsuppopt1pcov1r   r   r   	test_pcov  sL   



*
zTestCurveFit.test_pcovc                 C   s:   dd }g d}g d}t t|||d ddgdd	 d S )
Nc                 S   r   r   r   r   r   r   r   f_linear  r   z.TestCurveFit.test_array_like.<locals>.f_linearr   )rm   r   r   	   r   r)   r*   g|=r   )r   r   )r   r  r   r   r   r   r   test_array_like  s   "zTestCurveFit.test_array_likec                 C   s4   t g d}t g d}tttdd || d S )N)r*   r)   rm   r9   r      )r*   r)   rm   r9   g      @r  c                 S   r   r   r   r   r   r   r   r%         z<TestCurveFit.test_indeterminate_covariance.<locals>.<lambda>)r   r
   r   r   r   r   r  r  r   r   r   test_indeterminate_covariance  s
   
z*TestCurveFit.test_indeterminate_covariancec                 C   sl   t dt jdg}t g d}tttdd || tttdd || tttdd ||fi dd	i d S )
Nr*   rm   )r*   r)   rm   c                 S   r   r   r   r   r   r   r   r%         z0TestCurveFit.test_NaN_handling.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r%     r  c                 S   r   r   r   r   r   r   r   r%   !  r  r   T)r   r
   nanrQ   rt   r   r  r   r   r   test_NaN_handling  s   


zTestCurveFit.test_NaN_handlingc                 C   s`   t ttdd g g  t ttdd g g dd t ttdd dgg  t ttdd d	gg dd d S )
Nc                 S   r   r   r   r   r   r   r   r%   &  r  z0TestCurveFit.test_empty_inputs.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r%   '  r  )r*   r)   )boundsc                 S   r   r   r   r   r   r   r   r%   )  r  r*   c                 S   r   r   r   r   r   r   r   r%   *  r  r)   rQ   rt   r   r   r   r   r   test_empty_inputs$  s   
zTestCurveFit.test_empty_inputsc                 C   s    t ttdd ddgddg d S )Nc                 S   s   | S r   r   rj   r   r   r   r%   /  s    z8TestCurveFit.test_function_zero_params.<locals>.<lambda>r*   r)   rm   r9   r  r   r   r   r   test_function_zero_params-  s    z&TestCurveFit.test_function_zero_paramsc                 C   s.   t dd d dtd \}}t|dg d S )Nc                 S   s   |t d S r   )r   arange)_r   r   r   r   r%   2  s    z*TestCurveFit.test_None_x.<locals>.<lambda>r)   r   r<   )r   r   r  r   )r   r   r   r   r   r   test_None_x1  s   zTestCurveFit.test_None_xc                 C   sf   dd }t ddd}||dd}dD ]}t||||d\}}t|ddg qttt|||d	d d S )
Nc                 S      |t | |   S r   r   r   r   r   r   r$   7     z,TestCurveFit.test_method_argument.<locals>.fr   r*      r<   )r   r   r   Nr   unknown)r   r   r   r   rQ   rt   )r   r$   r  r  r   r   r   r   r   r   test_method_argument6  s   z!TestCurveFit.test_method_argumentc              	   C   s   dd }t ddd}||dd}ddgdd	gf}d
D ]}t|||||d\}}t|d d qt|||dddgdt jgfd\}}t|d d ttt||||dd d S )Nc                 S   r  r   r   r   r   r   r   r$   D  r  z#TestCurveFit.test_bounds.<locals>.fr   r*   r  r<   r   rO   r   )Nr   r   )r  r   r   r=   g333333?)r   r  r   )r   r   r   r   r   rQ   rt   )r   r$   r  r  r  r   r   r   r   r   r   test_boundsC  s    




zTestCurveFit.test_boundsc           	   	   C   s   dd }t dt j dt j d}t |}dt j dt j f}dD ]#}t|||d	t j d
\}}t|||d	t j ||d\}}t|| q"d S )Nc                 S   s   t | | S r   )r   sinr   r   r   r   r$   ^  s   z&TestCurveFit.test_bounds_p0.<locals>.fr)   r   rm   r   r   g @r   )r   r  r   )r   r   Zpir   r   r   )	r   r$   r  r  r  r   Zpopt_1r  Zpopt_2r   r   r   test_bounds_p0[  s   

zTestCurveFit.test_bounds_p0c           
   	   C   s   dd }dd }t ddd}||dd}d	D ]}d
D ]}t|||||d\}}t|ddg qqdD ]}t|||||d\}}t|ddg q3d|d< t |jd }	d|	d< dD ]}t||||	||d\}}t|ddgdd qZd S )Nc                 S   r  r   r   r   r   r   r   r$   o  r  z TestCurveFit.test_jac.<locals>.fc                 S   *   t | |  }t || |  | fjS r   r   r   r   r   r   r   r   er   r   r   r5   r     z"TestCurveFit.test_jac.<locals>.jacr   r*   r  r<   r#  )z2-pointz3-pointcs)r5   r   r)   r   )r   r5   r   r      )r   r   r5   r   r   )r   r   r   r   r   r   )
r   r$   r5   r  r  r   Zschemer   r   r   r   r   r   test_jacl  s.   


zTestCurveFit.test_jacc                 C   sh   t dd}d| }tdd ||ddd\}}td	d ||ddd
\}}t|ddd t|ddd d S )Nr   r   r)   c                 S   r   r   r   r   r   r   r   r   r%     r  z5TestCurveFit.test_maxfev_and_bounds.<locals>.<lambda>)r   rm   r   )r  r   c                 S   r   r   r   r-  r   r   r   r%     r  )r  Zmax_nfev+=r   )r   r  r   r   )r   r   r   r  r  r   r   r   r   test_maxfev_and_bounds  s   z#TestCurveFit.test_maxfev_and_boundsc              
   C   s   dd }dd }t jd t ddd}||dd	}|d
t jjt|d  }t t|d
 }t |d }||fdfD ]/\}}	dD ](}
t||||||
d\}}t|||||	|
d\}}t	||dd t	||dd qDq>d S )Nc                 S   r  r   r   r   r   r   r   rT     r  z9TestCurveFit.test_curvefit_simplecovariance.<locals>.funcc                 S   r%  r   r&  r'  r   r   r   r5     r)  z8TestCurveFit.test_curvefit_simplecovariance.<locals>.jacr   r9   2         @?皙?sizer)   NNFTr   r5   r   r.  r   )
r   r   r   r   normalr&   zerosr2   r   r   )r   rT   r5   r  r   r  r   covarjac1jac2r   r  r  r   r   r   r   r   test_curvefit_simplecovariance  s(   



z+TestCurveFit.test_curvefit_simplecovariancec              
   C   sV  dd }dd }dd }dd }t jd	 t d
d}||dd}|dt jjt|d  }t t|d }t |d }	t dt 	d dt 	d d	gdt 	d dt 	d d	gg dg}
|

|}|

|	
|
j}||fdfD ]1\}}dD ]*}t||||||d\}}t||||||d\}}t||ddd t||ddd q}qwd S )Nc                 S   sb   t dt d dt d dgdt d dt d dgg dg}||t | |   S Nr   r)         r   r   r   r   )r   r
   r   dotr   )r   r   r   rotnr   r   r   funcp  s   Hz4TestCurveFit.test_curvefit_covariance.<locals>.funcpc                 S   sx   t dt d dt d dgdt d dt d dgg dg}t | |  }|t || |  | fjS r?  )r   r
   r   r   rB  r   r   )r   r   r   rC  r(  r   r   r   jacp  s   H z3TestCurveFit.test_curvefit_covariance.<locals>.jacpc                 S   r  r   r   r   r   r   r   rT     r  z3TestCurveFit.test_curvefit_covariance.<locals>.funcc                 S   r%  r   r&  r'  r   r   r   r5     r)  z2TestCurveFit.test_curvefit_covariance.<locals>.jacr   r*   r9   r1  r   r3  r4  r)   r@  rA  r6  r7  r8  g+i)+>r.  )r   r   )r   r   r   r  r9  r&   r:  r2   r
   r   rB  r   r   r   )r   rD  rE  rT   r5   r  r   r  r   r;  rC  ZydatapZcovarpr<  r=  r   r  r  r   r   r   r   r   test_curvefit_covariance  s2   H




z%TestCurveFit.test_curvefit_covariancec           	   
   C   s   t dd}d| d dt |  }dd }dD ]S}t jt jfD ]J}t jt jfD ]}||}||}q)t ) td	t	 t
||||d
\}}t | sTJ t |dr\J W d    n1 sfw   Y  q!qd S )Nr"  r   rO   r   r:   c                 S   r   r   r   r   r   r   r   rT     r   z&TestCurveFit.test_dtypes.<locals>.funcr   errorr  r*   )r   r  r   r   r   astypewarningscatch_warningssimplefilterr   r   ZisfiniteallZallclose)	r   r   r   rT   r   ZdtxZdtyr   Zcovr   r   r   test_dtypes  s"   

zTestCurveFit.test_dtypesc                 C   s   dd }t g d}t g d}t g d}g d}t g d}||g|R  }t||||||fd\}}	|t j}||g|R  }t||||||fd\}
}	t|
|d	d
 d S )Nc                 S   sJ   || d }|| d }||| |   |t | | d |d d    S )Nr)   r9   )r   r   )r   Zs_1Zs_2Zo_xZo_yr   Zb_2Zb_1r   r   r   	hyperbola  s   2z,TestCurveFit.test_dtypes2.<locals>.hyperbola)g      r=          g      $r=   )r=   r   r   r=   g      $@)ggUUUUUU?r   g      r:   )r!  g?r   )iiir9   r9   r          )r$   r  r  r   r  gh㈵>r   )r   r
   r   rH  r   r   )r   rN  Zmin_fitZmax_fitr   paramsr  r  Zpopt_64r  Zpopt_32r   r   r   test_dtypes2  s    



zTestCurveFit.test_dtypes2c                    s   t d}d|d  d|  t jt|   fdd}dD ]}t||t ||d\}}t||d	|d\}}t|| qd S )
Nr   g@r)   g      @c                    s   || d  ||     S r   r   r   targetr   r   r%     s    z/TestCurveFit.test_broadcast_y.<locals>.<lambda>r   )r  r  r   r   )r   r  r   Zrandr&   r   Z
zeros_liker   )r   r  Zfit_funcr   Zpopt0Zpcov0r  r  r   rV  r   test_broadcast_y  s    
$

zTestCurveFit.test_broadcast_yc                 C   sR   dd }t t t|g dg ddgdd W d    d S 1 s"w   Y  d S )Nc                 S   r   r   r   r   r   r   r   rT   %  r   z.TestCurveFit.test_args_in_kwargs.<locals>.funcr   r   r	        r*   rZ   )r  r  r   r?   r  rz   r   r   r   test_args_in_kwargs"  s   
"z TestCurveFit.test_args_in_kwargsc                 C   sP   dd }t tdd t|g dg dd W d    d S 1 s!w   Y  d S )Nc                 S   s    |t | |   | | | S r   r   )r   r   r   r   dr(  r   r   r   rT   0  s    z<TestCurveFit.test_data_point_number_validation.<locals>.funczThe number of func parameters=rv   r   rY  )r  r  )rQ   rR   r   rz   r   r   r   !test_data_point_number_validation/  s   "z.TestCurveFit.test_data_point_number_validationN)r   r    r!   r   r   r   r   r   r  r
  r  r  r  r  r  r  r  r$  r,  r/  r>  rF  rM  rU  rX  r\  r^  r   r   r   r   r     s2    
0		$,r   c                   @   sL   e Z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S )TestFixedPointc                 C   $   dd }d}t ||}t|d d S )Nc                 S      d|  S Nr<   r   rj   r   r   r   rT   =  ru   z0TestFixedPoint.test_scalar_trivial.<locals>.funcr   r=   r   r   r   rT   rU   r   r   r   r   test_scalar_trivial;     
z"TestFixedPoint.test_scalar_trivialc                 C   r`  )Nc                 S      | d S r   r   rj   r   r   r   rT   E  ru   z/TestFixedPoint.test_scalar_basic1.<locals>.func?r   rc  rd  r   r   r   test_scalar_basic1C  rf  z!TestFixedPoint.test_scalar_basic1c                 C   r`  )Nc                 S   rg  Nr:   r   rj   r   r   r   rT   M  ru   z/TestFixedPoint.test_scalar_basic2.<locals>.funcrh  r   rc  rd  r   r   r   test_scalar_basic2K  rf  z!TestFixedPoint.test_scalar_basic2c                 C   sX   dd }ddg}t jdd t||}W d    n1 sw   Y  t|ddg d S )Nc                 S   ra  rb  r   rj   r   r   r   rT   T  ru   z/TestFixedPoint.test_array_trivial.<locals>.funcg333333?g333333?ignorerL  r=   )r   errstater   r   rd  r   r   r   test_array_trivialS  s   z!TestFixedPoint.test_array_trivialc                 C   sj   dd }t g d}g d}tjdd t|||fd}W d    n1 s'w   Y  t|d|  d S )	Nc                 S      || d  S r   r   r   r   r   r   r   rT   ]  r   z.TestFixedPoint.test_array_basic1.<locals>.funcg      ?r   g      ?)皙?gffffff?g?rl  rm  r[   r   )r
   r   rn  r   r   r   rT   r   rU   r   r   r   r   test_array_basic1[  s   z TestFixedPoint.test_array_basic1c                 C   s>   dd }t g d}g d}t|||fd}t||d  d S )Nc                 S   rp  rj  r   rq  r   r   r   rT   g  r   z.TestFixedPoint.test_array_basic2.<locals>.funcrr  )g?rs  rs  r[   r)   )r
   r   r   rt  r   r   r   test_array_basic2e  s
   z TestFixedPoint.test_array_basic2c                 C   sD   t dd ddddd}t|td| d	  t|td
d  d S )Nc                 S   s   t d|  d S )NrO  r<   r   )Zxxr   r   r   r%   p  s    z.TestFixedPoint.test_lambertw.<locals>.<lambda>r   r   g-q=i  )r?   ZxtolmaxiterrO  r<   r*   r)   )r   r   r   r   r   )r   Zxxrootr   r   r   test_lambertwn  s
   
zTestFixedPoint.test_lambertwc                    s`   ddd}d}|d |  | d|d      fdd}t ||dd	}t|| d S )
Nr)   r  r2  gjt?r*   c                    s,   t  |  t  |  | d   d S )Nr*   )r   log)r4   Zi0klksr   r   rT   }  s   ,z1TestFixedPoint.test_no_acceleration.<locals>.funcZ	iterationr  )r   r   )r   mZn0rT   r4   r   rz  r   test_no_accelerationu  s   $z#TestFixedPoint.test_no_accelerationN)r   r    r!   re  ri  rk  ro  ru  rv  rx  r~  r   r   r   r   r_  9  s    
	r_  ))r"   rI  Znumpy.testingr   r   r   r   r   r   r   Zpytestr	   rQ   Znumpyr   r
   r   Zmultiprocessing.poolr   Zscipyr   Zscipy.specialr   Zscipy.optimize._minpack_pyr   r   r   Zscipy.optimizer   r   r#   r(   r1   r6   r7   r8   r   r   r   r   r_  r   r   r   r   <module>   s6    $	f     )