
    tKgJ                     <   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 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"y)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                     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      k/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/optimize/tests/test__basinhopping.pyfunc1dr      sX    D1HsNq3w!m+A	%#dQhn--Q6<	=Bb5L    c                 j    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!      sJ    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                 0    d| _         t        | 	          y )NF)been_calledsuper__init__)self	__class__s    r   r-   zMyTakeStep1.__init__1   s     r   c                 0    d| _         t        | 	  |      S )NT)r+   r,   __call__)r.   r   r/   s     r   r1   zMyTakeStep1.__call__5   s    w""r   )__name__
__module____qualname____doc__r-   r1   __classcell__)r/   s   @r   r)   r)   .   s    +# #r   r)   c                 z    d}| t         j                  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=   :   s5     	A		A2q"((1+	..AHr   c                       e Zd ZdZd Zd Zy)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	| _        y )NFr   zforce acceptTr    )r+   ncallsr   bool_testresr.   s    r   r-   zMyAcceptTest.__init__I   s>     ~tRXXd^RA7r   c                     d| _         | xj                  dz  c_        | j                  dz
  t        | j                        k  r| j                  | j                  dz
     S y)NTr    )r+   rA   lenrC   )r.   kwargss     r   r1   zMyAcceptTest.__call__O   sK    q;;?S..<<a00r   Nr2   r3   r4   r5   r-   r1    r   r   r?   r?   C   s    
7r   r?   c                       e Zd ZdZd Zd Zy)
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| _        y )NFr   r+   rA   rD   s    r   r-   zMyCallBack.__init___   s     r   c                 \    d| _         | xj                  dz  c_        | j                  dk(  ryy )NTr    
   rM   )r.   r   r   accepteds       r   r1   zMyCallBack.__call__c   s,    q;;" 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
ej                  j                  d	      d
        Zej                  j                  d      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestBasinHoppingc                     dddgf| _         dt        j                  ddg      f| _        d| _        d| _        d| _        t        j                  j                  d       dd	d
| _	        ddi| _
        y)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   sm    
 c
#BHHfd^45
	 			t!+D9&
3r   c                     d}t        t        t        t        | j                  |   d       t        t        t        t        | j                  |   d       y )Nr    )	take_step)accept_test)assert_raises	TypeErrorr
   r%   r[   r.   is     r   test_TypeErrorzTestBasinHopping.test_TypeError   s?    ivtwwqz !	# 	ivtwwqz"#	%r   c                 4   d}t        t        |      5  t        t        | j                  d   d       d d d        t        t        |      5  t        t        | j                  d   d       d d d        d}t        t        |      5  t        t        | j                  d   d       d d d        t        t        |      5  t        t        | j                  d   d       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   [xY w# 1 sw Y   y xY w)	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   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* C6 D D*C36C?DDc                     d}t        t        | j                  |   | j                  | j                  | j
                        }t        |j                  | j                  |   | j                         y 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   sL    64771:!%$))=CEE488A;9r   c                    d}t        t        | j                  |   | j                  | j                  | j
                        }t        |j                  | j                  |   | j                         t        |j                  dkD         y )Nr    ru   r   )r
   r%   r[   rG   r^   r_   r   r   r\   r]   r   nfevrx   s      r   test_2dzTestBasinHopping.test_2d   s\    64771:!%$))=CEE488A;91r   c                     d}| j                   j                         }d|d<   t        t        | j                  |   || j
                  | j                        }t        |j                  dkD         t        |j                  |j                         y )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   so    ;;++-%+"64771:,<DJJ $		+ 	1SXXsxx(r   c                 Z   | j                   j                         }d|d<   t        t        ddg|| j                  | j
                        }t        t        |j                  d             t        |j                        \  }}t        |j                  j                  || j                         y )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,<DJJ $		+ 	66>? 'suu-8C::>> HH	&r   c                     d}t        t        | j                  |   | j                  | j                  | j
                        }t        |j                  | j                  |   | j                         y )Nr    ru   )
r
   r!   r[   ra   r^   r_   r   r   r\   r]   rx   s      r   test_2d_nogradzTestBasinHopping.test_2d_nograd   sQ    =$''!*,0,>,>!%$))= 	CEE488A;9r      c                 ,   d}g d}t        j                   | j                        }|D ]j  }||d<   t        t        | j                  |   || j
                  | j                        }t        |j                  | j                  |   | j                         l y )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99T[[1F)/X&vtwwqz0@%)ZZdiiAC  txx{DHH= r   rO   c                 R   d}g d}t        j                   | j                        }|D ]}  }|dk(  rdn| j                  }||d<   t        t        | j
                  |   ||| j                        }| j                  }|dk(  rd}t        |j                  | j                  |   |	        y )
Nr    )	r   r   rW   r   r   zNelder-MeadPowellCOBYLACOBYQAr   rO   rY   ru   r   r#   )decimal)r   ra   r^   r
   r!   r[   r_   r]   r   r   r\   )r.   ri   r   rv   rY   r^   ry   r]   s           r   test_all_nograd_minimizersz+TestBasinHopping.test_all_nograd_minimizers   s     @99T%7%78F H,B$**E)/X&}dggaj0@%*<C ((C!txx{C@ r   c                 j   t               }|j                  }d}t        t        | j                  |   | j
                  | j                  | j                  |      }t        |j                  | j                  |   | j                         t        |j                         t        ||j                  k7         y 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     =$--64771:!%$))%-/ 	CEE488A;9$$%!X%6%667r   c                     t         }d}t        t        | j                  |   | j                  | j
                  | j                  |      }t        |j                  | j                  |   | j                         y 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   sY    =$''!*,0,>,>!%$))%-/ 	CEE488A;9r   c                     t               }d}t        t        | j                  |   | j                  d| j
                  |       t        |j                         y )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  sD     #nVTWWQZ$++DII;	H''(r   c                    t               }d}t        t        | j                  |   | j                  d| j
                  |      }t        |j                         t        d|j                  d   v        t        |j                  d       y )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  sk     <64771:!#$))hH$$%
ckk!n,- 	SWWa r   c                    d}t        d      | j                  d<   d| _        t        t        | j
                  |   | j                  | j                  | j                        }t        |j                  dz   |j                         y )Nr    r   )maxiteroptionsrO   ru   )
dictrG   r^   r
   r%   r[   r_   r   r   minimization_failuresrx   s      r   test_minimizer_failz$TestBasinHopping.test_minimizer_fail  sc    !%aI
64771:!%$))= 	SWWq[#";";<r   c                 r    d}t        t        | j                  |   | j                  d| j                         y rt   )r
   r   r[   rG   r_   rh   s     r   test_niter_zeroz TestBasinHopping.test_niter_zero*  s*    VTWWQZ$++499	.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                               y )	NrW   TrX   c                 (    j                  |       y Nappend)r   r   rP   f_1s      r   r   z<TestBasinHopping.test_seed_reproducibility.<locals>.callback6      JJqMr   rT   rO   )rv   r^   r   r`   c                 (    j                  |       y 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_reproducibility0  sv    &0>	 	Vc3Z:Jr	; 	 	Vc3Z:J		<RXXc]BHHSM2r   c                 "   t         j                  j                  d      }ddd}t        t        ddg|d|      }t         j                  j                  d      }t        t        ddg|d|      }t        |j                  |j                         y )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_genE  s    ii##A&&0>FS#J-="$30 ii##A&FS#J-="$30 	TVVTVV$r   c                     d}t        t        | j                  |   | j                  | j                  | j
                  d      }t        |j                  | j                  |   | j                         y )Nr   )rv   r^   r_   Trw   rx   s      r   test_monotonic_basin_hoppingz-TestBasinHopping.test_monotonic_basin_hoppingU  sO    64771:!%$))qBCEE488A;9r   N)r2   r3   r4   rb   rj   rr   rz   r}   r   r   r   pytestmark	fail_slowr   r   r   r   r   r   r   r   r   r   r   rI   r   r   rR   rR   j   s    4&%A:
)&": [[1> > [[2A A&8:	)! 	=.3*% :r   rR   c                   `    e Zd Zd Zd Zej                  j                  dddg      d        Zy)Test_Storagec                     t        j                  d      | _        d| _        t	        d      }| j                  |_        | j                  |_        t        |      | _        y )Nr    r   Tsuccess)	r   r   r[   f0r   r   funr   storage)r.   minress     r   rb   zTest_Storage.setup_method^  sC    ((1+-77WW
vr   c                 n   t        d      }| j                  dz   |_        | j                  dz   |_        | j
                  j                  |      }| j
                  j                         }t        | j                  |j                         t        | j                  |j                         t        |        y )NTr   r    )
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_rejectedh  s~    #D1
ww{
1
ll!!*-((*TWWfhh'TWWfjj)Cr   r   TFc                 Z   t        |      }| j                  dz   |_        | j                  dz
  |_        | j
                  j                  |      }| j
                  j                         }| j                  |j                  k7  |k(  sJ | j                  |j                  k7  |k(  sJ ||u sJ y )Nr   r    )r   r[   r   r   r   r   r   r   )r.   r   r   r   r   s        r   test_lower_f_acceptedz"Test_Storage.test_lower_f_accepteds  s    #G4
ww{
1
ll!!*-((*688#///6::%'111g~~r   N)	r2   r3   r4   rb   r   r   r   parametrizer   rI   r   r   r   r   ]  s5    '	 [[Yu6	 7	r   r   c                       e Zd Zd Zd Zy)Test_RandomDisplacementc                     d| _         t        | j                         | _        d| _        t	        j
                  | j                  g      | _        y )NrT   r   i )r   r   displaceNr   r$   r[   rD   s    r   rb   z$Test_RandomDisplacement.setup_method  s6    *DMMB((DFF8$r   c                     | j                  | j                        }d| j                  z  dz  dz  }t        t	        j
                  |      dd       t        t	        j                  |      |d       y )Nr   r#      rm   r    )r   r[   r   r   r   meanvar)r.   r   vs      r   test_randomz#Test_RandomDisplacement.test_random  sV     MM$''"$--A%*BGGAJA.BFF1Iq!,r   N)r2   r3   r4   rb   r   rI   r   r   r   r     s    %-r   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
Test_Metropolisc                     d| _         t        | j                         | _        t        dd      | _        t        dd      | _        y )Nr   Trm   r   r   rT   )r   r   metr   res_newres_oldrD   s    r   rb   zTest_Metropolis.setup_method  s5    dff%%d;%d;r   c                 v    | j                  | j                  | j                        }t        |t              sJ y Nr   r   )r   r   r   
isinstancebool)r.   r   s     r   test_boolean_returnz#Test_Metropolis.test_boolean_return  s.     hht||T\\hB#t$$$r   c                 d    t        | j                  | j                  | j                               y r   )r   r   r   r   rD   s    r   r   z%Test_Metropolis.test_lower_f_accepted  s    t||DEr   c                     d}d}t        d      D ]<  }|r|r n6t        dd      }t        dd      }| j                  ||      }|rd};d}> t        |       t        |       y )NFi  TrT   r   r8   r   )ranger   r   r   )r.   
one_accept
one_rejectri   r   r   r   s          r   test_acceptzTest_Metropolis.test_accept  sk    

tAj$Tr:G$Ts;G((7G(<C!
!
  	

r   c                     t        d      }t        dd      }t        dd      }t        j                  d      5  |j	                  ||       d d d        y # 1 sw Y   y xY w)	Nr#   Trm   r   i  raise)overr   )r   r   r   errstateaccept_rejectr.   r   r   r   s       r   test_GH7495zTest_Metropolis.test_GH7495  sP     m 26 48[[g&gw? '&&s   AA"c                     d d}ddfddf}t        |dd|i	      }|j                  sJ t        |j                  d
       y )Nc                 *    | dz  dz
  dz  | dz   dz  z   S )Nr#      rI   r   s    r   funcz)Test_Metropolis.test_gh7799.<locals>.func  s!    qDFQ;!ax''r   2   ineqc                      |       z
  S r   rI   )r   r  limits    r   <lambda>z-Test_Metropolis.test_gh7799.<locals>.<lambda>  s    Q%r   typer   r   constraints)rv   gư>)rtol)r
   r   r   r   )r.   r[   conry   r  r	  s       @@r   test_gh7799zTest_Metropolis.test_gh7799  sS    	( &?@A4R=#:NO{{{T2r   c                     t        d      }t        dd      }t        dd      } |||      sJ d|_         |||      rJ d|_         |||      sJ y )Nr   Trm   r   rT   r   F)r   r   r   r   s       r   test_accept_gh7799z"Test_Metropolis.test_accept_gh7799  se     m 26 26 7G444w8887G444r   c                 d    d }d }d|dddgdd}t        |dd	gd
|      }|j                  rJ y )Nc                     | | z  S r   rI   r  s    r   r   z3Test_Metropolis.test_reject_all_gh7799.<locals>.fun  s    Q3Jr   c                     | dz   S )Nr    rI   r  s    r   
constraintz:Test_Metropolis.test_reject_all_gh7799.<locals>.constraint  s    q5Lr   eqr  )r   r    slsqp)r  boundsrY   r#   rU   rO   )r[   r^   rv   )r
   r   )r.   r   r  rG   ry   s        r   test_reject_all_gh7799z&Test_Metropolis.test_reject_all_gh7799  sJ    		 +/z!B#V,A3Aq6fM;;;r   N)r2   r3   r4   rb   r   r   r   r   r  r  r  rI   r   r   r   r     s,    <%F"@35"r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)Test_AdaptiveStepsizec                     d| _         t        | j                         | _        d| _        t	        | j                  d| j                        | _        y )NrT   r   r8   F)r   verboseaccept_rate)r   r   tsrn   r   r   rD   s    r   rb   z"Test_AdaptiveStepsize.setup_method  s?    $dmm<"%($''5595L5LNr   c                 X   d}| j                  |       | j                   j                  d       t        | j                   j                        D ].  }| j                  |       | j                   j                  d       0 t	        | j
                  j                  | j                  kD         y )Nrm   FTr   reportr   intervalr   r   r   r.   r   ri   s      r   test_adaptive_increasez,Test_AdaptiveStepsize.test_adaptive_increase  sy    aU#t}}--.AMM!MM  & / 	  4==01r   c                 X   d}| j                  |       | j                   j                  d       t        | j                   j                        D ].  }| j                  |       | j                   j                  d       0 t	        | j
                  j                  | j                  k         y )Nrm   TFr"  r%  s      r   test_adaptive_decreasez,Test_AdaptiveStepsize.test_adaptive_decrease  sy    aT"t}}--.AMM!MM  ' / 	  4==01r   c                    d}t        | j                  j                  dz         D ].  }| j                  |       | j                  j                  d       0 t	        | j
                  j                  | j                  kD         y )Nrm   r    Tr   r   r$  r#  r   r   r   r%  s      r   test_all_acceptedz'Test_AdaptiveStepsize.test_all_accepted  s`    t}}--12AMM!MM  & 3 	  4==01r   c                    d}t        | j                  j                  dz         D ].  }| j                  |       | j                  j                  d       0 t	        | j
                  j                  | j                  k         y )Nrm   r    Fr*  r%  s      r   test_all_rejectedz'Test_AdaptiveStepsize.test_all_rejected  s`    t}}--12AMM!MM  ' 3 	  4==01r   N)r2   r3   r4   rb   r&  r(  r+  r-  rI   r   r   r  r    s    N2222r   r  )#r5   r   numpy.testingr   r   r   r   r   r   rf   numpyr   r   r	   scipy.optimizer
   r   scipy.optimize._basinhoppingr   r   r   r   r   r!   r%   r'   r)   r=   r?   rK   rR   r   r   r   r  rI   r   r   <module>r2     s    , ,  *   7? ?
	#$ 	# * $p: p:f   F- -"S Sl*2 *2r   