
    ^Mh3                     \    d Z ddlmZmZ ddlZddlZddlmZm	Z	 ddl
Z
 G d d          ZdS )z.
Unit test for DIRECT optimization algorithm.
    )assert_allcloseassert_array_lessN)directBoundsc            	       b   e Zd Zd Zd Zd Zd Zd Zd Ze	j
                            ddd	g          d
             Ze	j
                            ddd	g          d             Ze	j
                            ddd	g          d             Ze	j
                            ddd	g          d             Ze	j
                            dddg          e	j
                            ddd	g          d                         Ze	j
                            dddg          e	j
                            ddd	g          d                         Ze	j
                            dg d          e	j
                            ddd	g          d                         Zd Ze	j
                            ddd	g          d             Ze	j
                            ddd	g          d             Ze	j
                            ddd	g          d             Ze	j
                            ddd	g          d             Ze	j
                            ddd	g          e	j
                            dg d          d                          Ze	j
        j        e	j
                            ddd	g          d!                         Ze	j
                            ddd	g          d"             Ze	j
                            dd#d$g          d%             Ze	j
                            dd#d$g          d&             Ze	j
                            dd#d$g          d'             Ze	j
                            d(g d)          d*             Ze	j
                            d+g d)          d,             Z d- Z!d. Z"e	j
                            d/g d0          d1             Z#e	j
                            d/ e$d2d#gd3d4g           e$e%j&         d#gd3e%j&        g          g          d5             Z'd6 Z(e	j
                            dd7d8d8gd9g          d:             Z)d;S )<
TestDIRECTc                     t          j                    | _        ddgz  | _        t	          j        d          | _        d| _        t          ddgddg          | _	        d| _
        d S )N   )   r
           g      g      @  )	threadinglocal	fun_callsbounds_spherenpzerosoptimum_sphere_posoptimum_spherer   bounds_stylinski_tangmaxiter)selfs    `/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/optimize/tests/test_direct.pysetup_methodzTestDIRECT.setup_method   s\    "**y["$(5//!%+S#JR%A%A"    c                     t          | j        d          sd| j        _        | j        xj        dz  c_        t          j        |                                          S )Ncr      )hasattrr   r   r   squaresumr   xs     r   spherezTestDIRECT.sphere   sP    t~s++ 	! DNAy||!!!r   c                 |    t          j        |          dk    rt                      dt          j        |          z  S Nr   r    )r   r#   ZeroDivisionErrorr$   s     r   invzTestDIRECT.inv   s1    6!99>>#%%%{r   c                     t           j        S N)r   nanr$   s     r   nan_funzTestDIRECT.nan_fun"   	    vr   c                     t           j        S r,   )r   infr$   s     r   inf_funzTestDIRECT.inf_fun%   r/   r   c                 d    |\  }}d|dz  d|dz  z  z
  d|z  z   |dz  z   d|dz  z  z
  d|z  z   z  S )Ng      ?r
             )r   posr%   ys       r   styblinski_tangzTestDIRECT.styblinski_tang(   sO    1adR!Q$Y&Q.A5QT	AAEIJJr   locally_biasedTFc                    t          | j        | j        |          }t          |j        | j        dd           t          |j        | j        dd           t          j	        | j                  }t          |d d df         |j                   t          |j        |d d df                    |j        dt          | j                  dz   z  k    sJ |j        | j        j        k    sJ |j        | j        k    sJ d S )	Nr;   MbP?rtolatolh㈵>rA   r@   r   r    r   )r   r&   r   r   r%   r   funr   r   asarrayr   nfevlenr   r   nitr   )r   r;   res_boundss       r   test_directzTestDIRECT.test_direct,   s   T[$"4$24 4 4 	t6!	. 	. 	. 	.!44dKKKK *T/00'!!!Q$-///#%A/// x43t'9#:#:Q#>?????x4>+++++ w$,&&&&&&r   c                 2   t          | j        | j        |          }d }t          | j        | j        ||          }t          |j        |j                   |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j	        |j	        k    sJ t          |j        |j                   |j
        |j
        k    sJ t          |j        | j        dd           t          |j	        | j        dd           d S )Nr=   c                 V    d| z  } t          j        |           }t          d           |S )Nr5   z+DIRECT minimization algorithm callback test)r   r"   print)r%   dummys     r   callbackz1TestDIRECT.test_direct_callback.<locals>.callbackJ   s,    !AIaLLE?@@@Lr   )r;   rP   r>   r?   rB   rC   )r   r&   r   r   r%   rH   rF   statussuccessrD   messager   r   )r   r;   rI   rP   res_callbacks        r   test_direct_callbackzTestDIRECT.test_direct_callbackD   s]    T[$"4$24 4 4	 	 	 dk4+=-;'/1 1 1 	|~...w,*****x<,,,,,z\00000{l22222w,*****|~...{l22222 	(?!	. 	. 	. 	.($*=!	. 	. 	. 	. 	. 	.r   c                     ddgz  }t          j        t                    5  t          | j        ||           d d d            d S # 1 swxY w Y   d S Nr
   )i
   )boundsr;   )pytestraisesr)   r   r*   r   r;   rY   s      r   test_exceptionzTestDIRECT.test_exceptiond   s    I;],-- 	2 	248F"02 2 2 2	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   AA	A	c                 @    ddgz  }t          | j        ||           d S rW   )r   r.   r\   s      r   test_nanzTestDIRECT.test_nank   s7    I;t|F,	. 	. 	. 	. 	. 	.r   len_tolr>   -C6?c                     ddgz  }t          | j        ||d|          }|j        dk    sJ |j        sJ t	          |j        t          j        d                     d| }|j        |k    sJ d S )Nr
   g      $      $@gKH9)rY   r`   vol_tolr;   r6   r   zjThe side length measure of the hyperrectangle containing the lowest function value found is below len_tol=	r   r&   rQ   rR   r   r%   r   r   rS   )r   r`   r;   rY   rI   rS   s         r   test_len_tolzTestDIRECT.test_len_tolq   s     K=T[">C C CzQ{rx///(%( ( {g%%%%%%r   re   ư>g:0yE>c                     ddgz  }t          | j        ||d|          }|j        dk    sJ |j        sJ t	          |j        t          j        d                     d| }|j        |k    sJ d S )Nr
   rc   r   )rY   re   r`   r;   r   z]The volume of the hyperrectangle containing the lowest function value found is below vol_tol=rf   )r   re   r;   rY   rI   rS   s         r   test_vol_tolzTestDIRECT.test_vol_tol   s     K=T[@ @ @zQ{rx///F<CF F{g%%%%%%r   
f_min_rtol)r>   rB   gHz>c                     d}ddgz  }t          | j        ||||          }|j        dk    sJ |j        sJ |j        |d|z   z  k     sJ d| d}|j        |k    sJ d S )N      ?r
   )       rd   )rY   f_minrk   r;   r   z9The best function value found is within a relative error=z$ of the (known) global optimum f_min)r   r&   rQ   rR   rD   rS   )r   rk   r;   ro   rY   rI   rS   s          r   
test_f_minzTestDIRECT.test_f_min   s    
 J<T[u *$24 4 4 zQ{w"z/22222M&M M M{g%%%%%%r   c                     t          j        |d         |z
            t          j        |d         |z
                                            z   S r(   )r   r"   r#   )r   r%   abs       r   circle_with_argszTestDIRECT.circle_with_args   s=    y1""RYqtax%8%8%<%<%>%>>>r   c                     ddgz  }t          | j        |dd|          }t          |j        t	          j        ddg          d           d S )	Nr5   )rn          @)r    r    i  )argsmaxfunr;   rm   rB   r@   )r   rt   r   r%   r   array)r   r;   rY   rI   s       r   test_f_circle_with_argsz"TestDIRECT.test_f_circle_with_args   sZ    K=T*F$24 4 4rxR11======r   c                     d}t          | j        | j        ||          }|j        du sJ |j        dk    sJ |j        |k    sJ d| }|j        |k    sJ d S )Nd   )rx   r;   Fr    z:Number of function evaluations done is larger than maxfun=)r   r:   r   rR   rQ   rF   rS   )r   r;   rx   resultrS   s        r   test_failure_maxfunzTestDIRECT.test_failure_maxfun   s    
 ,d.H%nF F F~&&&&}!!!!{f$$$$2)/2 2~((((((r   c                     d}t          | j        | j        ||          }|j        du sJ |j        dk    sJ |j        |k    sJ d| }|j        |k    sJ d S )NrX   )r   r;   Fr5   z,Number of iterations is larger than maxiter=)r   r:   r   rR   rQ   rH   rS   )r   r;   r   r~   rS   s        r   test_failure_maxiterzTestDIRECT.test_failure_maxiter   s    
 ,d.H 'H H H~&&&&}!!!!zW$$$$JJJ~((((((r   c                    g d}g d}t          j        g d          }t          t          ||                    }t	          ||          }t          | j        ||          }t          | j        ||          }|j        |j        k    sJ |j        |j        k    sJ |j	        |j	        k    sJ |j
        |j
        k    sJ t          |j        |j                   t          |j        |d           d S )N)g      rm         )      g      @      @)r   rm   r   r=   g{Gz?ry   )r   rz   listzipr   r   r&   rF   rS   rR   rH   r   r%   )	r   r;   lbubx_opt
bounds_old
bounds_newres_old_boundsres_new_boundss	            r   test_bounds_variantszTestDIRECT.test_bounds_variants   s    ^^]]''#b"++&&
B^^
Z/=? ? ?Z/=? ? ? "n&99999%)?????%)?????!^%77777(.*:;;;(%d;;;;;;r   eps)rB   ra   r>   c                 n    t          | j        | j        |d|          }|j        dk    sJ |j        sJ d S )Nrh   )r   re   r;   r
   )r   r:   r   rQ   rR   )r   r   r;   r~   s       r   test_epsilonzTestDIRECT.test_epsilon   sS     ,d.H'57 7 7 }!!!!~r   c                 L    dgdz  }t          | j        |dd|          }|J d S )N)r   g      4@r}   i i@B )rx   r   r;   )r   r&   r   r;   rY   r~   s       r   test_no_segmentation_faultz%TestDIRECT.test_no_segmentation_fault   sF    
 #VH 'H H H!!!!!r   c                 H    dgdz  }t          | j        ||          }|J d S )N)r   r   r5   r=   )r   r2   r   s       r   test_inf_funzTestDIRECT.test_inf_fun   s>     qf'57 7 7!!!!!r   r5   c                     d}t          j        t          |          5  t          | j        | j        |           d d d            d S # 1 swxY w Y   d S )Nz len_tol must be between 0 and 1.match)r`   rZ   r[   
ValueErrorr   r:   r   )r   r`   	error_msgs      r   test_len_tol_validationz"TestDIRECT.test_len_tol_validation       6	]:Y777 	$ 	$4')C"$ $ $ $	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$   AAAc                     d}t          j        t          |          5  t          | j        | j        |           d d d            d S # 1 swxY w Y   d S )Nz vol_tol must be between 0 and 1.r   )re   r   )r   re   r   s      r   test_vol_tol_validationz"TestDIRECT.test_vol_tol_validation   r   r   c                     d}t          j        t          |          5  t          | j        | j        |d           d d d            d S # 1 swxY w Y   d S )Nz#f_min_rtol must be between 0 and 1.r   r   )rk   ro   r   )r   rk   r   s      r   test_fmin_rtol_validationz$TestDIRECT.test_fmin_rtol_validation  s    9	]:Y777 	4 	44')C(4 4 4 4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   A		AArx   )g      ?string)r    r5   c                     d}t          j        t          |          5  t          | j        | j        |           d d d            d S # 1 swxY w Y   d S )Nzmaxfun must be of type int.r   rx   r   )r   rx   r   s      r   test_maxfun_wrong_typez!TestDIRECT.test_maxfun_wrong_type  s    1	]:Y777 	" 	"4')C " " " "	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"r   r   c                     d}t          j        t          |          5  t          | j        | j        |           d d d            d S # 1 swxY w Y   d S )Nzmaxiter must be of type int.r   r   r   )r   r   r   s      r   test_maxiter_wrong_typez"TestDIRECT.test_maxiter_wrong_type  s    2	]:Y777 	$ 	$4')C"$ $ $ $	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r   c                     d}t          j        t          |          5  t          | j        | j        d           d d d            d S # 1 swxY w Y   d S )Nzmaxiter must be > 0.r   r   r   r   r   r   s     r   test_negative_maxiterz TestDIRECT.test_negative_maxiter  s    *	]:Y777 	 	4')C   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r   c                     d}t          j        t          |          5  t          | j        | j        d           d d d            d S # 1 swxY w Y   d S )Nzmaxfun must be > 0.r   r   r   r   r   s     r   test_negative_maxfunzTestDIRECT.test_negative_maxfun  s    )	]:Y777 	 	4')C   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r   rY   )rY   rv   r   c                     d}t          j        t          |          5  t          | j        |           d d d            d S # 1 swxY w Y   d S )Nz5bounds must be a sequence or instance of Bounds classr   rZ   r[   r   r   r:   r   rY   r   s      r   test_invalid_bounds_typez#TestDIRECT.test_invalid_bounds_type%  s    0	]:Y777 	1 	14'000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1   AAAr   r   r    c                     d}t          j        t          |          5  t          | j        |           d d d            d S # 1 swxY w Y   d S )Nz#Bounds are not consistent min < maxr   r   r   s      r   test_incorrect_boundsz TestDIRECT.test_incorrect_bounds,  s     :	]:Y777 	1 	14'000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1r   c                     d}t          t          j         dgdt          j        g          }t          j        t
          |          5  t          | j        |           d d d            d S # 1 swxY w Y   d S )NzBounds must not be inf.r   r   r   )r   r   r1   rZ   r[   r   r   r:   )r   r   rY   s      r   test_inf_boundszTestDIRECT.test_inf_bounds6  s    -	"&"BF|44]:Y777 	1 	14'000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   A**A.1A.biasr   rv   c                     d}t          j        t          |          5  t          | j        | j        |           d d d            d S # 1 swxY w Y   d S )Nz%locally_biased must be True or False.r   r=   r   )r   r;   r   s      r   test_locally_biased_validationz)TestDIRECT.test_locally_biased_validation<  s    ;	]:Y777 	2 	24')C"02 2 2 2	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2r   N)*__name__
__module____qualname__r   r&   r*   r.   r2   r:   rZ   markparametrizerK   rU   r]   r_   rg   rj   rp   rt   r{   r   r   r   r   xslowr   r   r   r   r   r   r   r   r   r   r   r   r-   r   r   r   r7   r   r   r   r      s         " " "  
    K K K [-e}==' ' >='. [-e}==. . >=.> [-e}==2 2 >=2 [-e}==. . >=.
 [Yt55[-e}==
& 
& >= 65
& [Yt55[-e}==	& 	& >= 65	& [\+=+=+=>>[-e}==& & >= ?>&? ? ? [-e}==> > >=> [-e}==) ) >=) [-e}==) ) >=) [-e}==< < >=<* [-e}==[U$6$6$677  87 >= [[-e}==" " >= " [-e}==" " >=" [YQ00$ $ 10$ [YQ00$ $ 10$ [\B7334 4 434 [X'>'>'>??" " @?" [Y(?(?(?@@$ $ A@$     [X'8'8'8991 1 :91 [X$fc2YQ88$frvgr]RLAA  
1 1 
1
1 1 1 [-A/CDD2 2 ED2 2 2r   r   )__doc__numpy.testingr   r   rZ   numpyr   scipy.optimizer   r   r   r   r7   r   r   <module>r      s    . . . . . . . .      ) ) ) ) ) ) ) )    u2 u2 u2 u2 u2 u2 u2 u2 u2 u2r   