U
    »mœ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   ú]/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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>.derphigü©ñÒMbP?©Ú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r„qt|||||  ƒƒ t|||||  ƒdd� ||k r|d7 }t||||||d� q|dksæt‚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	rÜt	|||||  ƒ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sŽt‚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   iÄÿÿÿg      à?é   )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s”t‚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{®Gáz„?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   Únumpyr&   r   r   r*   r+   r/   r0   r   r   r   r   Ú<module>   s   



