o
    i                     @   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   `/home/kim/smarthome/.venv/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   randomZRandomStater   Zrandastypereal)	constructornmfr	   Z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)Zfull_matricesr   )kwhichirl_modetolr   SMr   r   )TOLSr   r   Zasarraylinalgsvdr   r   default_rngupperZrollr   r+   r%   )r   r   r   r	   r-   r/   r.   r   r0   r   ZMspr(   Zsigma1vt1r)   Zsigma2vt2_r   r   r   
check_svdp5   s   
r:   ctorr	   irl)TFr.   )ZLMr1   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         r1   z#`which`='SM' requires irl_mode=True)match)r   r   seedassert_raises
ValueErrorr:   )r;   r	   r<   r.   r   r   r-   messager   r   r   	test_svdpM   s   
"rD   )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)Zallow_pickleZ	A_complexZA_real   r   )r/   r      r   )r!   )r   float32float64	complex64
complex128ospathdirname__file__joinloadr   itemr   r   r   r5   r   r&   r'   r$   r%   r3   r4   ZtodenseZdiagZnorm)r	   r<   r!   Zpath_prefixZrelative_pathfilenamedatar*   r-   usZvhr9   Zsv_checku3Zs3Zvh3ZA3Zreconr   r   r   test_examples\   s>    $$rW   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   rY   r   r   r   T)rX   Zkmaxr/   r   )r   r   r5   minpytestr   rB   r   )rX   r	   r   r   r-   r*   r   r   r   test_shifts   s   &"r^   c                  C   sp   t jd} d\}}| ||ft j}t||d dd| d\}}}}t||ddd| d\}}	}
}t||	 d S )Nr   r[   r1   T)rX   r.   r/   r       )r   r   r5   r   rH   r   r   )r   r   r-   r*   r(   s1r7   r9   r)   s2r8   r   r   r   test_shifts_accuracy   s   rb   )r,   ))rK   r]   numpyr   Znumpy.testingr   r   rA   Zscipy.sparse.linalg._svdpr   Zscipy.sparser   r   rG   rH   rI   rJ   r2   r   Z_dtypeskeysZdtype_flavourr   markZslowappendparam__name__tuplefloatr   r+   r:   ZparametrizearrayrD   ZxslowrW   r^   Zxfailrb   r   r   r   r   <module>   sR    



/