
    ^Mh
K                        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ej        j          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_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      g/var/www/html/test/jupyter/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
ej                            d	          d
             Zej                            d          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| _        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jacrY   N)	x0r   r   soltolniterdisprG   kwargs_nogradrD   s    r   setup_methodzTestBasinHopping.setup_methodl   se    
 c
#BHfd^445
	!+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)re   
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.   rh   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    rt   r   )r
   r%   r[   rG   r^   r_   r   r   r\   r]   r   nfevrw   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   rt   r   )rG   copyr
   r%   r[   r^   r_   r   r{   r   njev)r.   rh   ru   rx   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   rl   rt   rZ   )rG   r   r
   r'   r^   r_   r   hasattrlowest_optimization_resultr   r   rZ   r]   )r.   ru   rx   _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    rt   )
r
   r!   r[   r`   r^   r_   r   r   r\   r]   rw   s      r   test_2d_nogradzTestBasinHopping.test_2d_nograd   sX    =$'!*,0,>!%$)= = = 	CE48A;99999r   rO   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   rt   )r   rG   r
   r%   r[   r^   r_   r   r   r\   r]   )r.   rh   methodsru   rY   rx   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 ]q}|dk    rdn| j        }||d<   t          t          | j        |         ||| j        d          }| j        }|dk    rd	}t          |j	        | j
        |         |
           rd S )Nr    )	r   r~   rW   r   r   zNelder-MeadPowellCOBYLACOBYQAr   rO   rY     )ru   r^   r_   seedr   r#   )decimal)r   r`   r^   r
   r!   r[   r_   r]   r   r   r\   )r.   rh   r   ru   rY   r^   rx   r]   s           r   test_all_nograd_minimizersz+TestBasinHopping.test_all_nograd_minimizers   s     @ @ @9T%788 
	A 
	AF H,,BB$*E)/X&}dgaj0@%*G G G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    )ru   r^   r_   rc   )r)   stepsizer
   r%   r[   rG   r^   r_   r   r   r\   r]   r   r+   )r.   takestepinitial_step_sizerh   rx   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[   r`   r^   r_   r   r   r\   r]   )r.   r   rh   rx   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   )ru   r^   r_   rd   )r?   r
   r%   r[   rG   r_   r   r+   )r.   rd   rh   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       )ru   r^   r_   callbackr   r   	   )rK   r
   r%   r[   rG   r_   r   r+   messager   nit)r.   r   rh   rx   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   rt   )
dictrG   r^   r
   r%   r[   r_   r   r   minimization_failuresrw   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 rs   )r
   r   r[   rG   r_   rg   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_rng_reproducibility.<locals>.callback3      JJqMMMMMr   rT   rO   )ru   r^   r   rngc                 2                         |           d S r   r   )r   r   rP   f_2s      r   	callback2z<TestBasinHopping.test_rng_reproducibility.<locals>.callback2;  r   r   )r
   r%   r   r   r   )r.   ru   r   r   r   r   s       @@r   test_rng_reproducibilityz)TestBasinHopping.test_rng_reproducibility-  s    &0>>	 	 	 	 	 	Vc3Z:Jb	: 	: 	: 	: 	 	 	 	 	 	Vc3Z:J	r	; 	; 	; 	;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   )ru   r^   r   )r   r9   default_rngr
   r%   r   r   )r.   r   ru   res1res2s        r   test_random_genz TestBasinHopping.test_random_genB  s    i##A&&&0>>FS#J-="$#/ / / i##A&&FS#J-="$#/ / / 	TVTV$$$$$r   c                     d}t          t          | j        |         | j        | j        | j        d          }t          |j        | j        |         | j	                   d S )Nr   )ru   r^   r_   Trv   rw   s      r   test_monotonic_basin_hoppingz-TestBasinHopping.test_monotonic_basin_hoppingR  sY    6471:!%$)qB B BCE48A;99999r   N)r2   r3   r4   ra   ri   rq   ry   r|   r   r   r   pytestmark	fail_slowr   r   r   r   r   r   r   r   r   r   r   rI   r   r   rR   rR   j   sq       4 4 4 % % %A A A: : :  
) 
) 
)& & &": : : [2> > > [2A A A&8 8 8: : :	) 	) 	)! ! ! 	= 	= 	=. . .3 3 3*% % % : : : : :r   rR   c                   f    e Zd Zd Zd Zej                            dddg          d             ZdS )Test_Storagec                     t          j        d          | _        d| _        t	          d          }| j        |_        | j        |_        t          |          | _        d S )Nr    r   Tsuccess)	r   r   r[   f0r   r   funr   storage)r.   minress     r   ra   zTest_Storage.setup_method]  sK    (1++---7W
vr   c                 P   t          d          }| j        dz   |_        | j        dz   |_        | j                            |          }| j                                        }t          | j        |j                   t          | j        |j                   t          |            d S )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_rejectedg  s    #D111
w{
1
l!!*--((**TWfh'''TWfj)))Cr   r   TFc                 ,   t          |          }| j        dz   |_        | j        dz
  |_        | j                            |          }| j                                        }| j        |j        k    |k    sJ | j        |j        k    |k    sJ ||u sJ d S )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_acceptedr  s    #G444
w{
1
l!!*--((**68#////6:%'1111g~~~~~~r   N)	r2   r3   r4   ra   r   r   r   parametrizer   rI   r   r   r   r   [  sd        ' ' '	 	 	 [Yu66	 	 76	 	 	r   r   c                       e Zd Zd Zd ZdS )Test_RandomDisplacementc                 "    d| _         d| _        d S )NrT   i )r   NrD   s    r   ra   z$Test_RandomDisplacement.setup_method  s    r   c                 f   t           j                            d          }t          j        | j        g          }t          | j        |          } ||          }d| j        z  dz  dz  }t          t          j        |          dd           t          t          j	        |          |d           d S )Nr   )r   r   r   r#      rl   r    )
r   r9   RandomStater$   r   r   r   r   meanvar)r.   r   r[   displacer   vs         r   test_randomz#Test_RandomDisplacement.test_random  s     i##A&&Xtvh%t}#FFFHRLL$-A%*BGAJJA...BF1IIq!,,,,,r   N)r2   r3   r4   ra   r   rI   r   r   r   r     s2          
- 
- 
- 
- 
-r   r   c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
Test_Metropolisc                     d| _         t          | j                   | _        t          dd          | _        t          dd          | _        d S )Nr   Trl   r   r   rT   )r   r   metr   res_newres_oldrD   s    r   ra   zTest_Metropolis.setup_method  sF    df%%%d;;;%d;;;r   c                 v    |                      | j        | j                  }t          |t                    sJ d S Nr   r   )r   r   r   
isinstancebool)r.   r   s     r   test_boolean_returnz#Test_Metropolis.test_boolean_return  s9     hht|T\hBB#t$$$$$$$r   c                 b    t          |                     | j        | j                             d S r   )r   r   r   r   rD   s    r   r   z%Test_Metropolis.test_lower_f_accepted  s*    t|DDEEEEEr   c                     d}d}t          d          D ]H}|r|r nAt          dd          }t          dd          }|                     ||          }|rd}Fd}It          |           t          |           d S )NFi  TrT   r   r8   r   )ranger   r   r   )r.   
one_accept
one_rejectrh   r   r   r   s          r   test_acceptzTest_Metropolis.test_accept  s    

t 		" 		"A j $Tr:::G$Ts;;;G((7G(<<C "!

!



r   c                     t          d          }t          dd          }t          dd          }t          j        d          5  |                    ||           d d d            d S # 1 swxY w Y   d S )	Nr#   Trl   r   i  raise)overr   )r   r   r   errstateaccept_rejectr.   r   r   r   s       r   test_GH7495zTest_Metropolis.test_GH7495  s     mm 2666 4888[g&&& 	@ 	@gw???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   A,,A03A0c                     d d}ddfddf}t          |dt          j                            d          d	|i
          }|j        sJ t          |j        d           d S )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   r   constraints)r   ru   gư>)rtol)r
   r   r9   r   r   r   r   )r.   r[   conrx   r  r
  s       @@r   test_gh7799zTest_Metropolis.test_gh7799  s    	( 	( 	( &?&?&?&?&?@@A&&t,,+S1
 
 
 {T222222r   c                     t          d          }t          dd          }t          dd          } |||          sJ d|_         |||          rJ d|_         |||          sJ d S )Nr   Trl   r   rT   r   F)r   r   r   r   s       r   test_accept_gh7799z"Test_Metropolis.test_accept_gh7799  s     mm 2666 2666 s7G4444443w888888s7G44444444r   c                 d    d }d }d|dddgdd}t          |dd	gd
|          }|j        rJ d S )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^   ru   )r
   r   )r.   r   r  rG   rx   s        r   test_reject_all_gh7799z&Test_Metropolis.test_reject_all_gh7799  ss    	 	 		 	 	 +/z!B!B#V,A A3Aq6fMMM;r   N)r2   r3   r4   ra   r   r   r   r   r  r  r  rI   r   r   r   r     s        < < <% % %F F F  "@ @ @3 3 3&5 5 5"    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   tsrm   r   r   rD   s    r   ra   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 )Nrl   FTr   reportr   intervalr   r!  r   r.   r   rh   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 )Nrl   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 )Nrl   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 )Nrl   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   ra   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   r   r   r   re   numpyr   r   r	   scipy.optimizer
   r   scipy.optimize._basinhoppingr   r   r   r   r   r!   r%   r'   r)   r=   r?   rK   rR   r   thread_unsafer   r   r   r  rI   r   r   <module>r4     s    , , , , , , , , , , , ,  * * * * * *             7 7 7 7 7 7 7 7? ? ? ? ? ? ? ? ? ? ? ?    
    	# 	# 	# 	# 	#$ 	# 	# 	#         *       $n: n: n: n: n: n: n: n:b                F- - - - - - - -$Y Y Y Y Y Y Y Yx*2 *2 *2 *2 *2 *2 *2 *2 *2 *2r   