a
    hdE                  
   @   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
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0 ej/j0e- ddZ1e2g dg dg dgZ3dZ4e3j5\Z6Z7ee4e3ddd\Z8Z9dKddZ:ej/;d e$d!d" Z<ej/;d#d$d%ej=d&e1d'gej/;d(ej>ej?gdLd)d*Z@ej/;d+dge&ej/;d#d$d%ej=d&e1d'gej/;d(ej>ej?fdMd-d.ZAd/d0 ZBej/;d+dge&dNd1d2ZCej/j0e- ddej/;d(ej>ej?fej/;d e$dOd3d4ZDej/j0e- ddej/;d(ej>ej?fdPd5d6ZEdQd7d8ZFdRd9d:ZGd;d< ZHd=d> ZId?d@ ZJej/;d#d$d%ej=d&e1d'gej/;d(ej>ej?gdAdB ZKej/j0e-dCddDdE ZLej/;dFg dGej/;dHe&dIdJ ZMdS )S    )MockN)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 ]8\}}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/   j/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flipping7   s    r1   coo_containerc                 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	}| |||ff}d||j  }t|d d |dd  D ]`\}}t||| }|| }| |ksjJ t|||d  }| |ksJ t|| q:d S )Nr"   i,  r   y         r!   )size皙?      ?)r*   randomRandomStateZpermutationr(   rangelenappendrandintextend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_componentB   s2    
""rQ   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 |  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|	 dk t jd
}
t||
tdksJ d S )Nd   r'   shaper   r5   r6   r9   precomputedn_componentsrP   r&   rR   rU   r    )r*   r:   r;   Zzerosabsrandnr   allanyZflatr)   r	   fit_transformastyperB   Zravelint64r   pytestapprox)rR   rU   seedr&   Zn_samplerP   	componentZ
true_label
se_precompZembedded_coordinateZlabel_r/   r/   r0   &test_spectral_embedding_two_componentsn   s8    


ri   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'   rY   rZ   rbf)r[   rP   gammar&   rR   rm   皙?)Sr	   r*   r:   r;   ra   r   rb   r   affinity_matrix_r1   )
rj   rR   rU   rf   rm   Xrh   se_rbfZembed_precomp	embed_rbfr/   r/   r0   ,test_spectral_embedding_precomputed_affinity   s&    

ru   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&   r[   rP   rw   r6   )r   fitrp   Zkneighbors_graphr	   
embedding_r>   r   )rw   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?rn   r'   c                    s   t |  dS )Nrn   r   )xrn   r/   r0   <lambda>       z;test_spectral_embedding_callable_affinity.<locals>.<lambda>)r[   rP   rm   r&   rl   ro   )
r   rp   r	   r*   r:   r;   ra   r   rq   r1   )rj   rf   kernrr   Zse_callablers   rt   Zembed_callabler/   rn   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}|rL||
 n>d}tjt|d ||
 W d    n1 s0    Y  d S )Nr'   nearest_neighborsrT      )r[   rP   rR   rw   r&   rS   gh㈵>)r   r   r6   r'      r      r\   )r6   r'   r'   r   r   r   r   )rV   rV   rV   r6   rV   rV   rV   )   r   rW   rY   z1.11.3z=Only sparse matrices with 32-bit integer indices are acceptedmatch)r	   r*   r:   r;   ra   rp   rb   r1   rB   Zint32rc   ZhstackrP   ZtocsrZindptrindicesr   r   rd   raises
ValueError)rU   r2   rf   Zse_amgZ	se_arpackZ	embed_amgZembed_arpackrowcolvalrP   Z*scipy_graph_traversal_supports_int64_indexerr_msgr/   r/   r0   "test_spectral_embedding_amg_solver   sL    

(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 )NrV   r8   )Zdensityr&   rv   rT   r   )r[   rR   r&   r   r6   ro   )r.   )
r   Zrandrb   ZtriuZdiagsZdiagonalr)   r   r<   r1   )	rU   rf   Z	num_nodesrr   upperZ
sym_matrixr~   rK   Znew_embeddingr/   r/   r0   *test_spectral_embedding_amg_solver_failure2  s    

r   c                 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 )
Nrl   )r[   rP   r&   r   r   )r[   rP   rw   r&   rv   )
n_clustersr&   Zn_initr    r'   )r*   r:   r;   r	   r   r   ry   ra   rp   r   r   Zlabels_true_labels)rf   r&   rs   Zse_knnsekmr/   r/   r0   !test_pipeline_spectral_clusteringI  s     r   c                 C   s   t g dg dg dg dg dg}t|r4J tD ]}t||r8J q8tD ]}t||rRJ qRt g dg dg dg dg dg}t|sJ tD ]}t||sJ qtD ]}t||sJ qd S )N)r6   r   r   r   r   )r   r6   r6   r   r   )r   r6   r6   r6   r   )r   r   r6   r6   r6   )r   r   r   r6   r6   )r6   r6   r   r   r   )r6   r6   r6   r   r   )r*   rB   r   r   r   )rf   r}   csr_containerZcsc_containerr/   r/   r0   test_connectivity]  s4    		r   c                  C   s>   t jd} | dd}t|}t|}t|}t|| d S )Nrk   rv      )r*   r:   r;   r^   r   r   r   )r&   rO   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 )	Nrk   rv   r      F)norm_laplacianr[   
drop_firstT)normedZreturn_diag)r*   r:   r;   r^   r   r   csgraph_laplacianr   r)   r   r   )
r&   rO   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 ]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 )
Nrk   rv   r   r'   F)r   r[   r   r&   r   r6   gMbP?)
r*   r:   r;   r^   r   r<   r   Zstdrd   re   )r&   rO   r   r[   rf   r~   r/   r/   r0   *test_spectral_embedding_first_eigen_vector  s    $r   c                 C   sV   t |}tdd| dd}||}|j|ks2J |jj|ksBJ |jj|ksRJ 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'   rl   r   )r[   rP   rR   r&   N)rp   rb   r	   ra   rU   rz   rq   )rR   rU   rr   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   sN   t dddd} d}tjt|d | t W d    n1 s@0    Y  d S )Nr'   rl   rT   )r[   rP   rR   z>The eigen_solver was set to 'amg', but pyamg is not available.r   )r	   rd   r   r   ra   rp   )rh   r   r/   r/   r0   test_error_pyamg_not_available  s    r   solver)rS   rT   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rXtnt}|d	krhdnd
}|dkr|||}t	|d}	| 
t|j|	 t|d|dd |	  |	j\}}
|
d |ksJ d
S )z2Test that `eigen_tol="auto"` is resolved correctlyrT   zPyAMG is not available.r4   r   r6   r5   g{Gz?)r#   r&   r$   r%   rS   N)Zside_effectr"   auto)r&   rR   Z	eigen_tolr.   )pyamg_availablerd   skipr   r   r*   r+   r   r   r   setattrr
   __qualname__r   Zassert_calledZ	call_args)Zmonkeypatchr   r   rr   r   Drp   Zsolver_funcdefault_valueZmocked_solverkwargsr/   r/   r0   test_spectral_eigen_tol_auto  s"    



r   )r   )r   )rk   )rk   )rk   )rk   )rk   )rk   )NZunittest.mockr   numpyr*   rd   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_pyamgrB   r$   r#   rX   r   Z
n_featuresrp   r   r1   ZparametrizerQ   paramZfloat32Zfloat64ri   ru   r   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   s   




+, 6

!

