U
    »mœdDA  ã                   @   s  d Z ddlZddlmZmZmZ ddlZddlmZ ddl	Z
ddl	mZmZ ddlmZmZ ddlmZmZmZmZ ddlmZ d	d
„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZ G dd„ dƒZ!G dd „ d ƒZ"G d!d"„ d"ƒZ#dS )#zA
Unit tests for the basin hopping global minimization algorithm.
é    N)Úassert_almost_equalÚassert_equalÚassert_)Úraises)ÚcosÚsin)ÚbasinhoppingÚOptimizeResult)ÚStorageÚRandomDisplacementÚ
MetropolisÚAdaptiveStepsize)ÚVersionc                 C   sJ   t d|  d ƒ| d |   }t dtd|  d ƒ d|   d ¡}||fS )Nç      -@ç333333Ó?çš™™™™™É?ç      -Àç       @)r   ÚnpÚarrayr   ©ÚxÚfZdf© r   ú`/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test__basinhopping.pyÚfunc1d   s    &r   c                 C   s@   t d| d  d ƒ| d d | d   | d d | d   }|S )Nr   r   r   é   r   )r   )r   r   r   r   r   Úfunc2d_nograd   s    <r   c                 C   sŽ   t d| d  d ƒ| d d | d   | d d | d   }t d¡}dtd| d  d ƒ d| d   d |d< d| d  d |d< ||fS )	Nr   r   r   r   r   é   r   r   )r   r   Úzerosr   r   r   r   r   Úfunc2d   s
    <
,r    c                 C   sŽ   d| d d  d| d  | d   d| d d   d| d   }t  d¡}d| d  d| d   d |d< d| d  d| d   |d< ||fS )Nr   r   r   r   g      @g      @)r   r   r   r   r   r   Úfunc2d_easyderiv%   s
    @
 r!   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚMyTakeStep1zfuse a copy of displace, but have it set a special parameter to
    make sure it's actually being used.c                    s   d| _ tƒ  ¡  d S )NF)Úbeen_calledÚsuperÚ__init__©Úself©Ú	__class__r   r   r%   1   s    zMyTakeStep1.__init__c                    s   d| _ tƒ  |¡S )NT)r#   r$   Ú__call__)r'   r   r(   r   r   r*   5   s    zMyTakeStep1.__call__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r*   Ú__classcell__r   r   r(   r   r"   .   s   r"   c                 C   s$   d}| t j | |t  | ¡¡7 } | S )zwredo RandomDisplacement in function form without the attribute stepsize
    to make sure everything still works ok
    ç      à?)r   ÚrandomÚuniformÚshape)r   Úsr   r   r   ÚmyTakeStep2:   s    r5   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚMyAcceptTestzŽpass a custom accept test

    This does nothing but make sure it's being used and ensure all the
    possible return values are accepted
    c              	   C   s4   d| _ d| _dddt d¡t d¡g i ddg	| _d S )NFr   zforce acceptTr   )r#   Úncallsr   Zbool_Útestresr&   r   r   r   r%   I   s        ÿzMyAcceptTest.__init__c                 K   s@   d| _ |  jd7  _| jd t| jƒk r8| j| jd  S dS d S )NTr   )r#   r7   Úlenr8   )r'   Úkwargsr   r   r   r*   O   s
    zMyAcceptTest.__call__N©r+   r,   r-   r.   r%   r*   r   r   r   r   r6   C   s   r6   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
MyCallBackz—pass a custom callback function

    This makes sure it's being used. It also returns True after 10
    steps to ensure that it's stopping early.

    c                 C   s   d| _ d| _d S )NFr   ©r#   r7   r&   r   r   r   r%   _   s    zMyCallBack.__init__c                 C   s&   d| _ |  jd7  _| jdkr"dS d S )NTr   é
   r=   )r'   r   r   Úacceptedr   r   r   r*   c   s    
zMyCallBack.__call__Nr;   r   r   r   r   r<   X   s   r<   c                   @   s¤   e Z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d„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'S )(ÚTestBasinHoppingc                 C   sZ   dddgf| _ dt ddg¡f| _d| _d| _d| _tj d¡ dd	d
œ| _	ddi| _
dS )z] Tests setup.

        Run tests based on the 1-D and 2-D functions described above.
        ç      ð?gö(\�ÂõÈ¿gš™™™™™¹¿é   éd   FiÒ  úL-BFGS-BT©ÚmethodÚjacrF   N)Úx0r   r   ÚsolÚtolÚniterÚdispr1   Úseedr:   Úkwargs_nogradr&   r   r   r   Úsetup_methodl   s    zTestBasinHopping.setup_methodc                 C   s8   d}t ttt| j| dd� t ttt| j| dd� d S )Nr   )Ú	take_step)Úaccept_test)Úassert_raisesÚ	TypeErrorr   r    rH   ©r'   Úir   r   r   Útest_TypeError   s    ÿÿzTestBasinHopping.test_TypeErrorc              	   C   s¼   d}t t|d�� tt| jd dd� W 5 Q R X t t|d�� tt| jd dd� W 5 Q R X d}t t|d�� tt| jd dd� W 5 Q R X t t|d�� tt| jd dd� W 5 Q R X d S )	Nz.target_accept_rate has to be in range \(0, 1\))Úmatchr   ç        )Útarget_accept_raterA   z+stepwise_factor has to be in range \(0, 1\))Zstepwise_factor)rR   Ú
ValueErrorr   r   rH   )r'   Úmsgr   r   r   Útest_input_validation‰   s    z&TestBasinHopping.test_input_validationc                 C   s<   d}t t| j| | j| j| jd�}t|j| j| | j	ƒ d S ©Nr   ©Úminimizer_kwargsrK   rL   ©
r   r   rH   r:   rK   rL   r   r   rI   rJ   ©r'   rU   Úresr   r   r   Útest_1d_grad–   s     ÿzTestBasinHopping.test_1d_gradc                 C   sJ   d}t t| j| | j| j| jd�}t|j| j| | j	ƒ t
|jdkƒ d S )Nr   r^   r   )r   r    rH   r:   rK   rL   r   r   rI   rJ   r   Únfevra   r   r   r   Útest_2d�   s     ÿzTestBasinHopping.test_2dc                 C   sR   d}| j  ¡ }d|d< tt| j| || j| jd�}t|jdkƒ t	|j|j
ƒ d S )Nr   ÚBFGSrF   r^   r   )r:   Úcopyr   r    rH   rK   rL   r   rd   r   Znjev)r'   rU   r_   rb   r   r   r   Ú	test_njev¥   s    
 þzTestBasinHopping.test_njevc                 C   s`   | j  ¡ }d|d< ttddg|| j| jd�}tt|jdƒƒ t|j	ƒ\}}t
|jj|| jƒ d S )Nrf   rF   rX   r^   rG   )r:   rg   r   r!   rK   rL   r   ÚhasattrZlowest_optimization_resultr   r   rG   rJ   )r'   r_   rb   Ú_Zjacobianr   r   r   Útest_jac±   s    

 þ
ÿzTestBasinHopping.test_jacc                 C   s<   d}t t| j| | j| j| jd�}t|j| j| | j	ƒ d S )Nr   r^   )
r   r   rH   rN   rK   rL   r   r   rI   rJ   ra   r   r   r   Útest_2d_nogradÂ   s     þzTestBasinHopping.test_2d_nogradc                 C   sh   d}ddddddg}t   | j¡}|D ]>}||d< tt| j| || j| jd	�}t|j| j	| | j
ƒ q$d S )
Nr   ÚCGrf   z	Newton-CGrD   ÚTNCÚSLSQPrF   r^   )rg   r:   r   r    rH   rK   rL   r   r   rI   rJ   )r'   rU   Úmethodsr_   rF   rb   r   r   r   Útest_all_minimizersÊ   s     þz$TestBasinHopping.test_all_minimizersc                 C   s~   d}dddddddd	g}t   | j¡}|D ]P}||d
< tt| j| || j| jd�}| j}|d	krbd}t|j	| j
| |d� q(d S )Nr   rm   rf   rD   rn   ro   zNelder-MeadZPowellZCOBYLArF   r^   r   )Údecimal)rg   rN   r   r   rH   rK   rL   rJ   r   r   rI   )r'   rU   rp   r_   rF   rb   rJ   r   r   r   Útest_all_nograd_minimizers×   s$    
  ÿ þz+TestBasinHopping.test_all_nograd_minimizersc                 C   sb   t ƒ }|j}d}tt| j| | j| j| j|d�}t|j	| j
| | jƒ t|jƒ t||jkƒ d S ©Nr   )r_   rK   rL   rP   )r"   Ústepsizer   r    rH   r:   rK   rL   r   r   rI   rJ   r   r#   )r'   ÚtakestepZinitial_step_sizerU   rb   r   r   r   Útest_pass_takestepè   s     þ
z#TestBasinHopping.test_pass_takestepc                 C   sB   t }d}tt| j| | j| j| j|d�}t|j| j	| | j
ƒ d S rt   )r5   r   r   rH   rN   rK   rL   r   r   rI   rJ   )r'   rv   rU   rb   r   r   r   Útest_pass_simple_takestepö   s     ýz*TestBasinHopping.test_pass_simple_takestepc                 C   s6   t ƒ }d}tt| j| | jd| j|d� t|jƒ d S )Nr   r>   )r_   rK   rL   rQ   )r6   r   r    rH   r:   rL   r   r#   )r'   rQ   rU   r   r   r   Útest_pass_accept_test   s      ÿz&TestBasinHopping.test_pass_accept_testc                 C   sT   t ƒ }d}tt| j| | jd| j|d�}t|jƒ td|jd kƒ t	|j
dƒ d S )Nr   é   )r_   rK   rL   Úcallbackr{   r   é	   )r<   r   r    rH   r:   rL   r   r#   Úmessager   Únit)r'   r{   rU   rb   r   r   r   Útest_pass_callback  s      ÿ
z#TestBasinHopping.test_pass_callbackc                 C   sN   d}t dd�| jd< d| _tt| j| | j| j| jd�}t|jd |j	ƒ d S )Nr   r   )ÚmaxiterÚoptionsr>   r^   )
Údictr:   rK   r   r    rH   rL   r   r~   Zminimization_failuresra   r   r   r   Útest_minimizer_fail  s     ÿz$TestBasinHopping.test_minimizer_failc                 C   s$   d}t t| j| | jd| jd� d S r]   )r   r   rH   r:   rL   rT   r   r   r   Útest_niter_zero&  s
     ÿz TestBasinHopping.test_niter_zeroc                    st   dddœ}g ‰ ‡ fdd„}t tddg|d|dd� g ‰‡fd	d
„}t tddg|d|dd� tt ˆ ¡t ˆ¡ƒ d S )NrD   TrE   c                    s   ˆ   |¡ d S ©N©Úappend©r   r   r?   )Úf_1r   r   r{   2  s    z<TestBasinHopping.test_seed_reproducibility.<locals>.callbackrA   r>   )r_   rK   r{   rM   c                    s   ˆ   |¡ d S r…   r†   rˆ   )Úf_2r   r   Ú	callback2:  s    z=TestBasinHopping.test_seed_reproducibility.<locals>.callback2)r   r    r   r   r   )r'   r_   r{   r‹   r   )r‰   rŠ   r   Útest_seed_reproducibility,  s     
  ÿ  ÿz*TestBasinHopping.test_seed_reproducibilityc                 C   s`   t j d¡}dddœ}ttddg|d|d�}t j d¡}ttddg|d|d�}t|j|jƒ d S )Nr   rD   TrE   rA   r>   )r_   rK   rM   )r   r1   Zdefault_rngr   r    r   r   )r'   Úrngr_   Zres1Zres2r   r   r   Útest_random_genA  s    

 þ
 þz TestBasinHopping.test_random_genc                 C   s>   d}t t| j| | j| j| jdd�}t|j| j| | j	ƒ d S )Nr   )r_   rK   rL   ÚTr`   ra   r   r   r   Útest_monotonic_basin_hoppingQ  s      ÿz-TestBasinHopping.test_monotonic_basin_hoppingN)r+   r,   r-   rO   rV   r\   rc   re   rh   rk   rl   rq   rs   rw   rx   ry   r   rƒ   r„   rŒ   rŽ   r�   r   r   r   r   r@   j   s&   

r@   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTest_Storagec                 C   s6   t  d¡| _d| _tƒ }| j|_| j|_t|ƒ| _d S )Nr   r   )	r   r   rH   Úf0r	   r   Úfunr
   Ústorage)r'   Úminresr   r   r   rO   Z  s    zTest_Storage.setup_methodc                 C   s^   t ƒ }| jd |_| jd |_| j |¡}| j ¡ }t| j|jƒ t| j|jƒ t	| ƒ d S ©Nr   )
r	   rH   r   r’   r“   r”   ÚupdateÚ
get_lowestr   r   ©r'   Z
new_minresÚretr•   r   r   r   Útest_higher_f_rejectedd  s    
z#Test_Storage.test_higher_f_rejectedc                 C   s`   t ƒ }| jd |_| jd |_| j |¡}| j ¡ }t| j|jkƒ t| j|jkƒ t|ƒ d S r–   )	r	   rH   r   r’   r“   r”   r—   r˜   r   r™   r   r   r   Útest_lower_f_acceptedo  s    
z"Test_Storage.test_lower_f_acceptedN)r+   r,   r-   rO   r›   rœ   r   r   r   r   r‘   Y  s   
r‘   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTest_RandomDisplacementc                 C   s.   d| _ t| j d�| _d| _t | jg¡| _d S )NrA   ©ru   ià“ )ru   r   ÚdisplaceÚNr   r   rH   r&   r   r   r   rO   |  s    z$Test_RandomDisplacement.setup_methodc                 C   sF   |   | j¡}d| j d d }tt |¡ddƒ tt |¡|dƒ d S )Nr   r   é   rX   r   )rŸ   rH   ru   r   r   ZmeanÚvar)r'   r   Úvr   r   r   Útest_random‚  s    z#Test_RandomDisplacement.test_randomN)r+   r,   r-   rO   r¤   r   r   r   r   r�   {  s   r�   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTest_Metropolisc                 C   s   d| _ t| j ƒ| _d S )Nr   )r�   r   Úmetr&   r   r   r   rO   �  s    zTest_Metropolis.setup_methodc                 C   s    | j ddd�}t|tƒst‚d S ©NrX   rA   ©Úf_newÚf_old)r¦   Ú
isinstanceÚboolÚAssertionError)r'   rš   r   r   r   Útest_boolean_return‘  s    z#Test_Metropolis.test_boolean_returnc                 C   s   t | jddd�ƒ d S r§   )r   r¦   r&   r   r   r   rœ   —  s    z%Test_Metropolis.test_lower_f_acceptedc                 C   s$   t t| jdd� t t| jdd� d S )NrA   )rª   )r©   )rR   ÚKeyErrorr¦   r&   r   r   r   Útest_KeyErrorš  s    zTest_Metropolis.test_KeyErrorc                 C   sR   d}d}t dƒD ],}|r |r  q>| jddd�}|r8d}qd}qt|ƒ t|ƒ d S )NFiè  rA   r0   r¨   T)Úranger¦   r   )r'   Z
one_acceptZ
one_rejectrU   rš   r   r   r   Útest_acceptŸ  s    zTest_Metropolis.test_acceptc              	   C   s0   t dƒ}tjdd�� | dd¡ W 5 Q R X d S )Nr   Úraise)Zoverr   iÐ  )r   r   ZerrstateZaccept_reject)r'   r¦   r   r   r   Útest_GH7495®  s    zTest_Metropolis.test_GH7495N)	r+   r,   r-   rO   r®   rœ   r°   r²   r´   r   r   r   r   r¥   Œ  s   r¥   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTest_AdaptiveStepsizec                 C   s2   d| _ t| j d�| _d| _t| jd| jd�| _d S )NrA   rž   r0   F)rv   ÚverboseZaccept_rate)ru   r   ÚtsrY   r   rv   r&   r   r   r   rO   ·  s    ÿz"Test_AdaptiveStepsize.setup_methodc                 C   sX   d}|   |¡ | j  d¡ t| j jƒD ]}|   |¡ | j  d¡ q&t| jj| jkƒ d S )NrX   FT©rv   Úreportr±   Úintervalr   r·   ru   ©r'   r   rU   r   r   r   Útest_adaptive_increase¾  s    

z,Test_AdaptiveStepsize.test_adaptive_increasec                 C   sX   d}|   |¡ | j  d¡ t| j jƒD ]}|   |¡ | j  d¡ q&t| jj| jk ƒ d S )NrX   TFr¸   r»   r   r   r   Útest_adaptive_decreaseÈ  s    

z,Test_AdaptiveStepsize.test_adaptive_decreasec                 C   sF   d}t | jjd ƒD ]}|  |¡ | j d¡ qt| jj| jkƒ d S )NrX   r   T©r±   rv   rº   r¹   r   r·   ru   r»   r   r   r   Útest_all_acceptedÒ  s
    
z'Test_AdaptiveStepsize.test_all_acceptedc                 C   sF   d}t | jjd ƒD ]}|  |¡ | j d¡ qt| jj| jk ƒ d S )NrX   r   Fr¾   r»   r   r   r   Útest_all_rejectedÚ  s
    
z'Test_AdaptiveStepsize.test_all_rejectedN)r+   r,   r-   rO   r¼   r½   r¿   rÀ   r   r   r   r   rµ   ¶  s
   

rµ   )$r.   rg   Znumpy.testingr   r   r   Zpytestr   rR   Únumpyr   r   r   Zscipy.optimizer   r	   Zscipy.optimize._basinhoppingr
   r   r   r   Zscipy._lib._pep440r   r   r   r    r!   r"   r5   r6   r<   r@   r‘   r�   r¥   rµ   r   r   r   r   Ú<module>   s.   		 p"*