
    -iiN-                         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dS )z 
Tests for line search routines
    N)assert_equalassert_array_almost_equalassert_array_almost_equal_nulp)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              j/var/www/html/bet.cuttalo.com/ml/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'   r/   kws   `` `` r   assert_line_wolfer1   (   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'   r0   s   `` ` r   assert_line_armijor4   -   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<   1   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                     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;   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 )Nr@   r   r   rD   )rE   rF   r@   r-   exprG   s       r   _scalar_func_2zTestLineSearch._scalar_func_2C   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 )Nr@   r   r   
   i)rE   rF   r@   r-   sincosrG   s       r   _scalar_func_3zTestLineSearch._scalar_func_3K   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 )Nr@   r   r   rD   )rE   rF   r@   r-   r.   rH   r)   r'   dfs       r   _line_func_1zTestLineSearch._line_func_1U   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 )Nr@   r   r   )rE   rF   r@   r-   r.   ATrU   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          }|                    | j        | j        f          | _        d S )N   c                       fdS )Nc                        | i |         S r$   r    )ar0   funcidxs     r   r*   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>o   s    DD!NrNN3$7 r   r    )ra   rb   s   ``r   
bind_indexz/TestLineSearch.setup_method.<locals>.bind_indexm   s    777777r   _scalar_func_r   r   _line_func_i1mI)scalar_funcs
line_funcsN	threadinglocalrF   sorteddir
startswithgetattrappendr-   randomdefault_rngstandard_normalrY   )rH   rc   namevaluerngs        r   setup_methodzTestLineSearch.setup_methodg   s^   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 i##J//$$dfdf%566r   c              #      K   t           j                            d          }| j        D ]&\  }}}|                    d          D ]
}||||fV  'd S )N   {
 rA   )r-   rp   rq   rf   rr   )rH   ru   rs   r   r   old_phi0s         r   scalar_iterzTestLineSearch.scalar_iter   sx      i##J//!%!2 	2 	2D#v//22 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 )Nrx   r   	   r   )r-   rp   rq   rg   rr   rh   r.   float)	rH   ru   rs   r'   r/   kr)   r(   old_fvs	            r   	line_iterzTestLineSearch.line_iter   s      i##J//# 
	4 
	4OD!VAa%%''//''//6!VVAYY''1,,Qs224455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   rA   )rz   lsscalar_search_wolfe1r<   r   )	rH   r@   rs   r   r   ry   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   )rz   r   scalar_search_wolfe2r<   r   )	rH   rs   r   r   ry   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   rD   r    alphas    r   r   zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phi   s    AI!##r   c                     d| dz
  z  S )NrD   r   r    r   s    r   r   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphi   s    	?"r   gMbP?amaxr   r   )rH   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   rD   rA   )r-   pirR   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   rQ   r   s    r   r   zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphi   sP    qyy25y{"25y{RVAbeGAI,=,E%F%FFFr   g      ?r   )rH   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   )rz   r   scalar_search_armijor<   r!   )rH   rs   r   r   ry   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   rA   )	r   rF   r@   r   line_search_wolfe1r   r<   r   r1   rH   r@   smaxrs   r'   r/   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 ]H\  }}}}}} ||          }	 ||          }
d| j        _        t          j                    5  t          j        ddt                     t          j        ddt                     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          ||||||
           J|dk    sJ d S )Nr   i   ignorez3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   r   rA   )r   rF   r@   warningscatch_warningsfilterwarningsr   r   line_search_wolfe2r   r<   r   r1   r   s                    r   test_line_search_wolfe2z&TestLineSearch.test_line_search_wolfe2   s    ,0NN,<,< 	D 	D(D!VQ51BBDKM(** J J'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B>>C	C	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            n# 1 swxY w Y   |J t          j        t                    5  t          j        |||||d
           d d d            d S # 1 swxY w Y   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 )NrD   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   r1   pytestwarnsr   )rH   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)))\+,, 	E 	E!4QAq:< E  E  EAq!Q1	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E yyy \+,, 	A 	A!!RA"a@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As$   1"BB#&B#C//C36C3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   rF   r@   r   line_search_armijor   r<   r4   )rH   r@   rs   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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?rD   r    r   counts    r   r   z3TestLineSearch.test_armijo_terminate_1.<locals>.phi5  ,    !HHHMHHH2QT	>!r   rC   r   )alpha0rD   )r   r   r   r!   )rH   r   r   r   r   s       @r   test_armijo_terminate_1z&TestLineSearch.test_armijo_terminate_10  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?rD   r    r   s    r   r   z0TestLineSearch.test_wolfe_terminate.<locals>.phiA  r   r   c                 4    dxx         dz  cc<   dd| z  z   S )Nr   r   rC   g?r    r   s    r   r   z3TestLineSearch.test_wolfe_terminate.<locals>.derphiE  s&    !HHHMHHHq= r   r   rB   r   )r   r   r   r   str)rH   r   r   ra   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__rJ   rN   rS   rW   r[   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r>   r>   9   s:                 7 7 702 2 24 4 4 
 
 
I I I	# 	# 	#  (B B B  ,  :A A A8    ? ? ? ? ?r   r>   )r   r   r	   )r   r	   )r	   r5   )__doc__r   numpy.testingr   r   r   scipy.optimize._linesearchoptimize_linesearchr   r   numpyr-   r   ri   r   r!   r1   r4   r<   r>   r    r   r   <module>r      s7    ; ; ; ; ; ; ; ; ; ; ' ' ' ' ' ' ' ' ' 8 8 8 8 8 8         E E E E( ( ( (F F F
7 7 77 7 7 7U? U? U? U? U? U? U? U? U? U?r   