
    -ir                         S r SSKrSSKrSSKJr  SSKrSSKrSSKJ	r
  SSKJr  SSKJrJrJrJr  SSKJrJrJrJrJrJrJr  SSKJrJr  SS	KJr  SS
KJ r   SSK!J"r"J#r#  SSK$J%r%  SSK&J'r'  SSK(J)r)J*r*J+r+  SSK,J-r-  SSK.J/r/  SSK0J1r1  \Rd                  " / SQ/ SQ/ SQ/5      r3Sr4\3Rj                  u  r6r7\" \4\3SSS9u  r8r9\/ V s/ s H
  o " \85      PM     sn r:\Rd                  /\/-   r;\<" \:5      S:X  a  / SQOSS/r=\R|                  R                  S\;\=S9\R|                  R                  SS S!/5      \R|                  R                  S"\R                  \R                  /5      S# 5       5       5       rB\R|                  R                  S\;\=S9\R|                  R                  SS S!/5      S$ 5       5       rC\R|                  R                  S\;\=S9S% 5       rD\R|                  R                  S&S'S(/5      \R|                  R                  S\;\=S9\R|                  R                  S)/ S*Q5      S+ 5       5       5       rE\R|                  R                  S,S S!/5      S- 5       rF\R|                  R                  S.\:5      S/ 5       rGS0 rH\R|                  R                  S1\8/\:-   \=S9\R|                  R                  S2S3S4\3S5 // S6QS9\R|                  R                  S7\\/5      S8 5       5       5       rI\R|                  R                  S2S3S4\3S9 // S6QS9S: 5       rJ\R|                  R                  S;S<S=S> S?4S@/5      \R|                  R                  S7\\/5      SA 5       5       rK\R|                  R                  S7\\/5      SB 5       rLSC rM\R|                  R                  S,S S!/5      \R|                  R                  S)SDS/5      SE 5       5       rNSF rO\R|                  R                  S7\\/5      SG 5       rPSH rQ\R|                  R                  S1\8/\:-   \=S9SI 5       rRSJ rSSK rT\R|                  R                  SLSMSN/5      SO 5       rUSP rVSQ rW\R|                  R                  S7\\/5      SR 5       rX\R|                  R                  S\;\=S9\R|                  R                  SS\S 4\S!4\S4/5      \R|                  R                  STSS/5      SU 5       5       5       rY\R|                  R                  S.\:5      \R|                  R                  S7\\/5      SV 5       5       rZ\R|                  R                  S.\:5      \R|                  R                  S2S3S4\3// SWQS9\R|                  R                  S7\\/5      SX 5       5       5       r[\R|                  R                  S\;\=S9\R|                  R                  S"\R                  \R                  /5      \R|                  R                  S2S4SY/5      \R|                  R                  S7\\/5      SZ 5       5       5       5       r^\R|                  R                  S7\\/5      S[ 5       r_\R|                  R                  S7\\/5      S\ 5       r`S] raS^ rb\R|                  R                  S1\8/\:-   \=S9\R|                  R                  S7\\/5      S_ 5       5       rc\R|                  R                  S"\R                  \R                  \R                  \R                  /5      \R|                  R                  S7\\/5      S` 5       5       rd\R|                  R                  S1\8/\:-   \=S9Sa 5       reSb rfSc rgSd rh\R|                  R                  S1\8/\:-   \=S9\R|                  R                  S7\\/5      Se 5       5       ri\R|                  R                  S1\8/\:-   \=S9\R|                  R                  S7\\/5      Sf 5       5       rjSg rk\R|                  R                  S\;\=S9Sh 5       rl\R|                  R                  S7\\/5      Si 5       rmSj rn\R|                  R                  S\;\=S9\R|                  R                  SS S!/5      Sk 5       5       ro\R|                  R                  S"\R                  \R                  /5      \R|                  R                  SlSmSn/5      So 5       5       rp\R|                  R                  S"\R                  \R                  /5      Sp 5       rq\R|                  R                  Sq\Sr4\Ss4/5      St 5       rr\R|                  R                  S7\\/5      Su 5       rs\R|                  R                  S7\\/5      \R|                  R                  SvSw\4Sx-   0Sy4S2\8SS 0Sz4S2S{ 0Sz4S2\8SS|2SS24   0S}4S2S~ 0S}4/5      S 5       5       rt\R|                  R                  SvS\8SS 0S4/5      S 5       ru\R|                  R                  S1\8/\:-   5      \R|                  R                  S"\R                  \R                  /5      S 5       5       rv\R|                  R                  S\-" \8SmS9S/5      S 5       rwS rxS ry\R|                  R                  SS2\R                  " S45      0SS/SxSx//SxS.45      S 5       r{\R|                  R                  S\S4\S4\S4/5      S 5       r|\R|                  R                  S\/S/-   5      S 5       r}\R|                  R                  S2S4S3/5      S 5       r~\R|                  R                  S2S4S3/5      S 5       r\R|                  R                  S\;\=S9\R|                  R                  S,S S!/5      S 5       5       rgs  sn f )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_state   )densesparse_matrixsparse_arrayr)   r*   array_constr)idsalgolloydelkandtypec                    U " SS/SS/SS/SS//US9n/ SQn[         R                  " SS/SS//US9n/ SQnSn[         R                  " SS/S	S//US9nS
n	[        S
SXQS9n
U
R                  X4S9  [	        U
R
                  U5        [        U
R                  U5        [        U
R                  U5        U
R                  U	:X  d   eg )Nr         ?   r1   )   r4   r4   r6   r   r   r4   r4   g      ?g      ?g      ?r(   
n_clustersn_initinit	algorithmsample_weight)
nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_)r,   r.   r1   Xr>   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeanss              U/var/www/html/venv/lib/python3.13/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_resultsrN   ;   s     	q!fsAha1a&9GA M88aVaV,E:L"Oxx%eQZ 8FOqNF
JJqJ.v~~7FOO%56F++-=>>>_,,,    c                    U " SS/SS/SS/SS//5      n[         R                  " SS/SS//5      n[        SSX1S9nUR                  U5        SnSn[	        UR
                  U5        UR                  U:X  d   e / SQnSS/S	S//n[        UR                  U5        [	        UR                  U5        g ! [         a;    / S
QnS	S/SS//n[        UR                  U5        [	        UR                  U5         g f = f)Nr   r3   r4   r6   r(   r8   g      ?r7   g      ?)r4   r4   r   r   r!   r   )r?   r@   r   rA   r   rC   rE   r   rB   rD   AssertionError)	r,   r.   rF   rG   rL   rK   rI   rH   rJ   s	            rM   test_kmeans_relocated_clustersrR   S   s    	q!fsAha1a&9:A 88c3Z!Q01LqNF
JJqMOFOO%56>>_,,,	C&!1Iay16>>?;//1AB C&!3K$56>>?;//1AB	Cs   :8B3 3AC87C8c           
         [         R                  " / SQ5      R                  SS5      nU " U5      n[         R                  " S5      n[         R                  " / SQ5      R                  SS5      n[         R                  " / SQ5      R                  SS5      n[         R                  " / SQ5      n[         R                  " S[         R
                  S9nU [         R                  L a  [        XX4XV5        O0[        UR                  UR                  UR                  UUUUU5        [        U/ S	Q5        [        US
/S/S//5        g )N)
      $g      #ig      !ir4   	         #@
   rU   r4   rX   )rT   rY   )g     0rY   rY   )g      $@r   r   r5   )   r4   r4   irW   )r?   r@   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r,   rF   r>   centers_oldcenters_newweight_in_clusterslabelss          rM   test_relocate_empty_clustersrf   r   s   
 	?@HHQOAQAGGBKM ((,-55b!<K
 ((,-55b!<K,/XXb)Frxx&k8J	
 	(FFIIHH		
 )95K3%"u!56rO   distributionnormalblobstol){Gz?g:0yE>g0.++r   c                 .   [         R                  R                  U5      nU S:X  a  UR                  SS9nO[	        US9u  pVSXUS:  '   U" U5      n[        SUSUS9n[        S	SUSUS
9nUR                  U5        UR                  U5        [        UR                  UR                  5        [        UR                  UR                  5        UR                  UR                  :X  d   eUR                  [        R                  " UR                  SS9:X  d   eg )Nrh   i  rX   sizer'   r      r4   )r9   r'   r:   rj   r0   )r<   r9   r'   r:   rj   ư>)rel)r?   randomRandomStaterh   r   r   rA   r   rD   r   rB   rE   rC   pytestapprox)	rg   r,   rj   global_random_seedrndrF   _km_lloydkm_elkans	            rM   test_kmeans_elkan_resultsr}      s    
 ))

 2
3CxJJJJ's+A!eHQA1CASVWH'H LLOLLOH--x/H/HIx'')9)9:x/////h.?.?T JJJJrO   r<   c           	          [         R                  R                  U5      nUR                  SS9nSn[	        U SUSSUS9R                  U5      nUR                  U:  d   eg )Nrm   rn   i,  rq   r4   r   )r<   r9   r'   r:   rj   max_iter)r?   rt   ru   rh   r   rA   rE   )r<   rx   ry   rF   r   kms         rM   test_kmeans_convergencer      sl     ))

 2
3C



#AH	'
 
c!f  ::   rO   X_csrc           
         [         R                  R                  U5      n[        UR	                  [        R
                  S9-   nUR                  5       n[         R                  " U5      n[         R                  " U5      n[         R                  " UR
                  S   [        R                  S9n[         R                  " UR
                  S   [        R                  S9n[         R                  " [        R
                  S   [        R                  S9n	[        S S n
U S S nU	S S n[        U
UUUU[         R                  R                  U5      SS9nUS:  d   e[        XU5      u  pUS:  d   eX:  d   e[        UUUUU[         R                  R                  U5      SS9nUS:  d   e[        XU5      u  nnUS:  d   eUU:  d   e[        UU5        [        XV5        [        UU5        [        UU5        g )Nrn   r   r5   rX   F)random_reassignr   )r?   rt   ru   r%   rh   shapecopy
zeros_liker]   rF   r1   r\   r   r   r   r   )r   rx   rngrb   centers_old_csrrc   centers_new_csrweight_sumsweight_sums_csrr>   X_mbX_mb_csrsample_weight_mbold_inertiare   new_inertiaold_inertia_csr
labels_csrnew_inertia_csrs                      rM   !test_minibatch_update_consistencyr      s    ))

 2
3CCJJGMMJ::K!&&(O--,KmmO4O((;,,Q/qww?Khh{003177COGGAGGAJagg6M Sb6DSbzH$Sb) #
		01K  *$+NF$$$ '
		01O S    #2O#J S   _,,, vz*K1K1K1rO   c                    U R                   nUR                  [        [        4:X  d   eU R                  n[
        R                  " U5      R                  S   [        :X  d   e[        [        [        U5      S5        U R                  S:  d   eg )Nr   r!   r   )rD   r   r9   
n_featuresrB   r?   uniquer   r   true_labelsrC   )r   r%   re   s      rM   _check_fitted_modelr     sv     !!G==Z4444ZZF99V""1%333 OK8#>;;rO   
input_datar;   rt   	k-means++c                     [         $ Nr%   rF   kr'   s      rM   <lambda>r   "      rO   )rt   r   ndarraycallable	Estimatorc                     [        U[        5      (       a  SOSnU " U[        SUS9R                  U5      n[	        U5        g )NrX   r4   r#   r;   r9   r'   r:   )
isinstancestrr9   rA   r   )r   r   r;   r:   r   s        rM   test_all_initr     s@     dC((RaF	jr&
	c*o  rO   c                     [         $ r   r   r   s      rM   r   r   1  r   rO   c                     [        U [        5      (       a  SOSn[        U [        SUS9n[	        S5       H  nUR                  [        5        M     [        U5        g )NrX   r4   r   r   r"   )r   r   r   r9   rangepartial_fitrF   r   )r;   r:   r   is       rM   &test_minibatch_kmeans_partial_fit_initr   /  sP     dC((RaF	jq
B 3Z
q  rO   zinit, expected_n_init)r   r4   )rt   defaultc                 <    UR                  XR                  S   4S9$ )Nr4   rn   )uniformr   )rF   r9   r'   s      rM   r   r   F  s#    0D0D ''!*- 1E 1rO   r   )
array-liker4   c                    Su  p4n[         R                  R                  X45      nUS:X  a  [         R                  R                  XT5      nUS:X  a  U [        L a  SOSnU " XQSS9R	                  U5      nUR
                  U:X  d   eg)	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"   rX   rq   r   r   r6   rX   autor9   r;   r:   N)r?   rt   randnr   rA   _n_init)r   r;   expected_n_initn_sampler   r9   rF   rL   s           rM   ,test_kmeans_init_auto_with_initial_centroidsr   @  sy    ( (2$H*
		-A|yyz6)#(O;!*GKKANF>>_,,,rO   c                 l   [         R                  " [        5      n[         R                  " [        5      nU " [        [        SUS9R                  [        5      nU " [        USUS9R                  U5      n[        UR                  UR                  5        [        UR                  UR                  5        g )Nr4   r9   r;   r:   r'   )
r?   asfortranarrayrF   r%   r9   rA   r   rD   r   rB   )r   rx   	X_fortrancenters_fortrankm_ckm_fs         rM   test_fortran_aligned_datar   _  s     !!!$I''0OGADV	c!f 	 '	
 
c)n 	 D))4+@+@At||T\\2rO   c                      [        [        SSS9n [        R                  n[	        5       [        l         U R                  [        5        U[        l        g ! U[        l        f = f)Nr#   r4   )r9   r'   verbose)r   r9   sysstdoutr   rA   rF   )r   
old_stdouts     rM   test_minibatch_kmeans_verboser   r  sA    	JR	KBJCJ 
q	
Z
s   A A"rk   c           
         [         R                  R                  S5      R                  SS9n[	        U [
        SSSUSS9R                  U5        UR                  5       n[        R                  " SUR                  5      (       d   e[        R                  " S	UR                  5      (       d   eUS:X  a)  [        R                  " S
UR                  5      (       d   eg [        R                  " SUR                  5      (       d   eg )Nr   rm   rn   r#   rt   r4   )r<   r9   r'   r;   r:   rj   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r?   rt   ru   rh   r   r9   rA   
readouterrresearchout)r<   rj   capsysrF   captureds        rM   test_kmeans_verboser   }  s     			a ''Z'8A
 
c!f  "H99/>>>>9918<<@@@@
axyy.====yy<hllKKKKrO   c                      [         R                  " [        SS9   [        SSS9R	                  [
        5        S S S 5        g ! , (       d  f       g = f)Nz,init_size.* should be larger than n_clustersmatchrX      )	init_sizer9   )rv   warnsRuntimeWarningr   rA   rF    rO   rM   'test_minibatch_kmeans_warning_init_sizer     s;    	M
 	"488;
 
 
   A
Ac                     [         R                  " [        SS9   U " [        [        SS9R                  [        5        S S S 5        g ! , (       d  f       g = f)NzAExplicit initial center position passed: performing only one initr   rX   r;   r9   r:   )rv   r   r   r%   r9   rA   rF   )r   s    rM   'test_warning_n_init_precomputed_centersr     s?     
Q
 	w:bAEEaH	
 
 
s   $A
Ac                 T   [        SSU S9u  pSUS S S2S S 24'   [        SSU SS	9R                  U5      nUR                  R	                  S
S9R                  5       nUS:  d   SU< S35       e[        SSU SS	9R                  U5      nUR                  R	                  S
S9R                  5       nUS:  d   SU< S35       e[        SU SS9n[        S5       H  nUR                  U5        M     UR                  R	                  S
S9R                  5       nUS:  d   SU< S35       eg )Nr"   rq   )r$   r%   r'   r   r(   r   rX   rt   )r9   
batch_sizer'   r;   r4   axisrV   znum_non_zero_clusters=z is too small   )r9   r'   r;   )r   r   rA   rD   anysumr   r   )rx   zeroed_Xr   r   num_non_zero_clustersr   s         rM    test_minibatch_sensible_reassignr     sf    'q/AH HSqS!V	"3EH
	c(m  //333;??A 1$N)?)>(@&NN$ 
#4FX
	c(m  //333;??A 1$N)?)>(@&NN$ 
B5Gh	WB3Z
x   //333;??A 1$N)?)>(@&NN$rO   c                    [         R                  " [        [        45      n[	        [        5       H"  n[
        [        U:H     R                  SS9X#'   M$     [         R                  " [        5      n[         R                  " U5      n[        XUS5      S   * n[        U UUU[         R                  " [        5      [         R                  R                  U5      SSS9  [        XUS5      S   * nXg:  d   e[        U UUU[         R                  " [        5      [         R                  R                  U5      SSS9  [!        XR5        g )Nr   r   r4   T)r   reassignment_ratiogV瞯<)r?   emptyr9   r   r   rF   r   meanr\   r$   
empty_liker   r   r]   rt   ru   r   )r   rx   perfect_centersr   r>   rc   score_beforescore_afters           rM   test_minibatch_reassignr     s     hh
J78O:{a/05515=  GGI&M--0K
 $JPQRSTUUL

		01	 #:k1MaPPK%%% 

		01 	 K1rO   c                  L    [        SS[        SSS9R                  [        5        g )Nr"   rX   r#   T)r9   r   r   r'   r   )r   r$   rA   rF   r   rO   rM   &test_minibatch_with_many_reassignmentsr     s&    
  
c!frO   c                  <   [        SSSS9R                  [        5      n U R                  S:X  d   e[        SSSS9R                  [        5      n U R                  S:X  d   e[        SSS[        S-   S9R                  [        5      n U R                  [        :X  d   eg )NrX   rq   r4   )r9   r   r:         )r9   r   r:   r   )r   rA   rF   
_init_sizer$   r   s    rM   test_minibatch_kmeans_init_sizer     s     
B1Q	?	C	CA	FB==B 
B1Q	?	C	CA	FB==B 
!AQ
	c!f  ==I%%%rO   ztol, max_no_improvement)-C6?N)r   rX   c                    [        SSSS9u  p4n[        SUSUSSSSUS9	nUR                  U5        SUR                  s=:  a  S:  d   e   eU R	                  5       nUc  S	UR
                  ;   d   eUS:X  a  S
UR
                  ;   d   eg g )Nr6   r   T)r%   r'   return_centersr   rX   r4   )	r9   r;   r   rj   r'   r   r:   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   rA   rE   r   r   )r   rj   r   rF   rz   r%   r   r   s           rM   #test_minibatch_declared_convergencer     s     qqNMA'	-

B FF1IrzzB  "H!1X\\AAA
ax;x||KKK rO   c            	         Sn [         R                  S   n[        SU SS9R                  [         5      nUR                  [
        R                  " UR                  U -  U-  5      :X  d   e[        UR                  [        5      (       d   e[        SU SSS SS9R                  [         5      nUR                  S:X  d   eUR                  SU-  U -  :X  d   e[        UR                  [        5      (       d   eg )Nr   r   r6   )r9   r   r'   rX   )r9   r   r'   rj   r   r   )
rF   r   r   rA   rE   r?   ceiln_steps_r   int)r   r$   r   s      rM   test_minibatch_iter_stepsr  ;  s    J
I	A*1	M	Q	QRS	TB ::"++
":i!GHHHHbjj#&&&& 

 
c!f  ::;;2	>j8888bkk3''''rO   c                      [         R                  5       n [        S[        SS9nUR	                  U 5        [        U5        [        U [         5        g )NFr#   )copy_xr9   r'   )rF   r   r   r9   rA   r   r   )my_Xr   s     rM   test_kmeans_copyxr	  T  s:    668D	u"	EBFF4L D!rO   c                    [         R                  R                  U5      R                  SS5      nU " SUSS9nUR	                  U5      R                  U5      nU " SUSS9nUR	                  U5      R                  U5      nXd:  d   eg )Nr"   rX   r4   )r:   r'   r   )r?   rt   ru   r   rA   score)r   rx   rF   km1s1km2s2s          rM   test_score_max_iterr  _  s}     			0177R@A
1+=
JC			!	B
1+=
KC			!	B7N7rO   zEstimator, algorithmr   c                    [        SSSUS9u  pgU" XdS9nU " SSSUUS9nUb  UR                  US9  UR                  U5        UR                  n	UR	                  U5      n
[        X5        UR                  U5      n
[        X5        UR	                  UR                  5      n
[        U
[        R                  " S5      5        g )Nr   rX   r$   r   r%   r'   r5   rt   )r9   r;   r:   r   r'   )r<   )
r   
set_paramsrA   rB   predictr   fit_predictrD   r?   arange)r   r<   r,   r   global_dtyperx   rF   rz   r   re   preds              rM   test_kmeans_predictr  l  s     "b?QDA 	Q+A	'
B 
	*FF1IZZF ::a=Dt$ >>!Dt$ ::b))*DtRYYr]+rO   c                 `   [         R                  R                  U5      R                  [        45      nU " [
        USS9nUR                  [        US9  U " [
        USS9nUR                  XS9  [        UR                  UR                  5        [        UR                  UR                  5        g Nr4   r9   r'   r:   r=   )r?   rt   ru   random_sampler$   r9   rA   rF   r   rB   r   rD   )r   r   rx   r>   km_dense	km_sparses         rM   test_dense_sparser     s     II))*<=KK	M ,>qH LL-L0,>qI MM%M5x''):):;H--y/I/IJrO   )rt   r   r   c                 6   [        U[        5      (       a  SOSnU " [        XSS9nUR                  U5        [	        UR                  [        5      UR                  5        UR                  [        5        [	        UR                  U5      UR                  5        g )NrX   r4   r   r   )r   r   r9   rA   r   r  rF   rB   )r   r;   r   r:   r   s        rM   test_predict_dense_sparser"    si     dC((RaF	jtQR	SBFF5Mrzz!}bjj1FF1Irzz%("**5rO   r   c           	      (   [         R                  " SS/SS/SS/SS/SS/SS//5      nU" XRS	9nUS
:X  a  SOSnUS
:X  a  US S OUnU " SX7US9nU [        L a  UR                  SS9  UR	                  U5        UR
                  R                  [         R                  :X  d   e/ SQn	[        [        UR                  U	5      S5        U [        L aE  [        U5      R                  U5      nUR
                  R                  [         R                  :X  d   eg g )Nr   rX      rV   rU   r4   r(   rZ   r5   r   r   )r   )r   r4   r4   r   r   r4   r!   )r?   r@   r   r  rA   rD   r1   float64r   r   rB   r   r   )
r   r,   r1   r;   rx   X_denserF   r:   r   rH   s
             rM   test_integer_inputr'    s    hhAR2q'B7QFQGLMGW*A)#QF)+72A;D	4=O
B O#
#FF1I $$

222(OOBJJ@#F O#2Y""1%""((BJJ666 $rO   c                    U " [         US9R                  [        5      nUR                  UR                  5      n[        U[        UR                  5      5        [        UR                  5       [        R                  " [         5      5        UR                  [        5      n[        U[        [        UR                  5      5        g )Nr9   r'   )r9   rA   rF   	transformrD   r   r   r   diagonalr?   r]   )r   rx   r   Xts       rM   test_transformr-    s     
j7I	J	N	Nq	QB 
b))	*BB*2+>+>?@r{{}bhhz&:; 
aBB*1b.A.ABCrO   c                     U " USS9R                  [        5      R                  [        5      nU " USS9R                  [        5      n[	        X#5        g )Nr4   )r'   r:   )rA   rF   r*  fit_transformr   )r   rx   X1X2s       rM   test_fit_transformr2    sG     
 21	=	A	A!	D	N	Nq	QB	 21	=	K	KA	NBBrO   c           	          [         R                  nS H9  n[        [        SUU SS9R	                  [
        5      nUR                  U::  a  M9   e   g )N)r4   rq   rX   rt   r4   )r9   r;   r:   r'   r   )r?   infr   r9   rA   rF   rC   )rx   previous_inertiar:   r   s       rM   test_n_initr6    sT    vv !+
 #a& 	 {{.... rO   c                    [        [        [        S U S9u  pnUR                  [        [        4:X  d   e[
        R                  " U5      R                  S   [        :X  d   e[        [        [        U5      S5        US:  d   eg )N)r9   r>   r'   r   r!   r   )
r   rF   r9   r   r   r?   r   r   r   r   )rx   cluster_centersre   inertias       rM   test_k_means_functionr:    sw    '.	jCU($OW   Z$<<<<99V""1%333 OK8#>S==rO   c                    U " SUS9n0 n0 n0 n0 n[         R                  [         R                  4 H  nUR                  USS9n	UR	                  U	5        UR
                  XH'   UR                  U	5      XX'   UR                  Xh'   UR                  Xx'   UR                  R                  U:X  d   eU [        L d  M  UR                  U	SS 5        UR                  R                  U:X  a  M   e   [        U[         R                     U[         R                     SS9  [        U[         R                     U[         R                     U[         R                     R                  5       S-  S	9  [        U[         R                     U[         R                     U[         R                     R                  5       S-  S	9  [        U[         R                     U[         R                     5        g )
Nr4   )r:   r'   Fr   r   r6   r   rtol)atol)r?   r%  float32astyperA   rC   r*  rD   rB   r1   r   r   r   maxr   )
r   r   rx   r   r9  r,  r%   re   r1   rF   s
             rM   test_float_precisionrC    s    
!*<	=BG	BGF**bjj)e%0
q	LLO	,,

 ""((E111 'NN1Qq6"&&,,555 *& GBJJ')<4HBrzzNBrzzNBJJ9K9K9MPT9TU

WRZZ0wrzz7J7N7N7PSW7W vbjj)6"**+=>rO   c                     [         R                  USS9n[        R                  USS9nU " U[        SS9nUR	                  U5        [
        R                  " UR                  U5      (       a   eg )NFr<  r4   r   )rF   rA  r%   r9   rA   r?   may_share_memoryrD   )r   r1   
X_new_typecenters_new_typer   s        rM   test_centers_not_mutatedrH  =  sg     %e,J~~e%~8	(Z	JBFF:""2#6#68HIIIIIrO   c                     [        [        S9R                  U 5      n[        [        UR                  SS9R                  U 5      n[	        UR                  UR                  5        g )N)r9   r4   r   )r   r9   rA   rD   r   )r   r  r  s      rM   test_kmeans_init_fitted_centersrJ  L  sS     J
'
+
+J
7C
JS-A-A!
L
P
PC C((#*>*>?rO   c                 D   [         R                  " SS/SS/SS/SS//5      n[        SU S9nSn[        R                  " [
        US9   UR                  U5        [        UR                  5      [        [        S5      5      :X  d   e S S S 5        g ! , (       d  f       g = f)Nr   r4      r)  zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.r   r6   )
r?   asarrayr   rv   r   r   rA   setrB   r   )rx   rF   r   msgs       rM   1test_kmeans_warns_less_centers_than_unique_pointsrP  \  s    


QFQFQFQF34A	1+=	>B	D  
(	4
q	 2::#eAh-///	 
5	4	4s   ?B
Bc                 ,    [         R                  " U SS9$ Nr   r   )r?   sortr   s    rM   _sort_centersrT  m  s    777##rO   c                 D   [         R                  R                  U 5      R                  SS[        S9n[         R
                  " [        USS9n[        [        S[        U S9n[        U5      R                  [        US9n[         R
                  " UR                  U5      n[        U5      R                  U5      n[        UR                  U5        [        UR                  UR                  5        [        [!        UR"                  5      [!        UR"                  5      5        g )Nr4   rq   rn   r   r   )r;   r:   r9   r'   r=   )r?   rt   ru   randintr$   repeatrF   r   r%   r9   r   rA   rB   r   r   rC   rT  rD   )rx   r>   X_repeatr   km_weightedrepeated_labelskm_repeateds          rM   test_weighted_vs_repeatedr\  q  s    
 II))*<=EE	19 F M yyM2H	Q:DV
B )---?Kii 3 3]CO)--)K{**O<K((+*>*>?k223k223rO   c                 2   [         R                  " [        5      nU " [        USS9n[	        U5      R                  US S9n[	        U5      R                  XS9n[        UR                  UR                  5        [        UR                  UR                  5        g r  )
r?   r\   r$   r9   r   rA   r   rB   r   rD   )r   r   rx   r>   r   km_nonekm_oness          rM   test_unit_weights_vs_no_weightsr`    st     GGI&M	j7IRS	TBBimmJdm;GBimmJmDGw8G,,g.F.FGrO   c                 d   [         R                  R                  U5      R                  [        S9nU " [
        USS9n[        U5      R                  XS9n[        U5      R                  USU-  S9n[        UR                  UR                  5        [        UR                  UR                  5        g )Nrn   r4   r  r=   r3   )r?   rt   ru   r   r$   r9   r   rA   r   rB   r   rD   )r   r   rx   r>   r   km_orig	km_scaleds          rM   test_scaled_weightsrd    s     II))*<=EE9EUM	j7IRS	TBBimmJmDGb	jm8KLIw	(9(9:G,,i.H.HIrO   c                  b    [        SSS9R                  [        5      n U R                  S:X  d   eg )Nr0   r4   )r<   r   )r   rA   rF   rE   r   s    rM    test_kmeans_elkan_iter_attributerf    s+     
'A	.	2	21	5B::??rO   c                    U " S/S//5      nSS/n[         R                  " S/S//5      n[        SUSS9nUR                  XS9  [	        [        UR                  5      5      S:X  d   e[        UR                  S/S//5        g )	NrU   r4   gffffff?g?rX   r(   r   r=   )	r?   r@   r   rA   lenrN  rB   r   rD   )r,   rF   r>   r;   r   s        rM   #test_kmeans_empty_cluster_relocatedri    s     	rdQC[!A#JM88bTB4L!D	14	2BFF1F*s2::1$$$B''2$5rO   c                    [         R                  R                  U5      nUR                  SS9n[	        5       R                  SSS9   U " [        US9R                  U5      R                  nS S S 5        [	        5       R                  SSS9   U " [        US9R                  U5      R                  nS S S 5        [        WW5        g ! , (       d  f       N`= f! , (       d  f       N,= f)N)2   rX   rn   r4   openmp)limitsuser_apir)  r(   )
r?   rt   ru   rh   r   limitr9   rA   rB   r   )r   rx   ry   rF   result_1result_2s         rM   #test_result_equal_in_diff_n_threadsrr    s     ))

 2
3C


!A	#	%	+	+1x	+	H:LMSVW 	 
I 
$	%	+	+1x	+	H:LMSVW 	 
I x* 
I	H 
I	Hs   %C%C
C
C%c                      [         R                  " [        SS9   [        SSS9R	                  [
        5        S S S 5        g ! , (       d  f       g = f)Nz9algorithm='elkan' doesn't make sense for a single clusterr   r4   r0   )r9   r<   )rv   r   r   r   rA   rF   r   rO   rM   test_warning_elkan_1_clusterrt    s;    	I
 	!w/33A6	
 
 
r   c                 "   [         R                  R                  U5      R                  SS9nUS S nU " U5      nS nU" X45      u  pg[	        SSXASS9R                  U5      nUR                  n	UR                  n
[        Xi5        [        Xz5        g )N)r"   rq   rn   rq   c                     UR                  5       n[        X5      n[        UR                  S   5       H  nXU:H     R	                  SS9X$'   M     [        X5      nX24$ rR  )r   r   r   r   r   )rF   r;   new_centersre   labels        rM   	py_kmeans+test_k_means_1_iteration.<locals>.py_kmeans  s^    iik*134::a=)E!"U?!3!8!8a!8!@K **1:""rO   r4   )r9   r:   r;   r<   r   )
r?   rt   ru   r   r   rA   rB   rD   r   r   )r,   r.   rx   rF   rG   ry  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              rM   test_k_means_1_iterationr    s    
 			0199x9HARa5LQA# &a6IQ\A	c!f  !!I++Jy,J+rO   squaredTFc           	      D   [         R                  R                  U5      n[        R                  " SSSSX0S9nUR	                  5       R                  S5      nUR                  S5      R                  U SS9nUS	-  R                  5       nXV-
  S	-  R                  5       nU(       a  UO[         R                  " U5      n[        XVU5      n	[        UR                  UR                  XgU5      n
U [         R                  :X  a  S
OSn[        XUS9  [        XUS9  [        XUS9  g )Nr4   r"   r3   csrdensityformatr'   r1   rU   Fr<  r(   r   gHz>r=  )r?   rt   ru   sptoarrayr[   r   rA  r   sqrtr
   r   r_   r`   r@  r   )r1   r  rx   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denser>  s               rM   test_euclidean_distancer    s    
 ))

 2
3Cyy	3EH  ((,G		#e%0AdZZ\N"'')H"x(9H9'gN;x''G BJJ&4DD(dK(>)$?rO   c           	      $   [         R                  R                  U5      n[        R                  " SSSSX S9nUR	                  5       nUR                  S5      R                  U SS9nUR                  SS5      R                  U SS9nUR                  SS[         R                  S	9nXFU   -
  S
-  R                  SS9n[         R                  " X-  5      n	[        XEXgSS9n
[        X5XgSS9nU [         R                  :X  a  SOSn[        XUS9  [        XUS9  [        XUS9  SnX}:H  nXN   Xm   -
  S
-  R                  SS9n[         R                  " XU   -  5      n	[        XEXgSUS9n
[        X5XgSUS9n[        XUS9  [        XUS9  [        XUS9  g )Nr"   rX   r3   r  r  Fr<  rq   )ro   r1   r(   r4   r   )	n_threadsr   rr   r=  )r  single_label)r?   rt   ru   r  r  r   rA  rV  r^   r   r   r   r@  r   )r1   rx   r   X_sparser&  r>   r%   re   	distancesr  inertia_denseinertia_sparser>  rx  masks                  rM   test_inertiar    s    ))

 2
3CyyRUH  GIIcN))%e)<Mii2%%e%%8G[[BHH[5FFO+166A6>Ivvi/0H"77VWXM$AN BJJ&4DDM=M$7N48 E?D-'.0Q6;;;CIvvi"556H"15M %AEN M=M$7N48rO   zKlass, default_n_initrX   r6   c                     U " SSS9nUR                  [        5        UR                  S:X  d   eU " SSS9nUR                  [        5        U R                  S:X  a  UR                  S:X  d   eg g )Nr   r   )r:   r;   r4   rt   r   rX   )rA   rF   r   __name__)Klassdefault_n_initests      rM   test_n_init_autor  I  sd    
vK
0CGGAJ;;!
vH
-CGGAJ %( :3;;"AArO   c                     [         R                  " S/S/S//5      n[         R                  " / SQ5      nU " SSS9R                  XS9  [        U[         R                  " / SQ5      5        g )Nr4   r(   rL  )r3   g?g333333?r   r)  r=   )r?   r@   rA   r   )r   rF   r>   s      rM   test_sample_weight_unchangedr  T  sW     	1#sQC!AHH_-M+///O}bhh&?@rO   zparam, matchr9   r4   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                     U S S $ )Nr(   r   X_r   r'   s      rM   r   r   i  s
    BQrO   rZ   zUThe shape of the initial centers .* does not match the number of features of the datac                     U S S2S S24   $ )NrZ   r(   r   r  s      rM   r   r   s  s    BQBFrO   c                     U " SS9n[         R                  " [        US9   UR                  " S0 UD6R	                  [
        5        S S S 5        g ! , (       d  f       g = f)Nr4   )r:   r   r   )rv   raises
ValueErrorr  rA   rF   )r   paramr   r   s       rM   test_wrong_paramsr  ^  sB    > 
!	B	z	/
""1% 
0	/	/s   &A
Ax_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc                     [         R                  " [        US9   [        [        [
        40 U D6  S S S 5        g ! , (       d  f       g = f)Nr   )rv   r  r  r	   rF   r9   )r  r   s     rM   !test_kmeans_plusplus_wrong_paramsr    s-     
z	/:// 
0	/	/s	   9
Ac                 @   U R                  U5      n[        U[        US9u  pEUR                  S   [        :X  d   eUS:  R	                  5       (       d   eXSR                  S   :*  R	                  5       (       d   eUR                  S   [        :X  d   eUR                  SS9UR                  SS9:*  R	                  5       (       d   eUR                  SS9UR                  SS9:  R	                  5       (       d   e[        [        U   R                  U5      U5        g )Nrp   r   r   )	rA  r	   r9   r   allrB  minr   rF   )r   r1   rx   r_   r%   r`   s         rM   test_kmeans_plusplus_outputr    s    U#D&j'9G ==z)))qLzz!}$))++++ ==z)))KKQK4888#3388::::KKQK4888#3388::::
 AgJ%%e,g6rO   r  c                 T    [        [        [        U S9u  p[        [        U   U5        g )N)r  )r	   rF   r9   r   )r  r%   r`   s      rM   test_kmeans_plusplus_normsr    s#     'q*oVGAgJ(rO   c                     [        [        [        U S9u  p[        R                  " [        5      n[        U[        U S9u  pB[        X5        g )Nrp   )r	   rF   r9   r?   r   r   )rx   	centers_crz   r   r   s        rM   test_kmeans_plusplus_dataorderr    sB    "1j?QRLI!!!$I(:,>O I/rO   c                  T   [         R                  " / SQ[         R                  S9n [        X S5      (       d   e[         R                  " / SQ[         R                  S9n[        XS5      (       d   e[         R                  " / SQ[         R                  S9n[        XS5      (       a   eg )N)r4   r   r   r4   r(   r   r(   r4   r5   r6   )r   r(   r(   r   r4   r(   r4   r   )r4   r   r   r(   r(   r   r(   r4   )r?   r@   r^   r   )labels1labels2labels3s      rM   test_is_same_clusteringr    s    hh/rxx@Gw3333 hh/rxx@Gw3333 hh/rxx@G"7Q77777rO   kwargs)r;   r:   c                     [         R                  " SS/SS/SS/SS//[         R                  S9n[        SSS0U D6nUR	                  U5        g)	zRCheck that init works with numpy scalar strings.

Non-regression test for #21964.
r   r3   r4   r5   r9   r(   Nr   )r?   rM  r%  r   rA   )r  rF   
clusterings      rM   -test_kmeans_with_array_like_or_np_scalar_initr    sO     	

QFS!HsAhA7rzzJA/1//JNN1rO   zKlass, methodrA   r   c                    U R                   R                  5       nU " 5       n[        X15      " [        5        UR                  R
                  S   nUR                  5       n[        [        U5       Vs/ s H  ob U 3PM
     snU5        gs  snf )z=Check `feature_names_out` for `KMeans` and `MiniBatchKMeans`.r   N)	r  lowergetattrrF   rD   r   get_feature_names_outr   r   )r  method
class_namerL   r9   	names_outr   s          rM   test_feature_names_outr    sx     %%'JWFFA((..q1J,,.IE*4EF4Eq,qc*4EF	RFs   2B
csr_containerc                    [        SSSSS9u  pU b  U " U5      n[        5       nUR                  U5      n[        UR                  5      Ul        [        UR
                  5      Ul        UR                  U5      n[        XE5        g)zWCheck that predict does not change cluster centers.

Non-regression test for gh-24253.
r   rX   r   r  N)r   r   r  r   rD   rB   r  r   )r  rF   rz   rL   y_pred1y_pred2s         rM   ,test_predict_does_not_change_cluster_centersr    sv     BQODA !XF  #G78O8OPF.v~~>FNnnQGw(rO   c           
      >   [         R                  R                  U5      n[        SSSUS9u  p4[	        USS9n[        5       nUR                  UUU UR                  UR                  S   S9S[         R                  R                  U5      S	9nUR                  UUU [         R                  " UR                  S   5      S[         R                  R                  U5      S	9n[        R                  " [        5         [        Xx5        S
S
S
5        g
! , (       d  f       g
= f)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   rX   r  Tr  r   rn   rq   rF   r  r;   r>   n_centroidsr'   N)r?   rt   ru   r   r   r   _init_centroidsr   r   r\   rv   r  rQ   r   )	r;   rx   r   rF   rz   r  rL   clusters_weightedclusterss	            rM   test_sample_weight_initr    s     ))

 2
3C"b?QDA  40OXF..
'kkqwwqzk2YY**+=> /  %%
'ggaggaj)YY**+=> & H 
~	&)4 
'	&	&s   9D
Dc           
         [         R                  R                  U5      n[        SSSUS9u  p4UR	                  UR
                  S   S9nSUSSS2'   [        USS	9n[        5       nUR                  UUU US
[         R                  R                  U5      S9n[        USSS2   U5      n	[         R                  " [         R                  " U	S5      5      (       a   eg)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"   rq   r  r   rn   Nr(   Tr  rX   r  )r?   rt   ru   r   r   r   r   r   r  r   r   isclose)
r;   rx   r   rF   rz   r>   r  rL   r  ds
             rM   test_sample_weight_zeror  '  s     ))

 2
3C!Q=ODA KKQWWQZK0MM#A#40OXF..
'#YY**+=> /  	AccF$56AvvbjjA&'''''rO   c                    [         R                  " SS/SS/SS/SS/SS//5      n[        SX S9nSn[        R                  " [
        US9   UR                  U" U5      5        SSS5        UR                  S:X  d   eg! , (       d  f       N!= f)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   r4   rq   )r9   r;   r<   zENumber of distinct clusters \(4\) found smaller than n_clusters \(5\)r   N)r?   r@   r   rv   r   r   rA   rE   )r<   r,   rF   r   rO  s        rM   test_relocating_with_duplicatesr  E  s     	1a&1a&1a&1a&1a&9:A	11	:B
RC	(	4
|A 
5 ::?? 
5	4s   A>>
B)__doc__r   r   ior   numpyr?   rv   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   r@   r%   r$   r   r9   r   rF   r   X_as_any_csrdata_containersrh  data_containers_idsmarkparametrizer@  r%  rN   rR   rf   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r   r"  r^   int64r'  r-  r2  r6  r:  rC  rH  rJ  rP  rT  r\  r`  rd  rf  ri  rr  rt  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r  r  r  )	containers   0rM   <module>r     s    	 
      M M   F ' 1 I 3 8 
 , . = ((!!! 	  
Jc; /==n	!n=88*~- <A /
?	#  >QR'7!342::rzz":;- < 5 S-* >QR'7!34C 5 SC: >QR&7 S&7R (G)<=>QR 78K 9 S >K6 w&89! :!$ ,/<2 0<2~ C,  
 
{G%GH6  
 v&?@ A 
{G%GH6  
	
	  		
 	
 v&?@- A-  v&?@3 A3$  w&89q	*L + :L2< v&?@I AIOB C,  
+2
+2\&$ 2\74KLL ML6(2 v&?@	 A	 >QRg)OT+BC aX. , /	 S ,F ,/v&?@K A 0K$ ,/
X{G,2T   v&?@
6 A 0

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