U
    2d'                  	   @   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 d dl	m
Z
mZmZmZmZ d dlmZ d dlmZ d	\ZZZZeeeeed d
d\ZZZed9 Zed9 Zeejeeeje ZZejdeegejddddg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efeefgejd#d$d%id&d%id&ed' igd(d) Z(d*d+ Z)d,d- Z*ej+d.d/d0 Z,d1d2 Z-d3d4 Z.d5d6 Z/d7d8 Z0d9d: Z1ej+d.d;d< Z2ej+d.d=d> Z3ejd?ej4ej5fd@dA Z6dBdC Z7dS )D    N)assert_allclose)assert_array_equal)assert_array_almost_equal)ignore_warnings)orthogonal_mporthogonal_mp_gramOrthogonalMatchingPursuitOrthogonalMatchingPursuitCVLinearRegression)check_random_state)make_sparse_coded_signal)   #         T)	n_samplesZn_components
n_featuresn_nonzero_coefsZrandom_stateZdata_transposed
   OmpModelznormalize, n_warnings)T   )Fr   )
deprecatedr   c           
   	   C   s   t d}d}d}|||}d||dk < ||}| |d}tjdd}	td	t ||| W 5 Q R X td
d |	D |kst	d S )Nr         g        g?)	normalizeT)recordalwaysc                 S   s   g | ]
}|j qS  )message).0wr   r   G/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/linear_model/tests/test_omp.py
<listcomp>>   s     z6test_assure_warning_when_normalize.<locals>.<listcomp>)
r   randnZrandwarningscatch_warningssimplefilterFutureWarningfitlenAssertionError)
r   r   Z
n_warningsrngr   r   XymodelZrecr   r   r!   "test_assure_warning_when_normalize*   s    

r/   c                   C   sF   t ttd d df ddjtfks&tt ttddjtdfksBtd S Nr   r   r   r   )r   r,   r-   shaper   r*   r   r   r   r!   test_correct_shapesA   s    &r3   c                   C   sF   t ttd d df ddjtfks&tt ttddjtdfksBtd S r0   )r   GXyr2   r   r*   r   r   r   r!   test_correct_shapes_gramF   s    &r6   c                   C   sV   t tttd d df dddks(tt tttd d df ddddksRtd S )Nr   r   r1   Tr   
precompute)npcount_nonzeror   r,   r-   r*   r   r   r   r!   test_n_nonzero_coefsK   s
    ( r;   c                  C   s   d} t ttd d df | d}t ttd d df | dd}ttd d df tt| d | kshtttd d df tt| d | kstd S )N      ?r   tolTr>   r8   r   )r   r,   r-   r9   sumdotr*   )r>   gamma
gamma_gramr   r   r!   test_tolS   s
    .rD   c                   C   s$   t tttddtttddd d S )Nr   r1   Tr7   r   r   r,   r-   r   r   r   r!   test_with_without_gram[   s    rF   c                   C   s$   t tttddtttddd d S )N      ?r=   Tr?   rE   r   r   r   r!   test_with_without_gram_tolb   s     rH   c               	   C   sb   t tttddttttd d} tjt| d( t tttdddtttdtd W 5 Q R X d S )	Nr   r=   r1   Orthogonal matching pursuit ended prematurely due to linear dependence in the dictionary. The requested precision might not have been met.matchTr?   )r8   r   )r   r   r,   r-   r   pytestwarnsRuntimeWarning)warning_messager   r   r!   test_unreachable_accuracyh   s     rP   positional_paramskeyword_paramsr>   r   r   c              	   C   s$   t t t| | W 5 Q R X d S )N)rL   Zraises
ValueErrorr   )rQ   rR   r   r   r!   test_bad_inputx   s    rU   c                  C   s   t d d df  \} tttd d df dd}tttd d df dd}t| t	
| t| t	
| tt d d df |dd tt d d df |dd d S )Nr   r   r1   r   decimal)rB   nonzeror   r,   r-   r   r4   r5   r   r9   flatnonzeror   )idxZ	gamma_recrC   r   r   r!   test_perfect_signal_recovery   s    r[   c                  C   s   t d d df  \} t }|jdd t }|jdd t||d d df dddd}t| t	| t
t d d df |dd d S )Nr   F)writer   )r   Z	copy_GramZcopy_Xyr   rV   )rB   rX   r4   copyZsetflagsr5   r   r   r9   rY   r   )rZ   Z
G_readonlyZXy_readonlyrC   r   r   r!    test_orthogonal_mp_gram_readonly   s        r^   z!ignore:'normalize' was deprecatedc                  C   s  t td} | ttd d df  | jjtfks4t| j	jdksDtt
| jtksXt| tt | jjttfksxt| j	jtfkstt
| jtt kst| jd  }| jdd | ttd d df  t|| j | jdd | ttd d df  t
| jtkst| jjtfks.t| j	dks>t| tt | jjttfks`t| j	dksptt
| jtt kstd S )Nr1   r   r   T)fit_interceptF)r   r   r(   r,   r-   coef_r2   r   r*   Z
intercept_r9   r:   	n_targetsr]   Z
set_paramsr   )ompZcoef_normalizedr   r   r!   test_estimator   s,    
rc   c               	   C   sz   t  } | d d df | d d df< tt}d |d< |d< t| |}d}tjt|d t	| |dd W 5 Q R X d S )Nr   r   rG   rI   rJ   r   r1   )
r,   r]   r9   zerosr   rA   rL   rM   rN   r   )ZnewXrB   ZnewyrO   r   r   r!   test_identical_regressors   s    
re   c                  C   s|   t t} d| d< d| d< t t| }t tj|}tt|dd}tt|dd}t	t 
|ddg t	t 
|ddg d S )NrG      r<   r   r   r1   )r9   rd   r   rA   r,   Tr   r   r4   r   rY   )rB   Znew_yZnew_XyZ	gamma_hatZgamma_hat_gramr   r   r!   test_swapped_regressors   s    
rh   c                  C   sd   t t} t tj| }ttt| dd}ttt|dd}t 	|dksNt
t 	|dks`t
d S )Nr   r1   r   )r9   Z
zeros_liker-   rA   r,   rg   r   r   r4   allr*   )Zy_emptyZXy_emptyZgamma_emptyZgamma_empty_gramr   r   r!   test_no_atoms   s    
rj   c                  C   s   t ttddd} t ttddd}| jttdfks4tt| d d d d df | tt	t
ddd} tt	t
ddd}| jttdfkstt| d d d d df | d S )Nr   T)r   return_pathFrS   )r   r,   r-   r2   r   ra   r*   r   r   r4   r5   pathlastr   r   r!   test_omp_path   s    ro   c                  C   sX   t ttdddd} t ttdddd}| jttdfks8tt| d d d d df | d S )Nr   T)r   rk   r8   FrS   )r   r,   r-   r2   r   ra   r*   r   rl   r   r   r!   #test_omp_return_path_prop_with_gram   s    rp   c                  C   s   t d d df } td d df }tdddd}|t|  |jtksHtt|j	| t
dd|jd}|t|  t|j	|j	 d S )Nr   TFr   )r   r_   Zmax_iter)r   r_   r   )r-   rB   r	   r(   r,   Zn_nonzero_coefs_r   r*   r   r`   r   )Zy_Zgamma_Zompcvrb   r   r   r!   test_omp_cv   s"        rq   c                  C   sf   t d} d\}}d}| ||}| ||}t|d}t }||| ||| t|j|j d S )Nr   )r      r   r1   )r   r#   r   r
   r(   r   r`   )r+   r   r   ra   r,   Yrb   Zlstsqr   r   r!   test_omp_reaches_least_squares  s    
rt   	data_typec                 C   s,   t t| t| dd}|j| ks(td S Nr   r1   )r   r4   astyper5   Zdtyper*   )ru   Zcoefr   r   r!   test_omp_gram_dtype_match  s      rx   c                  C   sJ   t ttjttjdd} t ttjttjdd}t| | d S rv   )r   r4   rw   r9   float32r5   float64r   )Zcoef_32Zcoef_64r   r   r!   #test_omp_gram_numerical_consistency  s    
 
 
 
 r{   )8Znumpyr9   rL   r$   Zsklearn.utils._testingr   r   r   r   Zsklearn.linear_modelr   r   r   r	   r
   Zsklearn.utilsr   Zsklearn.datasetsr   r   r   r   ra   r-   r,   rB   rA   rg   r4   r5   markZparametrizer/   r3   r6   r;   rD   rF   rH   rP   rU   r[   r^   filterwarningsrc   re   rh   rj   ro   rp   rq   rt   ry   rz   rx   r{   r   r   r   r!   <module>   sv   	  


	




