o
    h                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ ejdejdejdejdiZdd	 Zg Ze D ]Zg ZeerKejjgZeejeeejd
 q>eeZed fddZdd Zd$ddZ ej!dej"eefej!deej!ddej!dddd Z#ejj$ej!deej!dddd Z%ej!ddej!dedd d d! Z&ejjej' d"d# Z(dS )%    N)assert_allclose)raises)_svdp)	csr_array	csc_arrayg-C6?g:0yE>c                 C   s   t | jdkS )Nc)npdtypekind)r	    r   Z/var/www/vscode/kcb/lib/python3.10/site-packages/scipy/sparse/linalg/tests/test_propack.pyis_complex_type   s   r   )marksidc           	      K   s   t j|}t|r"dd|||  d d|||  |}ndd|||  |}d||jd| d k< | |fi |S )zGenerate a random sparse array
   y              @y              $@r      )r   randomRandomStater   randastypereal)	constructornmfr	   rseedkwargsrngMr   r   r   generate_matrix"   s   r    c                 C   s>   t t|  j|}t|t| jd |jd ||d dS )z7Check that the first k rows of u1 and u2 are orthogonal   rtolatolN)absr   dotconjTr   eyeshape)u1u2r#   r$   Ar   r   r   assert_orthogonal/   s   (r.   皙?c              	   C   s   t | }ttj| |||}	||	}
tjj|	dd\}}}t|
||||tjdd\}}}}|	 dkrHt
||d}t
||d}t
||}t|d | |||d t||||d t|j|j||d d S )NF)full_matricesr   )kwhichirl_modetolr   SMr!   r"   )TOLSr    r   asarraylinalgsvdr   r   default_rngupperrollr   r.   r(   )r   r   r   r	   r1   r3   r2   r   r4   r   Mspr+   sigma1vt1r,   sigma2vt2_r   r   r   
check_svdp5   s   
rC   ctorr	   irl)TFr2   )LMr5   c              	   C   s   t jd d\}}}|dkr6|s6d}tt|d t||| |||| W d    d S 1 s/w   Y  d S t||| |||| d S )Nr   )r         r5   z#`which`='SM' requires irl_mode=True)match)r   r   seedassert_raises
ValueErrorrC   )rD   r	   rE   r2   r   r   r1   messager   r   r   	test_svdpM   s   
"rN   )FTc                 C   s  t jdt jdt jdt jdi|  }tjt}d}tj	||}t j
|dd}t| r5|d  | }n	|d  | }W d    n1 sHw   Y  d	}t|||t jd
d\}	}
}}t| redn|}|	d d d |f }	|d |d d f }|
d | }
tt |	jd |	 j|	 |d tt |jd
 || j |d t j| \}}}|d d d |f }|d | }|d |d d f }|t | | }|	t |
 | }tt j|| d
|d d S )NgC8
!?g&.>gMbP?zpropack_test_data.npzT)allow_pickle	A_complexA_real   r   )r3   r      r!   )r$   )r   float32float64	complex64
complex128ospathdirname__file__joinloadr   itemr   r   r   r:   r   r)   r*   r'   r(   r8   r9   todensediagnorm)r	   rE   r$   path_prefixrelative_pathfilenamedatar-   r1   usvhrB   sv_checku3s3vh3A3reconr   r   r   test_examples\   s>    $$ro   shifts)Nir   r!   r   F      c              	   C   s   t jd}d\}}|||f}| d urH| dk s$|t|d |  |krHtt t||| d| d|d W d    d S 1 sAw   Y  d S t||| d| d|d d S )Nr   rq   r   r!   r   T)rp   kmaxr3   r   )r   r   r:   minpytestr   rL   r   )rp   r	   r   r   r1   r-   r   r   r   test_shifts   s   &"rw   c                  C   sp   t jd} d\}}| ||ft j}t||d dd| d\}}}}t||ddd| d\}}	}
}t||	 d S )Nr   rs   r5   T)rp   r2   r3   r       )r   r   r:   r   rU   r   r   )r   r   r1   r-   r+   s1r?   rB   r,   s2rA   r   r   r   test_shifts_accuracy   s   r{   )r/   ))rX   rv   numpyr   numpy.testingr   r   rK   scipy.sparse.linalg._svdpr   scipy.sparser   r   rT   rU   rV   rW   r6   r   _dtypeskeysdtype_flavourr   markslowappendparam__name__tuplefloatr    r.   rC   parametrizearrayrN   xslowro   rw   xfailr{   r   r   r   r   <module>   sR    



/