o
    `^h
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ejj 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   e/home/air/shanriGPT/back/venv/lib/python3.10/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                   @       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   bool_testresr'   r   r   r   r&   I   s
   
zMyAcceptTest.__init__c                 K   s<   d| _ |  jd7  _| jd t| jk r| j| jd  S dS )NTr   )r$   r9   lenr;   )r(   kwargsr   r   r   r+   O   s
   zMyAcceptTest.__call__Nr,   r-   r.   r/   r&   r+   r   r   r   r   r8   C   s    r8   c                   @   r7   )
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      d| _ d| _d S )NFr   r$   r9   r'   r   r   r   r&   _      
zMyCallBack.__init__c                 C   s&   d| _ |  jd7  _| jdkrdS d S )NTr   
   rA   )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
ejddd Zejd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   sN   dddgf| _ dtddgf| _d| _d| _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   FL-BFGS-BTmethodjacrK   N)	x0r   r   soltolniterdispr=   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!   rM   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w   Y  t t|d tt| jd dd W d    n1 s=w   Y  d}t t|d tt| jd dd W d    n1 s_w   Y  t t|d tt| jd dd W d    d S 1 sw   Y  d S )	Nz.target_accept_rate has to be in range \(0, 1\))matchr           )target_accept_raterF   z+stepwise_factor has to be in range \(0, 1\))stepwise_factor)rV   
ValueErrorr	   r   rM   )r(   msgr   r   r   test_input_validation   s   "z&TestBasinHopping.test_input_validationc                 C   <   d}t t| j| | j| j| jd}t|j| j| | j	 d S Nr   minimizer_kwargsrP   rQ   
r	   r   rM   r=   rP   rQ   r   r   rN   rO   r(   rY   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   rd   r   )r	   r!   rM   r=   rP   rQ   r   r   rN   rO   r   nfevrg   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   BFGSrK   rd   r   )r=   copyr	   r!   rM   rP   rQ   r   rj   r   njev)r(   rY   re   rh   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 )Nrl   rK   r\   rd   rL   )r=   rm   r	   r"   rP   rQ   r   hasattrlowest_optimization_resultr   r   rL   rO   )r(   re   rh   _jacobianr   r   r   test_jac   s   


zTestBasinHopping.test_jacc                 C   rb   )Nr   rd   )
r	   r   rM   rR   rP   rQ   r   r   rN   rO   rg   r   r   r   test_2d_nograd   s   zTestBasinHopping.test_2d_nogradrC   c                 C   s`   d}g d}t  | j}|D ]}||d< tt| j| || j| jd}t|j| j	| | j
 qd S )Nr   )CGrl   z	Newton-CGrI   TNCSLSQPrK   rd   )rm   r=   r	   r!   rM   rP   rQ   r   r   rN   rO   )r(   rY   methodsre   rK   rh   r   r   r   test_all_minimizers   s   z$TestBasinHopping.test_all_minimizers   c              	   C   s   d}g d}t  | j}|D ]1}|dkrdn| j}||d< tt| j| ||| jdd}| j}|dkr4d	}t|j	| j
| |d
 qd S )Nr   )	rv   rl   rI   rw   rx   zNelder-MeadPowellCOBYLACOBYQAr~   rC   rK     )re   rP   rQ   seedr}   r   )decimal)rm   rR   rP   r	   r   rM   rQ   rO   r   r   rN   )r(   rY   ry   re   rK   rP   rh   rO   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   )re   rP   rQ   rT   )r#   stepsizer	   r!   rM   r=   rP   rQ   r   r   rN   rO   r   r$   )r(   takestepinitial_step_sizerY   rh   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 r   )r6   r	   r   rM   rR   rP   rQ   r   r   rN   rO   )r(   r   rY   rh   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   rC   )re   rP   rQ   rU   )r8   r	   r!   rM   r=   rQ   r   r$   )r(   rU   rY   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      )re   rP   rQ   callbackr   r   	   )r?   r	   r!   rM   r=   rQ   r   r$   messager   nit)r(   r   rY   rh   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optionsrC   rd   )
dictr=   rP   r	   r!   rM   rQ   r   r   minimization_failuresrg   r   r   r   test_minimizer_fail  s   z$TestBasinHopping.test_minimizer_failc                 C   s$   d}t t| j| | jd| jd d S rc   )r	   r   rM   r=   rQ   rX   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 )NrI   TrJ   c                         | d S Nappendr   r   rD   )f_1r   r   r   3     z;TestBasinHopping.test_rng_reproducibility.<locals>.callbackrF   rC   )re   rP   r   rngc                    r   r   r   r   )f_2r   r   	callback2;  r   z<TestBasinHopping.test_rng_reproducibility.<locals>.callback2)r	   r!   r   r   r   )r(   re   r   r   r   )r   r   r   test_rng_reproducibility-  s   
z)TestBasinHopping.test_rng_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   rI   TrJ   rF   rC   )re   rP   r   )r   r2   default_rngr	   r!   r   r   )r(   r   re   res1res2r   r   r   test_random_genB  s   


z TestBasinHopping.test_random_genc                 C   s>   d}t t| j| | j| j| jdd}t|j| j| | j	 d S )Nr   )re   rP   rQ   Trf   rg   r   r   r   test_monotonic_basin_hoppingR  s
   
z-TestBasinHopping.test_monotonic_basin_hoppingN)r,   r-   r.   rS   rZ   ra   ri   rk   ro   rt   ru   pytestmark	fail_slowrz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   j   s,    





rE   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   rM   f0r
   r   funr   storage)r(   minresr   r   r   rS   ]  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
   rM   r   r   r   r   update
get_lowestr   r   )r(   
new_minresretr   r   r   r   test_higher_f_rejectedg  s   

z#Test_Storage.test_higher_f_rejectedr   TFc                 C   sp   t |d}| jd |_| jd |_| j|}| j }| j|jk|ks&J | j|jk|ks0J ||u s6J d S )Nr   r   )r
   rM   r   r   r   r   r   r   )r(   r   r   r   r   r   r   r   test_lower_f_acceptedr  s   

z"Test_Storage.test_lower_f_acceptedN)	r,   r-   r.   rS   r   r   r   parametrizer   r   r   r   r   r   [  s
    
r   c                   @   s   e Zd Zdd Zdd ZdS )Test_RandomDisplacementc                 C   r@   )NrF   i )r   Nr'   r   r   r   rS     rB   z$Test_RandomDisplacement.setup_methodc                 C   sj   t jd}t | jg}t| j|d}||}d| j d d }tt |dd tt 	||d d S )Nr   )r   r   r   r      r\   r   )
r   r2   RandomStater    r   r   r   r   meanvar)r(   r   rM   displacer   vr   r   r   test_random  s   z#Test_RandomDisplacement.test_randomN)r,   r-   r.   rS   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   Tr\   r   r   rF   )r   r   metr
   res_newres_oldr'   r   r   r   rS     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 ]"}|r|r ntddd}tddd}| j||d}|r(d}qd}qt| t| d S )NFi  TrF   r   r1   r   )ranger
   r   r   )r(   
one_accept
one_rejectrY   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    d S 1 s)w   Y  d S )	Nr   Tr\   r   i  raise)overr   )r   r
   r   errstateaccept_rejectr(   r   r   r   r   r   r   test_GH7495  s   "zTest_Metropolis.test_GH7495c                    sb   dd  d}dd fdddf}t  |d	tjd
d|id}|js'J 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>.func2   ineqc                    s    |  S r   r   r   r   limitr   r   <lambda>  s    z-Test_Metropolis.test_gh7799.<locals>.<lambda>typer   r   r   constraints)r   re   gư>)rtol)r	   r   r2   r   r   r   r   )r(   rM   conrh   r   r   r   test_gh7799  s   

zTest_Metropolis.test_gh7799c                 C   s`   t d}tddd}tddd}|||dsJ d|_|||dr#J d|_|||ds.J d S )Nr   Tr\   r   rF   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r"J d S )Nc                 S   s   | |  S r   r   r   r   r   r   r        z3Test_Metropolis.test_reject_all_gh7799.<locals>.func                 S   s   | d S )Nr   r   r   r   r   r   
constraint  r   z:Test_Metropolis.test_reject_all_gh7799.<locals>.constrainteqr   )r   r   slsqp)r   boundsrK   r   rG   rC   )rM   rP   re   )r	   r   )r(   r   r   r=   rh   r   r   r   test_reject_all_gh7799  s   z&Test_Metropolis.test_reject_all_gh7799N)r,   r-   r.   rS   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 )NrF   )r   r1   F)r   verboseaccept_rate)r   r   tsr]   r   r   r'   r   r   r   rS     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 )Nr\   FTr   reportr   intervalr   r   r   r(   r   rY   r   r   r   test_adaptive_increase     

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 )Nr\   TFr   r   r   r   r   test_adaptive_decrease  r   z,Test_AdaptiveStepsize.test_adaptive_decreasec                 C   sF   d}t | jjd D ]}| | | jd q
t| jj| jk d S )Nr\   r   Tr   r   r   r   r   r   r   r   r   r   r   test_all_accepted	  
   
z'Test_AdaptiveStepsize.test_all_acceptedc                 C   sF   d}t | jjd D ]}| | | jd q
t| jj| jk  d S )Nr\   r   Fr   r   r   r   r   test_all_rejected  r   z'Test_AdaptiveStepsize.test_all_rejectedN)r,   r-   r.   rS   r   r   r   r   r   r   r   r   r     s    

r   )%r/   rm   numpy.testingr   r   r   r   r   r   rV   numpyr   r   r   scipy.optimizer	   r
   scipy.optimize._basinhoppingr   r   r   r   r   r   r!   r"   r#   r6   r8   r?   rE   r   thread_unsafer   r   r   r   r   r   r   r   <module>   s0    		 r#\