
    S_fE;                         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  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                      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d Zd Zd Zd Zd Zd Z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"d# Z#ej                  j                  d$g d%      d&        Z$d' Z%d( Z&y))+TestDualAnnealingc                     d | _         dgdz  | _        | j                  dz  | _        d| _        d| _        d| _        d| _        d	| _        t        | j                        | _	        d
| _
        d
| _        y )Nc                 "    t         j                  S N)npinfxs    Ilib/python3.12/site-packages/scipy/optimize/tests/test__dual_annealing.py<lambda>z0TestDualAnnealing.setup_method.<locals>.<lambda>   s
    266     {Gz{Gz@      i  in  g?(\@  r   )	weirdfunc	ld_bounds	hd_boundsnbtestvalueshigh_temperaturelow_temperatureqvseedr   rsnb_fun_callngevselfs    r   setup_methodzTestDualAnnealing.setup_method   sl    )'1,!+  $"	$TYY/	r   c                     |dk  ryy )N      ?T )r0   r   fcontexts       r   callbackzTestDualAnnealing.callback*   s     8 r   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   }| xj
                  dz  c_        |S )Nr   r    
      )r   sumcospisizer-   )r0   r   argsshiftys        r   funczTestDualAnnealing.func0   s    EEFFAI!#b266!bee)I3 , '  
?+-23Ar   c                 D    | xj                   dz  c_         t        |g| S Nr:   )r.   r   )r0   r   r?   s      r   rosen_der_wrapperz#TestDualAnnealing.rosen_der_wrapper;   s    		Q	"T""r   r*   )g?g(\?r    r"   333333@c                 0   t        t        | j                         }t        j                  |d         }t        j                  |d         }|j
                  }t        |||| j                        }t        j                  |      }|j                  |d| j                        }t        t        j                  |d      d       t        j                  |      }|j                  ||| j                        }	t        t        j                  |	d   d      d       y )Nr   r:   T)listzipr%   r   arrayr>   r	   r,   zerosvisitingr(   r   	not_equal)
r0   r*   lulowerupperdimvdvalues
x_step_lowx_step_highs
             r   test_visiting_steppingz(TestDualAnnealing.test_visiting_steppingA   s    #t~~&'AAjj!%DGG<#[[D,A,AB
R\\*a0$7#kk&#t/D/DER\\+a.!4d;r   )g      @r"   rF   c                    t        t        | j                         }t        j                  |d         }t        j                  |d         }t        |||| j                        }|j                  | j                  | j                        }t        t        j                  |      d       t        dt        j                  |             y )Nr   r:   g|=g    _B)rH   rI   r%   r   rJ   r	   r,   visit_fnr(   r'   r   minmax)r0   r*   rN   rO   rP   rR   rS   s          r   #test_visiting_dist_high_temperaturez5TestDualAnnealing.test_visiting_dist_high_temperatureQ   s    #t~~&'AA!%DGG< 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$   rH   rI   r%   r   rJ   r   assert_raises
ValueErrorresetr   )r0   owfrN   rO   rP   ess         r   
test_resetzTestDualAnnealing.test_resetc   si    !$..1#t~~&'AA&j"((C1CD1IJr   c                     t        | j                  | j                  | j                        }t	        |j
                  dd       |j                  sJ y Nr+           g-q=atol)r   rB   r%   r+   r   funsuccessr0   rets     r   test_low_dimzTestDualAnnealing.test_low_dimk   s;    IIt~~DII7%0{{{r   c                     t        | j                  | j                  | j                        }t	        |j
                  dd       |j                  sJ y rd   )r   rB   r&   r+   r   ri   rj   rk   s     r   test_high_dimzTestDualAnnealing.test_high_dimq   s8    TYYTYYG%0{{{r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y NTno_local_searchr+   rf   -C6?rg   r   rB   r%   r+   r   ri   rk   s     r   test_low_dim_no_lsz$TestDualAnnealing.test_low_dim_no_lsv   2    TYY-1		C$/r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y rq   )r   rB   r&   r+   r   ri   rk   s     r   test_high_dim_no_lsz%TestDualAnnealing.test_high_dim_no_ls{   rw   r   c                     t        | j                  | j                  | j                        }t	        | j
                  |j                         y Nre   r   rB   r%   r+   r   r-   nfevrk   s     r   test_nb_fun_callz"TestDualAnnealing.test_nb_fun_call   s0    TYYTYYGT%%sxx0r   c                     t        | j                  | j                  d| j                        }t	        | j
                  |j                         y )NTrr   r|   rk   s     r   test_nb_fun_call_no_lsz(TestDualAnnealing.test_nb_fun_call_no_ls   s6    TYY-1		CT%%sxx0r   c                 X    t        t        t        | j                  | j                         y r   )r]   r^   r   r$   r%   r/   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 r{   )r   rB   r%   r+   r   r   )r0   res1res2res3s       r   test_reproducez TestDualAnnealing.test_reproduce   sv    diidiiHdiidiiHdiidiiH 	TVVTVV$TVVTVV$r   c                 H   t         j                  j                  d      }t        | j                  | j
                  |      }t         j                  j                  d      }t        | j                  | j
                  |      }t        |j                  |j                         y )Nr:   re   )r   randomdefault_rngr   rB   r%   r   r   )r0   rngr   r   s       r   test_rand_genzTestDualAnnealing.test_rand_gen   sl     ii##A&diicBii##A&diicB 	TVVTVV$r   c                 L    g d}t        t        t        | j                  |       y )N)r   )r:   r   )r   r   )r]   r^   r   rB   )r0   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   r]   r^   r   rB   nan)r0   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   rB   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)rH   rI   pytestwarnsRuntimeWarningr   r0   rB   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   rB   z<TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.func   r   r   r   r   r   r   SLSQPr   r   r   r   r   )rH   rI   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   )maxfunr+   )r   rB   r%   r+   rY   rZ   lenr   LS_MAXITER_RATIOLS_MAXITER_MINLS_MAXITER_MAXr}   rj   )r0   rl   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  )rs   r   r+   )r   rB   r%   r+   r}   rj   rk   s     r   test_max_fun_no_lsz$TestDualAnnealing.test_max_fun_no_ls   sB    TYY-1#DIIOxx3;;;r   c                     t        | j                  | j                  d| j                        }|j                  dk  sJ y )Ni  )maxiterr+   )r   rB   r%   r+   nitrk   s     r   test_maxiterzTestDualAnnealing.test_maxiter   s1    TYY"&))-ww#~~r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y )Nn!	@)r?   r+   r   ư>rg   ru   rk   s     r   test_fun_args_lsz"TestDualAnnealing.test_fun_args_ls   s2    TYY#-TYY@t4r   c                     t        | j                  | j                  dd| j                        }t	        |j
                  dd       y )Nr   T)r?   rs   r+   r   rt   rg   ru   rk   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)r7   r+   r3   z
stop earlyr   )r   rB   r%   r7   r+   ri   messagerj   rk   s     r   test_callback_stopz$TestDualAnnealing.test_callback_stop   s\     TYY&*mm$))Eww#~~s{{1~---;;;r   zmethod, atol))zNelder-Meadgh㈵>)COBYLAgh㈵>)Powell:0yE>)r   r   )BFGSr   )TNCr   )r   gH׊>c                     t        | j                  | j                  t        |      | j                        }t        |j                  d|       y )Nr   r   r+   rf   rg   )r   rB   r%   dictr+   r   ri   )r0   r   rh   rl   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   )r]   r^   r   rB   r%   r/   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                  k(  sJ y )Njacr   )rE   r   r
   r%   r+   njevr.   )r0   minimizer_optsrl   s      r   test_gradient_gnevz$TestDualAnnealing.test_gradient_gnev  sJ    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 Nr9   r    r   r;   r<   r=   r>   r   s    r   rB   z3TestDualAnnealing.test_from_docstring.<locals>.func  sE    66!a%"rvva"%%i!m'<"<<=RWWQZOOr   r   r9   r   r#   r   r+   )
g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>rg   rf   g-a=)r   rH   rI   r   r   ri   )r0   rB   lwuprl   s        r   test_from_docstringz%TestDualAnnealing.test_from_docstring  sa    	PWr\Vb[T$s2r{*;$G* 15		6
 	6r   z'new_e, temp_step, accepted, accept_rate))r   r     g]'?)r   r    r   gr(?)r9   r   in  gD?)r9   <   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:   )rO   rP   r    )jex_visit)r   ranger   update_currentr   temperature_stepaccept_rejectcurrent_energyr   explogr   )r0   new_e	temp_stepacceptedaccept_rater,   count_accepted
iterationsaccept_paramr   _energy_statechainpqvrates                  r    test_accept_reject_probabilisticz2TestDualAnnealing.test_accept_reject_probabilistic&  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   r5   s     r   rB   z1TestDualAnnealing.test_bounds_class.<locals>.funcR  sI    q1urBFF1ruu9q=$999:R"''!*_LAHr   r   r   r   g       r   g      r:   r3      g       @r!   r#   r   r   rg   gHz>g&.>)
r   r   rH   rI   r   r   r   arangeri   r}   )r0   rB   r   r   r   ret_bounds_class
bounds_oldret_bounds_lists           r   test_bounds_classz#TestDualAnnealing.test_bounds_classP  s    	 Wq[VaZ 1111 B)$vDI#b"+&
(jtL 	(**O,=,=DI(**BIIb!,<4H++-=-A-AM##'7'<'<<<<r   c           
         t         j                  j                  d      }d }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       y )Nl   ]k@A`Q c                 X    t        j                  t        j                  | |z              S r   )r   r;   r   r   powers     r   r5   z@TestDualAnnealing.test_callable_jac_with_args_gh11052.<locals>.fp  s    66"&&e,--r   c                 J    t        j                  | |z        |z  | |dz
  z  z  S rD   )r   r   r  s     r   r   zBTestDualAnnealing.test_callable_jac_with_args_gh11052.<locals>.jacs  s(    66!u*%-eai0@@@r   )r    r   r:   zL-BFGS-Br   )r?   r   r+   r   )r   r   r   )rtol)r   r   r   r   r   r   ri   )r0   r   r5   r   r   r   s         r   #test_callable_jac_with_args_gh11052z5TestDualAnnealing.test_callable_jac_with_args_gh11052l  s     ii##$89	.	A aeaVaV4D3/3:/FHaeaVaV4D3/3:8;0=> 	$((6r   N)r4   )'__name__
__module____qualname__r1   r7   rB   rE   r   markparametrizerV   r[   rb   rm   ro   rv   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r4   r   r   r   r      s9   "	# [[T#<=< >< [[T#451 61"K
0
0
11
&%%$
	&
EE 	55 [[^ . 00<%7 [[F I !+!+F=8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   r4   r   r   <module>r     s?   
 2 6 = > 8 ? +   J J * /d7 d7r   