U
    3dM"                  	   @   s  d Z ddlZddlZddlmZm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 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 ddlmZmZ ddl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+d0ie,d/fd1d2d3e,d4fgd5d6 Z-ej*+d7e e fd8d9 Z.dS ):z)Testing for Spectral Biclustering methods    N)
csr_matrixissparse)ParameterGrid)assert_almost_equal)assert_array_equal)assert_array_almost_equal)BaseEstimatorBiclusterMixin)SpectralCoclustering)SpectralBiclustering)_scale_normalize)_bistochastic_normalize)_log_normalize)consensus_scorev_measure_score)make_biclustersmake_checkerboardc                   @   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-zrfo1fqw/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_indices6   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_biclustering\   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.model_selectionr   Zsklearn.utils._testingr   r   r   Zsklearn.baser   r	   Zsklearn.clusterr
   r   Zsklearn.cluster._biclusterr   r   r   Zsklearn.metricsr   r   Zsklearn.datasetsr   r   r   r2   r8   rT   ra   rg   rh   ro   rp   rq   rw   ry   r{   markZparametrizer^   r   r   r   r   r   r   <module>   sf   	*

		
