
     hDA                     v   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	 Zd
 Zd Zd Z G d de          Zd Z G d d          Z G d d          Z G d d          Z G d d          Z  G d d          Z! G d d          Z" G 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                     t          d| z  dz
            | dz   | z  z   }t          j        dt          d| z  dz
            z  d| z  z   dz             }||fS )N      -@333333?皙?      -       @)r   nparrayr   xfdfs      c/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/scipy/optimize/tests/test__basinhopping.pyfunc1dr      s_    D1HsNq3w!m+A	%#dQhn---Q6<	=	=Bb5L    c                     t          d| d         z  dz
            | d         dz   | d         z  z   | d         dz   | d         z  z   }|S )Nr   r   r      r   )r   )r   r   s     r   func2d_nogradr!      sM    D1Q4K#!A$*!!44!s
ad7JJAHr   c                 >   t          d| d         z  dz
            | d         dz   | d         z  z   | d         dz   | d         z  z   }t          j        d          }dt          d| d         z  dz
            z  d| d         z  z   dz   |d<   d| d         z  dz   |d<   ||fS )	Nr   r   r   r    r      r   r   )r   r   zerosr   r   s      r   func2dr%      s    D1Q4K#!A$*!!44!s
ad7JJA	!BCqtc)***R!A$Y6<BqE1IOBqEb5Lr   c                    d| d         dz  z  d| d         z  | d         z  z   d| d         dz  z  z   d| d         z  z
  }t          j        d          }d| d         z  d| d         z  z   dz
  |d<   d| d         z  d| d         z  z   |d<   ||fS )Nr   r   r#   r    g      @g      @)r   r$   r   s      r   func2d_easyderivr'   %   s    AaD!Gc!A$hqtm#c!A$'k1C!H<A	!B!Hs1Q4x#%BqE!Hs1Q4xBqEb5Lr   c                   ,     e Zd ZdZ fdZ fdZ xZS )MyTakeStep1zfuse a copy of displace, but have it set a special parameter to
    make sure it's actually being used.c                 V    d| _         t                                                       d S )NF)been_calledsuper__init__)self	__class__s    r   r-   zMyTakeStep1.__init__1   s'     r   c                 T    d| _         t                                          |          S )NT)r+   r,   __call__)r.   r   r/   s     r   r1   zMyTakeStep1.__call__5   s#    ww"""r   )__name__
__module____qualname____doc__r-   r1   __classcell__)r/   s   @r   r)   r)   .   s[        + +    # # # # # # # # #r   r)   c                 x    d}| t           j                            | |t          j        |                     z  } | S )zwredo RandomDisplacement in function form without the attribute stepsize
    to make sure everything still works ok
          ?)r   randomuniformshape)r   ss     r   myTakeStep2r=   :   s6     	A		A2q"(1++	.	..AHr   c                       e Zd ZdZd Z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           	          d| _         d| _        dddt          j        d          t          j        d          g i ddg	| _        d S )NFr   zforce acceptTr    )r+   ncallsr   bool_testresr.   s    r   r-   zMyAcceptTest.__init__I   sB     ~tRXd^^RA7r   c                     d| _         | xj        dz  c_        | j        dz
  t          | j                  k     r| j        | j        dz
           S dS )NTr    )r+   rA   lenrC   )r.   kwargss     r   r1   zMyAcceptTest.__call__O   sM    q;?S....<a004r   Nr2   r3   r4   r5   r-   r1    r   r   r?   r?   C   s<         
7 7 7    r   r?   c                       e Zd ZdZd Z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                 "    d| _         d| _        d S )NFr   r+   rA   rD   s    r   r-   zMyCallBack.__init___   s     r   c                 N    d| _         | xj        dz  c_        | j        dk    rdS d S )NTr    
   rM   )r.   r   r   accepteds       r   r1   zMyCallBack.__call__c   s4    q;"4 r   NrH   rI   r   r   rK   rK   X   s<               r   rK   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )TestBasinHoppingc                     dddgf| _         dt          j        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jacrY   N)x0r   r   soltolniterdispr9   seedrG   kwargs_nogradrD   s    r   setup_methodzTestBasinHopping.setup_methodl   s{    
 c
#BHfd^445
	 		t!+D99&
3r   c                     d}t          t          t          t          | j        |         d           t          t          t          t          | j        |         d           d S )Nr    )	take_step)accept_test)assert_raises	TypeErrorr	   r%   r[   r.   is     r   test_TypeErrorzTestBasinHopping.test_TypeError   sc    ivtwqz !	# 	# 	# 	# 	ivtwqz"#	% 	% 	% 	% 	% 	%r   c                    d}t          t          |          5  t          t          | j        d         d           d d d            n# 1 swxY w Y   t          t          |          5  t          t          | j        d         d           d d d            n# 1 swxY w Y   d}t          t          |          5  t          t          | j        d         d           d d d            n# 1 swxY w Y   t          t          |          5  t          t          | j        d         d           d d d            d S # 1 swxY w Y   d S )	Nz.target_accept_rate has to be in range \(0, 1\))matchr           )target_accept_raterT   z+stepwise_factor has to be in range \(0, 1\))stepwise_factor)rf   
ValueErrorr	   r   r[   )r.   msgs     r   test_input_validationz&TestBasinHopping.test_input_validation   sp   @:S111 	D 	DCCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D:S111 	D 	DCCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D >:S111 	A 	AR@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A:S111 	A 	AR@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	AsG   #AAA)#BBB;#C**C.1C.#D;;D?D?c                     d}t          t          | j        |         | j        | j        | j                  }t          |j        | j        |         | j	                   d S Nr   minimizer_kwargsr^   r_   
r	   r   r[   rG   r^   r_   r   r   r\   r]   r.   ri   ress      r   test_1d_gradzTestBasinHopping.test_1d_grad   sT    6471:!%$)= = =CE48A;99999r   c                     d}t          t          | j        |         | j        | j        | j                  }t          |j        | j        |         | j	                   t          |j        dk               d S )Nr    ru   r   )r	   r%   r[   rG   r^   r_   r   r   r\   r]   r   nfevrx   s      r   test_2dzTestBasinHopping.test_2d   sh    6471:!%$)= = =CE48A;9991r   c                    d}| j                                         }d|d<   t          t          | j        |         || j        | j                  }t          |j        dk               t          |j        |j
                   d S )Nr    BFGSrY   ru   r   )rG   copyr	   r%   r[   r^   r_   r   r|   r   njev)r.   ri   rv   ry   s       r   	test_njevzTestBasinHopping.test_njev   s    ;++--%+"6471:,<DJ $	+ + + 	1SXsx(((((r   c                 >   | j                                         }d|d<   t          t          ddg|| j        | j                  }t          t          |j        d                     t          |j	                  \  }}t          |j        j        || j                   d S )Nr   rY   rm   ru   rZ   )rG   r   r	   r'   r^   r_   r   hasattrlowest_optimization_resultr   r   rZ   r]   )r.   rv   ry   _jacobians        r   test_jaczTestBasinHopping.test_jac   s    ;++--%+"+c3Z,<DJ $	+ + + 	6>>??? 'su--8C:> H	& 	& 	& 	& 	&r   c                     d}t          t          | j        |         | j        | j        | j                  }t          |j        | j        |         | j	                   d S )Nr    ru   )
r	   r!   r[   ra   r^   r_   r   r   r\   r]   rx   s      r   test_2d_nogradzTestBasinHopping.test_2d_nograd   sX    =$'!*,0,>!%$)= = = 	CE48A;99999r   c                     d}g d}t          j         | j                  }|D ][}||d<   t          t          | j        |         || j        | j                  }t          |j        | j	        |         | j
                   \d S )Nr    )CGr   z	Newton-CGrW   TNCSLSQPrY   ru   )r   rG   r	   r%   r[   r^   r_   r   r   r\   r]   )r.   ri   methodsrv   rY   ry   s         r   test_all_minimizersz$TestBasinHopping.test_all_minimizers   s     III9T[11 	> 	>F)/X&vtwqz0@%)ZdiA A AC  tx{DH====	> 	>r   c                    d}g d}t          j         | j                  }|D ]f}||d<   t          t          | j        |         || j        | j                  }| j        }|dk    rd}t          |j	        | j
        |         |           gd S )Nr    )r   r   rW   r   r   zNelder-MeadPowellCOBYLArY   ru   r   r#   )decimal)r   ra   r	   r!   r[   r^   r_   r]   r   r   r\   )r.   ri   r   rv   rY   ry   r]   s          r   test_all_nograd_minimizersz+TestBasinHopping.test_all_nograd_minimizers   s     6 6 69T%788 	A 	AF)/X&}dgaj0@%)ZdiA A AC (C!!tx{C@@@@@	A 	Ar   c                 @   t                      }|j        }d}t          t          | j        |         | j        | j        | j        |          }t          |j	        | j
        |         | j                   t          |j                   t          ||j        k               d S Nr    )rv   r^   r_   rd   )r)   stepsizer	   r%   r[   rG   r^   r_   r   r   r\   r]   r   r+   )r.   takestepinitial_step_sizeri   ry   s        r   test_pass_takestepz#TestBasinHopping.test_pass_takestep   s     ==$-6471:!%$)%-/ / / 	CE48A;999$%%%!X%6677777r   c                     t           }d}t          t          | j        |         | j        | j        | j        |          }t          |j        | j	        |         | j
                   d S r   )r=   r	   r!   r[   ra   r^   r_   r   r   r\   r]   )r.   r   ri   ry   s       r   test_pass_simple_takestepz*TestBasinHopping.test_pass_simple_takestep   s`    =$'!*,0,>!%$)%-/ / / 	CE48A;99999r   c                     t                      }d}t          t          | j        |         | j        d| j        |           t          |j                   d S )Nr    rO   )rv   r^   r_   re   )r?   r	   r%   r[   rG   r_   r   r+   )r.   re   ri   s      r   test_pass_accept_testz&TestBasinHopping.test_pass_accept_test   s[     #nnVTWQZ$+DI;	H 	H 	H 	H'(((((r   c                    t                      }d}t          t          | j        |         | j        d| j        |          }t          |j                   t          d|j        d         v            t          |j
        d           d S )Nr       )rv   r^   r_   callbackr   r   	   )rK   r	   r%   r[   rG   r_   r   r+   messager   nit)r.   r   ri   ry   s       r   test_pass_callbackz#TestBasinHopping.test_pass_callback  s     <<6471:!#$)hH H H$%%%
ck!n,--- 	SWa     r   c                     d}t          d          | j        d<   d| _        t          t          | j        |         | j        | j        | j                  }t          |j        dz   |j	                   d S )Nr    r   )maxiteroptionsrO   ru   )
dictrG   r^   r	   r%   r[   r_   r   r   minimization_failuresrx   s      r   test_minimizer_failz$TestBasinHopping.test_minimizer_fail  sn    !%aI
6471:!%$)= = = 	SWq[#";<<<<<r   c                 f    d}t          t          | j        |         | j        d| j                   d S rt   )r	   r   r[   rG   r_   rh   s     r   test_niter_zeroz TestBasinHopping.test_niter_zero&  s=    VTWQZ$+49	. 	. 	. 	. 	. 	.r   c                    ddd}g fd}t          t          ddg|d|d           g fd}t          t          ddg|d|d           t          t          j                  t          j                             d S )	NrW   TrX   c                 2                         |           d S Nappend)r   r   rP   f_1s      r   r   z<TestBasinHopping.test_seed_reproducibility.<locals>.callback2      JJqMMMMMr   rT   rO   )rv   r^   r   r`   c                 2                         |           d S r   r   )r   r   rP   f_2s      r   	callback2z=TestBasinHopping.test_seed_reproducibility.<locals>.callback2:  r   r   )r	   r%   r   r   r   )r.   rv   r   r   r   r   s       @@r   test_seed_reproducibilityz*TestBasinHopping.test_seed_reproducibility,  s    &0>>	 	 	 	 	 	Vc3Z:Jr	; 	; 	; 	; 	 	 	 	 	 	Vc3Z:J		< 	< 	< 	<RXc]]BHSMM22222r   c                 ,   t           j                            d          }ddd}t          t          ddg|d|          }t           j                            d          }t          t          ddg|d|          }t          |j        |j                   d S )Nr    rW   TrX   rT   rO   )rv   r^   r`   )r   r9   default_rngr	   r%   r   r   )r.   rngrv   res1res2s        r   test_random_genz TestBasinHopping.test_random_genA  s    i##A&&&0>>FS#J-="$30 0 0 i##A&&FS#J-="$30 0 0 	TVTV$$$$$r   c                     d}t          t          | j        |         | j        | j        | j        d          }t          |j        | j        |         | j	                   d S )Nr   )rv   r^   r_   Trw   rx   s      r   test_monotonic_basin_hoppingz-TestBasinHopping.test_monotonic_basin_hoppingQ  sY    6471:!%$)qB B BCE48A;99999r   N)r2   r3   r4   rb   rj   rr   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r   rR   rR   j   s7       4 4 4&% % %A A A: : :  
) 
) 
)& & &": : :> > >A A A"8 8 8: : :	) 	) 	)! ! ! 	= 	= 	=. . .3 3 3*% % % : : : : :r   rR   c                        e Zd Zd Zd Zd ZdS )Test_Storagec                     t          j        d          | _        d| _        t	                      }| j        |_        | j        |_        t          |          | _        d S )Nr    r   )	r   r   r[   f0r
   r   funr   storage)r.   minress     r   rb   zTest_Storage.setup_methodZ  sF    (1++!!7W
vr   c                 L   t                      }| j        dz   |_        | j        dz   |_        | j                            |          }| j                                        }t          | j        |j                   t          | j        |j                   t          |            d S Nr    )
r
   r[   r   r   r   r   update
get_lowestr   r   r.   
new_minresretr   s       r   test_higher_f_rejectedz#Test_Storage.test_higher_f_rejectedd  s    #%%
w{
1
l!!*--((**TWfh'''TWfj)))Cr   c                 V   t                      }| j        dz   |_        | j        dz
  |_        | j                            |          }| j                                        }t          | j        |j        k               t          | j        |j        k               t          |           d S r   )	r
   r[   r   r   r   r   r   r   r   r   s       r   test_lower_f_acceptedz"Test_Storage.test_lower_f_acceptedo  s    #%%
w{
1
l!!*--((**68#$$$6:%&&&r   N)r2   r3   r4   rb   r   r   rI   r   r   r   r   Y  sA        ' ' '	 	 		 	 	 	 	r   r   c                       e Zd Zd Zd ZdS )Test_RandomDisplacementc                     d| _         t          | j                   | _        d| _        t	          j        | j        g          | _        d S )NrT   r   i )r   r   displaceNr   r$   r[   rD   s    r   rb   z$Test_RandomDisplacement.setup_method|  s=    *DMBBB(DF8$$r   c                     |                      | j                  }d| j        z  dz  dz  }t          t	          j        |          dd           t          t	          j        |          |d           d S )Nr   r#      rm   r    )r   r[   r   r   r   meanvar)r.   r   vs      r   test_randomz#Test_RandomDisplacement.test_random  sg     MM$'""$-A%*BGAJJA...BF1IIq!,,,,,r   N)r2   r3   r4   rb   r   rI   r   r   r   r   {  s2        % % %- - - - -r   r   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )Test_Metropolisc                 F    d| _         t          | j                   | _        d S )Nr   )r   r   metrD   s    r   rb   zTest_Metropolis.setup_method  s    df%%r   c                 b    |                      dd          }t          |t                    sJ d S Nrm   rT   f_newf_old)r   
isinstancebool)r.   r   s     r   test_boolean_returnz#Test_Metropolis.test_boolean_return  s5     hhRrh**#t$$$$$$$r   c                 N    t          |                     dd                     d S r   )r   r   rD   s    r   r   z%Test_Metropolis.test_lower_f_accepted  s&    r,,-----r   c                 v    t          t          | j        d           t          t          | j        d           d S )NrT   )r   )r   )rf   KeyErrorr   rD   s    r   test_KeyErrorzTest_Metropolis.test_KeyError  s6    h3333h333333r   c                     d}d}t          d          D ]&}|r|r n|                     dd          }|rd}$d}'t          |           t          |           d S )NFi  rT   r8   r   T)ranger   r   )r.   
one_accept
one_rejectri   r   s        r   test_acceptzTest_Metropolis.test_accept  s    

t 	" 	"A j ((3(//C "!

!



r   c                     t          d          }t          j        d          5  |                    dd           d d d            d S # 1 swxY w Y   d S )Nr#   raise)overr   i  )r   r   errstateaccept_reject)r.   r   s     r   test_GH7495zTest_Metropolis.test_GH7495  s     mm[g&&& 	' 	'a&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   A		AAN)	r2   r3   r4   rb   r   r   r   r   r   rI   r   r   r   r     sn        & & &% % %. . .4 4 4
  ' ' ' ' 'r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )Test_AdaptiveStepsizec                     d| _         t          | j                   | _        d| _        t	          | j        d| j                  | _        d S )NrT   r   r8   F)r   verboseaccept_rate)r   r   tsrn   r   r   rD   s    r   rb   z"Test_AdaptiveStepsize.setup_method  sN    $dm<<<"%($'5595LN N Nr   c                 B   d}|                      |           | j                             d           t          | j         j                  D ]1}|                      |           | j                             d           2t	          | j        j        | j        k               d S )Nrm   FTr   reportr   intervalr   r   r   r.   r   ri   s      r   test_adaptive_increasez,Test_AdaptiveStepsize.test_adaptive_increase  s    aU###t}-.. 	' 	'AMM!M  &&&& 4=011111r   c                 B   d}|                      |           | j                             d           t          | j         j                  D ]1}|                      |           | j                             d           2t	          | j        j        | j        k                d S )Nrm   TFr  r  s      r   test_adaptive_decreasez,Test_AdaptiveStepsize.test_adaptive_decrease  s    aT"""t}-.. 	( 	(AMM!M  '''' 4=011111r   c                     d}t          | j        j        dz             D ]1}|                     |           | j                            d           2t	          | j        j        | j        k               d S )Nrm   r    Tr   r   r  r  r   r   r   r  s      r   test_all_acceptedz'Test_AdaptiveStepsize.test_all_accepted  ss    t}-122 	' 	'AMM!M  &&&& 4=011111r   c                     d}t          | j        j        dz             D ]1}|                     |           | j                            d           2t	          | j        j        | j        k                d S )Nrm   r    Fr
  r  s      r   test_all_rejectedz'Test_AdaptiveStepsize.test_all_rejected  ss    t}-122 	( 	(AMM!M  '''' 4=011111r   N)r2   r3   r4   rb   r  r  r  r  rI   r   r   r   r     sb        N N N2 2 22 2 22 2 22 2 2 2 2r   r   )$r5   r   numpy.testingr   r   r   pytestr   rf   numpyr   r   r   scipy.optimizer	   r
   scipy.optimize._basinhoppingr   r   r   r   scipy._lib._pep440r   r   r!   r%   r'   r)   r=   r?   rK   rR   r   r   r   r   rI   r   r   <module>r     s     D D D D D D D D D D  * * * * * *             7 7 7 7 7 7 7 7? ? ? ? ? ? ? ? ? ? ? ? & & & & & &    
    	# 	# 	# 	# 	#$ 	# 	# 	#         *       $l: l: l: l: l: l: l: l:^       D- - - - - - - -"'' '' '' '' '' '' '' ''T*2 *2 *2 *2 *2 *2 *2 *2 *2 *2r   