
    ge*                         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dS )z 
Tests for line search routines
    )assert_equalassert_array_almost_equalassert_array_almost_equal_nulpassert_warnssuppress_warningsN)LineSearchWarning-C6?? c                 *    ||           } |d          } |d          } ||           }	d                     | ||||	|          }
|||| z  |z  z   k    sJ d|
z               t          |	          t          ||z            k    sJ d|
z               dS )z2
    Check that strong Wolfe conditions apply
    r   z@s = {}; phi(0) = {}; phi(s) = {}; phi'(0) = {}; phi'(s) = {}; {}zWolfe 1 failed: zWolfe 2 failed: N)formatabs)sphiderphic1c2err_msgphi1phi0derphi0derphi1msgs              Dlib/python3.11/site-packages/scipy/optimize/tests/test_linesearch.pyassert_wolfer      s     3q66D3q66DfQiiGfQiiG
L
S
S	4w2 2C 4"Q$w,&&&&(:S(@&&&w<<3r'z??***,>,D*****    c                      ||           } |d          }d|  d| d| d| }|d|| z  z
  |z  k    s
J |            dS )z-
    Check that Armijo condition applies
    r   zs = z; phi(0) = z; phi(s) = z;    N )r   r   r   r   r   r   r   s          r   assert_armijor       sn     3q66D3q66D
A
A
At
A
A
A
A
A
ACA1Hd?"""C"""""r   c                 B     t          |f fd fdd| d S )Nc                 &     | z  z             S Nr   spfpxs    r   <lambda>z#assert_line_wolfe.<locals>.<lambda>&   s    11Q2X;; r   c                 L    t          j         | z  z                       S r#   npdot)r%   fprimer'   r(   s    r   r)   z#assert_line_wolfe.<locals>.<lambda>'   s%    26&&QrT*:*:A#>#> r   )r   r   )r   )r(   r'   r   r&   r.   kws   `` `` r   assert_line_wolfer0   %   sb     F......>>>>>>F FBDF F F F Fr   c                 4     t          |fd fdi| d S )Nr   c                 &     | z  z             S r#   r   r$   s    r   r)   z$assert_line_armijo.<locals>.<lambda>+   s    AAa!B$hKK r   )r    )r(   r'   r   r&   r/   s   `` ` r   assert_line_armijor3   *   s6    !66//////6266666r   2   c                 x    	 t          | ||           dS # 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2222 7 7 7..W..//Q67s    
949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dS )TestLineSearchc                 p    | 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   sQ    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   rB   )rC   r,   exprD   s       r   _scalar_func_2zTestLineSearch._scalar_func_2>   sS    qF2a4LL1a4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)rC   r,   sincosrD   s       r   _scalar_func_3zTestLineSearch._scalar_func_3D   sD    qVBqD\\M1"ur   c                 ^    | xj         dz  c_         t          j        ||          }d|z  }||fS )Nr   rB   )rC   r,   r-   rE   r(   r&   dfs       r   _line_func_1zTestLineSearch._line_func_1L   s3    qF1aLL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   )rC   r,   r-   ATrR   s       r   _line_func_2zTestLineSearch._line_func_2R   s[    qF1bfTVQ''((1,VDFTVX%q))"ur   c           	      x   g | _         g | _        d| _        d| _        d }t	          t          |                     D ]}|                    d          rBt          | |          }| j                             | ||d           ||d          f           Y|                    d          rAt          | |          }| j                            | ||d           ||d          f           t          j
                            d           t          j
                            | j        | j                  | _        d S )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    DD!NrNN3$7 r   r   )r^   r_   s   ``r   
bind_indexz/TestLineSearch.setup_method.<locals>.bind_index`   s    777777r   _scalar_func_r   _line_func_i  )scalar_funcs
line_funcsNrC   sorteddir
startswithgetattrappendr,   randomseedrandnrV   )rE   r`   namevalues       r   setup_methodzTestLineSearch.setup_methodZ   sR   	8 	8 	8 3t99%% 	H 	HD// Hd++!((::eQ//E11E1EFH H H H// Hd++&&::eQ//E11E1EFH H H 		t00r   c              #   z   K   | j         D ]0\  }}}t          j                            d          D ]
}||||fV  1d S )Nr?   )rc   r,   rk   rm   )rE   rn   r   r   old_phi0s        r   scalar_iterzTestLineSearch.scalar_iterq   sc      !%!2 	2 	2D#vIOOA.. 2 2C111112	2 	2r   c              #     K   | j         D ]\  }}}d}|dk     rt          j                            | j                  }t          j                            | j                  }t          j        | ||                    dk    rq|dz  }t          t          j                                                  }||||||fV  |dk     d S )Nr   	   r   )rd   r,   rk   rm   re   r-   float)rE   rn   r&   r.   kr(   r'   old_fvs           r   	line_iterzTestLineSearch.line_iterv   s      # 
	4 
	4OD!VAa%%IOODF++IOODF++6!VVAYY''1,,Qry0011Avq!V3333 a%%
	4 
	4r   c           
      F   d}|                                  D ]\  }}}}|dz  }t          j        || |d          | |d                    \  }}}t          | |d          |           t          | ||          |           t	          ||||           |dk    sJ d S )Nr   r   r   r?   )rs   lsscalar_search_wolfe1r;   r   )	rE   crn   r   r   rr   r   r   r   s	            r   test_scalar_search_wolfe1z(TestLineSearch.test_scalar_search_wolfe1   s    +/+;+;+=+= 	7 	7'D#vxFA3CQ4<ffQiiI IMAtTD##a&&$///D##a&&$///C666661uuuuuur   c           
      n   |                                  D ]\  }}}}t          j        || |d          | |d                    \  }}}}t          | |d          |           t          | ||          |           |t          | ||          |           t	          |||| d|d           d S Nr    gr{   )rs   r|   scalar_search_wolfe2r;   r   )	rE   rn   r   r   rr   r   r   r   r   s	            r   test_scalar_search_wolfe2z(TestLineSearch.test_scalar_search_wolfe2   s    +/+;+;+=+= 	I 	I'D#vx%'%<VSSVVXvvayy&: &:"AtT7D##a&&$///D##a&&$///"D999CD1G1G81G1G1GHHHHH	I 	Ir   c                 j    d }d }t          t          t          j        ||d          \  }}}}|J d S )Nc                     | dz
  dz  S )N   rB   r   alphas    r   r   zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     d| dz
  z  S )NrB   r   r   r   s    r   r   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amax)r   r   r|   r   rE   r   r   r   _s        r   'test_scalar_search_wolfe2_with_low_amaxz6TestLineSearch.test_scalar_search_wolfe2_with_low_amax   s]    	$ 	$ 	$	# 	# 	# ""3"$"93UT T T
1ayyyyyr   c                 V    d }d }t          j        ||          \  }}}}|dk     sJ d S )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   rB   r?   )r,   pirO   r   s    r   r   z@TestLineSearch.test_scalar_search_wolfe2_regression.<locals>.phi   sJ    qyy25y{eai00vagai%/"%78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   rN   r   s    r   r   zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sP    qyy25y{"25y{RVAbeGAI,=,E%F%FFFr   g      ?)r|   r   r   s        r   $test_scalar_search_wolfe2_regressionz3TestLineSearch.test_scalar_search_wolfe2_regression   sR    	9 	9 	9	G 	G 	G ,S&99
1a 3wwwwwwr   c           	          |                                  D ]d\  }}}}t          j        | |d           |d                    \  }}t          | ||          |           t	          ||| d|d           ed S r   )rs   r|   scalar_search_armijor;   r    )rE   rn   r   r   rr   r   r   s          r   test_scalar_search_armijoz(TestLineSearch.test_scalar_search_armijo   s    +/+;+;+=+= 	B 	B'D#vx-c33q6666!99EEGAtD##a&&$///!ST*@*@H*@*@*@AAAAA	B 	Br   c                    d}d}|                                  D ]\  }}}}}} ||          }	 ||          }
d| _        t          j        |||||
|	||          \  }}}}}}t	          | j        ||z              t          | ||                     |}t          | ||||z  z                        t          | ||||z  z             d           ||k     r|dz  }t          ||||||           |dk    sJ d S )	Nr   d   r      decimalr   r{   r?   )ry   rC   r|   line_search_wolfe1r   r;   r   r0   )rE   r~   smaxrn   r&   r.   r(   r'   old_ff0g0r   fcgcfvofvgvs                    r   test_line_search_wolfe1z&TestLineSearch.test_line_search_wolfe1   sJ   ,0NN,<,< 	D 	D(D!VQ51BBDK%'%:1fa;=r5@D&F &F &F"Ar2r3 be,,,C1&&&yB!ac'

+++%b&&QqS//2FFFF4xxQ!!Q1fdCCCC1uuuuuur   c                    d}d}|                                  D ]9\  }}}}}} ||          }	 ||          }
d| _        t                      5 }|                    t          d           |                    t          d           t          j        |||||
|	||          \  }}}}}}d d d            n# 1 swxY w Y   t          | j        ||z              t          | ||                     t          | ||||z  z                        |!t          | ||||z  z             d           ||k     r|dz  }t          ||||||	           ;|d
k    sJ d S )Nr   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   r{   r?   )ry   rC   r   filterr   r|   line_search_wolfe2r   r;   r   r0   )rE   r~   r   rn   r&   r.   r(   r'   r   r   r   supr   r   r   r   r   r   s                     r   test_line_search_wolfe2z&TestLineSearch.test_line_search_wolfe2   s   ,0NN,<,< 	D 	D(D!VQ51BBDK"$$ J

,PR R R

,GI I I)+)>q&!Q?A2uDH*J *J *J&2r2sBJ J J J J J J J J J J J J J J be,,,C1&&&B!ac'

+++~)"ffQ1WoorJJJJ4xxQ!!Q1fdCCCC1uuuuuus   AB44B8	;B8	c           
      b   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
           d S )Nc                 ,    t          j        | |           S r#   r+   r(   s    r   r&   z8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.f   s    6!Q<<r   c                     d| z  S )NrB   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   )rE   r&   r   r'   r(   r   r   r   s           r   test_line_search_wolfe2_boundsz-TestLineSearch.test_line_search_wolfe2_bounds   s    	  	  	 	 	 	HaV !G0B12"MMM1aAq!Q1b)))'(9(*(=q"a-/B8 8 81aAq yyy 	&(=q"aA	' 	' 	' 	' 	' 	'r   c           	      b   d}|                                  D ]\  }}}}}} ||          } ||          }	d| _        t          j        ||||	|          \  }
}}|dz  }t	          | j        |           t          | |||
|z  z                        t          |||
||           |dk    sJ d S )Nr   r   r{   ru   )ry   rC   r|   line_search_armijor   r;   r3   )rE   r~   rn   r&   r.   r(   r'   r   r   r   r   r   r   s                r   test_line_search_armijoz&TestLineSearch.test_line_search_armijo  s    ,0NN,<,< 	9 	9(D!VQ51BBDK-aAr2>>IAr2FAb)))B!ac'

+++q!Q488888Avvvvvvr   c                     dgfd}t          j        | |d          dd          \  }}t          |d           t          d         d           t          ||           d S )Nr   c                 <    dxx         dz  cc<   |  d| dz  z  z   S )Nr   r   g{Gz?rB   r   r   counts    r   r   z3TestLineSearch.test_armijo_terminate_1.<locals>.phi!  ,    !HHHMHHH2QT	>!r   rA   r   )alpha0rB   )r|   r   r   r    )rE   r   r   r   r   s       @r   test_armijo_terminate_1z&TestLineSearch.test_armijo_terminate_1  s     	" 	" 	" 	" 	" )#ss1vvr!DDD4QU1Xq!!!ar   c           
      >   fd}fd}t           j        t           j        fD ]x}dg ||| |d          d  |d                    }|d         J ||f            d         dk    sJ |f            t          |d         ||t	          |                     yd S )Nc                 <    dxx         dz  cc<   |  d| dz  z  z   S )Nr   r   g?rB   r   r   s    r   r   z0TestLineSearch.test_wolfe_terminate.<locals>.phi-  r   r   c                 4    dxx         dz  cc<   dd| z  z   S )Nr   r   rA   g?r   r   s    r   r   z3TestLineSearch.test_wolfe_terminate.<locals>.derphi1  s&    !HHHMHHHq= r   r   r@   r{   )r|   r}   r   r   str)rE   r   r   r^   rr   s        @r   test_wolfe_terminatez#TestLineSearch.test_wolfe_terminate)  s    	" 	" 	" 	" 	"	! 	! 	! 	! 	! ,b.EF 	? 	?DCES&##a&&$q		::AQ4##aY###8u$$$udm$$$1sFCII>>>>>	? 	?r   N)__name__
__module____qualname__rG   rK   rP   rT   rX   rp   rs   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=   r=   6   s7                 1 1 1.2 2 2
4 4 4
 
 
I I I	 	 	  (B B B  ,  2' ' '8    ? ? ? ? ?r   r=   )r	   r
   r   )r	   r   )r   r4   )__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      s-   . . . . . . . . . . . . . . ( ' ' ' ' ' ' ' ' 8 8 8 8 8 8    E E E E( ( ( (F F F
7 7 77 7 7 7D? D? D? D? D? D? D? D? D? D?r   