
    Ug?                         d Z ddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
mZ dd	lZdd	lZdd
lmZmZmZ ddlmZ ddlmZ  G d d          Zd	S )z4
Unit tests for the dual annealing global optimizer
    )dual_annealingBounds)EnergyState)LocalSearchWrapper)ObjectiveFunWrapper)StrategyChain)VisitingDistribution)rosen	rosen_derN)assert_equalassert_allcloseassert_array_less)raises)check_random_statec                   p   e Zd Zd Zd Zd,dZd,dZej        	                    dg d          d             Z
ej        	                    dg d	          d
             Zd Zd Zej                            d          d             Zd Zej                            d          d             Zd Zd Z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 Zd Z ej        	                    d g d!          d"             Z!d# Z"d$ Z#ej                            d          d%             Z$ej        	                    d&g d'          d(             Z%ej                            d          d)             Z&ej                            d          d*             Z'd+S )-TestDualAnnealingc                     d | _         dgdz  | _        | j        dz  | _        d| _        d| _        d| _        d| _        d	| _        t          | j                  | _	        d
| _
        d
| _        d S )Nc                     t           j        S N)npinfxs    h/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/optimize/tests/test__dual_annealing.py<lambda>z0TestDualAnnealing.setup_method.<locals>.<lambda>   s    26     {Gz{Gz@      i  in  g?(\@  r   )	weirdfunc	ld_bounds	hd_boundsnbtestvalueshigh_temperaturelow_temperatureqvseedr   rsnb_fun_callngevselfs    r   setup_methodzTestDualAnnealing.setup_method   sr    ))'1,!+  $"	$TY//			r   c                     |dk    rdS d S )N      ?T )r0   r   fcontexts       r   callbackzTestDualAnnealing.callback*   s     884 8r   r4   c           	          |r|}nd}t          j        ||z
  dz  dt          j        dt           j        z  ||z
  z            z  z
            dt          j        |          z  z   |z   }| xj        dz  c_        |S )Nr   r    
      )r   sumcospisizer-   )r0   r   argsshiftys        r   funczTestDualAnnealing.func0   s     	EEEFAI!#b26!be)I3 , , '   

?+-23Ar   c                 <    | xj         dz  c_         t          |g|R  S Nr:   )r.   r   )r0   r   r?   s      r   rosen_der_wrapperz#TestDualAnnealing.rosen_der_wrapper;   s'    		Q		"T""""r   r*   )g?g(\?r    r"   333333@c                 8   t          t          | j                   }t          j        |d                   }t          j        |d                   }|j        }t          |||| j                  }t          j        |          }|	                    |d| j
                  }t          t          j        |d          d           t          j        |          }|	                    ||| j
                  }	t          t          j        |	d         d          d           d S )Nr   r:   T)listzipr%   r   arrayr>   r	   r,   zerosvisitingr(   r   	not_equal)
r0   r*   lulowerupperdimvdvalues
x_step_lowx_step_highs
             r   test_visiting_steppingz(TestDualAnnealing.test_visiting_steppingA   s    #t~&''AAj!%DG<<#[[D,ABB
R\*a00$777#kk&#t/DEER\+a.!44d;;;;;r   )g      @r"   rF   c                    t          t          | j                   }t          j        |d                   }t          j        |d                   }t          |||| j                  }|                    | j        | j	                  }t          t          j        |          d           t          dt          j        |                     d S )Nr   r:   g|=g    _B)rH   rI   r%   r   rJ   r	   r,   visit_fnr(   r'   r   minmax)r0   r*   rN   rO   rP   rR   rS   s          r   #test_visiting_dist_high_temperaturez5TestDualAnnealing.test_visiting_dist_high_temperatureQ   s    #t~&''AA!%DG<< T2D4EFF 	"&..%000%00000r   c                 >   t          | j                  }t          t          | j                   }t          j        |d                   }t          j        |d                   }t          ||          }t          t          |j
        |t          d                      d S )Nr   r:   )r   r$   rH   rI   r%   r   rJ   r   assert_raises
ValueErrorresetr   )r0   owfrN   rO   rP   ess         r   
test_resetzTestDualAnnealing.test_resetc   s{    !$.11#t~&''AA&&j"(C1CD1I1IJJJJJr   c                     t          | j        | j        | j                  }t	          |j        dd           |j        sJ d S Nr+           g-q=atol)r   rB   r%   r+   r   funsuccessr0   rets     r   test_low_dimzTestDualAnnealing.test_low_dimk   sN    It~DI7 7 7%0000{r      c                     t          | j        | j        | j                  }t	          |j        dd           |j        sJ d S rd   )r   rB   r&   r+   r   ri   rj   rk   s     r   test_high_dimzTestDualAnnealing.test_high_dimq   sG    TYTYGGG%0000{r   c                 x    t          | j        | j        d| j                  }t	          |j        dd           d S NTno_local_searchr+   rf   -C6?rg   r   rB   r%   r+   r   ri   rk   s     r   test_low_dim_no_lsz$TestDualAnnealing.test_low_dim_no_lsw   sE    TY-1	C C C$//////r   c                 x    t          | j        | j        d| j                  }t	          |j        dd           d S rr   )r   rB   r&   r+   r   ri   rk   s     r   test_high_dim_no_lsz%TestDualAnnealing.test_high_dim_no_ls|   sE    TY-1	C C C$//////r   c                 |    t          | j        | j        | j                  }t	          | j        |j                   d S Nre   r   rB   r%   r+   r   r-   nfevrk   s     r   test_nb_fun_callz"TestDualAnnealing.test_nb_fun_call   s7    TYTYGGGT%sx00000r   c                 ~    t          | j        | j        d| j                  }t	          | j        |j                   d S )NTrs   r|   rk   s     r   test_nb_fun_call_no_lsz(TestDualAnnealing.test_nb_fun_call_no_ls   sC    TY-1	C C CT%sx00000r   c                 R    t          t          t          | j        | j                   d S r   )r]   r^   r   r$   r%   r/   s    r   test_max_reinitz!TestDualAnnealing.test_max_reinit   s+    j.$.n	& 	& 	& 	& 	&r   c                 4   t          | j        | j        | j                  }t          | j        | j        | j                  }t          | j        | j        | j                  }t	          |j        |j                   t	          |j        |j                   d S r{   )r   rB   r%   r+   r   r   )r0   res1res2res3s       r   test_reproducez TestDualAnnealing.test_reproduce   s    didiHHHdidiHHHdidiHHH 	TVTV$$$TVTV$$$$$r   c                 &   t           j                            d          }t          | j        | j        |          }t           j                            d          }t          | j        | j        |          }t          |j        |j                   d S )Nr:   re   )r   randomdefault_rngr   rB   r%   r   r   )r0   rngr   r   s       r   test_rand_genzTestDualAnnealing.test_rand_gen   sz     i##A&&dicBBBi##A&&dicBBB 	TVTV$$$$$r   c                 P    g d}t          t          t          | j        |           d S )N)r   )r:   r   )r   r   )r]   r^   r   rB   )r0   wrong_boundss     r   test_bounds_integrityz'TestDualAnnealing.test_bounds_integrity   s4    <<<j.$)"	$ 	$ 	$ 	$ 	$r   c                 4   dt           j         dfdg}t          t          t          | j        |           ddt           j        fdg}t          t          t          | j        |           ddt           j        fdg}t          t          t          | j        |           d S )N)rn   r   )r   r   r]   r^   r   rB   nan)r0   invalid_boundss     r   test_bound_validityz%TestDualAnnealing.test_bound_validity   s    !RVGQ<9j.$)$	& 	& 	&!Arv;8j.$)$	& 	& 	&!Arv;8j.$)$	& 	& 	& 	& 	&r   c                     d }t          t          ddgddg                    }t          j        t          d          5  t          ||d|d	
           d d d            d S # 1 swxY w Y   d S )Nc                 <    t          j        | dz
  | dz
  z            S Nrn   r:   r   r;   r   s    r   rB   zKTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.func       61q5QU+,,,r   r      rn   Method CG cannot handle matchCGmethodboundsr   minimizer_kwargs)rH   rI   pytestwarnsRuntimeWarningr   r0   rB   r   s      r   +test_deprecated_local_search_options_boundsz=TestDualAnnealing.test_deprecated_local_search_options_bounds   s    	- 	- 	-c2r(QF++,, \.0KLLL 	E 	E,0F!C!CE E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es    A##A'*A'c                 
   d }t          t          ddgddg                    }t          ||d|d           t          j        t
          d	
          5  t          ||d|d           d d d            d S # 1 swxY w Y   d S )Nc                 <    t          j        | dz
  | dz
  z            S r   r   r   s    r   rB   z<TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.func   r   r   r   r   r   rn   SLSQPr   r   r   r   r   )rH   rI   r   r   r   r   r   s      r   test_minimizer_kwargs_boundsz.TestDualAnnealing.test_minimizer_kwargs_bounds   s   	- 	- 	-c2r(QF++,,(/6BB	D 	D 	D 	D
 \.0KLLL 	E 	E,0F!C!CE E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es   A88A<?A<c                    t          | j        | j        d| j                  }t	          t          t          | j                  t          j        z  t          j	                  t          j
                  }|j        d|z   k    sJ |j        rJ d S )Nd   )maxfunr+   )r   rB   r%   r+   rY   rZ   lenr   LS_MAXITER_RATIOLS_MAXITER_MINLS_MAXITER_MAXr}   rj   )r0   rl   ls_max_iters      r   test_max_fun_lsz!TestDualAnnealing.test_max_fun_ls   s    TYs"&)- - - #"4"EE-/ / -/ / x3,,,,,;r   c                 x    t          | j        | j        dd| j                  }|j        dk    sJ |j        rJ d S )NTi  )rt   r   r+   )r   rB   r%   r+   r}   rj   rk   s     r   test_max_fun_no_lsz$TestDualAnnealing.test_max_fun_no_ls   sM    TY-1#DIO O Ox3;r   c                 d    t          | j        | j        d| j                  }|j        dk    sJ d S )Ni  )maxiterr+   )r   rB   r%   r+   nitrk   s     r   test_maxiterzTestDualAnnealing.test_maxiter   s8    TY"&)- - -w#~~~~~~r   c                 x    t          | j        | j        d| j                  }t	          |j        dd           d S )Nn!	@)r?   r+   r   ư>rg   rv   rk   s     r   test_fun_args_lsz"TestDualAnnealing.test_fun_args_ls   sE    TY#-TY@ @ @t444444r   c                 z    t          | j        | j        dd| j                  }t	          |j        dd           d S )Nr   T)r?   rt   r+   r   ru   rg   rv   rk   s     r   test_fun_args_no_lsz%TestDualAnnealing.test_fun_args_no_ls   sG    TY#."&)- - - 	t444444r   c                     t          | j        | j        | j        | j                  }|j        dk    sJ d|j        d         v sJ |j        rJ d S )N)r7   r+   r3   z
stop earlyr   )r   rB   r%   r7   r+   ri   messagerj   rk   s     r   test_callback_stopz$TestDualAnnealing.test_callback_stop   sf     TY&*m$)E E Ew#~~~~s{1~----;r   zmethod, atol))zNelder-Meadgh㈵>)COBYLAgh㈵>)COBYQA:0yE>)Powellr   )r   r   )BFGSr   )TNCr   )r   gH׊>c                     t          | j        | j        t          |          | j                  }t          |j        d|           d S )Nr   r   r+   rf   rg   )r   rB   r%   dictr+   r   ri   )r0   r   rh   rl   s       r   test_multi_ls_minimizerz)TestDualAnnealing.test_multi_ls_minimizer   sR     TY.2&.A.A.A"&)- - - 	$//////r   c                     t          t          t          | j        | j        d           t          t          t          | j        | j        d           d S )Nr:   )restart_temp_ratior   )r]   r^   r   rB   r%   r/   s    r   test_wrong_restart_tempz)TestDualAnnealing.test_wrong_restart_temp  sX    j.$)n	< 	< 	< 	<j.$)n	< 	< 	< 	< 	< 	<r   c                     d| j         i}t          t          | j        || j                  }|j        | j        k    sJ d S )Njacr   )rE   r   r
   r%   r+   njevr.   )r0   minimizer_optsrl   s      r   test_gradient_gnevz$TestDualAnnealing.test_gradient_gnev  sR    4)
 UDN.<"&)- - - x49$$$$$$r   c           	          d }dgdz  }dgdz  }t          |t          t          ||                    d          }t          |j        g dd	           t          |j        d
d	           d S )Nc                     t          j        | | z  dt          j        dt           j        z  | z            z  z
            dt          j        |           z  z   S Nr9   r    r   r;   r<   r=   r>   r   s    r   rB   z3TestDualAnnealing.test_from_docstring.<locals>.func  sE    6!a%"rva"%i!m'<'<"<<==RWQZZOOr   r   r9   r   r#   r   r+   )
g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>rg   rf   g-a=)r   rH   rI   r   r   ri   )r0   rB   lwuprl   s        r   test_from_docstringz%TestDualAnnealing.test_from_docstring  s    	P 	P 	PWr\Vb[T$s2r{{*;*;$GGG* * * 15		6 	6 	6 	6
 	666666r   z'new_e, temp_step, accepted, accept_rate))r   r     g]'?)r   r    r   gr(?)r9   r   in  gD?)r9   <   i  gt%?)r    r   i  gw?c           	         t          d          }d}d}d}d}	t          |          D ]n}
t          d d           }|                    |	dg           t	          |d d d ||          }||_        |                    d|dg           |j        |k    r|dz  }o||k    sJ dd|z
  ||	z
  z  |z  z
  }|dk    rdn+t          j	        t          j
        |          d|z
  z            }t          ||           d S )	N{   r   r   r   r:   )rO   rP   r    )jex_visit)r   ranger   update_currentr   temperature_stepaccept_rejectcurrent_energyr   explogr   )r0   new_e	temp_stepacceptedaccept_rater,   count_accepted
iterationsaccept_paramr   _energy_statechainpqvrates                  r    test_accept_reject_probabilisticz2TestDualAnnealing.test_accept_reject_probabilistic+  s:     $$
z"" 	$ 	$A&T>>>L''<<<!dD$LB BE &/E" !uqc:::*e33!#)))) 1|#(>?)KK1HHqq"&L8H)I"J"Jk*****r   c                    d }dgdz  }dgdz  }d|d<   d|d<   d	|d
<   d|d<   t          ||          }t          ||d          }t          t          ||                    }t          ||d          }t	          |j        |j        d           t	          |j        t          j        dd
          d           t	          |j        |j        d           |j	        |j	        k    sJ d S )Nc                     t          j        | | z  dt          j        dt           j        z  | z            z  z
            dt          j        |           z  z   }|S r   r   )r   r5   s     r   rB   z1TestDualAnnealing.test_bounds_class.<locals>.funcX  sI    q1urBF1ru9q=$9$999::R"'!**_LAHr   r   rn   r   g       r   g      r:   r3      g       @r!   r#   r   r   rg   gHz>g&.>)
r   r   rH   rI   r   r   r   arangeri   r}   )r0   rB   r   r   r   ret_bounds_class
bounds_oldret_bounds_lists           r   test_bounds_classz#TestDualAnnealing.test_bounds_classU  s   	 	 	 Wq[VaZ 1111 B)$vDIII#b"++&&
(jtLLL 	(*O,=DIIII(*BIb!,<,<4HHHH+-=-AMMMM#'7'<<<<<<<r   c                 T  	 t           j                            d          }d }d }d 		fd}t          |dddgddgg|t	          d	
                    }t          |dddgddgg|t	          d	|                    }t          |dddgddgg|t	          d|	                    }t          |dddgddgg|t	          d||                    }t          |j        |j        d           t          |j        |j        d           t          |j        |j        d           d S )Nl   ]k@A`Q c                 T    t          j        t          j        | |z                      S r   )r   r;   r   r   powers     r   r5   zETestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.fy  s     6"&e,,---r   c                 H    t          j        | |z            |z  | |dz
  z  z  S rD   )r   r   r  s     r   r   zGTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.jac|  s)    6!u*%%-eai0@@@r   c                     t          j        |t          j        | |z            z  | |dz
  z  z  || |z  z  |z   dz
  z            S )Nr    r:   )r   diagr   r  s     r   hesszHTestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hess  sU    7qEz***Q519-==e#e+a/1  r   c                 "     | |          |z  S r   r4   )r   pr	  r  s      r   hesspzITestDualAnnealing.test_callable_jac_hess_with_args_gh11052.<locals>.hessp  s    45>>A%%r   )r    r   r:   zL-BFGS-Br   )r?   r   r+   r   )r   r   z	newton-cg)r   r   r  )r   r   r  r   )rtol)r   r   r   r   r   r   ri   )
r0   r   r5   r   r  r   r   r   res4r  s
            @r   (test_callable_jac_hess_with_args_gh11052z:TestDualAnnealing.test_callable_jac_hess_with_args_gh11052r  s    i##$899	. 	. 	.	A 	A 	A	 	 		& 	& 	& 	& 	& aeaVaV4D3/3:/F/F/FH H HaeaVaV4D3/3:8;0= 0= 0=> > > aeaVaV4D3/3;8;$0H 0H 0HI I I aeaVaV4D3/3;8;50J 0J 0JK K K 	$(6666$(6666$(666666r   N)r4   )(__name__
__module____qualname__r1   r7   rB   rE   r   markparametrizerV   r[   rb   rm   	fail_slowrp   rw   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r4   r   r   r   r      sy         "  	 	 	 	# # # # [T#<#<#<==< < >=< [T#4#4#4551 1 651"K K K   [1  
0 0 0
 [10 0 0
1 1 11 1 1
& & & [1% % %% % %$ $ $
	& 	& 	&
E 
E 
EE E E 	 	 	    5 5 55 5 5   [^ 	. 	. 	. 	 	0 0	 	0< < <% % % [17 7 7 [F I I I  !+ !+ !+F [1= = =8 [1#7 #7 #7 #7 #7r   r   )__doc__scipy.optimizer   r   scipy.optimize._dual_annealingr   r   r   r   r	   r
   r   r   numpyr   numpy.testingr   r   r   r   r]   scipy._lib._utilr   r   r4   r   r   <module>r      s.  
  2 1 1 1 1 1 1 1 6 6 6 6 6 6 = = = = = = > > > > > > 8 8 8 8 8 8 ? ? ? ? ? ? + + + + + + + +      J J J J J J J J J J * * * * * * / / / / / /7 7 7 7 7 7 7 7 7 7r   