o
    hT                     @   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	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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%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)assert_allcloseassert_assert_array_almost_equalassert_equalassert_array_almost_equal_nulpsuppress_warnings)	csc_arraySparseEfficiencyWarning)	eye_array)expm_expmProductOperatorMatrixPowerOperator_onenorm_matrix_power_nnmmatrix_power)matrix)logm)	factorialbinomc                 C   s   | t | ks
| dk rtdt | } |t |ks|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blargesmall r'   [/var/www/vscode/kcb/lib/python3.10/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py_burkardt_13_power   s   ,r)   c                  C   sn   t jd tddD ])} tdD ]"}t j| | f}t j||}t||}t j|d}t|| qqd S )N        )	r   r   seedrangelinalgr   r   normr   )r!   r"   MMpobservedexpectedr'   r'   r(   test_onenorm_matrix_power_nnm;   s   
r5   c            
      C   s   t jd t jjdddd\} }t jjdd}t|| |ffdd}t|| |ffdd}| }d	D ]!}t|| }t|| }t j||}	t||	 t|| q2d S )
Nr*   r      )r      )size)r7   )r6   r6   )shape)r   r,   r7   )	r   r   r-   randintr   toarrayr   r/   r   )
rowcoldataAmatAAdenser   ApowAmat_pow
Adense_powr'   r'   r(   test_matrix_powerE   s   
rE   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   2   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_ndarrayU      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 rH   )r   r   r   r;   rJ   r'   r'   r(   test_zero_sparseY   s   "zTestExpM.test_zero_sparsec                 C   rG   rH   )r   r   r   rJ   r'   r'   r(   test_zero_matrix]   rM   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 | 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 | d S )Nr+   ))r+                 ?))rP   )r   r   r   r   r   r   r;   )rK   r@   Br'   r'   r(   test_misc_typesa   s   zTestExpM.test_misc_typesc                 C   s   t g dg dg d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 )N)r+      r   )r   r+   r,   )r   r   r   dtyper+   r   rS      r   r,   )	r   floatmathr   r   r   r   r;   r   )rK   r@   e1e2r4   r3   r'   r'   r(   test_bidiagonal_sparsen   s$   

zTestExpM.test_bidiagonal_sparsec                 C   ^   t jt jfD ]&}dD ]!}|td|d }t|}t||dtd|d }t||dd q
qd S N{Gz?皙?g      ?r+   
   rS   rT   d   nulp)r   float32float64r   r   r   r
   rK   rU   scaler@   r3   r4   r'   r'   r(   test_padecases_dtype_float|      z#TestExpM.test_padecases_dtype_floatc                 C   r\   r]   )r   	complex64
complex128r   r   r   r
   rg   r'   r'   r(   test_padecases_dtype_complex   rj   z%TestExpM.test_padecases_dtype_complexc              	   C   s   t j}dD ]O}|tdd|dd }t||dtd|d }t }|td t|dd	 }t|d	d	 }W d    n1 sAw   Y  t
||d
d t
||d
d qd S )Nr^   rS   cscrU   formatrT   Changing the sparsity structureT)use_exact_onenormFrb   rc   )r   rf   r   r   r   r   filterr   r   r;   r
   )rK   rU   rh   r#   esupexact_onenorminexact_onenormr'   r'   r(   !test_padecases_dtype_sparse_float   s   z*TestExpM.test_padecases_dtype_sparse_floatc              	   C   s   t j}dD ]:}|tdd|dd }t|td|d }t }|td tt	|
 |dd W d    n1 s:w   Y  qd S )	Nr^   rS   rn   ro   rT   rq   rb   rc   )r   rl   r   r   r   r   rs   r   r
   r   r;   )rK   rU   rh   r#   rt   ru   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 ]8}tddD ]0}dD ]+}t|t |||  |}t	|r8|dt || |  }t
tt|| qqqd S )Nr*   r+   ra   )-C6?MbP?r_   r`   r+   r   g      Y@rP   )r   r-   r   rf   rl   r.   r   randastypeiscomplexobjr   r   r   )rK   rU   r!   rh   r@   r'   r'   r(   test_logm_consistency   s   

zTestExpM.test_logm_consistencyc                 C   s<   t g dg dg dg dg}tt|td|  d S )N)r+   r+   r+   )r+   r   r+   r+   )r+   r+   r   r+   )r+   r+   r+   r         ?)r   r   r   r   rK   Qr'   r'   r(   test_integer_matrix   s   zTestExpM.test_integer_matrixc                 C   sh   t jg dg dg dg dgt jd}tt|td|  t|}tt| td|   d S )N)ii  r   r   )r   iih     )r   iv  ir   r   r   r   r   rT   r   )r   r   int16r   r   r   r;   r   r'   r'   r(   test_integer_matrix_2   s   
"zTestExpM.test_integer_matrix_2c           	      C   s   t jg dg dg dg dgtd}t jg dg dg dg d	gtd}tt||d
d td d}| }||d< t }|	t
d t|}W d    n1 sVw   Y  d
}d| }tt j||||d  d S )N)g3d?     L@r   r   )r   gRal!A?r   r   )r   r   gQI?r   )r   r   r   g^?rT   )g<gGgx@g9=g[dB)rI   g'V7gZ@g2p)rI   rI   gѤT g\GeE@)rI   rI   rI   gPǆ!rz   )rtolr*   gFFg<)r+   r   zIll-conditioned.*rb   )r   atol)r   r   rW   r   r   r   r-   copyr   rs   RuntimeWarningr   allclose)	rK   r@   A_logmtinyA_logm_perturbedru   A_expm_logm_perturbedr   r   r'   r'   r(   test_triangularity_perturbation   s8   	


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   rT   r   r   r   rW   r   r   )rK   exp1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+   rS   r   rT   gkQC@gb]IG@gd]IG@gJ[K@r   r   rW   r   r   rK   r@   r   r   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   iirT   &   i)r   r   r   rW   expm1r   r   )rK   r   exp39r@   r   r   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   rT   rS   r+   r6   r         g      ?ir   )r   r   rW   dotr   r   r   )rK   r@   UVwr   r   r'   r'   r(   test_burkardt_40  s   zTestExpM.test_burkardt_4c                 C   b   t jg dg dg dg dgtd}t jg dg dg dg d	gtd}t|}t|| d S )
N)r   r7   r   r   )r   r   r7   r   )r   r   r   r7   r   rT   )r+   r7      $   )r   r+   r7   r   )r   r   r+   r7   r   r   r   r+   r   r   r'   r'   r(   test_burkardt_5?  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   rT   r   )rK   r   r@   r   r   r'   r'   r(   test_burkardt_6S  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   rW   r   r   )rK   r   epsr@   r   r   r'   r'   r(   test_burkardt_7c  s    



zTestExpM.test_burkardt_7c                 C   s   t d}t d}t jg dg dg d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 )Nr6      )      r7   )r   i)r6   r6   r   rT      r,   r   ir   g      ?r   )rK   exp4exp16r@   r   r   r'   r'   r(   test_burkardt_8u  s(   

((zTestExpM.test_burkardt_8c                 C   r   )
N)r+   r   r   r   )rS   r+   r+   r   )rS   r   r+   r   )rS   rS   rS   r+   rT   )fa%@@X21@g鷯g)@)^Iچ@|Pk܂@g'@r   )v@gBfg;@r   r   )gDl{3@r   r   r   r   r   r'   r'   r(   test_burkardt_9  s$   zTestExpM.test_burkardt_9c                 C   l   t jg dg dg dgtd}tttj|d t jg dg dg dgtd}t|}t|| d S )	N)r6   r   r   )r+   r6   r+   )r+   r+   r6   rT   )rS   rS   r7   )gl$^{b@
|f@g.Q@)g\"N_@r   g
|V@)g\"N_@gLud@gs[@	r   r   rW   r   sortedscipyr/   eigvalsr   r   r'   r'   r(   test_burkardt_10  s"   zTestExpM.test_burkardt_10c                 C   sh   t jg dg dg dgtd}ttj|d t jg dg dg dgtd}t|}t|| d S )	N)g!=@l?QP)r   gt 9@猽誉\!@)r   r   g0n2A@rT   )      (   )gJކ3Cg;%s1PMSUc[)g;%s1Pgcx
MjCO}vC)r   r   g˂C)r   r   rW   r   r   r/   eigvalshr   r   r'   r'   r(   test_burkardt_11  s"   zTestExpM.test_burkardt_11c                 C   r   )	N)i}   r   )iz8   6   )i}9   4   rT   )ir   r   )g)'g13V?g-RR?)gǣg׃4V?g3?)gWNx`gp?g}mR?r   r   r'   r'   r(   test_burkardt_12  s"   zTestExpM.test_burkardt_12c           	      C   s   t dd}g dg dg dg dg}t|| dD ]U}tdttd| }tj||ftd	}t|| D ]+}t ||}t	t
|d
 tt|tdt||  |  ||t| 7 }q7tt |d}t|| qd S )Nr6   r+   )r   r+   r   r   )r   r   r+   r   r   )rz   r   r   r   )r   rS   r6   ra   r   rT   r   ra   )r)   r   maxr   r   ceilzerosrW   r.   r	   minr   floorr   r   )	rK   	A4_actual
A4_desiredr!   kr   r"   Apr   r'   r'   r(   test_burkardt_13  s$   


(zTestExpM.test_burkardt_13c                 C   sV   t jg dg dg dgtd}t jg dg dg dgtd}t|}t|| d S )N)r   g:0yE>r   )g"Dr   g    _B)gP@r   gPrT   )g .?gzDv>g1O?)gvUg԰gLg@sDQ)g F~?gg=>gcE?r   r   r'   r'   r(   test_burkardt_14  s    zTestExpM.test_burkardt_14c           	   	   C   s   dD ]k}t dddD ]b}|t|dd }t|dk r nOt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)r   r{   gư>r   P   rS   r   gYnr+   gvIh%<=)r   )
r.   r   arangeanyr    r   r   absr   r   )	rK   rh   r!   scr@   rQ   gotr4   r   r'   r'   r(   test_pascal  s&   zTestExpM.test_pascalc                 C   st   t d}d|d< t|}t }|td |td tt |}W d    n1 s.w   Y  t|| d S )N)   r   r+   )r   r   zthe matrix subclass.*)	r   r   r   r   rs   DeprecationWarningPendingDeprecationWarningr   r   )rK   r@   B0ru   rQ   r'   r'   r(   test_matrix_input  s   
zTestExpM.test_matrix_inputc              
   C   sr   t g dg dg dg dg dg dg dg}t| }td| }|}tdD ]}|| }q+t|| d S )N)r   r   r   rI   rI   rI   rI   )rI   r   rI   r   r   rI   rI   )rI   rI   r   rI   rI   r   r   )rI   rI   rI   rI   rI   rI   rI   i    )r   r   r   r.   r   )rK   LE0E1E2jr'   r'   r(   test_exp_sinch_overflow"  s   


z TestExpM.test_exp_sinch_overflowN)!__name__
__module____qualname__rL   rN   rO   rR   r[   ri   rm   rx   ry   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(   rF   T   s>    
$(rF   c                   @   s   e Zd Zdd Zdd ZdS )TestOperatorsc           
      C   s   t d d}d}d}t|D ]H}tj ||}tj ||}tj ||}tj ||}t|||}	t|	||||| t|	j	||||j	| qd S )Nr*   r,   r   ra   )
r   r-   r.   r   randnr   r   matmatr   T)
rK   r!   r   nsamplesir@   rQ   CDopr'   r'   r(   test_product_operator7  s   
"(z#TestOperators.test_product_operatorc           	      C   s   t d d}d}d}d}t|D ]7}tj ||}tj ||}t||}t||tj	||
| t|j|tj	||j
| qd S )Nr*   r,   r   rS   ra   )r   r-   r.   r   r   r   r   r   r/   r   r   r   )	rK   r!   r   r"   r  r  r@   rQ   r  r'   r'   r(   test_matrix_power_operatorE  s   

 &z(TestOperators.test_matrix_power_operatorN)r   r   r   r  r  r'   r'   r'   r(   r   5  s    r   ))__doc__rX   numpyr   r   r   r   r   numpy.testingr   r   r   r	   r
   r   scipy.sparser   r   scipy.sparse._constructr   scipy.sparse.linalg._matfuncsr   r   r   r   r   r   scipy.sparse._sputilsr   scipy.linalgr   scipy.specialr   r   r   scipy.sparse.linalgr)   r5   rE   rF   r   r'   r'   r'   r(   <module>   s*      
   d