
    bi@                         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y	)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                   F   e Zd Zd Zd Zd+dZd+dZej                  j                  dg d      d        Z
ej                  j                  dg d      d	        Zd
 Zd Zej                  j                  d      d        Zd Zej                  j                  d      d        Zd Zd Zd Zej                  j                  d      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej                  j                  dg d       d!        Z!d" Z"d# Z#ej                  j                  d      d$        Z$ej                  j                  d%g d&      d'        Z%ej                  j                  d      d(        Z&ej                  j                  d      d)        Z'y*),TestDualAnnealingc                     d | _         dgdz  | _        | j                  dz  | _        d| _        d| _        d| _        d| _        d	| _        t        j                         | _
        t        j                         | _        y )
Nc                 "    t         j                  S N)npinfxs    d/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/optimize/tests/test__dual_annealing.py<lambda>z0TestDualAnnealing.setup_method.<locals>.<lambda>   s
    266     {Gz{Gz@      i  in  g?(\@  )	weirdfunc	ld_bounds	hd_boundsnbtestvalueshigh_temperaturelow_temperatureqvseed	threadinglocalnb_fun_callngevselfs    r   setup_methodzTestDualAnnealing.setup_method   sj    )'1,!+  $"	$??,OO%	r   c                     |dk  ryy )N      ?T )r1   r   fcontexts       r   callbackzTestDualAnnealing.callback+   s     8 r   c           	      n   |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;   )r1   r   argsshiftys        r   funczTestDualAnnealing.func1   s    EEFFAI!#b266!bee)I3 , '  
?+-23t''-!"Dar   c                     t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        t        |g| S )Nr;   r   r<   )rA   r/   r;   r   )r1   r   rB   s      r   rosen_der_wrapperz#TestDualAnnealing.rosen_der_wrapper>   s=    tyy#&DIIK		q"T""r   r*   )g?g(\?r    r"   333333@c                 Z   t         j                  j                  d      }t        t	        | j
                         }t        j                  |d         }t        j                  |d         }|j                  }t        ||||      }t        j                  |      }|j                  |d| j                        }	t        t        j                  |	d      d       t        j                  |      }|j                  ||| j                        }
t        t        j                  |
d   d      d       y )Nr#   r   r<   T)r   randomdefault_rnglistzipr%   arrayr@   r	   zerosvisitingr(   r   	not_equal)r1   r*   rnglulowerupperdimvdvalues
x_step_lowx_step_highs              r   test_visiting_steppingz(TestDualAnnealing.test_visiting_steppingF   s    ii##D)#t~~&'AAjj!%C8#[[D,A,AB
R\\*a0$7#kk&#t/D/DER\\+a.!4d;r   )g      @r"   rH   c                    t         j                  j                  d      }t        t	        | j
                         }t        j                  |d         }t        j                  |d         }t        ||||      }|j                  | j                  | j                        }t        t        j                  |      d       t        dt        j                  |             y )Nr#   r   r<   g|=g    _B)r   rJ   rK   rL   rM   r%   rN   r	   visit_fnr(   r'   r   minmax)r1   r*   rR   rS   rT   rU   rW   rX   s           r   #test_visiting_dist_high_temperaturez5TestDualAnnealing.test_visiting_dist_high_temperatureW   s    ii##D)#t~~&'AA!%C8 T22D4E4EF 	"&&.%0%0r   c                 &   t        | j                        }t        t        | j                         }t        j                  |d         }t        j                  |d         }t        ||      }t        t        |j                  |t        d              y )Nr   r<   )r   r$   rL   rM   r%   r   rN   r   assert_raises
ValueErrorresetr   )r1   owfrS   rT   rU   ess         r   
test_resetzTestDualAnnealing.test_resetj   si    !$..1#t~~&'AA&j"((C1CD1IJr   c                     t        | j                  | j                  | j                        }t	        |j
                  dd       |j                  sJ y NrR           g-q=atol)r   rE   r%   r+   r   funsuccessr1   rets     r   test_low_dimzTestDualAnnealing.test_low_dimr   s;    IIt~~4996%0{{{r   r:   c                     t        | j                  | j                  | j                        }t	        |j
                  dd       |j                  sJ y ri   )r   rE   r&   r+   r   rn   ro   rp   s     r   test_high_dimzTestDualAnnealing.test_high_dimx   s8    TYYDIIF%0{{{r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y )NT)no_local_searchr+   rk   -C6?rl   r   rE   r%   r+   r   rn   rp   s     r   test_low_dim_no_lsz$TestDualAnnealing.test_low_dim_no_ls~   s2    TYY-1		C$/r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y )NTrv   rR   rk   giUMu?rl   )r   rE   r&   r+   r   rn   rp   s     r   test_high_dim_no_lsz%TestDualAnnealing.test_high_dim_no_ls   s2    TYY-1tyyB&1r   c                     d| j                   _        t        | j                  | j                  | j
                        }t        | j                   j                  |j                         y )Nr   rj   r.   r;   r   rE   r%   r+   r   nfevrp   s     r   test_nb_fun_callz"TestDualAnnealing.test_nb_fun_call   sD    TYYDIIFT%%''2r   c                     d| j                   _        t        | j                  | j                  d| j
                        }t        | j                   j                  |j                         y )Nr   Tr{   r~   rp   s     r   test_nb_fun_call_no_lsz(TestDualAnnealing.test_nb_fun_call_no_ls   sJ    TYY-1tyyBT%%''2r   c                 X    t        t        t        | j                  | j                         y r   )rb   rc   r   r$   r%   r0   s    r   test_max_reinitz!TestDualAnnealing.test_max_reinit   s    j.$..nn	&r   c                    t        | j                  | j                  | j                        }t        | j                  | j                  | j                        }t        | j                  | j                  | j                        }t	        |j
                  |j
                         t	        |j
                  |j
                         y )Nrj   )r   rE   r%   r+   r   r   )r1   res1res2res3s       r   test_reproducez TestDualAnnealing.test_reproduce   sv    diiTYYGdiiTYYGdiiTYYG 	TVVTVV$TVVTVV$r   c                 H   t         j                  j                  d      }t        | j                  | j
                  |      }t         j                  j                  d      }t        | j                  | j
                  |      }t        |j                  |j                         y )Nr<   rj   )r   rJ   rK   r   rE   r%   r   r   )r1   rR   r   r   s       r   test_rand_genzTestDualAnnealing.test_rand_gen   sl     ii##A&diiSAii##A&diiSA 	TVVTVV$r   c                 L    g d}t        t        t        | j                  |       y )N)r   )r<   r   )r   r   )rb   rc   r   rE   )r1   wrong_boundss     r   test_bounds_integrityz'TestDualAnnealing.test_bounds_integrity   s    <j.$))"	$r   c                 D   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
                  |       y )N)   r   )r   r   rb   rc   r   rE   nan)r1   invalid_boundss     r   test_bound_validityz%TestDualAnnealing.test_bound_validity   s    !RVVGQ<9j.$))$	&!Arvv;8j.$))$	&!Arvv;8j.$))$	&r   c                     d }t        t        ddgddg            }t        j                  t        d      5  t        ||d|d	
       d d d        y # 1 sw Y   y xY w)Nc                 >    t        j                  | dz
  | dz
  z        S Nr   r<   r   r=   r   s    r   rE   zKTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.func       661q5QU+,,r   r      r   Method CG cannot handle matchCGmethodboundsr   minimizer_kwargs)rL   rM   pytestwarnsRuntimeWarningr   r1   rE   r   s      r   +test_deprecated_local_search_options_boundsz=TestDualAnnealing.test_deprecated_local_search_options_bounds   sa    	-c2r(QF+, \\.0KL 	E,0F!CE	E 	E 	Es   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        y # 1 sw Y   y xY w)Nc                 >    t        j                  | dz
  | dz
  z        S r   r   r   s    r   rE   z<TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.func   r   r   r   r   r   r   SLSQPr   r   r   r   r   )rL   rM   r   r   r   r   r   s      r   test_minimizer_kwargs_boundsz.TestDualAnnealing.test_minimizer_kwargs_bounds   sx    	-c2r(QF+,(/6B	D
 \\.0KL 	E,0F!CE	E 	E 	Es   	A$$A-c                 N   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 y )Nd   )maxfunrR   )r   rE   r%   r+   r^   r_   lenr   LS_MAXITER_RATIOLS_MAXITER_MINLS_MAXITER_MAXr   ro   )r1   rq   ls_max_iters      r   test_max_fun_lsz!TestDualAnnealing.test_max_fun_ls   s    TYYs!%, #"4"E"EE--/ --/ xx3,,,,;;;r   c                     t        | j                  | j                  dd| j                        }|j                  dk  sJ |j
                  rJ y )NTi  )rv   r   rR   )r   rE   r%   r+   r   ro   rp   s     r   test_max_fun_no_lsz$TestDualAnnealing.test_max_fun_no_ls   sB    TYY-1#499Nxx3;;;r   c                     t        | j                  | j                  d| j                        }|j                  dk  sJ y )Ni  )maxiterrR   )r   rE   r%   r+   nitrp   s     r   test_maxiterzTestDualAnnealing.test_maxiter   s1    TYY!%,ww#~~r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y )Nn!	@)rB   rR   r   ư>rl   rx   rp   s     r   test_fun_args_lsz"TestDualAnnealing.test_fun_args_ls   s1    TYY#-DII?t4r   c                     t        | j                  | j                  dd| j                        }t	        |j
                  dd       y )Nr   T)rB   rv   rR   r   rw   rl   rx   rp   s     r   test_fun_args_no_lsz%TestDualAnnealing.test_fun_args_no_ls   s6    TYY#.!%, 	t4r   c                     t        | j                  | j                  | j                  | j                        }|j
                  dk  sJ d|j                  d   v sJ |j                  rJ y )N)r8   rR   r4   z
stop earlyr   )r   rE   r%   r8   r+   rn   messagero   rp   s     r   test_callback_stopz$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                     t        | j                  | j                  t        |      | j                        }t        |j                  d|       y )Nr   r   rR   rk   rl   )r   rE   r%   dictr+   r   rn   )r1   r   rm   rq   s       r   test_multi_ls_minimizerz)TestDualAnnealing.test_multi_ls_minimizer  s;     TYY.2&.A!%, 	$/r   c                     t        t        t        | j                  | j                  d       t        t        t        | j                  | j                  d       y )Nr<   )restart_temp_ratior   )rb   rc   r   rE   r%   r0   s    r   test_wrong_restart_tempz)TestDualAnnealing.test_wrong_restart_temp  s8    j.$))nn	<j.$))nn	<r   c                     d| j                   i}t        t        | j                  || j                        }|j
                  | j                  j                  k(  sJ y )Njacr   )rG   r   r
   r%   r+   njevr/   r;   )r1   minimizer_optsrq   s      r   test_gradient_gnevz$TestDualAnnealing.test_gradient_gnev  sN    4))
 UDNN.<!%, xx499;;&&&r   c           	          d }dgdz  }dgdz  }t        |t        t        ||            d      }t        |j                  g dd	       t        |j
                  d
d	       y )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?   r@   r   s    r   rE   z3TestDualAnnealing.test_from_docstring.<locals>.func(  sE    66!a%"rvva"%%i!m'<"<<=RWWQZOOr   r   r:   r   r#   r   rR   )
g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>rl   rk   g-a=)r   rL   rM   r   r   rn   )r1   rE   lwuprq   s        r   test_from_docstringz%TestDualAnnealing.test_from_docstring&  sa    	PWr\Vb[T$s2r{*;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           	         t        d      }d}d}d}d}	t        |      D ]c  }
t        d d       }|j                  |	dg       t	        |d d d ||      }||_        |j                  d|dg       |j                  |k(  s_|dz  }e ||k(  sJ dd|z
  ||	z
  z  |z  z
  }|dk  rdn-t        j                  t        j                  |      d|z
  z        }t        ||       y )	N{   r   r   r   r<   )rT   rU   r    )jex_visit)r   ranger   update_currentr   temperature_stepaccept_rejectcurrent_energyr   explogr   )r1   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_probabilistic4  s	     $
z" 	$A&T>L''<!dD$LBE &/E" !uqc:**e3!#	$ ))) 1|#(>?)KK1Hq"&&L8H)I"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 y )Nc                     t        j                  | | z  dt        j                  dt         j                  z  | z        z  z
        dt        j                  |       z  z   }|S r   r   )r   r6   s     r   rE   z1TestDualAnnealing.test_bounds_class.<locals>.funca  sI    q1urBFF1ruu9q=$999:R"''!*_LAHr   r   r   r   g       r   g      r<   r4      g       @r!   r#   r   r   rl   gHz>g&.>)
r   r   rL   rM   r   r   r   arangern   r   )r1   rE   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#b"+&
(jdK 	(**O,=,=DI(**BIIb!,<4H++-=-A-AM##'7'<'<<<<r   c                 6  	 t         j                  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       y )Nl   ]k@A`Q c                 X    t        j                  t        j                  | |z              S r   )r   r=   r   r   powers     r   r6   zETestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.f  s    66"&&e,--r   c                 J    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(    66!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  sQ    77qEz**Q519-==e#e+a/1 r   c                      | |      |z  S r   r5   )r   pr
  r  s      r   hesspzITestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hessp  s    5>A%%r   )r    r   r<   zL-BFGS-Br   )rB   r   rR   r   )r   r   z	newton-cg)r   r   r  )r   r   r  r   )rtol)r   rJ   rK   r   r   r   rn   )
r1   rR   r6   r   r  r   r   r   res4r  s
            @r   (test_callable_jac_hess_with_args_gh11052z: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;50JK 	$((6$((6$((6r   N)r5   )(__name__
__module____qualname__r2   r8   rE   rG   r   markparametrizer[   r`   rg   rr   	fail_slowrt   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r5   r   r   r   r      s   & # [[T#<=< ><  [[T#451 61$K [[2 
0
 [[22 2
3
3& [[2% %%$
	&
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   rb   scipy._lib._utilr   r,   r   r5   r   r   <module>r!     sB   
 2 6 = > 8 ? +   J J * / F7 F7r   