
    (ph,                         S r SSKJrJrJrJrJr  SSKJs  J	r
  SSKJr  SSKrSSKrSSKrSS jrSS jrS rS rSS	 jr " S
 S5      rg)z 
Tests for line search routines
    )assert_equalassert_array_almost_equalassert_array_almost_equal_nulpassert_warnssuppress_warningsN)LineSearchWarningc                     U" U 5      nU" S5      nU" S5      nU" U 5      n	SU  SU SU SU SU	 SU 3n
XgX0-  U-  -   ::  d
   SU
-   5       e[        U	5      [        XH-  5      ::  d
   S	U
-   5       eg
)z*
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              W/var/www/html/venv/lib/python3.13/site-packages/scipy/optimize/tests/test_linesearch.pyassert_wolfer      s     q6Dq6DQiGQiG!Kv[l7) L 	G9.C "$w,&&@(:S(@@&w<3rz?*D,>,DD*    c                 j    U" U 5      nU" S5      nSU  SU SU SU 3nUSX -  -
  U-  ::  d   U5       eg)z%
Check that Armijo condition applies
r   r
   r   r   r      N )r   r   r   r   r   r   r   s          r   assert_armijor       sQ     q6Dq6D;tfKvRy
ACAHd?"'C'"r   c                 B   ^ ^^^ [        U4UUU 4S jUUU 4S jS.UD6  g )Nc                     > T" TTU -  -   5      $ Nr   spfpxs    r   <lambda>#assert_line_wolfe.<locals>.<lambda>(   s    1Q2X;r   c                 J   > [         R                  " T" TTU -  -   5      T5      $ r#   npdot)r%   fprimer'   r(   s    r   r)   r*   )   s    266&QrT*:A#>r   )r   r   )r   )r(   r'   r   r&   r/   kws   `` `` r   assert_line_wolfer1   '   s#     F.>FBDFr   c                 2   ^ ^^ [        U4SUUU 4S j0UD6  g )Nr   c                     > T" TTU -  -   5      $ r#   r   r$   s    r   r)   $assert_line_armijo.<locals>.<lambda>-   s    Aa!B$hKr   )r    )r(   r'   r   r&   r0   s   `` ` r   assert_line_armijor5   ,   s    !6/626r   c                 d     [        XU5        g! [         a  n[        U SU 35      UeSnAff = f)zEAssert two arrays are equal, up to some floating-point rounding error
N)r   AssertionError)r(   yr   nulpes        r   assert_fp_equalr<   0   s9    7&qT2 7s"WI./Q67s    
/*/c                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS r\R(                  R*                  S 5       rS rS rS rSrg)TestLineSearch8   c                     [        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        U* US-  -
  US-  -   nSSUS-  -  -
  SUS-  -  -   nX#4$ )Ncr   r            )hasattrfcountrA   selfr   r'   dps       r   _scalar_func_1TestLineSearch._scalar_func_1:   sm    t{{C((DKKMBAI1!AqD&[1QT6!ur   c                     [        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        [        R                  " SU-  5      US-  -   nS[        R                  " SU-  5      -  SU-  -   nX#4$ )NrA   r   r   rE   )rF   rG   rA   r-   exprH   s       r   _scalar_func_2TestLineSearch._scalar_func_2B   so    t{{C((DKKMFF2a4L1a4r!t_qs"ur   c                 
   [        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        [        R                  " SU-  5      * nS[        R
                  " SU-  5      -  nX#4$ )NrA   r   r   
   i)rF   rG   rA   r-   sincosrH   s       r   _scalar_func_3TestLineSearch._scalar_func_3J   s`    t{{C((DKKMVVBqD\M1ur   c                     [        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        [        R                  " X5      nSU-  nX#4$ )NrA   r   r   rE   )rF   rG   rA   r-   r.   rI   r(   r&   dfs       r   _line_func_1TestLineSearch._line_func_1T   sM    t{{C((DKKMFF1LqSur   c                    [        U R                  S5      (       d  SU R                  l        U R                  =R                  S-  sl        [        R                  " U[        R                  " U R
                  U5      5      S-   n[        R                  " U R
                  U R
                  R                  -   U5      nX#4$ )NrA   r   r   )rF   rG   rA   r-   r.   ATrY   s       r   _line_func_2TestLineSearch._line_func_2\   s|    t{{C((DKKMFF1bffTVVQ'(1,VVDFFTVVXX%q)ur   c           	         / U l         / U l        SU l        [        R                  " 5       U l        S n[        [        U 5      5       H  nUR                  S5      (       a8  [        X5      nU R                   R                  X!" US5      U" US5      45        MQ  UR                  S5      (       d  Mi  [        X5      nU R                  R                  X!" US5      U" US5      45        M     [        R                  R                  S5        [        R                  R                  U R                  U R                  5      U l        g )N   c                    ^ ^ U U4S j$ )Nc                     > T" U 0 UD6T   $ r#   r   )ar0   funcidxs     r   r)   ATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>n   s    D!NrN3$7r   r   )rg   rh   s   ``r   
bind_index/TestLineSearch.setup_method.<locals>.bind_indexl   s	    77r   _scalar_func_r   r   _line_func_  )scalar_funcs
line_funcsN	threadinglocalrG   sorteddir
startswithgetattrappendr-   randomseedrandnr^   )rI   rj   namevalues       r   setup_methodTestLineSearch.setup_methodf   s    oo'	8 3t9%D//+!!((:eQ/E11EFH//+&&:eQ/E11EFH & 			t0r   c              #      #    U R                    H2  u  pn[        R                  R                  S5       H	  nXX44v   M     M4     g 7f)NrB   )ro   r-   ry   r{   )rI   r|   r   r   old_phi0s        r   scalar_iterTestLineSearch.scalar_iter}   s<     !%!2!2DvIIOOA.11 / "3s   AAc              #     #    [         R                  R                  S5      nU R                   H  u  p#nSnUS:  d  M  UR	                  U R
                  5      nUR	                  U R
                  5      n[         R                  " Xt" U5      5      S:  a  M`  US-  n[        UR	                  5       5      nX#XFXx4v   US:  a  M  M     g 7f)Nrn   r   	   r   )r-   ry   RandomStaterp   r{   rq   r.   float)	rI   rngr|   r&   r/   kr(   r'   old_fvs	            r   	line_iterTestLineSearch.line_iter   s     ii##D)#ODVAa%IIdff%IIdff%66!VAY'1,Qsyy{+v!33 a%  /s   8CBCCc           
          SnU R                  5        H`  u  p#pEUS-  n[        R                  " X4U" S5      XT" S5      5      u  pgn[        X" S5      U5        [        Xs" U5      U5        [	        XcXBS9  Mb     US:  d   eg )Nr   r   r   rB   )r   lsscalar_search_wolfe1r<   r   )	rI   rA   r|   r   r   r   r   r   r   s	            r   test_scalar_search_wolfe1(TestLineSearch.test_scalar_search_wolfe1   s    +/+;+;+='DvFA33CQ4<fQiIMATD#a&$/D#a&$/6 ,> 1uur   c           
         U R                  5        Hv  u  pp4[        R                  " X#U" S5      XC" S5      5      u  pVpx[        Xr" S5      U5        [        Xb" U5      U5        Ub  [        X" U5      U5        [	        XRX1 SUS 3S9  Mx     g Nr    gr   )r   r   scalar_search_wolfe2r<   r   )	rI   r|   r   r   r   r   r   r   r   s	            r   test_scalar_search_wolfe2(TestLineSearch.test_scalar_search_wolfe2   s    +/+;+;+='Dv%'%<%<SVXvay&:"ATD#a&$/D#a&$/"D968A,1GH ,>r   c                 V    S nS n[         R                  " XSS9u  n  pEUb   eUb   eg )Nc                     U S-
  S-  $ )N   rE   r   alphas    r   r   CTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     SU S-
  -  $ )NrE   r   r   r   s    r   r   FTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxr   r   )rI   r   r   
alpha_star_derphi_stars         r   'test_scalar_search_wolfe2_with_low_amax6TestLineSearch.test_scalar_search_wolfe2_with_low_amax   s@    	$	# )+(?(?RW(X%
Aq!!!"""r   c                 V    S nS n[         R                  " X5      u  n    nUS:  d   eg )Nc                     U S:  a  S[         R                  -  S-  U S-
  -  $ [         R                  " S[         R                  -  S-  U -  [         R                  -
  5      $ Nr   rE   rB   )r-   pirU   r   s    r   r   @TestLineSearch.test_scalar_search_wolfe2_regression.<locals>.phi   sM    qy255y{eai00vvagai%/"%%788r   c                     U S:  a  S[         R                  -  S-  $ S[         R                  -  S-  [         R                  " S[         R                  -  S-  U -  [         R                  -
  5      -  $ r   )r-   r   rT   r   s    r   r   CTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sU    qy255y{"255y{RVVAbeeGAI,=,E%FFFr   g      ?r   )rI   r   r   r   r   s        r   $test_scalar_search_wolfe2_regression3TestLineSearch.test_scalar_search_wolfe2_regression   s4    	9	G ,,S9
1a 3wwr   c           	          U R                  5        HM  u  pp4[        R                  " X"" S5      U" S5      5      u  pV[        Xb" U5      U5        [	        XRU SUS 3S9  MO     g r   )r   r   scalar_search_armijor<   r    )rI   r|   r   r   r   r   r   s          r   test_scalar_search_armijo(TestLineSearch.test_scalar_search_armijo   s_    +/+;+;+='Dv--c3q66!9EGAD#a&$/!TF!HQ<*@A ,>r   c                    SnSnU R                  5        H  u  p4pVpxU" U5      n	U" U5      n
SU R                  l        [        R                  " XEXgXUUS9u  ppnn[        U R                  R                  X-   5        [        X" U5      5        Uc  M}  [        X" XkU-  -   5      5        [        UU" XkU-  -   5      SS9  X:  d  M  US-  n[        XgXXSS9  M     US:  d   eg )	Nr   d   r      decimalr   r   rB   )	r   rG   rA   r   line_search_wolfe1r   r<   r   r1   )rI   rA   smaxr|   r&   r/   r(   r'   old_ff0g0r   fcgcfvofvgvs                    r   test_line_search_wolfe1&TestLineSearch.test_line_search_wolfe1   s    ,0NN,<(DV1BBDKKM%'%:%:1a;=5@D&F"A23 .C1&yB!c'
+%b&qS/2FxQ!!fC -=" 1uur   c                 l   SnSnU R                  5        GH  u  p4pVpxU" U5      n	U" U5      n
SU R                  l        [        5        nUR	                  [
        S5        UR	                  [
        S5        [        R                  " XEXgXUUS9u  ppnnS S S 5        [        U R                  R                  WW-   5        [        WU" U5      5        [        WU" UWU-  -   5      5        Wb  [        UU" XlU-  -   5      SS9  X:  d  M  US-  n[        XgXXSS	9  GM     US
:  d   eg ! , (       d  f       N= f)Nr   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   r   rB   )r   rG   rA   r   filterr   r   line_search_wolfe2r   r<   r   r1   )rI   rA   r   r|   r&   r/   r(   r'   r   r   r   supr   r   r   r   r   r   s                     r   test_line_search_wolfe2&TestLineSearch.test_line_search_wolfe2   s!   ,0NN,<(DV1BBDKKM"$

,PR

,GI)+)>)>q!?AuDH*J&rsB % 2.C1&B!ac'
+~)"fQ1WorJxQ!!fC' -=( 1uu! %$s   A
D%%
D3	c                 <   S nS n[         R                  " SS/5      nSU-  nSn[        R                  " XXCSUS9u  n        n[	        XCXaU5        [        [        [        R                  XXCS	US9u  n        nUb   e[        [        [        R                  XXCUS
S9  g )Nc                 .    [         R                  " X 5      $ r#   r,   r(   s    r   r&   8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.f  s    66!<r   c                     SU -  $ )NrE   r   r   s    r   fp9TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fp  s    q5Lr   r   r   ig      ?   )r   r      r   )r   maxiter)r-   arrayr   r   r1   r   r   )rI   r&   r   r'   r(   r   r   r   s           r   test_line_search_wolfe2_bounds-TestLineSearch.test_line_search_wolfe2_bounds   s    	 	HHaV !G002"M1aAq!b)'(9(*(=(=qa-/B81aAq yy 	&(=(=qaA	'r   c           	      R   SnU R                  5        H  u  p#pEpgU" U5      nU" U5      n	SU R                  l        [        R                  " X5XiU5      u  pnUS-  n[        U R                  R                  U5        [        X" XZU-  -   5      5        [        XVXUS9  M     US:  d   eg )Nr   r   r   r   )r   rG   rA   r   line_search_armijor   r<   r5   )rI   rA   r|   r&   r/   r(   r'   r   r   r   r   r   r   s                r   test_line_search_armijo&TestLineSearch.test_line_search_armijo  s    ,0NN,<(DV1BBDKKM--aA2>IA2FA+B!c'
+qQ48 -= Avvr   c                    ^ S/mU4S jn[         R                  " X" S5      SSS9u  p#[        US5        [        TS   S5        [        X!5        g )Nr   c                 6   > TS==   S-  ss'   U * SU S-  -  -   $ )Nr   r   g{Gz?rE   r   r   counts    r   r   3TestLineSearch.test_armijo_terminate_1.<locals>.phi/  $    !HMH2QT	>!r   rD   r   )alpha0rE   )r   r   r   r    )rI   r   r   r   r   s       @r   test_armijo_terminate_1&TestLineSearch.test_armijo_terminate_1*  sO     	" ))#s1vr!DQU1Xq!ar   c           
        ^ U4S jnU4S jn[         R                  [         R                  4 HT  nS/mU" XU" S5      S U" S5      5      nUS   c   XC45       eTS   S::  d	   TU45       e[        US   X[	        U5      S9  MV     g )Nc                 6   > TS==   S-  ss'   U * SU S-  -  -   $ )Nr   r   g?rE   r   r   s    r   r   0TestLineSearch.test_wolfe_terminate.<locals>.phi;  r   r   c                 .   > TS==   S-  ss'   SSU -  -   $ )Nr   r   rD   g?r   r   s    r   r   3TestLineSearch.test_wolfe_terminate.<locals>.derphi?  s    !HMHq= r   r   rC   r   )r   r   r   r   str)rI   r   r   rg   rr   s        @r   test_wolfe_terminate#TestLineSearch.test_wolfe_terminate7  s    	"	! ,,b.E.EFDCES#a&$q	:AQ4#.aY.#8u$3udm3$1sCI> Gr   )r^   rq   rG   rp   ro   N)__name__
__module____qualname____firstlineno__rK   rP   rV   r[   r`   r~   r   r   r   r   r   r   r   r   r   pytestmarkthread_unsafer   r   r   r   __static_attributes__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   rr   r   r    r1   r5   r<   r>   r   r   r   <module>r     sO   . . ( ' 8   E(F
77P? P?r   