o
    Ö­jÓ3  ã                   @   sN   d Z ddlmZmZ ddlZddlZddlmZm	Z	 ddl
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"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
 d0g d1¢¡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@g dA¢¡dBdC„ ƒZe	j
 dDg dA¢¡dEdF„ ƒZ dGdH„ Z!dIdJ„ Z"e	j
 dKg dL¢¡dMdN„ ƒZ#e	j
 dKe$dOd8gdPdQgƒe$e%j& d8gdPe%j&gƒg¡dRdS„ ƒZ'dTdU„ Z(e	j
 ddVdWdWgdXg¡dYdZ„ ƒZ)d[S )\Ú
TestDIRECTc                 C   sF   t  ¡ | _ddg | _t d¡| _d| _tddgddgƒ| _	d| _
d S )Né   )éþÿÿÿé   ©r   ç        g      Àg      @éè  )Ú	threadingÚlocalÚ	fun_callsÚbounds_sphereÚnpÚzerosÚoptimum_sphere_posÚoptimum_spherer   Úbounds_stylinski_tangÚmaxiter)Úself© r   ú]/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_direct.pyÚsetup_method   s   

zTestDIRECT.setup_methodc                 C   s2   t | jdƒs
d| j_| j jd7  _t |¡ ¡ S )NÚcr   é   )Úhasattrr   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jksRJ ‚|j| jksZJ ‚d S )	N©r3   çü©ñÒMbP?©ÚrtolÚatolçñhãˆµøä>©r8   r7   r   r   r   )r   r"   r   r   r!   r   Úfunr   r   Úasarrayr   ÚnfevÚlenr   r   Únitr   )r   r3   Ú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 )	Nr4   c                 S   s   d|  } t  | ¡}tdƒ |S )Nr.   z+DIRECT minimization algorithm callback test)r   r   Úprint)r!   Údummyr   r   r   ÚcallbackJ   s   
z1TestDIRECT.test_direct_callback.<locals>.callback)r3   rE   r5   r6   r9   r:   )r   r"   r   r   r!   r?   r=   ÚstatusÚsuccessr;   Úmessager   r   )r   r3   r@   rE   Úres_callbackr   r   r   Útest_direct_callbackD   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öÿÿÿé
   )Úboundsr3   )ÚpytestÚraisesr$   r   r%   ©r   r3   rM   r   r   r   Útest_exceptiond   s   
ÿ"ÿzTestDIRECT.test_exceptionc                 C   s   ddg }t | j||d� d S rK   )r   r)   rP   r   r   r   Útest_nank   s   

ÿzTestDIRECT.test_nanÚlen_tolr5   ç-Cëâ6?c                 C   sd   ddg }t | j||d|d�}|jdksJ ‚|jsJ ‚t|jt d¡ƒ d|› �}|j|ks0J ‚d S )Nr   ©g      $Àç      $@g ÂëþKH´9)rM   rS   Úvol_tolr3   r/   r
   zjThe side length measure of the hyperrectangle containing the lowest function value found is below len_tol=©	r   r"   rF   rG   r   r!   r   r   rH   )r   rS   r3   rM   r@   rH   r   r   r   Útest_len_tolq   s   

ÿ
þzTestDIRECT.test_len_tolrW   ç�íµ ÷Æ°>g:Œ0âŽyE>c                 C   sd   ddg }t | j||d|d�}|jdksJ ‚|jsJ ‚t|jt d¡ƒ d|› �}|j|ks0J ‚d S )Nr   rU   r   )rM   rW   rS   r3   r
   z]The volume of the hyperrectangle containing the lowest function value found is below vol_tol=rX   )r   rW   r3   rM   r@   rH   r   r   r   Útest_vol_tol   s   

ÿ
ÿzTestDIRECT.test_vol_tolÚ
f_min_rtol)r5   r9   gH¯¼šò×z>c                 C   sn   d}ddg }t | j||||d�}|jdksJ ‚|jsJ ‚|j|d|  k s(J ‚d|› d�}|j|ks5J ‚d S )Nç      ð?r   )ç       ÀrV   )rM   Úf_minr\   r3   r	   z9The best function value found is within a relative error=z$ of the (known) global optimum f_min)r   r"   rF   rG   r;   rH   )r   r\   r3   r_   rM   r@   rH   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.   )r^   ç       @)r   r   iâ  )ÚargsÚmaxfunr3   r]   r9   ©r7   )r   rc   r   r!   r   Úarray)r   r3   rM   r@   r   r   r   Útest_f_circle_with_args    s
   
ÿz"TestDIRECT.test_f_circle_with_argsc                 C   ó^   d}t | j| j||d�}|jdu sJ ‚|jdksJ ‚|j|ks!J ‚d|› �}|j|ks-J ‚d S )Néd   )rf   r3   Fr   z:Number of function evaluations done is larger than maxfun=)r   r2   r   rG   rF   r=   rH   )r   r3   rf   ÚresultrH   r   r   r   Útest_failure_maxfun¨   s   
ÿÿzTestDIRECT.test_failure_maxfunc                 C   rj   )NrL   )r   r3   Fr.   z,Number of iterations is larger than maxiter=)r   r2   r   rG   rF   r?   rH   )r   r3   r   rl   rH   r   r   r   Útest_failure_maxiter·   s   
ÿ
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      Àr]   ç      À)ç      ð¿g      @ç      @)rp   r]   r   r4   g{®Gáz„?rg   )r   rh   ÚlistÚzipr   r   r"   r=   rH   rG   r?   r   r!   )	r   r3   Ú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)r9   rT   r5   c                 C   s2   t | j| j|d|d�}|jdksJ ‚|jsJ ‚d S )NrZ   )r|   rW   r3   r   )r   r2   r   rF   rG   )r   r|   r3   rl   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)ro   g      4@rk   i€–˜ i@B )rf   r   r3   )r   r"   ©r   r3   rM   rl   r   r   r   Útest_no_segmentation_faultä   s
   

ÿz%TestDIRECT.test_no_segmentation_faultc                 C   s*   dgd }t | j||d�}|d usJ ‚d S )N)ro   rq   r.   r4   )r   r,   r~   r   r   r   Útest_inf_funî   s
   
ÿzTestDIRECT.test_inf_funéÿÿÿÿr.   c                 C   óJ   d}t jt|d�� t| j| j|d� W d   ƒ d S 1 sw   Y  d S )Nz len_tol must be between 0 and 1.©Úmatch)rS   ©rN   rO   Ú
ValueErrorr   r2   r   )r   rS   Ú	error_msgr   r   r   Útest_len_tol_validationö   ó   
ÿ"ÿz"TestDIRECT.test_len_tol_validationc                 C   r‚   )Nz vol_tol must be between 0 and 1.rƒ   )rW   r…   )r   rW   r‡   r   r   r   Útest_vol_tol_validationý   r‰   z"TestDIRECT.test_vol_tol_validationc                 C   sL   d}t jt|d�� t| j| j|dd� W d   ƒ d S 1 sw   Y  d S )Nz#f_min_rtol must be between 0 and 1.rƒ   r   )r\   r_   r…   )r   r\   r‡   r   r   r   Útest_fmin_rtol_validation  s   
ÿ"ÿz$TestDIRECT.test_fmin_rtol_validationrf   )g      ø?Ústring)r   r.   c                 C   r‚   )Nzmaxfun must be of type int.rƒ   ©rf   r…   )r   rf   r‡   r   r   r   Útest_maxfun_wrong_type  r‰   z!TestDIRECT.test_maxfun_wrong_typer   c                 C   r‚   )Nzmaxiter must be of type int.rƒ   ©r   r…   )r   r   r‡   r   r   r   Útest_maxiter_wrong_type  r‰   z"TestDIRECT.test_maxiter_wrong_typec                 C   óJ   d}t jt|d�� t| j| jdd� W d   ƒ d S 1 sw   Y  d S )Nzmaxiter must be > 0.rƒ   r�   r�   r…   ©r   r‡   r   r   r   Útest_negative_maxiter  ó   
ÿ"ÿz TestDIRECT.test_negative_maxiterc                 C   r‘   )Nzmaxfun must be > 0.rƒ   r�   r�   r…   r’   r   r   r   Útest_negative_maxfun  r”   zTestDIRECT.test_negative_maxfunrM   )rM   rd   r   c                 C   óD   d}t jt|d�� t| j|ƒ W d   ƒ d S 1 sw   Y  d S )Nz5bounds must be a sequence or instance of Bounds classrƒ   ©rN   rO   r†   r   r2   ©r   rM   r‡   r   r   r   Útest_invalid_bounds_type%  s   "ÿz#TestDIRECT.test_invalid_bounds_typerp   r   r   c                 C   r–   )Nz#Bounds are not consistent min < maxrƒ   r—   r˜   r   r   r   Útest_incorrect_bounds,  s   "ÿz TestDIRECT.test_incorrect_boundsc                 C   s\   d}t tj dgdtjgƒ}tjt|d�� t| j|ƒ W d   ƒ d S 1 s'w   Y  d S )NzBounds must not be inf.r�   r   rƒ   )r   r   r+   rN   rO   r†   r   r2   )r   r‡   rM   r   r   r   Útest_inf_bounds6  s
   "ÿzTestDIRECT.test_inf_boundsÚbiasr   rd   c                 C   r‚   )Nz%locally_biased must be True or False.rƒ   r4   r…   )r   r3   r‡   r   r   r   Útest_locally_biased_validation<  r‰   z)TestDIRECT.test_locally_biased_validationN)*Ú__name__Ú
__module__Ú__qualname__r   r"   r%   r)   r,   r2   rN   ÚmarkÚparametrizerB   rJ   rQ   rR   rY   r[   r`   rc   ri   rm   rn   r{   r}   Úxslowr   r€   rˆ   rŠ   r‹   rŽ   r�   r“   r•   r™   r   r   r(   rš   r›   r�   r   r   r   r   r      s€    	














ÿÿ
r   )Ú__doc__Únumpy.testingr   r   rN   Únumpyr   Úscipy.optimizer   r   r   r   r   r   r   r   Ú<module>   s    