U
    »mœd S  ã                   @   sø   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZ dd
lmZ ddl m!Z!m"Z" ddlZ#ddl$Z#dd„ Z%dd„ Z&G dd„ dƒZ'G dd„ dƒZ(dS )z3 Test functions for scipy.linalg._matfuncs module

é    N)ÚarrayÚeyeÚexpÚrandom)Úmatrix_power)Úassert_allcloseÚassert_Úassert_array_almost_equalÚassert_equalÚassert_array_almost_equal_nulpÚsuppress_warnings)Ú
csc_matrixÚSparseEfficiencyWarning)r   )ÚexpmÚ_expmÚProductOperatorÚMatrixPowerOperatorÚ_onenorm_matrix_power_nnm)Úmatrix)Úlogm)Ú	factorialÚbinomc                 C   s¦   | t | ƒks| dk rtdƒ‚t | ƒ} |t |ƒks8|dk r@tdƒ‚t |ƒ}t|| ƒ\}}t d|  | ¡}|t d|  ¡ }t |g| |  |¡t |g| ||  ¡ S )aj  
    A helper function for testing matrix functions.

    Parameters
    ----------
    n : integer greater than 1
        Order of the square matrix to be returned.
    p : non-negative integer
        Power of the matrix.

    Returns
    -------
    out : ndarray representing a square matrix
        A Forsythe matrix of order n, raised to the power p.

    é   z#n must be an integer greater than 1r   z p must be a non-negative integerç      $@)ÚintÚ
ValueErrorÚdivmodÚnpÚpowerÚdiag)ÚnÚpÚaÚbZlargeZsmall© r$   ú`/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_matfuncs.pyÚ_burkardt_13_power   s    r&   c                  C   sn   t j d¡ tddƒD ]R} tdƒD ]D}t j | | f¡}t j ||¡}t||ƒ}t j |d¡}t||ƒ q"qd S )NéÒ  é   é   )	r   r   ÚseedÚrangeÚlinalgr   r   Znormr   )r    r!   ÚMZMpÚobservedÚexpectedr$   r$   r%   Útest_onenorm_matrix_power_nnm<   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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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=S )>ÚTestExpMc                 C   s2   t ddgddggƒ}tt|ƒddgddggƒ d S ©Nç        r   r(   )r   r	   r   ©Úselfr"   r$   r$   r%   Útest_zero_ndarrayH   s    zTestExpM.test_zero_ndarrayc                 C   s6   t ddgddggƒ}tt|ƒ ¡ ddgddggƒ d S r2   )r   r	   r   Útoarrayr4   r$   r$   r%   Útest_zero_sparseL   s    zTestExpM.test_zero_sparsec                 C   s2   t ddgddggƒ}tt|ƒddgddggƒ d S r2   )r   r	   r   r4   r$   r$   r%   Útest_zero_matrixP   s    zTestExpM.test_zero_matrixc                 C   sÜ   t t dgg¡ƒ}tt dƒ|ƒ tt dggƒ|ƒ tt tdggƒƒ|ƒ tt t dgg¡ƒ|ƒ tt tdggƒƒj|ƒ t t dgg¡ƒ}tt dƒ|ƒ tt dggƒ|ƒ tt tdggƒƒ|ƒ tt tdggƒƒj|ƒ d S )Nr(   ))r(   ù              ð?))r:   )r   r   r   r   r   r   ÚA)r5   r;   ÚBr$   r$   r%   Útest_misc_typesT   s    zTestExpM.test_misc_typesc                 C   s�   t dddgdddgdddggtd�}t d¡}t d¡}tj|d| d|d|   gd|d||  gdd|ggtd�}t|ƒ ¡ }t||ƒ d S )Nr(   é   r   r)   r   ©Údtypeé   )	r   ÚfloatÚmathr   r   r   r   r7   r	   )r5   r;   Úe1Úe2r/   r.   r$   r$   r%   Útest_bidiagonal_sparsea   s$    ýý

ýýzTestExpM.test_bidiagonal_sparsec                 C   s^   t jt jfD ]L}dD ]B}|td|d� }t|ƒ}t||d�td|d� }t||dd� qqd S ©N©ç{®Gáz„?çš™™™™™¹?g      à?r(   é
   r>   r?   éd   ©Znulp)r   Zfloat32Úfloat64r   r   r   r   ©r5   r@   Úscaler;   r.   r/   r$   r$   r%   Útest_padecases_dtype_floato   s    z#TestExpM.test_padecases_dtype_floatc                 C   s^   t jt jfD ]L}dD ]B}|td|d� }t|ƒ}t||d�td|d� }t||dd� qqd S rG   )r   Z	complex64Ú
complex128r   r   r   r   rO   r$   r$   r%   Útest_padecases_dtype_complexw   s    z%TestExpM.test_padecases_dtype_complexc              
   C   sš   t j}dD ]Š}|tdd|dd� }t||d�td|d� }tƒ �2}| td¡ t|dd� 	¡ }t|d	d� 	¡ }W 5 Q R X t
||d
d� t
||d
d� q
d S )NrH   r>   Úcsc©r@   Úformatr?   ú=Changing the sparsity structure of a csc_matrix is expensive.T)Zuse_exact_onenormFrL   rM   )r   rN   Úspeyer   r   r   Úfilterr   r   r7   r   )r5   r@   rP   r"   ÚeÚsupZexact_onenormZinexact_onenormr$   r$   r%   Ú!test_padecases_dtype_sparse_float   s    ÿz*TestExpM.test_padecases_dtype_sparse_floatc              
   C   sp   t j}dD ]`}|tdd|dd� }t|ƒtd|d� }tƒ �(}| td¡ tt	|ƒ 
¡ |dd� W 5 Q R X q
d S )	NrH   r>   rT   rU   r?   rW   rL   rM   )r   rR   rX   r   r   r   rY   r   r   r   r7   )r5   r@   rP   r"   rZ   r[   r$   r$   r%   Ú#test_padecases_dtype_sparse_complex�   s    ÿz,TestExpM.test_padecases_dtype_sparse_complexc              	   C   sŒ   t  d¡ tjtjfD ]p}tddƒD ]`}dD ]V}t|ƒt  ||¡|   |¡}t 	|¡rp|dt  ||¡ |  }t
tt|ƒƒ|ƒ q,q$qd S )Nr'   r(   rK   )ç-Cëâ6?çü©ñÒMbP?rI   rJ   r(   r   g      Y@r:   )r   r*   r   rN   rR   r+   r   ZrandZastypeZiscomplexobjr	   r   r   )r5   r@   r    rP   r;   r$   r$   r%   Útest_logm_consistency˜   s    

zTestExpM.test_logm_consistencyc              	   C   sL   t  ddddgddddgddddgddddgg¡}tt|ƒtd| ƒƒ d S )Néýÿÿÿr(   ç      ð?)r   r   r   r   ©r5   ÚQr$   r$   r%   Útest_integer_matrix£   s    



üzTestExpM.test_integer_matrixc                 C   st   t jddddgddddgddddgddddggt jd	�}tt|ƒtd
| ƒƒ t|ƒ}tt|ƒjtd
| ƒjƒ d S )Niþÿÿiô  r   iÚýÿÿih  é¾   iv  iŠýÿÿr?   rb   )r   r   Zint16r   r   r   r;   rc   r$   r$   r%   Útest_integer_matrix_2«   s    


ýýzTestExpM.test_integer_matrix_2c           	   	   C   sê   t jddddgddddgddddgddddggtd�}t jdd	d
dgddddgddddgddddggtd�}tt|ƒ|dd� t d¡ d}| ¡ }||d< tƒ �}| 	t
d¡ t|ƒ}W 5 Q R X d}d| }tt j||||d� ƒ d S )Ng3d’‘³Ô?g     LÝ@r   gRal!ÈAÓ?g“©‚QI�Ô?gÝ^Ò­Ó?r?   g“Ø<’ò¿göGgÝx÷@g9‚¸=ÛðÁgý¯[d ðBr3   gÐÈ'ÑV7ó¿gZºá¯…÷@gáÆ2pñÁgŽìÑ¤T ò¿g\Ge±ÎE÷@gPëÇ†!ßò¿r^   )Úrtolr'   g—ÔFFõg<)r(   r   zIll-conditioned.*rL   )rh   Úatol)r   r   rB   r   r   r   r*   Úcopyr   rY   ÚRuntimeWarningr   Zallclose)	r5   r;   ZA_logmZtinyZA_logm_perturbedr[   ZA_expm_logm_perturbedrh   ri   r$   r$   r%   Útest_triangularity_perturbation¶   sN    



üû ÿ ÿ ÿ ÿù	÷

z(TestExpM.test_triangularity_perturbationc                 C   s^   t  d¡}t  d¡}t jddgddggtd�}t j|dgd|ggtd�}t|ƒ}t||ƒ d S )Nr(   r   r   r?   ©r   r   r   rB   r   r   )r5   Úexp1Zexp2r;   ÚdesiredÚactualr$   r$   r%   Útest_burkardt_1Ú   s     

þýþýzTestExpM.test_burkardt_1c                 C   sJ   t jddgddggtd�}t jddgddggtd�}t|ƒ}t||ƒ d S )	Nr(   r>   r   r?   gkÔQ©C@gb¥”]IG@gd¥”]IG@g�÷Jó[K@©r   r   rB   r   r   ©r5   r;   ro   rp   r$   r$   r%   Útest_burkardt_2  s    þýþýzTestExpM.test_burkardt_2c                 C   s¨   t  d¡}t  d¡}t jddgddggtd�}t jdd|  dd|   t  d¡ d|  gdt  d¡ d|  d	d|  dd|   ggtd�}t|ƒ}t||ƒ d S )
Nr(   é'   r   iÙÿÿÿiØÿÿÿr?   é&   iÚÿÿÿéÿÿÿÿ)r   r   r   rB   Úexpm1r   r   )r5   rn   Zexp39r;   ro   rp   r$   r$   r%   Útest_burkardt_3  s(    

þýþþüùzTestExpM.test_burkardt_3c                 C   sŒ   t jddgddggtd�}t jddgdd	ggtd�}t jdd
gddggtd�}t jddgtd�}t  |t  |¡ |¡}t|ƒ}t||ƒ d S )NiÏÿÿÿé   iÀÿÿÿé   r?   r>   r(   é   r   ç      à¿éþÿÿÿg      ø?iïÿÿÿrw   )r   r   rB   Údotr   r   r   )r5   r;   ÚUÚVÚwro   rp   r$   r$   r%   Útest_burkardt_4%  s    þýzTestExpM.test_burkardt_4c                 C   s‚   t jddddgddddgddddgddddggtd�}t jddddgddddgddddgddddggtd�}t|ƒ}t||ƒ d S )Nr   é   r?   r(   é   é$   rr   rs   r$   r$   r%   Útest_burkardt_54  s$    



üû



üûzTestExpM.test_burkardt_5c                 C   sT   t  d¡}t jddgddggtd�}t j||gd|ggtd�}t|ƒ}t||ƒ d S ©Nr(   r   r?   rm   )r5   rn   r;   ro   rp   r$   r$   r%   Útest_burkardt_6H  s    
þýþýzTestExpM.test_burkardt_6c                 C   sf   t  d¡}t  d¡}t jd| dgdd| ggtd�}t j||gd|ggtd�}t|ƒ}t||ƒ d S rˆ   )r   r   Úspacingr   rB   r   r   )r5   rn   Zepsr;   ro   rp   r$   r$   r%   Útest_burkardt_7X  s     



þýþýzTestExpM.test_burkardt_7c                 C   sÆ   t  d¡}t  d¡}t jdddgdddgdddggtd	�}t jd
| | d
| d|  d| d|  gd| | d| d|  d| d|  gd| d| d| ggtd	�d }t|ƒ}t||ƒ d S )Nr|   é   é   é   r„   éûÿÿÿrw   iúÿÿÿr?   é   r)   r   i÷ÿÿÿr~   g      Ð?rm   )r5   Zexp4Zexp16r;   ro   rp   r$   r$   r%   Útest_burkardt_8j  s(    

ýü((ýüüzTestExpM.test_burkardt_8c                 C   s‚   t jddddgddddgddddgddddggtd�}t jddddgd	d
ddgddd
dgddd	dggtd�}t|ƒ}t||ƒ d S )Nr(   r   r>   r?   gf÷äa¡%‡@gÍÌÌÌÌƒ@gXÊ2Ä1ò€@gé·¯g)�@g^ºIÚ†@g|ò°PkÜ‚@g»'µ¸€@gÉv¾Ÿ¾‰@gBÏfÕg;…@gD‹lç{3�@rr   rs   r$   r$   r%   Útest_burkardt_9{  s$    



üû



üûzTestExpM.test_burkardt_9c                 C   sx   t jdddgdddgdddggtd�}tttj |¡ƒdƒ t jddd	gd
ddgdddggtd�}t|ƒ}t||ƒ d S )Nr|   r   r   r(   r?   )r>   r>   r„   gl$ÿ^»{b@gÔá
|øf@g•õ.”óQ@gœ\"Nýñ_@gØá
|øV@g£\"Nýñ_@g¶ëL¿ud@gÎæsõý[@©	r   r   rB   r   ÚsortedÚscipyr,   Zeigvalsr   rs   r$   r$   r%   Útest_burkardt_10�  s"    ýüýüzTestExpM.test_burkardt_10c                 C   st   t jdddgdddgdddggtd�}ttj |¡dƒ t jd	d
dgdddgdddggtd�}t|ƒ}t||ƒ d S )NgáìÀ!á=@gøl‘À©é?gQ°Š€ïPÀgºŒ²t º9@gŒ½èª‰\!@g®®0ån2A@r?   )é   é   é(   gÚÉÒJÞ†3Cg…;%s1PÃgêMSUc[Ãgˆ;%s1PÃgcx
MêjCg ÈOÆ}vCgýÁãõ¢Ë‚C)r   r   rB   r   r•   r,   Zeigvalshr   rs   r$   r$   r%   Útest_burkardt_11ž  s4    ýüýýý÷ózTestExpM.test_burkardt_11c                 C   sx   t jdddgdddgddd	ggtd
�}tttj |¡ƒdƒ t jdddgdddgdddggtd
�}t|ƒ}t||ƒ d S )Ni}ÿÿÿé   r…   izþÿÿé8   é6   i}þÿÿé9   é4   r?   )iìÿÿÿr~   rw   g¹Ò)¢€'ø¿g£1ö3V‹×?g¿-RŸªRÁ?gñÀÇ£À‡ÀgÑ×ƒ4V‹÷?g±3ûîÿûÙ?gWNùx`½Àgp¢ø¦€¨ñ?gë}m ªRá?r“   rs   r$   r$   r%   Útest_burkardt_12¸  s"    ýüýüzTestExpM.test_burkardt_12c           	      C   sô   t ddƒ}ddddgddddgddddgddddgg}t||ƒ dD ]ª}tdtt d| ¡ƒƒ}tj||ftd�}t|| ƒD ]V}t ||ƒ}t	t 
|¡dƒ tt |¡t dt || ¡ | ¡ƒ ||t|ƒ 7 }q~tt |dƒƒ}t||ƒ qDd S )	Nr|   r(   r   r^   )r   r>   r|   rK   rŒ   r?   rK   )r&   r   Úmaxr   r   ÚceilÚzerosrB   r+   r
   Úminr   Úfloorr   r   )	r5   Z	A4_actualZ
A4_desiredr    Úkro   r!   ZAprp   r$   r$   r%   Útest_burkardt_13Ê  s"    




ý

(zTestExpM.test_burkardt_13c                 C   sb   t jdddgdddgdddggtd�}t jd	d
dgdddgdddggtd�}t|ƒ}t||ƒ d S )Nr   g:Œ0âŽyE>g«ªª"D°Âra   g    _ Bg«ªªªªªP@g«ªªªªªPÀr?   gí· ƒ.™Ü?gÜzDïv>g1òOî³žÝ?gÜýâñvèUÁgÔ°g²L�¿gÓ@ž­sDQÁgø âF~§Ü?ggÒ=ã€>gcŠE½ª©Ý?rr   rs   r$   r$   r%   Útest_burkardt_14é  s     ýüýüzTestExpM.test_burkardt_14c           	   	   C   sà   dD ]Ö}t dddƒD ]Ä}|t |dd¡ }t |dk ¡r< qt t d|d ¡d¡| }t|ƒ}|}tt |d ¡d d …d f t |d ¡d d d …f ƒ|d d d …f  |d d …d f  }dt|ƒ ¡  }t	|||d	� qqd S )
N)rb   r_   g�íµ ÷Æ°>r   éP   r>   rw   gYóøÂn¥r(   g‚vIhÂ%<=)ri   )
r+   r   ZarangeÚanyr   r   r   Úabsr¡   r   )	r5   rP   r    Úscr;   r<   Úgotr/   ri   r$   r$   r%   Útest_pascalù  s"    ÿÿÿzTestExpM.test_pascalc              	   C   s`   t  d¡}d|d< t|ƒ}tƒ �,}| td¡ | td¡ tt  |¡ƒ}W 5 Q R X t||ƒ d S )N)éÈ   r¯   r(   )rw   r   zthe matrix subclass.*)	r   r£   r   r   rY   ÚDeprecationWarningÚPendingDeprecationWarningr   r   )r5   r;   ÚB0r[   r<   r$   r$   r%   Útest_matrix_input  s    
zTestExpM.test_matrix_inputc                 C   s¸   t  dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddgg¡}t| ƒ}td| ƒ}|}tdƒD ]}|| }qœt||ƒ d S )Nrb   r}   r3   i øÿÿé   )r   r   r   r+   r   )r5   ÚLZE0ZE1ZE2Újr$   r$   r%   Útest_exp_sinch_overflow  s    ú

z TestExpM.test_exp_sinch_overflowN)!Ú__name__Ú
__module__Ú__qualname__r6   r8   r9   r=   rF   rQ   rS   r\   r]   r`   re   rg   rl   rq   rt   ry   rƒ   r‡   r‰   r‹   r‘   r’   r–   rš   r    r§   r¨   r®   r³   r·   r$   r$   r$   r%   r1   G   s<   $(r1   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestOperatorsc           
      C   s´   t  d¡ d}d}d}t|ƒD ]�}tj  ||¡}tj  ||¡}tj  ||¡}tj  ||¡}t|||ƒ}	t|	 |¡| |¡ |¡ |¡ƒ t|	j	 |¡| |¡ |¡j	 |¡ƒ qd S )Nr'   r)   r   rK   )
r   r*   r+   r   Úrandnr   r   Úmatmatr   ÚT)
r5   r    r¦   ÚnsamplesÚir;   r<   ÚCÚDÚopr$   r$   r%   Útest_product_operator,  s    
"z#TestOperators.test_product_operatorc           	      C   sŽ   t  d¡ d}d}d}d}t|ƒD ]f}tj  ||¡}tj  ||¡}t||ƒ}t| |¡t||ƒ 	|¡ƒ t|j
 |¡t||ƒj
 	|¡ƒ q"d S )Nr'   r)   r   r>   rK   )r   r*   r+   r   r¼   r   r   r½   r   r   r¾   )	r5   r    r¦   r!   r¿   rÀ   r;   r<   rÃ   r$   r$   r%   Útest_matrix_power_operator:  s    

z(TestOperators.test_matrix_power_operatorN)r¸   r¹   rº   rÄ   rÅ   r$   r$   r$   r%   r»   *  s   r»   ))Ú__doc__rC   Únumpyr   r   r   r   r   Znumpy.linalgr   Znumpy.testingr   r   r	   r
   r   r   Zscipy.sparser   r   Zscipy.sparse._constructrX   Zscipy.sparse.linalg._matfuncsr   r   r   r   r   Zscipy.sparse._sputilsr   Zscipy.linalgr   Zscipy.specialr   r   r•   Zscipy.sparse.linalgr&   r0   r1   r»   r$   r$   r$   r%   Ú<module>   s(        f