U
    »mœdjz  ã                   @   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  ddddddgddddddgddddddgddddddgddddddgddddddgddddddgg} t jtttfD ]z}|| ƒ}t  d¡}t  ddddddg¡}t||ƒ}t||ƒ ddddddg}t  ddddddg¡}t||ƒ}t||ƒ qtt|ƒ}t|ƒ}t||ƒ d S )Né   r   é   é   é   é   é   )	ÚnpÚasarrayr   r   r	   ÚarangeÚarrayr   r   )Ú	structureZ	transformÚAÚorderZgroups_trueÚgroupsÚgroups_1Úgroups_2© r    ú[/home/sam/Atlas/atlas_env/lib/python3.8/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-pointú3-pointÚcs)r   ÚfinfoÚfloat64Úepsr   r   Z
complex128Úfloat32)ÚEPSÚrelative_stepÚmethodr    r    r!   Útest_correct_fp_eps+   s@    þþþþþþþr0   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   s\    


     ÿ
     ÿ
     ÿ
     ÿ
z'TestAdjustSchemeToBounds.test_no_boundsc                 C   s
  t  dddg¡}t  d¡ }t  d¡}t  dddg¡d }t||dd||ƒ\}}t||ƒ t||d	d||ƒ\}}t|t  dddg¡d ƒ t||dd
||ƒ\}}t|t  |¡ƒ tt  | ¡ƒ t||d	d
||ƒ\}}t|t  dddg¡d ƒ t|t  dddg¡ƒ d S )Nç        g333333ë?g333333ë¿r   r   éÿÿÿÿçš™™™™™¹?r3   r   r4   FT)	r   r   Úonesr
   r   Úabsr   r9   r   )r:   r;   ÚlbÚubr<   r=   Ú_r>   r    r    r!   Útest_with_boundl   s8    

     ÿ     ÿ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   r3   g¸…ëQ¸®¿r   gš™™™™™™?r4   FTg¸…ëQ¸Ž?g¸…ëQ¸Ž¿)r   r   r
   r   r   )r:   rE   rF   r;   r<   r=   rG   r>   r    r    r!   Útest_tight_bounds‚   s8         ÿ     ÿz*TestAdjustSchemeToBounds.test_tight_boundsN)Ú__name__Ú
__module__Ú__qualname__r?   rH   rJ   r    r    r    r!   r1   O   s   r1   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dFdd„ZdGd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"dCdD„ Z#dES )HÚTestApproxDerivativesDensec                 C   s
   t  |¡S ©N©r   Úsinh©r:   Úxr    r    r!   Úfun_scalar_scalarš   s    z,TestApproxDerivativesDense.fun_scalar_scalarc                 C   s
   t  |¡S rO   ©r   ÚcoshrR   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ÚexprR   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   éþÿÿÿrA   r   ©r   r   Úcosr[   ZreshaperR   r    r    r!   Újac_scalar_vector£   s    (ÿ ÿz,TestApproxDerivativesDense.jac_scalar_vectorc                 C   s$   t  |d |d  ¡t  |d ¡ S ©Nr   r   ©r   ÚsinÚlogrR   r    r    r!   Úfun_vector_scalar§   s    z,TestApproxDerivativesDense.fun_vector_scalarc                 C   s    t  |d t  |¡t  |¡g¡S ©Nr   rY   rR   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`   re   rd   rR   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   rd   r`   rR   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   rm   g      ø¿rn   rR   r    r    r!   Újac_vector_vector»   s
    "$6ýz,TestApproxDerivativesDense.jac_vector_vectorç      ð?c                 C   s*   t  t  ||d  ¡t  ||d  ¡g¡S rb   ©r   r   r[   ©r:   rS   Úc0Úc1r    r    r!   Úfun_parametrizedÂ   s    z+TestApproxDerivativesDense.fun_parametrizedrB   c              
   C   s:   t  |t  ||d  ¡ dgd|t  ||d  ¡ gg¡S rb   rs   rt   r    r    r!   Újac_parametrizedÅ   s    þz+TestApproxDerivativesDense.jac_parametrizedc                 C   s   t  |¡dkr|S t jS )Nç:Œ0âŽyE>©r   rD   ÚnanrR   r    r    r!   Úfun_with_nanË   s    z'TestApproxDerivativesDense.fun_with_nanc                 C   s   t  |¡dkrdS t jS )Nry   rr   rz   rR   r    r    r!   Újac_with_nanÎ   s    z'TestApproxDerivativesDense.jac_with_nanc                 C   s,   t  |d |d  t  |d |d  ¡g¡S rb   )r   r   r`   rR   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 ri   )r   r   rd   rR   r    r    r!   Újac_zero_jacobianÔ   s    >þz,TestApproxDerivativesDense.jac_zero_jacobianc                 C   s
   t  |¡S rO   )Úmathr[   rR   r    r    r!   Úfun_non_numpyÚ   s    z(TestApproxDerivativesDense.fun_non_numpyc                 C   s   t  |¡ ¡ }t |¡S rO   )r   r   Úitemr€   r[   )r:   rS   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 )	Nrr   r&   ©r/   r(   ç�íµ ÷Æ°>©Úrtolç•Ö&è.>çê-�™—q=©r   rT   rW   r   ©r:   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 )Nrr   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\   ra   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@rm   r&   r„   r(   r…   r†   çH¯¼šò×z>r‰   )r   r   r   rf   rk   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—   rm   r&   r‘   r’   )r“   Úrel_stepr(   r…   r†   çßA:ÜÅ)>r‰   )r   r   r   rf   r8   rk   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   ro   rq   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 )Nrr   )Úf0)Úassert_raisesÚRuntimeErrorr   rh   r   r•   Ú
ValueError)r:   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 )	NrI   rB   r&   g-Cëâ6?)r/   rš   )rš   r2   r†   r    )r:   r;   rŒ   r�   r�   r    r    r!   Útest_custom_rel_step7  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 )Nrr   ç      ð¿r@   ç       @)rv   g�íµ ÷Æ°¾r˜   r&   )r/   rš   r¢   ÚargsÚkwargsÚbounds)rš   r¢   rª   r«   r¬   r…   r†   rˆ   )r   r   rw   rx   r   Údictr   )r:   r;   ru   rv   rE   rF   r¢   rš   r�   rŒ   r�   r    r    r!   Útest_optionsA  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¨   rr   r&   ©r/   r¬   r…   r†   )	r   rC   r   r£   r¥   r   ro   rq   r   )r:   rE   rF   r;   Újac_diffr�   r    r    r!   Útest_with_bounds_2_pointS  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 )Nrr   r©   rˆ   r†   r¯   )r   r   rq   r   ro   r   r8   )r:   rE   rF   r;   r�   r±   r    r    r!   Útest_with_bounds_3_pointa  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   rq   r   ro   r   )r:   r;   rE   rF   r�   r±   r    r    r!   rJ   w  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¾ry   r@   r&   r…   r´   rµ   r†   rˆ   )r}   r   r|   r   )r:   rE   rF   r;   r�   rŒ   r�   r    r    r!   Útest_bound_switches‹  sH    
   þ   ÿ
   þ   ÿz.TestApproxDerivativesDense.test_bound_switchesc                 C   sd   d}|   |¡}t| j |dd�}t| j |ƒ}t||dd� t||dd� ttt| j |ftdd�Ž d S )Nrr   r&   r„   r…   r†   ry   r(   )rƒ   r   r   r£   Ú	TypeErrorr­   )r:   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žt
‚t||dd� ‡ ‡‡fdd„}t||d
d�}||ƒj	t jksÞt
‚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t
‚�qd S )Nr   c                 S   s   | d | d |  S rb   r    )ÚprS   r    r    r!   Úfunc´  s    z0TestApproxDerivativesDense.test_fp.<locals>.funcc                    s   ˆ | |ƒ| S rO   r    )rº   rS   Úy)r»   r    r!   Úerr·  s    z/TestApproxDerivativesDense.test_fp.<locals>.errr   éd   ©Údtyper¨   r&   )r/   rª   gü©ñÒMbP?)Úatolc                    s   ˆ | ˆˆƒ  tj¡S rO   )Úastyper   r,   )rº   )r½   rS   r¼   r    r!   Ú<lambda>Ç  ó    z4TestApproxDerivativesDense.test_fp.<locals>.<lambda>r„   c                 S   s
   t  | ¡S rO   ©r   rd   ©rS   r    r    r!   rÃ   Î  rÄ   c                 S   s
   t  | ¡S rO   )r   r`   rÆ   r    r    r!   rÃ   Ï  rÄ   c                 S   s   t  | ¡ S rO   rÅ   rÆ   r    r    r!   rÃ   Ð  rÄ   c                 S   s\   | d t t ||ƒ¡t |||  ƒ¡ƒ }||  t t ||ƒ¡t |||  ƒ¡ƒ }|| S rg   )Úmaxr   rD   )r<   r;   ÚfÚhessr-   Út0Út1r    r    r!   Ú	calc_atolÒ  s    **z5TestApproxDerivativesDense.test_fp.<locals>.calc_atolrr   r’   )r   ÚrandomÚseedZlinspacer*   rÂ   r   r   r,   rÀ   ÚAssertionErrorr   Zfloat16r)   r+   r   rD   )r:   Úp0Zjac_fp64Zjac_fpZerr_fp32rÈ   ÚgrÉ   rÌ   rÀ   r-   r;   r<   rÁ   r    )r½   r»   rS   r¼   r!   Útest_fp¯  sD     ÿÿ	ÿÿ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   ro   rq   r   r~   r   )r:   r;   Úaccuracyr    r    r!   Útest_check_derivativeä  s,     ÿ ÿ ÿ ÿz0TestApproxDerivativesDense.test_check_derivativeN)rr   )rB   )$rK   rL   rM   rT   rW   r\   ra   rf   rh   rk   ro   rq   rw   rx   r|   r}   r~   r   r�   rƒ   r�   r”   r–   r™   rœ   r¡   r¦   r§   r®   r²   r³   rJ   r·   r¹   rÒ   rÕ   r    r    r    r!   rN   ™   sB   


5rN   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   rI   r   rB   gËPÊÿÿï?r   )r   rÍ   rÎ   Únr   rE   rF   Úemptyr;   ÚjacÚJ_true©r:   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   rA   r   r   )r   Zhstack)r:   rS   Ú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   rA   ©rA   rA   r^   ©rA   r^   )Úsizer   r5   Úrange)r:   rS   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   r5   Úintrç   )r:   rØ   r   ré   r    r    r!   r     s    z$TestApproxDerivativeSparse.structurec                 C   s  |   | j¡}t | j¡}t||ƒ}tj |¡ t||ƒ}tdddg||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� qbd S )Nr&   r'   r(   )r/   r¬   Úsparsityr…   r†   ry   r   rA   )r/   rš   rë   rŸ   )r   rØ   r   r   r   rÍ   Úshuffler   r8   rE   rF   r   rß   r;   r   Ú
isinstancer   r   ÚtoarrayrÛ   Z	full_like)r:   r   r   r   r   r/   r   ÚlÚurè   rš   r    r    r!   Útest_all   s0    

  
þ ÿ ÿ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Û   )r:   r   rè   r    r    r!   Útest_no_precomputed_groups5  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   rC   rØ   rê   r   r   rß   r;   r   rî   )r:   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 rO   )r   rÚ   rÆ   rÜ   r    r!   rÚ   E  s    z=TestApproxDerivativeSparse.test_check_derivative.<locals>.jacr¯   rˆ   )r   rß   r;   rE   rF   r   )r:   rÚ   rÔ   r    rÜ   r!   rÕ   D  s    
ÿ
ÿz0TestApproxDerivativeSparse.test_check_derivativeN)rK   rL   rM   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 rO   rP   rR   r    r    r!   rT   S  s    z4TestApproxDerivativeLinearOperator.fun_scalar_scalarc                 C   s
   t  |¡S rO   rU   rR   r    r    r!   rW   V  s    z4TestApproxDerivativeLinearOperator.jac_scalar_scalarc                 C   s,   t  |d d t  |d ¡t  |d ¡g¡S rX   rY   rR   r    r    r!   r\   Y  s    z4TestApproxDerivativeLinearOperator.fun_scalar_vectorc                 C   s8   t  d|d  t  |d ¡d t  |d ¡g¡ dd¡S r]   r_   rR   r    r    r!   ra   \  s    (ÿ ÿz4TestApproxDerivativeLinearOperator.jac_scalar_vectorc                 C   s$   t  |d |d  ¡t  |d ¡ S rb   rc   rR   r    r    r!   rf   `  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 ri   rj   rR   r    r    r!   rk   c  s    *ÿ*ýz4TestApproxDerivativeLinearOperator.jac_vector_scalarc                 C   sH   t  |d t  |d ¡ |d t  |d ¡ |d d |d d  g¡S rl   rn   rR   r    r    r!   ro   j  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 rp   rn   rR   r    r    r!   rq   q  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 )Nrr   r&   T©r/   Úas_linear_operator©rö   r(   r   rÓ   éöÿÿÿ©r   ©ræ   rŸ   r†   çñhãˆµøÔ>)
r   rT   rW   r   rÍ   rÎ   rç   Úuniformr   Údot©r:   r;   rŒ   r�   rŽ   r�   ré   rº   r    r    r!   r�   x  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\   ra   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—   rm   r&   Trõ   r÷   r(   r   rÓ   rø   rú   rŸ   r†   rû   r˜   )r   r   r   rf   rk   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   ro   rq   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   ro   r8   )r:   r;   r    r    r!   Útest_exceptionÉ  s      þz1TestApproxDerivativeLinearOperator.test_exceptionN)rK   rL   rM   rT   rW   r\   ra   rf   rk   ro   rq   r�   r–   r™   r¡   r   r    r    r    r!   rô   Q  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 rb   )r   rD   rÆ   r    r    r!   rÈ   Ù  s    z"test_absolute_step_sign.<locals>.frA   r&   ry   r’   r¨   rr   r¶   )r/   r“   r¬   )r   r   r   r8   )rÈ   Zgradr    r    r!   Útest_absolute_step_signÐ  sT    	   ÿ   ÿ   ÿ   
þ    ÿr  c            
      C   st  dddg} t  ddddg¡}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||	| ƒ qPt  ddddg¡}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Ÿ   r   r   g     jø@r#   r$   r%   rr   r   r   rB   rÓ   r¾   )
r   r   r)   r*   r+   rD   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"   r0   r1   rN   rÖ   rô   r  r  r    r    r    r!   Ú<module>   s     $J  _[5