U
    ½mœdD  ã                
   @   sº  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 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# d dl$m%Z% zd dl&m'Z' dZ(W n e)k
�r   dZ(Y nX ej*j+e( dd�Z,e -dddddgdddddgdddddgg¡Z.dZ/e.j0\Z1Z2ee/e.ddd�\Z3Z4dQd d!„Z5d"d#„ Z6ej* 7d$d%d&ej8d'e,d(�g¡ej* 7d)ej9ej:g¡dRd*d+„ƒƒZ;ej*j7d,e3e <e3¡gd-d.gd/�ej* 7d$d%d&ej8d'e,d(�g¡ej* 7d)ej9ej:f¡dSd1d2„ƒƒƒZ=d3d4„ Z>ej*j7d,e3e <e3¡gd-d.gd/�dTd5d6„ƒZ?ej* @d7¡ej* @d8¡ej* @d9¡ej*j+e( dd�ej* 7d)ej9ej:f¡dUd:d;„ƒƒƒƒƒZAej* @d7¡ej* @d8¡ej* @d9¡ej*j+e( dd�ej* 7d)ej9ej:f¡dVd<d=„ƒƒƒƒƒZBej* @d>¡dWd?d@„ƒZCdXdAdB„ZDdCdD„ ZEdEdF„ ZFdGdH„ ZGej* 7d$d%d&ej8d'e,d(�g¡ej* 7d)ej9ej:g¡dIdJ„ ƒƒZHej*j+e(dKd�dLdM„ ƒZIej* 7dNd%d'd&g¡dOdP„ ƒZJdS )Yé    )ÚMockN)Úsparse)Úcsgraph)Úeigh)Úeigsh)ÚSpectralEmbeddingÚ_spectral_embedding)Ú_graph_is_connected)Ú_graph_connected_component)Úspectral_embedding©Ú
rbf_kernel)Únormalized_mutual_info_scoreÚpairwise_distances)ÚNearestNeighbors)ÚKMeans)Ú
make_blobs)Ú_deterministic_vector_sign_flip)Úassert_array_almost_equal)Úassert_array_equal)Úlobpcg)Úsmoothed_aggregation_solverTFz1PyAMG is required for the tests in this function.)Úreasonç        g      @g      @ç      ð?éè  é*   )Ú	n_samplesÚcentersÚcluster_stdÚrandom_statec                 C   sT   |d }t | j|jƒD ]8\}}t || d ¡|kst || d ¡|kst‚qdS )zMCheck array A and B are equal with possible sign flipping on
    each columnsé   N)ÚzipÚTÚnpÚmaxÚAssertionError)ÚAÚBÚtolZtol_squaredZA_colZB_col© r*   úg/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/manifold/tests/test_spectral_embedding.pyÚ _assert_equal_with_sign_flipping2   s    ÿþr,   c                  C   s¢  t j d¡} d}dddd|g}|  |¡}g }t|d d… |dd … ƒD ]’\}}|||… }tt|ƒd ƒD ]}| || ||d  f¡ qjdt|ƒd  }	}
d}| j|	|
|d	�}| j|	|
|d	�}| 	t|| || ƒ¡ qFt
t  |¡jƒ\}}| jd
dt|ƒd	�}t |||ff¡}d||j  }t|d d… |dd … ƒD ]`\}}t||| ƒ}|| }| ¡ |k�slt‚t|||d  ƒ}| ¡ |k�s�t‚t||ƒ �q<d S )Nr   i,  r   éy   éÈ   éÿÿÿÿé   r   )Úsizeçš™™™™™¹?ç      à?)r$   ÚrandomÚRandomStateZpermutationr"   ÚrangeÚlenÚappendÚrandintÚextendÚtupleÚarrayr#   Úuniformr   Ú
coo_matrixr
   Úsumr&   r   )Úrngr   Z
boundariesÚpÚconnectionsÚstartÚstopÚgroupÚiÚmin_idxZmax_idxZn_random_connectionsÚsourceÚtargetZrow_idxZ
column_idxÚdataÚaffinityZcomponent_1Zcomponent_sizeZcomponent_2r*   r*   r+   Ú%test_sparse_graph_connected_component=   s2    
""rL   Úeigen_solverÚarpackr   Úamg)ZmarksÚdtypec                 C   s˜  t j |¡}d}t j|d |d gd�}t  | ||¡¡d |d|…d|…f< t  | ||¡¡d ||d …|d …f< t|dƒ}|d |…  ¡ s’t‚||d …  	¡ r¦t‚t|dƒ}|d |…  	¡ rÄt‚||d …  ¡ sØt‚d|d|d f< d||d df< d|j
d d d| d …< d||j  }t jd| d�}d|d|…< tddt j |¡| d	�}| | |¡¡}	t j|	 ¡ dk t jd
�}
t||
ƒt d¡k�s”t‚d S )Néd   r!   ©Úshaper   r/   r0   r3   Úprecomputed©Ún_componentsrK   r    rM   )rP   r   )r$   r4   r5   ZzerosÚabsÚrandnr
   Úallr&   ÚanyZflatr#   r   Úfit_transformÚastyper<   ZravelZint64r   ÚpytestÚapprox)rM   rP   Úseedr    Zn_samplerK   Ú	componentZ
true_labelÚ
se_precompZembedded_coordinateZlabel_r*   r*   r+   Ú&test_spectral_embedding_two_componentsh   s8    ÿÿ


ürb   ÚXZdenser   )Zidsé$   c           	      C   s|   d}t ddtj |¡|d�}t dd|tj |¡|d�}| t|  |¡|d�¡}| |  |¡¡}t|j|jƒ t	||dƒ d S )	Nr   r!   rT   rU   Úrbf)rV   rK   Úgammar    rM   ©rf   çš™™™™™©?)
r   r$   r4   r5   r[   r   r\   r   Úaffinity_matrix_r,   )	rc   rM   rP   r_   rf   ra   Úse_rbfZembed_precompÚ	embed_rbfr*   r*   r+   Ú,test_spectral_embedding_precomputed_affinity�   s$    
ü
ûrl   c                  C   sl   d} g }dD ]H}t | | d� t¡}|jtdd�}tddd| d� |¡j}| |¡ qt|d |d	 ƒ d S )
Nr!   )r   é
   )Ún_neighborsZconnectivity)Úmoder   Zprecomputed_nearest_neighbors)r    rV   rK   rn   r0   )r   ÚfitÚSZkneighbors_graphr   Ú
embedding_r8   r   )rn   ÚresultsZadditional_neighborsÚnnÚgraphÚ	embeddingr*   r*   r+   Ú,test_precomputed_nearest_neighbors_filtering½   s     üúÿ
rw   c                    s†   d‰ t tˆ d�}td‡ fdd„ˆ tj |¡d�}tddˆ tj |¡d�}| | ¡}| | ¡}t|j|jƒ t||jƒ t	||dƒ d S )	NgÍÌÌÌÌÌì?rg   r!   c                    s   t | ˆ d�S )Nrg   r   )Úxrg   r*   r+   Ú<lambda>Ú   ó    z;test_spectral_embedding_callable_affinity.<locals>.<lambda>)rV   rK   rf   r    re   rh   )
r   rq   r   r$   r4   r5   r[   r   ri   r,   )rc   r_   ÚkernZse_callablerj   rk   Zembed_callabler*   rg   r+   Ú)test_spectral_embedding_callable_affinityÓ   s&    

ü
ü

r|   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tj |¡d�}t ddddtj |¡d�}| t | ¡¡}| t | ¡¡}t||dƒ ddd	dd
d
dg}d	ddd
dddg}dddd	dddg}tj	|| || || ffdd� 
¡ }	d|_d|_| |	 | ¡¡}| |	 | ¡¡}t||dƒ d S )Nr!   Únearest_neighborsrO   é   )rV   rK   rM   rn   r    rN   gñhãˆµøä>r   r0   é   é   rQ   )é   r�   rR   rT   )r   r$   r4   r5   r[   rq   r\   r,   r   r>   ZtoarrayrK   )
rP   r_   Zse_amgZ	se_arpackZ	embed_amgZembed_arpackÚrowÚcolÚvalrK   r*   r*   r+   Ú"test_spectral_embedding_amg_solverí   s:    
û
û ÿ
r…   c           	      C   s†   d}t j||d|d�}| | ¡}t  |¡t  | ¡ ¡ }||j }t|dddd�}tdƒD ]&}t|dd|d	 d�}t	||d
d� qZd S )NrQ   r2   )Zdensityr    rm   rO   r   )rV   rM   r    r   r0   rh   )r)   )
r   Zrandr\   ZtriuZdiagsZdiagonalr#   r   r6   r,   )	rP   r_   Z	num_nodesrc   ÚupperZ
sym_matrixrv   rF   Znew_embeddingr*   r*   r+   Ú*test_spectral_embedding_amg_solver_failure#  s&    

   ÿ   ÿr‡   z6ignore:the behavior of nmi will change in version 0.22c                 C   sn   t j | ¡}ttd|d�}ttdd|d�}||fD ]6}tt|dd�}| | t¡¡ t	t
|jtƒdd	ƒ q2d S )
Nre   )rV   rK   r    r}   r~   )rV   rK   rn   r    Úauto)Ú
n_clustersr    Zn_initr   r!   )r$   r4   r5   r   r‰   r   rp   r[   rq   r   r   Zlabels_Útrue_labels)r_   r    rj   Zse_knnÚseÚkmr*   r*   r+   Ú!test_pipeline_spectral_clusteringE  s(      ÿü
  ÿr�   c                 C   sð   t  dddddgdddddgdddddgdddddgdddddgg¡}t|ƒrRt‚tt |¡ƒrdt‚tt |¡ƒrvt‚t  dddddgdddddgdddddgdddddgdddddgg¡}t|ƒsÈt‚tt |¡ƒsÚt‚tt |¡ƒsìt‚d S )Nr0   r   )r$   r<   r	   r&   r   Ú
csr_matrixZ
csc_matrix)r_   ru   r*   r*   r+   Útest_connectivityZ  s,    ûÿ	ûÿ	r�   c                  C   s>   t j d¡} |  dd¡}t|ƒ}t|ƒ}t|ƒ}t||ƒ d S )Nrd   rm   é   )r$   r4   r5   rX   r   r   r   )r    rJ   ÚsimsÚembedding_1Úembedding_2r*   r*   r+   Ú%test_spectral_embedding_deterministicv  s    r”   c            
      C   sz   t j d¡} |  dd¡}t|ƒ}d}t|d|dd�}tj|ddd�\}}t|ƒ\}}|j	d |… }	t
|	ƒj	}	t||	ƒ d S )	Nrd   rm   r�   é   F)Únorm_laplacianrV   Ú
drop_firstT)ÚnormedZreturn_diag)r$   r4   r5   rX   r   r   r   Ú	laplacianr   r#   r   r   )
r    rJ   r‘   rV   r’   r™   ÚddÚ_Zdiffusion_mapr“   r*   r*   r+   Ú$test_spectral_embedding_unnormalized€  s       ÿ
rœ   c                  C   sŠ   t j d¡} |  dd¡}t|ƒ}d}tdƒD ]X}t|d|d|d�}t  |d d …df ¡t 	d¡ksft
‚t  |d d …df ¡d	ks,t
‚q,d S )
Nrd   rm   r�   r!   F)r–   rV   r—   r    r   r0   gü©ñÒMbP?)r$   r4   r5   rX   r   r6   r   Zstdr]   r^   r&   )r    rJ   r‘   rV   r_   rv   r*   r*   r+   Ú*test_spectral_embedding_first_eigen_vector”  s    û$r�   c                 C   sV   t  |¡}tdd| dd�}| |¡}|j|ks2t‚|jj|ksBt‚|jj|ksRt‚dS )a\  Check that `SpectralEmbedding is preserving the dtype of the fitted
    attribute and transformed data.

    Ideally, this test should be covered by the common test
    `check_transformer_preserve_dtypes`. However, this test only run
    with transformers implementing `transform` while `SpectralEmbedding`
    implements only `fit_transform`.
    r!   re   r   )rV   rK   rM   r    N)rq   r\   r   r[   rP   r&   rr   ri   )rM   rP   rc   r‹   ZX_transr*   r*   r+   Ú'test_spectral_embedding_preserves_dtype©  s    
   ÿ
rž   z7PyAMG is installed and we should not test for an error.c               	   C   s:   t dddd�} d}tjt|d�� |  t¡ W 5 Q R X d S )Nr!   re   rO   )rV   rK   rM   z>The eigen_solver was set to 'amg', but pyamg is not available.)Úmatch)r   r]   ZraisesÚ
ValueErrorr[   rq   )ra   Úerr_msgr*   r*   r+   Útest_error_pyamg_not_availableÆ  s    ýr¢   Úsolverc           
      C   sÎ   |dkrt st d¡ tddddgddggdd�\}}t|ƒ}t |¡| }|d	krXtnt}|d	krhdnd
}|dkr~t	 
|¡}t|d�}|  t|j|¡ t|d|dd� | ¡  |j\}}	|	d |ksÊt‚d
S )z2Test that `eigen_tol="auto"` is resolved correctlyrO   zPyAMG is not available.r.   r   r0   r/   g{®Gáz„?)r   r    r   r   rN   N)Zside_effectr   rˆ   )r    rM   Z	eigen_tolr)   )Úpyamg_availabler]   Úskipr   r   r$   r%   r   r   r   rŽ   r   Úsetattrr   Ú__qualname__r   Zassert_calledZ	call_argsr&   )
Zmonkeypatchr£   rc   r›   ÚDrq   Zsolver_funcÚdefault_valueZmocked_solverÚkwargsr*   r*   r+   Útest_spectral_eigen_tol_autoÕ  s(    
   ÿ



r«   )r   )r   )rd   )rd   )rd   )rd   )rd   )rd   )KZunittest.mockr   r]   Únumpyr$   Zscipyr   Zscipy.sparser   Zscipy.linalgr   Zscipy.sparse.linalgr   Zsklearn.manifoldr   r   Z$sklearn.manifold._spectral_embeddingr	   r
   r   Zsklearn.metrics.pairwiser   Zsklearn.metricsr   r   Zsklearn.neighborsr   Zsklearn.clusterr   Zsklearn.datasetsr   Zsklearn.utils.extmathr   Zsklearn.utils._testingr   r   Zsklearn.utils.fixesr   Zpyamgr   r¤   ÚImportErrorÚmarkZskipifZskip_if_no_pyamgr<   r   r   rS   r‰   Z
n_featuresrq   rŠ   r,   rL   ZparametrizeÚparamZfloat32Zfloat64rb   rŽ   rl   rw   r|   Úfilterwarningsr…   r‡   r�   r�   r”   rœ   r�   rž   r¢   r«   r*   r*   r*   r+   Ú<module>   sì   
 ÿýÿ
   ÿ

+ýþ,ýþÿÿÿ ÿ'ÿÿÿ ÿ


ýþþ
