o
    g'*                     @   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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   sx   || }|d}|d}|| }	d| ||||	|f }
||||  |  ks*J d|
 t |	t || ks:J d|
 dS )z2
    Check that strong Wolfe conditions apply
    r   z@s = %s; phi(0) = %s; phi(s) = %s; phi'(0) = %s; phi'(s) = %s; %szWolfe 1 failed: zWolfe 2 failed: N)abs)sphiderphic1c2err_msgphi1phi0derphi0derphi1msg r   b/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_linesearch.pyassert_wolfe   s    $r   c                 C   s@   || }|d}d| |||f }|d||   | ksJ |dS )z-
    Check that Armijo condition applies
    r   z$s = %s; phi(0) = %s; phi(s) = %s; %s   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   $r,   2   c              
   C   s>   z	t | || W dS  ty } z	td||f |d}~ww )zEAssert two arrays are equal, up to some floating-point rounding errorz%s
%sN)r   AssertionError)r#   yr   nulper   r   r   assert_fp_equal.   s   r2   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dd  Zd!d" Zd#d$ Zd%d& Zd'S )(TestLineSearchc                 C   sH   |  j d7  _ | |d  |d  }dd|d   d|d   }||fS )Nr            )fcountselfr   r"   dpr   r   r   _scalar_func_18   s   zTestLineSearch._scalar_func_1c                 C   sF   |  j d7  _ td| |d  }dtd|  d|  }||fS )Nr   r7   )r8   r'   expr9   r   r   r   _scalar_func_2>   s   zTestLineSearch._scalar_func_2c                 C   s8   |  j d7  _ td|  }dtd|  }||fS )Nr   
   i)r8   r'   sincosr9   r   r   r   _scalar_func_3D   s   zTestLineSearch._scalar_func_3c                 C   s*   |  j d7  _ t||}d| }||fS )Nr   r7   )r8   r'   r(   r:   r#   r!   dfr   r   r   _line_func_1L   s   zTestLineSearch._line_func_1c                 C   sF   |  j d7  _ t|t| j|d }t| j| jj |}||fS )Nr   )r8   r'   r(   ATrD   r   r   r   _line_func_2R   s   zTestLineSearch._line_func_2c                 C   s   g | _ g | _d| _d| _dd }tt| D ]5}|dr2t| |}| j |||d||df q|drKt| |}| j|||d||df qt	j
d t	j
| j| j| _d S )	N   r   c                    s    fddS )Nc                     s    | i | S r   r   )ar*   funcidxr   r   r$   b   s    zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>r   rL   r   rL   r   
bind_index`   s   z/TestLineSearch.setup_method.<locals>.bind_index_scalar_func_r   _line_func_i  )scalar_funcs
line_funcsNr8   sorteddir
startswithgetattrappendr'   randomseedrandnrG   )r:   rO   namevaluer   r   r   setup_methodZ   s&   



zTestLineSearch.setup_methodc                 c   s8    | j D ]\}}}tjdD ]	}||||fV  qqd S )Nr4   )rR   r'   rZ   r\   )r:   r]   r   r   old_phi0r   r   r   scalar_iterq   s   zTestLineSearch.scalar_iterc                 c   s    | j D ]<\}}}d}|dk r@tj| j}tj| j}t|||dkr(q|d7 }ttj }||||||fV  |dk sqd S )Nr   	   r   )rS   r'   rZ   r\   rT   r(   float)r:   r]   r!   r)   kr#   r"   old_fvr   r   r   	line_iterv   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   r4   )ra   lsscalar_search_wolfe1r2   r   )	r:   cr]   r   r   r`   r   r   r   r   r   r   test_scalar_search_wolfe1   s   
z(TestLineSearch.test_scalar_search_wolfe1c           	   	   C   s   |   D ]?\}}}}t|||d||d\}}}}t||d| t|||| |d ur7t|||| t|||d||f d qd S Nr   z%s %grg   )ra   rh   scalar_search_wolfe2r2   r   )	r:   r]   r   r   r`   r   r   r   r   r   r   r   test_scalar_search_wolfe2   s   z(TestLineSearch.test_scalar_search_wolfe2c                 C   s<   dd }dd }t ttj||dd\}}}}|d u sJ d S )Nc                 S   s   | d d S )N   r7   r   alphar   r   r   r         zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phic                 S   s   d| d  S )Nr7   ro   r   rp   r   r   r   r      rr   zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphigMbP?amax)r   r   rh   rm   r:   r   r   r   _r   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   r7   r4   )r'   pirB   rp   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 rx   )r'   rz   rA   rp   r   r   r   r      s   ,zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphig      ?)rh   rm   ru   r   r   r   $test_scalar_search_wolfe2_regression   s   z3TestLineSearch.test_scalar_search_wolfe2_regressionc                 C   sZ   |   D ]&\}}}}t||d|d\}}t|||| t||d||f d qd S rl   )ra   rh   scalar_search_armijor2   r   )r:   r]   r   r   r`   r   r   r   r   r   test_scalar_search_armijo   s
   z(TestLineSearch.test_scalar_search_armijoc                 C   s   d}d}|   D ]d\}}}}}}||}	||}
d| _tj|||||
|	||d\}}}}}}t| j||  t||| |d u rBqt|||||   t|||||  dd ||k rl|d7 }t||||||d q|dkssJ d S )	Nr   d   rs      decimalr   rg   r4   )rf   r8   rh   line_search_wolfe1r   r2   r   r+   )r:   rj   smaxr]   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| _t '}|td |td tj|||||
|	||d\}}}}}}W d    n1 sHw   Y  t| j||  t||| t|||||   |d urxt	|||||  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 convergers   r   r   r   rg   r4   )rf   r8   r   filterr   rh   line_search_wolfe2r   r2   r   r+   )r:   rj   r   r]   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$      s    z?TestLineSearch.test_line_search_wolfe2_bounds.<locals>.<lambda>c                 S   s   d|  S )Nr7   r   r   r   r   r   r$      s    r   r   ig      ?   )rt   r      ro   )r   maxiter)r'   arrayrh   r   r+   r   r   )r:   r!   fpr"   r#   r   r   rv   r   r   r   test_line_search_wolfe2_bounds   s   "
z-TestLineSearch.test_line_search_wolfe2_boundsc                 C   s   d}|   D ]=\}}}}}}||}||}	d| _t||||	|\}
}}|d7 }t| j| t||||
|   t|||
||d q|dksJJ d S )Nr   r   rg   rb   )rf   r8   rh   line_search_armijor   r2   r,   )r:   rj   r]   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?r7   r   r   countr   r   r        z3TestLineSearch.test_armijo_terminate_1.<locals>.phir6   r   )alpha0r7   )rh   r|   r   r   )r:   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?r7   r   r   r   r   r   r   +  r   z0TestLineSearch.test_wolfe_terminate.<locals>.phic                    s    d  d7  < dd|   S )Nr   r   r6   g?r   r   r   r   r   r   /  s   z3TestLineSearch.test_wolfe_terminate.<locals>.derphir   r5   rg   )rh   ri   rm   r   str)r:   r   r   rM   rr   r   r   test_wolfe_terminate'  s   z#TestLineSearch.test_wolfe_terminateN)__name__
__module____qualname__r<   r?   rC   rF   rI   r_   ra   rf   rk   rn   rw   r{   r}   r   r   r   r   r   r   r   r   r   r   r3   6   s(    
r3   )r   r	   r
   )r   r
   )r
   r-   )__doc__numpy.testingr   r   r   r   r   scipy.optimize._linesearchoptimize_linesearchrh   r   numpyr'   r   r   r+   r,   r2   r3   r   r   r   r   <module>   s    



