
    (ph
K                     n   S r SSKrSSKJrJrJrJr  SSKrSSKJr	  SSK
rSSK
JrJr  SSKJrJr  SSKJrJrJrJr  S rS	 rS
 rS r " S S\5      rS r " S S5      r " S S5      r " S S5      r\R>                  R@                   " S S5      5       r! " S S5      r" " S S5      r# " S S5      r$g)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                     [        SU -  S-
  5      U S-   U -  -   n[        R                  " S[        SU -  S-
  5      -  SU -  -   S-   5      nX4$ )N      -@333333?皙?      -       @)r   nparrayr	   xfdfs      Z/var/www/html/venv/lib/python3.13/site-packages/scipy/optimize/tests/test__basinhopping.pyfunc1dr      sV    D1HsNq3w!m+A	%#dQhn--Q6<	=B5L    c                 j    [        SU S   -  S-
  5      U S   S-   U S   -  -   U S   S-   U S   -  -   nU$ )Nr   r   r      r   )r   )r   r   s     r   func2d_nogradr!      sJ    D1Q4K#!A$*!!44!s
ad7JJAHr   c                     [        SU S   -  S-
  5      U S   S-   U S   -  -   U S   S-   U S   -  -   n[        R                  " S5      nS[        SU S   -  S-
  5      -  SU S   -  -   S-   US'   SU S   -  S-   US'   X4$ )	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5Lr   c                     SU S   S-  -  SU S   -  U S   -  -   SU S   S-  -  -   SU S   -  -
  n[         R                  " S5      nSU S   -  SU S   -  -   S-
  US'   SU S   -  SU S   -  -   US'   X4$ )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5Lr   c                   8   ^  \ rS rSrSrU 4S jrU 4S jrSrU =r$ )MyTakeStep1.   zbuse a copy of displace, but have it set a special parameter to
make sure it's actually being used.c                 0   > SU l         [        TU ]	  5         g )NF)been_calledsuper__init__)self	__class__s    r   r.   MyTakeStep1.__init__1   s     r   c                 0   > SU l         [        TU ]	  U5      $ )NT)r,   r-   __call__)r/   r   r0   s     r   r3   MyTakeStep1.__call__5   s    w""r   )r,   )	__name__
__module____qualname____firstlineno____doc__r.   r3   __static_attributes____classcell__)r0   s   @r   r)   r)   .   s    +# #r   r)   c                 |    SnU [         R                  R                  U* U[         R                  " U 5      5      -  n U $ )zoredo RandomDisplacement in function form without the attribute stepsize
to make sure everything still works ok
      ?)r   randomuniformshape)r   ss     r   myTakeStep2rB   :   s5     	A		A2q"((1+	..AHr   c                   $    \ rS rSrSrS rS rSrg)MyAcceptTestC   zpass a custom accept test

This does nothing but make sure it's being used and ensure all the
possible return values are accepted
c           	          SU l         SU l        SSS[        R                  " S5      [        R                  " S5      / 0 SS/	U l        g )NFr   zforce acceptTr    )r,   ncallsr   bool_testresr/   s    r   r.   MyAcceptTest.__init__I   s>     ~tRXXd^RA7r   c                     SU l         U =R                  S-  sl        U R                  S-
  [        U R                  5      :  a  U R                  U R                  S-
     $ g)NTr    )r,   rG   lenrI   )r/   kwargss     r   r3   MyAcceptTest.__call__O   sK    q;;?S..<<a00r   )r,   rG   rI   Nr5   r6   r7   r8   r9   r.   r3   r:    r   r   rD   rD   C   s    
7r   rD   c                   $    \ rS rSrSrS rS rSrg)
MyCallBackX   zpass 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                      SU l         SU l        g )NFr   r,   rG   rJ   s    r   r.   MyCallBack.__init___   s     r   c                 ^    SU l         U =R                  S-  sl        U R                  S:X  a  gg )NTr    
   rV   )r/   r   r   accepteds       r   r3   MyCallBack.__call__c   s,    q;;" r   rV   NrP   rQ   r   r   rS   rS   X   s    r   rS   c                       \ rS rSrS rS rS rS rS rS r	S r
S	 r\R                  R                  S
5      S 5       r\R                  R                  S5      S 5       rS rS rS rS rS rS rS rS rS rSrg)TestBasinHoppingj   c                     SSS/4U l         S[        R                  " SS/5      4U l        SU l        SU l        SU l        SSS	.U l        S
S0U l        g)zLTests setup.

Run tests based on the 1-D and 2-D functions described above.
      ?g(\ȿg   d   FL-BFGS-BTmethodjacre   N)	x0r   r   soltolniterdisprN   kwargs_nogradrJ   s    r   setup_methodTestBasinHopping.setup_methodl   s[    
 c
#BHHfd^45
	!+D9&
3r   c                     Sn[        [        [        [        U R                  U   SS9  [        [        [        [        U R                  U   SS9  g )Nr    )	take_step)accept_test)assert_raises	TypeErrorr
   r%   rg   r/   is     r   test_TypeErrorTestBasinHopping.test_TypeError|   s?    ivtwwqz !	# 	ivtwwqz"#	%r   c                 ,   Sn[        [        US9   [        [        U R                  S   SS9  S S S 5        [        [        US9   [        [        U R                  S   SS9  S S S 5        Sn[        [        US9   [        [        U R                  S   SS9  S S S 5        [        [        US9   [        [        U R                  S   SS9  S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Nd= f! , (       d  f       g = f)	Nz.target_accept_rate has to be in range \(0, 1\))matchr           )target_accept_rater`   z+stepwise_factor has to be in range \(0, 1\))stepwise_factor)rr   
ValueErrorr
   r   rg   )r/   msgs     r   test_input_validation&TestBasinHopping.test_input_validation   s    @:S1C 2:S1C 2 >:S1R@ 2:S1R@ 21 2111 2111s/   CC#9C4,D
C #
C14
D
Dc                     Sn[        [        U R                  U   U R                  U R                  U R
                  S9n[        UR                  U R                  U   U R                  5        g Nr   minimizer_kwargsrj   rk   
r
   r   rg   rN   rj   rk   r   r   rh   ri   r/   ru   ress      r   test_1d_gradTestBasinHopping.test_1d_grad   sL    64771:!%$))=CEE488A;9r   c                    Sn[        [        U R                  U   U R                  U R                  U R
                  S9n[        UR                  U R                  U   U R                  5        [        UR                  S:  5        g )Nr    r   r   )r
   r%   rg   rN   rj   rk   r   r   rh   ri   r   nfevr   s      r   test_2dTestBasinHopping.test_2d   s\    64771:!%$))=CEE488A;91r   c                    SnU R                   R                  5       nSUS'   [        [        U R                  U   X R
                  U R                  S9n[        UR                  S:  5        [        UR                  UR                  5        g )Nr    BFGSre   r   r   )rN   copyr
   r%   rg   rj   rk   r   r   r   njev)r/   ru   r   r   s       r   	test_njevTestBasinHopping.test_njev   sm    ;;++-%+"64771:,<JJ $		+ 	1SXXsxx(r   c                 P   U R                   R                  5       nSUS'   [        [        SS/XR                  U R
                  S9n[        [        UR                  S5      5        [        UR                  5      u  p4[        UR                  R                  UU R                  5        g )Nr   re   rz   r   rf   )rN   r   r
   r'   rj   rk   r   hasattrlowest_optimization_resultr   r   rf   ri   )r/   r   r   _jacobians        r   test_jacTestBasinHopping.test_jac   s    ;;++-%+"+c3Z,<JJ $		+ 	66>? 'suu-C::>> HH	&r   c                     Sn[        [        U R                  U   U R                  U R                  U R
                  S9n[        UR                  U R                  U   U R                  5        g )Nr    r   )
r
   r!   rg   rl   rj   rk   r   r   rh   ri   r   s      r   test_2d_nogradTestBasinHopping.test_2d_nograd   sQ    =$''!*,0,>,>!%$))= 	CEE488A;9r   rY   c           	      *   Sn/ SQn[         R                   " U R                  5      nU Hg  nXCS'   [        [        U R                  U   UU R
                  U R                  S9n[        UR                  U R                  U   U R                  5        Mi     g )Nr    )CGr   z	Newton-CGrc   TNCSLSQPre   r   )r   rN   r
   r%   rg   rj   rk   r   r   rh   ri   )r/   ru   methodsr   re   r   s         r   test_all_minimizers$TestBasinHopping.test_all_minimizers   sx     I99T[[1F)/X&vtwwqz0@%)ZZdiiAC  txx{DHH= r      c           
      N   Sn/ SQn[         R                   " U R                  5      nU Hy  nUS:X  a  SOU R                  nXCS'   [        [        U R
                  U   UXPR                  SS9nU R                  nUS:X  a  S	n[        UR                  U R                  U   US
9  M{     g )Nr    )	r   r   rc   r   r   zNelder-MeadPowellCOBYLACOBYQAr   rY   re     )r   rj   rk   seedr   r#   )decimal)r   rl   rj   r
   r!   rg   rk   ri   r   r   rh   )r/   ru   r   r   re   rj   r   ri   s           r   test_all_nograd_minimizers+TestBasinHopping.test_all_nograd_minimizers   s     @99T%7%78F H,B$**E)/X&}dggaj0@%*GC ((C!txx{C@ r   c           	      b   [        5       nUR                  nSn[        [        U R                  U   U R
                  U R                  U R                  US9n[        UR                  U R                  U   U R                  5        [        UR                  5        [        X!R                  :g  5        g Nr    )r   rj   rk   rp   )r)   stepsizer
   r%   rg   rN   rj   rk   r   r   rh   ri   r   r,   )r/   takestepinitial_step_sizeru   r   s        r   test_pass_takestep#TestBasinHopping.test_pass_takestep   s     =$--64771:!%$))%-/ 	CEE488A;9$$%!%6%667r   c           	          [         nSn[        [        U R                  U   U R                  U R
                  U R                  US9n[        UR                  U R                  U   U R                  5        g r   )rB   r
   r!   rg   rl   rj   rk   r   r   rh   ri   )r/   r   ru   r   s       r   test_pass_simple_takestep*TestBasinHopping.test_pass_simple_takestep   sY    =$''!*,0,>,>!%$))%-/ 	CEE488A;9r   c           	          [        5       nSn[        [        U R                  U   U R                  SU R
                  US9  [        UR                  5        g )Nr    rY   )r   rj   rk   rq   )rD   r
   r%   rg   rN   rk   r   r,   )r/   rq   ru   s      r   test_pass_accept_test&TestBasinHopping.test_pass_accept_test  sD     #nVTWWQZ$++DII;	H''(r   c           	         [        5       nSn[        [        U R                  U   U R                  SU R
                  US9n[        UR                  5        [        SUR                  S   ;   5        [        UR                  S5        g )Nr       )r   rj   rk   callbackr   r   	   )rS   r
   r%   rg   rN   rk   r   r,   messager   nit)r/   r   ru   r   s       r   test_pass_callback#TestBasinHopping.test_pass_callback  sk     <64771:!#$))hH$$%
ckk!n,- 	SWWa r   c                     Sn[        SS9U R                  S'   SU l        [        [        U R
                  U   U R                  U R                  U R                  S9n[        UR                  S-   UR                  5        g )Nr    r   )maxiteroptionsrY   r   )
dictrN   rj   r
   r%   rg   rk   r   r   minimization_failuresr   s      r   test_minimizer_fail$TestBasinHopping.test_minimizer_fail  sc    !%aI
64771:!%$))= 	SWWq[#";";<r   c                 l    Sn[        [        U R                  U   U R                  SU R                  S9  g r   )r
   r   rg   rN   rk   rt   s     r   test_niter_zero TestBasinHopping.test_niter_zero'  s*    VTWWQZ$++499	.r   c           	         ^^ SSS.n/ mU4S jn[        [        SS/USUSS9  / mU4S jn[        [        SS/USUSS9  [        [        R                  " T5      [        R                  " T5      5        g )	Nrc   Trd   c                 (   > TR                  U5        g Nappend)r   r   rZ   f_1s      r   r   ;TestBasinHopping.test_rng_reproducibility.<locals>.callback3      JJqMr   r`   rY   )r   rj   r   rngc                 (   > TR                  U5        g r   r   )r   r   rZ   f_2s      r   	callback2<TestBasinHopping.test_rng_reproducibility.<locals>.callback2;  r   r   )r
   r%   r   r   r   )r/   r   r   r   r   r   s       @@r   test_rng_reproducibility)TestBasinHopping.test_rng_reproducibility-  sv    &0>	 	Vc3Z:Jb	: 	 	Vc3Z:J	r	;RXXc]BHHSM2r   c                    [         R                  R                  S5      nSSS.n[        [        SS/USUS9n[         R                  R                  S5      n[        [        SS/USUS9n[        UR                  UR                  5        g )Nr    rc   Trd   r`   rY   )r   rj   r   )r   r>   default_rngr
   r%   r   r   )r/   r   r   res1res2s        r   test_random_gen TestBasinHopping.test_random_genB  s    ii##A&&0>FS#J-="$#/ ii##A&FS#J-="$#/ 	TVVTVV$r   c           	          Sn[        [        U R                  U   U R                  U R                  U R
                  SS9n[        UR                  U R                  U   U R                  5        g )Nr   )r   rj   rk   Tr   r   s      r   test_monotonic_basin_hopping-TestBasinHopping.test_monotonic_basin_hoppingR  sO    64771:!%$))qBCEE488A;9r   )rk   rN   rl   rj   rh   ri   rg   N)r5   r6   r7   r8   rm   rv   r   r   r   r   r   r   pytestmark	fail_slowr   r   r   r   r   r   r   r   r   r   r   r:   rQ   r   r   r]   r]   j   s    4 %A:
)&": [[2> > [[2A A&8:	)! 	=.3*% :r   r]   c                   h    \ rS rSrS rS r\R                  R                  SSS/5      S 5       r	Sr
g	)
Test_Storagei[  c                     [         R                  " S5      U l        SU l        [	        SS9nU R                  Ul        U R                  Ul        [        U5      U l        g )Nr    r   Tsuccess)	r   r   rg   f0r   r   funr   storage)r/   minress     r   rm   Test_Storage.setup_method]  sC    ((1+-77WW
vr   c                 p   [        SS9nU R                  S-   Ul        U R                  S-   Ul        U R
                  R                  U5      nU R
                  R                  5       n[        U R                  UR                  5        [        U R                  UR                  5        [        U(       + 5        g )NTr   r    )
r   rg   r   r   r   r   update
get_lowestr   r   )r/   
new_minresretr   s       r   test_higher_f_rejected#Test_Storage.test_higher_f_rejectedg  s~    #D1
ww{
1
ll!!*-((*TWWfhh'TWWfjj)Cr   r   TFc                 X   [        US9nU R                  S-   Ul        U R                  S-
  Ul        U R
                  R                  U5      nU R
                  R                  5       nU R                  UR                  :g  U:X  d   eU R                  UR                  :g  U:X  d   eX1L d   eg )Nr   r    )r   rg   r   r   r   r   r   r   )r/   r   r   r   r   s        r   test_lower_f_accepted"Test_Storage.test_lower_f_acceptedr  s    #G4
ww{
1
ll!!*-((*688#///6::%'111~~r   )r   r   rg   N)r5   r6   r7   r8   rm   r   r   r   parametrizer   r:   rQ   r   r   r   r   [  s5    '	 [[Yu6	 7	r   r   c                        \ rS rSrS rS rSrg)Test_RandomDisplacementi  c                      SU l         SU l        g )Nr`   i )r   NrJ   s    r   rm   $Test_RandomDisplacement.setup_method  s    r   c                 j   [         R                  R                  S5      n[         R                  " U R                  /5      n[        U R                  US9nU" U5      nSU R                  -  S-  S-  n[        [         R                  " U5      SS5        [        [         R                  " U5      US5        g )Nr   )r   r   r   r#      rz   r    )
r   r>   RandomStater$   r  r   r   r   meanvar)r/   r   rg   displacer   vs         r   test_random#Test_RandomDisplacement.test_random  s     ii##A&XXtvvh%t}}#FRL$--A%*BGGAJA.BFF1Iq!,r   )r  r   N)r5   r6   r7   r8   rm   r  r:   rQ   r   r   r   r     s    
-r   r   c                   D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)Test_Metropolisi  c                     SU l         [        U R                   5      U l        [        SSS9U l        [        SSS9U l        g )Nr   Trz   r   r   r`   )r   r   metr   res_newres_oldrJ   s    r   rm   Test_Metropolis.setup_method  s5    dff%%d;%d;r   c                 z    U R                  U R                  U R                  S9n[        U[        5      (       d   eg Nr  r  )r  r  r  
isinstancebool)r/   r   s     r   test_boolean_return#Test_Metropolis.test_boolean_return  s1     hht||T\\hB#t$$$$r   c                 ^    [        U R                  U R                  U R                  S95        g r  )r   r  r  r  rJ   s    r   r   %Test_Metropolis.test_lower_f_accepted  s    t||DEr   c                     SnSn[        S5       HC  nU(       a	  U(       a    O4[        SSS9n[        SSS9nU R                  XES9nU(       a  SnMA  SnME     [        U5        [        U5        g )NFi  Tr`   r  r=   r  )ranger   r  r   )r/   
one_accept
one_rejectru   r  r  r   s          r   test_acceptTest_Metropolis.test_accept  si    

tAj$Tr:G$Ts;G((7(<C!
!
  	

r   c                     [        S5      n[        SSS9n[        SSS9n[        R                  " SS9   UR	                  X#S9  S S S 5        g ! , (       d  f       g = f)	Nr#   Trz   r  i  raise)overr  )r   r   r   errstateaccept_rejectr/   r  r  r  s       r   test_GH7495Test_Metropolis.test_GH7495  sN     m 26 48[[g&g? '&&s   A
Ac                    ^^ S mSnSmSUU4S jS.4n[        TUS[        R                  R                  S5      S	U0S
9nUR                  (       d   e[        UR                  TSS9  g )Nc                 *    U S-  S-
  S-  U S-   S-  -   $ )Nr#      rQ   r   s    r   func)Test_Metropolis.test_gh7799.<locals>.func  s!    qDFQ;!ax''r   2   ineqc                    > T" U 5      T-
  $ r   rQ   )r   r0  limits    r   <lambda>-Test_Metropolis.test_gh7799.<locals>.<lambda>  s    Q%r   typer   r   r   constraints)r   r   gư>)rtol)r
   r   r>   r  r   r   r   )r/   rg   conr   r0  r6  s       @@r   test_gh7799Test_Metropolis.test_gh7799  sm    	( &?@A&&t,+S1
 {{{T2r   c                     [        S5      n[        SSS9n[        SSS9nU" X#S9(       d   eSUl        U" X#S9(       a   eSUl        U" X#S9(       d   eg )Nr   Trz   r  r`   r  F)r   r   r   r)  s       r   test_accept_gh7799"Test_Metropolis.test_accept_gh7799  s_     m 26 26 7444w8887444r   c                 h    S nS nSUS.SS/SS.n[        USS	/S
US9nUR                  (       a   eg )Nc                 
    X -  $ r   rQ   r/  s    r   r   3Test_Metropolis.test_reject_all_gh7799.<locals>.fun  s	    3Jr   c                     U S-   $ )Nr    rQ   r/  s    r   
constraint:Test_Metropolis.test_reject_all_gh7799.<locals>.constraint  s    q5Lr   eqr9  )r   r    slsqp)r;  boundsre   r#   ra   rY   )rg   rj   r   )r
   r   )r/   r   rG  rN   r   s        r   test_reject_all_gh7799&Test_Metropolis.test_reject_all_gh7799  sJ    		 +/z!B#V,A3Aq6fM;;;r   )r   r  r  r  N)r5   r6   r7   r8   rm   r  r   r"  r*  r>  rA  rL  r:   rQ   r   r   r  r    s,    <%F"@3&5"r   r  c                   2    \ rS rSrS rS rS rS rS rSr	g)	Test_AdaptiveStepsizei  c                     SU l         [        U R                   S9U l        SU l        [	        U R                  SU R                  S9U l        g )Nr`   )r   r=   F)r   verboseaccept_rate)r   r   tsr{   r   r   rJ   s    r   rm   "Test_AdaptiveStepsize.setup_method  s?    $dmm<"%($''5595L5LNr   c                 \   SnU R                  U5        U R                   R                  S5        [        U R                   R                  5       H/  nU R                  U5        U R                   R                  S5        M1     [	        U R
                  R                  U R                  :  5        g )Nrz   FTr   reportr  intervalr   rS  r   r/   r   ru   s      r   test_adaptive_increase,Test_AdaptiveStepsize.test_adaptive_increase  sy    aU#t}}--.AMM!MM  & / 	  4==01r   c                 \   SnU R                  U5        U R                   R                  S5        [        U R                   R                  5       H/  nU R                  U5        U R                   R                  S5        M1     [	        U R
                  R                  U R                  :  5        g )Nrz   TFrV  rY  s      r   test_adaptive_decrease,Test_AdaptiveStepsize.test_adaptive_decrease  sy    aT"t}}--.AMM!MM  ' / 	  4==01r   c                 
   Sn[        U R                  R                  S-   5       H/  nU R                  U5        U R                  R                  S5        M1     [	        U R
                  R                  U R                  :  5        g )Nrz   r    Tr  r   rX  rW  r   rS  r   rY  s      r   test_all_accepted'Test_AdaptiveStepsize.test_all_accepted	  s`    t}}--12AMM!MM  & 3 	  4==01r   c                 
   Sn[        U R                  R                  S-   5       H/  nU R                  U5        U R                  R                  S5        M1     [	        U R
                  R                  U R                  :  5        g )Nrz   r    Fr`  rY  s      r   test_all_rejected'Test_AdaptiveStepsize.test_all_rejected  s`    t}}--12AMM!MM  ' 3 	  4==01r   )r   r   r{   rS  N)
r5   r6   r7   r8   rm   rZ  r]  ra  rd  r:   rQ   r   r   rO  rO    s    N2222r   rO  )%r9   r   numpy.testingr   r   r   r   r   r   rr   numpyr   r   r	   scipy.optimizer
   r   scipy.optimize._basinhoppingr   r   r   r   r   r!   r%   r'   r)   rB   rD   rS   r]   r   thread_unsafer   r   r  rO  rQ   r   r   <module>rk     s    , ,  *   7? ?
	#$ 	# * $n: n:b      F- -$Y Yx*2 *2r   