
    e!h,                         d Z ddlmZmZmZmZmZ ddlmc m	Z
 ddlmZ ddlZddlZddlZddZddZd Zd Zdd	Z G d
 d      Zy)z 
Tests for line search routines
    )assert_equalassert_array_almost_equalassert_array_almost_equal_nulpassert_warnssuppress_warningsN)LineSearchWarningc                      ||       } |d      } |d      } ||       }	d|  d| d| d| d|	 d| }
|||| z  |z  z   k  s
J d|
z          t        |	      t        ||z        k  s
J d	|
z          y
)z2
    Check that strong Wolfe conditions apply
    r   s = ; phi(0) = ; phi(s) = z; phi'(0) = z; phi'(s) = ; zWolfe 1 failed: zWolfe 2 failed: N)abs)sphiderphic1c2err_msgphi1phi0derphi0derphi1msgs              l/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/optimize/tests/test_linesearch.pyassert_wolfer      s     q6Dq6DQiGQiG!Kv[l7) L 	G9.C 4"Q$w,&&@(:S(@@&w<3r'z?*D,>,DD*    c                 j     ||       } |d      }d|  d| d| d| }|d|| z  z
  |z  k  sJ |       y)z-
    Check that Armijo condition applies
    r   r
   r   r   r      N )r   r   r   r   r   r   r   s          r   assert_armijor       sS     q6Dq6D;tfKvRy
ACA1Hd?"'C'"r   c                 >     t        |f fd fdd| y )Nc                       | z  z         S Nr   spfpxs    r   <lambda>z#assert_line_wolfe.<locals>.<lambda>(   s    1Q2X; r   c                 H    t        j                   | z  z               S r#   npdot)r%   fprimer'   r(   s    r   r)   z#assert_line_wolfe.<locals>.<lambda>)   s    266&QrT*:A#> r   )r   r   )r   )r(   r'   r   r&   r.   kws   `` `` r   assert_line_wolfer0   '   s#     F.>FBDFr   c                 0     t        |fd fdi| y )Nr   c                       | z  z         S r#   r   r$   s    r   r)   z$assert_line_armijo.<locals>.<lambda>-   s    Aa!B$hK r   )r    )r(   r'   r   r&   r/   s   `` ` r   assert_line_armijor3   ,   s    !6/626r   c                 d    	 t        | ||       y# t        $ r}t        | d|       |d}~ww xY w)zEAssert two arrays are equal, up to some floating-point rounding error
N)r   AssertionError)r(   yr   nulpes        r   assert_fp_equalr:   0   s;    7&q!T2 7s"WI./Q67s    	/*/c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zej&                  j(                  d        Zd Zd Zd Zy)TestLineSearchc                     t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        | |dz  z
  |dz  z   }dd|dz  z  z
  d|dz  z  z   }||fS )Ncr   r            )hasattrfcountr>   selfr   r'   dps       r   _scalar_func_1zTestLineSearch._scalar_func_1:   sl    t{{C(DKKMBAI1!AqD&[1QT6!"ur   c                    t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        t        j                  d|z        |dz  z   }dt        j                  d|z        z  d|z  z   }||fS )Nr>   r   r   rB   )rC   rD   r>   r,   exprE   s       r   _scalar_func_2zTestLineSearch._scalar_func_2B   sn    t{{C(DKKMFF2a4L1a4r!t_qs""ur   c                     t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        t        j                  d|z         }dt        j
                  d|z        z  }||fS )Nr>   r   r   
   i)rC   rD   r>   r,   sincosrE   s       r   _scalar_func_3zTestLineSearch._scalar_func_3J   s_    t{{C(DKKMVVBqD\M1"ur   c                     t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        t        j                  ||      }d|z  }||fS )Nr>   r   r   rB   )rC   rD   r>   r,   r-   rF   r(   r&   dfs       r   _line_func_1zTestLineSearch._line_func_1T   sN    t{{C(DKKMFF1aLqS"ur   c                 r   t        | j                  d      sd| j                  _        | j                  xj                  dz  c_        t        j                  |t        j                  | j
                  |            dz   }t        j                  | j
                  | j
                  j                  z   |      }||fS )Nr>   r   r   )rC   rD   r>   r,   r-   ATrS   s       r   _line_func_2zTestLineSearch._line_func_2\   s{    t{{C(DKKMFF1bffTVVQ'(1,VVDFFTVVXX%q)"ur   c           	      p   g | _         g | _        d| _        t        j                         | _        d }t        t        |             D ]  }|j                  d      r9t        | |      }| j                   j                  | ||d       ||d      f       M|j                  d      s_t        | |      }| j                  j                  | ||d       ||d      f        t        j                  j                  d       t        j                  j                  | j                  | j                        | _        y )N   c                       fdS )Nc                       | i |   S r#   r   )ar/   funcidxs     r   r)   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>n   s    D!NrN3$7 r   r   )r_   r`   s   ``r   
bind_indexz/TestLineSearch.setup_method.<locals>.bind_indexl   s	    77r   _scalar_func_r   r   _line_func_  )scalar_funcs
line_funcsN	threadinglocalrD   sorteddir
startswithgetattrappendr,   randomseedrandnrW   )rF   ra   namevalues       r   setup_methodzTestLineSearch.setup_methodf   s    oo'	8 3t9% 	HD/d+!!((:eQ/E11EFH/d+&&:eQ/E11EFH	H 			t0r   c              #      K   | j                   D ]2  \  }}}t        j                  j                  d      D ]
  }||||f  4 y w)Nr?   )re   r,   ro   rq   )rF   rr   r   r   old_phi0s        r   scalar_iterzTestLineSearch.scalar_iter}   sM     !%!2!2 	2D#vIIOOA. 2C112	2s   AAc              #     K   t         j                  j                  d      }| j                  D ]  \  }}}d}|dk  s|j	                  | j
                        }|j	                  | j
                        }t        j                  | ||            dk\  r\|dz  }t        |j	                               }||||||f |dk  r y w)Nrd   r   	   r   )r,   ro   RandomStaterf   rq   rg   r-   float)	rF   rngrr   r&   r.   kr(   r'   old_fvs	            r   	line_iterzTestLineSearch.line_iter   s     ii##D)# 
	4OD!VAa%IIdff%IIdff%66!VAY'1,Qsyy{+Avq!V33 a%
	4s   :CBCCc           
         d}| j                         D ]j  \  }}}}|dz  }t        j                  || |d      | |d            \  }}}t        | |d      |       t        | ||      |       t	        ||||       l |dkD  sJ y )Nr   r   r   r?   )rw   lsscalar_search_wolfe1r:   r   )	rF   r>   rr   r   r   rv   r   r   r   s	            r   test_scalar_search_wolfe1z(TestLineSearch.test_scalar_search_wolfe1   s    +/+;+;+= 	7'D#vxFA33CQ4<fQiIMAtTD#a&$/D#a&$/C6	7 1uur   c           
      ,   | j                         D ]  \  }}}}t        j                  || |d      | |d            \  }}}}t        | |d      |       t        | ||      |       |t        | ||      |       t	        |||| d|d        y Nr    gr   )rw   r   scalar_search_wolfe2r:   r   )	rF   rr   r   r   rv   r   r   r   r   s	            r   test_scalar_search_wolfe2z(TestLineSearch.test_scalar_search_wolfe2   s    +/+;+;+= 	I'D#vx%'%<%<VSVXvay&:"AtT7D#a&$/D#a&$/"D9CD68A,1GH	Ir   c                 Z    d }d }t        j                  ||d      \  }}}}|J |J y )Nc                     | dz
  dz  S )N   rB   r   alphas    r   r   zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     d| dz
  z  S )NrB   r   r   r   s    r   r   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxr   r   )rF   r   r   
alpha_star_derphi_stars         r   'test_scalar_search_wolfe2_with_low_amaxz6TestLineSearch.test_scalar_search_wolfe2_with_low_amax   sD    	$	# )+(?(?VRW(X%
Aq+!!!"""r   c                 T    d }d }t        j                  ||      \  }}}}|dk  sJ y )Nc                     | dk  rdt         j                  z  dz  | dz
  z  S t        j                  dt         j                  z  dz  | z  t         j                  z
        S Nr   rB   r?   )r,   pirP   r   s    r   r   z@TestLineSearch.test_scalar_search_wolfe2_regression.<locals>.phi   sM    qy255y{eai00vvagai%/"%%788r   c                     | dk  rdt         j                  z  dz  S dt         j                  z  dz  t        j                  dt         j                  z  dz  | z  t         j                  z
        z  S r   )r,   r   rO   r   s    r   r   zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sU    qy255y{"255y{RVVAbeeGAI,=,E%FFFr   g      ?r   )rF   r   r   r   r   s        r   $test_scalar_search_wolfe2_regressionz3TestLineSearch.test_scalar_search_wolfe2_regression   s6    	9	G ,,S&9
1a 3wwr   c           	          | j                         D ]T  \  }}}}t        j                  | |d       |d            \  }}t        | ||      |       t	        ||| d|d       V y r   )rw   r   scalar_search_armijor:   r    )rF   rr   r   r   rv   r   r   s          r   test_scalar_search_armijoz(TestLineSearch.test_scalar_search_armijo   sn    +/+;+;+= 	B'D#vx--c3q66!9EGAtD#a&$/!STF!HQ<*@A	Br   c                    d}d}| j                         D ]  \  }}}}}} ||      }	 ||      }
d| j                  _        t        j                  |||||
|	||      \  }}}}}}t        | j                  j                  ||z          t        | ||             |t        | ||||z  z                t        | ||||z  z         d       ||k  s|dz  }t        ||||||        |dkD  sJ y )	Nr   d   r      decimalr   r   r?   )	r   rD   r>   r   line_search_wolfe1r   r:   r   r0   )rF   r>   smaxrr   r&   r.   r(   r'   old_ff0g0r   fcgcfvofvgvs                    r   test_line_search_wolfe1z&TestLineSearch.test_line_search_wolfe1   s	   ,0NN,< 	D(D!VQ51BBDKKM%'%:%:1fa;=r5@D&F"Ar2r3 2.C1&yB!ac'
+%b&QqS/2F4xQ!!Q1fdC	D" 1uur   c                    d}d}| j                         D ]  \  }}}}}} ||      }	 ||      }
d| j                  _        t               5 }|j	                  t
        d       |j	                  t
        d       t        j                  |||||
|	||      \  }}}}}}d d d        t        | j                  j                  z          t         ||             t         |||z  z                t        | ||||z  z         d       ||k  s|dz  }t        ||||||	        |d
kD  sJ y # 1 sw Y   xY w)Nr   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   r   r?   )r   rD   r>   r   filterr   r   line_search_wolfe2r   r:   r   r0   )rF   r>   r   rr   r&   r.   r(   r'   r   r   r   supr   r   r   r   r   r   s                     r   test_line_search_wolfe2z&TestLineSearch.test_line_search_wolfe2   sM   ,0NN,< 	D(D!VQ51BBDKKM"$ J

,PR

,GI)+)>)>q&!Q?A2uDH*J&2r2sBJ 2.C1&B!ac'
+~)"fQ1WorJ4xQ!!Q1fdC'	D( 1uu!J Js   AD44D=	c           
      X   d }d }t        j                  ddg      }d|z  }d}t        j                  ||||d|      \  }}}}}}t	        |||||       t        t        t        j                  ||||d	|      \  }}}}}}|J t        t        t        j                  |||||d
       y )Nc                 .    t        j                  | |       S r#   r+   r(   s    r   r&   z8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.f  s    66!Q<r   c                     d| z  S )NrB   r   r   s    r   fpz9TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fp  s    q5Lr   r   r   ig      ?   )r   r      r   )r   maxiter)r,   arrayr   r   r0   r   r   )rF   r&   r   r'   r(   r   r   r   s           r   test_line_search_wolfe2_boundsz-TestLineSearch.test_line_search_wolfe2_bounds   s    	 	HHaV !G00B12"M1aAq!Q1b)'(9(*(=(=q"a-/B81aAq yy 	&(=(=q"aA	'r   c           	      d   d}| j                         D ]  \  }}}}}} ||      } ||      }	d| j                  _        t        j                  ||||	|      \  }
}}|dz  }t        | j                  j                  |       t        | |||
|z  z                t        |||
||        |dk\  sJ y )Nr   r   r   ry   )r   rD   r>   r   line_search_armijor   r:   r3   )rF   r>   rr   r&   r.   r(   r'   r   r   r   r   r   r   s                r   test_line_search_armijoz&TestLineSearch.test_line_search_armijo  s    ,0NN,< 	9(D!VQ51BBDKKM--aAr2>IAr2FA+B!ac'
+q!Q48	9 Avvr   c                     dgfd}t        j                  | |d      dd      \  }}t        |d       t        d   d       t        ||       y )Nr   c                 6    dxx   dz  cc<   |  d| dz  z  z   S )Nr   r   g{Gz?rB   r   r   counts    r   r   z3TestLineSearch.test_armijo_terminate_1.<locals>.phi/  $    !HMH2QT	>!r   rA   r   )alpha0rB   )r   r   r   r    )rF   r   r   r   r   s       @r   test_armijo_terminate_1z&TestLineSearch.test_armijo_terminate_1*  sS     	" ))#s1vr!D4QU1Xq!ar   c           
         fd}fd}t         j                  t         j                  fD ]W  }dg ||| |d      d  |d            }|d   	J ||f       d   dk  s	J |f       t        |d   ||t	        |             Y y )Nc                 6    dxx   dz  cc<   |  d| dz  z  z   S )Nr   r   g?rB   r   r   s    r   r   z0TestLineSearch.test_wolfe_terminate.<locals>.phi;  r   r   c                 .    dxx   dz  cc<   dd| z  z   S )Nr   r   rA   g?r   r   s    r   r   z3TestLineSearch.test_wolfe_terminate.<locals>.derphi?  s    !HMHq= r   r   r@   r   )r   r   r   r   str)rF   r   r   r_   rr   s        @r   test_wolfe_terminatez#TestLineSearch.test_wolfe_terminate7  s    	"	! ,,b.E.EF 	?DCES&#a&$q	:AQ4#.aY.#8u$3udm3$1sFCI>	?r   N)__name__
__module____qualname__rH   rL   rQ   rU   rY   rt   rw   r   r   r   r   r   r   r   r   pytestmarkthread_unsafer   r   r   r   r   r   r   r<   r<   8   s|    1.2
4 
I	#(B,2 [[' '8?r   r<   )-C6?g? )r   r   )r   2   )__doc__numpy.testingr   r   r   r   r   scipy.optimize._linesearchoptimize_linesearchr   r   numpyr,   r   rh   r   r    r0   r3   r:   r<   r   r   r   <module>r      sO   . . ( ' 8   E(F
77P? P?r   