U
    Gvf 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largesmall r%   K/tmp/pip-unpacked-wheel-96ln3f52/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    
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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 r3   )r   r	   r   toarrayr5   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 r3   )r   r	   r   r5   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)r6   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   r8   r	   )r6   r<   e1e2r0   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{Gz?皙?g      ?r)   
   r?   r@   d   Znulp)r   Zfloat32float64r   r   r   r   r6   rA   scaler<   r/   r0   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 rH   )r   Z	complex64
complex128r   r   r   r   rP   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 )NrI   r?   cscrA   formatr@   =Changing the sparsity structure of a csc_matrix is expensive.T)Zuse_exact_onenormFrM   rN   )r   rO   speyer   r   r   filterr   r   r8   r   )r6   rA   rQ   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 )	NrI   r?   rU   rV   r@   rX   rM   rN   )r   rS   rY   r   r   r   rZ   r   r   r   r8   )r6   rA   rQ   r"   r[   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)   rL   )-C6?MbP?rJ   rK   r)   r   g      Y@r;   )r   r+   r   rO   rS   r,   r   ZrandZastypeZiscomplexobjr	   r   r   )r6   rA   r    rQ   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 )Nr)         ?)r   r   r   r   r6   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   iih     iv  ir@   rc   )r   r   Zint16r   r   r   r<   rd   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?gQI?g^?r@   g<gGgx@g9=g[dBr4   g'V7gZ@g2pgѤT g\GeE@gPǆ!r_   )rtolr(   gFFg<)r)   r   zIll-conditioned.*rM   )ri   atol)r   r   rC   r   r   r   r+   copyr   rZ   RuntimeWarningr   Zallclose)	r6   r<   ZA_logmZtinyZA_logm_perturbedr\   ZA_expm_logm_perturbedri   rj   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   rC   r   r   )r6   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QC@gb]IG@gd]IG@gJ[K@r   r   rC   r   r   r6   r<   rp   rq   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   iir@   &   i)r   r   r   rC   expm1r   r   )r6   ro   Zexp39r<   rp   rq   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      ?irx   )r   r   rC   dotr   r   r   )r6   r<   UVwrp   rq   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)      $   rs   rt   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@   rn   )r6   ro   r<   rp   rq   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   rC   r   r   )r6   ro   Zepsr<   rp   rq   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   rx   ir@      r*   r   ir   g      ?rn   )r6   Zexp4Zexp16r<   rp   rq   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@   gfa%@g@gX21@g鷯g)@g^Iچ@g|Pk܂@g'@gv@gBfg;@gDl{3@rs   rt   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Lud@gs[@	r   r   rC   r   sortedscipyr-   Zeigvalsr   rt   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!=@gl?gQPgt 9@g誉\!@g0n2A@r@   )      (   gJކ3Cg;%s1PgMSUc[g;%s1Pgcx
MjCgO}vCg˂C)r   r   rC   r   r   r-   Zeigvalshr   rt   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   iz8   6   i}9   4   r@   )ir   rx   g)'g13V?g-RR?gǣg׃4V?g3?gWNx`gp?g}mR?r   rt   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}   rL   r   r@   rL   )r'   r   maxr   r   ceilzerosrC   r,   r
   minr   floorr   r   )	r6   Z	A4_actualZ
A4_desiredr    krp   r!   ZAprq   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:0yE>g"Drb   g    _BgP@gPr@   g .?gzDv>g1O?gvUg԰gLg@sDQg F~?gg=>gcE?rs   rt   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)rc   r`   gư>r   P   r?   rx   gYnr)   gvIh%<=)rj   )
r,   r   Zarangeanyr   r   r   absr   r   )	r6   rQ   r    Zscr<   r=   gotr0   rj   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)   )rx   r   zthe matrix subclass.*)	r   r   r   r   rZ   DeprecationWarningPendingDeprecationWarningr   r   )r6   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 ]}|| }qt|| d S )Nrc   r~   r4   i    )r   r   r   r,   r   )r6   LZE0ZE1ZE2jr%   r%   r&   test_exp_sinch_overflow  s    

z TestExpM.test_exp_sinch_overflowN)!__name__
__module____qualname__r7   r9   r:   r>   rG   rR   rT   r]   r^   ra   rf   rh   rm   rr   ru   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   r2   G   s<   $(r2   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   rL   )
r   r+   r,   r   randnr   r   matmatr   T)
r6   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?   rL   )r   r+   r,   r   r   r   r   r   r   r   r   )	r6   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__rD   Znumpyr   r   r   r   r   Znumpy.linalgr   Znumpy.testingr   r   r	   r
   r   r   Zscipy.sparser   r   Zscipy.sparse._constructrY   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'   r1   r2   r   r%   r%   r%   r&   <module>   s(        f