U
    /d7                     @   s   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mZ G d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_state)Versionc                
   @   sp  e Zd Zdd Zdd ZdXddZdYdd	Zej	d
dddddgdd Z
ej	d
dddgdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zej	d=d>d?d@dAdBdCdDgdEdF Z dGdH Z!dIdJ Z"dKdL Z#ej	dMdNdOdPdQdRgdSdT Z$dUdV Z%dWS )ZTestDualAnnealingc                 C   s\   dd | _ dgd | _| jd | _d| _d| _d| _d	| _d
| _t| j| _	d| _
d| _d S )Nc                 S   s   t jS N)npinfx r   M/tmp/pip-unpacked-wheel-9gxwnfpp/scipy/optimize/tests/test__dual_annealing.py<lambda>       z0TestDualAnnealing.setup_method.<locals>.<lambda>{Gz{Gz@      i  in  g?(\@  r   )	weirdfunc	ld_bounds	hd_boundsnbtestvalueshigh_temperatureZlow_temperatureqvseedr   rsnb_fun_callngevselfr   r   r   setup_method   s    
zTestDualAnnealing.setup_methodc                 C   s   |dkrdS d S )N      ?Tr   )r-   r   fcontextr   r   r   callback+   s    zTestDualAnnealing.callbackr   c              	   C   s`   |r
|}nd}t || d dt dt j ||    dt |  | }|  jd7  _|S )Nr   r   
      )r   sumcospisizer*   )r-   r   argsshiftyr   r   r   func1   s    
zTestDualAnnealing.funcc                 C   s   |  j d7  _ t|f| S )Nr4   )r+   r
   )r-   r   r9   r   r   r   rosen_der_wrapper<   s    z#TestDualAnnealing.rosen_der_wrapperr'   g?g(\?r   r    g333333@c           
      C   s   t t| j }t|d }t|d }|j}t|||| j}t|}|	|d| j
}tt|dd t|}|	||| j
}	tt|	d dd d S )Nr   r4   T)listzipr#   r   arrayr8   r   r)   zerosZvisitingr&   r   	not_equal)
r-   r'   lulowerupperZdimvdvaluesZ
x_step_lowZx_step_highr   r   r   test_visiting_steppingB   s    

z(TestDualAnnealing.test_visiting_steppingg      @c                 C   sn   t t| j }t|d }t|d }t|||| j}|| j| j	}t
t|d t
dt| d S )Nr   r4   g|=g    _B)r>   r?   r#   r   r@   r   r)   Zvisit_fnr&   r%   r   minmax)r-   r'   rC   rD   rE   rF   rG   r   r   r   #test_visiting_dist_high_temperatureR   s    z5TestDualAnnealing.test_visiting_dist_high_temperaturec                 C   sV   t | j}tt| j }t|d }t|d }t||}tt	|j
|td  d S )Nr   r4   )r   r"   r>   r?   r#   r   r@   r   assert_raises
ValueErrorresetr   )r-   ZowfrC   rD   rE   esr   r   r   
test_resetd   s    

zTestDualAnnealing.test_resetc                 C   s2   t | j| j| jd}t|jddd |js.td S Nr(           g-q=atol)r   r<   r#   r(   r   funsuccessAssertionErrorr-   retr   r   r   test_low_diml   s      zTestDualAnnealing.test_low_dimc                 C   s2   t | j| j| jd}t|jddd |js.td S rQ   )r   r<   r$   r(   r   rV   rW   rX   rY   r   r   r   test_high_dimr   s    zTestDualAnnealing.test_high_dimc                 C   s*   t | j| jd| jd}t|jddd d S NTno_local_searchr(   rS   -C6?rT   r   r<   r#   r(   r   rV   rY   r   r   r   test_low_dim_no_lsw   s
    
 z$TestDualAnnealing.test_low_dim_no_lsc                 C   s*   t | j| jd| jd}t|jddd d S r]   )r   r<   r$   r(   r   rV   rY   r   r   r   test_high_dim_no_ls|   s
    
 z%TestDualAnnealing.test_high_dim_no_lsc                 C   s&   t | j| j| jd}t| j|j d S NrR   r   r<   r#   r(   r   r*   nfevrY   r   r   r   test_nb_fun_call   s    z"TestDualAnnealing.test_nb_fun_callc                 C   s(   t | j| jd| jd}t| j|j d S )NTr^   re   rY   r   r   r   test_nb_fun_call_no_ls   s
    
 z(TestDualAnnealing.test_nb_fun_call_no_lsc                 C   s   t tt| j| j d S r   )rL   rM   r   r"   r#   r,   r   r   r   test_max_reinit   s    
z!TestDualAnnealing.test_max_reinitc                 C   s\   t | j| j| jd}t | j| j| jd}t | j| j| jd}t|j|j t|j|j d S rd   )r   r<   r#   r(   r   r   )r-   res1res2Zres3r   r   r   test_reproduce   s
    z TestDualAnnealing.test_reproducec                 C   sN   t jd}t| j| j|d}t jd}t| j| j|d}t|j|j d S )Nr4   rR   )r   randomZdefault_rngr   r<   r#   r   r   )r-   rngrj   rk   r   r   r   test_rand_gen   s
    zTestDualAnnealing.test_rand_genc                 C   s   dddg}t tt| j| d S )Nr   )r4   r   )r   r   )rL   rM   r   r<   )r-   Zwrong_boundsr   r   r   test_bounds_integrity   s    

z'TestDualAnnealing.test_bounds_integrityc                 C   sf   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   rL   rM   r   r<   nan)r-   Zinvalid_boundsr   r   r   test_bound_validity   s    


z%TestDualAnnealing.test_bound_validityc              	   C   sP   dd }t tddgddg}tjtdd t||d	|d
d W 5 Q R X d S )Nc                 S   s   t | d | d  S Nrr   r4   r   r5   r   r   r   r   r      r   zOTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.<lambda>rq      rr   Method CG cannot handle matchCGmethodboundsr   minimizer_kwargs)r>   r?   pytestwarnsRuntimeWarningr   r-   r<   r   r   r   r   +test_deprecated_local_search_options_bounds   s    z=TestDualAnnealing.test_deprecated_local_search_options_boundsc              	   C   sd   dd }t tddgddg}t||d|dd	 tjtd
d t||d|dd	 W 5 Q R X d S )Nc                 S   s   t | d | d  S ru   rv   r   r   r   r   r      r   z@TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.<lambda>rw   rq   rx   rr   SLSQPr}   r   ry   rz   r|   )r>   r?   r   r   r   r   r   r   r   r   test_minimizer_kwargs_bounds   s    z.TestDualAnnealing.test_minimizer_kwargs_boundsc                 C   sV   t | j| jd| jd}ttt| jtj tj	tj
}|jd| ksHt|jrRtd S )Nd   )maxfunr(   )r   r<   r#   r(   rI   rJ   lenr   ZLS_MAXITER_RATIOZLS_MAXITER_MINZLS_MAXITER_MAXrf   rX   rW   )r-   rZ   Zls_max_iterr   r   r   test_max_fun_ls   s    z!TestDualAnnealing.test_max_fun_lsc                 C   s4   t | j| jdd| jd}|jdks&t|jr0td S )NTi  )r_   r   r(   )r   r<   r#   r(   rf   rX   rW   rY   r   r   r   test_max_fun_no_ls   s    
  z$TestDualAnnealing.test_max_fun_no_lsc                 C   s(   t | j| jd| jd}|jdks$td S )Ni  )maxiterr(   )r   r<   r#   r(   ZnitrX   rY   r   r   r   test_maxiter   s    zTestDualAnnealing.test_maxiterc                 C   s*   t | j| jd| jd}t|jddd d S )Nn!	@)r9   r(   r   gư>rT   ra   rY   r   r   r   test_fun_args_ls   s
    
 z"TestDualAnnealing.test_fun_args_lsc                 C   s,   t | j| jdd| jd}t|jddd d S )Nr   T)r9   r_   r(   r   r`   rT   ra   rY   r   r   r   test_fun_args_no_ls   s    
 z%TestDualAnnealing.test_fun_args_no_lsc                 C   sF   t | j| j| j| jd}|jdks&td|jd ks8t|jrBtd S )N)r2   r(   r/   z
stop earlyr   )	r   r<   r#   r2   r(   rV   rX   messagerW   rY   r   r   r   test_callback_stop   s    
 z$TestDualAnnealing.test_callback_stopzmethod, atol)zNelder-Meadgh㈵>)ZCOBYLAgh㈵>)ZPowell:0yE>)r|   r   )ZBFGSr   )ZTNCr   )r   gH׊>c                 C   s0   t | j| jt|d| jd}t|jd|d d S )N)r~   r   r(   rS   rT   )r   r<   r#   dictr(   r   rV   )r-   r~   rU   rZ   r   r   r   test_multi_ls_minimizer   s
    

z)TestDualAnnealing.test_multi_ls_minimizerc                 C   s0   t tt| j| jdd t tt| j| jdd d S )Nr4   )Zrestart_temp_ratior   )rL   rM   r   r<   r#   r,   r   r   r   test_wrong_restart_temp	  s    
 
 z)TestDualAnnealing.test_wrong_restart_tempc                 C   s2   d| j i}tt| j|| jd}|j| jks.td S )NZjacr   )r=   r   r	   r#   r(   Znjevr+   rX   )r-   Zminimizer_optsrZ   r   r   r   test_gradient_gnev  s     z$TestDualAnnealing.test_gradient_gnevc                 C   sl   dd }dgd }dgd }t |tt||dd}t|jdd	d
dddddddg
dd t|jddd d S )Nc                 S   s4   t | |  dt dt j |    dt |   S Nr3   r   r   r5   r6   r7   r8   r   r   r   r   r     r   z7TestDualAnnealing.test_from_docstring.<locals>.<lambda>r   r3   r   r!   r   r(   g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>rT   rS   g-a=)r   r>   r?   r   r   rV   )r-   r<   lwuprZ   r   r   r   test_from_docstring  s"    

    z%TestDualAnnealing.test_from_docstringz'new_e, temp_step, accepted, accept_rate)r   r     g]'?)r   r   r   gr(?)r3   r   in  gD?)r3   <   i  gt%?)r   r   i  gw?c                 C   s   t d}d}d}d}d}	t|D ]Z}
td d d}||	dg t|d d d ||}||_|jd|dgd |j|kr |d7 }q ||kstdd| ||	  |  }|dkrdnt	
t	|d|  }t|| d S )	N{   r   r   rq   r4   )rD   rE   r   )jeZx_visit)r   ranger   Zupdate_currentr   Ztemperature_stepZaccept_rejectcurrent_energyrX   r   explogr   )r-   Znew_eZ	temp_stepacceptedZaccept_rater)   Zcount_acceptedZ
iterationsZaccept_paramr   _Zenergy_statechainZpqvZrater   r   r    test_accept_reject_probabilistic$  s0         

$z2TestDualAnnealing.test_accept_reject_probabilisticc                 C   s   dd }dgd }dgd }d|d< d|d	< d
|d< d|d< t ||}t||dd}tt||}t||dd}t|j|jdd t|jtdddd t|j|jdd |j	|j	kst
d S )Nc                 S   s8   t | |  dt dt j |    dt |   }|S r   r   )r   r0   r   r   r   r<   P  s    4z1TestDualAnnealing.test_bounds_class.<locals>.funcr   rr   r   g       r   g      r4   r/      g       @r   r!   r   r   rT   gHz>g&.>)r   r   r>   r?   r   r   r   ZarangerV   rf   rX   )r-   r<   r   r   r   Zret_bounds_classZ
bounds_oldZret_bounds_listr   r   r   test_bounds_classN  s    


z#TestDualAnnealing.test_bounds_classN)r   )r   )&__name__
__module____qualname__r.   r2   r<   r=   r   markZparametrizerH   rK   rP   r[   r\   rb   rc   rg   rh   ri   rl   ro   rp   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sd   



			
	
#r   )__doc__Zscipy.optimizer   r   Zscipy.optimize._dual_annealingr   r   r   r   r   r	   r
   r   Znumpyr   Znumpy.testingr   r   r   r   rL   Zscipy._lib._utilr   Zscipy._lib._pep440r   r   r   r   r   r   <module>   s   