+
    ,i,                         R t ^ RIHtHtHtHtHt ^ RIHu H	t
 ^ RIHt ^ RIt^ RIt^ RItRR ltRR ltR tR tRR lt ! R	 R
4      tR# )z 
Tests for line search routines
)assert_equalassert_array_almost_equalassert_array_almost_equal_nulpassert_warnssuppress_warningsN)LineSearchWarningc                   V! V 4      pV! ^ 4      pV! ^ 4      pV! V 4      p	RV  RV RV RV RV	 RV 2p
WgW0,          V,          ,           8:  g   Q RV
,           4       h\        V	4      \        WH,          4      8:  g   Q RV
,           4       hR	# )
z*
Check that strong Wolfe conditions apply
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   &&&&&&     F/usr/lib/python3/dist-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                    V! V 4      pV! ^ 4      pRV  RV RV RV 2pV^W ,          ,
          V,          8:  g   Q V4       hR# )z%
Check that Armijo condition applies
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           	      F   a aaa \        V3R VVV 3R lRVVV 3R l/VB  R# )r   c                 0   < S! SSV ,          ,           4      # Nr   spfpxs   &r   <lambda>#assert_line_wolfe.<locals>.<lambda>(   s    1Q2X;r   r   c                 Z   < \         P                  ! S! SSV ,          ,           4      S4      # r!   npdot)r#   fprimer%   r&   s   &r   r'   r(   )   s    266&QrT*:A#>r   N)r   )r&   r%   r   r$   r-   kws   ff&ff,r   assert_line_wolfer/   '   s)     F. F>FBDFr   c                 4   a aa \        V3R VVV 3R l/VB  R# )r   c                 0   < S! SSV ,          ,           4      # r!   r   r"   s   &r   r'   $assert_line_armijo.<locals>.<lambda>-   s    Aa!B$hKr   N)r   )r&   r%   r   r$   r.   s   ff&f,r   assert_line_armijor3   ,   s    !6/626r   c                h     \        WV4       R#   \         d   p\        T RT 24      ThRp?ii ; i)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    1,1c                      a  ] tR t^8t o R tR tR tR tR tR t	R t
R tR	 tR
 tR tR tR tR tR t]P(                  P*                  R 4       tR tR tR tRtV tR# )TestLineSearchc                >   \        V P                  R 4      '       g   ^ V P                  n        V P                  ;P                  ^,          un        V) V^,          ,
          V^,          ,           pR^V^,          ,          ,
          ^V^,          ,          ,           pW#3# )c)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                b   \        V P                  R 4      '       g   ^ V P                  n        V P                  ;P                  ^,          un        \        P                  ! RV,          4      V^,          ,           pR\        P                  ! RV,          4      ,          ^V,          ,           pW#3# )r>   )r@   rA   r>   r+   exprB   s   &&  r   _scalar_func_2TestLineSearch._scalar_func_2B   so    t{{C((DKKMFF2a4L1a4r!t_qs"ur   c                ,   \        V P                  R 4      '       g   ^ V P                  n        V P                  ;P                  ^,          un        \        P                  ! ^
V,          4      ) pR\        P
                  ! ^
V,          4      ,          pW#3# )r>   i)r@   rA   r>   r+   sincosrB   s   &&  r   _scalar_func_3TestLineSearch._scalar_func_3J   s`    t{{C((DKKMVVBqD\M1ur   c                    \        V P                  R 4      '       g   ^ V P                  n        V P                  ;P                  ^,          un        \        P                  ! W4      p^V,          pW#3# r>   )r@   rA   r>   r+   r,   rC   r&   r$   dfs   &&  r   _line_func_1TestLineSearch._line_func_1T   sM    t{{C((DKKMFF1LqSur   c                   \        V P                  R 4      '       g   ^ V P                  n        V P                  ;P                  ^,          un        \        P                  ! V\        P                  ! V P
                  V4      4      ^,           p\        P                  ! V P
                  V P
                  P                  ,           V4      pW#3# rR   )r@   rA   r>   r+   r,   ATrS   s   &&  r   _line_func_2TestLineSearch._line_func_2\   s|    t{{C((DKKMFF1bffTVVQ'(1,VVDFFTVVXX%q)ur   c           	        . V n         . V n        ^V n        \        P                  ! 4       V n        R p\        \        V 4      4       F  pVP                  R4      '       d9   \        W4      pV P                   P                  W!! V^ 4      V! V^4      34       KR  VP                  R4      '       g   Kk  \        W4      pV P                  P                  W!! V^ 4      V! V^4      34       K  	  \        P                  P                  R4       \        P                  P                  V P                  V P                  4      V n        R# )   c                    a a V V3R  l# )c                  "   < S! V / VB S,          # r!   r   )ar.   funcidxs   *,r   r'   ATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>n   s    D!NrN3$7r   r   )ra   rb   s   ffr   
bind_index/TestLineSearch.setup_method.<locals>.bind_indexl   s	    77r   _scalar_func__line_func_  N)scalar_funcs
line_funcsN	threadinglocalrA   sorteddir
startswithgetattrappendr+   randomseedrandnrX   )rC   rd   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              #     "   V P                    F2  w  rp\        P                  P                  ^4       F	  pWW43x  K  	  K4  	  R# 5i)   N)ri   r+   rs   ru   )rC   rv   r   r   old_phi0s   &    r   scalar_iterTestLineSearch.scalar_iter}   s<     !%!2!2DvIIOOA.11 / "3s   AAc              #    "   \         P                  P                  R 4      pV P                   F  w  r#p^ pV^	8  g   K  VP	                  V P
                  4      pVP	                  V P
                  4      p\         P                  ! Wt! V4      4      ^ 8  d   Kb  V^,          p\        VP	                  4       4      pW#WFWx3x  K  	  R# 5i)rh   N)r+   rs   RandomStaterj   ru   rk   r,   float)	rC   rngrv   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  /s   8CBCc           
        ^ pV P                  4        Fg  w  r#rEV^,          p\        P                  ! W4V! ^ 4      WT! ^ 4      4      w  rgp\        W! ^ 4      V4       \        Ws! V4      V4       \	        WcWBR7       Ki  	  V^8  g   Q hR#     r   N)r}   lsscalar_search_wolfe1r:   r   )	rC   r>   rv   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           
     "   V P                  4        Fz  w  rr4\        P                  ! W#V! ^ 4      WC! ^ 4      4      w  rVrx\        Wr! ^ 4      V4       \        Wb! V4      V4       Ve   \        W! V4      V4       \	        WRW1 RVR 2R7       K|  	  R# )r   N gr   )r}   r   scalar_search_wolfe2r:   r   )	rC   rv   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                b    R  pR p\         P                  ! WRR7      w  p rEVe   Q hVe   Q hR# )c                 "    V ^,
          ^,          # )   r   alphas   &r   r   CTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                 "    ^V ^,
          ,          #    r   r   s   &r   r   FTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxNr   r   )rC   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                Z    R  pR p\         P                  ! W4      w  p  pVR8  g   Q hR# )c                    V ^8  d-   R\         P                  ,          ^,          V ^,
          ,          # \         P                  ! ^\         P                  ,          ^,          V ,          \         P                  ,
          4      #    )r+   pirN   r   s   &r   r   @TestLineSearch.test_scalar_search_wolfe2_regression.<locals>.phi   sM    qy255y{eai00vvagai%/"%%788r   c                 .   V ^8  d   R\         P                  ,          ^,          # R\         P                  ,          ^,          \         P                  ! ^\         P                  ,          ^,          V ,          \         P                  ,
          4      ,          # r   )r+   r   rM   r   s   &r   r   CTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sU    qy255y{"255y{RVVAbeeGAI,=,E%FFFr   g      ?Nr   )rC   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           	         V P                  4        FP  w  rr4\        P                  ! W"! ^ 4      V! ^ 4      4      w  rV\        Wb! V4      V4       \	        WRV RVR 2R7       KR  	  R# )r   r   r   r   N)r}   r   scalar_search_armijor:   r   )rC   rv   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                   ^ p^dpV P                  4        F  w  r4rVrxV! V4      p	V! V4      p
^ V P                  n        \        P                  ! WEWgWVVR7      w  rrpp\        V P                  P                  W,           4       \        W! V4      4       Vf   K  \        W! WkV,          ,           4      4       \        VV! WkV,          ,           4      ^R7       W8  g   K  V^,          p\        WgWWSR7       K  	  V^8  g   Q hR# )r   r   Ndecimalr   )	r   rA   r>   r   line_search_wolfe1r   r:   r   r/   )rC   r>   smaxrv   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                   ^ pRpV P                  4        EF.  w  r4rVrxV! V4      p	V! V4      p
^ V P                  n        \        4       ;_uu_ 4       pVP	                  \
        R4       VP	                  \
        R4       \        P                  ! WEWgWVVR7      w  rrppRRR4       \        V P                  P                  XX,           4       \        XV! V4      4       \        XV! VXV,          ,           4      4       Xe"   \        VV! WlV,          ,           4      ^R7       W8  g   EK  V^,          p\        WgWWSR7       EK1  	  V^8  g   Q hR#   + '       g   i     L; i)r   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not converger   Nr   r   )r   rA   r>   r   filterr   r   line_search_wolfe2r   r:   r   r/   )rC   r>   r   rv   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C' -=( 1uu! %$s   AEE#c                Z   R  pR p\         P                  ! ^^ .4      pRV,          pRp\        P                  ! WWC^VR7      w  p    p\	        WCWaV4       \        \        \        P                  WWC^VR7      w  p    pVe   Q h\        \        \        P                  WWCV^R7       R# )c                 .    \         P                  ! W 4      # r!   r*   r&   s   &r   r$   8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.f  s    66!<r   c                     ^V ,          # r   r   r   s   &r   fp9TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fp  s    q5Lr   g      ?)r   r   N)r   maxiteri)r+   arrayr   r   r/   r   r   )rC   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           	     t   ^ pV P                  4        F  w  r#rErgV! V4      pV! V4      p	^ V P                  n        \        P                  ! W5WiV4      w  rpV^,          p\        V P                  P                  V4       \        W! WZV,          ,           4      4       \        WVWVR7       K  	  V^	8  g   Q hR# r   )r   rA   r>   r   line_search_armijor   r:   r3   )rC   r>   rv   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                   a ^ .oV3R lp\         P                  ! W! ^ 4      R^R7      w  r#\        V^4       \        S^ ,          ^4       \        W!4       R# )r   c                 ^   < S^ ;;,          ^,          uu&   V ) RV ^,          ,          ,           # )r   g{Gz?r   r   counts   &r   r   3TestLineSearch.test_armijo_terminate_1.<locals>.phi/  $    !HMH2QT	>!r   )alpha0Nr?   )r   r   r   r   )rC   r   r   r   r   s   &   @r   test_armijo_terminate_1&TestLineSearch.test_armijo_terminate_1*  sO     	" ))#s1vr!DQU1Xq!ar   c           
     2  a V3R  lpV3R lp\         P                  \         P                  3 Fe  p^ .oV! WV! ^ 4      RV! ^ 4      4      pV^ ,          f	   Q WC34       hS^ ,          ^8:  g
   Q SV34       h\        V^ ,          W\	        V4      R7       Kg  	  R# )c                 ^   < S^ ;;,          ^,          uu&   V ) RV ^,          ,          ,           # )r   g?r   r   s   &r   r   0TestLineSearch.test_wolfe_terminate.<locals>.phi;  r   r   c                 N   < S^ ;;,          ^,          uu&   RRV ,          ,           # )r   r?   g?r   r   s   &r   r   3TestLineSearch.test_wolfe_terminate.<locals>.derphi?  s    !HMHq= r   Nr   )r   r   r   r   str)rC   r   r   ra   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   )rX   rk   rA   rj   ri   N)__name__
__module____qualname____firstlineno__rE   rJ   rO   rU   rZ   rx   r}   r   r   r   r   r   r   r   r   pytestmarkthread_unsafer   r   r   r   __static_attributes____classdictcell__)__classdict__s   @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   rl   r   r   r/   r3   r:   r<   r   r   r   <module>r      sO   . . ( ' 8   E(F
77P? P?r   