a
    ;Za8                     @   s>  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 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 d dlmZ d dlmZ d dlmZ eg dg dg dgZdZ ej!\Z"Z#ee eddd\Z$Z%dEddZ&dd Z'dFddZ(e j)j*d e$e+e$gd!d"gd#dGd$d%Z,d&d' Z-e j)j*d e$e+e$gd!d"gd#dHd(d)Z.e j)/d*e j)/d+e j)/d,dId-d.Z0e j)/d*e j)/d+e j)/d,d/d0 Z1e j)/d1dJd2d3Z2dKd4d5Z3dLd6d7Z4dMd8d9Z5d:d; Z6d<d= Z7d>d? Z8e j)*d@dAdBgdCdD Z9dS )N    N)sparse)csgraph)eigh)SpectralEmbedding)_graph_is_connected)_graph_connected_component)spectral_embedding
rbf_kernel)normalized_mutual_info_score)NearestNeighbors)KMeans)
make_blobs)_deterministic_vector_sign_flip)assert_array_almost_equal)assert_array_equal)              @r   r   r   )r   r   g      @r   r   )      ?r   r   r   r     r   *   )	n_samplescentersZcluster_stdrandom_stater   c                 C   sT   |d }t | j|jD ]8\}}t|| d |kst|| d |ksJ qdS )zMCheck array A and B are equal with possible sign flipping on
    each columns   N)zipTnpmax)ABtolZtol_squaredZA_colZB_col r"   Mlib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flipping&   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slJ t|||d  }| |ksJ t|| q<d S )Nr   i,  r   y         r   )size皙?      ?)r   randomRandomStateZpermutationr   rangelenappendZrandintextendtuplearrayr   Zuniformr   
coo_matrixr   sumr   )rngr   Z
boundariespZconnectionsstartstopgroupiZ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_component1   s2    
""r@   $   c           	      C   s  t j| }d}t j|d |d gd}t |||d |d|d|f< t |||d ||d |d f< t|d}|d |  sJ ||d   rJ t|d}|d |  rJ ||d   sJ 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}t j| dk d
d}t||tdksJ d S )Nd   r   shaper   r'   r(   r+   precomputedn_componentsr?   r   float)Zdtyper   )r   r,   r-   Zzerosabsrandnr   allanyZflatr   r   fit_transformZastypeZfloat32r3   Zravelr   pytestapprox)	seedr   Zn_sampler?   Z	componentZ
true_label
se_precompZembedded_coordinateZlabel_r"   r"   r#   &test_spectral_embedding_two_componentsX   s4    


rR   XZdenser   )Zidsc                 C   sl   d}t ddtj|d}t dd|tj|d}|t| |d}|| }t|j|j t||d d S )	Nr   r   rE   rF   rbfrG   r?   gammar   rV   皙?)	r   r   r,   r-   rM   r
   r   affinity_matrix_r$   )rS   rP   rV   rQ   se_rbfZembed_precomp	embed_rbfr"   r"   r#   ,test_spectral_embedding_precomputed_affinity   s    

r\   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   precomputed_nearest_neighbors)r   rG   r?   r^   r(   )r   fitSZkneighbors_graphr   Z
embedding_r0   r   )r^   ZresultsZadditional_neighborsZnngraph	embeddingr"   r"   r#   ,test_precomputed_nearest_neighbors_filtering   s     
re   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?rW   r   c                    s   t |  dS )NrW   r	   )xrW   r"   r#   <lambda>       z;test_spectral_embedding_callable_affinity.<locals>.<lambda>rU   rT   rX   )
r
   rb   r   r   r,   r-   rM   r   rY   r$   )rS   rP   ZkernZse_callablerZ   r[   Zembed_callabler"   rW   r#   )test_spectral_embedding_callable_affinity   s&    




ri   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 tddddtj| d}tddddtj| d}|t}|t}t||d g d	}g d
}g d}t	j
|| || || ffdd }d|_d|_||}||}t||d d S )Npyamgr   nearest_neighborsamg   )rG   r?   eigen_solverr^   r   Zarpackgh㈵>)r   r   r(   r      ro      )r(   r   r   ro   rp   rm   rm   )rB   rB   rB   r(   rB   rB   rB   )   rq   rC   rE   )rN   importorskipr   r   r,   r-   rM   rb   r$   r   r4   Ztoarrayr?   )	rP   Zse_amgZ	se_arpackZ	embed_amgZembed_arpackrowcolvalr?   r"   r"   r#   "test_spectral_embedding_amg_solver   s:    







rv   c                  C   s   t d d} d}tj||d| d}t|t|  }||j }t|dddd	}t	d
D ]&}t|dd|d d	}t
||dd q^d S )Nrj   rA   rB   r*   )Zdensityr   r]   rl   r   )rG   rn   r   ro   r(   rX   )r!   )rN   rr   r   ZrandZtriuZdiagsZdiagonalr   r   r.   r$   )rP   Z	num_nodesrS   upperZ
sym_matrixrd   r;   Znew_embeddingr"   r"   r#   *test_spectral_embedding_amg_solver_failure   s    

rx   z6ignore:the behavior of nmi will change in version 0.22c                 C   sl   t j| }ttd|d}ttdd|d}||fD ]4}tt|d}||t t	t
|jtdd q2d S )	NrT   rF   rk   rm   )rG   r?   r^   r   )
n_clustersr   r   r   )r   r,   r-   r   ry   r   ra   rM   rb   r   r   Zlabels_true_labels)rP   r   rZ   Zse_knnseZkmr"   r"   r#   !test_pipeline_spectral_clustering  s     r|   c                 C   sP   t ddtj| dd}tt |t W d    n1 sB0    Y  d S )Nr(   rE   	<unknown>)rG   r?   r   rn   	r   r   r,   r-   rN   Zraises
ValueErrorra   rb   rP   r{   r"   r"   r#   +test_spectral_embedding_unknown_eigensolver.  s    
r   c                 C   sN   t ddtj| d}tt |t W d    n1 s@0    Y  d S )Nr(   r}   rF   r~   r   r"   r"   r#   (test_spectral_embedding_unknown_affinity:  s
    r   c                 C   s   t g dg dg dg dg dg}t|r4J tt|rFJ tt|rXJ t g dg dg dg dg dg}t|sJ tt|sJ tt|sJ d S )N)r(   r   r   r   r   )r   r(   r(   r   r   )r   r(   r(   r(   r   )r   r   r(   r(   r(   )r   r   r   r(   r(   )r(   r(   r   r   r   )r(   r(   r(   r   r   )r   r3   r   r   
csr_matrixZ
csc_matrix)rP   rc   r"   r"   r#   test_connectivityC  s,    		r   c                  C   s>   t jd} | dd}t|}t|}t|}t|| d S )NrA   r]      )r   r,   r-   rJ   r
   r   r   )r   r>   simsembedding_1embedding_2r"   r"   r#   %test_spectral_embedding_deterministic_  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 )	NrA   r]   r      F)norm_laplacianrG   
drop_firstT)ZnormedZreturn_diag)r   r,   r-   rJ   r
   r   r   	laplacianr   r   r   r   )
r   r>   r   rG   r   r   Zdd_Zdiffusion_mapr   r"   r"   r#   $test_spectral_embedding_unnormalizedi  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sfJ t |d d df d	ks,J q,d S )
NrA   r]   r   r   F)r   rG   r   r   r   r(   gMbP?)
r   r,   r-   rJ   r
   r.   r   ZstdrN   rO   )r   r>   r   rG   rP   rd   r"   r"   r#   *test_spectral_embedding_first_eigen_vector}  s    $r   r?   rE   r`   c                 C   sF   t | d}d}tjt|d |j W d    n1 s80    Y  d S )N)r?   z5Attribute `_pairwise` was deprecated in version 0\.24)match)r   rN   ZwarnsFutureWarningZ	_pairwise)r?   r{   msgr"   r"   r#   +test_spectral_embedding_pairwise_deprecated  s    
r   )r   )rA   )rA   )rA   )rA   )rA   )rA   )rA   )rA   ):rN   Znumpyr   Zscipyr   Zscipy.sparser   Zscipy.linalgr   Zsklearn.manifoldr   Z$sklearn.manifold._spectral_embeddingr   r   r   Zsklearn.metrics.pairwiser
   Zsklearn.metricsr   Zsklearn.neighborsr   Zsklearn.clusterr   Zsklearn.datasetsr   Zsklearn.utils.extmathr   Zsklearn.utils._testingr   r   r3   r   r   rD   ry   Z
n_featuresrb   rz   r$   r@   rR   ZmarkZparametrizer   r\   re   ri   filterwarningsrv   rx   r|   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   s   


'
**


	

