o
    Eb                     @   s  d dl Z 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mZ e jds8ejdZejdejd	ejdejd	iZejejejejd
Zdd Zdd Zg ZeD ]%Zdev rle rlejjgZndev rvejjgZng Ze ej!ee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'deej'dd d!d" Z*ej'd#d$ej'dd%d&d' Z+ejjej, d(d) Z-dS )+    N)assert_allclose)raises)_svdp)
csr_matrix
csc_matrix
coo_matrixZUSE_PROPACKzUSE_PROPACK not setg-C6?g:0yE>singledoublecomplex8	complex16c                 C   s   t | j S )N)npdtypecharisupper)r    r   H/usr/lib/python3/dist-packages/scipy/sparse/linalg/tests/test_propack.pyis_complex_type   s   r   c                   C   s
   t jdkS )Nl        )sysmaxsizer   r   r   r   is_32bit!   s   
r   complex)marksc           	      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 matrix
   y              @y              $@r      )r   randomZRandomStater   Zrandastypereal)	constructornmfr   ZrseedkwargsrngMr   r   r   generate_matrix2   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   (r4   皙?c                 C   s   t | }ttj| |||}	||	}
tjj|	dd\}}}t|
||||d\}}}}| dkrCt||d}t||d}t||}t	|d | |||d t
||||d t
|j|j||d d S )NF)Zfull_matrices)kwhichirl_modetolSMr'   r   r(   )TOLSr&   r   Zasarraylinalgsvdr   upperZrollr   r4   r.   )r    r!   r   r   r6   r8   r7   r"   r9   r%   ZMspr1   Zsigma1vt1r2   Zsigma2vt2_r   r   r   
check_svdpE   s   
rB   ctor	precisionirl)TFr7   )ZLMr:   c           	   	   C   s   t jd t| }d\}}}|dkr:|s:d}tt|d t||| |||| W d    d S 1 s3w   Y  d S t rft|rfd}tt	|d t||| |||| W d    d S 1 s_w   Y  d S t||| |||| d S )Nr   )r         r:   z#`which`='SM' requires irl_mode=True)matchz1PROPACK complex-valued SVD methods not available )
r   r   seed
_dtype_mapassert_raises
ValueErrorrB   r   r   	TypeError)	rC   rD   rE   r7   r   r    r!   r6   messager   r   r   	test_svdp]   s   
""rO   )FTc                 C   s  ddddd|  }t jt}d}t j||}tj|dd}t|  }| dv r1|d	  	|}n| d
v r>|d  	|}d}	t
||	|dd\}
}}}| d
v rRd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 )NgiUMu?g&.>gMbP?r   zpropack_test_data.npzT)Zallow_pickle>   r
   r	   ZA_real>   r   r   Z	A_complex   r   )r8   Zrandom_state   r'   )r*   )ospathdirname__file__joinr   loadrJ   itemr   r   r   r/   r0   r-   r.   r<   r=   ZtodenseZdiagZnorm)rD   rE   r*   Zpath_prefixZrelative_pathfilenamedatar   r3   r6   usZvhrA   Zsv_checkZu3Zs3Zvh3ZA3Zreconr   r   r   test_examplesr   s>   $$r]   shifts)Nir   r'   r   F   )r	   r
   c                 C   s   t jd d\}}t j||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   r_   r   r'   r   T)r^   Zkmaxr8   )r   r   rI   minpytestr   rL   r   )r^   rD   r    r6   r3   r   r   r   test_shifts   s   &"rc   c            
      C   sn   t jd d\} }t j| | ft j}t||d ddd\}}}}t||dddd\}}}	}t|| d S )Nr   r`   r:   T)r^   r7   r8       )r   r   rI   r   r
   r   r   )
r    r6   r3   r1   s1r?   rA   r2   s2r@   r   r   r   test_shifts_accuracy   s   rg   )r5   ).rR   rb   r   Znumpyr   Znumpy.testingr   r   rK   Zscipy.sparse.linalg._svdpr   Zscipy.sparser   r   r   environgetZmarkskipZ
pytestmarkZfloat32Zfloat64Z	complex64Z
complex128r;   rJ   r   r   Z_dtype_testingr   r   ZslowappendZparamtuplefloatr&   r4   rB   ZparametrizeZarrayrO   r]   rc   Zxfailrg   r   r   r   r   <module>   sb    

1