
    tKg*                         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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              h/home/alanp/www/video.onchill/myenv/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$hKr   )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:   .   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                 z    | xj                   dz  c_         | |dz  z
  |dz  z   }dd|dz  z  z
  d|dz  z  z   }||fS )Nr            )fcountselfr   r'   dps       r   _scalar_func_1zTestLineSearch._scalar_func_18   sO    qBAI1!AqD&[1QT6!"ur   c                     | xj                   dz  c_         t        j                  d|z        |dz  z   }dt        j                  d|z        z  d|z  z   }||fS )Nr   rA   )rB   r,   exprC   s       r   _scalar_func_2zTestLineSearch._scalar_func_2>   sQ    qFF2a4L1a4r!t_qs""ur   c                     | xj                   dz  c_         t        j                  d|z         }dt        j                  d|z        z  }||fS )Nr   
   i)rB   r,   sincosrC   s       r   _scalar_func_3zTestLineSearch._scalar_func_3D   sB    qVVBqD\M1"ur   c                 j    | xj                   dz  c_         t        j                  ||      }d|z  }||fS )Nr   rA   )rB   r,   r-   rD   r(   r&   dfs       r   _line_func_1zTestLineSearch._line_func_1L   s1    qFF1aLqS"ur   c                    | xj                   dz  c_         t        j                  |t        j                  | j                  |            dz   }t        j                  | j                  | j                  j                  z   |      }||fS )Nr   )rB   r,   r-   ATrQ   s       r   _line_func_2zTestLineSearch._line_func_2R   s^    qFF1bffTVVQ'(1,VVDFFTVVXX%q)"ur   c           	      L   g | _         g | _        d| _        d| _        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   r   c                       fdS )Nc                       | i |   S r#   r   )ar/   funcidxs     r   r)   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>b   s    D!NrN3$7r   r   )r]   r^   s   ``r   
bind_indexz/TestLineSearch.setup_method.<locals>.bind_index`   s	    77r   _scalar_func_r   _line_func_i  )scalar_funcs
line_funcsNrB   sorteddir
startswithgetattrappendr,   randomseedrandnrU   )rD   r_   namevalues       r   setup_methodzTestLineSearch.setup_methodZ   s    	8 3t9%D/d+!!((:eQ/E11EFH/d+&&:eQ/E11EFH & 			t0r   c              #      K   | j                   D ]2  \  }}}t        j                  j                  d      D ]
  }||||f  4 y w)Nr>   )rb   r,   rj   rl   )rD   rm   r   r   old_phi0s        r   scalar_iterzTestLineSearch.scalar_iterq   sC     !%!2!2D#vIIOOA.C11 / "3s   AAc              #     K   | j                   D ]  \  }}}d}|dk  st        j                  j                  | j                        }t        j                  j                  | j                        }t        j
                  | ||            dk\  rx|dz  }t        t        j                  j                               }||||||f |dk  r y w)Nr   	   r   )rc   r,   rj   rl   rd   r-   float)rD   rm   r&   r.   kr(   r'   old_fvs           r   	line_iterzTestLineSearch.line_iterv   s     #OD!VAa%IIOODFF+IIOODFF+66!VAY'1,Qryy01Avq!V33 a%  /s   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>   )rr   lsscalar_search_wolfe1r:   r   )	rD   crm   r   r   rq   r   r   r   s	            r   test_scalar_search_wolfe1z(TestLineSearch.test_scalar_search_wolfe1   s    +/+;+;+='D#vxFA33CQ4<fQiIMAtTD#a&$/D#a&$/C6 ,> 1uur   c           
      ,   | j                         D ]  \  }}}}t        j                  || |d      | |d            \  }}}}t        | |d      |       t        | ||      |       |t        | ||      |       t	        |||| d|d        y Nr    grz   )rr   r{   scalar_search_wolfe2r:   r   )	rD   rm   r   r   rq   r   r   r   r   s	            r   test_scalar_search_wolfe2z(TestLineSearch.test_scalar_search_wolfe2   s    +/+;+;+='D#vx%'%<%<VSVXvay&:"AtT7D#a&$/D#a&$/"D9CD68A,1GH ,>r   c                 Z    d }d }t        j                  ||d      \  }}}}|J |J y )Nc                     | dz
  dz  S )N   rA   r   alphas    r   r   zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     d| dz
  z  S )NrA   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   rA   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   )rr   r{   scalar_search_armijor:   r    )rD   rm   r   r   rq   r   r   s          r   test_scalar_search_armijoz(TestLineSearch.test_scalar_search_armijo   sg    +/+;+;+='D#vx--c3q66!9EGAtD#a&$/!STF!HQ<*@A ,>r   c                    d}d}| j                         D ]  \  }}}}}} ||      }	 ||      }
d| _        t        j                  |||||
|	||      \  }}}}}}t	        | j                  ||z          t        | ||             |st        | ||||z  z                t        | ||||z  z         d       ||k  s|dz  }t        ||||||        |dkD  sJ y )	Nr   d   r      decimalr   rz   r>   )rx   rB   r{   line_search_wolfe1r   r:   r   r0   )rD   r}   smaxrm   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!VQ51BBDK%'%:%:1fa;=r5@D&F"Ar2r3 be,C1&yB!ac'
+%b&QqS/2F4xQ!!Q1fdC -=" 1uur   c                 V   d}d}| j                         D ]  \  }}}}}} ||      }	 ||      }
d| _        t               5 }|j                  t        d       |j                  t        d       t        j                  |||||
|	||      \  }}}}}}d d d        t        | 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   rz   r>   )rx   rB   r   filterr   r{   line_search_wolfe2r   r:   r   r0   )rD   r}   r   rm   r&   r.   r(   r'   r   r   r   supr   r   r   r   r   r   s                     r   test_line_search_wolfe2z&TestLineSearch.test_line_search_wolfe2   s3   ,0NN,<(D!VQ51BBDK"$

,PR

,GI)+)>)>q&!Q?A2uDH*J&2r2sB % be,C1&B!ac'
+~)"fQ1WorJ4xQ!!Q1fdC' -=( 1uu! %$s    AD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 )NrA   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   )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)'(9(*(=(=q"a-/B81aAq yy 	&(=(=q"aA	'r   c           	      <   d}| j                         D ]  \  }}}}}} ||      } ||      }	d| _        t        j                  ||||	|      \  }
}}|dz  }t	        | j                  |       t        | |||
|z  z                t        |||
||        |dk\  sJ y )Nr   r   rz   rt   )rx   rB   r{   line_search_armijor   r:   r3   )rD   r}   rm   r&   r.   r(   r'   r   r   r   r   r   r   s                r   test_line_search_armijoz&TestLineSearch.test_line_search_armijo  s    ,0NN,<(D!VQ51BBDK--aAr2>IAr2FAb)B!ac'
+q!Q48 -= 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?rA   r   r   counts    r   r   z3TestLineSearch.test_armijo_terminate_1.<locals>.phi!  $    !HMH2QT	>!r   r@   r   )alpha0rA   )r{   r   r   r    )rD   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?rA   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   r@   g?r   r   s    r   r   z3TestLineSearch.test_wolfe_terminate.<locals>.derphi1  s    !HMHq= r   r   r?   rz   )r{   r|   r   r   str)rD   r   r   r]   rr   s        @r   test_wolfe_terminatez#TestLineSearch.test_wolfe_terminate)  s    	"	! ,,b.E.EFDCES&#a&$q	:AQ4#.aY.#8u$3udm3$1sFCI> Gr   N)__name__
__module____qualname__rF   rJ   rO   rS   rW   ro   rr   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r<   r<   6   sc    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   r    r0   r3   r:   r<   r   r   r   <module>r      sI   . . ( ' 8 E(F
77D? D?r   