o
    ioE                  
   @   sf  d dl 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 d dlmZ d dlmZmZ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%m&Z&m'Z'm(Z(m)Z) d dl$m*Z+ z
d dl,m-Z- dZ.W n e/y   dZ.Y nw ej0j1e. ddZ2e3g dg dg dgZ4dZ5e4j6\Z7Z8ee5e4ddd\Z9Z:dKddZ;ej0<d e%d!d" Z=ej0<d#d$d%ej>d&e2d'gej0<d(ej?ej@gdLd)d*ZAej0<d+dge'ej0<d#d$d%ej>d&e2d'gej0<d(ej?ej@f	,dMd-d.ZBd/d0 ZCej0<d+dge'dMd1d2ZDej0j1e. ddej0<d(ej?ej@fej0<d e%dMd3d4ZEej0j1e. ddej0<d(ej?ej@fdMd5d6ZFdMd7d8ZGdMd9d:ZHd;d< ZId=d> ZJd?d@ ZKej0<d#d$d%ej>d&e2d'gej0<d(ej?ej@gdAdB ZLej0j1e.dCddDdE ZMej0<dFg dGej0<dHe'dIdJ ZNdS )N    N)Mock)sparse)eigh)eigshlobpcg)KMeans)
make_blobs)SpectralEmbedding_spectral_embeddingspectral_embedding)_graph_connected_component_graph_is_connected)normalized_mutual_info_scorepairwise_distances
rbf_kernel)NearestNeighbors)assert_array_almost_equalassert_array_equal)_deterministic_vector_sign_flip)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSparse_version
sp_version)	laplacian)smoothed_aggregation_solverTFz1PyAMG is required for the tests in this function.)reason)              @r   r   r   )r   r   g      @r   r   )      ?r   r   r   r      r    *   )	n_samplescenterscluster_stdrandom_stater   c                 C   sT   |d }t | j|jD ]\}}t|| d |ks't|| d |ks'J qdS )zLCheck array A and B are equal with possible sign flipping on
    each column   N)zipTnpmax)ABtolZtol_squaredZA_colZB_col r/   h/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flipping8   s   r1   coo_containerc                 C   sz  t jd}d}dddd|g}||}g }t|D ]I\}}||| }tt|d D ]}	|||	 ||	d  f q-dt|d }
}d}|j	|
||d}|j	|
||d}|
t|| ||  qtt |j\}}|jd	dt|d}| |||ff}d
||j  }t|D ]-\}}t||| }|| }| |ksJ t|||d  }| |ksJ t|| qd S )Nr"   i,  r   y         r!   )size皙?      ?)r*   randomRandomStateZpermutation	itertoolspairwiserangelenappendrandintextendr(   tuplearrayr)   uniformr   sumr   )r2   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/   r0   %test_sparse_graph_connected_componentC   s4   
rR   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 |  sIJ ||d   rSJ t|d}|d |  rbJ ||d   slJ 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sJ d S )Nd   r'   shaper   r5   r8   precomputedn_componentsrQ   r&   rS   rV   r    )r*   r9   r:   Zzerosabsrandnr   allanyZflatr)   r	   fit_transformastyperC   Zravelint64r   pytestapprox)rS   rV   seedr&   Zn_samplerQ   	componentZ
true_label
se_precompZembedded_coordinateZlabel_r/   r/   r0   &test_spectral_embedding_two_componentso   s8   


rk   sparse_container$   c           
      C   s   d}| d u rt n| t }tddtj||d}tdd|tj||d}|t|||d}|||}	t|j	|j	 t
||	d d S )	Nr    r'   r[   r\   rbf)r]   rQ   gammar&   rS   ro   皙?)Sr	   r*   r9   r:   rc   r   rd   r   affinity_matrix_r1   )
rl   rS   rV   rh   ro   Xrj   se_rbfZembed_precomp	embed_rbfr/   r/   r0   ,test_spectral_embedding_precomputed_affinity   s&   

rw   c                  C   sl   d} g }dD ]$}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&   r]   rQ   ry   r5   )r   fitrr   Zkneighbors_graphr	   
embedding_r?   r   )ry   resultsZadditional_neighborsnngraph	embeddingr/   r/   r0   ,test_precomputed_nearest_neighbors_filtering   s    
r   c                    s   d t t d}| d u rtn| t}td fdd tj|d}tdd tj|d}||}||}t|j|j t||j t	||d d S )	Ng?rp   r'   c                    s   t |  dS )Nrp   r   )xrp   r/   r0   <lambda>   s    z;test_spectral_embedding_callable_affinity.<locals>.<lambda>)r]   rQ   ro   r&   rn   rq   )
r   rr   r	   r*   r9   r:   rc   r   rs   r1   )rl   rh   kernrt   Zse_callableru   rv   Zembed_callabler/   rp   r0   )test_spectral_embedding_callable_affinity   s(   




r   c                 C   s  t ddddtj|d}t ddddtj|d}|t| }|t| }t||d tjg dtj	d	}tjg d
tj	d	}tjg dtj
d	}	|t|	|	gt||gt||gffdd}
d|_d|_||
| }||
| }t||d |
 }
|
jtj
|
_|
jtj
|
_ttdk}|r||
 d S d}tjt|d ||
 W d    d S 1 sw   Y  d S )Nr'   nearest_neighborsrU      )r]   rQ   rS   ry   r&   rT   gh㈵>)r   r   r5   r'      r      r^   )r5   r'   r'   r   r   r   r   )rW   rW   rW   r5   rW   rW   rW   )   r   rX   r[   z1.11.3z=Only sparse matrices with 32-bit integer indices are acceptedmatch)r	   r*   r9   r:   rc   rr   rd   r1   rC   Zint32re   ZhstackrQ   ZtocsrZindptrindicesr   r   rf   raises
ValueError)rV   r2   rh   Zse_amgZ	se_arpackZ	embed_amgZembed_arpackrowcolvalrQ   Z*scipy_graph_traversal_supports_int64_indexerr_msgr/   r/   r0   "test_spectral_embedding_amg_solver   sN   

("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 q-d S )NrW   r7   )Zdensityr&   rx   rU   r   )r]   rS   r&   r   r5   rq   )r.   )
r   Zrandrd   ZtriuZdiagsZdiagonalr)   r   r=   r1   )	rV   rh   Z	num_nodesrt   upperZ
sym_matrixr   rL   Znew_embeddingr/   r/   r0   *test_spectral_embedding_amg_solver_failure3  s   

r   c                 C   sn   t j| }ttd|d}ttdd|d}||fD ]}tt|dd}||t t	t
|jtdd	 qd S )
Nrn   )r]   rQ   r&   r   r   )r]   rQ   ry   r&   rx   )
n_clustersr&   Zn_initr    r'   )r*   r9   r:   r	   r   r   r{   rc   rr   r   r   Zlabels_true_labels)rh   r&   ru   Zse_knnsekmr/   r/   r0   !test_pipeline_spectral_clusteringJ  s"   r   c                 C   s   t g dg dg dg dg dg}t|rJ tD ]
}t||r&J qtD ]
}t||r3J q)t g dg dg dg dg dg}t|sNJ tD ]
}t||sZJ qPtD ]
}t||sgJ q]d S )N)r5   r   r   r   r   )r   r5   r5   r   r   )r   r5   r5   r5   r   )r   r   r5   r5   r5   )r   r   r   r5   r5   )r5   r5   r   r   r   )r5   r5   r5   r   r   )r*   rC   r   r   r   )rh   r   csr_containerZcsc_containerr/   r/   r0   test_connectivity^  s6   		r   c                  C   s>   t jd} | dd}t|}t|}t|}t|| d S )Nrm   rx      )r*   r9   r:   r`   r   r   r   )r&   rP   simsembedding_1embedding_2r/   r/   r0   %test_spectral_embedding_deterministic  s   r   c            
      C   sx   t jd} | dd}t|}d}t|d|dd}t|ddd\}}t|\}}|jd | }	t	|	j}	t
||	 d S )	Nrm   rx   r      F)norm_laplacianr]   
drop_firstT)ZnormedZreturn_diag)r*   r9   r:   r`   r   r   csgraph_laplacianr   r)   r   r   )
r&   rP   r   r]   r   r   dd_Zdiffusion_mapr   r/   r/   r0   $test_spectral_embedding_unnormalized  s   
r   c                  C   s   t jd} | dd}t|}d}tdD ],}t|d|d|d}t |d d df t	dks3J t |d d df d	ksBJ qd S )
Nrm   rx   r   r'   F)r   r]   r   r&   r   r5   gMbP?)
r*   r9   r:   r`   r   r=   r   Zstdrf   rg   )r&   rP   r   r]   rh   r   r/   r/   r0   *test_spectral_embedding_first_eigen_vector  s   $ r   c                 C   sV   t |}tdd| dd}||}|j|ksJ |jj|ks!J |jj|ks)J 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'   rn   r   )r]   rQ   rS   r&   N)rr   rd   r	   rc   rV   r|   rs   )rS   rV   rt   r   ZX_transr/   r/   r0   'test_spectral_embedding_preserves_dtype  s   

r   z7PyAMG is installed and we should not test for an error.c                  C   sP   t dddd} d}tjt|d | t W d    d S 1 s!w   Y  d S )Nr'   rn   rU   )r]   rQ   rS   z>The eigen_solver was set to 'amg', but pyamg is not available.r   )r	   rf   r   r   rc   rr   )rj   r   r/   r/   r0   test_error_pyamg_not_available  s   "r   solver)rT   rU   r   r   c                 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r,tnt}|d	kr4dnd
}|dkr>||}t	|d}	| 
t|j|	 t|d|dd |	  |	j\}}
|
d |ksdJ d
S )z2Test that `eigen_tol="auto"` is resolved correctlyrU   zPyAMG is not available.r4   r   r5   rZ   g{Gz?)r#   r&   r$   r%   rT   N)Zside_effectr"   auto)r&   rS   Z	eigen_tolr.   )pyamg_availablerf   skipr   r   r*   r+   r   r   r   setattrr
   __qualname__r   Zassert_calledZ	call_args)Zmonkeypatchr   r   rt   r   Drr   Zsolver_funcdefault_valueZmocked_solverkwargsr/   r/   r0   test_spectral_eigen_tol_auto  s"   



r   )r   )r   )rm   )Or;   Zunittest.mockr   numpyr*   rf   Zscipyr   Zscipy.linalgr   Zscipy.sparse.linalgr   r   Zsklearn.clusterr   Zsklearn.datasetsr   Zsklearn.manifoldr	   r
   r   Z$sklearn.manifold._spectral_embeddingr   r   Zsklearn.metricsr   r   Zsklearn.metrics.pairwiser   Zsklearn.neighborsr   Zsklearn.utils._testingr   r   Zsklearn.utils.extmathr   Zsklearn.utils.fixesr   r   r   r   r   r   r   Zpyamgr   r   ImportErrormarkZskipifZskip_if_no_pyamgrC   r$   r#   rY   r   Z
n_featuresrr   r   r1   ZparametrizerR   paramZfloat32Zfloat64rk   rw   r   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   s    



+,6

!

