
    ^Mh,                         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l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|  d| d| 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   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              d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/optimize/tests/test_linesearch.pyassert_wolfer      s     3q66D3q66DfQiiGfQiiG.! . . . . . .7 . . . .$+. .C 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   r   r   r   r      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)   r1   kws   `` `` r   assert_line_wolfer3   '   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)   r2   s   `` ` r   assert_line_armijor6   ,   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>   0   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ej        j        d             Zd Zd Zd ZdS )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fcountrB   selfr   r*   dps       r   _scalar_func_1zTestLineSearch._scalar_func_1:   sp    t{C(( 	DKM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 )NrB   r   r!   rF   )rG   rH   rB   r/   exprI   s       r   _scalar_func_2zTestLineSearch._scalar_func_2B   sr    t{C(( 	DKMF2a4LL1a4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 )NrB   r   r!   
   i)rG   rH   rB   r/   sincosrI   s       r   _scalar_func_3zTestLineSearch._scalar_func_3J   sc    t{C(( 	DKMVBqD\\M1"ur   c                     t          | j        d          sd| j        _        | j        xj        dz  c_        t          j        ||          }d|z  }||fS )NrB   r   r!   rF   )rG   rH   rB   r/   r0   rJ   r+   r)   dfs       r   _line_func_1zTestLineSearch._line_func_1T   sR    t{C(( 	DKMF1aLLqS"ur   c                 $   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 )NrB   r   r!   )rG   rH   rB   r/   r0   ATrW   s       r   _line_func_2zTestLineSearch._line_func_2\   sz    t{C(( 	DKMF1bfTVQ''((1,VDFTVX%q))"ur   c           	         g | _         g | _        d| _        t          j                    | _        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   c                       fdS )Nc                        | i |         S r&   r"   )ar2   funcidxs     r   r,   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>n   s    DD!NrNN3$7 r   r"   )rc   rd   s   ``r   
bind_indexz/TestLineSearch.setup_method.<locals>.bind_indexl   s    777777r   _scalar_func_r   r!   _line_func_  )scalar_funcs
line_funcsN	threadinglocalrH   sorteddir
startswithgetattrappendr/   randomseedrandnr[   )rJ   re   namevalues       r   setup_methodzTestLineSearch.setup_methodf   sZ   o''	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 )NrC   )ri   r/   rs   ru   )rJ   rv   r   r   old_phi0s        r   scalar_iterzTestLineSearch.scalar_iter}   sc      !%!2 	2 	2D#vIOOA.. 2 2C111112	2 	2r   c              #     K   t           j                            d          }| j        D ]\  }}}d}|dk     r|                    | j                  }|                    | j                  }t          j        | ||                    dk    r]|dz  }t          |                                          }||||||fV  |dk     d S )Nrh   r   	   r!   )r/   rs   RandomStaterj   ru   rk   r0   float)	rJ   rngrv   r)   r1   kr+   r*   old_fvs	            r   	line_iterzTestLineSearch.line_iter   s      i##D))# 
	4 
	4OD!VAa%%IIdf%%IIdf%%6!VVAYY''1,,Qsyy{{++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   rC   )r{   lsscalar_search_wolfe1r>   r   )	rJ   rB   rv   r   r   rz   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   )r{   r   scalar_search_wolfe2r>   r   )	rJ   rv   r   r   rz   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                 Z    d }d }t          j        ||d          \  }}}}|J |J d S )Nc                     | dz
  dz  S )N   rF   r"   alphas    r   r   zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     d| dz
  z  S )NrF   r   r"   r   s    r   r   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxr   r   )rJ   r   r   
alpha_star_derphi_stars         r   'test_scalar_search_wolfe2_with_low_amaxz6TestLineSearch.test_scalar_search_wolfe2_with_low_amax   sa    	$ 	$ 	$	# 	# 	# )+(?VRW(X(X(X%
Aq+!!!"""""r   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!   rF   rC   )r/   pirT   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   rS   r   s    r   r   zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sP    qyy25y{"25y{RVAbeGAI,=,E%F%FFFr   g      ?r   )rJ   r   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   )r{   r   scalar_search_armijor>   r#   )rJ   rv   r   r   rz   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| j        _        t          j        |||||
|	||          \  }}}}}}t          | j        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   rC   )	r   rH   rB   r   line_search_wolfe1r   r>   r   r3   )rJ   rB   smaxrv   r)   r1   r+   r*   old_ff0g0r   fcgcfvofvgvs                    r   test_line_search_wolfe1z&TestLineSearch.test_line_search_wolfe1   sN   ,0NN,<,< 	D 	D(D!VQ51BBDKM%'%:1fa;=r5@D&F &F &F"Ar2r3 2...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 ]C\  }}}}}} ||          }	 ||          }
d| j        _        t                      5 }|                    t
          d           |                    t
          d           t          j        |||||
|	||          \  }}}}}}d d d            n# 1 swxY w Y   t          | j        j        ||z              t          | ||                     t          | ||||z  z                        |!t          | ||||z  z             d           ||k     r|dz  }t          ||||||	           E|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   rC   )r   rH   rB   r   filterr   r   line_search_wolfe2r   r>   r   r3   )rJ   rB   r   rv   r)   r1   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DKM"$$ 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 2...C1&&&B!ac'

+++~)"ffQ1WoorJJJJ4xxQ!!Q1fdCCCC1uuuuuus   AB99B=	 B=	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 )NrF   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   r3   r   r   )rJ   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           	      v   d}|                                  D ]\  }}}}}} ||          } ||          }	d| j        _        t          j        ||||	|          \  }
}}|dz  }t          | j        j        |           t          | |||
|z  z                        t          |||
||           |dk    sJ d S )Nr   r!   r   r}   )r   rH   rB   r   line_search_armijor   r>   r6   )rJ   rB   rv   r)   r1   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DKM-aAr2>>IAr2FA+++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?rF   r"   r   counts    r   r   z3TestLineSearch.test_armijo_terminate_1.<locals>.phi/  ,    !HHHMHHH2QT	>!r   rE   r!   )alpha0rF   )r   r   r   r#   )rJ   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?rF   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!   rE   g?r"   r   s    r   r   z3TestLineSearch.test_wolfe_terminate.<locals>.derphi?  s&    !HHHMHHHq= r   r   rD   r   )r   r   r   r   str)rJ   r   r   rc   rr   s        @r   test_wolfe_terminatez#TestLineSearch.test_wolfe_terminate7  s    	" 	" 	" 	" 	"	! 	! 	! 	! 	! ,b.EF 	? 	?DCES&##a&&$q		::AQ4##aY###8u$$$udm$$$1sFCII>>>>>	? 	?r   N)__name__
__module____qualname__rL   rP   rU   rY   r]   rx   r{   r   r   r   r   r   r   r   r   pytestmarkthread_unsafer   r   r   r   r"   r   r   r@   r@   8   sI                 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   r7   )__doc__numpy.testingr   r   r   r   r   scipy.optimize._linesearchoptimize_linesearchr   r   numpyr/   r   rl   r   r#   r3   r6   r>   r@   r"   r   r   <module>r      sB   . . . . . . . . . . . . . . ( ' ' ' ' ' ' ' ' 8 8 8 8 8 8         E E E E( ( ( (F F F
7 7 77 7 7 7P? P? P? P? P? P? P? P? P? P?r   