U
    Ovf!                  	   @   st  d Z ddlZddlZddlmZmZ ddlmZm	Z	 ddl
mZmZ ddlmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZmZmZ G dd de	e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&dd  Z'd!d" Z(d#d$ Z)ej*+d%d&d'ie,d(fd&d)ie,d*fd&d+ie,d*fd,d-d.e,d/fgd0d1 Z-ej*+d2e e fd3d4 Z.dS )5z)Testing for Spectral Biclustering methods    N)
csr_matrixissparse)BaseEstimatorBiclusterMixin)SpectralBiclusteringSpectralCoclustering)_bistochastic_normalize_log_normalize_scale_normalize)make_biclustersmake_checkerboard)consensus_scorev_measure_score)ParameterGrid)assert_almost_equalassert_array_almost_equalassert_array_equalc                   @   s   e Zd Zdd Zdd ZdS )MockBiclusteringc                 C   s   d S N )selfr   r   H/tmp/pip-unpacked-wheel-qu3nn_q2/sklearn/cluster/tests/test_bicluster.py__init__   s    zMockBiclustering.__init__c                 C   s.   t dddddgd t ddddgd fS )NTFr   )npwhere)r   ir   r   r   get_indices   s    zMockBiclustering.get_indicesN)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c                  C   s   t ddd} t }| t| |  fD ]j}|d|}t|rJ| }t	|ddgddgd	d
gg d|d d < t|r| }t 
|dks*tq*d S )N         r                     )r   arangereshaper   r   tolistZget_submatrixr   Ztoarrayr   allAssertionError)datamodelXZ	submatrixr   r   r   test_get_submatrix%   s    r2   c                 C   sP   t | jD ]@}| |\}}| |\}}t||ks:tt||ks
tq
d S r   )range
n_clustersZ	get_shaper   lenr.   )r0   r   mnZi_indZj_indr   r   r   _test_shape_indices4   s
    r8   c                 C   s   ddgd dgddgdgdgd}t d	d
d| d\}}}|| 8 }t|dk d|}|t|fD ]}t|D ]}tf d
| d|}|| |jj	dkst
t|jjddtd t|jjddtd t|j||fdkst
t| qlq`d S )NZ
randomizedarpackr    FT	k-means++
   )
svd_method
n_svd_vecs
mini_batchinitn_init   rB   r$   g?Znoiserandom_state   r   )r4   rD   )r$   rB   ZaxisrB   )r   minr   r   r   r   r   fitrows_shaper.   r   sumZonescolumns_r   biclusters_r8   )global_random_seedZ
param_gridSrowscolsmatkwargsr0   r   r   r   test_spectral_coclustering=   s8        
rT   c           
      C   sJ  t ddd| d\}}}ddgdgdgd	gd
}|t|fD ]}| D ]\}}|D ]}tddd| d}	|	jf t||fg t|r|	 ddkrt	
t |	| W 5 Q R X qTn
|	| |	jjdkst|	jjdkstt|	jjddtdd t|	jjddtdd t|	j||fdks8tt|	 qTqHq:d S )NrA   r$   g      ?rC   Zscalelogr9   r    T)methodr<   r=   r>   r:   )r4   r@   r?   rD   rV   )	   rB   r   rF   rB   rE   )r   r   itemsr   Z
set_paramsdictr   
get_paramsgetpytestraises
ValueErrorrH   rI   rJ   r.   rL   r   rK   r   repeatr   rM   r8   )
rN   rO   rP   rQ   Znon_default_paramsrR   
param_nameZparam_valuesZparam_valuer0   r   r   r   test_spectral_biclusteringZ   s@       
ra   c                 C   st   | j dd}| j dd}t| r<t| }t| }t|t| ddd t|t| ddd dS )z<Check that rows sum to one constant, and columns to another.rE   rF   r   d   decimalN)rK   r   r   ZasarrayZsqueezer   Ztilemean)scaledZrow_sumZcol_sumr   r   r   _do_scale_test   s    rg   c                 C   s2   t |  t| jdd | jdd dd dS )z5Check that rows and columns sum to the same constant.r   rF   rE   rc   N)rg   r   rK   re   )rf   r   r   r   _do_bistochastic_test   s    rh   c                 C   sX   t j| }|dd}|t|fD ].}t|\}}}t| t|r$t|s$tq$d S Nrb   )	r   randomRandomStaterandr   r
   rg   r   r.   )rN   	generatorr1   rR   rf   _r   r   r   test_scale_normalize   s    ro   c                 C   sR   t j| }|dd}|t|fD ](}t|}t| t|r$t|s$tq$d S ri   )	r   rj   rk   rl   r   r   rh   r   r.   )rN   rm   r1   rR   rf   r   r   r   test_bistochastic_normalize   s    rp   c                 C   s0   t j| }|dd}t|d }t| d S )Nrb   rE   )r   rj   rk   rl   r	   rh   )rN   rm   rR   rf   r   r   r   test_log_normalize   s    rq   c              
   C   sd   t | d}tddddddgddddddgddddddgg}|j|ddd}t||d d  d S )	NrD   r   rE   r#   r$   r"   r!   )n_bestr4   )r   r   arrayZ_fit_best_piecewiser   )rN   r0   vectorsbestr   r   r   test_fit_best_piecewise   s    
4rw   c                 C   s   t | d}tdddgdddgdddgdddgg}tddgddgddgg}|t|fD ],}|j||dd}tt|ddddgd q\d S )	Nrr   rE   r$   r%   r   r#   )r4   g      ?)r   r   rt   r   Z_project_and_clusterr   r   )rN   r0   r/   ru   rR   labelsr   r   r   test_project_and_cluster   s    
*ry   c                 C   s   t dd| d}tddd| d\}}}|| t|j||fdksFttddd| d\}}}|| t|j||fdks~ttd	dd| d\}}}|| t|j||fdkstd S )
Nr$   r9   )r<   rD   rA   r   rC   rE   )(   rB   )rB   rz   )r   r   rH   r   rM   r.   )rN   r0   rO   rP   rQ   r   r   r   test_perfect_checkerboard   s:         
   
   
r{   zparams, type_err, err_msgr4   r%   z#n_clusters should be <= n_samples=5)r$   r$   r$   zIncorrect parameter n_clusters)r$   r%   r$   r"   )Zn_componentsrs   z"n_best=4 must be <= n_components=3c              	   C   sB   t dd}tf | }tj||d || W 5 Q R X dS )z5Check parameters validation in `SpectralBiClustering`   )r!   r!   )matchN)r   r*   r+   r   r\   r]   rH   )paramsZtype_errerr_msgr/   r0   r   r   r   .test_spectralbiclustering_parameter_validation   s    
r   estc                 C   s>   t dddd\}}}t| dr"t| | | jdks:td S )N)r$   r$   r$   r   rr   n_features_in_)r   hasattrr.   rH   r   )r   r1   rn   r   r   r   test_n_features_in_   s    
r   )/__doc__Znumpyr   r\   Zscipy.sparser   r   Zsklearn.baser   r   Zsklearn.clusterr   r   Zsklearn.cluster._biclusterr   r	   r
   Zsklearn.datasetsr   r   Zsklearn.metricsr   r   Zsklearn.model_selectionr   Zsklearn.utils._testingr   r   r   r   r2   r8   rT   ra   rg   rh   ro   rp   rq   rw   ry   r{   markZparametrizer^   r   r   r   r   r   r   <module>   s\   	)

		
