U
    »mœdë7  ã                   @   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   úb/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test__dual_annealing.pyÚ<lambda>   ó    z0TestDualAnnealing.setup_method.<locals>.<lambda>©ç{®GázÀç{®Gáz@é   é   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)   ZzerosZvisitingr&   r   Ú	not_equal)
r-   r'   ÚluÚlowerÚupperÚ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'   rB   rC   rD   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owfrB   rC   rD   Ú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 )Néd   )Ú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(   Ú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-Meadgñhãˆµøô>)ZCOBYLAgñhãˆµøä>)ZPowellç:Œ0âŽyE>)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„[Çt»P2¾g“f¯ÇÒ0¾gË¯>ßíú¾gçç,â1¾gft˜;¾g¿š¤h<¾g#žÖÜç0¾gÆÁ¦(<¾g¿eÔ‘:¾gi¨Äé€5¾g:Œ0âŽye>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£   g‹r�ù¢(ô?)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sˆt‚dd| ||	  |  }|dkr¬dnt	 
t	 |¡d|  ¡}t||ƒ d S )	Né{   r   r£   rq   r4   )rC   rD   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s¼t
‚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   éþÿÿÿgH¯¼šò×z>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‚   Únumpyr   Znumpy.testingr   r   r   r   rL   Zscipy._lib._utilr   Zscipy._lib._pep440r   r   r   r   r   r   Ú<module>   s   