U
    Gvf                     @   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 ejdejdejdejdiZdd	 Zd
d Zdd Zg Ze D ]fZg Zeere rejjgZn,e reejdkrejjgZn
ejjgZeej eeej!d qe"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ej*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_matrix
csc_matrixg-C6?g:0yE>c                 C   s   t | jdkS )Nc)npdtypekind)r	    r   J/tmp/pip-unpacked-wheel-96ln3f52/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   c                   C   s
   dt jkS )Nwin32)r   platformr   r   r   r   
is_windows   s    r      )marksidc           	      K   s   t j|}t|rDdd|||  d d|||  |}ndd|||  |}d||jd| d k< | |f|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    r2   皙?c                 C   s   t | }ttj| |||}	||	}
tjj|	dd\}}}t|
||||d\}}}}| dkrt||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   r2   r,   )r   r   r   r	   r4   r6   r5   r    r7   r#   ZMspr/   Zsigma1vt1r0   Zsigma2vt2_r   r   r   
check_svdpE   s    
r@   ctorr	   irl)TFr5   )ZLMr8   c              	   C   s   t jd d\}}}|dkrT|sTd}tt|d t||| |||| W 5 Q R X nTt rt|rd}tt|d t||| |||| W 5 Q R X nt||| |||| d S )Nr   )r         r8   z#`which`='SM' requires irl_mode=True)matchz1PROPACK complex-valued SVD methods not available )	r   r   seedassert_raises
ValueErrorr@   r   r   	TypeError)rA   r	   rB   r5   r   r   r4   messager   r   r   	test_svdp]   s    
  rK   )FTx   c                 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| rh|d  | }n|d  | }d	}t|||d
d\}	}
}}t| rd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   )r6   Zrandom_state   r%   )r(   )r   float32float64	complex64
complex128ospathdirname__file__joinloadr   itemr   r   r   r-   r.   r+   r,   r:   r;   ZtodenseZdiagZnorm)r	   rB   r(   Zpath_prefixrelative_pathfilenamedatar1   r4   usZvhr?   Zsv_checku3Zs3Zvh3ZA3Zreconr   r   r   test_examplesq   sB        $$r`   shifts)Nir   r%   r   F      c              	   C   s   t jd d\}}t j||f}| d k	rx| dk sJ|t|d |  |krxtt t||| d| dd W 5 Q R X nt||| d| dd d S )Nr   rb   r   r%   r   T)ra   Zkmaxr6   )r   r   rF   minpytestr   rH   r   )ra   r	   r   r4   r1   r   r   r   test_shifts   s    &"rg   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   rd   r8   T)ra   r5   r6       )r   r   rF   r   doubler   r   )
r   r4   r1   r/   s1r=   r?   r0   s2r>   r   r   r   test_shifts_accuracy   s    rl   )r3   )/rS   rf   r   Znumpyr   Znumpy.testingr   r   rG   Zscipy.sparse.linalg._svdpr   Zscipy.sparser   r   rO   rP   rQ   rR   r9   r   r   r   Z_dtypeskeysZdtype_flavourr   markskipr	   itemsizeZslowappendparam__name__tuplefloatr$   r2   r@   ZparametrizearrayrK   timeoutr`   rg   Zxfailrl   r   r   r   r   <module>   sh       

 


0