o
    5ήc                      @   sF   d Z ddlmZmZ ddlZddlZddlmZm	Z	 G dd dZ
dS )z.
Unit test for DIRECT optimization algorithm.
    )assert_allcloseassert_array_lessN)directBoundsc                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
dddgdd Ze	j
dddgdd Ze	j
dddgdd Ze	j
dddgdd Ze	j
dddge	j
dddgdd Ze	j
dg de	j
dddgdd  Zd!d" Ze	j
dddgd#d$ Ze	j
dddgd%d& Ze	j
dddgd'd( Ze	j
dddgd)d* Ze	j
dddge	j
d+g d,d-d. Ze	j
dddgd/d0 Ze	j
dddgd1d2 Zd3S )4
TestDIRECTc                 C   sB   d| _ ddg | _td| _d| _tddgddg| _d| _d S )	Nr      )   r           g      g      @  )		fun_callsbounds_spherenpzerosoptimum_sphere_posoptimum_spherer   bounds_stylinski_tangmaxiter)self r   G/tmp/pip-target-vg8gfxp4/lib/python/scipy/optimize/tests/test_direct.pysetup_method   s   
zTestDIRECT.setup_methodc                 C   s   |  j d7  _ t| S )N   )r   r   squaresumr   xr   r   r   sphere   s   zTestDIRECT.spherec                 C   s"   t |dkr
t dt | S Nr   r   )r   r   ZeroDivisionErrorr   r   r   r   inv   s   zTestDIRECT.invc                 C      t jS N)r   nanr   r   r   r   nan_fun      zTestDIRECT.nan_func                 C   r"   r#   )r   infr   r   r   r   inf_fun"   r&   zTestDIRECT.inf_func                 C   sD   |\}}d|d d|d   d|  |d  d|d   d|   S )Ng      ?r            r   )r   posr   yr   r   r   styblinski_tang%   s   <zTestDIRECT.styblinski_tanglocally_biasedTFc                 C   s   t | j| j|d}t|j| jddd t|j| jddd t	| j}t
|d d df |j t
|j|d d df  |jdt| jd  ksIJ |j| jksQJ |j| jksYJ d S )	Nr/   MbP?rtolatolh㈵>r4   r3   r   r   r   )r   r   r   r   r   r   funr   r   asarrayr   nfevlenr   nitr   )r   r/   res_boundsr   r   r   test_direct)   s   

zTestDIRECT.test_directc                 C   s   t | j| j|d}dd }t | j| j||d}t|j|j |j|jks&J |j|jks.J |j|jks6J |j|jks>J |j	|j	ksFJ t|j|j |j
|j
ksUJ t|j| jddd t|j	| jddd d S )	Nr0   c                 S   s   d|  } t | }td |S )Nr*   z+DIRECT minimization algorithm callback test)r   r   print)r   dummyr   r   r   callbackG   s   
z1TestDIRECT.test_direct_callback.<locals>.callback)r/   rA   r1   r2   r5   r6   )r   r   r   r   r   r;   r9   statussuccessr7   messager   r   )r   r/   r<   rA   res_callbackr   r   r   test_direct_callbackA   s,   




zTestDIRECT.test_direct_callbackc                 C   sJ   ddg }t t t| j||d W d    d S 1 sw   Y  d S Nr   )i
   )boundsr/   )pytestraisesr    r   r!   r   r/   rI   r   r   r   test_exceptiona   s   
"zTestDIRECT.test_exceptionc                 C   s   ddg }t | j||d d S rG   )r   r%   rL   r   r   r   test_nanh   s   

zTestDIRECT.test_nanlen_tolr1   -C6?c                 C   sL   ddg }t | j||d|d}|jdksJ |jsJ t|jtd d S )Nr   )g      $      $@gKH9)rI   rO   vol_tolr/   r+   r
   )r   r   rB   rC   r   r   r   r   )r   rO   r/   rI   r<   r   r   r   test_len_toln   s   


zTestDIRECT.test_len_tol
f_min_rtol)r1   r5   gHz>c                 C   sT   d}ddg }t | j||||d}|jdksJ |jsJ |j|d|  k s(J d S )N      ?r   )       rQ   )rI   f_minrT   r/   r	   )r   r   rB   rC   r7   )r   rT   r/   rW   rI   r<   r   r   r   
test_f_minx   s   


zTestDIRECT.test_f_minc                 C   s(   t |d | t |d |   S r   )r   r   r   )r   r   abr   r   r   circle_with_args   s   (zTestDIRECT.circle_with_argsc                 C   s<   ddg }t | j|dd|d}t|jtddgdd d S )	Nr*   )rV   g       @)r   r   i  )argsmaxfunr/   rU   r5   r3   )r   r[   r   r   r   array)r   r/   rI   r<   r   r   r   test_f_circle_with_args   s
   
z"TestDIRECT.test_f_circle_with_argsc                 C   F   d}t | j| j||d}|jdu sJ |jdksJ |j|ks!J d S )Nd   )r]   r/   Fr   )r   r.   r   rC   rB   r9   )r   r/   r]   resultr   r   r   test_failure_maxfun      
zTestDIRECT.test_failure_maxfunc                 C   ra   )NrH   )r   r/   Fr*   )r   r.   r   rC   rB   r;   )r   r/   r   rc   r   r   r   test_failure_maxiter   re   zTestDIRECT.test_failure_maxiterc           	      C   s   g d}g d}t g d}tt||}t||}t| j||d}t| j||d}|j|jks3J |j|jks;J |j	|j	ksCJ |j
|j
ksKJ t|j|j t|j|dd d S )N)g      rU         )      g      @      @)rh   rU   r   r0   g{Gz?r^   )r   r_   listzipr   r   r   r9   rD   rC   r;   r   r   )	r   r/   lbubx_opt
bounds_old
bounds_newres_old_boundsres_new_boundsr   r   r   test_bounds_variants   s"   
zTestDIRECT.test_bounds_variantseps)r5   rP   r1   c                 C   s2   t | j| j|d|d}|jdksJ |jsJ d S )Ngư>)rt   rR   r/   r   )r   r.   r   rB   rC   )r   rt   r/   rc   r   r   r   test_epsilon   s   
zTestDIRECT.test_epsilonc                 C   s.   dgd }t | j|dd|d}|d usJ d S )N)rg   g      4@rb   i i@B )r]   r   r/   )r   r   r   r/   rI   rc   r   r   r   test_segmentation_fault   s
   

z"TestDIRECT.test_segmentation_faultc                 C   s*   dgd }t | j||d}|d usJ d S )N)rg   ri   r*   r0   )r   r(   rv   r   r   r   test_inf_fun   s
   
zTestDIRECT.test_inf_funN)__name__
__module____qualname__r   r   r!   r%   r(   r.   rJ   markparametrizer>   rF   rM   rN   rS   rX   r[   r`   rd   rf   rs   ru   rw   rx   r   r   r   r   r      sJ    	








r   )__doc__numpy.testingr   r   rJ   numpyr   scipy.optimizer   r   r   r   r   r   r   <module>   s    