a
    ‡ù»jÞK  ã                   @   s  d Z ddlZddlmZ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	„ 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_Úassert_allclose)Úraises)ÚcosÚsin)ÚbasinhoppingÚOptimizeResult)ÚStorageÚRandomDisplacementÚ
MetropolisÚAdaptiveStepsizec                 C   sJ   t d|  d ƒ| d |   }t dtd|  d ƒ d|   d ¡}||fS )Nç      -@ç333333Ó?çš™™™™™É?ç      -Àç       @)r   ÚnpÚarrayr   ©ÚxÚfÚdf© r   úME:\soccer\ml_env\Lib\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    r6   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$   r8   Úlenr9   )r(   Úkwargsr   r   r   r+   O   s
    zMyAcceptTest.__call__N©r,   r-   r.   r/   r&   r+   r   r   r   r   r7   C   s   r7   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$   r8   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ÚjacrG   N)Úx0r   r   ÚsolÚtolÚniterÚdispr2   Ú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!   rI   ©r(   Úir   r   r   Útest_TypeError   s    ÿÿzTestBasinHopping.test_TypeErrorc                 C   s  d}t t|d��$ tt| jd dd� W d   ƒ n1 s:0    Y  t t|d��$ tt| jd dd� W d   ƒ n1 sz0    Y  d}t t|d��$ tt| jd dd� W d   ƒ n1 s¾0    Y  t t|d��$ tt| jd dd� W d   ƒ n1 sþ0    Y  d S )	Nz.target_accept_rate has to be in range \(0, 1\))Úmatchr   ç        )Útarget_accept_raterB   z+stepwise_factor has to be in range \(0, 1\))Zstepwise_factor)rS   Ú
ValueErrorr	   r   rI   )r(   Úmsgr   r   r   Útest_input_validation‰   s    222z&TestBasinHopping.test_input_validationc                 C   s<   d}t t| j| | j| j| jd�}t|j| j| | j	ƒ d S ©Nr   ©Úminimizer_kwargsrL   rM   ©
r	   r   rI   r;   rL   rM   r   r   rJ   rK   ©r(   rV   Ú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!   rI   r;   rL   rM   r   r   rJ   rK   r   Únfevrb   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   ÚBFGSrG   r_   r   )r;   Úcopyr	   r!   rI   rL   rM   r   re   r   Znjev)r(   rV   r`   rc   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 )Nrg   rG   rY   r_   rH   )r;   rh   r	   r"   rL   rM   r   ÚhasattrZlowest_optimization_resultr   r   rH   rK   )r(   r`   rc   Ú_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   rI   rO   rL   rM   r   r   rJ   rK   rb   r   r   r   Útest_2d_nogradÂ   s    þzTestBasinHopping.test_2d_nogradc                 C   s`   d}g d¢}t   | j¡}|D ]>}||d< tt| j| || j| jd�}t|j| j	| | j
ƒ qd S )Nr   )ÚCGrg   z	Newton-CGrE   ÚTNCÚSLSQPrG   r_   )rh   r;   r	   r!   rI   rL   rM   r   r   rJ   rK   )r(   rV   Úmethodsr`   rG   rc   r   r   r   Útest_all_minimizersÊ   s    þz$TestBasinHopping.test_all_minimizersc                 C   sr   d}g d¢}t   | j¡}|D ]P}||d< tt| j| || j| jd�}| j}|dkrVd}t|j	| j
| |d� qd S )Nr   )rn   rg   rE   ro   rp   zNelder-MeadZPowellÚCOBYLArG   r_   rs   r   )Údecimal)rh   rO   r	   r   rI   rL   rM   rK   r   r   rJ   )r(   rV   rq   r`   rG   rc   rK   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`   rL   rM   rQ   )r#   Ústepsizer	   r!   rI   r;   rL   rM   r   r   rJ   rK   r   r$   )r(   ÚtakestepZinitial_step_sizerV   rc   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 rv   )r6   r	   r   rI   rO   rL   rM   r   r   rJ   rK   )r(   rx   rV   rc   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`   rL   rM   rR   )r7   r	   r!   rI   r;   rM   r   r$   )r(   rR   rV   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 v ƒ t	|j
dƒ d S )Nr   é   )r`   rL   rM   Úcallbackr}   r   é	   )r=   r	   r!   rI   r;   rM   r   r$   Úmessager   Únit)r(   r}   rV   rc   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;   rL   r	   r!   rI   rM   r   r€   Zminimization_failuresrb   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   rI   r;   rM   rU   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 )NrE   TrF   c                    s   ˆ   |¡ d S ©N©Úappend©r   r   r@   )Úf_1r   r   r}   2  s    z<TestBasinHopping.test_seed_reproducibility.<locals>.callbackrB   r?   )r`   rL   r}   rN   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   rE   TrF   rB   r?   )r`   rL   rN   )r   r2   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`   rL   rM   ÚTra   rb   r   r   r   Útest_monotonic_basin_hoppingQ  s
    
ÿz-TestBasinHopping.test_monotonic_basin_hoppingN)r,   r-   r.   rP   rW   r]   rd   rf   ri   rl   rm   rr   ru   ry   rz   r{   r�   r…   r†   rŽ   r�   r’   r   r   r   r   rA   j   s&   

rA   c                   @   s6   e Zd Zdd„ Zdd„ Zej dddg¡dd	„ ƒZd
S )ÚTest_Storagec                 C   s:   t  d¡| _d| _tdd�}| j|_| j|_t|ƒ| _d S )Nr   r   T©Úsuccess)	r   r   rI   Úf0r
   r   Úfunr   Ústorage)r(   Úminresr   r   r   rP   Z  s    
zTest_Storage.setup_methodc                 C   sb   t dd�}| jd |_| jd |_| j |¡}| j ¡ }t| j|jƒ t| j|jƒ t	| ƒ d S )NTr”   r   )
r
   rI   r   r–   r—   r˜   ÚupdateÚ
get_lowestr   r   )r(   Ú
new_minresÚretr™   r   r   r   Útest_higher_f_rejectedd  s    

z#Test_Storage.test_higher_f_rejectedr•   TFc                 C   sp   t |d�}| jd |_| jd |_| j |¡}| j ¡ }| j|jk|ksLJ ‚| j|jk|ks`J ‚||u slJ ‚d S )Nr”   r   )r
   rI   r   r–   r—   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.   rP   rž   ÚpytestÚmarkZparametrizerŸ   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 )NrB   ©rw   ià“ )rw   r   ÚdisplaceÚNr   r    rI   r'   r   r   r   rP   }  s    z$Test_RandomDisplacement.setup_methodc                 C   sF   |   | j¡}d| j d d }tt |¡ddƒ tt |¡|dƒ d S )Nr   r   é   rY   r   )r¤   rI   rw   r   r   ÚmeanÚvar)r(   r   Úvr   r   r   Útest_randomƒ  s    z#Test_RandomDisplacement.test_randomN)r,   r-   r.   rP   rª   r   r   r   r   r¢   |  s   r¢   c                   @   sL   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S )ÚTest_Metropolisc                 C   s2   d| _ t| j ƒ| _tddd�| _tddd�| _d S )Nr   TrY   ©r•   r—   rB   )r‘   r   Úmetr
   Úres_newÚres_oldr'   r   r   r   rP   Ž  s    zTest_Metropolis.setup_methodc                 C   s$   | j | j| jd�}t|tƒs J ‚d S ©N©r®   r¯   )r­   r®   r¯   Ú
isinstanceÚbool)r(   r�   r   r   r   Útest_boolean_return”  s    z#Test_Metropolis.test_boolean_returnc                 C   s   t | j| j| jd�ƒ d S r°   )r   r­   r®   r¯   r'   r   r   r   rŸ   š  s    z%Test_Metropolis.test_lower_f_acceptedc                 C   sj   d}d}t dƒD ]D}|r |r  qVtddd�}tddd�}| j||d�}|rPd}qd}qt|ƒ t|ƒ d S )NFiè  TrB   r¬   r1   r±   )Úranger
   r­   r   )r(   Z
one_acceptZ
one_rejectrV   r®   r¯   r�   r   r   r   Útest_accept�  s    zTest_Metropolis.test_acceptc                 C   s^   t dƒ}tddd�}tddd�}tjdd�� |j||d� W d   ƒ n1 sP0    Y  d S )	Nr   TrY   r¬   iÐ  Úraise)Zoverr±   )r   r
   r   ZerrstateZaccept_reject©r(   r­   r®   r¯   r   r   r   Útest_GH7495®  s
    zTest_Metropolis.test_GH7495c                    sX   dd„ ‰ d}d‰d‡ ‡fdd„dœf}t ˆ |d	d
|id�}|jsDJ ‚t|jˆdd� d S )Nc                 S   s   | d d d | d d  S )Nr   é   r   ©r   r   r   r   Úfuncº  s    z)Test_Metropolis.test_gh7799.<locals>.funcéüÿÿÿé2   Zineqc                    s   ˆ | ƒˆ S r‡   r   r»   ©r¼   Úlimitr   r   Ú<lambda>¿  ó    z-Test_Metropolis.test_gh7799.<locals>.<lambda>©Útyper—   r|   Úconstraints)r`   g�íµ ÷Æ°>)Zrtol)r	   r•   r   r—   )r(   rI   Úconrc   r   r¿   r   Útest_gh7799·  s    
zTest_Metropolis.test_gh7799c                 C   s`   t dƒ}tddd�}tddd�}|||d�s0J ‚d|_|||d�rFJ ‚d|_|||d�s\J ‚d S )Nr   TrY   r¬   rB   r±   F)r   r
   r•   r¸   r   r   r   Útest_accept_gh7799Ä  s    z"Test_Metropolis.test_accept_gh7799c                 C   sH   dd„ }dd„ }d|dœddgdd	œ}t |d
dgd|d�}|jrDJ ‚d S )Nc                 S   s   | |  S r‡   r   r»   r   r   r   r—   ×  s    z3Test_Metropolis.test_reject_all_gh7799.<locals>.func                 S   s   | d S )Nr   r   r»   r   r   r   Ú
constraintÚ  s    z:Test_Metropolis.test_reject_all_gh7799.<locals>.constraintÚeqrÃ   )r   r   Zslsqp)rÅ   ZboundsrG   r   rC   r?   )rI   rL   r`   )r	   r•   )r(   r—   rÉ   r;   rc   r   r   r   Útest_reject_all_gh7799Õ  s    ÿz&Test_Metropolis.test_reject_all_gh7799N)r,   r-   r.   rP   r´   rŸ   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 )NrB   r£   r1   F)rx   ÚverboseZaccept_rate)rw   r   ÚtsrZ   r   rx   r'   r   r   r   rP   ä  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 )NrY   FT©rx   Úreportrµ   Úintervalr   rÎ   rw   ©r(   r   rV   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 )NrY   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 )NrY   r   T©rµ   rx   rÑ   rÐ   r   rÎ   rw   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 )NrY   r   FrÕ   rÒ   r   r   r   Útest_all_rejected  s
    
z'Test_AdaptiveStepsize.test_all_rejectedN)r,   r-   r.   rP   rÓ   rÔ   rÖ   r×   r   r   r   r   rÌ   ã  s
   

rÌ   )#r/   rh   Znumpy.testingr   r   r   r   r    r   rS   Únumpyr   r   r   Zscipy.optimizer	   r
   Zscipy.optimize._basinhoppingr   r   r   r   r   r   r!   r"   r#   r6   r7   r=   rA   r“   r¢   r«   rÌ   r   r   r   r   Ú<module>   s,   		 p#V