o
    5ήc                     @   s4  d dl Z d dlZd dlZd dlZd dlmZmZmZ d dl	Z	d dl
mZmZmZ d dlmZmZmZmZ d dlmZmZ e jdrEdZndZd d	lmZ d d
lmZ d"ddZdd Z		d#ddZ		d$ddZG dd deZ G dd dZ!G dd dZ"G dd de!Z#G dd de!Z$G d d! d!e!Z%dS )%    N)assert_allcloseassert_equalassert_array_equal)hilbertsvd
null_space)
csc_matrix
isspmatrixspdiagsrandom)LinearOperatoraslinearoperatorSCIPY_USE_PROPACKTF)svds)ArpackNoConvergenceLMc                 C   s   t | r|  } t| \}}}|dkrt|| d  }n|dkr,t|d | }ntd|f |d d |f || || fS )Nr   SMzunknown which=%r)r	   toarrayr   npargsort
ValueError)mkwhichusvhii r   Q/tmp/pip-target-vg8gfxp4/lib/python/scipy/sparse/linalg/_eigen/tests/test_svds.py
sorted_svd   s   r    c                 C   s   t | t t ||S N)r   dotdiag)r   r   r   r   r   r   svd_estimate'   s   r$   绽|=Hz>c
                 C   s>  | j \}
}t|j |
|f t|j |f t|j ||f || |}t|j | j  |r4t|| ||	d t|j |}t|j ||f t|t|||	d t||j }t|j ||f t|t|||	d |rt| ||\}}}tt	|t	|||	d t||||	d tt	|t	|||	d d S d S )Natolrtol)
shaper   r"   r   r   Tconjidentityr    abs)Ar   r   r   r   r   check_usvh_A	check_svdr(   r)   nr   	A_rebuiltuh_uvh_vu2s2vh2r   r   r   _check_svds+   s(   
 r9   c
                 C   s  | j \}
}t|j |
|f t|j |f t|j ||f t|j |}t|j ||f tt|t| ||  }t	|d||	d t||j }t|j ||f tt|t| ||  }t	|d||	d |r| j | |j |  }tt||
|  }| |j  ||  }tt|||  }t	|d||	d t	|d||	d |rt
| ||\}}}t	||||	d || |}|| |}t|j | j  tt|| ||  }t	|d||	d d S d S )Ng        r'   )r*   r   r   r"   r+   r,   sumr.   r-   r   r    )r/   r   r   r   r   r   	check_resr1   r(   r)   r2   r   r4   errorr5   rurusrvhrvhsr6   r7   r8   A_rebuilt_svdr3   r   r   r   _check_svds_nL   s8   
""rB   c                   @   $   e Zd Zdd Zdd Zdd ZdS )CheckingLinearOperatorc                 C   s   || _ |j| _|j| _d S r!   )r/   dtyper*   )selfr/   r   r   r   __init__v   s   zCheckingLinearOperator.__init__c                 C   s"   t t|jt| | j|S r!   )r   maxr*   r   sizer/   r"   rF   xr   r   r   _matvec{   s   zCheckingLinearOperator._matvecc                 C   s(   t t|jt| | jj |S r!   )	r   rH   r*   r   rI   r/   r+   	conjugater"   rJ   r   r   r   _rmatvec   s   zCheckingLinearOperator._rmatvecN)__name__
__module____qualname__rG   rL   rN   r   r   r   r   rD   u   s    rD   c                
   @   s  e Zd ZdZdZdZdZdZe	g ge
efe	ddgdd	gge
efd
eefe	ddgddggge
efgZejdedd Zejdg ddd Zdd Zejddejejfdd Zejdg d
fdd Zejddd d! Zejd"d#ejd$ed	d%d&d' Zd(d) Zejd*d
dejd+ed,fd-d. Zejd/d0d1d2 Zd3d4 Zejd5d6d7d8 Z ejddd9gejdd:d;gd<d= Z!d>d? Z"d@dA Z#dBdC Z$ejdDdEdej%&dEej%'dEfdFdG Z(ejdDdej%&dEej%'dEfdHdI Z)dJdK Z*ejd5dLejdMdNdOdP Z+g dQg dRg dSg dTgZ,g dUg dVg dWg dXgZ-ejdYe,e-fejdedd9ejdZd#ejd"d[ejd\ej	e.e/fd]d^ Z0d_d` Z1daZ2ej3dbejdMe2ejdce4e5ej6fddde Z7ejdMdfejdce4e5fdgdh Z8ejdMdiejdce4e5fdjdk Z9ejdMdlejdce4e5ej6fdmdn Z:ej3doejdce4e5ej6fdpdq Z;dS )rSVDSCommonTestsNz`A` must not be empty.z5`A` must be of floating or complex floating data typeztype not understoodzarray must have ndim <= 2            hi      ?g       @g      @g      @argsc                 C   sN   |\}}}t j||d t|d| jd W d    d S 1 s w   Y  d S )NmatchrS   r   solver)pytestraisesr   r]   )rF   rY   r/   
error_typemessager   r   r   test_svds_input_validation_A   s   
"z,SVDSCommonTests.test_svds_input_validation_Ar   )r   rU   rV      g      ?1c                 C   s   t jd}|d}| jdkr2|dkr2tstd t||| jd}t||g|R ddd d S d	}tj	t
|d
 t||| jd W d    d S 1 sOw   Y  d S )Nr   rV   rU   propackrU   PROPACK not enabledr\   Tr0   r1   z!`k` must be an integer satisfyingrZ   )r   r   default_rngr]   has_propackr^   skipr   r9   r_   r   )rF   r   rngr/   resra   r   r   r   test_svds_input_validation_k_1   s   

"z.SVDSCommonTests.test_svds_input_validation_k_1c                 C      d}t jtt|d ttdg | jd W d    n1 s"w   Y  d}t jt	|d ttdd| jd W d    d S 1 sGw   Y  d S )Nint() argument must be arZ   
   r\   invalid literal for int()rW   
r^   r_   	TypeErrorreescaper   r   eyer]   r   rF   ra   r   r   r   test_svds_input_validation_k_2      "z.SVDSCommonTests.test_svds_input_validation_k_2tolrc   c                 C   N   d}t jt|d ttd|| jd W d    d S 1 s w   Y  d S )Nz2`tol` must be a non-negative floating point value.rZ   rr   r|   r]   r^   r_   r   r   r   rx   r]   rF   r|   ra   r   r   r    test_svds_input_validation_tol_1      "z0SVDSCommonTests.test_svds_input_validation_tol_1c                 C   r}   )Nz#'<' not supported between instancesrZ   rr   r~   )r^   r_   ru   r   r   rx   r]   r   r   r   r    test_svds_input_validation_tol_2   s   "z0SVDSCommonTests.test_svds_input_validation_tol_2r   )LASAekkir   c                 C   sJ   t jtdd ttd|| jd W d    d S 1 sw   Y  d S )Nz`which` must be inrZ   rr   r   r]   r   )rF   r   r   r   r    test_svds_input_validation_which   s   "z0SVDSCommonTests.test_svds_input_validation_which	transpose)TFr2   	   c           	      C   s   t jd}|d}||}|r|j}d}d}| jdkr#|jd nt|j}||krOtjt	|d t
|||| jd W d    d S 1 sHw   Y  d S d S )Nr   rd      rT   `v0` must have shaperg   rZ   r   v0r]   )r   r   rj   r+   r]   r*   minr^   r_   r   r   )	rF   r   r2   rm   r/   r   r   ra   required_lengthr   r   r   test_svds_input_validation_v0_1   s   

"z/SVDSCommonTests.test_svds_input_validation_v0_1c                 C   s^   t d}t d}d}tjt|d t|d|| jd W d    d S 1 s(w   Y  d S )Nrr   rr   )rS   rr   r   rZ   rS   r   r   onesr^   r_   r   r   r]   )rF   r/   r   ra   r   r   r   test_svds_input_validation_v0_2   s   

"z/SVDSCommonTests.test_svds_input_validation_v0_2r   rr   rE   c                 C   sT   t d}d}tjt|d t|d|| jd W d    d S 1 s#w   Y  d S )Nr   z7`v0` must be of floating or complex floating data type.rZ   rS   r   r   )rF   r   r/   ra   r   r   r   test_svds_input_validation_v0_3   s
   
"z/SVDSCommonTests.test_svds_input_validation_v0_3maxiter)rc   r   g      @c                 C   r}   )Nz%`maxiter` must be a positive integer.rZ   rr   r   r]   r   )rF   r   ra   r   r   r   $test_svds_input_validation_maxiter_1   r   z4SVDSCommonTests.test_svds_input_validation_maxiter_1c                 C   rp   )Nrq   rZ   rr   r   rs   rW   rt   ry   r   r   r   $test_svds_input_validation_maxiter_2   r{   z4SVDSCommonTests.test_svds_input_validation_maxiter_2rsv)r   rr   c                 C   r}   )Nz$`return_singular_vectors` must be inrZ   rr   )return_singular_vectorsr]   r   )rF   r   ra   r   r   r   2test_svds_input_validation_return_singular_vectors   r   zBSVDSCommonTests.test_svds_input_validation_return_singular_vectorsrd   r   r   c                 C   s   | j dkrtstd tjd}|d}| j dkr>tjtdd t	|||| j dd}W d    n1 s8w   Y  n
t	|||| j dd}t
||g|R |d	d
 d S )Nrg   PROPACK not availabler   r   lobpcgThe problem sizerZ   )r   r   r]   random_stateg|>)r   r(   )r]   rk   r^   rl   r   r   rj   warnsUserWarningr   r9   )rF   r   r   rm   r/   rn   r   r   r   test_svds_parameter_k_which  s    



z+SVDSCommonTests.test_svds_parameter_k_whichc           	         s   j dkrtstd d S )Nrg   r   )r]   rk   r^   rl   r   r   rj   r+   r   r   zip)	rF   rm   _errtols
accuraciesr|   accuracyr<   r   )r/   r   r2   r   rF   r   test_svds_parameter_tol  s   

z'SVDSCommonTests.test_svds_parameter_tolc                 C   s  | j dkrtstd d}d}tjd}|||f}||}t|||| j dd}t|||| j dd}t|| t	||g|R   ||}t|||| j dd}	t|||| j dd}
t|	|
 t	||g|	R   d	}tj
t|d
 t||	 W d    d S 1 sw   Y  d S )Nrg   r   d   rS   r   )r   r]   r   rT   rU   Arrays are not equalrZ   r]   rk   r^   rl   r   r   rj   r   r   r9   r_   AssertionError)rF   r2   r   rm   r/   v0ares1ares2av0bres1bres2bra   r   r   r   test_svd_v0J  s*   





"zSVDSCommonTests.test_svd_v0c           
      C   s   | j dkrtstd d}d}tjd}|||f}t||| j dd}t||| j dd}t|| t	||g|R   t||| j dd}t||| j dd}t|| t	||g|R   d}	tj
t|	d t|| W d    d S 1 sww   Y  d S )	Nrg   r   r   rS   r   r]   r   r   rZ   r   )
rF   r2   r   rm   r/   r   r   r   r   ra   r   r   r   test_svd_random_statem  s&   



"z%SVDSCommonTests.test_svd_random_stater   r   c           	      C   s   | j dkrtstd d}d}tjd}|||f}t|}t	||| j |d}t	||| j |d}t
|| t||g|R   d S )Nrg   r   r   rS   r   r   )r]   rk   r^   rl   r   r   rj   copydeepcopyr   r   r9   )	rF   r   r2   r   rm   r/   random_state_2r   r   r   r   r   test_svd_random_state_2  s   



z'SVDSCommonTests.test_svd_random_state_2c           	      C   s   | j dkrtstd d}d}tjd}|||f}t||| j |d}t||| j |d}t||g|R ddd	 t||g|R ddd	 d
}tj	t
|d t|| W d    d S 1 scw   Y  d S )Nrg   r   r   rd   r   r   g|=ư>r'   r   rZ   )r]   rk   r^   rl   r   r   rj   r   r9   r_   r   r   )	rF   r   r2   r   rm   r/   r   r   ra   r   r   r   test_svd_random_state_3  s   

"z'SVDSCommonTests.test_svd_random_state_3c           
   	   C   s  | j dkrtstd td}d}t||\}}}| j dkrCd}tjt|d t||dd| j d	 W d    n1 s=w   Y  nv| j d
krd}tjt	|d6 tj
tdd t||d| j d\}}}	W d    n1 spw   Y  tt|t| W d    n1 sw   Y  n)| j dkrd}tjtjj|d t||d| j d W d    n1 sw   Y  t||| j d\}}}t||||| d S )Nrg   r      rS   arpackzARPACK error -1: No convergencerZ   rU   )ncvr   r]   r   zNot equal to tolerancezExited at iterationr   z-k=1 singular triplets did not converge withinr]   )r]   rk   r^   rl   r   r    r_   r   r   r   r   r   r   r   r.   linalgLinAlgErrorr9   )
rF   r/   r   r   r   r   ra   r6   r7   r8   r   r   r   test_svd_maxiter  s8   




z SVDSCommonTests.test_svd_maxiter)TFr   r   r*   )r   )r   r   )r   rd   c                 C   sz  | j dkrtstd tjd}||}d}|\}}t||\}}	}
| j dkr,dn||k}| j dkr7dn||k}| j dkrtjt	dd |d	u r]t
|||| j |d
}t||	 n|dkr|rt
|||| j |d
\}}}tt|t| t||	 |d u sJ nk|dkr|rt
|||| j |d
\}}}|d u sJ t||	 tt|t|
 nIt
|||| j |d
\}}}|d urtt|t| t||	 |d urtt|t|
 W d    d S W d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S |d	u r+t
|||| j |d
}t||	 d S |dkrY|rYt
|||| j |d
\}}}tt|t| t||	 |d u sWJ d S |dkr|rt
|||| j |d
\}}}|d u suJ t||	 tt|t|
 d S t
|||| j |d
\}}}|d urtt|t| t||	 |d urtt|t|
 d S d S )Nrg   r   r   rT   Tr   r   rZ   F)r   r]   r   r   r   )r]   rk   r^   rl   r   r   rj   r    r   r   r   r   r.   )rF   r   r*   rm   r/   r   MNr   r   r   	respect_u
respect_vhr7   r6   r8   r   r   r    test_svd_return_singular_vectors  s   







$





z0SVDSCommonTests.test_svd_return_singular_vectors)rS   rT   rU   )rU   rV   rU   )y      ?      ?r   rT   )r   r   rS   )rS   rT   rU   y       @      @)y      @       rV   rU   rd   )rS   r   rT   rU   )r   r   rS   r   r/   real)FTlo_typec           
      C   sT  | j dkrtstd t|}|rt|n|}|r|jn|}||}|t|j	kr1td | j dkrB|t|j	krBtd | j dkrW|sW|t|j	d krWtd | j dkrkt
djd	k rk|sktd
 | j dkrtjtdd t||| j d\}}}	W d    n1 sw   Y  nt||| j d\}}}	t|||||	dd d S )Nrg   r   z)`k` cannot be greater than `min(A.shape)`z"Only PROPACK supports complete SVDr   rS   3ARPACK has additional restriction for complex dtyper      BPROPACK complex-valued SVD methods not available for 32-bit buildsr   r   rZ   r   gLa㧝=)r(   )r]   rk   r^   rl   r   asarrayr   r+   r   r*   intpitemsizer   r   r   r9   )
rF   r/   r   r   r   r   A2r   r   r   r   r   r   test_svd_simple$  s,   





 


zSVDSCommonTests.test_svd_simplec                 C   s  | j }| j dkrtstd g d}dd }|D ]9\}}}tjd||}t|}|dkr7t	|}	nt	t
|j}	|dkrutjtdd	" |t|||	|d
\}
}}|t|||	|d
\}}}W d    n1 sow   Y  n|t|||	|d
\}
}}|t|||	|d
\}}}tt|
t| t|| tt|t| tt|
tt||t|tt|| tjd||}t|}|dvrd|	ini }| j dkrtjtdd	* |t||fd|d|\}
}}|t||fd|d|\}}}W d    n	1 sw   Y  n"|t||fd|d|\}
}}|t||fd|d|\}}}tt|
t| t|d |d  tt|t| tt|
tt||t|tt|| |t
||d k rStdftjdffD ]\}}| j dkrtdjdk rtd tjd}|||d|||  |}t|}| j dkrtjtdd	" |t||d|d\}
}}|t||d|d\}}}W d    n	1 sw   Y  n|t||d|d\}
}}|t||d|d\}}}tt|
t||d t|||d tt|t||d tt|
tt||t|tt|||d qqd S )Nrg   r   ))r   r   rU   )r   rd   rV   )rr   r   rd   c                 S   s:   | \}}}t |}|d d |f || ||d d f fS r!   )r   r   )rY   Ur   VHjr   r   r   reorderT  s   

&z/SVDSCommonTests.test_svd_linop.<locals>.reorder4   r   r   rZ   )r   r]   iu  >   Nr   r   r   r   rS   r&   MbP?r   r   r   ip                ?r   )r)   )r]   rk   r^   rl   r   r   RandomStaterandnrD   r   r   r*   r   r   r   r   r.   r"   r#   complex	complex64r   r   astype)rF   r]   nmksr   r2   r   r   r/   Lr   U1s1VH1U2r7   VH2kwargsdtepsrm   r   r   r   test_svd_linopJ  s   



"




zSVDSCommonTests.test_svd_linop))r   r   )r   e   )r   r   zignore:Exited at iterationrE   c              
   C   s   | j }|dkrtd tjd}d}|\}}t||d|d}|tkr.dt||d|d }t|}	|	dd  dtd	dd
 9  < t	|	d||| }|
|}t||d|dd\}
}}d}t|||
||d|dd d S )Nrg   z PROPACK failures unrelated to PRr   rd   g?)densityr   r         $@rS   r   i  )r   r]   r   F)r   r1   r(   )r]   r^   rl   r   r   rj   r   r   aranger
   r   r   rB   )rF   r*   rE   r]   rm   r   r   r2   Ser   r   r   c_svdr   r   r   test_small_sigma_sparse  s    

"
z'SVDSCommonTests.test_small_sigma_sparse))r   rd   )rd   rd   )rd   r   c              	   C   s   d}|\}}t j||f|d}| jdkr7tjtdd t||| jd\}}}	W d    n1 s1w   Y  nt||| jd\}}}	t|||||	ddd	 tt 	|t 
||  t t|d d
 d }t |}
t||
 d S )NrU   r   r   r   rZ   r   TFri   rc   rS   )r   r   r]   r^   r   r   r   r9   r   rH   sqrtarraysorted	ones_like)rF   r*   rE   r   r2   r   r/   r   r   r   zr   r   r   test_svd_LM_ones_matrix  s   

z'SVDSCommonTests.test_svd_LM_ones_matrix)rU   rV   )rV   rV   rf   )rV   rT   c           
   	   C   s   d}|\}}t j||f|d}| jdkr&|tu r&|t|jd kr&td | jdkrNtjt	dd t
||| jd\}}}	W d    n1 sHw   Y  nt
||| jd\}}}	t|||||	d	d
d t|d d S )NrS   r   r   r   r   r   rZ   r   TFri   r   )r   zerosr]   r   r   r*   r^   rl   r   r   r   r9   r   )
rF   r*   rE   r   r2   r   r/   r   r   r   r   r   r   test_svd_LM_zeros_matrix  s   

z(SVDSCommonTests.test_svd_LM_zeros_matrix))   r   )r      )r  r   c              
   C   s   t std |tkr| jdkrtd tjd}|||}t	|dd\}}}|tj
kr4d}nd}|tt| | }	||	 |}d	}
t||
| jd
d\}}}t|dk}	t|	|
 t||
|||dddd d S )Nrh   rg   %PROPACK unsupported for complex dtypetA
F)full_matricesr   g      Y@rV   r   )r]   r   r   r   rX   )r(   r)   r1   )rk   r^   rl   r   r]   r   r   rj   r   r   float32r   lenr"   r   r:   r   rB   )rF   r*   rE   rm   r/   r   r   r   r   tr   r   r   r   r   test_small_sigma  s"   



z SVDSCommonTests.test_small_sigmazignore:The problem sizec                 C   sf  t std |tkr| jdkrtd tjd}d}d}|||| f}|d d d |f || }t||f}|	|}t
|}t|jd | t|\}	}
}t|
| d  dd	d
d t||| d d d f j dd	d
d t|}t||d| jd\}}}t|ddd
d |j\}}||krt||j ddd
d d S t| | ddd
d d S )Nrh   rg   r  r  rV   rr   rS   r   r   rX   r'   r   )r   r   r]   gh㈵>)rk   r^   rl   r   r]   r   r   rj   hstackr   r   r   r*   r   r   r+   r   r   r   )rF   rE   rm   dimrI   rK   ymatnzr   r   r   sp_matsusssvhr2   r   r   r   r   test_small_sigma2  s.   


(
z!SVDSCommonTests.test_small_sigma2)<rO   rP   rQ   r]   _A_empty_msg_A_dtype_msg_A_type_msg_A_ndim_msgr   r   r   ru   _A_validation_inputsr^   markparametrizerb   ro   rz   infnanr   r   r   ranger   r   r   intr   r   r   r   r   r   r   r   r   r   rj   r   r   r   r   A1r   r   r   r   r   SHAPESfilterwarningsfloatr   r  r   r   r   r  r  r   r   r   r   rR      s    







,# 






G\

rR   c                   @   s&   e Zd Zejddegdd ZdS )Test_SVDS_oncer]   r   c                 C   sL   d}t jt|d ttdd|d W d    d S 1 sw   Y  d S )Nzsolver must be one ofrZ   r   rT   r\   )r^   r_   r   r   r   r   )rF   r]   ra   r   r   r   !test_svds_input_validation_solver?  s   "z0Test_SVDS_once.test_svds_input_validation_solverN)rO   rP   rQ   r^   r  r  objectr#  r   r   r   r   r"  >  s    r"  c                   @   sD   e Zd Zdd Zejdeeddddg dd	 Z	d
d Z
dS )Test_SVDS_ARPACKc                 C   
   d| _ d S )Nr   r   rF   r   r   r   setup_methodH     
zTest_SVDS_ARPACK.setup_methodr   rc   r   g      @5c           	      C   s   t jd}|d}d}|dv r't|||| jd\}}}t||||| d S d}tjt|d t|||| jd W d    d S 1 sEw   Y  d S )Nr   )r   r   rU   >   rV   rd   )r   r   r]   z#`ncv` must be an integer satisfyingrZ   )	r   r   rj   r   r]   r9   r^   r_   r   )	rF   r   rm   r/   r   r   r   r   ra   r   r   r    test_svds_input_validation_ncv_1K  s   
"z1Test_SVDS_ARPACK.test_svds_input_validation_ncv_1c                 C   rp   )Nrq   rZ   rr   )r   r]   rs   rW   rt   ry   r   r   r    test_svds_input_validation_ncv_2Z  r{   z1Test_SVDS_ARPACK.test_svds_input_validation_ncv_2N)rO   rP   rQ   r(  r^   r  r  listr  r+  r,  r   r   r   r   r%  F  s
    
r%  c                   @   s   e Zd Zdd Zdd ZdS )Test_SVDS_LOBPCGc                 C   r&  )Nr   r   r'  r   r   r   r(  k  r)  zTest_SVDS_LOBPCG.setup_methodc                 C   s   t d d S )Nz'LOBPCG is having trouble with accuracy.r^   xfailr'  r   r   r   r   n  s   z(Test_SVDS_LOBPCG.test_svd_random_state_3N)rO   rP   rQ   r(  r   r   r   r   r   r.  i  s    r.  c                   @   rC   )Test_SVDS_PROPACKc                 C   r&  )Nrg   r   r'  r   r   r   r(  t  r)  zTest_SVDS_PROPACK.setup_methodc                 C      d}t | d S NzZPROPACK does not return orthonormal singular vectors associated with zero singular values.r/  ry   r   r   r   r   w  s   z)Test_SVDS_PROPACK.test_svd_LM_ones_matrixc                 C   r2  r3  r/  ry   r   r   r   r   ~  s   z*Test_SVDS_PROPACK.test_svd_LM_zeros_matrixN)rO   rP   rQ   r(  r   r   r   r   r   r   r1  r  s    r1  )r   )r   FTr%   r&   )r   TTr%   r&   )&osrv   r   numpyr   numpy.testingr   r   r   r^   scipy.linalgr   r   r   scipy.sparser   r	   r
   r   scipy.sparse.linalgr   r   environgetrk   r   !scipy.sparse.linalg._eigen.arpackr   r    r$   r9   rB   rD   rR   r"  r%  r.  r1  r   r   r   r   <module>   sB    

!
)     ;#	