
    doiN-                         S r SSKrSSK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
    N)assert_equalassert_array_almost_equalassert_array_almost_equal_nulp)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              `/var/www/html/land-ocr/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_wolfer/   (   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$   r.   s   `` ` r   assert_line_armijor3   -   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:   1   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S rS rS rS rSrg)TestLineSearch9   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fcountr?   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$ )Nr?   r   r   rC   )rD   rE   r?   r+   exprF   s       r   _scalar_func_2TestLineSearch._scalar_func_2C   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$ )Nr?   r   r   
   i)rD   rE   r?   r+   sincosrF   s       r   _scalar_func_3TestLineSearch._scalar_func_3K   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$ )Nr?   r   r   rC   )rD   rE   r?   r+   r,   rG   r&   r$   dfs       r   _line_func_1TestLineSearch._line_func_1U   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$ )Nr?   r   r   )rD   rE   r?   r+   r,   ATrW   s       r   _line_func_2TestLineSearch._line_func_2]   s|    t{{C((DKKMFF1bffTVVQ'(1,VVDFFTVVXX%q)ur   c           	      l   / 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      nUR                  U R                  U R                  45      U l        g )N   c                    ^ ^ U U4S j$ )Nc                     > T" U 0 UD6T   $ r!   r   )ar.   funcidxs     r   r'   ATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>o   s    D!NrN3$7r   r   )re   rf   s   ``r   
bind_index/TestLineSearch.setup_method.<locals>.bind_indexm   s	    77r   _scalar_func_r   r   _line_func_i1mI)scalar_funcs
line_funcsN	threadinglocalrE   sorteddir
startswithgetattrappendr+   randomdefault_rngstandard_normalr\   )rG   rh   namevaluerngs        r   setup_methodTestLineSearch.setup_methodg   s    oo'	8 3t9%D//+!!((:eQ/E11EFH//+&&:eQ/E11EFH & ii##J/$$dffdff%56r   c              #      #    [         R                  R                  S5      nU R                   H$  u  p#nUR	                  S5       H	  nX#XE4v   M     M&     g 7f)N   {
 r@   )r+   rv   rw   rl   rx   )rG   r{   ry   r   r   old_phi0s         r   scalar_iterTestLineSearch.scalar_iter   sN     ii##J/!%!2!2Dv//211 3 "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)Nr   r   	   r   )r+   rv   rw   rm   rx   rn   r,   float)	rG   r{   ry   r$   r-   kr&   r%   old_fvs	            r   	line_iterTestLineSearch.line_iter   s     ii##J/#ODVAa%''/''/66!VAY'1,Qs2245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   r@   )r   lsscalar_search_wolfe1r:   r   )	rG   r?   ry   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   )	rG   ry   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   rC   r   alphas    r   r   CTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     SU S-
  -  $ )NrC   r   r   r   s    r   r   FTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxr   r   )rG   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   rC   r@   )r+   pirS   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   rR   r   s    r   r   CTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sU    qy255y{"255y{RVVAbeeGAI,=,E%FFFr   g      ?r   )rG   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   )rG   ry   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   r@   )	r   rE   r?   r   line_search_wolfe1r   r:   r   r/   rG   r?   smaxry   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                    SnSnU R                  5        GH  u  p4pVpxU" U5      n	U" U5      n
SU R                  l        [        R                  " 5          [        R
                  " SS[        5        [        R
                  " S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" XkU-  -   5      SS9  X:  d  GM
  US	-  n[        XgXXSS
9  GM     US:  d   eg ! , (       d  f       N= f)Nr   i   ignorez3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   r   r@   )r   rE   r?   warningscatch_warningsfilterwarningsr   r   line_search_wolfe2r   r:   r   r/   r   s                    r   test_line_search_wolfe2&TestLineSearch.test_line_search_wolfe2   s1   ,0NN,<(DV1BBDKKM((*''I%' ''@%' *,)>)>q!?AuDH*J&rsB + 2.C1&B!ac'
+~)"fQ1WorJxQ!!fC/ -=0 1uu) +*s   AD==
E	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                  " [        5         [        R                  " XXCS	US9u  n        nS S S 5        Ub   e[
        R                  " [        5         [        R                  " XXCUS
S9  S S S 5        g ! , (       d  f       NN= f! , (       d  f       g = f)Nc                 .    [         R                  " X 5      $ r!   r*   r&   s    r   r$   8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.f  s    66!<r   c                     SU -  $ )NrC   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   r/   pytestwarnsr   )rG   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)\\+,!44QA:< EAq!Q1 - yy \\+,!!!"a@ -, -, -,s   +C1C#
C #
C1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   rE   r?   r   line_search_armijor   r:   r3   )rG   r?   ry   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?rC   r   r   counts    r   r   3TestLineSearch.test_armijo_terminate_1.<locals>.phi5  $    !HMH2QT	>!r   rB   r   )alpha0rC   )r   r   r   r   )rG   r   r   r   r   s       @r   test_armijo_terminate_1&TestLineSearch.test_armijo_terminate_10  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?rC   r   r   s    r   r   0TestLineSearch.test_wolfe_terminate.<locals>.phiA  r   r   c                 .   > TS==   S-  ss'   SSU -  -   $ )Nr   r   rB   g?r   r   s    r   r   3TestLineSearch.test_wolfe_terminate.<locals>.derphiE  s    !HMHq= r   r   rA   r   )r   r   r   r   str)rG   r   r   re   rr   s        @r   test_wolfe_terminate#TestLineSearch.test_wolfe_terminate=  s    	"	! ,,b.E.EFDCES#a&$q	:AQ4#.aY.#8u$3udm3$1sCI> Gr   )r\   rn   rE   rm   rl   N)__name__
__module____qualname____firstlineno__rI   rN   rT   rY   r^   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r   r   r<   r<   9   sd    7024 
I	#(B,:A8?r   r<   )-C6?g? )r   r   )r   2   )__doc__r   numpy.testingr   r   r   scipy.optimize._linesearchoptimize_linesearchr   r   numpyr+   r   ro   r   r   r/   r3   r:   r<   r   r   r   <module>r     sR    ; ; ' ' 8   E(F
77U? U?r   