o
    `^h,                     @   s   d Z ddlmZmZmZmZmZ ddlm  m	Z
 ddlmZ ddlZddlZddlZddd	Zdd
dZdd Zdd ZdddZG d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                 C   s   || }|d}|d}|| }	d|  d| d| d| d|	 d| }
||||  |  ks4J d|
 t |	t || ksDJ d	|
 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msg r   b/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_linesearch.pyassert_wolfe   s    $r   c                 C   sL   || }|d}d|  d| d| d| }|d||   | ks$J |dS )z-
    Check that Armijo condition applies
    r   r   r   r   r      Nr   )r   r   r   r   r   r   r   r   r   r   assert_armijo   s    r   c                    s2   t |f fddfddd| d S )Nc                        |   S Nr   spfpxr   r   <lambda>(       z#assert_line_wolfe.<locals>.<lambda>c                    s   t  |   S r!   npdotr"   )fprimer&   r'   r   r   r(   )   s    )r   r   )r   )r'   r&   r   r%   r-   kwr   )r%   r-   r&   r'   r   assert_line_wolfe'   s
   
r/   c                    s$   t |fd fddi| d S )Nr   c                    r    r!   r   r"   r$   r   r   r(   -   r)   z$assert_line_armijo.<locals>.<lambda>)r   )r'   r&   r   r%   r.   r   r$   r   assert_line_armijo,   s   $r0   2   c              
   C   s@   z	t | || W dS  ty } z
t| d| |d}~ww )zEAssert two arrays are equal, up to some floating-point rounding error
N)r   AssertionError)r'   yr   nulper   r   r   assert_fp_equal0   s   r7   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zejjdd  Zd!d" Zd#d$ Zd%d& Zd'S )(TestLineSearchc                 C   s^   t | jds
d| j_| j jd7  _| |d  |d  }dd|d   d|d   }||fS )Ncr   r            )hasattrfcountr9   selfr   r&   dpr   r   r   _scalar_func_1:   s   zTestLineSearch._scalar_func_1c                 C   s\   t | jds
d| j_| j jd7  _td| |d  }dtd|  d|  }||fS )Nr9   r   r   r=   )r>   r?   r9   r+   expr@   r   r   r   _scalar_func_2B   s   zTestLineSearch._scalar_func_2c                 C   sN   t | jds
d| j_| j jd7  _td|  }dtd|  }||fS )Nr9   r   r   
   i)r>   r?   r9   r+   sincosr@   r   r   r   _scalar_func_3J   s   zTestLineSearch._scalar_func_3c                 C   s@   t | jds
d| j_| j jd7  _t||}d| }||fS )Nr9   r   r   r=   )r>   r?   r9   r+   r,   rA   r'   r%   dfr   r   r   _line_func_1T   s   zTestLineSearch._line_func_1c                 C   s\   t | jds
d| j_| j jd7  _t|t| j|d }t| j| jj |}||fS )Nr9   r   r   )r>   r?   r9   r+   r,   ATrK   r   r   r   _line_func_2\   s   zTestLineSearch._line_func_2c                 C   s   g | _ g | _d| _t | _dd }tt| D ]5}|dr4t	| |}| j 
|||d||df q|drMt	| |}| j
|||d||df qtjd tj| j| j| _d S )	N   c                    s    fddS )Nc                     s    | i | S r!   r   )ar.   funcidxr   r   r(   n   s    zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>r   rS   r   rS   r   
bind_indexl   s   z/TestLineSearch.setup_method.<locals>.bind_index_scalar_func_r   r   _line_func_  )scalar_funcs
line_funcsN	threadinglocalr?   sorteddir
startswithgetattrappendr+   randomseedrandnrN   )rA   rV   namevaluer   r   r   setup_methodf   s&   




zTestLineSearch.setup_methodc                 c   s8    | j D ]\}}}tjdD ]	}||||fV  qqd S )Nr:   )rZ   r+   rd   rf   )rA   rg   r   r   old_phi0r   r   r   scalar_iter}   s   zTestLineSearch.scalar_iterc           	      c   s    t jd}| jD ]9\}}}d}|dk rC|| j}|| j}t |||dkr,q|d7 }t| }||||||fV  |dk sq
d S )NrY   r   	   r   )r+   rd   RandomStater[   rf   r\   r,   float)	rA   rngrg   r%   r-   kr'   r&   old_fvr   r   r   	line_iter   s   zTestLineSearch.line_iterc           	   	   C   s   d}|   D ]2\}}}}|d7 }t|||d||d\}}}t||d| t|||| t||||d q|dks?J d S )Nr   r   r   r:   )rk   lsscalar_search_wolfe1r7   r   )	rA   r9   rg   r   r   rj   r   r   r   r   r   r   test_scalar_search_wolfe1   s   
z(TestLineSearch.test_scalar_search_wolfe1c           	   	   C   s   |   D ]A\}}}}t|||d||d\}}}}t||d| t|||| |d ur7t|||| t|||| d|dd qd S Nr    grs   )rk   rt   scalar_search_wolfe2r7   r   )	rA   rg   r   r   rj   r   r   r   r   r   r   r   test_scalar_search_wolfe2   s   z(TestLineSearch.test_scalar_search_wolfe2c                 C   sD   dd }dd }t j||dd\}}}}|d u sJ |d u s J d S )Nc                 S   s   | d d S )N   r=   r   alphar   r   r   r         zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phic                 S   s   d| d  S )Nr=   r|   r   r}   r   r   r   r      r   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphigMbP?amaxrt   rz   )rA   r   r   
alpha_star_derphi_starr   r   r   'test_scalar_search_wolfe2_with_low_amax   s
   z6TestLineSearch.test_scalar_search_wolfe2_with_low_amaxc                 C   s4   dd }dd }t ||\}}}}|dk sJ d S )Nc                 S   s<   | dk rdt j d | d  S t dt j d |  t j S Nr   r=   r:   )r+   pirI   r}   r   r   r   r      s   z@TestLineSearch.test_scalar_search_wolfe2_regression.<locals>.phic                 S   sB   | dk rdt j d S dt j d t dt j d |  t j  S r   )r+   r   rH   r}   r   r   r   r      s   ,zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphig      ?r   )rA   r   r   r   r   r   r   r   $test_scalar_search_wolfe2_regression   s   z3TestLineSearch.test_scalar_search_wolfe2_regressionc                 C   s^   |   D ](\}}}}t||d|d\}}t|||| t||| d|dd qd S rw   )rk   rt   scalar_search_armijor7   r   )rA   rg   r   r   rj   r   r   r   r   r   test_scalar_search_armijo   s
   z(TestLineSearch.test_scalar_search_armijoc                 C   s   d}d}|   D ]f\}}}}}}||}	||}
d| j_tj|||||
|	||d\}}}}}}t| jj||  t||| |d u rDqt|||||   t|||||  dd ||k rn|d7 }t||||||d q|dksuJ d S )	Nr   d   r      decimalr   rs   r:   )	rr   r?   r9   rt   line_search_wolfe1r   r7   r   r/   )rA   r9   smaxrg   r%   r-   r'   r&   old_ff0g0r   fcgcfvofvgvr   r   r   test_line_search_wolfe1   s*   z&TestLineSearch.test_line_search_wolfe1c                 C   s*  d}d}|   D ]\}}}}}}||}	||}
d| j_t '}|td |td tj|||||
|	||d\}}}}}}W d    n1 sIw   Y  t| jj||  t	||| t	|||||   |d urzt
|||||  dd ||k r|d7 }t||||||d	 q|d
ksJ d S )Nr   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not converger   r   r   r   rs   r:   )rr   r?   r9   r   filterr   rt   line_search_wolfe2r   r7   r   r/   )rA   r9   r   rg   r%   r-   r'   r&   r   r   r   supr   r   r   r   r   r   r   r   r   test_line_search_wolfe2   s8   z&TestLineSearch.test_line_search_wolfe2c              
   C   s   dd }dd }t ddg}d| }d}tj||||d	|d
\}}}}}}t||||| tttj||||d|d
\}}}}}}|d u sGJ tttj|||||dd d S )Nc                 S   s   t | | S r!   r*   r'   r   r   r   r%     r   z8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fc                 S   s   d|  S )Nr=   r   r   r   r   r   fp  s   z9TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fpr   r   ig      ?   )r   r      r|   )r   maxiter)r+   arrayrt   r   r/   r   r   )rA   r%   r   r&   r'   r   r   r   r   r   r   test_line_search_wolfe2_bounds   s   "
z-TestLineSearch.test_line_search_wolfe2_boundsc                 C   s   d}|   D ]?\}}}}}}||}||}	d| j_t||||	|\}
}}|d7 }t| jj| t||||
|   t|||
||d q|dksLJ d S )Nr   r   rs   rl   )rr   r?   r9   rt   line_search_armijor   r7   r0   )rA   r9   rg   r%   r-   r'   r&   r   r   r   r   r   r   r   r   r   test_line_search_armijo  s   z&TestLineSearch.test_line_search_armijoc                    sR   dg  fdd}t j||dddd\}}t|d t d d t|| d S )Nr   c                    "    d  d7  < |  d| d   S )Nr   r   g{Gz?r=   r   r   countr   r   r   /     z3TestLineSearch.test_armijo_terminate_1.<locals>.phir<   r   )alpha0r=   )rt   r   r   r   )rA   r   r   r   r   r   r   test_armijo_terminate_1*  s   
z&TestLineSearch.test_armijo_terminate_1c                    s    fdd} fdd}t jt jfD ]5}dg ||||dd |d}|d d us/J ||f d dks;J  |ft|d ||t|d qd S )Nc                    r   )Nr   r   g?r=   r   r   r   r   r   r   ;  r   z0TestLineSearch.test_wolfe_terminate.<locals>.phic                    s    d  d7  < dd|   S )Nr   r   r<   g?r   r   r   r   r   r   ?  s   z3TestLineSearch.test_wolfe_terminate.<locals>.derphir   r;   rs   )rt   ru   rz   r   str)rA   r   r   rT   rr   r   r   test_wolfe_terminate7  s   z#TestLineSearch.test_wolfe_terminateN)__name__
__module____qualname__rC   rF   rJ   rM   rP   ri   rk   rr   rv   r{   r   r   r   r   r   pytestmarkthread_unsafer   r   r   r   r   r   r   r   r8   8   s*    



r8   )r   r	   r
   )r   r
   )r
   r1   )__doc__numpy.testingr   r   r   r   r   scipy.optimize._linesearchoptimize_linesearchrt   r   numpyr+   r   r]   r   r   r/   r0   r7   r8   r   r   r   r   <module>   s    



