U
    3d,                     @   s  d Z ddlZddlZddlm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mZ ddlmZ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 zddlm Z  dZ!W n e"k
r   dZ!Y nX e#ddgddgddggd Z$edde$dddd\Z%Z&ej'(ddej'(dddd Z)ej'(dddd Z*d d! Z+d"d# Z,d$d% Z-d&d' Z.ej'(d(d)d*d+d,gd-d. Z/ej'0d/ej'0d0ej'0d1d2d3 Z1d4d5 Z2ej'(ddd6d7 Z3d8d9 Z4d:d; Z5dS )<z'Testing for Spectral Clustering methods    N)sparseLinAlgError)check_random_state)assert_array_equal)SpectralClusteringspectral_clustering)
discretize
cluster_qr)img_to_graph)adjusted_rand_score)kernel_metrics
rbf_kernel)NearestNeighbors)
make_blobs)smoothed_aggregation_solverTF   
   <      g?)	n_samplesZ
n_featurescenterscluster_stdshufflerandom_stateeigen_solver)arpackZlobpcgassign_labels)kmeansr	   r
   c                 C   s$  t dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddgg}|t|fD ]}tddd| |d|}|j}|d dkrd| }t|dddddddgdkstt	
t	|}|j|jkst|j|jkstt|j|j qd S )	Ng      ?g?        r   r   precomputed)r   
n_clustersaffinityr   r   r   )nparrayr   Z
csr_matrixr   fitlabels_r   AssertionErrorpickleloadsdumpsr"   r   r   )r   r   SmatmodellabelsZ
model_copy r0   G/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/cluster/tests/test_spectral.pytest_spectral_clustering)   s8     r2   c                 C   st   t ddddgddggdd\}}t|dd}t|d d}t|}tdd	d
| d|j}t	||dkspt
d S )N   r   r   r   {Gz?r   r   r   r   )gammag-C6?r   r!   )r   r"   r#   r   )r   r   r$   maximumr   
coo_matrixr   r&   r'   r   r(   )r   Xyr,   r/   r0   r0   r1   test_spectral_clustering_sparseL   s&       


r;   c                  C   s   t ddddgddggdd\} }d}g }dD ]H}t|| d	| }|j| d
d}tddd|d|j}|| q,t|d |d  d S )N   r   r   r   r4   r5   r   )r   r   )n_neighborsZconnectivity)modeZprecomputed_nearest_neighbors)r   r"   r#   r=   )r   r   r&   Zkneighbors_graphr   r'   appendr   )r9   r:   r=   resultsZadditional_neighborsnngraphr/   r0   r0   r1   ,test_precomputed_nearest_neighbors_filteringc   s,       

rC   c               	   C   sb  t ddddgddggdd\} }tdddd	}tjtd
d ||  W 5 Q R X t||jdksfttdddd}|| j}t||dkstt	d
ddd } t }|D ]<}|dkrtd|dd	}|| j}| jd f|jkstqtddd dd	}|| j}| jd f|jks$tdd }td|dd	}|| j}| jd f|jks^td S )Nr3   r   r   r   r4   r5   r   Znearest_neighbors)r"   r#   r   znot fully connectedmatch)r"   r6   r   r      Zadditive_chi2c                 S   s   dS )Nr   r0   )xr:   r0   r0   r1   <lambda>       z!test_affinities.<locals>.<lambda>c                 [   s   |i kst t| | S N)r(   r$   Zminimumsum)rG   r:   kwargsr0   r0   r1   	histogram   s    z"test_affinities.<locals>.histogram)r   r   pytestZwarnsUserWarningr&   r   r'   r(   r   Zrandr   shape)r9   r:   spr/   Zkernels_availablekernrM   r0   r0   r1   test_affinities}   s6       
rS   c                  C   s   t jjdd} d\}}| ||}t|t j}|j|fksBtt 	t 
|t |s^tt|t j}t 	||s~td S )N   seed)r   rF   )r$   randomRandomStaterandnr
   astypeZfloat64rP   r(   array_equaluniquearangeZfloat32)r   r   n_componentsdataZlabels_float64Zlabels_float32r0   r0   r1   test_cluster_qr   s    r`   c                  C   sP   t jjdd} d\}}| ||}| |}t t|| t|| sLtd S )NrT   rU   )d   rF   )r$   rW   rX   rY   Zpermutationr[   r
   r(   )r   r   r^   r_   permr0   r0   r1   &test_cluster_qr_permutation_invariance   s    


rc   r   2   ra      i  c                 C   s   t jjdd}tddD ]}|d|d | }t |t}tjt 	| t 
| |ff| |d fd}| d|| |d   }t||d	}t||d
kstqd S )NrT   rU   r   r   r   r   )rP   g?)r   g?)r$   rW   rX   rangerandintr%   floatr   r8   onesr]   ZtoarrayrY   r	   r   r(   )r   r   Zn_classZy_trueZy_indicatorZy_true_noisyZy_predr0   r0   r1   test_discretize   s    
 rj   z:ignore:scipy.rand is deprecated:DeprecationWarning:pyamg.*zBignore:`np.float` is a deprecated alias:DeprecationWarning:pyamg.*zBignore:scipy.linalg.pinv2 is deprecated:DeprecationWarning:pyamg.*c               	   C   s&  t d\} }d\}}d\}}| |d  d ||d  d  |d k }| |d  d ||d  d  |d k }||B }| }	|t}
t|
|	d}t |j |j  |_t	|dddd	}t
t |dksttrt	|dd
dd	}t||dkstn&tt t	|dd
dd	 W 5 Q R X d S )N)(   rk   ))      )r3      )rT      r   r   r   )maskr   )r"   r   r   Zamg)r$   indicescopyrZ   rh   r   expr_   Zstdr   lenr\   r(   
amg_loadedr   rN   raises
ValueError)rG   r:   Zcenter1Zcenter2Zradius1Zradius2Zcircle1Zcircle2Zcirclesrp   imgrB   Zlabels_arpackZ
labels_amgr0   r0   r1   0test_spectral_clustering_with_arpack_amg_solvers   s6    ((
      ry   c                  C   s   t ddddgddggdd\} }tddd}|| j}tdddd	| j}t|| tddd
| j}t||r|td S )Nr3   r   r   r   r4   r5   r   )r"   r   )r"   r^   r   )r^   r   )r   r   r&   r'   r   r$   r[   r(   )r9   r:   rQ   r/   Zlabels_same_ncompZlabels_diff_ncompr0   r0   r1   test_n_components
  s       

rz   c                 C   s~   t ddddgddggdd\}}tdddd	| | }td
|jsNt| dkrztd|jshttd|jsztd S )Nr3   r   r   r   r4   r5   r   *   )r"   r   verbosez Computing label assignment usingr   zInitialization completezIteration [0-9]+, inertia)r   r   r&   Z
readouterrresearchoutr(   )r   capsysr9   r:   Zcapturedr0   r0   r1   test_verbose!  s       
r   c               	   C   s@   t ddgddgg} d}tjt|d t|  W 5 Q R X dS )zbCheck that spectral_clustering raises an informative error when passed
    a np.matrix. See #10993r    g       @zIspectral_clustering does not support passing in affinity as an np\.matrixrD   N)r$   ZmatrixrN   rv   	TypeErrorr   )r9   msgr0   r0   r1   )test_spectral_clustering_np_matrix_raises3  s    r   c              	   C   sH   dd }| tjd| td}tjtdd t| W 5 Q R X dS )zkCheck that discretize raises LinAlgError when svd never converges.

    Non-regression test for #21380
    c                  _   s
   t  d S rJ   r   )argsrL   r0   r0   r1   new_svdC  s    z;test_spectral_clustering_not_infinite_loop.<locals>.new_svdZsvd)r      zSVD did not convergerD   N)setattrr$   Zlinalgri   rN   rv   r   r	   )r   Zmonkeypatchr   Zvectorsr0   r0   r1   *test_spectral_clustering_not_infinite_loop=  s
    
r   )6__doc__r}   Znumpyr$   Zscipyr   Zscipy.linalgr   rN   r)   Zsklearn.utilsr   Zsklearn.utils._testingr   Zsklearn.clusterr   r   Zsklearn.cluster._spectralr	   r
   Zsklearn.feature_extractionr   Zsklearn.metricsr   Zsklearn.metrics.pairwiser   r   Zsklearn.neighborsr   Zsklearn.datasetsr   Zpyamgr   ru   ImportErrorr%   r   r9   _markZparametrizer2   r;   rC   rS   r`   rc   rj   filterwarningsry   rz   r   r   r   r0   r0   r0   r1   <module>   sn   
 

!
*
$

