
    e!h3                     T    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      Zy)z.
Unit test for DIRECT optimization algorithm.
    )assert_allcloseassert_array_lessN)directBoundsc            	          e Zd Zd Zd Zd Zd Zd Zd Ze	j                  j                  ddd	g      d
        Ze	j                  j                  ddd	g      d        Ze	j                  j                  ddd	g      d        Ze	j                  j                  ddd	g      d        Ze	j                  j                  dddg      e	j                  j                  ddd	g      d               Ze	j                  j                  dddg      e	j                  j                  ddd	g      d               Ze	j                  j                  dg d      e	j                  j                  ddd	g      d               Zd Ze	j                  j                  ddd	g      d        Ze	j                  j                  ddd	g      d        Ze	j                  j                  ddd	g      d        Ze	j                  j                  ddd	g      d        Ze	j                  j                  ddd	g      e	j                  j                  dg d      d                Ze	j                  j2                  e	j                  j                  ddd	g      d!               Ze	j                  j                  ddd	g      d"        Ze	j                  j                  dd#d$g      d%        Ze	j                  j                  dd#d$g      d&        Ze	j                  j                  dd#d$g      d'        Ze	j                  j                  d(g d)      d*        Ze	j                  j                  d+g d)      d,        Z d- Z!d. Z"e	j                  j                  d/g d0      d1        Z#e	j                  j                  d/ e$d2d#gd3d4g       e$e%jL                   d#gd3e%jL                  g      g      d5        Z'd6 Z(e	j                  j                  dd7d8d8gd9g      d:        Z)y;)<
TestDIRECTc                     t        j                         | _        ddgz  | _        t	        j
                  d      | _        d| _        t        ddgddg      | _	        d| _
        y )N   )   r
           g      g      @  )	threadinglocal	fun_callsbounds_spherenpzerosoptimum_sphere_posoptimum_spherer   bounds_stylinski_tangmaxiter)selfs    h/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/optimize/tests/test_direct.pysetup_methodzTestDIRECT.setup_method   sT    "*y["$((5/!%+S#JR%A"    c                     t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        t        j                  |      j                         S )Ncr      )hasattrr   r   r   squaresumr   xs     r   spherezTestDIRECT.sphere   sH    t~~s+ DNNAyy|!!r   c                 v    t        j                  |      dk(  r
t               dt        j                  |      z  S Nr   r    )r   r#   ZeroDivisionErrorr$   s     r   invzTestDIRECT.inv   s,    66!9>#%%{r   c                 "    t         j                  S N)r   nanr$   s     r   nan_funzTestDIRECT.nan_fun"       vvr   c                 "    t         j                  S r,   )r   infr$   s     r   inf_funzTestDIRECT.inf_fun%   r/   r   c                 d    |\  }}d|dz  d|dz  z  z
  d|z  z   |dz  z   d|dz  z  z
  d|z  z   z  S )Ng      ?r
             )r   posr%   ys       r   styblinski_tangzTestDIRECT.styblinski_tang(   sO    1adR!Q$Y&Q.A5QT	AAEIJJr   locally_biasedTFc                 Z   t        | j                  | j                  |      }t        |j                  | j
                  dd       t        |j                  | j                  dd       t        j                  | j                        }t        |d d df   |j                         t        |j                  |d d df          |j                  dt        | j                        dz   z  k  sJ |j                  | j                  j                  k(  sJ |j                  | j                   k  sJ y )	Nr;   MbP?rtolatolh㈵>rA   r@   r   r    r   )r   r&   r   r   r%   r   funr   r   asarrayr   nfevlenr   r   nitr   )r   r;   res_boundss       r   test_directzTestDIRECT.test_direct,   s    T[[$"4"4$24 	t66!	.!4!44dK **T//0'!Q$-/#%%A/ xx43t'9'9#:Q#>????xx4>>+++++ ww$,,&&&r   c                    t        | j                  | j                  |      }d }t        | j                  | j                  ||      }t        |j                  |j                         |j
                  |j
                  k(  sJ |j                  |j                  k(  sJ |j                  |j                  k(  sJ |j                  |j                  k(  sJ |j                  |j                  k(  sJ t        |j                  |j                         |j                  |j                  k(  sJ t        |j                  | j                  dd       t        |j                  | j                  dd       y )Nr=   c                 P    d| z  } t        j                  |       }t        d       |S )Nr5   z+DIRECT minimization algorithm callback test)r   r"   print)r%   dummys     r   callbackz1TestDIRECT.test_direct_callback.<locals>.callbackJ   s&    !AIIaLE?@Lr   )r;   rP   r>   r?   rB   rC   )r   r&   r   r   r%   rH   rF   statussuccessrD   messager   r   )r   r;   rI   rP   res_callbacks        r   test_direct_callbackzTestDIRECT.test_direct_callbackD   s4    T[[$"4"4$24	 dkk4+=+=-;'/1 	|~~.ww,*****xx<,,,,,zz\00000{{l22222ww,*****|~~.{{l22222 	(?(?!	.(($*=*=!	.r   c                     ddgz  }t        j                  t              5  t        | j                  ||       d d d        y # 1 sw Y   y xY wNr
   )i
   )boundsr;   )pytestraisesr)   r   r*   r   r;   rY   s      r   test_exceptionzTestDIRECT.test_exceptiond   sB    I;]],- 	2488F"02	2 	2 	2s   AAc                 @    ddgz  }t        | j                  ||       y rW   )r   r.   r\   s      r   test_nanzTestDIRECT.test_nank   s     I;t||F,	.r   len_tolr>   -C6?c                     ddgz  }t        | j                  ||d|      }|j                  dk(  sJ |j                  sJ t	        |j
                  t        j                  d             d| }|j                  |k(  sJ y )Nr
   g      $      $@gKH9)rY   r`   vol_tolr;   r6   r   zjThe side length measure of the hyperrectangle containing the lowest function value found is below len_tol=	r   r&   rQ   rR   r   r%   r   r   rS   )r   r`   r;   rY   rI   rS   s         r   test_len_tolzTestDIRECT.test_len_tolq   s     K=T[[">CzzQ{{{rxx/%Y( {{g%%%r   re   ư>g:0yE>c                     ddgz  }t        | j                  ||d|      }|j                  dk(  sJ |j                  sJ t	        |j
                  t        j                  d             d| }|j                  |k(  sJ y )Nr
   rc   r   )rY   re   r`   r;   r   z]The volume of the hyperrectangle containing the lowest function value found is below vol_tol=rf   )r   re   r;   rY   rI   rS   s         r   test_vol_tolzTestDIRECT.test_vol_tol   s     K=T[[@zzQ{{{rxx/<<C9F{{g%%%r   
f_min_rtol)r>   rB   gHz>c                     d}ddgz  }t        | j                  ||||      }|j                  dk(  sJ |j                  sJ |j                  |d|z   z  k  sJ d| d}|j
                  |k(  sJ y )N      ?r
   )       rd   )rY   f_minrk   r;   r   z9The best function value found is within a relative error=z$ of the (known) global optimum f_min)r   r&   rQ   rR   rD   rS   )r   rk   r;   ro   rY   rI   rS   s          r   
test_f_minzTestDIRECT.test_f_min   s    
 J<T[[u *$24 zzQ{{{ww"z/2222&<'KM{{g%%%r   c                     t        j                  |d   |z
        t        j                  |d   |z
        j                         z   S r(   )r   r"   r#   )r   r%   abs       r   circle_with_argszTestDIRECT.circle_with_args   s8    yy1"RYYqtax%8%<%<%>>>r   c                     ddgz  }t        | j                  |dd|      }t        |j                  t	        j
                  ddg      d       y )	Nr5   )rn          @)r    r    i  )argsmaxfunr;   rm   rB   r@   )r   rt   r   r%   r   array)r   r;   rY   rI   s       r   test_f_circle_with_argsz"TestDIRECT.test_f_circle_with_args   sE    K=T**F$24rxxR1=r   c                     d}t        | j                  | j                  ||      }|j                  du sJ |j                  dk(  sJ |j
                  |k\  sJ d| }|j                  |k(  sJ y )Nd   )rx   r;   Fr    z:Number of function evaluations done is larger than maxfun=)r   r:   r   rR   rQ   rF   rS   )r   r;   rx   resultrS   s        r   test_failure_maxfunzTestDIRECT.test_failure_maxfun   s    
 ,,d.H.H%nF~~&&&}}!!!{{f$$$))/2~~(((r   c                     d}t        | j                  | j                  ||      }|j                  du sJ |j                  dk(  sJ |j
                  |k\  sJ d| }|j                  |k(  sJ y )NrX   )r   r;   Fr5   z,Number of iterations is larger than maxiter=)r   r:   r   rR   rQ   rH   rS   )r   r;   r   r~   rS   s        r   test_failure_maxiterzTestDIRECT.test_failure_maxiter   s}    
 ,,d.H.H 'H~~&&&}}!!!zzW$$$@	J~~(((r   c                 ,   g d}g d}t        j                  g d      }t        t        ||            }t	        ||      }t        | j                  ||      }t        | j                  ||      }|j                  |j                  k(  sJ |j                  |j                  k(  sJ |j                  |j                  k(  sJ |j                  |j                  k(  sJ t        |j                  |j                         t        |j                  |d       y )N)g      rm         )      g      @      @)r   rm   r   r=   g{Gz?ry   )r   rz   listzipr   r   r&   rF   rS   rR   rH   r   r%   )	r   r;   lbubx_opt
bounds_old
bounds_newres_old_boundsres_new_boundss	            r   test_bounds_variantszTestDIRECT.test_bounds_variants   s     '#b"+&
B^
Z/=?Z/=? ""n&9&9999%%)?)????%%)?)????!!^%7%7777((.*:*:;((%d;r   eps)rB   ra   r>   c                     t        | j                  | j                  |d|      }|j                  dk(  sJ |j                  sJ y )Nrh   )r   re   r;   r
   )r   r:   r   rQ   rR   )r   r   r;   r~   s       r   test_epsilonzTestDIRECT.test_epsilon   sF     ,,d.H.H'57 }}!!!~~~r   c                 L    dgdz  }t        | j                  |dd|      }|J y )N)r   g      4@r}   i i@B )rx   r   r;   )r   r&   r   r;   rY   r~   s       r   test_no_segmentation_faultz%TestDIRECT.test_no_segmentation_fault   s6    
 #VH 'H!!!r   c                 H    dgdz  }t        | j                  ||      }|J y )N)r   r   r5   r=   )r   r2   r   s       r   test_inf_funzTestDIRECT.test_inf_fun   s0     qf'57!!!r   r5   c                     d}t        j                  t        |      5  t        | j                  | j
                  |       d d d        y # 1 sw Y   y xY w)Nz len_tol must be between 0 and 1.match)r`   rZ   r[   
ValueErrorr   r:   r   )r   r`   	error_msgs      r   test_len_tol_validationz"TestDIRECT.test_len_tol_validation   E    6	]]:Y7 	$4'')C)C"$	$ 	$ 	$   #A

Ac                     d}t        j                  t        |      5  t        | j                  | j
                  |       d d d        y # 1 sw Y   y xY w)Nz vol_tol must be between 0 and 1.r   )re   r   )r   re   r   s      r   test_vol_tol_validationz"TestDIRECT.test_vol_tol_validation   r   r   c                     d}t        j                  t        |      5  t        | j                  | j
                  |d       d d d        y # 1 sw Y   y xY w)Nz#f_min_rtol must be between 0 and 1.r   r   )rk   ro   r   )r   rk   r   s      r   test_fmin_rtol_validationz$TestDIRECT.test_fmin_rtol_validation  sG    9	]]:Y7 	44'')C)C(4	4 	4 	4s   $AArx   )g      ?string)r    r5   c                     d}t        j                  t        |      5  t        | j                  | j
                  |       d d d        y # 1 sw Y   y xY w)Nzmaxfun must be of type int.r   rx   r   )r   rx   r   s      r   test_maxfun_wrong_typez!TestDIRECT.test_maxfun_wrong_type  sE    1	]]:Y7 	"4'')C)C "	" 	" 	"r   r   c                     d}t        j                  t        |      5  t        | j                  | j
                  |       d d d        y # 1 sw Y   y xY w)Nzmaxiter must be of type int.r   r   r   )r   r   r   s      r   test_maxiter_wrong_typez"TestDIRECT.test_maxiter_wrong_type  sE    2	]]:Y7 	$4'')C)C"$	$ 	$ 	$r   c                     d}t        j                  t        |      5  t        | j                  | j
                  d       d d d        y # 1 sw Y   y xY w)Nzmaxiter must be > 0.r   r   r   r   r   r   s     r   test_negative_maxiterz TestDIRECT.test_negative_maxiter  sE    *	]]:Y7 	4'')C)C	 	 	r   c                     d}t        j                  t        |      5  t        | j                  | j
                  d       d d d        y # 1 sw Y   y xY w)Nzmaxfun must be > 0.r   r   r   r   r   s     r   test_negative_maxfunzTestDIRECT.test_negative_maxfun  sE    )	]]:Y7 	4'')C)C	 	 	r   rY   )rY   rv   r   c                     d}t        j                  t        |      5  t        | j                  |       d d d        y # 1 sw Y   y xY w)Nz5bounds must be a sequence or instance of Bounds classr   rZ   r[   r   r   r:   r   rY   r   s      r   test_invalid_bounds_typez#TestDIRECT.test_invalid_bounds_type%  s<    0	]]:Y7 	14''0	1 	1 	1	   >Ar   r   r    c                     d}t        j                  t        |      5  t        | j                  |       d d d        y # 1 sw Y   y xY w)Nz#Bounds are not consistent min < maxr   r   r   s      r   test_incorrect_boundsz TestDIRECT.test_incorrect_bounds,  s<     :	]]:Y7 	14''0	1 	1 	1r   c                     d}t        t        j                   dgdt        j                  g      }t        j                  t
        |      5  t        | j                  |       d d d        y # 1 sw Y   y xY w)NzBounds must not be inf.r   r   r   )r   r   r1   rZ   r[   r   r   r:   )r   r   rY   s      r   test_inf_boundszTestDIRECT.test_inf_bounds6  sX    -	"&&"BFF|4]]:Y7 	14''0	1 	1 	1s   A++A4biasr   rv   c                     d}t        j                  t        |      5  t        | j                  | j
                  |       d d d        y # 1 sw Y   y xY w)Nz%locally_biased must be True or False.r   r=   r   )r   r;   r   s      r   test_locally_biased_validationz)TestDIRECT.test_locally_biased_validation<  sE    ;	]]:Y7 	24'')C)C"02	2 	2 	2r   N)*__name__
__module____qualname__r   r&   r*   r.   r2   r:   rZ   markparametrizerK   rU   r]   r_   rg   rj   rp   rt   r{   r   r   r   r   xslowr   r   r   r   r   r   r   r   r   r   r   r   r-   r   r   r   r7   r   r   r   r      sz   "
K [[-e}=' >'. [[-e}=. >.> [[-e}=2 >2 [[-e}=. >.
 [[Yt5[[-e}=
& > 6
& [[Yt5[[-e}=	& > 6	& [[\+=>[[-e}=& > ?&? [[-e}=> >> [[-e}=) >) [[-e}=) >) [[-e}=< ><* [[-e}=[[U$67 8 > [[[[-e}=" > " [[-e}=" >" [[YQ0$ 1$ [[YQ0$ 1$ [[\B734 44 [[X'>?" @" [[Y(?@$ A$ [[X'891 :1 [[X$c2YQ8$rvvgr]RLA 
1
1
1 [[-A/CD2 E2r   r   )__doc__numpy.testingr   r   rZ   numpyr   scipy.optimizer   r   r   r   r7   r   r   <module>r      s'   .   ) u2 u2r   