U
    ½mœd>±  ã                   @   sŠ	  d Z ddlZddlZddlZddlZddlm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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& 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Z/e	j0 1de/ ¡Z2e 3dddddgddd ddgdddddgg¡Z4d!Z5e4j6\Z7Z8e,e5e4dd"d#�\Z9Z:e ;e9¡Z<e	j0j=d$ej3ej;gd%d&gd'�e	j0 =d(d)d*g¡e	j0 =d+ej>ej?g¡d,d-„ ƒƒƒZ@e	j0j=d$ej3ej;gd%d&gd'�e	j0 =d(d)d*g¡d.d/„ ƒƒZAe	j0j=d$ej3ej;gd%d&gd'�d0d1„ ƒZBe	j0 =d2d3d4g¡e	j0j=d$ej3ej;gd%d&gd'�e	j0 =d5d6d7d8dg¡d9d:„ ƒƒƒZCe	j0 =d;d)d*g¡d<d=„ ƒZDe	j0 =d;d>d?g¡d@dA„ ƒZEdBdC„ ZFdDdE„ ZGe	j0j=dFe9e<gd%d&gd'�e	j0j=dGdHdIe4dJdK„ gdHdIdLdMgd'�e	j0 =dNeeg¡dOdP„ ƒƒƒZHe	j0j=dGdHdIe4dQdK„ gdHdIdLdMgd'�dRdS„ ƒZIe	j0 =dNeeg¡dTdU„ ƒZJdVdW„ ZKe	j0 =d;d)d*g¡e	j0 =d5d6dg¡dXdY„ ƒƒZLdZd[„ ZMe	j0 =dNeeg¡d\d]„ ƒZNd^d_„ ZOe	j0j=dFe9e<gd%d&gd'�d`da„ ƒZPdbdc„ ZQddde„ ZRe	j0 =dfdgdhg¡didj„ ƒZSdkdl„ ZTdmdn„ ZUe	j0 =dNeeg¡dodp„ ƒZVe	j0j=d$ej3ej;gd%d&gd'�e	j0 =dqed)fed*fedfg¡e	j0 =drdsd!g¡dtdu„ ƒƒƒZWe	j0 =dNeeg¡dvdw„ ƒZXe	j0j=dGdHdIe4gdHdIdLgd'�e	j0 =dNeeg¡dxdy„ ƒƒZYe	j0j=d$ej3ej;gd%d&gd'�e	j0 =d+ejZej[g¡e	j0 =dGdIdLg¡e	j0 =dNeeg¡dzd{„ ƒƒƒƒZ\e	j0 =dNeeg¡d|d}„ ƒZ]e	j0 =dNeeg¡d~d„ ƒZ^d€d�„ Z_d‚dƒ„ Z`e	j0j=dFe9e<gd%d&gd'�e	j0 =dNeeg¡d„d…„ ƒƒZae	j0 =d+ejZej[ej>ej?g¡e	j0 =dNeeg¡d†d‡„ ƒƒZbe	j0j=dFe9e<gd%d&gd'�dˆd‰„ ƒZcdŠd‹„ ZddŒd�„ ZedŽd�„ Zfe	j0j=dFe9e<gd%d&gd'�e	j0 =dNeeg¡d�d‘„ ƒƒZge	j0j=dFe9e<gd%d&gd'�e	j0 =dNeeg¡d’d“„ ƒƒZhd”d•„ Zie	j0j=d$ej3ej;gd%d&gd'�d–d—„ ƒZje	j0 =dNeeg¡d˜d™„ ƒZkdšd›„ Zle	j0j=d$ej3ej;gd%d&gd'�e	j0 =d(d)d*g¡dœd�„ ƒƒZme	j0 =d+ej>ej?g¡e	j0 =dždŸd g¡d¡d¢„ ƒƒZne	j0 =d+ej>ej?g¡d£d¤„ ƒZoe	j0 =d¥ed¦fed§fg¡d¨d©„ ƒZpe	j0 =d¥ed¦fed§fg¡dªd«„ ƒZqe	j0 =dNeeg¡d¬d­„ ƒZre	j0 =dNeeg¡e	j0 =d®d¯e5d° id±fdGe9dds… id²fdGd³dK„ id²fdGe9dd´…dds…f idµfdGd¶dK„ idµfg¡d·d¸„ ƒƒZse	j0 =d®d¹e9dds… idºfg¡d»d¼„ ƒZte	j0 =dFe9e<g¡e	j0 =d+ej?ej>g¡d½d¾„ ƒƒZue	j0 =d¹ee9dŸd¿�dg¡dÀdÁ„ ƒZvdÂdÃ„ ZwdÄdÅ„ Zxe	j0 =dÆdGe ydI¡iddgd°d°ggd°dÇœf¡dÈdÉ„ ƒZze	j0 =dÊedËfedËfedÌfg¡dÍdÎ„ ƒZ{e	j0 =dÏdŸd g¡dÐdÑ„ ƒZ|dS )ÒzTesting for K-meansé    N)Úsparse)Úassert_array_equal)Úassert_allclose)Úthreadpool_limits)Úclone)ÚConvergenceWarning)Ú	row_norms)Úpairwise_distances)Úpairwise_distances_argmin)Úv_measure_score)ÚKMeansÚk_meansÚkmeans_plusplus)ÚMiniBatchKMeans)Ú_labels_inertia)Ú_mini_batch_step)Ú_relocate_empty_clusters_dense)Ú_relocate_empty_clusters_sparse)Ú_euclidean_dense_dense_wrapper)Ú_euclidean_sparse_dense_wrapper)Ú_inertia_dense)Ú_inertia_sparse)Ú_is_same_clustering)Úcreate_memmap_backed_data)Ú
make_blobs)ÚStringIOz�The default value of `n_init` will change from \d* to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning:FutureWarningzignore:ç        g      @ç      ð?g      @éd   é*   )Ú	n_samplesÚcentersZcluster_stdÚrandom_stateÚarray_constrZdenser   )ZidsÚalgoÚlloydÚelkanÚdtypec                 C   sÌ   | ddgddgddgddgg|d�}ddddg}t jddgddgg|d�}ddddg}d}t jddgddgg|d�}d	}	td	d||d
�}
|
j||d� t|
j|ƒ t|
j|ƒ t|
j|ƒ |
j	|	ksÈt
‚d S )Nr   ç      à?é   ©r'   é   g      Ø?g      À?g      ì?é   ©Ú
n_clustersÚn_initÚinitÚ	algorithm©Úsample_weight)ÚnpÚarrayr   Úfitr   Úlabels_r   Úinertia_Úcluster_centers_Ún_iter_ÚAssertionError)r#   r$   r'   ÚXr3   Úinit_centersÚexpected_labelsÚexpected_inertiaÚexpected_centersÚexpected_n_iterÚkmeans© rC   ú[/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.pyÚtest_kmeans_results;   s    $rE   c           	      C   sø   | ddgddgddgddggƒ}t  ddgddgg¡}tdd||d�}| |¡ d}d}t|j|ƒ |j|ksrt‚z8ddddg}ddgddgg}t|j	|ƒ t|j
|ƒ W nH tk
rò   ddddg}dd	gdd
gg}t|j	|ƒ t|j
|ƒ Y nX d S )Nr   r(   r)   r+   r,   r-   g      Ð?g      è?r   r   )r4   r5   r   r6   r   r8   r:   r;   r   r7   r9   )	r#   r$   r<   r=   rB   rA   r?   r>   r@   rC   rC   rD   Útest_kmeans_relocated_clustersU   s$     
rF   c                 C   sì   t  ddddddddd	d
g
¡ dd¡}| |ƒ}t  d
¡}t  dddg¡ dd¡}t  dddg¡ dd¡}t  dddg¡}t jd
t jd�}| t jkr¦t||||||ƒ nt|j|j	|j
|||||ƒ t|dddgƒ t|dgd
gd	ggƒ d S )Ng      $Àg      #Ài÷ÿÿÿg      !Àiøÿÿÿéÿÿÿÿr)   é	   g      #@é
   iöÿÿÿg     €0Àg      $@r   r*   é   iÜÿÿÿ)r4   r5   ÚreshapeÚonesÚzerosÚint32r   r   ÚdataÚindicesZindptrr   r   )r#   r<   r3   Úcenters_oldÚcenters_newZweight_in_clustersÚlabelsrC   rC   rD   Útest_relocate_empty_clustersv   s8    &

     ÿørT   ÚdistributionÚnormalZblobsÚtolg{®Gáz„?g:Œ0âŽyE>g0Žä.ÿ++c           	      C   sÄ   t j |¡}| dkr"|jdd�}nt|d�\}}d||dk < ||ƒ}td|d|d�}td	d|d|d
�}| |¡ | |¡ t|j|jƒ t	|j
|j
ƒ |j|jks¦t‚|jtj|jdd�ksÀt‚d S )NrV   ©iˆ  rI   ©Úsize©r"   r   é   r)   )r.   r"   r/   rW   r&   )r1   r.   r"   r/   rW   ç�íµ ÷Æ°>)Úrel)r4   ÚrandomÚRandomStaterV   r   r   r6   r   r9   r   r7   r:   r;   r8   ÚpytestZapprox)	rU   r#   rW   Úglobal_random_seedÚrndr<   Ú_Zkm_lloydZkm_elkanrC   rC   rD   Útest_kmeans_elkan_results¢   s(    û

re   r1   c                 C   sH   t j |¡}|jdd�}d}t| d|dd|d� |¡}|j|k sDt‚d S )NrX   rY   i,  r\   r)   r   )r1   r.   r"   r/   rW   Úmax_iter)r4   r_   r`   rV   r   r6   r:   r;   )r1   rb   rc   r<   rf   ÚkmrC   rC   rD   Útest_kmeans_convergenceÂ   s    úù	rh   ÚautoÚfullc              	   C   sV   t j dd¡}t| d�}tjtd| › d�d�� | |¡ |jdksHt	‚W 5 Q R X d S )Nr   r,   ©r1   zalgorithm='zB' is deprecated, it will be removed in 1.3. Using 'lloyd' instead.©Úmatchr%   )
r4   r_   Zrandr   ra   ÚwarnsÚFutureWarningr6   Ú
_algorithmr;   )r1   r<   rB   rC   rC   rD   Ú,test_algorithm_auto_full_deprecation_warningÕ   s    

ý
rq   c              	   C   sv  t j | ¡}t|jtjd� }| ¡ }t  |¡}t  |¡}t j|jd t	j
d�}t j|jd t	j
d�}t jt	jd t	j
d�}t	d d… }	td d… }
|d d… }t|	||||t j | ¡dd�}|dksÊt‚t|	||ƒ\}}|dksæt‚||k sòt‚t|
||||t j | ¡dd�}|dk�st‚t|
||ƒ\}}|dk�s<t‚||k �sJt‚t||ƒ t||ƒ t||ƒ t||ƒ d S )NrY   r   r*   rI   F)Úrandom_reassignr   )r4   r_   r`   r!   rV   ÚshapeÚcopyZ
zeros_likerM   r<   r'   rL   ÚX_csrr   r;   r   r   r   )rb   ÚrngrQ   Zcenters_old_csrrR   Zcenters_new_csrZweight_sumsZweight_sums_csrr3   ZX_mbZX_mb_csrZsample_weight_mbZold_inertiarS   Znew_inertiaZold_inertia_csrZ
labels_csrZnew_inertia_csrrC   rC   rD   Ú!test_minibatch_update_consistencyä   sZ    


ù	
ù	  ÿ


rw   c                 C   sX   | j }|jttfkst‚| j}t |¡jd tks6t‚tt	t
|ƒdƒ | jdksTt‚d S )Nr   r   r   )r9   rs   r.   Ú
n_featuresr;   r7   r4   Úuniquer   r   Útrue_labelsr8   )rg   r!   rS   rC   rC   rD   Ú_check_fitted_model#  s    r{   rO   r0   r_   ú	k-means++c                 C   s   t S ©N©r!   ©r<   Úkr"   rC   rC   rD   Ú<lambda>4  ó    r�   ÚndarrayÚcallableÚ	Estimatorc                 C   s4   t |tƒrdnd}| |td|d� |¡}t|ƒ d S )NrI   r)   r   ©r0   r.   r"   r/   )Ú
isinstanceÚstrr.   r6   r{   )r…   rO   r0   r/   rg   rC   rC   rD   Útest_all_init1  s    	   ÿþr‰   c                 C   s   t S r}   r~   r   rC   rC   rD   r�   C  r‚   c                 C   sF   t | tƒrdnd}t| td|d�}tdƒD ]}| t¡ q*t|ƒ d S )NrI   r)   r   r†   r   )r‡   rˆ   r   r.   ÚrangeÚpartial_fitr<   r{   )r0   r/   rg   ÚirC   rC   rD   Ú&test_minibatch_kmeans_partial_fit_initA  s       ÿr�   c                 C   s`   t  t¡}t  t¡}| ttd|d� t¡}| t|d|d� |¡}t|j|jƒ t|j	|j	ƒ d S )Nr)   ©r.   r0   r/   r"   )
r4   Úasfortranarrayr<   r!   r.   r6   r   r9   r   r7   )r…   rb   Ú	X_fortranÚcenters_fortranZkm_cZkm_frC   rC   rD   Útest_fortran_aligned_dataR  s(    

   ÿþüûr’   c                  C   s8   t tddd�} tj}tƒ t_z|  t¡ W 5 |t_X d S )Nr   r)   )r.   r"   Úverbose)r   r.   ÚsysÚstdoutr   r6   r<   )rg   Z
old_stdoutrC   rC   rD   Útest_minibatch_kmeans_verbosee  s    r–   c              	   C   sŽ   t j d¡jdd�}t| tddd|dd� |¡ | ¡ }t 	d|j
¡sJt‚t 	d	|j
¡s\t‚|dkrxt 	d
|j
¡sŠt‚nt 	d|j
¡sŠt‚d S )Nr   rX   rY   r   r_   r)   )r1   r.   r"   r0   r/   rW   r“   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r4   r_   r`   rV   r   r.   r6   Ú
readouterrÚreÚsearchÚoutr;   )r1   rW   Úcapsysr<   ÚcapturedrC   rC   rD   Útest_kmeans_verbosep  s$    ùø
r�   c                	   C   s0   t jtdd�� tddd� t¡ W 5 Q R X d S )Nz,init_size.* should be larger than n_clustersrl   rI   é   )Ú	init_sizer.   )ra   rn   ÚRuntimeWarningr   r6   r<   rC   rC   rC   rD   Ú'test_minibatch_kmeans_warning_init_size‹  s
     ÿr¡   c              	   C   s2   t jtdd�� | ttdd� t¡ W 5 Q R X d S )NzAExplicit initial center position passed: performing only one initrl   rI   ©r0   r.   r/   )ra   rn   r    r!   r.   r6   r<   )r…   rC   rC   rD   Ú'test_warning_n_init_precomputed_centers“  s
    þr£   c                 C   sÌ   t dd| d�\}}d|d d d…d d …f< tdd| dd	� |¡}|jjd
d� ¡ dksXt‚tdd| dd	� |¡}|jjd
d� ¡ dksˆt‚td| dd�}tdƒD ]}| |¡ qž|jjd
d� ¡ dksÈt‚d S )Nr   r\   )r    r!   r"   r   r,   rž   rI   r_   )r.   Ú
batch_sizer"   r0   r)   ©ZaxiséÈ   )r.   r"   r0   )	r   r   r6   r9   ÚanyÚsumr;   rŠ   r‹   )rb   Zzeroed_Xrz   rg   rŒ   rC   rC   rD   Ú test_minibatch_sensible_reassignž  s8      ÿ
   ÿþ   ÿþr©   c              
   C   sÖ   t  ttf¡}ttƒD ]}tt|k jdd�||< qt  t	¡}t  
|¡}t| ||dƒd  }t| |||t  t¡t j |¡ddd� t| ||dƒd  }||ks¢t‚t| |||t  t¡t j |¡ddd� t||ƒ d S )Nr   r¥   r)   T)rr   Zreassignment_ratiogVçž¯Ò<)r4   Úemptyr.   rx   rŠ   r<   rz   ÚmeanrL   r    Z
empty_liker   r   rM   r_   r`   r;   r   )rO   rb   Zperfect_centersrŒ   r3   rR   Zscore_beforeZscore_afterrC   rC   rD   Útest_minibatch_reassign¼  s:    


ø
ør¬   c                   C   s   t ddtddd� t¡ d S )Nr   rI   r   T)r.   r¤   rŸ   r"   r“   )r   r    r6   r<   rC   rC   rC   rD   Ú&test_minibatch_with_many_reassignmentsë  s    ûúr­   c                  C   sp   t dddd� t¡} | jdks"t‚t dddd� t¡} | jdksDt‚t dddtd d� t¡} | jtkslt‚d S )NrI   r\   r)   )r.   r¤   r/   é   é   )r.   r¤   r/   rŸ   )r   r6   r<   Z
_init_sizer;   r    ©rg   rC   rC   rD   Útest_minibatch_kmeans_init_sizeù  s       ÿþr±   ztol, max_no_improvement)ç-Cëâ6?N)r   rI   c                 C   sŒ   t dddd�\}}}td|d|dddd|d�	}| |¡ d|j  k rNdk sTn t‚|  ¡ }|d krrd	|jksrt‚|dkrˆd
|jksˆt‚d S )Nr+   r   T)r!   r"   Zreturn_centersrž   rI   r)   )	r.   r0   r¤   rW   r"   rf   r/   r“   Úmax_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   r6   r:   r;   r—   rš   )r›   rW   r³   r<   rd   r!   rg   rœ   rC   rC   rD   Ú#test_minibatch_declared_convergence  s&    ÷
r´   c                  C   s¢   d} t jd }td| dd� t ¡}|jt |j|  | ¡ks@t‚t	|jt
ƒsPt‚td| ddd dd� t ¡}|jdksxt‚|jd| |  ksŽt‚t	|jt
ƒsžt‚d S )Nr¯   r   r+   )r.   r¤   r"   rI   )r.   r¤   r"   rW   r³   rf   )r<   rs   r   r6   r:   r4   ÚceilZn_steps_r;   r‡   Úint)r¤   r    rg   rC   rC   rD   Útest_minibatch_iter_steps'  s$    
úù	r·   c                  C   s6   t  ¡ } tdtdd�}| | ¡ t|ƒ t| t ƒ d S )NFr   )Zcopy_xr.   r"   )r<   rt   r   r.   r6   r{   r   )Zmy_Xrg   rC   rC   rD   Útest_kmeans_copyx@  s
    
r¸   c                 C   s`   t j |¡ dd¡}| d|dd�}| |¡ |¡}| d|dd�}| |¡ |¡}||ks\t‚d S )Nr   rI   r)   )r/   r"   rf   )r4   r_   r`   Úrandnr6   Zscorer;   )r…   rb   r<   Úkm1Ús1Úkm2Ús2rC   rC   rD   Útest_score_max_iterK  s    r¾   zEstimator, algorithmrf   r,   c                 C   sž   t ddd|d�\}}|||d�}| ddd||d�}|d k	rF|j|d� | |¡ |j}	| |¡}
t|
|	ƒ | |¡}
t|
|	ƒ | |j¡}
t|
t 	d¡ƒ d S )Nr¦   rI   ©r    rx   r!   r"   r*   r_   )r.   r0   r/   rf   r"   rk   )
r   Ú
set_paramsr6   r7   Úpredictr   Úfit_predictr9   r4   Zarange)r…   r1   r#   rf   Zglobal_dtyperb   r<   rd   rg   rS   ÚpredrC   rC   rD   Útest_kmeans_predictX  s0       ÿ
û




rÄ   c                 C   sl   t j |¡ tf¡}| t|dd�}|jt|d� | t|dd�}|jt|d� t	|j
|j
ƒ t|j|jƒ d S ©Nr)   ©r.   r"   r/   r2   )r4   r_   r`   Zrandom_sampler    r.   r6   r<   ru   r   r7   r   r9   )r…   rb   r3   Zkm_denseZ	km_sparserC   rC   rD   Útest_dense_sparseƒ  s"    ÿ  ÿ  ÿrÇ   c                 C   s^   t |tƒrdnd}| t||dd�}| t¡ t| t¡|jƒ | t¡ t| t¡|jƒ d S )NrI   r)   r   rŽ   )	r‡   rˆ   r.   r6   ru   r   rÁ   r<   r7   )r…   r0   r/   rg   rC   rC   rD   Útest_predict_dense_sparse–  s    

rÈ   c           
   	   C   sð   t  ddgddgddgddgddgddgg¡}|||d	�}|d
krFdnd}|d
kr^|d d… n|}| d|||d�}| tkr†|jdd� | |¡ |jjt jks¢t‚ddddddg}	t	t
|j|	ƒdƒ | tkrìt|ƒ |¡}|jjt jksìt‚d S )Nr   rI   é   rH   rG   r)   r,   rJ   r*   rƒ   rŽ   )r¤   r   )r4   r5   r   rÀ   r6   r9   r'   Úfloat64r;   r   r   r7   r   r‹   )
r…   r#   r'   r0   rb   ÚX_denser<   r/   rg   r>   rC   rC   rD   Útest_integer_input§  s&    .   ÿ
rÌ   c                 C   sb   | t |d� t¡}| |j¡}t|t|jƒƒ t| ¡ t	 
t ¡ƒ | t¡}t|tt|jƒƒ d S )N©r.   r"   )r.   r6   r<   Ú	transformr9   r   r	   r   Zdiagonalr4   rM   )r…   rb   rg   ÚXtrC   rC   rD   Útest_transformÉ  s    
rÐ   c                 C   s8   | |dd�  t¡ t¡}| |dd� t¡}t||ƒ d S )Nr)   )r"   r/   )r6   r<   rÎ   Zfit_transformr   )r…   rb   ZX1ZX2rC   rC   rD   Útest_fit_transformÛ  s    rÑ   c                 C   s:   t j}dD ]*}ttd|| dd� t¡}|j|ks
t‚q
d S )N)r)   r\   rI   r_   r)   )r.   r0   r/   r"   rf   )r4   Úinfr   r.   r6   r<   r8   r;   )rb   Zprevious_inertiar/   rg   rC   rC   rD   Útest_n_initã  s    ûúrÓ   c                 C   s`   t ttd | d�\}}}|jttfks(t‚t |¡jd tks@t‚tt	t
|ƒdƒ |dks\t‚d S )N)r.   r3   r"   r   r   r   )r   r<   r.   rs   rx   r;   r4   ry   r   r   rz   )rb   Zcluster_centersrS   ÚinertiarC   rC   rD   Útest_k_means_functionó  s       ÿrÕ   c           
      C   s0  | d|d�}i }i }i }i }t jt jfD ]‚}|j|dd�}	| |	¡ |j||< | |	¡||< |j||< |j||< |jj	|ks€t
‚| tkr(| |	dd… ¡ |jj	|ks(t
‚q(t|t j |t j dd� t|t j |t j |t j  ¡ d d	� t|t j |t j |t j  ¡ d d	� t|t j |t j ƒ d S )
Nr)   )r/   r"   F©rt   r   r+   r²   ©Úrtol)Zatol)r4   rÊ   Úfloat32Úastyper6   r8   rÎ   r9   r7   r'   r;   r   r‹   r   Úmaxr   )
r…   rO   rb   rg   rÔ   rÏ   r!   rS   r'   r<   rC   rC   rD   Útest_float_precision  s0    



(  ÿrÜ   c                 C   sJ   t j|dd�}tj|dd�}| |tdd�}| |¡ t |j|¡rFt‚d S )NFrÖ   r)   r¢   )	r<   rÚ   r!   r.   r6   r4   Zmay_share_memoryr9   r;   )r…   r'   Z
X_new_typeZcenters_new_typerg   rC   rC   rD   Útest_centers_not_mutated'  s
    
rÝ   c                 C   s8   t td� | ¡}t t|jdd� | ¡}t|j|jƒ d S )N)r.   r)   ©r.   r0   r/   )r   r.   r6   r9   r   )rO   rº   r¼   rC   rC   rD   Útest_kmeans_init_fitted_centers6  s    rß   c              	   C   st   t  ddgddgddgddgg¡}td| d�}d}tjt|d��* | |¡ t|jƒtt	dƒƒksft
‚W 5 Q R X d S )Nr   r)   é   rÍ   zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.rl   r+   )r4   Úasarrayr   ra   rn   r   r6   Úsetr7   rŠ   r;   )rb   r<   rg   ÚmsgrC   rC   rD   Ú1test_kmeans_warns_less_centers_than_unique_points@  s    "ÿ
rä   c                 C   s   t j| dd�S ©Nr   r¥   )r4   Úsortr~   rC   rC   rD   Ú_sort_centersQ  s    rç   c                 C   sš   t j | ¡jddtd�}t jt|dd�}ttdt	| d�}t
|ƒjt|d�}t  |j|¡}t
|ƒ |¡}t|j|ƒ t|j|jƒ tt|jƒt|jƒƒ d S )Nr)   r\   rY   r   r¥   )r0   r/   r.   r"   r2   )r4   r_   r`   Úrandintr    Úrepeatr<   r   r!   r.   r   r6   r7   r   r   r8   rç   r9   )rb   r3   ZX_repeatrg   Zkm_weightedZrepeated_labelsZkm_repeatedrC   rC   rD   Útest_weighted_vs_repeatedU  s*      ÿ   ÿþrê   c                 C   s\   t  t¡}| t|dd�}t|ƒj|d d�}t|ƒj||d�}t|j|jƒ t|j	|j	ƒ d S rÅ   )
r4   rL   r    r.   r   r6   r   r7   r   r9   )r…   rO   rb   r3   rg   Zkm_noneZkm_onesrC   rC   rD   Útest_unit_weights_vs_no_weightso  s    
rë   c                 C   sj   t j |¡jtd�}| t|dd�}t|ƒj||d�}t|ƒj|d| d�}t|j	|j	ƒ t
|j|jƒ d S )NrY   r)   rÆ   r2   r(   )r4   r_   r`   Úuniformr    r.   r   r6   r   r7   r   r9   )r…   rO   rb   r3   rg   Zkm_origZ	km_scaledrC   rC   rD   Útest_scaled_weights~  s    rí   c                  C   s$   t ddd� t¡} | jdks t‚d S )Nr&   r)   )r1   rf   )r   r6   r<   r:   r;   r°   rC   rC   rD   Ú test_kmeans_elkan_iter_attribute�  s    rî   c                 C   st   | dgdggƒ}ddg}t  dgdgg¡}td|dd�}|j||d� tt|jƒƒdks\t‚t|j	dgdggƒ d S )	NrG   r)   gffffffþ?gš™™™™™¹?rI   r,   rÞ   r2   )
r4   r5   r   r6   Úlenrâ   r7   r;   r   r9   )r#   r<   r3   r0   rg   rC   rC   rD   Ú#test_kmeans_empty_cluster_relocated”  s    rð   c              	   C   s~   t j |¡}|jdd�}tddd�� | t|d� |¡j}W 5 Q R X tddd�� | t|d� |¡j}W 5 Q R X t||ƒ d S )N)é2   rI   rY   r)   Zopenmp)ZlimitsZuser_apirÍ   r,   )	r4   r_   r`   rV   r   r.   r6   r7   r   )r…   rb   rc   r<   Zresult_1Zresult_2rC   rC   rD   Ú#test_result_equal_in_diff_n_threads¥  s    ÿÿÿÿrò   c                	   C   s0   t jtdd�� tddd� t¡ W 5 Q R X d S )Nz9algorithm='elkan' doesn't make sense for a single clusterrl   r)   r&   )r.   r1   )ra   rn   r    r   r6   r<   rC   rC   rC   rD   Útest_warning_elkan_1_cluster»  s
    þró   c                 C   sz   t j |¡jdd�}|d d… }| |ƒ}dd„ }|||ƒ\}}tdd||dd� |¡}|j}	|j}
t||	ƒ t	||
ƒ d S )N)r   r\   rY   r\   c                 S   sP   |  ¡ }t| |ƒ}t|jd ƒD ]}| ||k jdd�||< q t| |ƒ}||fS rå   )rt   r
   rŠ   rs   r«   )r<   r0   Znew_centersrS   ÚlabelrC   rC   rD   Ú	py_kmeansÏ  s    

z+test_k_means_1_iteration.<locals>.py_kmeansr)   )r.   r/   r0   r1   rf   )
r4   r_   r`   rì   r   r6   r7   r9   r   r   )r#   r$   rb   r<   r=   rõ   Z	py_labelsZ
py_centersZ	cy_kmeansZ	cy_labelsZ
cy_centersrC   rC   rD   Útest_k_means_1_iterationÄ  s$        ÿþ
rö   ÚsquaredTFc                 C   sÒ   t j |¡}tjdddd|| d�}| ¡  d¡}| d¡j| dd�}|d	  ¡ }|| d	  ¡ }|rh|nt  	|¡}t
|||ƒ}	t|j|j|||ƒ}
| t jkr d
nd}t|	|
|d� t|	||d� t|
||d� d S )Nr)   r   r(   Úcsr©ZdensityÚformatr"   r'   rG   FrÖ   r,   r²   gH¯¼šò×z>r×   )r4   r_   r`   ÚspÚtoarrayrK   r¹   rÚ   r¨   Úsqrtr   r   rO   rP   rÙ   r   )r'   r÷   rb   rv   Za_sparseZa_denseÚbZb_squared_normÚexpectedZdistance_dense_denseZdistance_sparse_denserØ   rC   rC   rD   Útest_euclidean_distanceã  s4         ÿ    ÿr   c                 C   s|  t j |¡}tjdddd|| d�}| ¡ }| d¡j| dd�}| dd¡j| dd�}|jddt jd	�}|||  d
 j	dd�}t  	|| ¡}	t
||||dd�}
t||||dd�}| t jkr¾dnd}t|
||d� t|
|	|d� t||	|d� d}||k}|| ||  d
 j	dd�}t  	|||  ¡}	t
||||d|d�}
t||||d|d�}t|
||d� t|
|	|d� t||	|d� d S )Nr   rI   r(   rø   rù   FrÖ   r\   )rZ   r'   r,   r)   r¥   )Ú	n_threadsr²   r]   r×   )r  Zsingle_label)r4   r_   r`   rû   rü   r¹   rÚ   rè   rN   r¨   r   r   rÙ   r   )r'   rb   rv   ZX_sparserË   r3   r!   rS   Z	distancesrÿ   Zinertia_denseZinertia_sparserØ   rô   ÚmaskrC   rC   rD   Útest_inertiaþ  sd         ÿ    ÿ     ÿ     ÿr  zKlass, default_n_initrI   r+   c              	   C   s€   | dd�}t  ¡ � t  dt¡ | t¡ W 5 Q R X | jdkrBdnd}d|› d�}| ƒ }tjt|d	�� | t¡ W 5 Q R X d S )
Nr)   ©r/   Úerrorr   rI   r+   z/The default value of `n_init` will change from z to 'auto' in 1.4rl   )	ÚwarningsÚcatch_warningsÚsimplefilterro   r6   r<   Ú__name__ra   rn   )ÚKlassÚdefault_n_initÚestrã   rC   rC   rD   Ú!test_change_n_init_future_warning*  s    


ÿr  c                 C   s\   | ddd�}|  t¡ |jdks$t‚| ddd�}|  t¡ | jdkrP|jdksXndsXt‚d S )	Nri   r|   )r/   r0   r)   r_   r   rI   r+   )r6   r<   Z_n_initr;   r	  )r
  r  r  rC   rC   rD   Útest_n_init_auto;  s    

r  c                 C   sV   t  dgdgdgg¡}t  dddg¡}| ddd�j||d	� t|t  dddg¡ƒ d S )
Nr)   r,   rà   r(   gš™™™™™É?g333333Ó?r   rÍ   r2   )r4   r5   r6   r   )r…   r<   r3   rC   rC   rD   Útest_sample_weight_unchangedF  s    r  zparam, matchr.   r)   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                 C   s   | d d… S )Nr,   rC   ©ZX_r€   r"   rC   rC   rD   r�   [  r‚   rJ   zUThe shape of the initial centers .* does not match the number of features of the datac                 C   s   | d d…d d…f S )NrJ   r,   rC   r  rC   rC   rD   r�   e  r‚   c              	   C   s:   | dd�}t jt|d�� |jf |Ž t¡ W 5 Q R X d S )Nr)   r  rl   )ra   ÚraisesÚ
ValueErrorrÀ   r6   r<   )r…   Úparamrm   rg   rC   rC   rD   Útest_wrong_paramsP  s    
r  Úx_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc              	   C   s,   t jt|d�� tttf| Ž W 5 Q R X d S )Nrl   )ra   r  r  r   r<   r.   )r  rm   rC   rC   rD   Ú!test_kmeans_plusplus_wrong_paramst  s    r  c                 C   s¾   |   |¡} t| t|d�\}}|jd tks.t‚|dk ¡ s>t‚|| jd k ¡ sTt‚|jd tksft‚|jdd�| jdd�k ¡ s†t‚|jdd�| jdd�k ¡ s¦t‚tt	|   |¡|ƒ d S )Nr[   r   r¥   )
rÚ   r   r.   rs   r;   ÚallrÛ   Úminr   r<   )rO   r'   rb   r!   rP   rC   rC   rD   Útest_kmeans_plusplus_outputƒ  s    
  ÿ
  r  )r÷   c                 C   s$   t tt| d�\}}tt| |ƒ d S )N)r  )r   r<   r.   r   )r  r!   rP   rC   rC   rD   Útest_kmeans_plusplus_norms�  s    r  c                 C   s<   t tt| d�\}}t t¡}t |t| d�\}}t||ƒ d S )Nr[   )r   r<   r.   r4   r�   r   )rb   Z	centers_crd   r�   r‘   rC   rC   rD   Útest_kmeans_plusplus_dataorder¥  s    
  ÿ
r  c               	   C   s”   t jddddddddgt jd�} t| | dƒs0t‚t jddddddddgt jd�}t| |dƒs`t‚t jddddddddgt jd�}t| |dƒr�t‚d S )Nr)   r   r,   r*   r+   )r4   r5   rN   r   r;   )Zlabels1Zlabels2Zlabels3rC   rC   rD   Útest_is_same_clustering²  s       r  Úkwargs)r0   r/   c                 C   sH   t jddgddgddgddggt jd�}tf ddi| —Ž}| |¡ dS )zZCheck that init works with numpy scalar strings.

    Non-regression test for #21964.
    r   r(   r)   r*   r.   r,   N)r4   rá   rÊ   r   r6   )r  r<   Z
clusteringrC   rC   rD   Ú-test_kmeans_with_array_like_or_np_scalar_initÂ  s    (r  zKlass, methodr6   r‹   c                    sR   | j  ¡ ‰ | ƒ }t||ƒtƒ |jjd }| ¡ }t‡ fdd„t|ƒD ƒ|ƒ dS )z=Check `feature_names_out` for `KMeans` and `MiniBatchKMeans`.r   c                    s   g | ]}ˆ › |› �‘qS rC   rC   )Ú.0rŒ   ©Ú
class_namerC   rD   Ú
<listcomp>Ý  s     z*test_feature_names_out.<locals>.<listcomp>N)	r	  ÚlowerÚgetattrr<   r9   rs   Zget_feature_names_outr   rŠ   )r
  ÚmethodrB   r.   Z	names_outrC   r   rD   Útest_feature_names_outÑ  s    
r&  Ú	is_sparsec                 C   sb   t ddddd�\}}| r"t |¡}tƒ }| |¡}t|jƒ|_t|jƒ|_| |¡}t	||ƒ dS )z_Check that predict does not change cluster centers.

    Non-regression test for gh-24253.
    r¦   rI   r   r¿   N)
r   rû   Ú
csr_matrixr   rÂ   r   r9   r7   rÁ   r   )r'  r<   rd   rB   Zy_pred1Zy_pred2rC   rC   rD   Ú,test_predict_does_not_change_cluster_centersà  s    


r)  )}Ú__doc__r˜   r”   r  Únumpyr4   Zscipyr   rû   ra   Zsklearn.utils._testingr   r   Zsklearn.utils.fixesr   Zsklearn.baser   Zsklearn.exceptionsr   Zsklearn.utils.extmathr   Zsklearn.metricsr	   r
   Zsklearn.metrics.clusterr   Zsklearn.clusterr   r   r   r   Zsklearn.cluster._kmeansr   r   Zsklearn.cluster._k_means_commonr   r   r   r   r   r   r   r   Zsklearn.datasetsr   Úior   rã   ÚmarkÚfilterwarningsZ
pytestmarkr5   r!   r    rs   r.   rx   r<   rz   r(  ru   ZparametrizerÙ   rÊ   rE   rF   rT   re   rh   rq   rw   r{   r‰   r�   r’   r–   r�   r¡   r£   r©   r¬   r­   r±   r´   r·   r¸   r¾   rÄ   rÇ   rÈ   rN   Zint64rÌ   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  Zstr_r  r&  r)  rC   rC   rC   rD   Ú<module>   sä  ÿýÿ
   ÿ

 
 ÿ 
 ÿ 
 ÿ
) 
 ÿ

?
ý	
ý




.

 
 ÿþ#
  ÿ 
 ÿ

$
	 
 ÿ

	 
 ÿ
+



	þ
þþ
þïþ	þÿþ


 "ÿ
þ
