
    biN-                         d Z ddlZddl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
    N)assert_equalassert_array_almost_equalassert_array_almost_equal_nulp)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              _/home/cdr/jupyterlab/.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_wolfer.   (   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_armijor1   -   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_equalr8   1   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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   r@   )rA   rB   r<   r*   exprC   s       r   _scalar_func_2zTestLineSearch._scalar_func_2C   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)rA   rB   r<   r*   sincosrC   s       r   _scalar_func_3zTestLineSearch._scalar_func_3K   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   r@   )rA   rB   r<   r*   r+   rD   r&   r$   dfs       r   _line_func_1zTestLineSearch._line_func_1U   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   )rA   rB   r<   r*   r+   ATrQ   s       r   _line_func_2zTestLineSearch._line_func_2]   s{    t{{C(DKKMFF1bffTVVQ'(1,VVDFFTVVXX%q)"ur   c           	      V   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      }|j                  | j                  | j                  f      | _        y )N   c                       fdS )Nc                       | i |   S r!   r   )ar-   funcidxs     r   r'   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>o   s    D!NrN3$7 r   r   )r]   r^   s   ``r   
bind_indexz/TestLineSearch.setup_method.<locals>.bind_indexm   s	    77r   _scalar_func_r   r   _line_func_i1mI)scalar_funcs
line_funcsN	threadinglocalrB   sorteddir
startswithgetattrappendr*   randomdefault_rngstandard_normalrU   )rD   r_   namevaluerngs        r   setup_methodzTestLineSearch.setup_methodg   s   oo'	8 3t9% 	HD/d+!!((:eQ/E11EFH/d+&&:eQ/E11EFH	H ii##J/$$dffdff%56r   c              #      K   t         j                  j                  d      }| j                  D ]$  \  }}}|j	                  d      D ]
  }||||f  & y w)N   {
 r=   )r*   rl   rm   rb   rn   )rD   rq   ro   r   r   old_phi0s         r   scalar_iterzTestLineSearch.scalar_iter   s_     ii##J/!%!2!2 	2D#v//2 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)Nrt   r   	   r   )r*   rl   rm   rc   rn   rd   r+   float)	rD   rq   ro   r$   r,   kr&   r%   old_fvs	            r   	line_iterzTestLineSearch.line_iter   s     ii##J/# 
	4OD!VAa%''/''/66!VAY'1,Qs2245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=   )rv   lsscalar_search_wolfe1r8   r   )	rD   r<   ro   r   r   ru   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~   )rv   r   scalar_search_wolfe2r8   r   )	rD   ro   r   r   ru   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   r@   r   alphas    r   r   zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     d| dz
  z  S )Nr@   r   r   r   s    r   r   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxr   r   )rD   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   r@   r=   )r*   pirN   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   rM   r   s    r   r   zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sU    qy255y{"255y{RVVAbeeGAI,=,E%FFFr   g      ?r   )rD   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   )rv   r   scalar_search_armijor8   r   )rD   ro   r   r   ru   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|   rB   r<   r   line_search_wolfe1r   r8   r   r.   rD   r<   smaxro   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        j                         5  t        j
                  ddt               t        j
                  ddt               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   ignorez3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   r~   r=   )r|   rB   r<   warningscatch_warningsfilterwarningsr   r   line_search_wolfe2r   r8   r   r.   r   s                    r   test_line_search_wolfe2z&TestLineSearch.test_line_search_wolfe2   s]   ,0NN,< 	D(D!VQ51BBDKKM((* J''I%' ''@%' *,)>)>q&!Q?A2uDH*J&2r2sBJ 2.C1&B!ac'
+~)"fQ1WorJ4xQ!!Q1fdC/	D0 1uu)J Js   AE		E	c           	         d }d }t        j                  ddg      }d|z  }d}t        j                  ||||d|      \  }}}}}}t	        |||||       t        j                  t              5  t        j                  ||||d	|      \  }}}}}}d d d        |J t        j                  t              5  t        j                  |||||d
       d d d        y # 1 sw Y   KxY w# 1 sw Y   y xY w)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 )Nr@   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   r.   pytestwarnsr   )rD   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)\\+, 	E!44QAq:< EAq!Q1	E yy \\+, 	A!!!RA"a@	A 	A	E 	E	A 	As   /#C7C(C%(C1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~   rx   )r|   rB   r<   r   line_search_armijor   r8   r1   )rD   r<   ro   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?r@   r   r   counts    r   r   z3TestLineSearch.test_armijo_terminate_1.<locals>.phi5  $    !HMH2QT	>!r   r?   r   )alpha0r@   )r   r   r   r   )rD   r   r   r   r   s       @r   test_armijo_terminate_1z&TestLineSearch.test_armijo_terminate_10  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?r@   r   r   s    r   r   z0TestLineSearch.test_wolfe_terminate.<locals>.phiA  r   r   c                 .    dxx   dz  cc<   dd| z  z   S )Nr   r   r?   g?r   r   s    r   r   z3TestLineSearch.test_wolfe_terminate.<locals>.derphiE  s    !HMHq= r   r   r>   r~   )r   r   r   r   str)rD   r   r   r]   rr   s        @r   test_wolfe_terminatez#TestLineSearch.test_wolfe_terminate=  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__rF   rJ   rO   rS   rW   rr   rv   r|   r   r   r   r   r   r   r   r   r   r   r   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   re   r   r   r.   r1   r8   r:   r   r   r   <module>r      sR    ; ; ' ' 8   E(F
77U? U?r   