o
    Ö­j A  ã                   @   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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_statec                   @   s¸  e Zd Zdd„ Zdd„ ZdMdd„ZdMdd	„Zej 	d
g d¢¡dd„ ƒZ
ej 	d
g d¢¡dd„ ƒZdd„ Zdd„ Zej d¡dd„ ƒZdd„ Zej d¡dd„ ƒZdd„ Zdd„ Zd d!„ Zej d¡d"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zejjd*d+„ ƒZejjd,d-„ ƒZd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Z d8d9„ Z!ej 	d:g d;¢¡d<d=„ ƒZ"d>d?„ Z#d@dA„ Z$ej d¡dBdC„ ƒZ%ej 	dDg dE¢¡dFdG„ ƒZ&ej d¡dHdI„ ƒZ'ej d¡dJdK„ ƒZ(dLS )NÚTestDualAnnealingc                 C   sd   dd„ | _ dgd | _| jd | _d| _d| _d| _d	| _d
| _t| jƒ| _	t
 ¡ | _t
 ¡ | _d S )Nc                 S   s   t jS ©N)ÚnpÚinf©Úx© r   úf/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/tests/test__dual_annealing.pyÚ<lambda>   s    z0TestDualAnnealing.setup_method.<locals>.<lambda>©ç{®GázÀç{®Gáz@é   é   iˆ  in  gš™™™™™¹?çö(\�Âõ@éÒ  )Ú	weirdfuncÚ	ld_boundsÚ	hd_boundsÚnbtestvaluesÚhigh_temperatureÚlow_temperatureÚqvÚseedr   ÚrngÚ	threadingÚlocalÚ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   sv   |r|}nd}t  || d dt  dt j ||  ¡  ¡dt  |¡  | }t| jdƒs1d| j_| j jd7  _|S )Nr   r   é
   Úcé   )r   ÚsumÚcosÚpiÚsizeÚhasattrr+   r5   )r.   r   ÚargsÚshiftÚyr   r   r   Úfunc2   s   
ÿÿÿzTestDualAnnealing.funcc                 C   s4   t | jdƒs
d| j_| j jd7  _t|g|¢R Ž S )Nr5   r   r6   )r;   r,   r5   r
   )r.   r   r<   r   r   r   Úrosen_der_wrapper?   s   z#TestDualAnnealing.rosen_der_wrapperr&   )gš™™™™™ñ?g�Âõ(\�ö?r   r   ç333333@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   r6   T)ÚlistÚzipr!   r   Úarrayr:   r   r(   ÚzerosÚvisitingr$   r   Ú	not_equal)
r.   r&   ÚluÚlowerÚupperÚdimÚvdÚvaluesÚ
x_step_lowÚx_step_highr   r   r   Útest_visiting_steppingG   s   

z(TestDualAnnealing.test_visiting_stepping)g      @r   rA   c                 C   sn   t t| jŽ ƒ}t |d ¡}t |d ¡}t|||| jƒ}| | j| j	¡}t
t |¡dƒ t
dt |¡ƒ d S )Nr   r6   g»½×Ùß|Û=g    _ B)rB   rC   r!   r   rD   r   r(   Úvisit_fnr$   r#   r   ÚminÚmax)r.   r&   rH   rI   rJ   rL   rM   r   r   r   Ú#test_visiting_dist_high_temperatureW   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   r6   )r   r    rB   rC   r!   r   rD   r   Úassert_raisesÚ
ValueErrorÚresetr   )r.   ÚowfrH   rI   rJ   Úesr   r   r   Ú
test_reseti   s   

zTestDualAnnealing.test_resetc                 C   ó2   t | j| j| jd�}t|jddd� |jsJ ‚d S ©N©r(   ç        gê-�™—q=©Úatol)r   r?   r!   r'   r   ÚfunÚsuccess©r.   Úretr   r   r   Útest_low_dimq   s
   ÿzTestDualAnnealing.test_low_dimr4   c                 C   r[   r\   )r   r?   r"   r'   r   ra   rb   rc   r   r   r   Útest_high_dimw   s   zTestDualAnnealing.test_high_dimc                 C   ó*   t | j| jd| jd�}t|jddd� d S )NT)Úno_local_searchr'   r^   ç-Cëâ6?r_   ©r   r?   r!   r'   r   ra   rc   r   r   r   Útest_low_dim_no_ls}   ó   
ÿz$TestDualAnnealing.test_low_dim_no_lsc                 C   rg   )NT©rh   r(   r^   giUMu?r_   )r   r?   r"   r'   r   ra   rc   r   r   r   Útest_high_dim_no_ls‚   s   
ÿz%TestDualAnnealing.test_high_dim_no_lsc                 C   s0   d| j _t| j| j| jd�}t| j j|jƒ d S )Nr   r]   ©r+   r5   r   r?   r!   r'   r   Únfevrc   r   r   r   Útest_nb_fun_callˆ   s   z"TestDualAnnealing.test_nb_fun_callc                 C   s2   d| j _t| j| jd| jd�}t| j j|jƒ d S )Nr   Trm   ro   rc   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   )rU   rV   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 )Nr]   )r   r?   r!   r'   r   r   )r.   Úres1Úres2Ú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 )Nr6   r]   )r   ÚrandomÚdefault_rngr   r?   r!   r   r   )r.   r(   rt   ru   r   r   r   Útest_rand_gen¡   s
   zTestDualAnnealing.test_rand_genc                 C   s   g d¢}t tt| j|ƒ d S )N)r   )r6   r   )r   r   )rU   rV   r   r?   )r.   Ú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   rU   rV   r   r?   Únan)r.   Úinvalid_boundsr   r   r   Útest_bound_validity³   s   
ÿ
ÿ
ÿz%TestDualAnnealing.test_bound_validityc                 C   sf   dd„ }t tddgddgƒƒ}tjtdd�� t||d	|d
œd� W d   ƒ d S 1 s,w   Y  d S )Nc                 S   ó   t  | d | d  ¡S ©Nr~   r6   ©r   r7   r   r   r   r   r?   À   ó   zKTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.funcéúÿÿÿr}   é   r~   úMethod CG cannot handle ©ÚmatchÚCG©ÚmethodÚbounds©rŽ   Úminimizer_kwargs)rB   rC   Ú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   sz   dd„ }t tddgddgƒƒ}t||d|dœd	� tjtd
d�� t||d|dœd	� W d   ƒ d S 1 s6w   Y  d S )Nc                 S   r‚   rƒ   r„   r   r   r   r   r?   Í   r…   z<TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.funcr†   r}   r‡   r~   ÚSLSQPrŒ   r�   rˆ   r‰   r‹   )rB   rC   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s$J ‚|jr)J ‚d S )Néd   )Úmaxfunr(   )r   r?   r!   r'   rR   rS   Úlenr   ÚLS_MAXITER_RATIOÚLS_MAXITER_MINÚLS_MAXITER_MAXrp   rb   )r.   rd   Ú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J ‚|jrJ ‚d S )NTiô  )rh   r™   r(   )r   r?   r!   r'   rp   rb   rc   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J ‚d S )Ni¼  )Úmaxiterr(   )r   r?   r!   r'   Únitrc   r   r   r   Útest_maxiterí   s   ÿzTestDualAnnealing.test_maxiterc                 C   rg   )N©çn†ðù!	@)r<   r(   r¥   ç�íµ ÷Æ°>r_   rj   rc   r   r   r   Útest_fun_args_lsó   rl   z"TestDualAnnealing.test_fun_args_lsc                 C   s,   t | j| jdd| jd�}t|jddd� d S )Nr¤   T)r<   rh   r(   r¥   ri   r_   rj   rc   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J ‚d|jd v sJ ‚|jr!J ‚d S )N)r3   r(   r0   z
stop earlyr   )r   r?   r!   r3   r'   ra   Úmessagerb   rc   r   r   r   Útest_callback_stopÿ   s   
ÿz$TestDualAnnealing.test_callback_stopzmethod, atol))zNelder-Meadgñhãˆµøô>)ÚCOBYLAgñhãˆµøä>)ÚCOBYQAç:Œ0âŽyE>)ÚPowellr­   )r‹   r­   )ÚBFGSr­   )ÚTNCr­   )r–   gH¯¼šò×Š>c                 C   s0   t | j| jt|d�| jd�}t|jd|d� d S )N©r�   ©r�   r(   r^   r_   )r   r?   r!   Údictr'   r   ra   )r.   r�   r`   rd   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 )Nr6   )Úrestart_temp_ratior   )rU   rV   r   r?   r!   r-   r   r   r   Útest_wrong_restart_temp  s   
ÿ

ÿz)TestDualAnnealing.test_wrong_restart_tempc                 C   s4   d| j i}tt| j|| jd�}|j| jjksJ ‚d S )NÚjacr²   )r@   r   r	   r!   r'   Únjevr,   r5   )r.   Úminimizer_optsrd   r   r   r   Útest_gradient_gnev  s   ÿþz$TestDualAnnealing.test_gradient_gnevc                 C   s\   dd„ }dgd }dgd }t |tt||ƒƒdd�}t|jg d¢d	d
� t|jddd
� d S )Nc                 S   s4   t  | |  dt  dt j |  ¡  ¡dt  | ¡  S ©Nr4   r   ©r   r7   r8   r9   r:   r   r   r   r   r?   )  s   4z3TestDualAnnealing.test_from_docstring.<locals>.funcr   r4   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>r_   r^   gê-�™—a=)r   rB   rC   r   r   ra   )r.   r?   ÚlwÚuprd   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�ù¢(ô?)r4   r˜   in  gíþD…ì?)r4   é<   i·  g‰t%Íå?)r   r˜   iÞ  gw’‘ô«ï?c                 C   sÒ   t dƒ}d}d}d}d}	t|ƒD ]-}
td d d�}| |	dg¡ t|d d d ||ƒ}||_|jd|dgd� |j|kr=|d7 }q||ksDJ ‚dd| ||	  |  }|dkrVdnt 	t 
|¡d|  ¡}t||ƒ d S )	Né{   r   rÁ   r}   r6   )rI   rJ   r   )ÚjÚeÚx_visit)r   Úranger   Úupdate_currentr   Útemperature_stepÚaccept_rejectÚcurrent_energyr   ÚexpÚlogr   )r.   Únew_eÚ	temp_stepÚacceptedÚaccept_rateÚrsÚcount_acceptedÚ
iterationsÚaccept_paramrË   Ú_Úenergy_stateÚchainÚpqvÚrater   r   r   Ú test_accept_reject_probabilistic5  s(   ÿ
€$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^J ‚d S )Nc                 S   s8   t  | |  dt  dt j |  ¡  ¡dt  | ¡  }|S r»   r¼   )r   r1   r   r   r   r?   b  s   4z1TestDualAnnealing.test_bounds_class.<locals>.funcr   r~   r   g       Àr   g      ð¿r6   r0   é   g       @r   r   r½   r­   r_   éþÿÿÿgH¯¼šò×z>g•Ö&è.>)
r   r   rB   rC   r   r   r   Úarangera   rp   )r.   r?   r¾   r¿   rŽ   Úret_bounds_classÚ
bounds_oldÚret_bounds_listr   r   r   Útest_bounds_class_  s   


z#TestDualAnnealing.test_bounds_classc           	   
      s  t j d¡}dd„ }dd„ }dd„ ‰ ‡ fdd	„}t|d
ddgddgg|tdd�d�}t|d
ddgddgg|td|d�d�}t|d
ddgddgg|td|ˆ d�d�}t|d
ddgddgg|td||d�d�}t|j|jdd� t|j|jdd� t|j|jdd� d S )Nl   ¦°]k@A`Q c                 S   s   t  t  | | ¡¡S r   )r   r7   rÌ   ©r   Úpowerr   r   r   r1   ƒ  s   zETestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.fc                 S   s   t  | | ¡| | |d   S )Nr6   )r   rÌ   rã   r   r   r   r·   †  s   zGTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.jacc                 S   s8   t  |t  | | ¡ | |d   || |  | d  ¡S )Nr   r6   )r   ÚdiagrÌ   rã   r   r   r   Úhess‰  s
   ÿÿzHTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hessc                    s   ˆ | |ƒ| S r   r   )r   Úprä   ©ræ   r   r   Úhessp�  s   zITestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hessp)r   r   r6   zL-BFGS-Br±   )r<   rŽ   r(   r�   )r�   r·   z	newton-cg)r�   r·   ræ   )r�   r·   ré   r¦   )Úrtol)r   rx   ry   r   r³   r   ra   )	r.   r(   r1   r·   ré   rt   ru   rv   Úres4r   rè   r   Ú(test_callable_jac_hess_with_args_gh11052|  s4   ÿÿÿÿÿÿÿz:TestDualAnnealing.test_callable_jac_hess_with_args_gh11052N)r   ))Ú__name__Ú
__module__Ú__qualname__r/   r3   r?   r@   r‘   ÚmarkÚparametrizerP   rT   rZ   re   Ú	fail_slowrf   rk   rn   rq   rr   rs   rw   rz   r|   r�   Úthread_unsafer•   r—   rŸ   r    r£   r§   r¨   rª   r´   r¶   rº   rÀ   rÛ   râ   rì   r   r   r   r   r      s\    









	

	


	


#

r   )Ú__doc__Úscipy.optimizer   r   Úscipy.optimize._dual_annealingr   r   r   r   r   r	   r
   r‘   Únumpyr   Únumpy.testingr   r   r   r   rU   Úscipy._lib._utilr   r)   r   r   r   r   r   Ú<module>   s   