
    tKg?                         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                   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                        | _	        d
| _
        d
| _        y )Nc                 "    t         j                  S N)npinfxs    m/home/alanp/www/video.onchill/myenv/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?(\@  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_lsw   s2    TYY-1		C$/r   c                     t        | j                  | j                  d| j                        }t	        |j
                  dd       y rr   )r   rB   r&   r+   r   ri   rk   s     r   test_high_dim_no_lsz%TestDualAnnealing.test_high_dim_no_ls|   s2    TYY-1		C$/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 )NTrs   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)rn   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 Nrn   r:   r   r;   r   s    r   rB   zKTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.func       661q5QU+,,r   r      rn   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   sU    	-c2r(QF+, \\.0KL,0F!CE MLLs   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   rn   SLSQPr   r   r   r   r   )rH   rI   r   r   r   r   r   s      r   test_minimizer_kwargs_boundsz.TestDualAnnealing.test_minimizer_kwargs_bounds   sl    	-c2r(QF+,(/6B	D
 \\.0KL,0F!CE MLLs   	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  )rt   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   rv   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?   rt   r+   r   ru   rg   rv   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㈵>)COBYQA:0yE>)Powellr   )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>.funcX  sI    q1urBFF1ruu9q=$999:R"''!*_LAHr   r   rn   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_classU  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                 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   r5   zETestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.fy  s    66"&&e,--r   c                 J    t        j                  | |z        |z  | |dz
  z  z  S rD   )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   r4   )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   )r?   r   r+   r   )r   r   z	newton-cg)r   r   r  )r   r   r  r   )rtol)r   r   r   r   r   r   ri   )
r0   r   r5   r   r  r   r   r   res4r  s
            @r   (test_callable_jac_hess_with_args_gh11052z:TestDualAnnealing.test_callable_jac_hess_with_args_gh11052r  s'    ii##$89	.	A		& aeaVaV4D3/3:/FHaeaVaV4D3/3:8;0=> aeaVaV4D3/3;8;$0HI aeaVaV4D3/3;8;50JK 	$((6$((6$((6r   N)r4   )(__name__
__module____qualname__r1   r7   rB   rE   r   markparametrizerV   r[   rb   rm   	fail_slowrp   rw   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      s   "	# [[T#<=< >< [[T#451 61"K [[1 
0
 [[10 0
11
& [[1% %%$
	&
EE 	55 [[^ 	. 	0	0<% [[17 7 [[F I !+!+F [[1= =8 [[1#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   r4   r   r   <module>r      s?   
 2 6 = > 8 ? +   J J * /7 7r   