
    ^Mh A                         d 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 ddlm	Z	 ddlm
Z
mZ dd	lZdd	lZdd
lmZmZmZ ddlmZ ddlmZ dd	lZ G d d          Zd	S )z4
Unit tests for the dual annealing global optimizer
    )dual_annealingBounds)EnergyState)LocalSearchWrapper)ObjectiveFunWrapper)StrategyChain)VisitingDistribution)rosen	rosen_derN)assert_equalassert_allcloseassert_array_less)raises)check_random_statec                      e Zd Zd Zd Zd,dZd,dZej        	                    dg d          d             Z
ej        	                    dg d	          d
             Zd Zd Zej                            d          d             Zd Zej                            d          d             Zd Zd Zd Zej                            d          d             Zd Zd Zd Zej        j        d             Zej        j        d             Zd Zd Zd Zd Zd Z d Z!ej        	                    d g d!          d"             Z"d# Z#d$ Z$ej                            d          d%             Z%ej        	                    d&g d'          d(             Z&ej                            d          d)             Z'ej                            d          d*             Z(d+S )-TestDualAnnealingc                 "   d | _         dgdz  | _        | j        dz  | _        d| _        d| _        d| _        d| _        d	| _        t          | j                  | _	        t          j                    | _        t          j                    | _        d S )
Nc                     t           j        S N)npinfxs    i/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/optimize/tests/test__dual_annealing.py<lambda>z0TestDualAnnealing.setup_method.<locals>.<lambda>   s    26     {Gz{Gz@      i  in  g?(\@  )	weirdfunc	ld_bounds	hd_boundsnbtestvalueshigh_temperaturelow_temperatureqvseedr   rng	threadinglocalnb_fun_callngevselfs    r   setup_methodzTestDualAnnealing.setup_method   s    ))'1,!+  $"	%di00$?,,O%%			r   c                     |dk    rdS d S )N      ?T )r2   r   fcontexts       r   callbackzTestDualAnnealing.callback,   s     884 8r   r6   c           	      @   |r|}nd}t          j        ||z
  dz  dt          j        dt           j        z  ||z
  z            z  z
            dt          j        |          z  z   |z   }t          | j        d          sd| j        _        | j        xj        dz  c_        |S )Nr   r    
   c   )r   sumcospisizehasattrr/   r<   )r2   r   argsshiftys        r   funczTestDualAnnealing.func2   s     	EEEFAI!#b26!be)I3 , , '   

?+-23t'-- 	#!"Dar   c                     t          | j        d          sd| j        _        | j        xj        dz  c_        t          |g|R  S )Nr<   r   r=   )rB   r0   r<   r   )r2   r   rC   s      r   rosen_der_wrapperz#TestDualAnnealing.rosen_der_wrapper?   sG    ty#&& 	DIK	q"T""""r   r*   )g?g(\?r    r"   333333@c                 8   t          t          | j                   }t          j        |d                   }t          j        |d                   }|j        }t          |||| j                  }t          j        |          }|	                    |d| j
                  }t          t          j        |d          d           t          j        |          }|	                    ||| j
                  }	t          t          j        |	d         d          d           d S )Nr   r=   T)listzipr%   r   arrayrA   r	   r,   zerosvisitingr(   r   	not_equal)
r2   r*   lulowerupperdimvdvalues
x_step_lowx_step_highs
             r   test_visiting_steppingz(TestDualAnnealing.test_visiting_steppingG   s    #t~&''AAj!%DH==#[[D,ABB
R\*a00$777#kk&#t/DEER\+a.!44d;;;;;r   )g      @r"   rI   c                    t          t          | j                   }t          j        |d                   }t          j        |d                   }t          |||| j                  }|                    | j        | j	                  }t          t          j        |          d           t          dt          j        |                     d S )Nr   r=   g|=g    _B)rK   rL   r%   r   rM   r	   r,   visit_fnr(   r'   r   minmax)r2   r*   rQ   rR   rS   rU   rV   s          r   #test_visiting_dist_high_temperaturez5TestDualAnnealing.test_visiting_dist_high_temperatureW   s    #t~&''AA!%DH== T2D4EFF 	"&..%000%00000r   c                 >   t          | j                  }t          t          | j                   }t          j        |d                   }t          j        |d                   }t          ||          }t          t          |j
        |t          d                      d S )Nr   r=   )r   r$   rK   rL   r%   r   rM   r   assert_raises
ValueErrorresetr   )r2   owfrQ   rR   rS   ess         r   
test_resetzTestDualAnnealing.test_reseti   s{    !$.11#t~&''AA&&j"(C1CD1I1IJJJJJr   c                     t          | j        | j        | j                  }t	          |j        dd           |j        sJ d S Nr,           g-q=atol)r   rF   r%   r+   r   funsuccessr2   rets     r   test_low_dimzTestDualAnnealing.test_low_dimq   sN    It~496 6 6%0000{r   r;   c                     t          | j        | j        | j                  }t	          |j        dd           |j        sJ d S rg   )r   rF   r&   r+   r   rl   rm   rn   s     r   test_high_dimzTestDualAnnealing.test_high_dimw   sG    TYDIFFF%0000{r   c                 x    t          | j        | j        d| j                  }t	          |j        dd           d S )NT)no_local_searchr+   ri   -C6?rj   r   rF   r%   r+   r   rl   rn   s     r   test_low_dim_no_lsz$TestDualAnnealing.test_low_dim_no_ls}   sE    TY-1	C C C$//////r   c                 x    t          | j        | j        d| j                  }t	          |j        dd           d S )NTrt   r,   ri   giUMu?rj   )r   rF   r&   r+   r   rl   rn   s     r   test_high_dim_no_lsz%TestDualAnnealing.test_high_dim_no_ls   sE    TY-1tyB B B&111111r   c                     d| j         _        t          | j        | j        | j                  }t          | j         j        |j                   d S )Nr   rh   r/   r<   r   rF   r%   r+   r   nfevrn   s     r   test_nb_fun_callz"TestDualAnnealing.test_nb_fun_call   sE    TYDIFFFT%'22222r   c                     d| j         _        t          | j        | j        d| j                  }t          | j         j        |j                   d S )Nr   Try   r|   rn   s     r   test_nb_fun_call_no_lsz(TestDualAnnealing.test_nb_fun_call_no_ls   sQ    TY-1tyB B BT%'22222r   c                 R    t          t          t          | j        | j                   d S r   )r`   ra   r   r$   r%   r1   s    r   test_max_reinitz!TestDualAnnealing.test_max_reinit   s+    j.$.n	& 	& 	& 	& 	&r   c                 4   t          | j        | j        | j                  }t          | j        | j        | j                  }t          | j        | j        | j                  }t	          |j        |j                   t	          |j        |j                   d S )Nrh   )r   rF   r%   r+   r   r   )r2   res1res2res3s       r   test_reproducez TestDualAnnealing.test_reproduce   s    diTYGGGdiTYGGGdiTYGGG 	TVTV$$$TVTV$$$$$r   c                 &   t           j                            d          }t          | j        | j        |          }t           j                            d          }t          | j        | j        |          }t          |j        |j                   d S )Nr=   rh   )r   randomdefault_rngr   rF   r%   r   r   )r2   r,   r   r   s       r   test_rand_genzTestDualAnnealing.test_rand_gen   sz     i##A&&diSAAAi##A&&diSAAA 	TVTV$$$$$r   c                 P    g d}t          t          t          | j        |           d S )N)r   )r=   r   )r   r   )r`   ra   r   rF   )r2   wrong_boundss     r   test_bounds_integrityz'TestDualAnnealing.test_bounds_integrity   s4    <<<j.$)"	$ 	$ 	$ 	$ 	$r   c                 4   dt           j         dfdg}t          t          t          | j        |           ddt           j        fdg}t          t          t          | j        |           ddt           j        fdg}t          t          t          | j        |           d S )N)   r   )r   r   r`   ra   r   rF   nan)r2   invalid_boundss     r   test_bound_validityz%TestDualAnnealing.test_bound_validity   s    !RVGQ<9j.$)$	& 	& 	&!Arv;8j.$)$	& 	& 	&!Arv;8j.$)$	& 	& 	& 	& 	&r   c                     d }t          t          ddgddg                    }t          j        t          d          5  t          ||d|d	
           d d d            d S # 1 swxY w Y   d S )Nc                 <    t          j        | dz
  | dz
  z            S Nr   r=   r   r>   r   s    r   rF   zKTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.func       61q5QU+,,,r   r      r   Method CG cannot handle matchCGmethodboundsr   minimizer_kwargs)rK   rL   pytestwarnsRuntimeWarningr   r2   rF   r   s      r   +test_deprecated_local_search_options_boundsz=TestDualAnnealing.test_deprecated_local_search_options_bounds   s    	- 	- 	-c2r(QF++,, \.0KLLL 	E 	E,0F!C!CE E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es    A##A'*A'c                 
   d }t          t          ddgddg                    }t          ||d|d           t          j        t
          d	
          5  t          ||d|d           d d d            d S # 1 swxY w Y   d S )Nc                 <    t          j        | dz
  | dz
  z            S r   r   r   s    r   rF   z<TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.func   r   r   r   r   r   r   SLSQPr   r   r   r   r   )rK   rL   r   r   r   r   r   s      r   test_minimizer_kwargs_boundsz.TestDualAnnealing.test_minimizer_kwargs_bounds   s   	- 	- 	-c2r(QF++,,(/6BB	D 	D 	D 	D
 \.0KLLL 	E 	E,0F!C!CE E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es   A88A<?A<c                    t          | j        | j        d| j                  }t	          t          t          | j                  t          j        z  t          j	                  t          j
                  }|j        d|z   k    sJ |j        rJ d S )Nd   )maxfunr,   )r   rF   r%   r+   r\   r]   lenr   LS_MAXITER_RATIOLS_MAXITER_MINLS_MAXITER_MAXr}   rm   )r2   ro   ls_max_iters      r   test_max_fun_lsz!TestDualAnnealing.test_max_fun_ls   s    TYs!%, , , #"4"EE-/ / -/ / x3,,,,,;r   c                 x    t          | j        | j        dd| j                  }|j        dk    sJ |j        rJ d S )NTi  )rt   r   r,   )r   rF   r%   r+   r}   rm   rn   s     r   test_max_fun_no_lsz$TestDualAnnealing.test_max_fun_no_ls   sM    TY-1#49N N Nx3;r   c                 d    t          | j        | j        d| j                  }|j        dk    sJ d S )Ni  )maxiterr,   )r   rF   r%   r+   nitrn   s     r   test_maxiterzTestDualAnnealing.test_maxiter   s8    TY!%, , ,w#~~~~~~r   c                 x    t          | j        | j        d| j                  }t	          |j        dd           d S )Nn!	@)rC   r,   r   ư>rj   rv   rn   s     r   test_fun_args_lsz"TestDualAnnealing.test_fun_args_ls   sB    TY#-DI? ? ?t444444r   c                 z    t          | j        | j        dd| j                  }t	          |j        dd           d S )Nr   T)rC   rt   r,   r   ru   rj   rv   rn   s     r   test_fun_args_no_lsz%TestDualAnnealing.test_fun_args_no_ls   sG    TY#.!%, , , 	t444444r   c                     t          | j        | j        | j        | j                  }|j        dk    sJ d|j        d         v sJ |j        rJ d S )N)r9   r,   r5   z
stop earlyr   )r   rF   r%   r9   r+   rl   messagerm   rn   s     r   test_callback_stopz$TestDualAnnealing.test_callback_stop   sf     TY&*mD D Dw#~~~~s{1~----;r   zmethod, atol))zNelder-Meadgh㈵>)COBYLAgh㈵>)COBYQA:0yE>)Powellr   )r   r   )BFGSr   )TNCr   )r   gH׊>c                     t          | j        | j        t          |          | j                  }t          |j        d|           d S )Nr   r   r,   ri   rj   )r   rF   r%   dictr+   r   rl   )r2   r   rk   ro   s       r   test_multi_ls_minimizerz)TestDualAnnealing.test_multi_ls_minimizer  sR     TY.2&.A.A.A!%, , , 	$//////r   c                     t          t          t          | j        | j        d           t          t          t          | j        | j        d           d S )Nr=   )restart_temp_ratior   )r`   ra   r   rF   r%   r1   s    r   test_wrong_restart_tempz)TestDualAnnealing.test_wrong_restart_temp  sX    j.$)n	< 	< 	< 	<j.$)n	< 	< 	< 	< 	< 	<r   c                     d| j         i}t          t          | j        || j                  }|j        | j        j        k    sJ d S )Njacr   )rH   r   r
   r%   r+   njevr0   r<   )r2   minimizer_optsro   s      r   test_gradient_gnevz$TestDualAnnealing.test_gradient_gnev  sT    4)
 UDN.<!%, , , x49;&&&&&&r   c           	          d }dgdz  }dgdz  }t          |t          t          ||                    d          }t          |j        g dd	           t          |j        d
d	           d S )Nc                     t          j        | | z  dt          j        dt           j        z  | z            z  z
            dt          j        |           z  z   S Nr;   r    r   r>   r?   r@   rA   r   s    r   rF   z3TestDualAnnealing.test_from_docstring.<locals>.func)  sE    6!a%"rva"%i!m'<'<"<<==RWQZZOOr   r   r;   r   r#   r   r,   )
g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>rj   ri   g-a=)r   rK   rL   r   r   rl   )r2   rF   lwupro   s        r   test_from_docstringz%TestDualAnnealing.test_from_docstring'  s    	P 	P 	PWr\Vb[T$s2r{{*;*;FFF* * * 15		6 	6 	6 	6
 	666666r   z'new_e, temp_step, accepted, accept_rate))r   r     g]'?)r   r    r   gr(?)r;   r   in  gD?)r;   <   i  gt%?)r    r   i  gw?c           	         t          d          }d}d}d}d}	t          |          D ]n}
t          d d           }|                    |	dg           t	          |d d d ||          }||_        |                    d|dg           |j        |k    r|dz  }o||k    sJ dd|z
  ||	z
  z  |z  z
  }|dk    rdn+t          j	        t          j
        |          d|z
  z            }t          ||           d S )	N{   r   r   r   r=   )rR   rS   r    )jex_visit)r   ranger   update_currentr   temperature_stepaccept_rejectcurrent_energyr   explogr   )r2   new_e	temp_stepacceptedaccept_raterscount_accepted
iterationsaccept_paramr   _energy_statechainpqvrates                  r    test_accept_reject_probabilisticz2TestDualAnnealing.test_accept_reject_probabilistic5  s:     $$
z"" 	$ 	$A&T>>>L''<<<!dD$LB BE &/E" !uqc:::*e33!#)))) 1|#(>?)KK1HHqq"&L8H)I"J"Jk*****r   c                    d }dgdz  }dgdz  }d|d<   d|d<   d	|d
<   d|d<   t          ||          }t          ||d          }t          t          ||                    }t          ||d          }t	          |j        |j        d           t	          |j        t          j        dd
          d           t	          |j        |j        d           |j	        |j	        k    sJ d S )Nc                     t          j        | | z  dt          j        dt           j        z  | z            z  z
            dt          j        |           z  z   }|S r   r   )r   r7   s     r   rF   z1TestDualAnnealing.test_bounds_class.<locals>.funcb  sI    q1urBF1ru9q=$9$999::R"'!**_LAHr   r   r   r   g       r   g      r=   r5      g       @r!   r#   r   r   rj   gHz>g&.>)
r   r   rK   rL   r   r   r   arangerl   r}   )r2   rF   r   r   r   ret_bounds_class
bounds_oldret_bounds_lists           r   test_bounds_classz#TestDualAnnealing.test_bounds_class_  s   	 	 	 Wq[VaZ 1111 B)$v4HHH#b"++&&
(jdKKK 	(*O,=DIIII(*BIb!,<,<4HHHH+-=-AMMMM#'7'<<<<<<<r   c                 T  	 t           j                            d          }d }d }d 		fd}t          |dddgddgg|t	          d	
                    }t          |dddgddgg|t	          d	|                    }t          |dddgddgg|t	          d|	                    }t          |dddgddgg|t	          d||                    }t          |j        |j        d           t          |j        |j        d           t          |j        |j        d           d S )Nl   ]k@A`Q c                 T    t          j        t          j        | |z                      S r   )r   r>   r   r   powers     r   r7   zETestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.f  s     6"&e,,---r   c                 H    t          j        | |z            |z  | |dz
  z  z  S )Nr=   )r   r   r	  s     r   r   zGTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.jac  s)    6!u*%%-eai0@@@r   c                     t          j        |t          j        | |z            z  | |dz
  z  z  || |z  z  |z   dz
  z            S )Nr    r=   )r   diagr   r	  s     r   hesszHTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hess  sU    7qEz***Q519-==e#e+a/1  r   c                 "     | |          |z  S r   r6   )r   pr
  r  s      r   hesspzITestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hessp  s    45>>A%%r   )r    r   r=   zL-BFGS-Br   )rC   r   r,   r   )r   r   z	newton-cg)r   r   r  )r   r   r  r   )rtol)r   r   r   r   r   r   rl   )
r2   r,   r7   r   r  r   r   r   res4r  s
            @r   (test_callable_jac_hess_with_args_gh11052z:TestDualAnnealing.test_callable_jac_hess_with_args_gh11052|  s    i##$899	. 	. 	.	A 	A 	A	 	 		& 	& 	& 	& 	& aeaVaV4D#/3:/F/F/FH H HaeaVaV4D#/3:8;0= 0= 0=> > > aeaVaV4D#/3;8;$0H 0H 0HI I I aeaVaV4D#/3;8;50J 0J 0JK K K 	$(6666$(6666$(666666r   N)r6   ))__name__
__module____qualname__r3   r9   rF   rH   r   markparametrizerY   r^   re   rp   	fail_slowrr   rw   rz   r~   r   r   r   r   r   r   thread_unsafer   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r6   r   r   r   r      s       & & &"     # # # # [T#<#<#<==< < >=< [T#4#4#4551 1 651"K K K   [2  
0 0 0
 [22 2 2
3 3 3
3 3 3& & & [2% % %% % %$ $ $
	& 	& 	& [
E 
E 
E [E E E 	 	 	    5 5 55 5 5   [^ 	. 	. 	. 	 	0 0	 	0< < <' ' ' [27 7 7 [F I I I  !+ !+ !+F [2= = =8 [2#7 #7 #7 #7 #7r   r   )__doc__scipy.optimizer   r   scipy.optimize._dual_annealingr   r   r   r   r	   r
   r   r   numpyr   numpy.testingr   r   r   r   r`   scipy._lib._utilr   r-   r   r6   r   r   <module>r"     s:  
  2 1 1 1 1 1 1 1 6 6 6 6 6 6 = = = = = = > > > > > > 8 8 8 8 8 8 ? ? ? ? ? ? + + + + + + + +      J J J J J J J J J J * * * * * * / / / / / /    G7 G7 G7 G7 G7 G7 G7 G7 G7 G7r   