a
    ‡ù»j¦}  ã                   @   sÌ   d dl Z d dlmZ d dlZd dlmZmZmZ d dl	m
Z d dlmZmZmZ d dlmZmZmZmZmZmZ dd„ Zd	d
„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ Zdd„ ZdS )é    N)Úproduct)Úassert_allcloseÚassert_equalÚassert_)Úraises)Ú
csr_matrixÚ
csc_matrixÚ
lil_matrix)Ú_adjust_scheme_to_boundsÚapprox_derivativeÚcheck_derivativeÚgroup_columnsÚ_eps_for_methodÚ_compute_absolute_stepc                  C   s¾   g d¢g d¢g d¢g d¢g d¢g d¢g d¢g} t jtttfD ]b}|| ƒ}t  d¡}t  g d	¢¡}t||ƒ}t||ƒ g d
¢}t  g d¢¡}t||ƒ}t||ƒ q<t|ƒ}t|ƒ}t||ƒ d S )N)é   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   é   )r   r   é   r   r   r   )r   r   é   é   é   r   )r   r   r   r   r   r   )	ÚnpÚasarrayr   r   r	   ÚarangeÚarrayr   r   )Ú	structureZ	transformÚAÚorderZgroups_trueÚgroupsÚgroups_1Úgroups_2© r    úHE:\soccer\ml_env\Lib\site-packages\scipy/optimize/tests/test__numdiff.pyÚtest_group_columns   s*    ù	



r"   c                  C   sæ   t  t j¡j} | d | d | d dœ}dD ]8}ttt jt j|ƒ|| ƒ ttt jt j|ƒ|| ƒ q*t  t j¡j} | d | d | d dœ}dD ]R}ttt jt j|ƒ|| ƒ ttt jt j|ƒ|| ƒ ttt jt j|ƒ|| ƒ qŽd S )Nç      à?çUUUUUUÕ?©ú2-pointz3-pointÚcs)r   ÚfinfoÚfloat64Úepsr   r   Z
complex128Úfloat32)ÚEPSÚrelative_stepÚmethodr    r    r!   Útest_correct_fp_eps+   s@    þþþþþþþr/   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestAdjustSchemeToBoundsc                 C   s  t  d¡}t  dd¡}t  |¡}t  |¡}| t j ¡ | t j¡ t||dd||ƒ\}}t||ƒ tt  	|¡ƒ t||dd||ƒ\}}t||ƒ tt  	|¡ƒ t||dd||ƒ\}}t||ƒ tt  	| ¡ƒ t||dd||ƒ\}}t||ƒ tt  	| ¡ƒ d S )Nr   ç{®Gáz„?r   ú1-sidedr   ú2-sided)
r   ÚzerosÚfullZ
empty_likeÚfillÚinfr
   r   r   Úall)ÚselfÚx0ÚhZ	inf_lowerZ	inf_upperÚ
h_adjustedÚ	one_sidedr    r    r!   Útest_no_boundsP   s4    


ÿ
ÿ
ÿ
ÿ
z'TestAdjustSchemeToBounds.test_no_boundsc                 C   s   t  g d¢¡}t  d¡ }t  d¡}t  g d¢¡d }t||dd||ƒ\}}t||ƒ t||dd||ƒ\}}t|t  g d¢¡d ƒ t||dd	||ƒ\}}t|t  |¡ƒ tt  | ¡ƒ t||dd	||ƒ\}}t|t  g d¢¡d ƒ t|t  g d
¢¡ƒ d S )N)ç        g333333ë?g333333ë¿r   )r   r   éÿÿÿÿçš™™™™™¹?r   r2   r   )r   r@   r   r3   )FTT)	r   r   Úonesr
   r   Úabsr   r8   r   )r9   r:   ÚlbÚubr;   r<   Ú_r=   r    r    r!   Útest_with_boundl   s$    

ÿÿz(TestAdjustSchemeToBounds.test_with_boundc                 C   s  t  ddg¡}t  ddg¡}t  ddg¡}t  ddg¡}t||dd||ƒ\}}t|t  ddg¡ƒ t||d	d||ƒ\}}t|t  d
dg¡ƒ t||dd||ƒ\}}t|t  ddg¡ƒ t|t  ddg¡ƒ t||d	d||ƒ\}}t|t  ddg¡ƒ t|t  ddg¡ƒ d S )Ng¸…ëQ¸ž¿gš™™™™™©?r?   g¸…ëQ¸ž?çš™™™™™¹¿r   r2   g¸…ëQ¸®¿r   gš™™™™™™?r3   FTg¸…ëQ¸Ž?g¸…ëQ¸Ž¿)r   r   r
   r   r   )r9   rD   rE   r:   r;   r<   rF   r=   r    r    r!   Útest_tight_bounds‚   s$    ÿÿz*TestAdjustSchemeToBounds.test_tight_boundsN)Ú__name__Ú
__module__Ú__qualname__r>   rG   rI   r    r    r    r!   r0   O   s   r0   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dDdd„ZdEd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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dAdB„ Z"dCS )FÚTestApproxDerivativesDensec                 C   s
   t  |¡S ©N©r   Úsinh©r9   Úxr    r    r!   Úfun_scalar_scalarš   s    z,TestApproxDerivativesDense.fun_scalar_scalarc                 C   s
   t  |¡S rN   ©r   ÚcoshrQ   r    r    r!   Újac_scalar_scalar�   s    z,TestApproxDerivativesDense.jac_scalar_scalarc                 C   s,   t  |d d t  |d ¡t  |d ¡g¡S ©Nr   r   ©r   r   ÚtanÚexprQ   r    r    r!   Úfun_scalar_vector    s    z,TestApproxDerivativesDense.fun_scalar_vectorc                 C   s8   t  d|d  t  |d ¡d t  |d ¡g¡ dd¡S ©Nr   r   éþÿÿÿr@   r   ©r   r   ÚcosrZ   ZreshaperQ   r    r    r!   Újac_scalar_vector£   s
    (ÿÿz,TestApproxDerivativesDense.jac_scalar_vectorc                 C   s$   t  |d |d  ¡t  |d ¡ S ©Nr   r   ©r   ÚsinÚlogrQ   r    r    r!   Úfun_vector_scalar§   s    z,TestApproxDerivativesDense.fun_vector_scalarc                 C   s    t  |d t  |¡t  |¡g¡S ©Nr   rX   rQ   r    r    r!   Úwrong_dimensions_funª   s    z/TestApproxDerivativesDense.wrong_dimensions_func              	   C   s|   t  |d t  |d |d  ¡ t  |d ¡ t  |d |d  ¡|d   |d t  |d |d  ¡ t  |d ¡ g¡S ©Nr   r   ©r   r   r_   rd   rc   rQ   r    r    r!   Újac_vector_scalar­   s    *ÿ*ýz,TestApproxDerivativesDense.jac_vector_scalarc                 C   sH   t  |d t  |d ¡ |d t  |d ¡ |d d |d d  g¡S ©Nr   r   r   ç      à¿©r   r   rc   r_   rQ   r    r    r!   Úfun_vector_vector´   s
    ýz,TestApproxDerivativesDense.fun_vector_vectorc                 C   s†   t  t  |d ¡|d t  |d ¡ g|d  t  |d ¡ t  |d ¡gd|d d  |d d  d|d d  |d d  gg¡S ©Nr   r   r   r   rl   g      ø¿rm   rQ   r    r    r!   Újac_vector_vector»   s
    "$6ýz,TestApproxDerivativesDense.jac_vector_vectorç      ð?c                 C   s*   t  t  ||d  ¡t  ||d  ¡g¡S ra   ©r   r   rZ   ©r9   rR   Úc0Úc1r    r    r!   Úfun_parametrizedÂ   s    z+TestApproxDerivativesDense.fun_parametrizedrA   c              
   C   s:   t  |t  ||d  ¡ dgd|t  ||d  ¡ gg¡S ra   rr   rs   r    r    r!   Újac_parametrizedÅ   s    þz+TestApproxDerivativesDense.jac_parametrizedc                 C   s   t  |¡dkr|S t jS )Nç:Œ0âŽyE>©r   rC   ÚnanrQ   r    r    r!   Úfun_with_nanË   s    z'TestApproxDerivativesDense.fun_with_nanc                 C   s   t  |¡dkrdS t jS )Nrx   rq   ry   rQ   r    r    r!   Újac_with_nanÎ   s    z'TestApproxDerivativesDense.jac_with_nanc                 C   s,   t  |d |d  t  |d |d  ¡g¡S ra   )r   r   r_   rQ   r    r    r!   Úfun_zero_jacobianÑ   s    z,TestApproxDerivativesDense.fun_zero_jacobianc              
   C   sV   t  |d |d g|d  t  |d |d  ¡ |d  t  |d |d  ¡ gg¡S rh   )r   r   rc   rQ   r    r    r!   Újac_zero_jacobianÔ   s    >þz,TestApproxDerivativesDense.jac_zero_jacobianc                 C   s   t  |¡ ¡ }t |¡S rN   )r   r   ÚitemÚmathrZ   )r9   rR   Zxpr    r    r!   Újac_non_numpyÚ   s    z(TestApproxDerivativesDense.jac_non_numpyc                 C   sh   d}t | j|dd�}t | j|ƒ}t | j|dd�}|  |¡}t||dd� t||dd� t||dd� d S )	Nrq   r&   ©r.   r'   ç�íµ ÷Æ°>©Úrtolç•Ö&è.>çê-�™—q=©r   rS   rV   r   ©r9   r:   Ú
jac_diff_2Ú
jac_diff_3Ú
jac_diff_4Újac_truer    r    r!   Útest_scalar_scalarà   s    ÿÿ
z-TestApproxDerivativesDense.test_scalar_scalarc                 C   sp   d}t | j|ddd�}t | j|dd�}t | j|ddd�}|  |¡}t||dd� t||d	d� t||d
d� d S )Nrq   r&   çÛ"•“\ÿO>©r.   Úabs_step)r‘   r'   rƒ   r„   r†   r‡   rˆ   r‰   r    r    r!   Útest_scalar_scalar_abs_stepì   s    ÿÿÿ
z6TestApproxDerivativesDense.test_scalar_scalar_abs_stepc                 C   sn   d}t | j|dd�}t | j|ƒ}t | j|dd�}|  t |¡¡}t||dd� t||dd� t||dd� d S )	Nr#   r&   r‚   r'   rƒ   r„   r†   r‡   )r   r[   r`   r   Ú
atleast_1dr   r‰   r    r    r!   Útest_scalar_vectorú   s    ÿÿz-TestApproxDerivativesDense.test_scalar_vectorc                 C   sr   t  ddg¡}t| j|dd�}t| j|ƒ}t| j|dd�}|  |¡}t||dd� t||dd� t||d	d� d S )
Nç      Y@rl   r&   r‚   r'   rƒ   r„   çH¯¼šò×z>r‡   )r   r   r   re   rj   r   r‰   r    r    r!   Útest_vector_scalar  s    ÿÿ
z-TestApproxDerivativesDense.test_vector_scalarc                 C   s~   t  ddg¡}t| j|ddd�}t| j|dt jd�}t| j|ddd�}|  |¡}t||dd	� t||d
d	� t||dd	� d S )Nr•   rl   r&   r�   r�   )r‘   Úrel_stepr'   rƒ   r„   çßA:ÜÅ)>r‡   )r   r   r   re   r7   rj   r   r‰   r    r    r!   Útest_vector_scalar_abs_step  s    ÿÿÿ
z6TestApproxDerivativesDense.test_vector_scalar_abs_stepc                 C   sr   t  ddg¡}t| j|dd�}t| j|ƒ}t| j|dd�}|  |¡}t||dd� t||dd� t||d	d� d S )
Nç      YÀçš™™™™™É?r&   r‚   r'   çñhãˆµøä>r„   rƒ   r‡   ©r   r   r   rn   rp   r   r‰   r    r    r!   Útest_vector_vector   s    ÿÿ
z-TestApproxDerivativesDense.test_vector_vectorc                 C   s<   d}t tt| j|ƒ |  t |¡¡}t tt| j||d� d S )Nrq   )Úf0)Úassert_raisesÚRuntimeErrorr   rg   r   r“   Ú
ValueError)r9   r:   r    r    r    r!   Útest_wrong_dimensions,  s    ÿÿz0TestApproxDerivativesDense.test_wrong_dimensionsc                 C   sZ   t  ddg¡}t| j|ddd�}t| j|dd�}|  |¡}t||dd� t||dd� d S )	NrH   rA   r&   g-Cëâ6?)r.   r˜   )r˜   r1   r„   rž   )r9   r:   rŠ   r‹   r�   r    r    r!   Útest_custom_rel_step4  s    ÿÿ
z/TestApproxDerivativesDense.test_custom_rel_stepc              
   C   s´   t  ddg¡}d}d}d}d}| j|||d�}t  ddg¡}|  |||¡}t| j|d|||ft|d�||fd	�}	t| j||||ft|d�||fd
�}
t|	|dd� t|
|dd� d S )Nrq   ç      ð¿r?   ç       @)ru   g�íµ ÷Æ°¾r–   r&   )r.   r˜   r    ÚargsÚkwargsÚbounds)r˜   r    r¨   r©   rª   rƒ   r„   r†   )r   r   rv   rw   r   Údictr   )r9   r:   rt   ru   rD   rE   r    r˜   r�   rŠ   r‹   r    r    r!   Útest_options>  s$    
þþz'TestApproxDerivativesDense.test_optionsc                 C   s|   t  d¡ }t  d¡}t  ddg¡}ttt| j|||fd� t  ddg¡}t| j|d||fd�}|  |¡}t||d	d
� d S )Nr   g       Àrœ   ©rª   r¦   rq   r&   ©r.   rª   rƒ   r„   )	r   rB   r   r¡   r£   r   rn   rp   r   )r9   rD   rE   r:   Újac_diffr�   r    r    r!   Útest_with_bounds_2_pointP  s    
ÿÿ
z3TestApproxDerivativesDense.test_with_bounds_2_pointc                 C   s¾   t  ddg¡}t  ddg¡}t  ddg¡}|  |¡}t| j|ƒ}t||dd� t| j||t jfd�}t||dd� t| j|t j |fd�}t||dd� t| j|||fd�}t||dd� d S )Nrq   r§   r†   r„   r­   )r   r   rp   r   rn   r   r7   )r9   rD   rE   r:   r�   r¯   r    r    r!   Útest_with_bounds_3_point^  s$    
ÿ
ÿÿz3TestApproxDerivativesDense.test_with_bounds_3_pointc                 C   s¼   t  ddg¡}|d }|d }|  |¡}t| j|d||fd�}t||dd� t| j|dd||fd�}t||dd� t| j|||fd	�}t||dd� t| j|d||fd
�}t||dd� d S )Ng      $@r™   g•Ö&è.!>r&   r®   rƒ   r„   ©r.   r˜   rª   r­   ©r˜   rª   )r   r   rp   r   rn   r   )r9   r:   rD   rE   r�   r¯   r    r    r!   rI   t  s*    
ÿþÿÿz,TestApproxDerivativesDense.test_tight_boundsc                 C   s¼   d}d}d}|   |¡}t| j|dd||fd�}t| j|d||fd�}t||dd� t||d	d� d}|   |¡}t| j|dd||fd�}t| j|d||fd�}t||dd� t||d	d� d S )
Nç:Œ0âŽyE¾rx   r?   r&   rƒ   r²   r³   r„   r†   )r|   r   r{   r   )r9   rD   rE   r:   r�   rŠ   r‹   r    r    r!   Útest_bound_switchesˆ  s0    

þÿ

þÿz.TestApproxDerivativesDense.test_bound_switchesc                 C   sh   d}|   |¡}t| j |dd�}t| j |ƒ}t||dd� t||dd� ttt| j |fi tdd�¤Ž d S )Nrq   r&   r‚   rƒ   r„   rx   r'   )r�   r   r   r¡   Ú	TypeErrorr«   )r9   r:   r�   rŠ   r‹   r    r    r!   Útest_non_numpyŸ  s    
ÿÿz)TestApproxDerivativesDense.test_non_numpyc                    s„  t j d¡ dd„ ‰‡fdd„‰ t jdddt jd�‰t j d¡ t j¡‰t  d	d	g¡}tˆ |d
ˆˆfd�}tˆ | t j¡d
ˆˆfd�}ˆ |ˆˆƒj	t jksžJ ‚t
||dd� ‡ ‡‡fdd„}t|| t j¡d
d�}t
||dd� dd„ }dd„ }dd„ }dd„ }t jt jt jfD ]n}	t  |	¡j}
t  d¡ |	¡}td |||ƒd
ƒ}||||||
ƒ}t||d
|d�||ƒ ‰ tˆ ƒ|k �sJ ‚�qd S )Nr   c                 S   s   | d | d |  S ra   r    )ÚprR   r    r    r!   Úfunc±  s    z0TestApproxDerivativesDense.test_fp.<locals>.funcc                    s   ˆ | |ƒ| S rN   r    )r¸   rR   Úy)r¹   r    r!   Úerr´  s    z/TestApproxDerivativesDense.test_fp.<locals>.errr   éd   ©Údtyper¦   r&   )r.   r¨   gü©ñÒMbP?)Úatolc                    s$   | j tjksJ ‚ˆ | ˆˆƒ tj¡S rN   )r¾   r   r+   Úastype)r¸   )r»   rR   rº   r    r!   Úerr_fp32Ä  s    z4TestApproxDerivativesDense.test_fp.<locals>.err_fp32r‚   c                 S   s
   t  | ¡S rN   ©r   rc   ©rR   r    r    r!   ÚfÍ  s    z-TestApproxDerivativesDense.test_fp.<locals>.fc                 S   s
   t  | ¡S rN   )r   r_   rÃ   r    r    r!   ÚgÏ  s    z-TestApproxDerivativesDense.test_fp.<locals>.gc                 S   s   t  | ¡ S rN   rÂ   rÃ   r    r    r!   ÚhessÑ  s    z0TestApproxDerivativesDense.test_fp.<locals>.hessc                 S   s\   | d t t ||ƒ¡t |||  ƒ¡ƒ }||  t t ||ƒ¡t |||  ƒ¡ƒ }|| S rf   )Úmaxr   rC   )r;   r:   rÄ   rÆ   r,   Út0Út1r    r    r!   Ú	calc_atolÔ  s    **z5TestApproxDerivativesDense.test_fp.<locals>.calc_atolrq   r�   )r   ÚrandomÚseedZlinspacer)   rÀ   r   r   r+   r¾   r   Zfloat16r(   r*   r   rC   )r9   Úp0Zjac_fp64Zjac_fprÁ   rÄ   rÅ   rÆ   rÊ   r¾   r,   r:   r;   r¿   r    )r»   r¹   rR   rº   r!   Útest_fp¬  s@    ÿÿ	ÿÿz"TestApproxDerivativesDense.test_fpc                 C   s�   t  ddg¡}t| j| j|ƒ}t|dk ƒ t| j| j|ƒ}t|dk ƒ t  ddg¡}t| j| j|ƒ}t|dkƒ t| j| j|ƒ}t|dkƒ d S )Ng      $Àé
   r†   rƒ   r?   r   )r   r   r   rn   rp   r   r}   r~   )r9   r:   Úaccuracyr    r    r!   Útest_check_derivativeæ  s$    ÿÿÿÿz0TestApproxDerivativesDense.test_check_derivativeN)rq   )rA   )#rJ   rK   rL   rS   rV   r[   r`   re   rg   rj   rn   rp   rv   rw   r{   r|   r}   r~   r�   rŽ   r’   r”   r—   rš   rŸ   r¤   r¥   r¬   r°   r±   rI   rµ   r·   rÎ   rÑ   r    r    r    r!   rM   ™   s@   


:rM   c                   @   sL   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S )ÚTestApproxDerivativeSparsec                 C   sž   t j d¡ d| _ddt  | j¡  | _ddt  | j¡  | _t  | j¡| _d| jd d d…  | jd d d…< d| jdd d…  | jdd d…< |  	| j¡| _
d S )Nr   é2   rH   r   rA   gËPÊÿÿï?r   )r   rË   rÌ   Únr   rD   rE   Úemptyr:   ÚjacÚJ_true©r9   r    r    r!   Úsetup_methodú  s      z'TestApproxDerivativeSparse.setup_methodc                 C   sD   |dd … d |d d… d  }t  dd| f¡t  d| df¡ S )Nr   r   r@   r   r   )r   Zhstack)r9   rR   Úer    r    r!   Úfun  s     zTestApproxDerivativeSparse.func                 C   sÔ   |j }t ||f¡}d|d  |d< d|d d  |d< td|d ƒD ]d}d||d   |||d f< d	|| d  d
||   |||f< d||d  d  |||d f< qFd	|d d  |d< d|d  |d< |S )Néüÿÿÿr   ©r   r   r   r   r   ©r   r   iúÿÿÿé	   r   r@   ©r@   r@   r]   ©r@   r]   )Úsizer   r4   Úrange)r9   rR   rÔ   ÚJÚir    r    r!   rÖ   	  s    $"zTestApproxDerivativeSparse.jacc                 C   sb   t j||ftd�}d|d< d|d< td|d ƒD ]}d|||d |d …f< q0d|d< d|d< |S )Nr½   r   rÝ   rÞ   r   rà   rá   )r   r4   Úintrã   )r9   rÔ   r   rå   r    r    r!   r     s    z$TestApproxDerivativeSparse.structurec                 C   s  |   | j¡}t | j¡}t||ƒ}tj |¡ t||ƒ}tg d¢||gtj | j	gtj| j
gƒD ]ž\}}}}t| j| j|||f||fd�}	tt|	tƒƒ t|	 ¡ | jdd� t | jd¡}
|
d d d…  d9  < t| j| j||
||fd�}	t|	 ¡ | jd	d� q`d S )
Nr%   )r.   rª   Úsparsityrƒ   r„   rx   r   r@   )r.   r˜   rç   r�   )r   rÔ   r   r   r   rË   Úshuffler   r7   rD   rE   r   rÛ   r:   r   Ú
isinstancer   r   Útoarrayr×   Z	full_like)r9   r   r   r   r   r.   r   ÚlÚurä   r˜   r    r    r!   Útest_all"  s(    

þÿÿz#TestApproxDerivativeSparse.test_allc                 C   s6   |   | j¡}t| j| j|d�}t| ¡ | jdd� d S )N)rç   rƒ   r„   )r   rÔ   r   rÛ   r:   r   rê   r×   )r9   r   rä   r    r    r!   Útest_no_precomputed_groups7  s    z5TestApproxDerivativeSparse.test_no_precomputed_groupsc                 C   sn   t j| j| jftd�}t  | j¡}dD ]B}t| j| j|d�}t| j| j||f|d�}t|| 	¡ ddd� q&d S )Nr½   r%   r‚   )rç   r.   gVçž¯Â<g¦ÖVs†ÿ<)r…   r¿   )
r   rB   rÔ   ræ   r   r   rÛ   r:   r   rê   )r9   r   r   r.   ZJ_denseZJ_sparser    r    r!   Útest_equivalence<  s    ÿ
ÿz+TestApproxDerivativeSparse.test_equivalencec                    s`   ‡ fdd„}t ˆ j|ˆ jˆ jˆ jfd�}t|dk ƒ t ˆ j|ˆ jˆ jˆ jfd�}t|dk ƒ d S )Nc                    s   t ˆ  | ¡ƒS rN   )r   rÖ   rÃ   rØ   r    r!   rÖ   G  s    z=TestApproxDerivativeSparse.test_check_derivative.<locals>.jacr­   r†   )r   rÛ   r:   rD   rE   r   )r9   rÖ   rÐ   r    rØ   r!   rÑ   F  s    
ÿ
ÿz0TestApproxDerivativeSparse.test_check_derivativeN)rJ   rK   rL   rÙ   rÛ   rÖ   r   rí   rî   rï   rÑ   r    r    r    r!   rÒ   ø  s   
rÒ   c                   @   st   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S )Ú"TestApproxDerivativeLinearOperatorc                 C   s
   t  |¡S rN   rO   rQ   r    r    r!   rS   U  s    z4TestApproxDerivativeLinearOperator.fun_scalar_scalarc                 C   s
   t  |¡S rN   rT   rQ   r    r    r!   rV   X  s    z4TestApproxDerivativeLinearOperator.jac_scalar_scalarc                 C   s,   t  |d d t  |d ¡t  |d ¡g¡S rW   rX   rQ   r    r    r!   r[   [  s    z4TestApproxDerivativeLinearOperator.fun_scalar_vectorc                 C   s8   t  d|d  t  |d ¡d t  |d ¡g¡ dd¡S r\   r^   rQ   r    r    r!   r`   ^  s
    (ÿÿz4TestApproxDerivativeLinearOperator.jac_scalar_vectorc                 C   s$   t  |d |d  ¡t  |d ¡ S ra   rb   rQ   r    r    r!   re   b  s    z4TestApproxDerivativeLinearOperator.fun_vector_scalarc              	   C   s|   t  |d t  |d |d  ¡ t  |d ¡ t  |d |d  ¡|d   |d t  |d |d  ¡ t  |d ¡ g¡S rh   ri   rQ   r    r    r!   rj   e  s    *ÿ*ýz4TestApproxDerivativeLinearOperator.jac_vector_scalarc                 C   sH   t  |d t  |d ¡ |d t  |d ¡ |d d |d d  g¡S rk   rm   rQ   r    r    r!   rn   l  s
    ýz4TestApproxDerivativeLinearOperator.fun_vector_vectorc                 C   s†   t  t  |d ¡|d t  |d ¡ g|d  t  |d ¡ t  |d ¡gd|d d  |d d  d|d d  |d d  gg¡S ro   rm   rQ   r    r    r!   rp   s  s
    "$6ýz4TestApproxDerivativeLinearOperator.jac_vector_vectorc                 C   sº   d}t | j|ddd�}t | j|dd�}t | j|ddd�}|  |¡}tj d¡ tdƒD ]^}tjjd	dd
d�}t| 	|¡|| dd� t| 	|¡|| dd� t| 	|¡|| dd� qVd S )Nrq   r&   T©r.   Úas_linear_operator©rò   r'   r   rÏ   éöÿÿÿ©r   ©râ   r�   r„   çñhãˆµøÔ>)
r   rS   rV   r   rË   rÌ   rã   Úuniformr   Údot©r9   r:   rŠ   r‹   rŒ   r�   rå   r¸   r    r    r!   rŽ   z  s2    þÿþ
ÿÿÿz5TestApproxDerivativeLinearOperator.test_scalar_scalarc                 C   sÆ   d}t | j|ddd�}t | j|dd�}t | j|ddd�}|  t |¡¡}tj d¡ tdƒD ]d}tjjd	dd
d�}t	| 
|¡| 
|¡dd� t	| 
|¡| 
|¡dd� t	| 
|¡| 
|¡dd� q\d S )Nr#   r&   Trñ   ró   r'   r   rÏ   rô   rõ   rö   r�   r„   r÷   )r   r[   r`   r   r“   rË   rÌ   rã   rø   r   rù   rú   r    r    r!   r”   �  s2    þÿþÿÿÿz5TestApproxDerivativeLinearOperator.test_scalar_vectorc                 C   sÞ   t  ddg¡}t| j|ddd�}t| j|dd�}t| j|ddd�}|  |¡}t j d¡ td	ƒD ]x}t jjd
d	|j	d�}t
| |¡t  | |¡¡dd� t
| |¡t  | |¡¡dd� t
| |¡t  | |¡¡dd� q`d S )Nr•   rl   r&   Trñ   ró   r'   r   rÏ   rô   rö   r�   r„   r÷   r–   )r   r   r   re   rj   rË   rÌ   rã   rø   Úshaper   rù   r“   rú   r    r    r!   r—   ¤  s2    þÿþ
ÿÿÿz5TestApproxDerivativeLinearOperator.test_vector_scalarc                 C   sÌ   t  ddg¡}t| j|ddd�}t| j|dd�}t| j|ddd�}|  |¡}t j d¡ td	ƒD ]f}t jjd
d	|j	d�}t
| |¡| |¡dd� t
| |¡| |¡dd� t
| |¡| |¡dd� q`d S )Nr›   rœ   r&   Trñ   ró   r'   r   rÏ   rô   rö   r�   r„   rƒ   r–   )r   r   r   rn   rp   rË   rÌ   rã   rø   rû   r   rù   rú   r    r    r!   rŸ   ¹  s&    þÿþ
z5TestApproxDerivativeLinearOperator.test_vector_vectorc                 C   s.   t  ddg¡}ttt| j|ddt jfd� d S )Nr›   rœ   r&   r   r®   )r   r   r¡   r£   r   rn   r7   )r9   r:   r    r    r!   Útest_exceptionË  s
    
þz1TestApproxDerivativeLinearOperator.test_exceptionN)rJ   rK   rL   rS   rV   r[   r`   re   rj   rn   rp   rŽ   r”   r—   rŸ   rü   r    r    r    r!   rð   S  s   rð   c                  C   s  dd„ } t | ddgddd�}t|ddgƒ t | ddgdd	d�}t|ddgƒ t | ddgdddgd�}t|ddgƒ t | ddgddd	gd�}t|ddgƒ t | ddgdd	dgd�}t|ddgƒ t | ddgddtj dfd
�}t|ddgƒ t | ddgdd	dtjfd
�}t|ddgƒ d S )Nc                 S   s&   t  | d d ¡ t  | d d ¡ S ra   )r   rC   rÃ   r    r    r!   rÄ   Û  s    z"test_absolute_step_sign.<locals>.fr@   r&   rx   r�   r¦   rq   r´   )r.   r‘   rª   )r   r   r   r7   )rÄ   Zgradr    r    r!   Útest_absolute_step_signÒ  s4    	ÿÿÿ
þÿrý   c            
      C   sj  g d¢} t  g d¢¡}t  t j¡j}|d |d |d dœ}t  d¡}| D ]‚}|| }t  ||d |d |t  |d ¡ g¡}td |||ƒ}t||ƒ | dk t	¡d d	 }	td | ||ƒ}t||	| ƒ qJt  g d
¢¡}t  |d |d  |d |d d |d t  |d ¡ g¡}t|||dƒ}t||ƒ | dk t	¡d d	 }	t|| |dƒ}t||	| ƒ d S )Nr%   )r�   r   r   g     jø@r#   r$   rq   r   r   r   r   )rA   r   rÏ   r¼   r&   )
r   r   r(   r)   r*   rC   r   r   rÀ   Úfloat)
Úmethodsr:   r,   r-   r    r.   r˜   Zcorrect_stepr‘   Zsign_x0r    r    r!   Útest__compute_absolute_step  s>    ý
ý

ý
r   )r€   Ú	itertoolsr   Únumpyr   Znumpy.testingr   r   r   Zpytestr   r¡   Zscipy.sparser   r   r	   Zscipy.optimize._numdiffr
   r   r   r   r   r   r"   r/   r0   rM   rÒ   rð   rý   r   r    r    r    r!   Ú<module>   s     $J  a[5