U
    _»{jÈ¾  ã                   @   sÄ	  d 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Zddl	m
Z ddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZ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( ddl)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 dZ1ej2 3de1 ¡Z4e 5dddddgdddddgdddddgg¡Z6dZ7e6j8\Z9Z:ee7e6ddd�\Z;Z<e =e;¡Z>ej2j?dej5ej=gddgd�ej2 ?ddd g¡ej2 ?d!ej@ejAg¡d"d#„ ƒƒƒZBej2j?dej5ej=gddgd�ej2 ?ddd g¡d$d%„ ƒƒZCej2j?dej5ej=gddgd�d&d'„ ƒZDej2 ?d(d)d*g¡ej2j?dej5ej=gddgd�ej2 ?d+d,d-d.dg¡d/d0„ ƒƒƒZEej2 ?d1dd g¡d2d3„ ƒZFej2 ?d1d4d5g¡d6d7„ ƒZGej2 ?d8eeg¡d9d:„ ƒZHd;d<„ ZId=d>„ ZJej2j?d?e;e>gddgd�ej2j?d@dAdBe6dCdD„ gdAdBdEdFgd�ej2 ?d8eeg¡dGdH„ ƒƒƒZKej2j?d@dAdBe6dIdD„ gdAdBdEdFgd�dJdK„ ƒZLej2 ?dLdMdNdOdD„ dPfdQg¡ej2 ?d8eeg¡dRdS„ ƒƒZMej2 ?d8eeg¡dTdU„ ƒZNdVdW„ ZOej2 ?d1dd g¡ej2 ?d+d,dg¡dXdY„ ƒƒZPdZd[„ ZQej2 ?d8eeg¡d\d]„ ƒZRd^d_„ ZSej2j?d?e;e>gddgd�d`da„ ƒZTdbdc„ ZUddde„ ZVej2 ?dfdgdhg¡didj„ ƒZWdkdl„ ZXdmdn„ ZYej2 ?d8eeg¡dodp„ ƒZZej2j?dej5ej=gddgd�ej2 ?dqedfed fedfg¡ej2 ?drdsdg¡dtdu„ ƒƒƒZ[ej2 ?d8eeg¡dvdw„ ƒZ\ej2j?d@dAdBe6gdAdBdEgd�ej2 ?d8eeg¡dxdy„ ƒƒZ]ej2j?dej5ej=gddgd�ej2 ?d!ej^ej_g¡ej2 ?d@dBdEg¡ej2 ?d8eeg¡dzd{„ ƒƒƒƒZ`ej2 ?d8eeg¡d|d}„ ƒZaej2 ?d8eeg¡d~d„ ƒZbd€d�„ Zcd‚dƒ„ Zdej2j?d?e;e>gddgd�ej2 ?d8eeg¡d„d…„ ƒƒZeej2 ?d!ej^ej_ej@ejAg¡ej2 ?d8eeg¡d†d‡„ ƒƒZfej2j?d?e;e>gddgd�dˆd‰„ ƒZgdŠd‹„ ZhdŒd�„ ZidŽd�„ Zjej2j?d?e;e>gddgd�ej2 ?d8eeg¡d�d‘„ ƒƒZkej2j?d?e;e>gddgd�ej2 ?d8eeg¡d’d“„ ƒƒZld”d•„ Zmej2j?dej5ej=gddgd�d–d—„ ƒZnej2 ?d8eeg¡d˜d™„ ƒZodšd›„ Zpej2j?dej5ej=gddgd�ej2 ?ddd g¡dœd�„ ƒƒZqej2 ?d!ej@ejAg¡ej2 ?dždŸd g¡d¡d¢„ ƒƒZrej2 ?d!ej@ejAg¡d£d¤„ ƒZsej2 ?d¥ed¦fed§fg¡d¨d©„ ƒZtej2 ?d¥ed¦fed§fg¡dªd«„ ƒZuej2 ?d8eeg¡d¬d­„ ƒZvej2 ?d8eeg¡ej2 ?d®d¯e7d° id±fd@e;dds… id²fd@d³dD„ id²fd@e;dd´…dds…f idµfd@d¶dD„ idµfg¡d·d¸„ ƒƒZwej2 ?d®d¹e;dds… idºfg¡d»d¼„ ƒZxej2 ?d?e;e>g¡ej2 ?d!ejAej@g¡d½d¾„ ƒƒZyej2 ?d¹e.e;dŸd¿�dg¡dÀdÁ„ ƒZzdÂdÃ„ Z{dÄdÅ„ Z|ej2 ?dÆd@e }dB¡iddgd°d°ggd°dÇœf¡dÈdÉ„ ƒZ~ej2 ?dÊedËfedËfedÌfg¡dÍdÎ„ ƒZej2 ?dÏdŸd g¡dÐdÑ„ ƒZ€ej2 ?d@dBdAg¡dÒdÓ„ ƒZ�ej2 ?d@dBdAg¡dÔdÕ„ ƒZ‚dS )ÖzTesting for K-meansé    N)ÚStringIO)Úsparse)Úclone)ÚKMeansÚMiniBatchKMeansÚk_meansÚkmeans_plusplus)Ú_euclidean_dense_dense_wrapperÚ_euclidean_sparse_dense_wrapperÚ_inertia_denseÚ_inertia_sparseÚ_is_same_clusteringÚ_relocate_empty_clusters_denseÚ_relocate_empty_clusters_sparse)Ú_labels_inertiaÚ_mini_batch_step)Ú
make_blobs)ÚConvergenceWarning)Úpairwise_distancesÚpairwise_distances_argmin)Úv_measure_score)Úeuclidean_distances)Úassert_allcloseÚassert_array_equalÚcreate_memmap_backed_data)Ú	row_norms)Úthreadpool_limitsz�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(   ÚXr4   Úinit_centersÚexpected_labelsÚexpected_inertiaÚexpected_centersÚexpected_n_iterÚkmeans© rD   úa/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.pyÚtest_kmeans_results;   s    $rF   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   )r5   r6   r   r7   r   r9   r;   r<   r   r8   r:   )	r$   r%   r=   r>   rC   rB   r@   r?   rA   rD   rD   rE   Útest_kmeans_relocated_clustersU   s$     
rG   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Üÿÿÿ)r5   r6   ÚreshapeÚonesÚzerosÚint32r   r   ÚdataÚindicesZindptrr   r   )r$   r=   r4   Úcenters_oldÚcenters_newZweight_in_clustersÚlabelsrD   rD   rE   Útest_relocate_empty_clustersv   s8    &

     ÿørU   Ú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 )NrW   ©iˆ  rJ   ©Úsize©r#   r   é   r*   )r/   r#   r0   rX   r'   )r2   r/   r#   r0   rX   ç�íµ ÷Æ°>)Úrel)r5   ÚrandomÚRandomStaterW   r   r   r7   r   r:   r   r8   r;   r<   r9   ÚpytestZapprox)	rV   r$   rX   Úglobal_random_seedÚrndr=   Ú_Zkm_lloydZkm_elkanrD   rD   rE   Útest_kmeans_elkan_results¢   s(    û

rf   r2   c                 C   sH   t j |¡}|jdd�}d}t| d|dd|d� |¡}|j|k sDt‚d S )NrY   rZ   i,  r]   r*   r   )r2   r/   r#   r0   rX   Úmax_iter)r5   r`   ra   rW   r   r7   r;   r<   )r2   rc   rd   r=   rg   ÚkmrD   rD   rE   Útest_kmeans_convergenceÂ   s    úù	ri   Ú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-   ©r2   zalgorithm='zB' is deprecated, it will be removed in 1.3. Using 'lloyd' instead.©Úmatchr&   )
r5   r`   Úrandr   rb   ÚwarnsÚFutureWarningr7   Ú
_algorithmr<   )r2   r=   rC   rD   rD   rE   Ú,test_algorithm_auto_full_deprecation_warningÕ   s    

ý
rs   Ú	Estimatorc              	   C   s`   t j dd¡}t jjdd�}| ƒ }|j||d� d}tjt|d�� |j||d� W 5 Q R X d S )Nr   r-   rZ   r3   zI'sample_weight' was deprecated in version 1.3 and will be removed in 1.5.rm   )	r5   r`   ro   Úuniformr7   rb   rp   rq   Úpredict)rt   r=   r4   rC   Zwarn_msgrD   rD   rE   Ú.test_predict_sample_weight_deprecation_warningä   s    ÿrw   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 )NrZ   r   r+   rJ   F)Úrandom_reassignr   )r5   r`   ra   r"   rW   ÚshapeÚcopyZ
zeros_likerN   r=   r(   rM   ÚX_csrr   r<   r   r   r   )rc   ÚrngrR   Zcenters_old_csrrS   Zcenters_new_csrZweight_sumsZweight_sums_csrr4   ZX_mbZX_mb_csrZsample_weight_mbZold_inertiarT   Znew_inertiaZold_inertia_csrZ
labels_csrZnew_inertia_csrrD   rD   rE   Ú!test_minibatch_update_consistencyñ   sZ    


ù	
ù	  ÿ


r}   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   )r:   ry   r/   Ú
n_featuresr<   r8   r5   Úuniquer   r   Útrue_labelsr9   )rh   r"   rT   rD   rD   rE   Ú_check_fitted_model0  s    r�   rP   r1   r`   ú	k-means++c                 C   s   t S ©N©r"   ©r=   Úkr#   rD   rD   rE   Ú<lambda>A  ó    r‡   ÚndarrayÚcallablec                 C   s4   t |tƒrdnd}| |td|d� |¡}t|ƒ d S )NrJ   r*   r    ©r1   r/   r#   r0   )Ú
isinstanceÚstrr/   r7   r�   )rt   rP   r1   r0   rh   rD   rD   rE   Útest_all_init>  s    	   ÿþrŽ   c                 C   s   t S rƒ   r„   r…   rD   rD   rE   r‡   P  rˆ   c                 C   sF   t | tƒrdnd}t| td|d�}tdƒD ]}| t¡ q*t|ƒ d S )NrJ   r*   r   r‹   r   )rŒ   r�   r   r/   ÚrangeÚpartial_fitr=   r�   )r1   r0   rh   ÚirD   rD   rE   Ú&test_minibatch_kmeans_partial_fit_initN  s       ÿr’   zinit, expected_n_init)r‚   r*   )r`   Údefaultc                 C   s   |j || jd fd�S )Nr*   rZ   )ru   ry   )r=   r/   r#   rD   rD   rE   r‡   e  s   ÿr“   )ú
array-liker*   c                 C   sl   d\}}}t j ||¡}|dkr.t j ||¡}|dkrF| tkrBdnd}| ||dd� |¡}|j|ksht‚dS )	z¬Check that `n_init="auto"` chooses the right number of initializations.
    Non-regression test for #26657:
    https://github.com/scikit-learn/scikit-learn/pull/26657
    )r   rJ   r]   r”   r“   r,   rJ   rj   ©r/   r1   r0   N)r5   r`   Úrandnr   r7   Ú_n_initr<   )rt   r1   Zexpected_n_initZn_sampler~   r/   r=   rC   rD   rD   rE   Ú,test_kmeans_init_auto_with_initial_centroids_  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/   r1   r0   r#   )
r5   Úasfortranarrayr=   r"   r/   r7   r   r:   r   r8   )rt   rc   Ú	X_fortranÚcenters_fortranZkm_cZkm_frD   rD   rE   Útest_fortran_aligned_data~  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   r7   r=   )rh   Z
old_stdoutrD   rD   rE   Útest_minibatch_kmeans_verbose‘  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   rY   rZ   r    r`   r*   )r2   r/   r#   r1   r0   rX   rž   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r5   r`   ra   rW   r   r/   r7   Ú
readouterrÚreÚsearchÚoutr<   )r2   rX   Úcapsysr=   ÚcapturedrD   rD   rE   Útest_kmeans_verboseœ  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_clustersrm   rJ   é   )Ú	init_sizer/   )rb   rp   ÚRuntimeWarningr   r7   r=   rD   rD   rD   rE   Ú'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 initrm   rJ   ©r1   r/   r0   )rb   rp   r«   r"   r/   r7   r=   )rt   rD   rD   rE   Ú'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©   rJ   r`   )r/   Ú
batch_sizer#   r1   r*   ©ZaxiséÈ   )r/   r#   r1   )	r   r   r7   r:   ÚanyÚsumr<   r�   r�   )rc   Zzeroed_Xr€   rh   r‘   rD   rD   rE   Ú 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)rx   Zreassignment_ratiogVçž¯Ò<)r5   Úemptyr/   r~   r�   r=   r€   ÚmeanrM   r!   Z
empty_liker   r   rN   r`   ra   r<   r   )rP   rc   Zperfect_centersr‘   r4   rS   Zscore_beforeZscore_afterrD   rD   rE   Útest_minibatch_reassignè  s:    


ø
ør·   c                   C   s   t ddtddd� t¡ d S )Nr   rJ   r    T)r/   r¯   rª   r#   rž   )r   r!   r7   r=   rD   rD   rD   rE   Ú&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 )NrJ   r]   r*   )r/   r¯   r0   é   é   )r/   r¯   r0   rª   )r   r7   r=   Z
_init_sizer<   r!   ©rh   rD   rD   rE   Útest_minibatch_kmeans_init_size%  s       ÿþr¼   ztol, max_no_improvement)ç-Cëâ6?N)r   rJ   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©   rJ   r*   )	r/   r1   r¯   rX   r#   rg   r0   rž   Úmax_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   r7   r;   r<   r¢   r¥   )r¦   rX   r¾   r=   re   r"   rh   r§   rD   rD   rE   Ú#test_minibatch_declared_convergence7  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#   rJ   )r/   r¯   r#   rX   r¾   rg   )r=   ry   r   r7   r;   r5   ÚceilZn_steps_r<   rŒ   Úint)r¯   r!   rh   rD   rD   rE   Útest_minibatch_iter_stepsS  s$    
úù	rÂ   c                  C   s6   t  ¡ } tdtdd�}| | ¡ t|ƒ t| t ƒ d S )NFr    )Zcopy_xr/   r#   )r=   rz   r   r/   r7   r�   r   )Zmy_Xrh   rD   rD   rE   Útest_kmeans_copyxl  s
    
rÃ   c                 C   s`   t j |¡ dd¡}| d|dd�}| |¡ |¡}| d|dd�}| |¡ |¡}||ks\t‚d S )Nr   rJ   r*   )r0   r#   rg   )r5   r`   ra   r–   r7   Zscorer<   )rt   rc   r=   Úkm1Ús1Úkm2Ús2rD   rD   rE   Útest_score_max_iterw  s    rÈ   zEstimator, algorithmrg   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±   rJ   ©r!   r~   r"   r#   r+   r`   )r/   r1   r0   rg   r#   rl   )
r   Ú
set_paramsr7   r8   rv   r   Úfit_predictr:   r5   Zarange)rt   r2   r$   rg   Zglobal_dtyperc   r=   re   rh   rT   ÚpredrD   rD   rE   Útest_kmeans_predict„  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#   r0   r3   )r5   r`   ra   Zrandom_sampler!   r/   r7   r=   r{   r   r8   r   r:   )rt   rc   r4   Zkm_denseZ	km_sparserD   rD   rE   Ú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 )NrJ   r*   r   r™   )	rŒ   r�   r/   r7   r{   r   rv   r=   r8   )rt   r1   r0   rh   rD   rD   rE   Ú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   rJ   é   rI   rH   r*   r-   rK   r+   r‰   r™   )r¯   r   )r5   r6   r   rÊ   r7   r:   r(   Úfloat64r<   r   r   r8   r   r�   )
rt   r$   r(   r1   rc   ÚX_denser=   r0   rh   r?   rD   rD   rE   Ú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/   r7   r=   Ú	transformr:   r   r   r   Zdiagonalr5   rN   )rt   rc   rh   ÚXtrD   rD   rE   Útest_transformõ  s    
rÙ   c                 C   s8   | |dd�  t¡ t¡}| |dd� t¡}t||ƒ d S )Nr*   )r#   r0   )r7   r=   r×   Zfit_transformr   )rt   rc   ZX1ZX2rD   rD   rE   Ú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]   rJ   r`   r*   )r/   r1   r0   r#   rg   )r5   Úinfr   r/   r7   r=   r9   r<   )rc   Zprevious_inertiar0   rh   rD   rD   rE   Ú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/   r4   r#   r   r   r   )r   r=   r/   ry   r~   r<   r5   r   r   r   r€   )rc   Zcluster_centersrT   ÚinertiarD   rD   rE   Ú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*   )r0   r#   F©rz   r   r,   r½   ©Úrtol)Zatol)r5   rÓ   Úfloat32Úastyper7   r9   r×   r:   r8   r(   r<   r   r�   r   Úmaxr   )
rt   rP   rc   rh   rÝ   rØ   r"   rT   r(   r=   rD   rD   rE   Ú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/   r7   r5   Zmay_share_memoryr:   r<   )rt   r(   Z
X_new_typeZcenters_new_typerh   rD   rD   rE   Útest_centers_not_mutatedS  s
    
ræ   c                 C   s8   t td� | ¡}t t|jdd� | ¡}t|j|jƒ d S )N)r/   r*   r•   )r   r/   r7   r:   r   )rP   rÄ   rÆ   rD   rD   rE   Útest_kmeans_init_fitted_centersb  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.rm   r,   )r5   Úasarrayr   rb   rp   r   r7   Úsetr8   r�   r<   )rc   r=   rh   ÚmsgrD   rD   rE   Ú1test_kmeans_warns_less_centers_than_unique_pointsl  s    "ÿ
rì   c                 C   s   t j| dd�S ©Nr   r°   )r5   Úsortr„   rD   rD   rE   Ú_sort_centers}  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]   rZ   r   r°   )r1   r0   r/   r#   r3   )r5   r`   ra   Úrandintr!   Úrepeatr=   r   r"   r/   r   r7   r8   r   r   r9   rï   r:   )rc   r4   ZX_repeatrh   Zkm_weightedZrepeated_labelsZkm_repeatedrD   rD   rE   Útest_weighted_vs_repeated�  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Î   )
r5   rM   r!   r/   r   r7   r   r8   r   r:   )rt   rP   rc   r4   rh   Zkm_noneZkm_onesrD   rD   rE   Útest_unit_weights_vs_no_weights›  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 )NrZ   r*   rÏ   r3   r)   )r5   r`   ra   ru   r!   r/   r   r7   r   r8   r   r:   )rt   rP   rc   r4   rh   Zkm_origZ	km_scaledrD   rD   rE   Útest_scaled_weightsª  s    rô   c                  C   s$   t ddd� t¡} | jdks t‚d S )Nr'   r*   )r2   rg   )r   r7   r=   r;   r<   r»   rD   rD   rE   Ú 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 )	NrH   r*   gffffffþ?gš™™™™™¹?rJ   r-   r•   r3   )
r5   r6   r   r7   Úlenrê   r8   r<   r   r:   )r$   r=   r4   r1   rh   rD   rD   rE   Ú#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   rJ   rZ   r*   Zopenmp)ZlimitsZuser_apirÖ   r-   )	r5   r`   ra   rW   r   r/   r7   r8   r   )rt   rc   rd   r=   Zresult_1Zresult_2rD   rD   rE   Ú#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 clusterrm   r*   r'   )r/   r2   )rb   rp   r«   r   r7   r=   rD   rD   rD   rE   Ú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]   rZ   r]   c                 S   sP   |  ¡ }t| |ƒ}t|jd ƒD ]}| ||k jdd�||< q t| |ƒ}||fS rí   )rz   r   r�   ry   r¶   )r=   r1   Znew_centersrT   ÚlabelrD   rD   rE   Ú	py_kmeansû  s    

z+test_k_means_1_iteration.<locals>.py_kmeansr*   )r/   r0   r1   r2   rg   )
r5   r`   ra   ru   r   r7   r8   r:   r   r   )r$   r%   rc   r=   r>   rü   Z	py_labelsZ
py_centersZ	cy_kmeansZ	cy_labelsZ
cy_centersrD   rD   rE   Ú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(   rH   Frß   r-   r½   gH¯¼šò×z>rà   )r5   r`   ra   ÚspÚtoarrayrL   r–   rã   r³   Úsqrtr	   r
   rP   rQ   râ   r   )r(   rþ   rc   r|   Za_sparseZa_denseÚbZb_squared_normÚexpectedZdistance_dense_denseZdistance_sparse_denserá   rD   rD   rE   Ú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   rJ   r)   rÿ   r   Frß   r]   )r[   r(   r-   r*   r°   )Ú	n_threadsr½   r^   rà   )r  Zsingle_label)r5   r`   ra   r  r  r–   rã   rð   rO   r³   r   r   râ   r   )r(   rc   r|   ZX_sparserÔ   r4   r"   rT   Z	distancesr  Zinertia_denseZinertia_sparserá   rû   ÚmaskrD   rD   rE   Útest_inertia*  sd         ÿ    ÿ     ÿ     ÿr
  zKlass, default_n_initrJ   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*   ©r0   Úerrorr   rJ   r,   z/The default value of `n_init` will change from z to 'auto' in 1.4rm   )	ÚwarningsÚcatch_warningsÚsimplefilterrq   r7   r=   Ú__name__rb   rp   )ÚKlassÚdefault_n_initÚestrë   rD   rD   rE   Ú!test_change_n_init_future_warningV  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 )	Nrj   r‚   )r0   r1   r*   r`   r   rJ   r,   )r7   r=   r—   r<   r  )r  r  r  rD   rD   rE   Útest_n_init_autog  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Ö   r3   )r5   r6   r7   r   )rt   r=   r4   rD   rD   rE   Útest_sample_weight_unchangedr  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-   rD   ©ZX_r†   r#   rD   rD   rE   r‡   ‡  rˆ   rK   zUThe shape of the initial centers .* does not match the number of features of the datac                 C   s   | d d…d d…f S )NrK   r-   rD   r  rD   rD   rE   r‡   ‘  rˆ   c              	   C   s:   | dd�}t jt|d�� |jf |Ž t¡ W 5 Q R X d S )Nr*   r  rm   )rb   ÚraisesÚ
ValueErrorrÊ   r7   r=   )rt   Úparamrn   rh   rD   rD   rE   Útest_wrong_params|  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 )Nrm   )rb   r  r  r   r=   r/   )r  rn   rD   rD   rE   Ú!test_kmeans_plusplus_wrong_params   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/   ry   r<   Úallrä   Úminr   r=   )rP   r(   rc   r"   rQ   rD   rD   rE   Ú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"   rQ   rD   rD   rE   Ú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/   r5   rš   r   )rc   Z	centers_cre   r›   rœ   rD   rD   rE   Ú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,   )r5   r6   rO   r   r<   )Zlabels1Zlabels2Zlabels3rD   rD   rE   Útest_is_same_clusteringÞ  s       r$  Úkwargs)r1   r0   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)r5   ré   rÓ   r   r7   )r%  r=   Z
clusteringrD   rD   rE   Ú-test_kmeans_with_array_like_or_np_scalar_initî  s    (r&  zKlass, methodr7   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 rD   rD   )Ú.0r‘   ©Ú
class_namerD   rE   Ú
<listcomp>	  s     z*test_feature_names_out.<locals>.<listcomp>N)	r  ÚlowerÚgetattrr=   r:   ry   Zget_feature_names_outr   r�   )r  ÚmethodrC   r/   Z	names_outrD   r(  rE   Ú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±   rJ   r   rÉ   N)
r   r  Ú
csr_matrixr   rË   r   r:   r8   rv   r   )r/  r=   re   rC   Zy_pred1Zy_pred2rD   rD   rE   Ú,test_predict_does_not_change_cluster_centers  s    


r1  c           	   	   C   s¬   t j |¡}tddd|d�\}}t|dd�}tƒ }|j||| |j|jd d�dt j |¡d	�}|j||| t  	|jd ¡dt j |¡d	�}t
 t¡� t||ƒ W 5 Q R X d
S )zªCheck that sample weight is used during init.

    `_init_centroids` is shared across all classes inheriting from _BaseKMeans so
    it's enough to check for KMeans.
    r±   rJ   rÉ   Tr!  r   rZ   r]   ©r=   r  r1   r4   Zn_centroidsr#   N)r5   r`   ra   r   r   r   Ú_init_centroidsru   ry   rM   rb   r  r<   r   )	r1   rc   r|   r=   re   r  rC   Úclusters_weightedZclustersrD   rD   rE   Útest_sample_weight_init   s6       ÿ

ú
úr5  c           
   	   C   sž   t j |¡}tddd|d�\}}|j|jd d�}d|ddd…< t|dd	�}tƒ }|j||| |d
t j |¡d�}t	|ddd… |ƒ}	t  
t  |	d¡¡ršt‚dS )z»Check that if sample weight is 0, this sample won't be chosen.

    `_init_centroids` is shared across all classes inheriting from _BaseKMeans so
    it's enough to check for KMeans.
    r   r]   rÉ   r   rZ   Nr-   Tr!  rJ   r2  )r5   r`   ra   r   ru   ry   r   r   r3  r   r²   Úiscloser<   )
r1   rc   r|   r=   re   r4   r  rC   r4  ÚdrD   rD   rE   Útest_sample_weight_zeroB  s*       ÿ

ú
r8  )ƒÚ__doc__r£   rŸ   r  Úior   Únumpyr5   rb   Zscipyr   r  Zsklearn.baser   Zsklearn.clusterr   r   r   r   Zsklearn.cluster._k_means_commonr	   r
   r   r   r   r   r   Zsklearn.cluster._kmeansr   r   Zsklearn.datasetsr   Zsklearn.exceptionsr   Zsklearn.metricsr   r   Zsklearn.metrics.clusterr   Zsklearn.metrics.pairwiser   Zsklearn.utils._testingr   r   r   Zsklearn.utils.extmathr   Zsklearn.utils.fixesr   rë   ÚmarkÚfilterwarningsZ
pytestmarkr6   r"   r!   ry   r/   r~   r=   r€   r0  r{   Zparametrizerâ   rÓ   rF   rG   rU   rf   ri   rs   rw   r}   r�   rŽ   r’   r˜   r�   r¡   r¨   r¬   r®   r´   r·   r¸   r¼   r¿   rÂ   rÃ   rÈ   rÍ   rÐ   rÑ   rO   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.  r1  r5  r8  rD   rD   rD   rE   Ú<module>   sô  $	ÿýÿ
   ÿ

 
 ÿ 
 ÿ 
 ÿ
) 
 ÿ


?
ý	
ý
ü÷þ


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

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

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