o
    Ö­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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   úa/var/www/html/CropPilot/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>.derphigü©ñÒMbP?©Ú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s“J ‚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   iÄÿÿÿg      à?é   )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{®Gáz„?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    



