U
    3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*   R/tmp/pip-unpacked-wheel-zrfo1fqw/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st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 |  st||d  	 rtt|d}|d | 	 rt||d   st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std S )Nd   r!   shaper   r/   r0   r3   precomputedn_componentsrK   r    rM   )rP   r   )r$   r4   r5   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    


rc   XZdenser   )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   rh   皙?)
r   r$   r4   r5   r\   r   r]   r   affinity_matrix_r,   )	rd   rM   rP   r`   rh   rb   se_rbfZembed_precomp	embed_rbfr*   r*   r+   ,test_spectral_embedding_precomputed_affinity   s$    

rn   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   rp   r0   )r   fitSZkneighbors_graphr   
embedding_r8   r   )rp   resultsZadditional_neighborsnngraph	embeddingr*   r*   r+   ,test_precomputed_nearest_neighbors_filtering   s     
ry   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?ri   r!   c                    s   t |  dS )Nri   r   )xri   r*   r+   <lambda>       z;test_spectral_embedding_callable_affinity.<locals>.<lambda>)rV   rK   rh   r    rg   rj   )
r   rs   r   r$   r4   r5   r\   r   rk   r,   )rd   r`   kernZse_callablerl   rm   Zembed_callabler*   ri   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   rp   r    rN   gh㈵>r   r0         rQ   )   r   rR   rT   )r   r$   r4   r5   r\   rs   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    ro   rO   r   )rV   rM   r    r   r0   rj   )r)   )
r   Zrandr]   ZtriuZdiagsZdiagonalr#   r   r6   r,   )	rP   r`   Z	num_nodesrd   upperZ
sym_matrixrx   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 )
Nrg   )rV   rK   r    r   r   )rV   rK   rp   r    auto)
n_clustersr    Zn_initr   r!   )r$   r4   r5   r   r   r   rr   r\   rs   r   r   Zlabels_true_labels)r`   r    rl   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|sttt|sttt|std S )Nr0   r   )r$   r<   r	   r&   r   
csr_matrixZ
csc_matrix)r`   rw   r*   r*   r+   test_connectivityZ  s,    		r   c                  C   s>   t jd} | dd}t|}t|}t|}t|| d S )Nrf   ro      )r$   r4   r5   rY   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 )	Nrf   ro   r      F)norm_laplacianrV   
drop_firstT)normedZreturn_diag)r$   r4   r5   rY   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 )
Nrf   ro   r   r!   F)r   rV   r   r    r   r0   gMbP?)r$   r4   r5   rY   r   r6   r   Zstdr^   r_   r&   )r    rJ   r   rV   r`   rx   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!   rg   r   )rV   rK   rM   r    N)rs   r]   r   r\   rP   r&   rt   rk   )rM   rP   rd   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!   rg   rO   )rV   rK   rM   z>The eigen_solver was set to 'amg', but pyamg is not available.)match)r   r^   Zraises
ValueErrorr\   rs   )rb   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std
S )z2Test that `eigen_tol="auto"` is resolved correctlyrO   zPyAMG is not available.r.   r   r0   r/   g{Gz?)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   rd   r   Drs   Zsolver_funcdefault_valueZmocked_solverkwargsr*   r*   r+   test_spectral_eigen_tol_auto  s(    
   



r   )r   )r   )rf   )rf   )rf   )rf   )rf   )rf   )KZunittest.mockr   r^   Z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_featuresrs   r   r,   rL   ZparametrizeparamZfloat32Zfloat64rc   r   rn   ry   r~   filterwarningsr   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   s   
 
   

+, ' 



