o
    Ö­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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   úd/var/www/html/CropPilot/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 )Ú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   Ú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   )Ú
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   ó   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 s€w   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>.funcéüÿÿÿé2   Ú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#\