U
    |h'                     @   sH  d Z ddlZddlm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mZmZ ddlmZ dd	lmZ dd
lmZmZmZ d/ddZdd Zejdddgdd Zdd Zdd Z dd Z!d0ddZ"ejdddd gd!d" Z#ejd#d$d%ge$d&fdd%ge$d&fd'd%ge%d(fgd)d* Z&d+d, Z'd-d. Z(dS )1z" Test the graphical_lasso module.
    N)StringIO)assert_allclose)linalg)datasets)GraphicalLassoGraphicalLassoCVempirical_covariancegraphical_lasso)make_sparse_spd_matrix)check_random_state)_convert_containerassert_array_almost_equalassert_array_less   c                 C   st  d}d}t | } t|d| d}t|}| jt|||d}t|}dD ]}t }t }	dD ]R}
t	|d||
d	\}}}|||
< ||	|
< t
|j\}}|d
ks^tt|d q^t|d |d dd t|	d |	d dd qJtdd|}|| t|j|d dd t|j|d dd ||d
 }t }dD ]"}t|d|j}|| q:t|d
 |d  dS )zTest the graphical lasso solvers.

    This checks is unstable for some random seeds where the covariance found with "cd"
    and "lars" solvers are different (4 cases / 100 tries).
       d   ffffff?alpharandom_statesize)        皙?      ?cdlarsT)return_costsr   moder   g-q=r   r   g-C6?)Zatolr   r      decimal)FTassume_centeredr   N)r   r
   r   invmultivariate_normalnpzerosr   dictr	   arrayTr   Zdiffr   r   fitZscorer   Zcovariance_meanlist
precision_append)r   dim	n_samplespreccovXemp_covr   ZcovsZicovsmethodZcov_Zicov_ZcostsZdual_gapmodelZZprecsr%   Zprec_ r;   Q/tmp/pip-unpacked-wheel-ig1s1lm8/sklearn/covariance/tests/test_graphical_lasso.pytest_graphical_lassos   sD    
   
r=   c                  C   sf   t jdd} t| dd}tddd|}t|jt j	| t
|dd\}}t|t j	| d	S )
z;Test graphical_lasso's early return condition when alpha=0.r   
   Tr$   r   Zprecomputed)r   Z
covariancer    N)r(   randomZrandnr   r   r-   r   r0   r   r&   r	   )r6   r7   r9   _Z	precisionr;   r;   r<   (test_graphical_lasso_when_alpha_equals_0L   s    rA   r   r   r   c                 C   sD   t jdddd\}}t|}t|d| ddd\}}}|dks@td S )	Ni  r   r   )r3   Z
n_featuresr   皙?   T)r   Zmax_iterZreturn_n_iter)r   Zmake_classificationr   r	   AssertionError)r   r6   r@   r7   Zn_iterr;   r;   r<   test_graphical_lasso_n_iterX   s        rE   c               	   C   s   t ddddgddddgddddgddddgg} t d	dd
dgddddgd
dddgddddgg}t j}t|}dD ],}t|dd|d\}}t||  t|| qzd S )NgJSo?r   gڧ1?g{!<?g-ꊾ'?g[@gο]?dw?glE!N?g',g5Ry;2@ggC%d?gXIſgv?r   g      ?Fr   r   r   r(   r+   r   	load_irisdatar   r	   r   )cov_Ricov_Rr6   r7   r8   r5   icovr;   r;   r<   test_graphical_lasso_irisc   s(    









rN   c                  C   s   t ddgddgg} t ddgddgg}t jd d dd f }t|}dD ],}t|d	d
|d\}}t||  t|| qRd S )Ng@gHZ?rF   gɉ1t?gO{̓%	g4#(#e @rC   r   r   FrG   rH   )Z	cov_skggmZ
icov_skggmr6   r7   r8   r5   rM   r;   r;   r<   test_graph_lasso_2D~   s    
rO   c               	   C   s   t dd} t ddddgdddd	gd
dddgdddd	gg}t ddddgddddgddddgddddgg}t j| d d f }t|}dD ]4}t|dd|d\}}t||dd  t||dd  qd S )!Nr>      g{Gz?gt<i?gb?gHWY?gիr?gH紁Nk?gۨxV4b?gb?g`ܴNk?gR*贁N{?gLgם?g:glWY?gExV4b?gR%l8@g,0r   g0gCKZ8@gg      )gTs gGrO#c@gm>(g     |@r   g{Gz?FrG      r"   )	r(   Zaranger+   r   rI   rJ   r   r	   r   )indicesrK   rL   r6   r7   r8   r5   rM   r;   r;   r<   "test_graphical_lasso_iris_singular   s4    







   
rS   c                 C   sr   d}d}t | } t|d| d}t|}| jt|||d}tj}z t	 t_t
dddd| W 5 |t_X d S )	NrQ      gQ?r   r   r   r   )verbosealphastol)r   r
   r   r&   r'   r(   r)   sysstdoutr   r   r-   )r   r2   r3   r4   r5   r6   orig_stdoutr;   r;   r<   test_graphical_lasso_cv   s    
r[   alphas_container_typer/   tupler+   c              	   C   s|   t ddddgddddgddddgddddgg}t jd}|jddddg|d	d
}tddg| }t|ddd| dS )zCheck that we can pass an array-like to `alphas`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/22489
    皙?r   rB   皙?333333?r   ffffff?r      r.   r5   r   g{Gz?Q?r   rV   rW   Zn_jobsN)r(   r+   r?   RandomStater'   r   r   r-   )r\   true_covrngr6   rV   r;   r;   r<   'test_graphical_lasso_cv_alphas_iterable   s    



ri   zalphas,err_type,err_msgg{Gzrd   zmust be > 0Z
not_numberzmust be an instance of floatc              	   C   s   t ddddgddddgddddgddddgg}t jd}|jddddg|d	d
}tj||d t| ddd| W 5 Q R X dS )zCheck that if an array-like containing a value
    outside of (0, inf] is passed to `alphas`, a ValueError is raised.
    Check if a string is passed, a TypeError is raised.
    r^   r   rB   r_   r`   r   ra   r   rb   rc   matchr   re   N)	r(   r+   r?   rf   r'   pytestZraisesr   r-   )rV   Zerr_typeerr_msgrg   rh   r6   r;   r;   r<   ,test_graphical_lasso_cv_alphas_invalid_array   s    



rn   c               	      s"  d} d}d}t ddddgddddgdddd	gddd	d
gg}t jd}|jddddg|dd}t| ||d|  j}|| d }dg}dd t| D }	||	 D ]$}
|
|kst	t
||
 |kst	qt  fdd|	D }|jdd}|jdd}t jd | t jd | d S )Nr!   rQ      r^   r   rB   r_   r`   r   ra   r   rb   rc   )ZcvrV   n_refinementsr   rV   c                 S   s   g | ]}d | dqS )splitZ_test_scorer;   ).0ir;   r;   r<   
<listcomp>  s     z2test_graphical_lasso_cv_scores.<locals>.<listcomp>c                    s   g | ]} j | qS r;   )cv_results_)rr   keyr5   r;   r<   rt     s     )ZaxisZmean_test_scoreZstd_test_score)r(   r+   r?   rf   r'   r   r-   ru   rangerD   lenZasarrayr.   Zstdr   )splitsZn_alphasrp   rg   rh   r6   Z
cv_resultsZtotal_alphaskeysZ
split_keysrv   Z	cv_scoresZexpected_meanZexpected_stdr;   rw   r<   test_graphical_lasso_cv_scores   s6    



r|   c               	   C   sz   t jddd  } }}t|ddd}t|}| jt |||d}t|}t	j
tdd t|d	|d
 W 5 Q R X dS )z[Check that we raise a deprecation warning if providing `cov_init` in
    `graphical_lasso`.r   r   r   r   r   r   z cov_init parameter is deprecatedrj   r   )r   Zcov_initN)r(   r?   rf   r
   r   r&   r'   r)   r   rl   ZwarnsFutureWarningr	   )rh   r2   r3   r4   r5   r6   r7   r;   r;   r<   )test_graphical_lasso_cov_init_deprecation  s    
r~   )r   )r   ))__doc__rX   ior   Znumpyr(   rl   Znumpy.testingr   Zscipyr   Zsklearnr   Zsklearn.covariancer   r   r   r	   Zsklearn.datasetsr
   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r=   rA   markZparametrizerE   rN   rO   rS   r[   ri   
ValueError	TypeErrorrn   r|   r~   r;   r;   r;   r<   <module>   s>   
1

 


%