
    (ph A                         S r SSKJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SSKJ
r
Jr  SS	KrSS	KrSS
KJrJrJr  SSKJr  SSKJr  SS	Kr " S S5      rg	)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                      \ rS rSrS rS rS-S jrS-S jr\R                  R                  S/ SQ5      S 5       r\R                  R                  S/ S	Q5      S
 5       rS rS r\R                  R                  S5      S 5       rS r\R                  R                  S5      S 5       rS rS rS r\R                  R                  S5      S 5       rS rS rS r\R                  R4                  S 5       r\R                  R4                  S 5       rS rS rS rS r S r!S r"\R                  R                  S / S!Q5      S" 5       r#S# r$S$ r%\R                  R                  S5      S% 5       r&\R                  R                  S&/ S'Q5      S( 5       r'\R                  R                  S5      S) 5       r(\R                  R                  S5      S* 5       r)S+r*g,).TestDualAnnealing   c                 4   S U l         S/S-  U l        U R                  S-  U l        SU l        SU l        SU l        SU l        S	U l        [        U R                  5      U l	        [        R                  " 5       U l        [        R                  " 5       U l        g )
Nc                 "    [         R                  $ N)npinfxs    \/var/www/html/venv/lib/python3.13/site-packages/scipy/optimize/tests/test__dual_annealing.py<lambda>0TestDualAnnealing.setup_method.<locals>.<lambda>   s    266    {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_methodTestDualAnnealing.setup_method   sz    )'1,!+  $"	%dii0$??,OO%	r   c                     US::  a  gg )N      ?T )r4   r   fcontexts       r   callbackTestDualAnnealing.callback,   s     8 r   c           	         U(       a  UnOSn[         R                  " X-
  S-  S[         R                  " S[         R                  -  X-
  -  5      -  -
  5      S[         R                  " U5      -  -   U-   n[        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        U$ )Nr   r"   
   c   )r   sumcospisizehasattrr1   r@   )r4   r   argsshiftys        r   funcTestDualAnnealing.func2   s    EEFFAI!#b266!bee)I3 , '  
?+-23t''--!"Dar   c                     [        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        [        U/UQ76 $ )Nr@   r   rA   )rF   r2   r@   r   )r4   r   rG   s      r   rosen_der_wrapper#TestDualAnnealing.rosen_der_wrapper?   s@    tyy#&&DIIK		q"T""r   r,   )g?g(\?r"   r$   333333@c                 6   [        [        U R                  6 5      n[        R                  " US   5      n[        R                  " US   5      nUR
                  n[        X4XR                  5      n[        R                  " U5      nUR                  USU R                  5      n[        [        R                  " US5      S5        [        R                  " U5      nUR                  XuU R                  5      n	[        [        R                  " U	S   S5      S5        g )Nr   rA   T)listzipr'   r   arrayrE   r	   r.   zerosvisitingr*   r   	not_equal)
r4   r,   lulowerupperdimvdvalues
x_step_lowx_step_highs
             r   test_visiting_stepping(TestDualAnnealing.test_visiting_steppingG   s    #t~~&'AAjj!%HH=#[[D,A,AB
R\\*a0$7#kk&t/D/DER\\+a.!4d;r   )g      @r$   rO   c                    [        [        U R                  6 5      n[        R                  " US   5      n[        R                  " US   5      n[        X4XR                  5      nUR                  U R                  U R                  5      n[        [        R                  " U5      S5        [        S[        R                  " U5      5        g )Nr   rA   g|=g    _B)rQ   rR   r'   r   rS   r	   r.   visit_fnr*   r)   r   minmax)r4   r,   rW   rX   rY   r[   r\   s          r   #test_visiting_dist_high_temperature5TestDualAnnealing.test_visiting_dist_high_temperatureW   s    #t~~&'AA!%HH= T22D4E4EF 	"&&.%0%0r   c                 (   [        U R                  5      n[        [        U R                  6 5      n[
        R                  " US   5      n[
        R                  " US   5      n[        X45      n[        [        UR                  U[        S 5      5        g )Nr   rA   )r   r&   rQ   rR   r'   r   rS   r   assert_raises
ValueErrorresetr   )r4   owfrW   rX   rY   ess         r   
test_resetTestDualAnnealing.test_reseti   sg    !$..1#t~~&'AA&j"((C1CD1IJr   c                     [        U R                  U R                  U R                  S9n[	        UR
                  SSS9  UR                  (       d   eg Nr.           g-q=atol)r   rJ   r'   r-   r   funsuccessr4   rets     r   test_low_dimTestDualAnnealing.test_low_dimq   s;    IIt~~4996%0{{{r   r?   c                     [        U R                  U R                  U R                  S9n[	        UR
                  SSS9  UR                  (       d   eg rp   )r   rJ   r(   r-   r   ru   rv   rw   s     r   test_high_dimTestDualAnnealing.test_high_dimw   s8    TYYDIIF%0{{{r   c                     [        U R                  U R                  SU R                  S9n[	        UR
                  SSS9  g )NT)no_local_searchr-   rr   -C6?rs   r   rJ   r'   r-   r   ru   rw   s     r   test_low_dim_no_ls$TestDualAnnealing.test_low_dim_no_ls}   s2    TYY-1		C$/r   c                     [        U R                  U R                  SU R                  S9n[	        UR
                  SSS9  g )NTr   r.   rr   giUMu?rs   )r   rJ   r(   r-   r   ru   rw   s     r   test_high_dim_no_ls%TestDualAnnealing.test_high_dim_no_ls   s2    TYY-1tyyB&1r   c                     SU R                   l        [        U R                  U R                  U R
                  S9n[        U R                   R                  UR                  5        g )Nr   rq   r1   r@   r   rJ   r'   r-   r   nfevrw   s     r   test_nb_fun_call"TestDualAnnealing.test_nb_fun_call   sD    TYYDIIFT%%''2r   c                     SU R                   l        [        U R                  U R                  SU R
                  S9n[        U R                   R                  UR                  5        g )Nr   Tr   r   rw   s     r   test_nb_fun_call_no_ls(TestDualAnnealing.test_nb_fun_call_no_ls   sJ    TYY-1tyyBT%%''2r   c                 X    [        [        [        U R                  U R                  5        g r   )rh   ri   r   r&   r'   r3   s    r   test_max_reinit!TestDualAnnealing.test_max_reinit   s    j.$..nn	&r   c                 z   [        U R                  U R                  U R                  S9n[        U R                  U R                  U R                  S9n[        U R                  U R                  U R                  S9n[	        UR
                  UR
                  5        [	        UR
                  UR
                  5        g )Nrq   )r   rJ   r'   r-   r   r   )r4   res1res2res3s       r   test_reproduce TestDualAnnealing.test_reproduce   sv    diiTYYGdiiTYYGdiiTYYG 	TVVTVV$TVVTVV$r   c                 <   [         R                  R                  S5      n[        U R                  U R
                  US9n[         R                  R                  S5      n[        U R                  U R
                  US9n[        UR                  UR                  5        g )NrA   rq   )r   randomdefault_rngr   rJ   r'   r   r   )r4   r.   r   r   s       r   test_rand_genTestDualAnnealing.test_rand_gen   sl     ii##A&diiSAii##A&diiSA 	TVVTVV$r   c                 L    / SQn[        [        [        U R                  U5        g )N)r   )rA   r   )r!   r!   )rh   ri   r   rJ   )r4   wrong_boundss     r   test_bounds_integrity'TestDualAnnealing.test_bounds_integrity   s    <j.$))"	$r   c                 D   S[         R                  * S4S/n[        [        [        U R
                  U5        SS[         R                  4S/n[        [        [        U R
                  U5        SS[         R                  4S/n[        [        [        U R
                  U5        g )N)   r   )r   r   rh   ri   r   rJ   nan)r4   invalid_boundss     r   test_bound_validity%TestDualAnnealing.test_bound_validity   s    !RVVGQ<9j.$))$	&!Arvv;8j.$))$	&!Arvv;8j.$))$	&r   c                     S n[        [        SS/SS/5      5      n[        R                  " [        SS9   [        UUSUS	.S
9  S S S 5        g ! , (       d  f       g = f)Nc                 @    [         R                  " U S-
  U S-
  -  5      $ Nr   rA   r   rB   r   s    r   rJ   KTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.func       661q5QU+,,r   r      r   Method CG cannot handle matchCGmethodboundsr   minimizer_kwargs)rQ   rR   pytestwarnsRuntimeWarningr   r4   rJ   r   s      r   +test_deprecated_local_search_options_bounds=TestDualAnnealing.test_deprecated_local_search_options_bounds   sU    	-c2r(QF+, \\.0KL,0F!CE MLLs   A
Ac                     S n[        [        SS/SS/5      5      n[        UUSUS.S9  [        R                  " [
        S	S
9   [        UUSUS.S9  S S S 5        g ! , (       d  f       g = f)Nc                 @    [         R                  " U S-
  U S-
  -  5      $ r   r   r   s    r   rJ   <TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.func   r   r   r   r   r   r   SLSQPr   r   r   r   r   )rQ   rR   r   r   r   r   r   s      r   test_minimizer_kwargs_bounds.TestDualAnnealing.test_minimizer_kwargs_bounds   sl    	-c2r(QF+,(/6B	D
 \\.0KL,0F!CE MLLs   A
A*c                 T   [        U R                  U R                  SU R                  S9n[	        [        [        U R                  5      [        R                  -  [        R                  5      [        R                  5      nUR                  SU-   ::  d   eUR                  (       a   eg )Nd   )maxfunr.   )r   rJ   r'   r-   rc   rd   lenr   LS_MAXITER_RATIOLS_MAXITER_MINLS_MAXITER_MAXr   rv   )r4   rx   ls_max_iters      r   test_max_fun_ls!TestDualAnnealing.test_max_fun_ls   s    TYYs!%, #"4"E"EE--/ --/ xx3,,,,;;;r   c                     [        U R                  U R                  SSU R                  S9nUR                  S::  d   eUR
                  (       a   eg )NTi  )r   r   r.   )r   rJ   r'   r-   r   rv   rw   s     r   test_max_fun_no_ls$TestDualAnnealing.test_max_fun_no_ls   sB    TYY-1#499Nxx3;;;r   c                 |    [        U R                  U R                  SU R                  S9nUR                  S::  d   eg )Ni  )maxiterr.   )r   rJ   r'   r-   nitrw   s     r   test_maxiterTestDualAnnealing.test_maxiter   s1    TYY!%,ww#~~r   c                     [        U R                  U R                  SU R                  S9n[	        UR
                  SSS9  g )Nn!	@)rG   r.   r   ư>rs   r   rw   s     r   test_fun_args_ls"TestDualAnnealing.test_fun_args_ls   s1    TYY#-DII?t4r   c                     [        U R                  U R                  SSU R                  S9n[	        UR
                  SSS9  g )Nr   T)rG   r   r.   r   r   rs   r   rw   s     r   test_fun_args_no_ls%TestDualAnnealing.test_fun_args_no_ls   s6    TYY#.!%, 	t4r   c                     [        U R                  U R                  U R                  U R                  S9nUR
                  S::  d   eSUR                  S   ;   d   eUR                  (       a   eg )N)r<   r.   r8   z
stop earlyr   )r   rJ   r'   r<   r-   ru   messagerv   rw   s     r   test_callback_stop$TestDualAnnealing.test_callback_stop   s\     TYY&*mmDww#~~s{{1~---;;;r   zmethod, atol))zNelder-Meadgh㈵>)COBYLAgh㈵>)COBYQA:0yE>)Powellr   )r   r   )BFGSr   )TNCr   )r   gH׊>c                     [        U R                  U R                  [        US9U R                  S9n[        UR                  SUS9  g )Nr   r   r.   rr   rs   )r   rJ   r'   dictr-   r   ru   )r4   r   rt   rx   s       r   test_multi_ls_minimizer)TestDualAnnealing.test_multi_ls_minimizer  s;     TYY.2&.A!%, 	$/r   c                     [        [        [        U R                  U R                  SS9  [        [        [        U R                  U R                  SS9  g )NrA   )restart_temp_ratior   )rh   ri   r   rJ   r'   r3   s    r   test_wrong_restart_temp)TestDualAnnealing.test_wrong_restart_temp  s8    j.$))nn	<j.$))nn	<r   c                     SU R                   0n[        [        U R                  UU R                  S9nUR
                  U R                  R                  :X  d   eg )Njacr   )rM   r   r
   r'   r-   njevr2   r@   )r4   minimizer_optsrx   s      r   test_gradient_gnev$TestDualAnnealing.test_gradient_gnev  sN    4))
 UDNN.<!%, xx499;;&&&r   c           	          S nS/S-  nS/S-  n[        U[        [        X#5      5      SS9n[        UR                  / SQSS	9  [        UR
                  S
SS	9  g )Nc                     [         R                  " X -  S[         R                  " S[         R                  -  U -  5      -  -
  5      S[         R                  " U 5      -  -   $ Nr?   r"   r   rB   rC   rD   rE   r   s    r   rJ   3TestDualAnnealing.test_from_docstring.<locals>.func)  sC    66!%"rvva"%%i!m'<"<<=RWWQZOOr   r    r?   r!   r%   r   r.   )
g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>rs   rr   g-a=)r   rQ   rR   r   r   ru   )r4   rJ   lwuprx   s        r   test_from_docstring%TestDualAnnealing.test_from_docstring'  s_    	PWr\Vb[T$s2{*;F* 15		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           	         [        S5      nSnSnSnSn	[        U5       H^  n
[        S S S9nUR                  U	S/5        [	        US S S X[5      nX,l        UR                  SUS/S9  UR                  U:X  d  MY  US-  nM`     Xc:X  d   eSSU-
  X-
  -  U-  -
  nUS::  a  SO/[        R                  " [        R                  " U5      SU-
  -  5      n[        X5        g )	N{   r   r  r   rA   )rX   rY   r"   )jex_visit)r   ranger   update_currentr   temperature_stepaccept_rejectcurrent_energyr   explogr   )r4   new_e	temp_stepacceptedaccept_raterscount_accepted
iterationsaccept_paramr  _energy_statechainpqvrates                  r    test_accept_reject_probabilistic2TestDualAnnealing.test_accept_reject_probabilistic5  s      $
z"A&T>L''<!dD$BE &/" !uqc:**e3!# # ))) 1|#(>?)KK1Hq"&&L8H)I"J*r   c                    S nS/S-  nS/S-  nSUS'   SUS'   S	US
'   SUS'   [        X#5      n[        XSS9n[        [        X#5      5      n[        XSS9n[	        UR
                  UR
                  SS9  [	        UR
                  [        R                  " SS
5      SS9  [	        UR                  UR                  SS9  UR                  UR                  :X  d   eg )Nc                     [         R                  " X -  S[         R                  " S[         R                  -  U -  5      -  -
  5      S[         R                  " U 5      -  -   nU$ r   r   )r   r:   s     r   rJ   1TestDualAnnealing.test_bounds_class.<locals>.funcb  sG    qurBFF1ruu9q=$999:R"''!*_LAHr   r    r   r!   g       r   g      rA   r8      g       @r#   r%   r   r   rs   gHz>g&.>)
r   r   rQ   rR   r   r   r   arangeru   r   )r4   rJ   r  r  r   ret_bounds_class
bounds_oldret_bounds_lists           r   test_bounds_class#TestDualAnnealing.test_bounds_class_  s    	 Wq[VaZ 1111 )$4H#b+&
(dK 	(**O,=,=DI(**BIIb!,<4H++-=-A-AM##'7'<'<<<<r   c                   ^	 [         R                  R                  S5      nS nS nS m	U	4S jn[        USSS/SS//U[	        S	S
9S9n[        USSS/SS//U[	        S	US9S9n[        USSS/SS//U[	        SUT	S9S9n[        USSS/SS//U[	        SX4S9S9n[        UR                  UR                  SS9  [        UR                  UR                  SS9  [        UR                  UR                  SS9  g )Nl   ]k@A`Q c                 Z    [         R                  " [         R                  " X-  5      5      $ r   )r   rB   r  r   powers     r   r:   ETestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.f  s    66"&&,--r   c                 H    [         R                  " X-  5      U-  XS-
  -  -  $ )NrA   )r   r  r/  s     r   r   GTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.jac  s$    66!*%-ai0@@@r   c                     [         R                  " U[         R                  " X-  5      -  XS-
  -  -  XU-  -  U-   S-
  -  5      $ )Nr"   rA   )r   diagr  r/  s     r   hessHTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hess  sK    77qz**Q19-==e#e+a/1 r   c                    > T" X5      U-  $ r   r9   )r   pr0  r6  s      r   hesspITestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hessp  s    >A%%r   )r"   r   rA   zL-BFGS-Br   )rG   r   r.   r   )r   r   z	newton-cg)r   r   r6  )r   r   r:  r   )rtol)r   r   r   r   r   r   ru   )
r4   r.   r:   r   r:  r   r   r   res4r6  s
            @r   (test_callable_jac_hess_with_args_gh11052:TestDualAnnealing.test_callable_jac_hess_with_args_gh11052|  s%    ii##$89	.	A		& aeaVaV4D#/3:/FHaeaVaV4D#/3:8;0=> aeaVaV4D#/3;8;$0HI aeaVaV4D#/3;8;0JK 	$((6$((6$((6r   )r(   r*   r'   r+   r1   r)   r2   r,   r.   r-   r&   N)r9   )+__name__
__module____qualname____firstlineno__r5   r<   rJ   rM   r   markparametrizer_   re   rm   ry   	fail_slowr|   r   r   r   r   r   r   r   r   r   thread_unsafer   r   r   r   r   r   r   r   r   r   r   r  r   r+  r>  __static_attributes__r9   r   r   r   r      s!   &"# [[T#<=< >< [[T#451 61"K [[2 
0
 [[22 2
3
3& [[2% %%$
	& [[
E 
E [[E E 	55 [[^ 	. 	0	0<' [[27 7 [[F I !+!+F [[2= =8 [[2#7 #7r   r   )__doc__scipy.optimizer   r   scipy.optimize._dual_annealingr   r   r   r   r	   r
   r   r   numpyr   numpy.testingr   r   r   r   rh   scipy._lib._utilr   r/   r   r9   r   r   <module>rO     sB   
 2 6 = > 8 ? +   J J * / G7 G7r   