U
    /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   K/tmp/pip-unpacked-wheel-9gxwnfpp/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 )MyAcceptTestzpass 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 )
MyCallBackzpass 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   Z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"*