o
    tBh5                     @   s   d 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 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 ddlmZ G dd dZd	S )z4
Unit tests for the dual annealing global optimizer
    )dual_annealing)EnergyState)LocalSearchWrapper)ObjectiveFunWrapper)StrategyChain)VisitingDistribution)rosen	rosen_derN)assert_equalassert_allcloseassert_array_less)raises)check_random_state)Versionc                   @   sn  e Zd Zdd Zdd ZdKddZdKdd	Zej	d
g ddd Z
ej	d
g ddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zejjeejed#k d$d%d&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#ej	d<g d=d>d? Z$d@dA Z%dBdC Z&dDdE Z'ej	dFg dGdHdI Z(dJS )LTestDualAnnealingc                 C   s\   dd | _ dgd | _| jd | _d| _d| _d| _d	| _d
| _t| j| _	d| _
d| _d S )Nc                 S   s   t jS N)npinfx r   /var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/scipy/optimize/tests/test__dual_annealing.py<lambda>   s    z0TestDualAnnealing.setup_method.<locals>.<lambda>{Gz{Gz@      i  in  g?(\@  r   )	weirdfunc	ld_bounds	hd_boundsnbtestvalueshigh_temperaturelow_temperatureqvseedr   rsnb_fun_callngevselfr   r   r   setup_method   s   

zTestDualAnnealing.setup_methodc                 C   s   |dkrdS d S )N      ?Tr   )r,   r   fcontextr   r   r   callback*   s   zTestDualAnnealing.callbackr   c              	   C   s`   |r|}nd}t || d dt dt j ||    dt |  | }|  jd7  _|S )Nr   r   
      )r   sumcospisizer)   )r,   r   argsshiftyr   r   r   func0   s   
zTestDualAnnealing.funcc                 C   s   |  j d7  _ t|g|R  S )Nr3   )r*   r	   )r,   r   r8   r   r   r   rosen_der_wrapper;   s   z#TestDualAnnealing.rosen_der_wrapperr&   )g?g(\?r   r   333333@c           
      C   s   t t| j }t|d }t|d }|j}t|||| j}t|}|	|d| j
}tt|dd t|}|	||| j
}	tt|	d dd d S )Nr   r3   T)listzipr!   r   arrayr7   r   r(   zerosvisitingr$   r
   	not_equal)
r,   r&   lulowerupperdimvdvalues
x_step_lowx_step_highr   r   r   test_visiting_steppingA   s   

z(TestDualAnnealing.test_visiting_stepping)g      @r   r=   c                 C   sn   t t| j }t|d }t|d }t|||| j}|| j| j	}t
t|d t
dt| d S )Nr   r3   g|=g    _B)r>   r?   r!   r   r@   r   r(   visit_fnr$   r#   r   minmax)r,   r&   rD   rE   rF   rH   rI   r   r   r   #test_visiting_dist_high_temperatureQ   s   z5TestDualAnnealing.test_visiting_dist_high_temperaturec                 C   sV   t | j}tt| j }t|d }t|d }t||}tt	|j
|td  d S )Nr   r3   )r   r    r>   r?   r!   r   r@   r   assert_raises
ValueErrorresetr   )r,   owfrD   rE   rF   esr   r   r   
test_resetc   s   

zTestDualAnnealing.test_resetc                 C   2   t | j| j| jd}t|jddd |jsJ d S Nr'           g-q=atol)r   r;   r!   r'   r   funsuccessr,   retr   r   r   test_low_dimk   s
   zTestDualAnnealing.test_low_dimc                 C   rW   rX   )r   r;   r"   r'   r   r]   r^   r_   r   r   r   test_high_dimq   s   zTestDualAnnealing.test_high_dimc                 C   *   t | j| jd| jd}t|jddd d S NTno_local_searchr'   rZ   -C6?r[   r   r;   r!   r'   r   r]   r_   r   r   r   test_low_dim_no_lsv      
z$TestDualAnnealing.test_low_dim_no_lsc                 C   rc   rd   )r   r;   r"   r'   r   r]   r_   r   r   r   test_high_dim_no_ls{   rj   z%TestDualAnnealing.test_high_dim_no_lsc                 C   s&   t | j| j| jd}t| j|j d S NrY   r   r;   r!   r'   r
   r)   nfevr_   r   r   r   test_nb_fun_call   s   z"TestDualAnnealing.test_nb_fun_callc                 C   s(   t | j| jd| jd}t| j|j d S )NTre   rm   r_   r   r   r   test_nb_fun_call_no_ls   s   
z(TestDualAnnealing.test_nb_fun_call_no_lsc                 C   s   t tt| j| j d S r   )rQ   rR   r   r    r!   r+   r   r   r   test_max_reinit   s   
z!TestDualAnnealing.test_max_reinitc                 C   s\   t | j| j| jd}t | j| j| jd}t | j| j| jd}t|j|j t|j|j d S rl   )r   r;   r!   r'   r
   r   )r,   res1res2res3r   r   r   test_reproduce   s
   z TestDualAnnealing.test_reproducez1.17z)Generator not available for numpy, < 1.17)reasonc                 C   sN   t jd}t| j| j|d}t jd}t| j| j|d}t|j|j d S )Nr3   rY   )r   randomdefault_rngr   r;   r!   r
   r   )r,   rngrr   rs   r   r   r   test_rand_gen   s
   zTestDualAnnealing.test_rand_genc                 C   s   g d}t tt| j| d S )N)r   )r3   r   )r   r   )rQ   rR   r   r;   )r,   wrong_boundsr   r   r   test_bounds_integrity   s   
z'TestDualAnnealing.test_bounds_integrityc                 C   sf   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)   r   )r   r   rQ   rR   r   r;   nan)r,   invalid_boundsr   r   r   test_bound_validity   s   


z%TestDualAnnealing.test_bound_validityc                 C   s   dd }t tddgddg}tjtdd t||d	|d
d W d    n1 s+w   Y  tjtdd t||d|d
d W d    d S 1 sMw   Y  d S )Nc                 S      t | d | d  S Nr~   r3   r   r4   r   r   r   r   r          zOTestDualAnnealing.test_deprecated_local_search_options_bounds.<locals>.<lambda>r}      r~   zdual_annealing argument matchSLSQPmethodbounds)r   local_search_optionsMethod CG cannot handle CGr   minimizer_kwargs)r>   r?   pytestwarnsDeprecationWarningr   RuntimeWarningr,   r;   r   r   r   r   +test_deprecated_local_search_options_bounds   s    "z=TestDualAnnealing.test_deprecated_local_search_options_boundsc                 C   sz   dd }t tddgddg}t||d|dd	 tjtd
d t||d|dd	 W d    d S 1 s6w   Y  d S )Nc                 S   r   r   r   r   r   r   r   r      r   z@TestDualAnnealing.test_minimizer_kwargs_bounds.<locals>.<lambda>r   r}   r   r~   r   r   r   r   r   r   )r>   r?   r   r   r   r   r   r   r   r   test_minimizer_kwargs_bounds   s   "z.TestDualAnnealing.test_minimizer_kwargs_boundsc                 C   sV   t | j| jd| jd}ttt| jtj tj	tj
}|jd| ks$J |jr)J d S )Nd   )maxfunr'   )r   r;   r!   r'   rN   rO   lenr   LS_MAXITER_RATIOLS_MAXITER_MINLS_MAXITER_MAXrn   r^   )r,   r`   ls_max_iterr   r   r   test_max_fun_ls   s   z!TestDualAnnealing.test_max_fun_lsc                 C   s4   t | j| jdd| jd}|jdksJ |jrJ d S )NTi  )rf   r   r'   )r   r;   r!   r'   rn   r^   r_   r   r   r   test_max_fun_no_ls   s
   
z$TestDualAnnealing.test_max_fun_no_lsc                 C   s(   t | j| jd| jd}|jdksJ d S )Ni  )maxiterr'   )r   r;   r!   r'   nitr_   r   r   r   test_maxiter   s   zTestDualAnnealing.test_maxiterc                 C   rc   )Nn!	@)r8   r'   r   gư>r[   rh   r_   r   r   r   test_fun_args_ls   rj   z"TestDualAnnealing.test_fun_args_lsc                 C   s,   t | j| jdd| jd}t|jddd d S )Nr   T)r8   rf   r'   r   rg   r[   rh   r_   r   r   r   test_fun_args_no_ls   s
   
z%TestDualAnnealing.test_fun_args_no_lsc                 C   sF   t | j| j| j| jd}|jdksJ d|jd v sJ |jr!J d S )N)r1   r'   r.   z
stop earlyr   )r   r;   r!   r1   r'   r]   messager^   r_   r   r   r   test_callback_stop   s   
z$TestDualAnnealing.test_callback_stopzmethod, atol))zNelder-Meadgh㈵>)COBYLAgh㈵>)Powell:0yE>)r   r   )BFGSr   )TNCr   )r   gH׊>c                 C   s0   t | j| jt|d| jd}t|jd|d d S )N)r   r   r'   rZ   r[   )r   r;   r!   dictr'   r   r]   )r,   r   r\   r`   r   r   r   test_multi_ls_minimizer   s
   

z)TestDualAnnealing.test_multi_ls_minimizerc                 C   s0   t tt| j| jdd t tt| j| jdd d S )Nr3   )restart_temp_ratior   )rQ   rR   r   r;   r!   r+   r   r   r   test_wrong_restart_temp  s   


z)TestDualAnnealing.test_wrong_restart_tempc                 C   s2   d| j i}tt| j|| jd}|j| jksJ d S )Njacr   )r<   r   r   r!   r'   njevr*   )r,   minimizer_optsr`   r   r   r   test_gradient_gnev  s   z$TestDualAnnealing.test_gradient_gnevc                 C   s\   dd }dgd }dgd }t |tt||dd}t|jg dd	d
 t|jddd
 d S )Nc                 S   s4   t | |  dt dt j |    dt |   S )Nr2   r   )r   r4   r5   r6   r7   r   r   r   r   r     s   4 z7TestDualAnnealing.test_from_docstring.<locals>.<lambda>r   r2   r   r   )r   r'   )
g[tP2gf0g˯>g,1gft;gh<g#0g(<geԑ:gi5g:0ye>r[   rZ   g-a=)r   r>   r?   r   r   r]   )r,   r;   lwupr`   r   r   r   test_from_docstring  s   

z%TestDualAnnealing.test_from_docstringz'new_e, temp_step, accepted, accept_rate))r   r     g]'?)r   r   r   gr(?)r2   r   in  gD?)r2   <   i  gt%?)r   r   i  gw?c                 C   s   t d}d}d}d}d}	t|D ]-}
td d d}||	dg t|d d d ||}||_|jd|dgd |j|kr=|d7 }q||ksDJ dd| ||	  |  }|dkrVdnt	t
|d|  }t|| d S )	N{   r   r   r}   r3   )rE   rF   r   )jex_visit)r   ranger   update_currentr   temperature_stepaccept_rejectcurrent_energyr   explogr   )r,   new_e	temp_stepacceptedaccept_rater(   count_accepted
iterationsaccept_paramr   _energy_statechainpqvrater   r   r    test_accept_reject_probabilistic*  s(   
$z2TestDualAnnealing.test_accept_reject_probabilisticN)r   ))__name__
__module____qualname__r-   r1   r;   r<   r   markparametrizerL   rP   rV   ra   rb   ri   rk   ro   rp   rq   ru   skipifr   r   __version__rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sN    



	
	
		r   )__doc__scipy.optimizer   scipy.optimize._dual_annealingr   r   r   r   r   r   r	   r   numpyr   numpy.testingr
   r   r   r   rQ   scipy._lib._utilr   scipy._lib._pep440r   r   r   r   r   r   <module>   s   