U
    »mœd`3  ã                   @   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ddg¡e	j
 dddg¡d d!„ ƒƒZe	j
 d"dd#d$g¡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/d0„ ƒZe	j
 dddg¡e	j
 d1d#ddg¡d2d3„ ƒƒZe	j
je	j
 dddg¡d4d5„ ƒƒZe	j
 dddg¡d6d7„ ƒZe	j
 dd8d9g¡d:d;„ ƒZe	j
 dd8d9g¡d<d=„ ƒZe	j
 d"d8d9g¡d>d?„ ƒZe	j
 d@dAdBdCg¡dDdE„ ƒZe	j
 dFdAdBdCg¡dGdH„ ƒZ dIdJ„ Z!dKdL„ Z"e	j
 dMdMdNdOg¡dPdQ„ ƒZ#e	j
 dMe$dRd8gdSdTgƒe$e%j& d8gdSe%j&gƒg¡dUdV„ ƒZ'dWdX„ Z(e	j
 ddYdOdOgdNg¡dZd[„ ƒZ)d\S )]Ú
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   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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   s   t jS ©N)r   Únanr   r   r   r   Únan_fun   s    zTestDIRECT.nan_func                 C   s   t jS r"   )r   Úinfr   r   r   r   Úinf_fun"   s    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s’t‚|j| jks¢t‚|j| jks²t‚d S )	N©r-   çü©ñÒMbP?©ÚrtolÚatolçñhãˆµøä>©r2   r1   r   r   r   )r   r   r   r   r   r   Úfunr   r   Zasarrayr   ÚnfevÚlenÚAssertionErrorr   Únitr   )r   r-   ÚresZ_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sLt‚|j|jks\t‚|j|jkslt‚|j	|j	ks|t‚|j
|j
ksŒt‚t|j|jƒ |j|jksªt‚t|j| jddd� t|j
| jddd� d S )	Nr.   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-   r>   r/   r0   r3   r4   )r   r   r   r   r   r9   r8   r6   ÚstatusÚsuccessr5   Úmessager   r   )r   r-   r:   r>   Zres_callbackr   r   r   Útest_direct_callbackA   s0    
ÿ
þ
 ÿ
 ÿzTestDIRECT.test_direct_callbackc              	   C   s4   ddg }t  t¡� t| j||d� W 5 Q R X d S ©Nr   )iöÿÿÿé
   )Úboundsr-   )ÚpytestÚraisesr    r   r!   ©r   r-   rE   r   r   r   Útest_exceptiona   s
    
ÿzTestDIRECT.test_exceptionc                 C   s   ddg }t | j||d� d S rC   )r   r$   rH   r   r   r   Útest_nanh   s    
ÿzTestDIRECT.test_nanÚlen_tolr/   g-Cëâ6?c                 C   sd   ddg }t | j||d|d�}|jdks,t‚|js6t‚t|jt d¡ƒ d|› �}|j	|ks`t‚d S )Nr   ©g      $Àç      $@g ÂëþKH´9)rE   rK   Úvol_tolr-   r)   r
   zjThe side length measure of the hyperrectangle containing the lowest function value found is below len_tol=©
r   r   r?   r8   r@   r   r   r   r   rA   )r   rK   r-   rE   r:   rA   r   r   r   Útest_len_toln   s    

 ÿ

zTestDIRECT.test_len_tolrN   ç�íµ ÷Æ°>g:Œ0âŽyE>c                 C   sd   ddg }t | j||d|d�}|jdks,t‚|js6t‚t|jt d¡ƒ d|› �}|j	|ks`t‚d S )Nr   rL   r   )rE   rN   rK   r-   r
   z]The volume of the hyperrectangle containing the lowest function value found is below vol_tol=rO   )r   rN   r-   rE   r:   rA   r   r   r   Útest_vol_tol|   s    

 ÿ

zTestDIRECT.test_vol_tolÚ
f_min_rtolr3   gH¯¼šò×z>c                 C   sn   d}ddg }t | j||||d�}|jdks0t‚|js:t‚|j|d|  k sPt‚d|› d�}|j|ksjt‚d S )Nç      ð?r   )ç       ÀrM   )rE   Úf_minrS   r-   r	   z9The best function value found is within a relative error=z$ of the (known) global optimum f_min)r   r   r?   r8   r@   r5   rA   )r   rS   r-   rV   rE   r:   rA   r   r   r   Ú
test_f_min‰   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(   )rU   ç       @)r   r   iâ  )ÚargsÚmaxfunr-   rT   r3   ©r1   )r   rZ   r   r   r   Úarray)r   r-   rE   r:   r   r   r   Útest_f_circle_with_args�   s
    
ÿz"TestDIRECT.test_f_circle_with_argsc                 C   s^   d}t | j| j||d�}|jdks&t‚|jdks4t‚|j|ksBt‚d|› �}|j|ksZt‚d S )Néd   )r]   r-   Fr   z:Number of function evaluations done is larger than maxfun=)r   r,   r   r@   r8   r?   r6   rA   )r   r-   r]   ÚresultrA   r   r   r   Útest_failure_maxfun¥   s    
 ÿ
zTestDIRECT.test_failure_maxfunc                 C   s^   d}t | j| j||d�}|jdks&t‚|jdks4t‚|j|ksBt‚d|› �}|j|ksZt‚d S )NrD   )r   r-   Fr(   z,Number of iterations is larger than maxiter=)r   r,   r   r@   r8   r?   r9   rA   )r   r-   r   rb   rA   r   r   r   Útest_failure_maxiter´   s    
 ÿ
zTestDIRECT.test_failure_maxiterc           	      C   s¾   dddg}dddg}t  dddg¡}tt||ƒƒ}t||ƒ}t| j||d�}t| j||d�}|j|jkslt‚|j	|j	ks|t‚|j
|j
ksŒt‚|j|jksœt‚t|j|jƒ t|j|d	d
� d S )Ng      ÀrT   ç      Àç      ð¿g      @ç      @r   r.   g{®Gáz„?r^   )r   r_   ÚlistÚzipr   r   r   r6   r8   rA   r@   r9   r   r   )	r   r-   ZlbZubZx_optZ
bounds_oldZ
bounds_newZres_old_boundsZres_new_boundsr   r   r   Útest_bounds_variantsÂ   s"    


ÿÿzTestDIRECT.test_bounds_variantsÚepsc                 C   s2   t | j| j|d|d�}|jdks$t‚|js.t‚d S )NrQ   )rk   rN   r-   r   )r   r,   r   r?   r8   r@   )r   rk   r-   rb   r   r   r   Útest_epsilonØ   s    
 þzTestDIRECT.test_epsilonc                 C   s.   dgd }t | j|dd|d�}|d k	s*t‚d S )N)re   g      4@ra   i€–˜ i@B )r]   r   r-   )r   r   r8   ©r   r-   rE   rb   r   r   r   Útest_no_segmentation_faultá   s    

 ÿz%TestDIRECT.test_no_segmentation_faultc                 C   s*   dgd }t | j||d�}|d k	s&t‚d S )N)re   rg   r(   r.   )r   r&   r8   rm   r   r   r   Útest_inf_funë   s
    
ÿzTestDIRECT.test_inf_funéÿÿÿÿr(   c              	   C   s4   d}t jt|d�� t| j| j|d� W 5 Q R X d S )Nz len_tol must be between 0 and 1.©Úmatch)rK   ©rF   rG   Ú
ValueErrorr   r,   r   )r   rK   Ú	error_msgr   r   r   Útest_len_tol_validationó   s
    
ÿz"TestDIRECT.test_len_tol_validationc              	   C   s4   d}t jt|d�� t| j| j|d� W 5 Q R X d S )Nz vol_tol must be between 0 and 1.rq   )rN   rs   )r   rN   ru   r   r   r   Útest_vol_tol_validationú   s
    
ÿz"TestDIRECT.test_vol_tol_validationc              	   C   s6   d}t jt|d�� t| j| j|dd� W 5 Q R X d S )Nz#f_min_rtol must be between 0 and 1.rq   r   )rS   rV   rs   )r   rS   ru   r   r   r   Útest_fmin_rtol_validation  s    
 ÿz$TestDIRECT.test_fmin_rtol_validationr]   g      ø?Ústring)r   r(   c              	   C   s4   d}t jt|d�� t| j| j|d� W 5 Q R X d S )Nzmaxfun must be of type int.rq   ©r]   rs   )r   r]   ru   r   r   r   Útest_maxfun_wrong_type  s
    
ÿz!TestDIRECT.test_maxfun_wrong_typer   c              	   C   s4   d}t jt|d�� t| j| j|d� W 5 Q R X d S )Nzmaxiter must be of type int.rq   ©r   rs   )r   r   ru   r   r   r   Útest_maxiter_wrong_type  s
    
ÿz"TestDIRECT.test_maxiter_wrong_typec              	   C   s4   d}t jt|d�� t| j| jdd� W 5 Q R X d S )Nzmaxiter must be > 0.rq   rp   r|   rs   ©r   ru   r   r   r   Útest_negative_maxiter  s
    
ÿz TestDIRECT.test_negative_maxiterc              	   C   s4   d}t jt|d�� t| j| jdd� W 5 Q R X d S )Nzmaxfun must be > 0.rq   rp   rz   rs   r~   r   r   r   Útest_negative_maxfun  s
    
ÿzTestDIRECT.test_negative_maxfunrE   r[   r   c              	   C   s.   d}t jt|d�� t| j|ƒ W 5 Q R X d S )Nz5bounds must be a sequence or instance of Bounds classrq   ©rF   rG   rt   r   r,   ©r   rE   ru   r   r   r   Útest_invalid_bounds_type"  s    z#TestDIRECT.test_invalid_bounds_typerf   r   r   c              	   C   s.   d}t jt|d�� t| j|ƒ W 5 Q R X d S )Nz#Bounds are not consistent min < maxrq   r�   r‚   r   r   r   Útest_incorrect_bounds)  s    z TestDIRECT.test_incorrect_boundsc              	   C   sF   d}t tj dgdtjgƒ}tjt|d�� t| j|ƒ W 5 Q R X d S )NzBounds must not be inf.rp   r   rq   )r   r   r%   rF   rG   rt   r   r,   )r   ru   rE   r   r   r   Útest_inf_bounds3  s    zTestDIRECT.test_inf_boundsZbiasc              	   C   s4   d}t jt|d�� t| j| j|d� W 5 Q R X d S )Nz%locally_biased must be True or False.rq   r.   rs   )r   r-   ru   r   r   r   Útest_locally_biased_validation9  s
    
ÿz)TestDIRECT.test_locally_biased_validationN)*Ú__name__Ú
__module__Ú__qualname__r   r   r!   r$   r&   r,   rF   ÚmarkZparametrizer;   rB   rI   rJ   rP   rR   rW   rZ   r`   rc   rd   rj   rl   Zxslowrn   ro   rv   rw   rx   r{   r}   r   r€   rƒ   r   r   r#   r„   r…   r†   r   r   r   r   r      s~   	














ÿÿ
r   )Ú__doc__Znumpy.testingr   r   rF   Únumpyr   Zscipy.optimizer   r   r   r   r   r   r   Ú<module>   s
   