U
    /d'*                     @   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sTt d|
 t|	t|| kstt 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)AssertionErrorabs)sphiderphic1c2err_msgphi1phi0Zderphi0derphi1msg r   H/tmp/pip-unpacked-wheel-9gxwnfpp/scipy/optimize/tests/test_linesearch.pyassert_wolfe   s          r   c                 C   s@   || }|d}d| |||f }|d||   | ks<t |dS )z-
    Check that Armijo condition applies
    r   z$s = %s; phi(0) = %s; phi(s) = %s; %s   N)r   )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    |   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#   '   r$   )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                    s    |   S 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   sJ   zt | || W n4 tk
rD } ztd||f |W 5 d}~X Y nX dS )zEAssert two arrays are equal, up to some floating-point rounding errorz%s
%sN)r   r   )r"   yr   Znulper   r   r   assert_fp_equal.   s    r/   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!   Z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   r4   )r5   r&   expr6   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)r5   r&   sincosr6   r   r   r   _scalar_func_3D   s    zTestLineSearch._scalar_func_3c                 C   s*   |  j d7  _ t||}d| }||fS )Nr   r4   )r5   r&   r'   r7   r"   r    Z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   )r5   r&   r'   ATr@   r   r   r   _line_func_2R   s    zTestLineSearch._line_func_2c                 C   s   g | _ g | _d| _d| _dd }tt| D ]j}|drdt| |}| j |||d||df q,|dr,t| |}| j|||d||df q,t	j
d t	j
| j| j| _d S )	N   r   c                    s    fddS )Nc                     s    | | S r   r   )ar)   funcidxr   r   r#   b   r$   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>r   rG   r   rG   r   
bind_index`   s    z/TestLineSearch.setup_method.<locals>.bind_indexZ_scalar_func_r   Z_line_func_i  )scalar_funcs
line_funcsNr5   sorteddir
startswithgetattrappendr&   randomseedrandnrB   )r7   rJ   namevaluer   r   r   setup_methodZ   s$    



zTestLineSearch.setup_methodc                 c   s6   | j D ]*\}}}tjdD ]}||||fV  qqd S )Nr1   )rK   r&   rS   rU   )r7   rV   r   r   old_phi0r   r   r   scalar_iterq   s    zTestLineSearch.scalar_iterc                 c   s~   | j D ]r\}}}d}|dk rtj| j}tj| j}t|||dkrNq|d7 }ttj }||||||fV  qqd S )Nr   	   r   )rL   r&   rS   rU   rM   r'   float)r7   rV   r    r(   kr"   r!   Zold_fvr   r   r   	line_iterv   s    zTestLineSearch.line_iterc           	   	   C   s   d}|   D ]d\}}}}|d7 }t|||d||d\}}}t||d| t|||| t||||d q|dks~td S )Nr   r   r   r1   )rZ   lsscalar_search_wolfe1r/   r   r   )	r7   crV   r   r   rY   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 k	rnt|||| t|||d||f d qd S Nr   z%s %gr_   )rZ   r`   scalar_search_wolfe2r/   r   )	r7   rV   r   r   rY   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 ks8td S )Nc                 S   s   | d d S )N   r4   r   alphar   r   r   r      s    zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phic                 S   s   d| d  S )Nr4   rg   r   rh   r   r   r   r      s    zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphigMbP?amax)r   r   r`   re   r   r7   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 s0td S )Nc                 S   s@   | dk rdt j d | d  S t dt j d |  t j S d S Nr   r4   r1   )r&   pir>   rh   r   r   r   r      s    z@TestLineSearch.test_scalar_search_wolfe2_regression.<locals>.phic                 S   sF   | dk rdt j d S dt j d t dt j d |  t j  S d S ro   )r&   rq   r=   rh   r   r   r   r      s    zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphig      ?)r`   re   r   rl   r   r   r   $test_scalar_search_wolfe2_regression   s    z3TestLineSearch.test_scalar_search_wolfe2_regressionc                 C   sZ   |   D ]L\}}}}t||d|d\}}t|||| t||d||f d qd S rd   )rZ   r`   scalar_search_armijor/   r   )r7   rV   r   r   rY   r   r   r   r   r   test_scalar_search_armijo   s    z(TestLineSearch.test_scalar_search_armijoc                 C   s   d}d}|   D ]\}}}}}}||}	||}
d| _tj|||||
|	||d\}}}}}}t| j||  t||| |d krqt|||||   t|||||  dd ||k r|d7 }t||||||d q|dkstd S )	Nr   d   rj      decimalr   r_   r1   )	r^   r5   r`   Zline_search_wolfe1r   r/   r   r*   r   )r7   rb   smaxrV   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 D}|td |td tj|||||
|	||d\}}}}}}W 5 Q R X t| j||  t||| t|||||   |d k	rt	|||||  dd ||k r|d7 }t
||||||d	 q|d
kstd S )Nr   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not convergerj   rv   rw   r   r_   r1   )r^   r5   r   filterr   r`   line_search_wolfe2r   r/   r   r*   r   )r7   rb   ry   rV   r    r(   r"   r!   rz   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 ksttttj|||||dd d S )Nc                 S   s   t | | S r   r%   r"   r   r   r   r#      r$   z?TestLineSearch.test_line_search_wolfe2_bounds.<locals>.<lambda>c                 S   s   d|  S )Nr4   r   r   r   r   r   r#      r$   r   r   ig      ?   )rk   r      rg   )r   maxiter)r&   arrayr`   r   r*   r   r   r   )r7   r    fpr!   r"   r   r   rm   r   r   r   test_line_search_wolfe2_bounds   s*    "      z-TestLineSearch.test_line_search_wolfe2_boundsc                 C   s   d}|   D ]z\}}}}}}||}||}	d| _t||||	|\}
}}|d7 }t| j| t||||
|   t|||
||d q|dkstd S )Nr   r   r_   r[   )r^   r5   r`   Zline_search_armijor   r/   r+   r   )r7   rb   rV   r    r(   r"   r!   rz   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                    s"    d  d7  < |  d| d   S )Nr   r   g{Gz?r4   r   r   countr   r   r     s    z3TestLineSearch.test_armijo_terminate_1.<locals>.phir3   r   )Zalpha0r4   )r`   rs   r   r   )r7   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 ]j}dg ||||dd |d}|d d k	s^t||f d dksvt |ft|d ||t|d q$d S )Nc                    s"    d  d7  < |  d| d   S )Nr   r   g?r4   r   r   r   r   r   r   +  s    z0TestLineSearch.test_wolfe_terminate.<locals>.phic                    s    d  d7  < dd|   S )Nr   r   r3   g?r   r   r   r   r   r   /  s    z3TestLineSearch.test_wolfe_terminate.<locals>.derphir   r2   r_   )r`   ra   re   r   r   str)r7   r   r   rH   rr   r   r   test_wolfe_terminate'  s    z#TestLineSearch.test_wolfe_terminateN)__name__
__module____qualname__r8   r;   r?   rA   rD   rX   rZ   r^   rc   rf   rn   rr   rt   r   r   r   r   r   r   r   r   r   r   r0   6   s&   
r0   )r   r	   r
   )r   r
   )r
   r,   )__doc__Znumpy.testingr   r   r   r   r   Zscipy.optimize._linesearchoptimizeZ_linesearchr`   r   Znumpyr&   r   r   r*   r+   r/   r0   r   r   r   r   <module>   s   



