o
    Eb"                     @   s   d dl m  mZ d dlZd dlmZmZm	Z	 d dl
mZ d dl mZ d dlmZmZmZmZ d dlZd dlmZ d dlZejdk Ze dd	 Zejejejgd
dd Ze dd Ze dd ZG dd dZdS )    N)hilbertsvdvalsnormaslinearoperator)interp_decomp)assert_assert_allcloseassert_equalassert_array_equal)raisesl        c                   c   s    dV  d S )N-q= r   r   r   G/usr/lib/python3/dist-packages/scipy/linalg/tests/test_interpolative.pyeps+   s   
r   )paramsc                 c   s    d}t || jV  d S )Ni,  )r   astypeZparam)Zrequestnr   r   r   A0   s   r   c                 c   s    t | V  d S )Nr   )r   r   r   r   L8   s   r   c                 C   sL   t jj| dd}zt ||k d d }W |S  ty%   | jd }Y |S w )NF)Z
compute_uvr   )nplinalgsvdZnonzero
IndexErrorshape)r   r   Srankr   r   r   r   =   s   r   c                   @   s  e Zd Zejdg ddd Zejdg ddd Zejddgdd	 Zejdg dd
d Z	ejdg ddd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zejd ejejgejd!d"d#gejd$d%d&gd'd( Zd)S )*TestInterpolativeDecompositionzrand,lin_op)FF)TF)TTc                 C   sv   t r|jtjkr|rtd |s|n|}tj|||d\}}}	t|d d |d | f ||	}
t	||
|dd d S Nbug in external fortran coderand:0yE>ZrtolZatol
	_IS_32BITdtyper   complex_pytestxfail
pymatrixidr   Zreconstruct_matrix_from_idr	   )selfr   r   r   r"   lin_opA_or_LkidxprojBr   r   r   test_real_id_fixed_precisionI   s   
"z;TestInterpolativeDecomposition.test_real_id_fixed_precisionc                 C   sx   t r|jtjkr|rtd |}|s|n|}tj|||d\}	}
t|d d |	d | f |	|
}t	|||dd d S r   r%   )r,   r   r   r   r   r"   r-   r/   r.   r0   r1   r2   r   r   r   test_real_id_fixed_rankV   s   
"z6TestInterpolativeDecomposition.test_real_id_fixed_rankr   c                 C   sz   |}|s|n|}t j|||d\}	}
t |	|
}t |||	}t||d d |	d | f |dd t|| ||dd d S )Nr!   r#   r$   )r+   r   reconstruct_interp_matrixreconstruct_skel_matrixr	   )r,   r   r   r   r   r"   r-   r/   r.   r0   r1   Pr2   r   r   r   %test_real_id_skel_and_interp_matricesc   s   $zDTestInterpolativeDecomposition.test_real_id_skel_and_interp_matricesc                 C   sf   t r|jtjkr|rtd |s|n|}tj|||d\}}}	|| |	j	  }
t
||
|dd d S r   r&   r'   r   r(   r)   r*   r+   r   Tconjr	   )r,   r   r   r   r"   r-   r.   Ur   Vr2   r   r   r   test_svd_fixed_precisono   s   
z6TestInterpolativeDecomposition.test_svd_fixed_precisonc                 C   sj   t r|jtjkr|rtd |}|s|n|}tj|||d\}	}
}|	|
 |j	  }t
|||dd d S r   r9   )r,   r   r   r   r   r"   r-   r/   r.   r<   r   r=   r2   r   r   r   test_svd_fixed_rank{   s   
z2TestInterpolativeDecomposition.test_svd_fixed_rankc                 C   sf   |}t j||dd\}}t |d d |d | f ||\}}}	|| |	j  }
t||
|dd d S )NFr!   r#   r$   )r+   r   Z	id_to_svdr:   r;   r	   )r,   r   r   r   r/   r0   r1   r<   r   r=   r2   r   r   r   test_id_to_svd   s
   (z-TestInterpolativeDecomposition.test_id_to_svdc                 C   s*   t |}t|}t||d ddd d S )Nr   ư>r#   r$   )r   r+   Zestimate_spectral_normr	   )r,   r   s
norm_2_estr   r   r   test_estimate_spectral_norm   s   
z:TestInterpolativeDecomposition.test_estimate_spectral_normc                 C   sP   |  }|d d df  d9  < t|| }t||}t||d ddd d S )Nr   g333333?rA   r#   r$   )copyr   r+   Zestimate_spectral_norm_diffr	   )r,   r   r2   rB   rC   r   r   r    test_estimate_spectral_norm_diff   s
   z?TestInterpolativeDecomposition.test_estimate_spectral_norm_diffc                 C   sx   t jg dg dg dg|jd}||fD ]$}d}t j|t|d| }t||}t||k t||d k qd S )N   rH   r   r   r   rH   r'   &.>   
   )	r   arrayr'   r   matrix_rankr   r+   estimate_rankr   )r,   r   r2   Mrank_tolrank_nprank_estr   r   r   test_rank_estimates_array   s   "z8TestInterpolativeDecomposition.test_rank_estimates_arrayc                 C   s   t jg dg dg dg|jd}||fD ]*}t|}d}t j|t|d| }t||}t	||d k t	||d k qd S )NrG   rI   rJ   rK   rL      )
r   rN   r'   r   r   rO   r   r+   rP   r   )r,   r   r2   rQ   ZMLrR   rS   rT   r   r   r   test_rank_estimates_lin_op   s   "z9TestInterpolativeDecomposition.test_rank_estimates_lin_opc                 C   s   t d tt dddgddd t d t d}t|d	d
gddd tjd t   t d}tjd t tjd t d}t|| t|| d S )NdefaultrL   g#$?g<P?g-C6?r#   r$   i  gdbR?g2@吱?7   )r+   Zseedr	   r"   r   random)r,   Zx1Zx2Zx3r   r   r   	test_rand   s   





z(TestInterpolativeDecomposition.test_randc                 C   sN   t dtj}tt tj|ddd W d    d S 1 s w   Y  d S )N   rA   Fr!   )r   r   r   Zfloat32assert_raises
ValueErrorr+   r   )r,   r   r   r   r   test_badcall   s   
"z+TestInterpolativeDecomposition.test_badcallc                 C   sD   t d}tt t|d W d    d S 1 sw   Y  d S )N)rV      rV   )r   Zonesr]   r^   r+   r   )r,   ar   r   r   test_rank_too_large   s   

"z2TestInterpolativeDecomposition.test_rank_too_largec                 C   s   d}t jdd}t||\}}}t||jd  t||}t|||}t	|||  t||\}}t||}t|||}t	|||  d S )Nr         rH   )
r   rZ   r"   r+   r   r
   r   r5   r6   r	   )r,   r   r   r/   r0   r1   r7   r2   r   r   r   test_full_rank   s   z-TestInterpolativeDecomposition.test_full_rankr'   r"   TFr   rH   g?c                 C   sp   t r|tjkr|rtd tjg dg dg dg dg dg|dd}| }t|j||d	 t	|| d S )
Nr    )rf   rf   r   r   r   )r   r   r   rH   rH   rH   )rH   r   r   rH   r   r   )r   rH   r   r   rH   r   )r   r   rH   r   r   rH   C)r'   Zorderr!   )
r&   r   r(   r)   r*   rN   rE   r   r:   r   )r,   r'   r"   r   r   r2   r   r   r   test_bug_9793   s   

z,TestInterpolativeDecomposition.test_bug_9793N)__name__
__module____qualname__r)   ZmarkZparametrizer3   r4   r8   r>   r?   r@   rD   rF   rU   rW   r[   r_   rb   re   r   Zfloat_r(   rh   r   r   r   r   r   G   sH    





	


r   ) Zscipy.linalg.interpolativer   Zinterpolativer+   Znumpyr   Zscipy.linalgr   r   r   Zscipy.sparse.linalgr   r   Znumpy.testingr   r	   r
   r   r)   r   r]   sysmaxsizer&   Zfixturer   Zfloat64Z
complex128r   r   r   r   r   r   r   r   <module>   s&   




	