a
    ‡ù»jÞ+  ã                   @   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   sŒ   || ƒ}|dƒ}|dƒ}|| ƒ}	d| › d|› d|› d|› d|	› d|› �}
||||  |  kshJ d|
 ƒ‚t |	ƒt || ƒksˆJ 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Úphi0Zderphi0Úderphi1Úmsg© r   úJE:\soccer\ml_env\Lib\site-packages\scipy/optimize/tests/test_linesearch.pyÚassert_wolfe   s    ÿÿ r   c                 C   sL   || ƒ}|dƒ}d| › d|› d|› d|› �}|d||   | ksHJ |ƒ‚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   ˆ ˆˆ|   ƒ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   sN   zt | ||ƒ W n8 tyH } z t|› d|› �ƒ|‚W Y d}~n
d}~0 0 dS )zEAssert two arrays are equal, up to some floating-point rounding errorÚ
N)r   ÚAssertionError)r%   Úyr   ZnulpÚer   r   r   Úassert_fp_equal.   s    r4   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   éüÿÿÿr9   )r:   r)   Úexpr;   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öÿÿÿ)r:   r)   ÚsinÚcosr;   r   r   r   Ú_scalar_func_3D   s    zTestLineSearch._scalar_func_3c                 C   s*   |  j d7  _ t ||¡}d| }||fS )Nr   r9   )r:   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   )r:   r)   r*   ÚAÚTrE   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   ˆ | i |¤Žˆ S r   r   )Úar,   ©ÚfuncÚidxr   r   r&   b   r'   zATestLineSearch.setup_method.<locals>.bind_index.<locals>.<lambda>r   rM   r   rM   r   Ú
bind_index`   s    z/TestLineSearch.setup_method.<locals>.bind_indexZ_scalar_func_r   Z_line_func_iÒ  )Úscalar_funcsÚ
line_funcsÚNr:   ÚsortedÚdirÚ
startswithÚgetattrÚappendr)   ÚrandomÚseedÚrandnrH   )r<   rP   Ú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 )Nr6   )rQ   r)   rY   r[   )r<   r\   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   )rR   r)   rY   r[   rS   r*   Úfloat)r<   r\   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~J ‚d S )Nr   r   ©r   r6   )r`   ÚlsÚscalar_search_wolfe1r4   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rnt|||ƒ|ƒ t||||› d|d›�d� qd S ©Nr   ú Úgre   )r`   rf   Úscalar_search_wolfe2r4   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   sD   dd„ }dd„ }t j||dd�\}}}}|d u s4J ‚|d u s@J ‚d S )Nc                 S   s   | d d S )Né   r9   r   ©Úalphar   r   r   r   œ   s    zCTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.phic                 S   s   d| d  S )Nr9   ro   r   rp   r   r   r   r   Ÿ   s    zFTestLineSearch.test_scalar_search_wolfe2_with_low_amax.<locals>.derphigü©ñÒMbP?©Úamax©rf   rm   )r<   r   r   Z
alpha_starÚ_Z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 s0J ‚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   éýÿÿÿr9   r6   )r)   ÚpirC   rp   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 rw   )r)   ry   rB   rp   r   r   r   r   ¯   s    zCTestLineSearch.test_scalar_search_wolfe2_regression.<locals>.derphig      ø?rt   )r<   r   r   r   ru   r   r   r   Ú$test_scalar_search_wolfe2_regression¦   s    z3TestLineSearch.test_scalar_search_wolfe2_regressionc                 C   s^   |   ¡ D ]P\}}}}t ||dƒ|dƒ¡\}}t|||ƒ|ƒ t|||› d|d›�d� qd S rj   )r`   rf   Úscalar_search_armijor4   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| _tj|||||
|	||d�\}}}}}}t| j|| ƒ t|||ƒƒ |d u r„qt|||||  ƒƒ t|||||  ƒdd� ||k r|d7 }t||||||d� q|dksæJ ‚d S )	Nr   éd   rr   é   ©Údecimalr   re   r6   )rd   r:   rf   Zline_search_wolfe1r   r4   r   r-   )r<   rh   Ú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ƒ �N}| td¡ | td¡ tj|||||
|	||d�\}}}}}}W d   ƒ n1 s’0    Y  t| j|| ƒ t|||ƒƒ t|||||  ƒƒ |d uròt	|||||  ƒdd� ||k r|d7 }t
||||||d	� q|d
k�s&J ‚d S )Nr   i   z3The line search algorithm could not find a solutionz*The line search algorithm did not convergerr   r~   r   r   re   r6   )rd   r:   r   Úfilterr   rf   Úline_search_wolfe2r   r4   r   r-   )r<   rh   r�   r\   r#   r+   r%   r$   r‚   rƒ   r„   Úsupr   r…   r†   r‡   rˆ   r‰   r   r   r   Útest_line_search_wolfe2Ø   s4    ÿÿþ0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 sŽJ ‚tttj|||||dd� d S )Nc                 S   s   t  | | ¡S r   r(   ©r%   r   r   r   r#   ÷   s    z8TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fc                 S   s   d|  S )Nr9   r   r�   r   r   r   Úfpù   s    z9TestLineSearch.test_line_search_wolfe2_bounds.<locals>.fpr   r   iÄÿÿÿg      à?é   )rs   r   é   ro   )r   Úmaxiter)r)   Úarrayrf   rŒ   r-   r   r   )r<   r#   r�   r$   r%   r   r   ru   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s”J ‚d S )Nr   r   re   ra   )rd   r:   rf   Zline_search_armijor   r4   r.   )r<   rh   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                    s"   ˆ d  d7  < |  d| d   S )Nr   r   g{®Gáz„?r9   r   ©r   ©Úcountr   r   r   !  s    z3TestLineSearch.test_armijo_terminate_1.<locals>.phir8   r   )Zalpha0r9   )rf   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 ]j}dg‰ ||||dƒd |dƒƒ}|d d us^J ||fƒ‚ˆ d dksvJ ˆ |fƒ‚t|d ||t|ƒd� q$d S )Nc                    s"   ˆ d  d7  < |  d| d   S )Nr   r   gš™™™™™©?r9   r   r—   r˜   r   r   r   -  s    z0TestLineSearch.test_wolfe_terminate.<locals>.phic                    s   ˆ d  d7  < dd|   S )Nr   r   r8   gš™™™™™¹?r   r—   r˜   r   r   r   1  s    z3TestLineSearch.test_wolfe_terminate.<locals>.derphir   r7   re   )rf   rg   rm   r   Ústr)r<   r   r   rN   Úrr   r˜   r   Útest_wolfe_terminate)  s    z#TestLineSearch.test_wolfe_terminateN)Ú__name__Ú
__module__Ú__qualname__r=   r@   rD   rG   rJ   r^   r`   rd   ri   rn   rv   rz   r|   rŠ   rŽ   r•   r–   rš   r�   r   r   r   r   r5   6   s&   
r5   )r   r	   r
   )r   r
   )r
   r/   )Ú__doc__Znumpy.testingr   r   r   r   r   Zscipy.optimize._linesearchÚoptimizeZ_linesearchrf   r   Únumpyr)   r   r   r-   r.   r4   r5   r   r   r   r   Ú<module>   s   



