
    0Phr                        d 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.m/Z/ ddl0m1Z1  ej2        g dg dg dg          Z3dZ4e3j5        \  Z6Z7 ee4e3dd          \  Z8Z9d e/D             Z:ej2        ge/z   Z; e<e:          dk    rg dnddgZ=ej>        ?                    de;e=          ej>        ?                    d d!d"g          ej>        ?                    d#ej@        ejA        g          d$                                     ZBej>        ?                    de;e=          ej>        ?                    d d!d"g          d%                         ZCej>        ?                    de;e=          d&             ZDej>        ?                    d'd(d)g          ej>        ?                    de;e=          ej>        ?                    d*g d+          d,                                     ZEej>        ?                    d-d!d"g          d.             ZFej>        ?                    d/e:          d0             ZGd1 ZHej>        ?                    d2e8ge:z   e=          ej>        ?                    d3d4d5e3d6 gg d7          ej>        ?                    d8eeg          d9                                     ZIej>        ?                    d3d4d5e3d: gg d7          d;             ZJej>        ?                    d<d=d>d? d@fdAg          ej>        ?                    d8eeg          dB                         ZKej>        ?                    d8eeg          dC             ZLdD ZMej>        ?                    d-d!d"g          ej>        ?                    d*dEdg          dF                         ZNdG ZOej>        ?                    d8eeg          dH             ZPdI ZQej>        ?                    d2e8ge:z   e=          dJ             ZRdK ZSdL ZTej>        ?                    dMdNdOg          dP             ZUdQ ZVdR ZWej>        ?                    d8eeg          dS             ZXej>        ?                    de;e=          ej>        ?                    dTed!fed"fedfg          ej>        ?                    dUddg          dV                                     ZYej>        ?                    d/e:          ej>        ?                    d8eeg          dW                         ZZej>        ?                    d/e:          ej>        ?                    d3d4d5e3gg dX          ej>        ?                    d8eeg          dY                                     Z[ej>        ?                    de;e=          ej>        ?                    d#ej\        ej]        g          ej>        ?                    d3d5dZg          ej>        ?                    d8eeg          d[                                                 Z^ej>        ?                    d8eeg          d\             Z_ej>        ?                    d8eeg          d]             Z`d^ Zad_ Zbej>        ?                    d2e8ge:z   e=          ej>        ?                    d8eeg          d`                         Zcej>        ?                    d#ej\        ej]        ej@        ejA        g          ej>        ?                    d8eeg          da                         Zdej>        ?                    d2e8ge:z   e=          db             Zedc Zfdd Zgde Zhej>        ?                    d2e8ge:z   e=          ej>        ?                    d8eeg          df                         Ziej>        ?                    d2e8ge:z   e=          ej>        ?                    d8eeg          dg                         Zjdh Zkej>        ?                    de;e=          di             Zlej>        ?                    d8eeg          dj             Zmdk Znej>        ?                    de;e=          ej>        ?                    d d!d"g          dl                         Zoej>        ?                    d#ej@        ejA        g          ej>        ?                    dmdndog          dp                         Zpej>        ?                    d#ej@        ejA        g          dq             Zqej>        ?                    dredsfedtfg          du             Zrej>        ?                    d8eeg          dv             Zsej>        ?                    d8eeg          ej>        ?                    dwdxe4dyz   idzfd3e8dd         id{fd3d| id{fd3e8dd}ddf         id~fd3d id~fg          d                         Ztej>        ?                    dwde8dd         idfg          d             Zuej>        ?                    d2e8ge:z             ej>        ?                    d#ejA        ej@        g          d                         Zvej>        ?                    d e-e8dn          dg          d             Zwd Zxd Zyej>        ?                    dd3 ejz        d5          iddgdydyggdydf          d             Z{ej>        ?                    dedfedfedfg          d             Z|ej>        ?                    de/dgz             d             Z}ej>        ?                    d3d5d4g          d             Z~ej>        ?                    d3d5d4g          d             Zej>        ?                    de;e=          ej>        ?                    d-d!d"g          d                         Zd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)CSR_CONTAINERS)_get_threadpool_controller)              @r   r   r   )      ?r!   g      @r   r   )r!   r   r   r    r!   d   r!   *   )	n_samplescenterscluster_stdrandom_statec                 .    g | ]} |t                     S  )X).0	containers     b/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/cluster/tests/test_k_means.py
<listcomp>r.   2   s     ===		!===       )densesparse_matrixsparse_arrayr1   r2   array_constr)idsalgolloydelkandtypec                     | ddgddgddgddgg|          }g d}t          j        ddgddgg|          }g d}d}t          j        ddgd	dgg|          }d
}	t          d
d||          }
|
                    ||           t	          |
j        |           t          |
j        |           t          |
j        |           |
j	        |	k    sJ d S )Nr         ?   r9   )   r<   r<   r>   r   r   r<   r<   g      ?g      ?g      ?r0   
n_clustersn_initinit	algorithmsample_weight)
nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_)r4   r6   r9   r*   rF   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeanss              r-   test_kmeans_resultsrT   ;   s    	q!fsAha1a&9GGGA LLM8aVaV,E:::L"llOx%eQZ 8FFFOqNNNF
JJqJ...v~777FO%5666F+-=>>>>_,,,,,,r/   c                      | ddgddgddgddgg          }t          j        ddgddgg          }t          dd||          }|                    |           d}d}t	          |j        |           |j        |k    sJ 	 g d}ddgd	dgg}t          |j        |           t	          |j	        |           d S # t          $ r: g d
}d	dgddgg}t          |j        |           t	          |j	        |           Y d S w xY w)Nr   r;   r<   r>   r0   r@   g      ?r?   g      ?)r<   r<   r   r   r!   r   )rG   rH   r   rI   r   rK   rM   r   rJ   rL   AssertionError)	r4   r6   r*   rN   rS   rR   rP   rO   rQ   s	            r-   test_kmeans_relocated_clustersrW   S   sX    	q!fsAha1a&9::A 8c3Z!Q011LqNNNF
JJqMMMOFO%5666>_,,,,	C&,,!1Iay16>?;;;/1ABBBBB C C C&,,!3K$56>?;;;/1ABBBBBB	Cs   6B9 9A C=<C=c           
         t          j        g d                              dd          } | |          }t          j        d          }t          j        g d                              dd          }t          j        g d                              dd          }t          j        g d          }t          j        dt           j                  }| t           j        u rt          ||||||           n%t          |j        |j	        |j
        |||||           t          |g d	           t          |d
gdgdgg           d S )N)
      $g      #ig      !ir<   	         #@
   rZ   r<   r]   )rY   r^   )g     0r^   r^   )g      $@r   r   r=   )   r<   r<   ir\   )rG   rH   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r4   r*   rF   centers_oldcenters_newweight_in_clusterslabelss          r-   test_relocate_empty_clustersrk   r   s\   
 	???@@HHQOOAQAGBKKM (,,,--55b!<<K
 (,,,--55b!<<K,,,//Xb)))Frx&}k;8JF	
 	
 	
 	
 	(FIH		
 		
 		
 )999555K3%"u!566666r/   distributionnormalblobstol){Gz?g:0yE>g0.++r   c                 F   t           j                            |          }| dk    r|                    d          }nt	          |          \  }}d||dk     <    ||          }t          d|d|          }t          d	d|d|
          }|                    |           |                    |           t          |j        |j                   t          |j
        |j
                   |j        |j        k    sJ |j        t          j        |j        d          k    sJ d S )Nrm   i  r]   sizer'   r      r<   )rA   r'   rB   ro   r8   )rD   rA   r'   rB   ro   ư>)rel)rG   randomRandomStaterm   r   r   rI   r   rL   r   rJ   rM   rK   pytestapprox)	rl   r4   ro   global_random_seedrndr*   _km_lloydkm_elkans	            r-   test_kmeans_elkan_resultsr      s2   
 )

 2
3
3CxJJJJ''s+++1Aa!eHQA1CASVWWWH'  H LLOOOLLOOOH-x/HIIIx')9:::x/////h.?T J J JJJJJJJr/   rD   c                     t           j                            |          }|                    d          }d}t	          | d|dd|                              |          }|j        |k     sJ d S )Nrr   rs   i,  rv   r<   r   )rD   rA   r'   rB   ro   max_iter)rG   ry   rz   rm   r   rI   rM   )rD   r}   r~   r*   r   kms         r-   test_kmeans_convergencer      s     )

 2
3
3C



##AH	'
 
 
 
c!ff  :      r/   X_csrc           
      Z   t           j                            |          }t          |                    t          j                  z   }|                                }t          j        |          }t          j        |          }t          j        |j        d         t          j
                  }t          j        |j        d         t          j
                  }t          j        t          j        d         t          j
                  }	t          d d         }
| d d         }|	d d         }t          |
||||t           j                            |          d          }|dk    sJ t          |
||          \  }}|dk    sJ ||k     sJ t          |||||t           j                            |          d          }|dk    sJ t          |||          \  }}|dk    sJ ||k     sJ t          ||           t          ||           t          ||           t          ||           d S )Nrs   r   r=   r]   F)random_reassignr   )rG   ry   rz   r%   rm   shapecopy
zeros_likerb   r*   r9   ra   r   r   r   r   )r   r}   rngrg   centers_old_csrrh   centers_new_csrweight_sumsweight_sums_csrrF   X_mbX_mb_csrsample_weight_mbold_inertiarj   new_inertiaold_inertia_csr
labels_csrnew_inertia_csrs                      r-   !test_minibatch_update_consistencyr      sI    )

 2
3
3CCJJGMJ:::K!&&((O-,,KmO44O(;,Q/qw???Kh{0317CCCOGAGAJag666M SbS6DSbSzH$SbS) #
	011  K  *$0@+NNFK$$$$ '
	011  O S     #2"O# #J S    _,,,, vz***K111K111K11111r/   c                    | j         }|j        t          t          fk    sJ | j        }t          j        |          j        d         t          k    sJ t          t          t          |          d           | j
        dk    sJ d S )Nr   r!   r   )rL   r   rA   
n_featuresrJ   rG   uniquer   r   true_labelsrK   )r   r%   rj   s      r-   _check_fitted_modelr     s     !G=Z44444ZF9V"1%3333 OK88#>>>;r/   
input_datarC   ry   	k-means++c                     t           S Nr%   r*   kr'   s      r-   <lambda>r   "       r/   )ry   r   ndarraycallable	Estimatorc                     t          |t                    rdnd} | |t          d|                              |          }t	          |           d S )Nr]   r<   r#   rC   rA   r'   rB   )
isinstancestrrA   rI   r   )r   r   rC   rB   r   s        r-   test_all_initr     s_     dC((/RRaF	jr&
 
 
	c*oo  r/   c                     t           S r   r   r   s      r-   r   r   1  r   r/   c                     t          | t                    rdnd}t          | t          d|          }t	          d          D ]}|                    t                     t          |           d S )Nr]   r<   r   r   r"   )r   r   r   rA   rangepartial_fitr*   r   )rC   rB   r   is       r-   &test_minibatch_kmeans_partial_fit_initr   /  sy     dC((/RRaF	jq
 
 
B 3ZZ  
qr/   zinit, expected_n_init)r   r<   )ry   defaultc                 H    |                     || j        d         f          S )Nr<   rs   )uniformr   )r*   rA   r'   s      r-   r   r   F  s*    0D0D !'!*- 1E 1 1 r/   r   )
array-liker<   c                     d\  }}}t           j                            ||          }|dk    r t           j                            ||          }|dk    r| t          u rdnd} | ||d                              |          }|j        |k    sJ dS )	zCheck 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"   r]   rv   r   r   r>   r]   autorA   rC   rB   N)rG   ry   randnr   rI   _n_init)r   rC   expected_n_initn_sampler   rA   r*   rS   s           r-   ,test_kmeans_init_auto_with_initial_centroidsr   @  s    ( (2$Hj*
	*--A|yz:66)##(O;;!!Y*4GGGKKANNF>_,,,,,,r/   c                    t          j        t                    }t          j        t                    } | t          t          d|                              t                    } | t          |d|                              |          }t          |j        |j                   t          |j	        |j	                   d S )Nr<   rA   rC   rB   r'   )
rG   asfortranarrayr*   r%   rA   rI   r   rL   r   rJ   )r   r}   	X_fortrancenters_fortrankm_ckm_fs         r-   test_fortran_aligned_datar   _  s     !!$$I'00O9GADV  	c!ff 	 9'	  
 
c)nn 	 D)4+@AAAt|T\22222r/   c                      t          t          dd          } t          j        }t	                      t          _        	 |                     t                     |t          _        d S # |t          _        w xY w)Nr#   r<   )rA   r'   verbose)r   rA   sysstdoutr   rI   r*   )r   
old_stdouts     r-   test_minibatch_kmeans_verboser   r  sZ    	JR	K	K	KBJCJ 
q			


Z
s   A% %A3rp   c           	         t           j                            d                              d          }t	          | t
          ddd|d                              |           |                                }t          j	        d|j
                  sJ t          j	        d	|j
                  sJ |dk    rt          j	        d
|j
                  sJ d S t          j	        d|j
                  sJ d S )Nr   rr   rs   r#   ry   r<   )rD   rA   r'   rC   rB   ro   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)rG   ry   rz   rm   r   rA   rI   
readouterrresearchout)rD   ro   capsysr*   captureds        r-   test_kmeans_verboser   }  s     		a  ''Z'88A
   
c!fff  ""H9/>>>>>918<@@@@@
axxy.=======y<hlKKKKKKKr/   c                      t          j        t          d          5  t          dd                              t
                     d d d            d S # 1 swxY w Y   d S )Nz,init_size.* should be larger than n_clustersmatchr]      )	init_sizerA   )r{   warnsRuntimeWarningr   rI   r*   r)   r/   r-   'test_minibatch_kmeans_warning_init_sizer     s    	M
 
 
 < < 	"44488;;;< < < < < < < < < < < < < < < < < <   *AAAc                     t          j        t          d          5   | t          t          d                              t                     d d d            d S # 1 swxY w Y   d S )NzAExplicit initial center position passed: performing only one initr   r]   rC   rA   rB   )r{   r   r   r%   rA   rI   r*   )r   s    r-   'test_warning_n_init_precomputed_centersr     s     
Q
 
 
 I I 		w:bAAAEEaHHH	I I I I I I I I I I I I I I I I I Is   1AA!Ac                    t          dd|           \  }}d|d d dd d f<   t          dd| d	                              |          }|j                            d
                                          }|dk    sJ d|d            t          dd| d	                              |          }|j                            d
                                          }|dk    sJ d|d            t          d| d          }t          d          D ]}|                    |           |j                            d
                                          }|dk    sJ d|d            d S )Nr"   rv   )r$   r%   r'   r   r0   r   r]   ry   )rA   
batch_sizer'   rC   r<   axisr[   znum_non_zero_clusters=z is too small   )rA   r'   rC   )r   r   rI   rL   anysumr   r   )r}   zeroed_Xr   r   num_non_zero_clustersr   s         r-    test_minibatch_sensible_reassignr     s    'q/A  Hk HSSqS!!!V	"3EH
 
 
	c(mm  /333;;??AA 1$$$&N)>&N&N&N$$$ 
#4FX
 
 
	c(mm  /333;;??AA 1$$$&N)>&N&N&N$$$ 
B5Gh	W	W	WB3ZZ ! !
x    /333;;??AA 1$$$&N)>&N&N&N$$$$$r/   c           
         t          j        t          t          f          }t	          t                    D ]/}t
          t          |k                                 d          ||<   0t          j        t                    }t          j
        |          }t          | ||d          d          }t          | |||t          j        t                    t           j                            |          dd           t          | ||d          d          }||k    sJ t          | |||t          j        t                    t           j                            |          dd           t!          ||           d S )Nr   r   r<   T)r   reassignment_ratiogV瞯<)rG   emptyrA   r   r   r*   r   meanra   r$   
empty_liker   r   rb   ry   rz   r   )r   r}   perfect_centersr   rF   rh   score_beforescore_afters           r-   test_minibatch_reassignr     sp    h
J788O: > >{a/05515==GI&&M-00K
 $JPQRRSTUUL

	011	 	 	 	 #:}k1MMaPPK+%%%% 

	011 	 	 	 	 K11111r/   c                  h    t          ddt          dd                              t                     d S )Nr"   r]   r#   T)rA   r   r   r'   r   )r   r$   rI   r*   r)   r/   r-   &test_minibatch_with_many_reassignmentsr     s8    
    
c!fffffr/   c                  l   t          ddd                              t                    } | j        dk    sJ t          ddd                              t                    } | j        dk    sJ t          dddt          dz                                 t                    } | j        t          k    sJ d S )Nr]   rv   r<   )rA   r   rB         )rA   r   rB   r   )r   rI   r*   
_init_sizer$   r   s    r-   test_minibatch_kmeans_init_sizer     s     
B1Q	?	?	?	C	CA	F	FB=B 
B1Q	?	?	?	C	CA	F	FB=B 
!AQ
 
 
	c!ff  =I%%%%%%r/   ztol, max_no_improvement)-C6?N)r   r]   c                     t          ddd          \  }}}t          d|d|dddd|	  	        }|                    |           d|j        cxk     rdk     sn J |                                 }|d	|j        v sJ |dk    rd
|j        v sJ d S d S )Nr>   r   T)r%   r'   return_centersr   r]   r<   )	rA   rC   r   ro   r'   r   rB   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   rI   rM   r   r   )r   ro   r  r*   r   r%   r   r   s           r-   #test_minibatch_declared_convergencer    s     qqNNNMAq'	-

 

 

B FF1IIIrzB  ""H!1X\AAAA
axx;x|KKKK xKKr/   c                     d} t           j        d         }t          d| d                              t                     }|j        t          j        |j        | z  |z            k    sJ t          |j        t                    sJ t          d| ddd d                              t                     }|j        dk    sJ |j        d|z  | z  k    sJ t          |j        t                    sJ d S )Nr   r   r>   )rA   r   r'   r]   )rA   r   r'   ro   r  r   )
r*   r   r   rI   rM   rG   ceiln_steps_r   int)r   r$   r   s      r-   test_minibatch_iter_stepsr	  ;  s    J
I	A*1	M	M	M	Q	QRS	T	TB :"+
":i!GHHHHHHbj#&&&&& 

 
 
 
c!ff  :;2	>j88888bk3'''''''r/   c                      t                                           } t          dt          d          }|                    |            t          |           t          | t                      d S )NFr#   )copy_xrA   r'   )r*   r   r   rA   rI   r   r   )my_Xr   s     r-   test_kmeans_copyxr  T  sX    6688D	u"	E	E	EBFF4LLL D!r/   c                 T   t           j                            |                              dd          } | d|d          }|                    |                              |          } | d|d          }|                    |                              |          }||k    sJ d S )Nr"   r]   r<   )rB   r'   r   )rG   ry   rz   r   rI   score)r   r}   r*   km1s1km2s2s          r-   test_score_max_iterr  _  s     		01177R@@A
)1+=
J
J
JC			!		B
)1+=
K
K
KC			!		B777777r/   zEstimator, algorithmr   c                    t          ddd|          \  }} |||          } | ddd||          }||                    |           |                    |           |j        }	|                    |          }
t          |
|	           |                    |          }
t          |
|	           |                    |j                  }
t          |
t          j	        d                     d S )Nr   r]   r$   r   r%   r'   r=   ry   )rA   rC   rB   r   r'   )rD   )
r   
set_paramsrI   rJ   predictr   fit_predictrL   rG   arange)r   rD   r4   r   global_dtyper}   r*   r   r   rj   preds              r-   test_kmeans_predictr  l  s    "b?Q  DAq 	Ql+++A	'
 
 
B 
	***FF1IIIZF ::a==DtV$$$ >>!DtV$$$ ::b)**DtRYr]]+++++r/   c                    t           j                            |                              t          f          } | t
          |d          }|                    t          |            | t
          |d          }|                    ||           t          |j	        |j	                   t          |j        |j                   d S Nr<   rA   r'   rB   rE   )rG   ry   rz   random_sampler$   rA   rI   r*   r   rJ   r   rL   )r   r   r}   rF   km_dense	km_sparses         r-   test_dense_sparser$    s     I))*<==KK	 M y,>q  H LL-L000	,>q  I MM%}M555x'):;;;H-y/IJJJJJr/   )ry   r   r   c                 h   t          |t                    rdnd} | t          ||d          }|                    |           t	          |                    t                    |j                   |                    t                     t	          |                    |          |j                   d S )Nr]   r<   r   r   )r   r   rA   rI   r   r  r*   rJ   )r   rC   r   rB   r   s        r-   test_predict_dense_sparser&    s     dC((/RRaF	jtFQR	S	S	SBFF5MMMrzz!}}bj111FF1IIIrzz%(("*55555r/   r   c           	      B   t          j        ddgddgddgddgddgddgg          } |||	          }|d
k    rdnd}|d
k    r
|d d         n|} | d|||          }| t          u r|                    d           |                    |           |j        j        t           j        k    sJ g d}	t          t          |j
        |	          d           | t          u r>t          |                              |          }|j        j        t           j        k    sJ d S d S )Nr   r]      r[   rZ   r<   r0   r_   r=   r   r   )r   )r   r<   r<   r   r   r<   r!   )rG   rH   r   r  rI   rL   r9   float64r   r   rJ   r   r   )
r   r4   r9   rC   r}   X_denser*   rB   r   rO   s
             r-   test_integer_inputr+    sY    hAR2q'B7QFQGLMMGWE***A)##QQF)++72A2;;D	4=O
 
 
B O##
###FF1III $
2222(((OOBJ@@#FFF O##2YY""1%%"(BJ6666 $#66r/   c                     | t           |                              t                    }|                    |j                  }t          |t          |j                             t          |                                t          j
        t                                |                    t                    }t          |t          t          |j                             d S )NrA   r'   )rA   rI   r*   	transformrL   r   r   r   diagonalrG   rb   )r   r}   r   Xts       r-   test_transformr1    s     
j7I	J	J	J	N	Nq	Q	QB 
b)	*	*BB*2+>??@@@r{{}}bhz&:&:;;; 
aBB*1b.ABBCCCCCr/   c                      | |d                               t                                        t                    } | |d                              t                    }t	          ||           d S )Nr<   )r'   rB   )rI   r*   r.  fit_transformr   )r   r}   X1X2s       r-   test_fit_transformr6    sn     
 21	=	=	=	A	A!	D	D	N	Nq	Q	QB	 21	=	=	=	K	KA	N	NBBr/   c                     t           j        }dD ]@}t          t          d|| d                              t
                    }|j        |k    sJ Ad S )N)r<   rv   r]   ry   r<   )rA   rC   rB   r'   r   )rG   infr   rA   rI   r*   rK   )r}   previous_inertiarB   r   s       r-   test_n_initr:    sq    v 
/ 
/ !+
 
 
 #a&& 	 {......
/ 
/r/   c                 $   t          t          t          d |           \  }}}|j        t          t          fk    sJ t          j        |          j        d         t          k    sJ t          t          t          |          d           |dk    sJ d S )N)rA   rF   r'   r   r!   r   )
r   r*   rA   r   r   rG   r   r   r   r   )r}   cluster_centersrj   inertias       r-   test_k_means_functionr>    s    '.	jCU( ( ($OVW  Z$<<<<<9V"1%3333 OK88#>>>S======r/   c                     | d|          }i }i }i }i }t           j        t           j        fD ]}|                    |d          }	|                    |	           |j        ||<   |                    |	          ||<   |j        ||<   |j        ||<   |j        j	        |k    sJ | t          u r/|                    |	dd                    |j        j	        |k    sJ t          |t           j                 |t           j                 d           t          |t           j                 |t           j                 |t           j                                                 dz  	           t          |t           j                 |t           j                 |t           j                                                 dz  	           t          |t           j                 |t           j                            d S )
Nr<   )rB   r'   Fr   r   r>   r   rtol)atol)rG   r)  float32astyperI   rK   r.  rL   rJ   r9   r   r   r   maxr   )
r   r   r}   r   r=  r0  r%   rj   r9   r*   s
             r-   test_float_precisionrG    s    
!*<	=	=	=BG	BGF*bj) 6 6e%00
q			LLOO5	,
u "(E1111 ''NN1QqS6"""&,5555 GBJ')<4HHHHBrzNBrzNBJ9K9K9M9MPT9TUUUU
WRZ0wrz7J7N7N7P7PSW7W    vbj)6"*+=>>>>>r/   c                     t                               |d          }t                              |d          } | |t          d          }|                    |           t          j        |j        |          rJ d S )NFr@  r<   r   )r*   rE  r%   rA   rI   rG   may_share_memoryrL   )r   r9   
X_new_typecenters_new_typer   s        r-   test_centers_not_mutatedrL  =  s{     %e,,J~~e%~88	(Z	J	J	JBFF:"2#68HIIIIIIIr/   c                     t          t                                        |           }t          t          |j        d                              |           }t	          |j        |j                   d S )N)rA   r<   r   )r   rA   rI   rL   r   )r   r  r  s      r-   test_kmeans_init_fitted_centersrN  L  sj     J
'
'
'
+
+J
7
7C
JS-A!
L
L
L
P
P C C(#*>?????r/   c                 h   t          j        ddgddgddgddgg          }t          d|           }d}t          j        t
          |          5  |                    |           t          |j                  t          t          d                    k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r<      r-  zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.r   r>   )
rG   asarrayr   r{   r   r   rI   setrJ   r   )r}   r*   r   msgs       r-   1test_kmeans_warns_less_centers_than_unique_pointsrT  \  s    

QFQFQFQF344A	1+=	>	>	>B	D  
(	4	4	4 0 0
q			 2:#eAhh--/////	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   A
B''B+.B+c                 .    t          j        | d          S Nr   r   )rG   sortr   s    r-   _sort_centersrX  m  s    77####r/   c                 |   t           j                            |                               ddt                    }t          j        t          |d          }t          t          dt          |           }t          |                              t          |          }t          j        |j        |          }t          |                              |          }t          |j        |           t          |j        |j                   t          t!          |j                  t!          |j                             d S )Nr<   rv   rs   r   r   )rC   rB   rA   r'   rE   )rG   ry   rz   randintr$   repeatr*   r   r%   rA   r   rI   rJ   r   r   rK   rX  rL   )r}   rF   X_repeatr   km_weightedrepeated_labelskm_repeateds          r-   test_weighted_vs_repeatedr`  q  s   
 I))*<==EE	19 F  M yM222H	Q:DV
 
 
B ))---??Ki 3]CCO))--))K{*O<<<K(+*>???k233k233    r/   c                 V   t          j        t                    } | t          |d          }t	          |                              |d           }t	          |                              ||          }t          |j        |j                   t          |j	        |j	                   d S r  )
rG   ra   r$   rA   r   rI   r   rJ   r   rL   )r   r   r}   rF   r   km_nonekm_oness          r-   test_unit_weights_vs_no_weightsrd    s     GI&&M	j7IRS	T	T	TBBiimmJdm;;GBiimmJmmDDGw888G,g.FGGGGGr/   c                    t           j                            |                              t                    } | t
          |d          }t          |                              ||          }t          |                              |d|z            }t          |j	        |j	                   t          |j        |j                   d S )Nrs   r<   r   rE   r;   )rG   ry   rz   r   r$   rA   r   rI   r   rJ   r   rL   )r   r   r}   rF   r   km_orig	km_scaleds          r-   test_scaled_weightsrh    s     I))*<==EE9EUUM	j7IRS	T	T	TBBiimmJmmDDGb		jm8KLLIw	(9:::G,i.HIIIIIr/   c                  r    t          dd                              t                    } | j        dk    sJ d S )Nr8   r<   )rD   r   )r   rI   r*   rM   r   s    r-    test_kmeans_elkan_iter_attributerj    s7     
'A	.	.	.	2	21	5	5B:??????r/   c                 .    | dgdgg          }ddg}t          j        dgdgg          }t          d|d          }|                    ||           t	          t          |j                            dk    sJ t          |j        dgdgg           d S )	NrZ   r<   gffffff?g?r]   r0   r   rE   )	rG   rH   r   rI   lenrR  rJ   r   rL   )r4   r*   rF   rC   r   s        r-   #test_kmeans_empty_cluster_relocatedrm    s     	rdQC[!!A#JM8bTB4L!!D	14	2	2	2BFF1MF***s2:1$$$$B'2$55555r/   c                 $   t           j                            |          }|                    d          }t	                                          dd          5   | t          |                              |          j        }d d d            n# 1 swxY w Y   t	                                          dd          5   | t          |                              |          j        }d d d            n# 1 swxY w Y   t          ||           d S )N)2   r]   rs   r<   openmp)limitsuser_apir-  r0   )
rG   ry   rz   rm   r   limitrA   rI   rJ   r   )r   r}   r~   r*   result_1result_2s         r-   #test_result_equal_in_diff_n_threadsrv    s{    )

 2
3
3C


!!A	#	%	%	+	+1x	+	H	H 
 
I:LMMMSVV 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$	%	%	+	+1x	+	H	H 
 
I:LMMMSVV 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 x*****s$   +BBB>+C55C9<C9c                      t          j        t          d          5  t          dd                              t
                     d d d            d S # 1 swxY w Y   d S )Nz9algorithm='elkan' doesn't make sense for a single clusterr   r<   r8   )rA   rD   )r{   r   r   r   rI   r*   r)   r/   r-   test_warning_elkan_1_clusterrx    s    	I
 
 
 7 7 	!w///33A666	7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7r   c                 d   t           j                            |                              d          }|d d         } | |          }d } |||          \  }}t	          dd||d                              |          }|j        }	|j        }
t          ||	           t          ||
           d S )N)r"   rv   rs   rv   c                     |                                 }t          | |          }t          |j        d                   D ]%}| ||k                                 d          ||<   &t          | |          }||fS rV  )r   r   r   r   r   )r*   rC   new_centersrj   labels        r-   	py_kmeansz+test_k_means_1_iteration.<locals>.py_kmeans  s~    iikk*1d334:a=)) 	A 	AE!"6U?!3!8!8a!8!@!@K*1k::{""r/   r<   )rA   rB   rC   rD   r   )
rG   ry   rz   r   r   rI   rJ   rL   r   r   )r4   r6   r}   r*   rN   r}  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              r-   test_k_means_1_iterationr    s    
 		01199x9HHARaR5LQA# # # &Ia66IzQ\TA  	c!ff  !I+Jy),,,J
+++++r/   squaredTFc                    t           j                            |          }t          j        dddd||           }|                                                    d          }|                    d                              | d          }|d	z                                  }||z
  d	z                                  }|r|nt          j	        |          }t          |||          }	t          |j        |j        |||          }
| t           j        k    rd
nd}t          |	|
|           t          |	||           t          |
||           d S )Nr<   r"   r;   csrdensityformatr'   r9   rZ   Fr@  r0   r   gHz>rA  )rG   ry   rz   sptoarrayr`   r   rE  r   sqrtr
   r   rd   re   rD  r   )r9   r  r}   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denserB  s               r-   test_euclidean_distancer    sU   
 )

 2
3
3Cy	3E5  H   ((,,G		#e%00AdZZ\\N1"''))H"9xx(9(9H9'1gNN;x'NG  BJ&&44DD(*?dKKKK((>>>>)8$??????r/   c                 >   t           j                            |          }t          j        dddd||           }|                                }|                    d                              | d          }|                    dd                              | d          }|                    ddt           j        	          }|||         z
  d
z  	                    d          }t          j	        ||z            }	t          ||||d          }
t          ||||d          }| t           j        k    rdnd}t          |
||           t          |
|	|           t          ||	|           d}||k    }||         ||         z
  d
z  	                    d          }t          j	        |||         z            }	t          ||||d|          }
t          ||||d|          }t          |
||           t          |
|	|           t          ||	|           d S )Nr"   r]   r;   r  r  Fr@  rv   )rt   r9   r0   r<   r   )	n_threadsr   rw   rA  )r  single_label)rG   ry   rz   r  r  r   rE  rZ  rc   r   r   r   rD  r   )r9   r}   r   X_sparser*  rF   r%   rj   	distancesr  inertia_denseinertia_sparserB  r|  masks                  r-   test_inertiar    sS    )

 2
3
3CyRUE  H   GIIcNN))%e)<<Mii2%%e%%88G[[BH[55FGFO+166A6>>Ivi-/00H"7M7FVWXXXM$-&A  N BJ&&44DDM>====M8$7777NH48888 EU?D$-'%.0Q6;;;CCIvi-"5566H"15  M %-&AE  N M>====M8$7777NH4888888r/   zKlass, default_n_initr]   r>   c                      | dd          }|                     t                     |j        dk    sJ  | dd          }|                     t                     | j        dk    r|j        dk    snd S J d S )Nr   r   )rB   rC   r<   ry   r   r]   )rI   r*   r   __name__)Klassdefault_n_initests      r-   test_n_init_autor  I  s    
%vK
0
0
0CGGAJJJ;!
%vH
-
-
-CGGAJJJ %( : :3;"r/   c                     t          j        dgdgdgg          }t          j        g d          } | dd                              ||           t          |t          j        g d                     d S )Nr<   r0   rP  )r;   g?g333333?r   r-  rE   )rG   rH   rI   r   )r   r*   rF   s      r-   test_sample_weight_unchangedr  T  s~     	1#sQC!!AH___--MI+++///OOO}bh&?&?@@@@@r/   zparam, matchrA   r<   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                     | d d         S )Nr0   r)   X_r   r'   s      r-   r   r   i  s    BQB r/   r_   zUThe shape of the initial centers .* does not match the number of features of the datac                     | d dd df         S )Nr_   r0   r)   r  s      r-   r   r   s  s    BQBF r/   c                      | d          }t          j        t          |          5   |j        di |                    t
                     d d d            d S # 1 swxY w Y   d S )Nr<   )rB   r   r)   )r{   raises
ValueErrorr  rI   r*   )r   paramr   r   s       r-   test_wrong_paramsr  ^  s    > 
!			B	z	/	/	/ & &""1%%%& & & & & & & & & & & & & & & & & &s   &AA"Ax_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc                     t          j        t          |          5  t          t          t
          fi |  d d d            d S # 1 swxY w Y   d S )Nr   )r{   r  r  r	   r*   rA   )r  r   s     r-   !test_kmeans_plusplus_wrong_paramsr    s     
z	/	/	/ 0 0://///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   AA	Ac                    |                      |          }t          |t          |          \  }}|j        d         t          k    sJ |dk                                    sJ ||j        d         k                                    sJ |j        d         t          k    sJ |                    d          |                    d          k                                    sJ |                    d          |                    d          k                                    sJ t          t          |                              |          |           d S )Nru   r   r   )	rE  r	   rA   r   allrF  minr   r*   )r   r9   r}   rd   r%   re   s         r-   test_kmeans_plusplus_outputr    sG    U##D&j'9  GW =z))))qLtz!}$))+++++ =z))))KKQK4888#3#3388:::::KKQK4888#3#3388:::::
 AgJ%%e,,g66666r/   r  c                 z    t          t          t          |           \  }}t          t          |         |           d S )N)r  )r	   r*   rA   r   )r  r%   re   s      r-   test_kmeans_plusplus_normsr    s7     'q*oVVVGWAgJ(((((r/   c                     t          t          t          |           \  }}t          j        t                    }t          |t          |           \  }}t          ||           d S )Nru   )r	   r*   rA   rG   r   r   )r}   	centers_cr   r   r   s        r-   test_kmeans_plusplus_dataorderr    sd    "1j?QRRRLIq!!$$I(:,>  OQ I/////r/   c                  D   t          j        g dt           j                  } t          | | d          sJ t          j        g dt           j                  }t          | |d          sJ t          j        g dt           j                  }t          | |d          rJ d S )N)r<   r   r   r<   r0   r   r0   r<   r=   r>   )r   r0   r0   r   r<   r0   r<   r   )r<   r   r   r0   r0   r   r0   r<   )rG   rH   rc   r   )labels1labels2labels3s      r-   test_is_same_clusteringr    s    h///rx@@@Gw33333 h///rx@@@Gw33333 h///rx@@@G"7GQ7777777r/   kwargs)rC   rB   c                     t          j        ddgddgddgddggt           j                  }t          dddi| }|                    |           dS )	zZCheck that init works with numpy scalar strings.

    Non-regression test for #21964.
    r   r;   r<   r=   rA   r0   Nr)   )rG   rQ  r)  r   rI   )r  r*   
clusterings      r-   -test_kmeans_with_array_like_or_np_scalar_initr    sc     	
QFS!HsAhA7rzJJJA//1///JNN1r/   zKlass, methodrI   r   c                 (   | j                                          |             } t          ||          t                     |j        j        d         }|                                }t          fdt          |          D             |           dS )z=Check `feature_names_out` for `KMeans` and `MiniBatchKMeans`.r   c                     g | ]} | 	S r)   r)   )r+   r   
class_names     r-   r.   z*test_feature_names_out.<locals>.<listcomp>  s$    FFFq:*q**FFFr/   N)	r  lowergetattrr*   rL   r   get_feature_names_outr   r   )r  methodrS   rA   	names_outr  s        @r-   test_feature_names_outr    s     %%''JUWWFGFFA(.q1J,,..IFFFFE*4E4EFFF	RRRRRr/   csr_containerc                 @   t          dddd          \  }}|  | |          }t                      }|                    |          }t          |j                  |_        t          |j                  |_        |                    |          }t          ||           dS )z_Check that predict does not change cluster centers.

    Non-regression test for gh-24253.
    r   r]   r   r  N)r   r   r  r   rL   rJ   r  r   )r  r*   r   rS   y_pred1y_pred2s         r-   ,test_predict_does_not_change_cluster_centersr    s     BQOOODAq M!XXF  ##G78OPPF.v~>>FNnnQGw(((((r/   c           
         t           j                            |          }t          ddd|          \  }}t	          |d          }t                      }|                    ||| |                    |j        d                   dt           j                            |          	          }|                    ||| t          j	        |j        d                   dt           j                            |          	          }t          j        t                    5  t          ||           d
d
d
           d
S # 1 swxY w Y   d
S )zCheck 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   r]   r  Tr  r   rs   rv   r*   r  rC   rF   n_centroidsr'   N)rG   ry   rz   r   r   r   _init_centroidsr   r   ra   r{   r  rV   r   )	rC   r}   r   r*   r   r  rS   clusters_weightedclusterss	            r-   test_sample_weight_initr    s    )

 2
3
3C"b?Q  DAq  4000OXXF..
'kkqwqzk22Y**+=>> /   %%
'gagaj))Y**+=>> &  H 
~	&	& 5 5)84445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s   D88D<?D<c           
         t           j                            |          }t          ddd|          \  }}|                    |j        d                   }d|ddd<   t          |d	          }t                      }|                    ||| |d
t           j                            |                    }t          |ddd         |          }	t          j
        t          j        |	d                    rJ dS )zCheck 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"   rv   r  r   rs   Nr0   Tr  r]   r  )rG   ry   rz   r   r   r   r   r   r  r   r   isclose)
rC   r}   r   r*   r   rF   r  rS   r  ds
             r-   test_sample_weight_zeror  '  s    )

 2
3
3C!Q=O  DAq KKQWQZK00MM##A#4000OXXF..
'#Y**+=>> /   	AcccF$566AvbjA&&'''''''r/   c                 0   t          j        ddgddgddgddgddgg          }t          d||           }d}t          j        t
          |          5  |                     ||                     ddd           n# 1 swxY w Y   |j        dk    sJ dS )zCheck that kmeans stops when there are more centers than non-duplicate samples

    Non-regression test for issue:
    https://github.com/scikit-learn/scikit-learn/issues/28055
    r   r<   rv   )rA   rC   rD   zENumber of distinct clusters \(4\) found smaller than n_clusters \(5\)r   N)rG   rH   r   r{   r   r   rI   rM   )rD   r4   r*   r   rS  s        r-   test_relocating_with_duplicatesr  E  s     	1a&1a&1a&1a&1a&9::A	11		:	:	:B
RC	(	4	4	4    
||A                              :??????s   A>>BB)__doc__r   r   ior   numpyrG   r{   scipyr   r  sklearn.baser   sklearn.clusterr   r   r   r	   sklearn.cluster._k_means_commonr
   r   r   r   r   r   r   sklearn.cluster._kmeansr   r   sklearn.datasetsr   sklearn.exceptionsr   sklearn.metricsr   r   sklearn.metrics.clusterr   sklearn.metrics.pairwiser   sklearn.utils._testingr   r   r   sklearn.utils.extmathr   sklearn.utils.fixesr   sklearn.utils.parallelr   rH   r%   r$   r   rA   r   r*   r   X_as_any_csrdata_containersrl  data_containers_idsmarkparametrizerD  r)  rT   rW   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r$  r&  rc   int64r+  r1  r6  r:  r>  rG  rL  rN  rT  rX  r`  rd  rh  rj  rm  rv  rx  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r  r  r  r)   r/   r-   <module>r     s*     				 



                        M M M M M M M M M M M M                  F E E E E E E E ' ' ' ' ' ' 1 1 1 1 1 1 I I I I I I I I 3 3 3 3 3 3 8 8 8 8 8 8         
 , + + + + + . . . . . . = = = = = = "(!!!!!!!!!  	  
Jc  ; >=n===8*~- s<A /...
?	#  >QRR'7!3442:rz":;;- - <; 54 SR-* >QRR'7!344C C 54 SRC: >QRR&7 &7 SR&7R (G)<==>QRR 7 7 788K K 98 SR >=K6 w&899! ! :9!$ ,//<2 <2 0/<2~   C,   
 
{G%G%GH666   
 v&?@@  A@   
{G%G%GH666   
	 	 
	   		
 	
  v&?@@- - A@ -  v&?@@3 3 A@3$      w&899q	**L L +* :9L2< < < v&?@@I I A@IO O OB C,   
+2 +2 
+2\  & & &$ 2\74KLLL L MLL6( ( (2   v&?@@	 	 A@	 >QRRg)OT+BC  aX.. ,  , /.	  SR ,F ,//v&?@@K K A@ 0/K$ ,//
X{G,2T2T2T    v&?@@
6 
6 A@  0/

6 >QRR28RX"677+y!9::v&?@@7 7 A@ ;: 87 SR78 v&?@@D D A@D" v&?@@  A@/ / /    C,   
 v&?@@!? !? A@ !?H 28RXrz2:"NOOv&?@@
J 
J A@ PO
J C,   
@ @ 
@0 0 0"$ $ $  4 C,   
 v&?@@
H 
H A@ 
H C,   
 v&?@@
J 
J A@ 
J   >QRR6 6 SR6 v&?@@+ + A@+*7 7 7 >QRR'7!344, , 54 SR,6 2:rz":;;T5M22@ @ 32 <;@2 2:rz":;;'9 '9 <;'9T 0FB</STAU2VWWB B XWB v&?@@A A A@A v&?@@
	A	&(NOQrrUO&	
 778&	
 Qrr2A2vY2	
 ;;<2	
# 4& &5  A@6&  "1"&3	
	 	0 0	 	0
 C,  2:rz":;;7 7 <;	 
70 *YYq$-G-G-G,NOO) ) PO)
0 
0 
08 8 8  ,,-!Q!Q8HTU/V/VW 	 	 	 e_.-0PQ S S	 S .D6*ABB) ) CB)& +x!8995 5 :95B +x!899( ( :9(: >QRRw&899  :9 SR  r/   