
    /Цi.                        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  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K0J1r1  SSK2J3r3  \Rh                  " / SQ/ SQ/ SQ/5      r5Sr6\5Rn                  u  r8r9\ " \6\5SSS9u  r:r;\1 V s/ s H
  o " \:5      PM     sn r<\Rh                  /\1-   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       rD\R                  R                  S\=\?S9\R                  R                  S S!S"/5      S% 5       5       rE\R                  R                  S\=\?S9S& 5       rF\R                  R                  S'S(S)/5      \R                  R                  S\=\?S9\R                  R                  S*/ S+Q5      S, 5       5       5       rG\R                  R                  S-S!S"/5      S. 5       rH\R                  R                  S/\<5      S0 5       rIS1 rJ\R                  R                  S2\:/\<-   \?S9\R                  R                  S3S4S5\5R                  5       S6 // S7QS9\R                  R                  S8\\/5      S9 5       5       5       rL\R                  R                  S3S4S5\5S: // S7QS9S; 5       rM\R                  R                  S<S=S>S? S@4SA/5      \R                  R                  S8\\/5      SB 5       5       rN\R                  R                  S8\\/5      SC 5       rOSD rP\R                  R                  S-S!S"/5      \R                  R                  S*SES/5      SF 5       5       rQSG rR\R                  R                  S8\\/5      SH 5       rSSI rT\R                  R                  S2\:/\<-   \?S9SJ 5       rUSK rVSL rW\R                  R                  SMSNSO/5      SP 5       rXSQ rYSR rZ\R                  R                  S8\\/5      SS 5       r[\R                  R                  S\=\?S9\R                  R                  ST\S!4\S"4\S4/5      \R                  R                  SUSS/5      SV 5       5       5       r\\R                  R                  S/\<5      \R                  R                  S8\\/5      SW 5       5       r]\R                  R                  S/\<5      \R                  R                  S3S4S5\5// SXQS9\R                  R                  S8\\/5      SY 5       5       5       r^\R                  R                  S\=\?S9\R                  R                  S#\R                  \R                  /5      \R                  R                  S3S5SZ/5      \R                  R                  S8\\/5      S[ 5       5       5       5       ra\R                  R                  S8\\/5      S\ 5       rb\R                  R                  S8\\/5      S] 5       rcS^ rdS_ re\R                  R                  S2\:/\<-   \?S9\R                  R                  S8\\/5      \R                  R                  \g" S` \" 5        5       5      (       + SaSb9Sc 5       5       5       rh\R                  R                  S#\R                  \R                  \R                  \R                  /5      \R                  R                  S8\\/5      Sd 5       5       ri\R                  R                  S2\:/\<-   \?S9Se 5       rjSf rkSg rlSh rm\R                  R                  S2\:/\<-   \?S9\R                  R                  S8\\/5      Si 5       5       rn\R                  R                  S2\:/\<-   \?S9\R                  R                  S8\\/5      Sj 5       5       roSk rp\R                  R                  S\=\?S9Sl 5       rq\R                  R                  S8\\/5      Sm 5       rrSn rs\R                  R                  S\=\?S9\R                  R                  S S!S"/5      So 5       5       rt\R                  R                  S#\R                  \R                  /5      \R                  R                  SpSqSr/5      Ss 5       5       ru\R                  R                  S#\R                  \R                  /5      St 5       rv\R                  R                  Su\Sv4\Sw4/5      Sx 5       rw\R                  R                  S8\\/5      Sy 5       rx\R                  R                  S8\\/5      \R                  R                  SzS{\6S|-   0S}4S3\:SS 0S~4S3S 0S~4S3\:SS2SS24   0S4S3S 0S4/5      S 5       5       ry\R                  R                  SzS\:SS 0S4/5      S 5       rz\R                  R                  S2\:/\<-   5      \R                  R                  S#\R                  \R                  /5      S 5       5       r{\R                  R                  S\/" \:SqS9S/5      S 5       r|S r}S r~\R                  R                  SS3\R                  " S55      0SS/S|S|//S|S.45      S 5       r\R                  R                  S\S4\S4\S4/5      S 5       r\R                  R                  S\1S/-   5      S 5       r\R                  R                  S3S5S4/5      S 5       r\R                  R                  S3S5S4/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)threadpool_info)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         ?   r2   )   r5   r5   r7   r   r   r5   r5   g      ?g      ?g      ?r)   
n_clustersn_initinit	algorithmsample_weight)
nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_)r-   r/   r2   Xr?   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeanss              a/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_resultsrO   <   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   r4   r5   r7   r)   r9   g      ?r8   g      ?)r5   r5   r   r   r"   r    )r@   rA   r   rB   r   rD   rF   r   rC   rE   AssertionError)	r-   r/   rG   rH   rM   rL   rJ   rI   rK   s	            rN   test_kmeans_relocated_clustersrS   T   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      !ir5   	         #@
   rV   r5   rY   )rU   rZ   )g     0rZ   rZ   )g      $@r   r   r6   )   r5   r5   irX   )r@   rA   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r-   rG   r?   centers_oldcenters_newweight_in_clusterslabelss          rN   test_relocate_empty_clustersrg   s   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6rP   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 )Nri   i  rY   sizer(   r      r5   )r:   r(   r;   rk   r1   )r=   r:   r(   r;   rk   ư>)rel)r@   randomRandomStateri   r   r   rB   r   rE   r   rC   rF   rD   pytestapprox)	rh   r-   rk   global_random_seedrndrG   _km_lloydkm_elkans	            rN   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JrP   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 )Nrn   ro   i,  rr   r5   r   )r=   r:   r(   r;   rk   max_iter)r@   ru   rv   ri   r   rB   rF   )r=   ry   rz   rG   r   kms         rN   test_kmeans_convergencer      sl     ))

 2
3C



#AH	'
 
c!f  ::   rP   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 )Nro   r   r6   rY   F)random_reassignr    )r@   ru   rv   r&   ri   shapecopy
zeros_liker^   rG   r2   r]   r   r   r   r   )r   ry   rngrc   centers_old_csrrd   centers_new_csrweight_sumsweight_sums_csrr?   X_mbX_mb_csrsample_weight_mbold_inertiarf   new_inertiaold_inertia_csr
labels_csrnew_inertia_csrs                      rN   !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1rP   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    )rE   r   r:   
n_featuresrC   r@   uniquer   r   true_labelsrD   )r   r&   rf   s      rN   _check_fitted_modelr     sv     !!G==Z4444ZZF99V""1%333 OK8#>;;rP   
input_datar<   ru   	k-means++c                 *    [         R                  5       $ Nr&   r   rG   kr(   s      rN   <lambda>r   #  s
    w||~rP   )ru   r   ndarraycallable	Estimatorc                     [        U[        5      (       a  SOSnU " U[        SUS9R                  U5      n[	        U5        g )NrY   r5   r$   r<   r:   r(   r;   )
isinstancestrr:   rB   r   )r   r   r<   r;   r   s        rN   test_all_initr     s@     dC((RaF	jr&
	c*o  rP   c                 *    [         R                  5       $ r   r   r   s      rN   r   r   2  s
    rP   c                     [        U S5      (       a  U R                  5       n [        U [        5      (       a  SOSn[	        U [
        SUS9n[        S5       H  nUR                  [        5        M     [        U5        g )Nr   rY   r5   r   r   r#   )
hasattrr   r   r   r   r:   rangepartial_fitrG   r   )r<   r;   r   is       rN   &test_minibatch_kmeans_partial_fit_initr   0  sj     tVyy{ dC((RaF	jq
B 3Z
q  rP   zinit, expected_n_init)r   r5   )ru   defaultc                 <    UR                  XR                  S   4S9$ )Nr5   ro   )uniformr   )rG   r:   r(   s      rN   r   r   K  s#    0D0D ''!*- 1E 1rP   r   )
array-liker5   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#   rY   rr   r   r   r7   rY   autor:   r<   r;   N)r@   ru   randnr   rB   _n_init)r   r<   expected_n_initn_sampler   r:   rG   rM   s           rN   ,test_kmeans_init_auto_with_initial_centroidsr   E  sy    ( (2$H*
		-A|yyz6)#(O;!*GKKANF>>_,,,rP   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 )Nr5   r:   r<   r;   r(   )
r@   asfortranarrayrG   r&   r:   rB   r   rE   r   rC   )r   ry   	X_fortrancenters_fortrankm_ckm_fs         rN   test_fortran_aligned_datar   d  s     !!!$I''0OGADV	c!f 	 '	
 
c)n 	 D))4+@+@At||T\\2rP   c                      [        [        SSS9n [        R                  n[	        5       [        l         U R                  [        5        U[        l        g ! U[        l        f = f)Nr$   r5   )r:   r(   verbose)r   r:   sysstdoutr   rB   rG   )r   
old_stdouts     rN   test_minibatch_kmeans_verboser   w  sA    	JR	KBJCJ 
q	
Z
s   A A"rl   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   rn   ro   r$   ru   r5   )r=   r:   r(   r<   r;   rk   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r@   ru   rv   ri   r   r:   rB   
readouterrresearchout)r=   rk   capsysrG   captureds        rN   test_kmeans_verboser     s     			a ''Z'8A
 
c!f  "H99/>>>>9918<<@@@@
axyy.====yy<hllKKKKrP   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matchrY      )	init_sizer:   )rw   warnsRuntimeWarningr   rB   rG    rP   rN   '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   rY   r<   r:   r;   )rw   r   r   r&   r:   rB   rG   )r   s    rN   '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#   rr   )r%   r&   r(   r   r)   r   rY   ru   )r:   
batch_sizer(   r<   r5   axisrW   znum_non_zero_clusters=z is too small   )r:   r(   r<   )r   r   rB   rE   anysumr   r   )ry   zeroed_Xr   r   num_non_zero_clustersr   s         rN    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$rP   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   r5   T)r   reassignment_ratiogV瞯<)r@   emptyr:   r   r   rG   r   meanr]   r%   
empty_liker   r   r^   ru   rv   r   )r   ry   perfect_centersr   r?   rd   score_beforescore_afters           rN   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1rP   c                  L    [        SS[        SSS9R                  [        5        g )Nr#   rY   r$   T)r:   r   r   r(   r   )r   r%   rB   rG   r   rP   rN   &test_minibatch_with_many_reassignmentsr     s&    
  
c!frP   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 )NrY   rr   r5   )r:   r   r;         )r:   r   r;   r   )r   rB   rG   
_init_sizer%   r   s    rN   test_minibatch_kmeans_init_sizer     s     
B1Q	?	C	CA	FB==B 
B1Q	?	C	CA	FB==B 
!AQ
	c!f  ==I%%%rP   ztol, max_no_improvement)-C6?N)r   rY   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 )Nr7   r   T)r&   r(   return_centersr   rY   r5   )	r:   r<   r   rk   r(   r   r;   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   rB   rF   r   r   )r   rk   r   rG   r{   r&   r   r   s           rN   #test_minibatch_declared_convergencer  $  s     qqNMA'	-

B FF1IrzzB  "H!1X\\AAA
ax;x||KKK rP   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   r7   )r:   r   r(   rY   )r:   r   r(   rk   r   r   )
rG   r   r   rB   rF   r@   ceiln_steps_r   int)r   r%   r   s      rN   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''''rP   c                      [         R                  5       n [        S[        SS9nUR	                  U 5        [        U5        [        U [         5        g )NFr$   )copy_xr:   r(   )rG   r   r   r:   rB   r   r   )my_Xr   s     rN   test_kmeans_copyxr
  Y  s:    668D	u"	EBFF4L D!rP   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#   rY   r5   )r;   r(   r   )r@   ru   rv   r   rB   score)r   ry   rG   km1s1km2s2s          rN   test_score_max_iterr  d  s}     			0177R@A
1+=
JC			!	B
1+=
KC			!	B7N7rP   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   rY   r%   r   r&   r(   r6   ru   )r:   r<   r;   r   r(   )r=   )
r   
set_paramsrB   rC   predictr   fit_predictrE   r@   arange)r   r=   r-   r   global_dtypery   rG   r{   r   rf   preds              rN   test_kmeans_predictr  q  s     "b?QDA 	Q+A	'
B 
	*FF1IZZF ::a=Dt$ >>!Dt$ ::b))*DtRYYr]+rP   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 Nr5   r:   r(   r;   r>   )r@   ru   rv   random_sampler%   r:   rB   rG   r   rC   r   rE   )r   r   ry   r?   km_dense	km_sparses         rN   test_dense_sparser!    s     II))*<=KK	M ,>qH LL-L0,>qI MM%M5x''):):;H--y/I/IJrP   )ru   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 )NrY   r5   r   r   )r   r   r:   rB   r   r  rG   rC   )r   r<   r   r;   r   s        rN   test_predict_dense_sparser#    si     dC((RaF	jtQR	SBFF5Mrzz!}bjj1FF1Irzz%("**5rP   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   rY      rW   rV   r5   r)   r[   r6   r   r   )r   )r   r5   r5   r   r   r5   r"   )r@   rA   r   r  rB   rE   r2   float64r   r   rC   r   r   )
r   r-   r2   r<   ry   X_denserG   r;   r   rI   s
             rN   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 $rP   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r:   r(   )r:   rB   rG   	transformrE   r   r   r   diagonalr@   r^   )r   ry   r   Xts       rN   test_transformr.    s     
j7I	J	N	Nq	QB 
b))	*BB*2+>+>?@r{{}bhhz&:; 
aBB*1b.A.ABCrP   c                     U " USS9R                  [        5      R                  [        5      nU " USS9R                  [        5      n[	        X#5        g )Nr5   )r(   r;   )rB   rG   r+  fit_transformr   )r   ry   X1X2s       rN   test_fit_transformr3    sG     
 21	=	A	A!	D	N	Nq	QB	 21	=	K	KA	NBBrP   c           	          [         R                  nS H9  n[        [        SUU SS9R	                  [
        5      nUR                  U::  a  M9   e   g )N)r5   rr   rY   ru   r5   )r:   r<   r;   r(   r   )r@   infr   r:   rB   rG   rD   )ry   previous_inertiar;   r   s       rN   test_n_initr7    sT    vv !+
 #a& 	 {{.... rP   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)r:   r?   r(   r   r"   r    )
r	   rG   r:   r   r   r@   r   r   r   r   )ry   cluster_centersrf   inertias       rN   test_k_means_functionr;  
  sw    '.	jCU($OW   Z$<<<<99V""1%333 OK8#>S==rP   c              #   :   #    U  H  oS    S:X  d  M  Uv   M     g7f)user_apiblasNr   ).0r   s     rN   	<genexpr>r@    s     D(!jMV,CAA(s   	zUFails for some global_random_seed on Atlas which cannot be detected by threadpoolctl.)reasonc                    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   Sn
[        U[         R                     U[         R                     U
S9  [        U[         R                     U[         R                     U[         R                     R                  5       U
-  S	9  [        U[         R                     U[         R                     U[         R                     R                  5       U
-  S	9  [        U[         R                     U[         R                     5        g )
Nr5   )r;   r(   Fr   r   r7   r   rtol)atol)r@   r&  float32astyperB   rD   r+  rE   rC   r2   r   r   r   maxr   )r   r   ry   r   r:  r-  r&   rf   r2   rG   rE  s              rN   test_float_precisionrJ    s    
!*<	=BG	BGF**bjj)e%0
q	LLO	,,

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

WRZZ0wrzz7J7N7N7PSW7W vbjj)6"**+=>rP   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 )NFrC  r5   r   )rG   rH  r&   r:   rB   r@   may_share_memoryrE   )r   r2   
X_new_typecenters_new_typer   s        rN   test_centers_not_mutatedrO  J  sg     %e,J~~e%~8	(Z	JBFF:""2#6#68HIIIIIrP   c                     [        [        S9R                  U 5      n[        [        UR                  SS9R                  U 5      n[	        UR                  UR                  5        g )N)r:   r5   r   )r   r:   rB   rE   r   )r   r  r  s      rN   test_kmeans_init_fitted_centersrQ  Y  sS     J
'
+
+J
7C
JS-A-A!
L
P
PC C((#*>*>?rP   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   r5      r*  zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.r   r7   )
r@   asarrayr   rw   r   r   rB   setrC   r   )ry   rG   r   msgs       rN   1test_kmeans_warns_less_centers_than_unique_pointsrW  i  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@   sort)r&   s    rN   _sort_centersr[  z  s    777##rP   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 )Nr5   rr   ro   r   r   )r<   r;   r:   r(   r>   )r@   ru   rv   randintr%   repeatrG   r   r&   r:   r   rB   rC   r   r   rD   r[  rE   )ry   r?   X_repeatr   km_weightedrepeated_labelskm_repeateds          rN   test_weighted_vs_repeatedrc  ~  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rP   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%   r:   r   rB   r   rC   r   rE   )r   r   ry   r?   r   km_nonekm_oness          rN   test_unit_weights_vs_no_weightsrg    st     GGI&M	j7IRS	TBBimmJdm;GBimmJmDGw8G,,g.F.FGrP   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 )Nro   r5   r  r>   r4   )r@   ru   rv   r   r%   r:   r   rB   r   rC   r   rE   )r   r   ry   r?   r   km_orig	km_scaleds          rN   test_scaled_weightsrk    s     II))*<=EE9EUM	j7IRS	TBBimmJmDGb	jm8KLIw	(9(9:G,,i.H.HIrP   c                  b    [        SSS9R                  [        5      n U R                  S:X  d   eg )Nr1   r5   )r=   r   )r   rB   rG   rF   r   s    rN    test_kmeans_elkan_iter_attributerm    s+     
'A	.	2	21	5B::??rP   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 )	NrV   r5   gffffff?g?rY   r)   r   r>   )	r@   rA   r   rB   lenrU  rC   r   rE   )r-   rG   r?   r<   r   s        rN   #test_kmeans_empty_cluster_relocatedrp    s     	rdQC[!A#JM88bTB4L!D	14	2BFF1F*s2::1$$$B''2$5rP   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   rY   ro   r5   openmp)limitsr=  r*  r)   )
r@   ru   rv   ri   r   limitr:   rB   rC   r   )r   ry   rz   rG   result_1result_2s         rN   #test_result_equal_in_diff_n_threadsrx    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   r5   r1   )r:   r=   )rw   r   r   r   rB   rG   r   rP   rN   test_warning_elkan_1_clusterrz    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#   rr   ro   rr   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$ rY  )r   r   r   r   r   )rG   r<   new_centersrf   labels        rN   	py_kmeans+test_k_means_1_iteration.<locals>.py_kmeans  s^    iik*134::a=)E!"U?!3!8!8a!8!@K **1:""rP   r5   )r:   r;   r<   r=   r   )
r@   ru   rv   r   r   rB   rC   rE   r   r   )r-   r/   ry   rG   rH   r  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              rN   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+rP   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 )Nr5   r#   r4   csrdensityformatr(   r2   rV   FrC  r)   r   gHz>rD  )r@   ru   rv   sptoarrayr\   r   rH  r   sqrtr   r   r`   ra   rG  r   )r2   r  ry   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denserE  s               rN   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(>)$?rP   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#   rY   r4   r  r  FrC  rr   )rp   r2   r)   r5   r   )	n_threadsr   rs   rD  )r  single_label)r@   ru   rv   r  r  r   rH  r]  r_   r   r   r   rG  r   )r2   ry   r   X_sparser'  r?   r&   rf   	distancesr  inertia_denseinertia_sparserE  r~  masks                  rN   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8rP   zKlass, default_n_initrY   r7   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<   r5   ru   r   rY   )rB   rG   r   __name__)Klassdefault_n_initests      rN   test_n_init_autor  V  sd    
vK
0CGGAJ;;!
vH
-CGGAJ %( :3;;"AArP   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 )Nr5   r)   rS  )r4   g?g333333?r   r*  r>   )r@   rA   rB   r   )r   rG   r?   s      rN   test_sample_weight_unchangedr  a  sW     	1#sQC!AHH_-M+///O}bhh&?@rP   zparam, matchr:   r5   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      rN   r   r   v  s
    BQrP   r[   zUThe shape of the initial centers .* does not match the number of features of the datac                     U S S2S S24   $ )Nr[   r)   r   r  s      rN   r   r     s    BQBFrP   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)Nr5   )r;   r   r   )rw   raises
ValueErrorr  rB   rG   )r   paramr   r   s       rN   test_wrong_paramsr  k  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   )rw   r  r  r
   rG   r:   )r  r   s     rN   !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 )Nrq   r   r   )	rH  r
   r:   r   allrI  minr   rG   )r   r2   ry   r`   r&   ra   s         rN   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6rP   r  c                 T    [        [        [        U S9u  p[        [        U   U5        g )N)r  )r
   rG   r:   r   )r  r&   ra   s      rN   test_kmeans_plusplus_normsr    s#     'q*oVGAgJ(rP   c                     [        [        [        U S9u  p[        R                  " [        5      n[        U[        U S9u  pB[        X5        g )Nrq   )r
   rG   r:   r@   r   r   )ry   	centers_cr{   r   r   s        rN   test_kmeans_plusplus_dataorderr    sB    "1j?QRLI!!!$I(:,>O I/rP   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)r5   r   r   r5   r)   r   r)   r5   r6   r7   )r   r)   r)   r   r5   r)   r5   r   )r5   r   r   r)   r)   r   r)   r5   )r@   rA   r_   r   )labels1labels2labels3s      rN   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7rP   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   r4   r5   r6   r:   r)   Nr   )r@   rT  r&  r   rB   )r  rG   
clusterings      rN   -test_kmeans_with_array_like_or_np_scalar_initr    sO     	

QFS!HsAhA7rzzJA/1//JNN1rP   zKlass, methodrB   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getattrrG   rE   r   get_feature_names_outr   r   )r  method
class_namerM   r:   	names_outr   s          rN   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   rY   r   r  N)r   r   r  r   rE   rC   r  r   )r  rG   r{   rM   y_pred1y_pred2s         rN   ,test_predict_does_not_change_cluster_centersr    sv     BQODA !XF  #G78O8OPF.v~~>FNnnQGw(rP   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   rY   r  Tr  r   ro   rr   rG   r  r<   r?   n_centroidsr(   N)r@   ru   rv   r   r   r   _init_centroidsr   r   r]   rw   r  rR   r   )	r<   ry   r   rG   r{   r  rM   clusters_weightedclusterss	            rN   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#   rr   r  r   ro   Nr)   Tr  rY   r  )r@   ru   rv   r   r   r   r   r   r  r   r   isclose)
r<   ry   r   rG   r{   r?   r  rM   r  ds
             rN   test_sample_weight_zeror  4  s     ))

 2
3C!Q=ODA KKQWWQZK0MM#A#40OXF..
'#YY**+=> /  	AccF$56AvvbjjA&'''''rP   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   r5   rr   )r:   r<   r=   zENumber of distinct clusters \(4\) found smaller than n_clusters \(5\)r   N)r@   rA   r   rw   r   r   rB   rF   )r=   r-   rG   r   rV  s        rN   test_relocating_with_duplicatesr  R  s     	1a&1a&1a&1a&1a&9:A	11	:B
RC	(	4
|A 
5 ::?? 
5	4s   A>>
B)__doc__r   r   ior   numpyr@   rw   scipyr   r  threadpoolctlr   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   rA   r&   r%   r   r:   r   rG   r   X_as_any_csrdata_containersro  data_containers_idsmarkparametrizerG  r&  rO   rS   rg   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r!  r#  r_   int64r(  r.  r3  r7  r;  skipifr   rJ  rO  rQ  rW  r[  rc  rg  rk  rm  rp  rx  rz  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r  r  r  )	containers   0rN   <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,  
 
{GLLN,UV6  
 v&?@ A 
{G%NO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&?@D(DDD	  "? A"?J 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C) >s   	o