
    Q3j-                        d Z ddlZddlZddlmZ ddlZddlZddlm	Z	 ddl
mZ ddlmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1  ejd                  g dg dg dg      Z3dZ4e3jj                  \  Z6Z7 ee4e3dd      \  Z8Z9e.D  cg c]
  }  | e8       c} Z:ejd                  ge.z   Z; e<e:      dk(  rg dnddgZ=ej|                  j                  de;e=      ej|                  j                  dd d!g      ej|                  j                  d"ej                  ej                  g      d#                      ZBej|                  j                  de;e=      ej|                  j                  dd d!g      d$               ZCej|                  j                  de;e=      d%        ZDej|                  j                  d&d'd(g      ej|                  j                  de;e=      ej|                  j                  d)g d*      d+                      ZEej|                  j                  d,d d!g      d-        ZFej|                  j                  d.e:      d/        ZGd0 ZHej|                  j                  d1e8ge:z   e=      ej|                  j                  d2d3d4e3j                         d5 gg d6      ej|                  j                  d7eeg      d8                      ZJej|                  j                  d2d3d4e3d9 gg d6      d:        ZKej|                  j                  d;d<d=d> d?fd@g      ej|                  j                  d7eeg      dA               ZLej|                  j                  d7eeg      dB        ZMdC ZNej|                  j                  d,d d!g      ej|                  j                  d)dDdg      dE               ZOdF ZPej|                  j                  d7eeg      dG        ZQdH ZRej|                  j                  d1e8ge:z   e=      dI        ZSdJ ZTdK ZUej|                  j                  dLdMdNg      dO        ZVdP ZWdQ ZXej|                  j                  d7eeg      dR        ZYej|                  j                  de;e=      ej|                  j                  dSed fed!fedfg      ej|                  j                  dTddg      dU                      ZZej|                  j                  d.e:      ej|                  j                  d7eeg      dV               Z[ej|                  j                  d.e:      ej|                  j                  d2d3d4e3gg dW      ej|                  j                  d7eeg      dX                      Z\ej|                  j                  de;e=      ej|                  j                  d"ej                  ej                  g      ej|                  j                  d2d4dYg      ej|                  j                  d7eeg      dZ                             Z_ej|                  j                  d7eeg      d[        Z`ej|                  j                  d7eeg      d\        Zad] Zbd^ Zcej|                  j                  d1e8ge:z   e=      ej|                  j                  d7eeg      ej|                  j                   eed_  e	       D               d`a      db                      Zfej|                  j                  d"ej                  ej                  ej                  ej                  g      ej|                  j                  d7eeg      dc               Zgej|                  j                  d1e8ge:z   e=      dd        Zhde Zidf Zjdg Zkej|                  j                  d1e8ge:z   e=      ej|                  j                  d7eeg      dh               Zlej|                  j                  d1e8ge:z   e=      ej|                  j                  d7eeg      di               Zmdj Znej|                  j                  de;e=      dk        Zoej|                  j                  d7eeg      dl        Zpdm Zqej|                  j                  de;e=      ej|                  j                  dd d!g      dn               Zrej|                  j                  d"ej                  ej                  g      ej|                  j                  dodpdqg      dr               Zsej|                  j                  d"ej                  ej                  g      ds        Ztej|                  j                  dtedufedvfg      dw        Zuej|                  j                  d7eeg      dx        Zvej|                  j                  d7eeg      ej|                  j                  dydze4d{z   id|fd2e8dd id}fd2d~ id}fd2e8ddddf   idfd2d idfg      d               Zwej|                  j                  dyde8dd idfg      d        Zxej|                  j                  d1e8ge:z         ej|                  j                  d"ej                  ej                  g      d               Zyej|                  j                  d e,e8dp      dg      d        Zzd Z{d Z|ej|                  j                  dd2 ej                  d4      iddgd{d{ggd{df      d        Z~ej|                  j                  dedfedfedfg      d        Zej|                  j                  de.dgz         d        Zej|                  j                  d2d4d3g      d        Zej|                  j                  d2d4d3g      d        Zej|                  j                  de;e=      ej|                  j                  d,d d!g      d               Zyc c} w )zTesting for K-means    N)StringIO)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_sparse_random_array)_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                     | ddgddgddgddgg|      }g d}t        j                  ddgddgg|      }g d}d}t        j                  ddgd	dgg|      }d
}	t        d
d||      }
|
j                  ||       t	        |
j
                  |       t        |
j                  |       t        |
j                  |       |
j                  |	k(  sJ y )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              O/DATA/.local/lib/python3.12/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
JJqJ.v~~7FOO%56F++-=>>>_,,,    c                     | ddgddgddgddgg      }t        j                  ddgddgg      }t        dd||      }|j                  |       d}d}t	        |j
                  |       |j                  |k(  sJ 	 g d}ddgd	dgg}t        |j                  |       t	        |j                  |       y # t        $ r; g d
}d	dgddgg}t        |j                  |       t	        |j                  |       Y y w xY w)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   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   <8B5 5AC98C9c           
         t        j                  g d      j                  dd      } | |      }t        j                  d      }t        j                  g d      j                  dd      }t        j                  g d      j                  dd      }t        j                  g d      }t        j                  dt         j
                        }| t         j                  u rt        ||||||       n0t        |j                  |j                  |j                  |||||       t        |g d	       t        |d
gdgdgg       y )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   r   s	   
 	?@HHQOAQAGGBKM ((,-55b!<K
 ((,-55b!<K,/XXb)Frxx&}k;8JF	
 	(FFIIHH		
 )95K3%"u!56rP   distributionnormalblobstol){Gz?g:0yE>g0.++r   c                 H   t         j                  j                  |      }| dk(  r|j                  d      }nt	        |      \  }}d||dk  <    ||      }t        d|d|      }t        d	d|d|
      }|j                  |       |j                  |       t        |j                  |j                         t        |j                  |j                         |j                  |j                  k(  sJ |j                  t        j                  |j                  d      k(  sJ y )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+1Aa!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                     t         j                  j                  |      }|j                  d      }d}t	        | d|dd|      j                  |      }|j                  |k  sJ y )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           
         t         j                  j                  |      }t        |j	                  t        j
                        z   }|j                         }t        j                  |      }t        j                  |      }t        j                  |j
                  d   t        j                        }t        j                  |j
                  d   t        j                        }t        j                  t        j
                  d   t        j                        }	t        d d }
| d d }|	d d }t        |
||||t         j                  j                  |      d      }|dkD  sJ t        |
||      \  }}|dkD  sJ ||k  sJ t        |||||t         j                  j                  |      d      }|dkD  sJ t        |||      \  }}|dkD  sJ ||k  sJ t        ||       t        ||       t        ||       t        ||       y )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  *$0@+NFK$$$ '
		01O S    #2"O#J S   _,,, vz*K1K1K1rP   c                    | j                   }|j                  t        t        fk(  sJ | j                  }t        j                  |      j                  d   t        k(  sJ t        t        t        |      d       | j                  dkD  sJ y )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                 *    t         j                         S Nr&   r   rG   kr(   s      rN   <lambda>r   "  s
    w||~rP   )ru   r   ndarraycallable	Estimatorc                     t        |t              rdnd} | |t        d|      j                  |      }t	        |       y )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                 *    t         j                         S r   r   r   s      rN   r   r   1  s
    rP   c                     t        | d      r| j                         } t        | t              rdnd}t	        | t
        d|      }t        d      D ]  }|j                  t                t        |       y )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   /  sd     tVyy{ dC(RaF	jq
B 3Z
q  rP   zinit, expected_n_init)r   r5   )ru   defaultc                 D    |j                  || j                  d   f      S )Nr5   ro   )uniformr   )rG   r:   r(   s      rN   r   r   J  s%    0D0D !''!*- 1E 1rP   r   )
array-liker5   c                    d\  }}}t         j                  j                  ||      }|dk(  r t         j                  j                  ||      }|dk(  r| t        u rdnd} | ||d      j	                  |      }|j
                  |k(  sJ y)	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   D  s    ( (2$Hj*
		*-A|yyz:6)#(O;!*4GKKANF>>_,,,rP   c                 t   t        j                  t              }t        j                  t              } | t        t        d|      j                  t              } | t        |d|      j                  |      }t        |j                  |j                         t        |j                  |j                         y )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   c  s     !!!$I''0OGADV	c!f 	 '	
 
c)n 	 D))4+@+@At||T\\2rP   c                      t        t        dd      } t        j                  }t	               t        _        	 | j                  t               |t        _        y # |t        _        w xY w)Nr$   r5   )r:   r(   verbose)r   r:   sysstdoutr   rB   rG   )r   
old_stdouts     rN   test_minibatch_kmeans_verboser   v  sA    	JR	KBJCJ 
q	
Z
s   A A%rl   c           	         t         j                  j                  d      j                  d      }t	        | t
        ddd|d      j                  |       |j                         }t        j                  d|j                        sJ t        j                  d	|j                        sJ |dk(  r#t        j                  d
|j                        sJ y t        j                  d|j                        sJ y )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KrP   c                      t        j                  t        d      5  t        dd      j	                  t
               d d d        y # 1 sw Y   y xY w)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                     t        j                  t        d      5   | t        t        d      j                  t               d d d        y # 1 sw Y   y xY w)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                 p   t        dd|       \  }}d|d d dd d f<   t        dd| d	      j                  |      }|j                  j	                  d
      j                         }|dkD  sJ d|d       t        dd| d	      j                  |      }|j                  j	                  d
      j                         }|dkD  sJ d|d       t        d| d      }t        d      D ]  }|j                  |        |j                  j	                  d
      j                         }|dkD  sJ d|d       y )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     sh    'q/AHk 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           
         t        j                  t        t        f      }t	        t              D ]%  }t
        t        |k(     j                  d      ||<   ' t        j                  t              }t        j                  |      }t        | ||d      d    }t        | |||t        j                  t              t         j                  j                  |      dd       t        | ||d      d    }||kD  sJ t        | |||t        j                  t              t         j                  j                  |      dd       t!        ||       y )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                  R    t        ddt        dd      j                  t               y )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                  H   t        ddd      j                  t              } | j                  dk(  sJ t        ddd      j                  t              } | j                  dk(  sJ t        dddt        dz         j                  t              } | j                  t        k(  sJ y )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                    t        ddd      \  }}}t        d|d|dddd|	      }|j                  |       d|j                  cxk  rdk  sJ  J | j	                         }|d	|j
                  v sJ |dk(  rd
|j
                  v sJ y y )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NMAq'	-

B FF1IrzzB  "H!1X\\AAA
ax;x||KKK rP   c                     d} t         j                  d   }t        d| d      j                  t               }|j                  t        j                  |j                  | z  |z        k(  sJ t        |j                  t              sJ t        d| ddd d      j                  t               }|j                  dk(  sJ |j                  d|z  | z  k(  sJ t        |j                  t              sJ y )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                      t         j                         } t        dt        d      }|j	                  |        t        |       t        | t                y )NFr$   )copy_xr:   r(   )rG   r   r   r:   rB   r   r   )my_Xr   s     rN   test_kmeans_copyxr
  X  s:    668D	u"	EBFF4L D!rP   c                    t         j                  j                  |      j                  dd      } | d|d      }|j	                  |      j                  |      } | d|d      }|j	                  |      j                  |      }||kD  sJ y )Nr#   rY   r5   )r;   r(   r   )r@   ru   rv   r   rB   score)r   ry   rG   km1s1km2s2s          rN   test_score_max_iterr  c  s     			0177R@A
1+=
JC			!	B
1+=
KC			!	B7N7rP   zEstimator, algorithmr   c                    t        ddd|      \  }} |||      } | ddd||      }||j                  |       |j                  |       |j                  }	|j	                  |      }
t        |
|	       |j                  |      }
t        |
|	       |j	                  |j                        }
t        |
t        j                  d             y )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  p  s     "b?QDAq 	Ql+A	'
B 
	*FF1IZZF ::a=DtV$ >>!DtV$ ::b))*DtRYYr]+rP   c                 z   t         j                  j                  |      j                  t        f      } | t
        |d      }|j                  t        |        | t
        |d      }|j                  ||       t        |j                  |j                         t        |j                  |j                         y 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                 4   t        |t              rdnd} | t        ||d      }|j                  |       t	        |j                  t              |j                         |j                  t               t	        |j                  |      |j                         y )NrY   r5   r   r   )r   r   r:   rB   r   r  rG   rC   )r   r<   r   r;   r   s        rN   test_predict_dense_sparser#    sh     dC(RaF	jtFQR	SBFF5Mrzz!}bjj1FF1Irzz%("**5rP   r   c           	      0   t        j                  ddgddgddgddgddgddgg      } |||	      }|d
k(  rdnd}|d
k(  r|d d n|} | d|||      }| t        u r|j                  d       |j	                  |       |j
                  j                  t         j                  k(  sJ g d}	t        t        |j                  |	      d       | t        u rDt        |      j                  |      }|j
                  j                  t         j                  k(  sJ y y )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WE*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                     | t         |      j                  t              }|j                  |j                        }t        |t        |j                               t        |j                         t        j                  t                      |j                  t              }t        |t        t        |j                               y )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                      | |d      j                  t              j                  t              } | |d      j                  t              }t	        ||       y )Nr5   )r(   r;   )rB   rG   r+  fit_transformr   )r   ry   X1X2s       rN   test_fit_transformr3    sI     
 21	=	A	A!	D	N	Nq	QB	 21	=	K	KA	NBBrP   c                     t         j                  }dD ]:  }t        t        d|| d      j	                  t
              }|j                  |k  r:J  y )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                    t        t        t        d |       \  }}}|j                  t        t        fk(  sJ t        j                  |      j                  d   t        k(  sJ t        t        t        |      d       |dkD  sJ y )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;  	  sy    '.	jCU($OVW   Z$<<<<99V""1%333 OK8#>S==rP   c              #   2   K   | ]  }|d    dk(  s|  yw)user_apiblasNr   ).0r   s     rN   	<genexpr>r@    s     D(!AjMV,CA(s   zUFails for some global_random_seed on Atlas which cannot be detected by threadpoolctl.)reasonc                     | d|      }i }i }i }i }t         j                  t         j                  fD ]  }|j                  |d      }	|j	                  |	       |j
                  ||<   |j                  |	      ||<   |j                  ||<   |j                  ||<   |j                  j                  |k(  sJ | t        u s|j                  |	dd        |j                  j                  |k(  rJ  d}
t        |t         j                     |t         j                     |
       t        |t         j                     |t         j                     |t         j                     j                         |
z  	       t        |t         j                     |t         j                     |t         j                     j                         |
z  	       t        |t         j                     |t         j                            y )
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5	,,

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

WRZZ0wrzz7J7N7N7PSW7W vbjj)6"**+=>rP   c                     t         j                  |d      }t        j                  |d      } | |t        d      }|j	                  |       t        j                  |j                  |      rJ y )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  I  sd     %e,J~~e%~8	(Z	JBFF:""2#6#68HIIIIrP   c                     t        t              j                  |       }t        t        |j                  d      j                  |       }t	        |j                  |j                         y )N)r:   r5   r   )r   r:   rB   rE   r   )r   r  r  s      rN   test_kmeans_init_fitted_centersrQ  X  sS     J
'
+
+J
7C
JS-A-A!
L
P
PC C((#*>*>?rP   c                 @   t        j                  ddgddgddgddgg      }t        d|       }d}t        j                  t
        |      5  |j                  |       t        |j                        t        t        d            k(  sJ 	 d d d        y # 1 sw Y   y xY w)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  h  s    


QFQFQFQF34A	1+=	>B	D  
(	4
q	 2::#eAh-///	 
5	4	4s   >BBc                 0    t        j                  | d      S Nr   r   )r@   sort)r&   s    rN   _sort_centersr[  y  s    777##rP   c                 X   t         j                  j                  |       j                  ddt              }t        j
                  t        |d      }t        t        dt        |       }t        |      j                  t        |      }t        j
                  |j                  |      }t        |      j                  |      }t        |j                  |       t        |j                  |j                         t        t!        |j"                        t!        |j"                               y )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                 D   t        j                  t              } | t        |d      }t	        |      j                  |d       }t	        |      j                  ||      }t        |j                  |j                         t        |j                  |j                         y 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    sv     GGI&M	j7IRS	TBBimmJdm;GBimmJmmDGw8G,,g.F.FGrP   c                 ~   t         j                  j                  |      j                  t              } | t
        |d      }t        |      j                  ||      }t        |      j                  |d|z        }t        |j                  |j                         t        |j                  |j                         y )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BimmJmmDGb	jm8KLIw	(9(9:G,,i.H.HIrP   c                  f    t        dd      j                  t              } | j                  dk(  sJ y )Nr1   r5   )r=   r   )r   rB   rG   rF   r   s    rN    test_kmeans_elkan_iter_attributerm    s+     
'A	.	2	21	5B::??rP   c                     | dgdgg      }ddg}t        j                  dgdgg      }t        d|d      }|j                  ||       t	        t        |j                              dk(  sJ t        |j                  dgdgg       y )	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FF1MF*s2::1$$$B''2$5rP   c                    t         j                  j                  |      }|j                  d      }t	               j                  dd      5   | t        |      j                  |      j                  }d d d        t	               j                  dd      5   | t        |      j                  |      j                  }d d d        t               y # 1 sw Y   axY w# 1 sw Y   "xY w)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                      t        j                  t        d      5  t        dd      j	                  t
               d d d        y # 1 sw Y   y xY w)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                 8   t         j                  j                  |      j                  d      }|d d } | |      }d } |||      \  }}t	        dd||d      j                  |      }|j                  }	|j                  }
t        ||	       t        ||
       y )N)r#   rr   ro   rr   c                     |j                         }t        | |      }t        |j                  d         D ]  }| ||k(     j	                  d      ||<    t        | |      }||fS rY  )r   r   r   r   r   )rG   r<   new_centersrf   labels        rN   	py_kmeansz+test_k_means_1_iteration.<locals>.py_kmeans  sh    iik*1d34::a=)E!"6U?!3!8!8a!8!@K **1k:{""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IzQ\TA	c!f  !!I++Jy),J
+rP   squaredTFc                 J   t         j                  j                  |      }t        ddd||       }|j	                         j                  d      }|j                  d      j                  | d      }|d	z  j                         }||z
  d	z  j                         }|r|nt        j                  |      }t        |||      }	t        |j                  |j                  |||      }
| t         j                  k(  rd
nd}t        |	|
|       t        |	||       t        |
||       y )N)r5   r#   r4   csrdensityformatr   r2   rV   r#   FrC  r)   r   gHz>rD  )r@   ru   rv   r   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##eEH  ((,G		#e%0AdZZ\N1"'')H"x(9H9'1gN;x''NG BJJ&4DD(*?dK((>)8$?rP   c                    t         j                  j                  |      }t        ddd||       }|j	                         }|j                  d      j                  | d      }|j                  dd	      j                  | d      }|j                  ddt         j                  
      }|||   z
  dz  j                  d      }t        j                  ||z        }	t        ||||d      }
t        ||||d      }| t         j                  k(  rdnd}t        |
||       t        |
|	|       t        ||	|       d}||k(  }||   ||   z
  dz  j                  d      }t        j                  |||   z        }	t        ||||d|      }
t        ||||d|      }t        |
||       t        |
|	|       t        ||	|       y )N)r#   rY   r4   r  r  r#   FrC  rr   rY   )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#3u#UH  GIIcN))%e)<Mii2%%e%%8G[[BHH[5FGFO+166A6>Ivvi-/0H"7M7FVWXM$-&AN BJJ&4DDM>=M8$7NH48 EU?D$-'%.0Q6;;;CIvvi-"556H"15M %-&AEN M>=M8$7NH48rP   zKlass, default_n_initrY   r7   c                      | dd      }|j                  t               |j                  dk(  sJ  | dd      }|j                  t               | j                  dk(  r|j                  dk(  sJ y y )Nr   r   )r;   r<   r5   ru   r   rY   )rB   rG   r   __name__)Klassdefault_n_initests      rN   test_n_init_autor  U  sd    
vK
0CGGAJ;;!
vH
-CGGAJ %( :3;;"AArP   c                     t        j                  dgdgdgg      }t        j                  g d      } | dd      j                  ||       t        |t        j                  g d             y )Nr5   r)   rS  )r4   g?g333333?r   r*  r>   )r@   rA   rB   r   )r   rG   r?   s      rN   test_sample_weight_unchangedr  `  sY     	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                     | d d S )Nr)   r   X_r   r(   s      rN   r   r   u  s
    BQrP   r[   zUThe shape of the initial centers .* does not match the number of features of the datac                     | d dd df   S )Nr[   r)   r   r  s      rN   r   r     s    BQBFrP   c                      | d      }t        j                  t        |      5   |j                  di |j	                  t
               d d d        y # 1 sw Y   y xY w)Nr5   )r;   r   r   )rw   raises
ValueErrorr  rB   rG   )r   paramr   r   s       rN   test_wrong_paramsr  j  sD    > 
!	B	z	/""1% 
0	/	/s   &AAx_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc                     t        j                  t        |      5  t        t        t
        fi |  d d d        y # 1 sw Y   y xY w)Nr   )rw   r  r  r	   rG   r:   )r  r   s     rN   !test_kmeans_plusplus_wrong_paramsr    s-     
z	/:// 
0	/	/s	   ;Ac                 6   | j                  |      }t        |t        |      \  }}|j                  d   t        k(  sJ |dk\  j	                         sJ ||j                  d   k  j	                         sJ |j                  d   t        k(  sJ |j                  d      |j                  d      k  j	                         sJ |j                  d      |j                  d      k\  j	                         sJ t        t        |   j                  |      |       y )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GW ==z)))qLtzz!}$))+++ ==z)))KKQK4888#3388:::KKQK4888#3388:::
 AgJ%%e,g6rP   r  c                 \    t        t        t        |       \  }}t        t        |   |       y )N)r  )r	   rG   r:   r   )r  r&   ra   s      rN   test_kmeans_plusplus_normsr    s%     'q*oVGWAgJ(rP   c                     t        t        t        |       \  }}t        j                  t              }t        |t        |       \  }}t        ||       y )Nrq   )r	   rG   r:   r@   r   r   )ry   	centers_cr{   r   r   s        rN   test_kmeans_plusplus_dataorderr    sH    "1j?QRLIq!!!$I(:,>OQ I/rP   c                  H   t        j                  g dt         j                        } t        | | d      sJ t        j                  g dt         j                        }t        | |d      sJ t        j                  g dt         j                        }t        | |d      rJ y )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 hh/rxx@Gw333 hh/rxx@G"7GQ7777rP   kwargs)r<   r;   c                     t        j                  ddgddgddgddggt         j                        }t        dddi| }|j	                  |       y)	zZCheck 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                    | j                   j                         } |        } t        ||      t               |j                  j
                  d   }|j                         }t        t        |      D cg c]  }| | 
 c}|       yc c}w )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    s~     %%'JWFGFFA((..q1J,,.IE*4EF4Eq:,qc*4EF	RFs   3B	csr_containerc                    t        dddd      \  }}|  | |      }t               }|j                  |      }t        |j                        |_        t        |j
                        |_        |j                  |      }t        ||       y)z_Check 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    sz     BQODAq !XF  #G78O8OPF.v~~>FNnnQGw(rP   c           
      R   t         j                  j                  |      }t        ddd|      \  }}t	        |d      }t               }|j                  ||| |j                  |j                  d         dt         j                  j                  |      	      }|j                  ||| t        j                  |j                  d         dt         j                  j                  |      	      }t        j                  t              5  t        ||       d
d
d
       y
# 1 sw Y   y
xY w)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DAq  40OXF..
'kkqwwqzk2YY**+=> /  %%
'ggaggaj)YY**+=> & H 
~	&)84 
'	&	&s   DD&c           
         t         j                  j                  |      }t        ddd|      \  }}|j	                  |j
                  d         }d|ddd<   t        |d	      }t               }|j                  ||| |d
t         j                  j                  |            }t        |ddd   |      }	t        j                  t        j                  |	d            rJ y)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  3  s     ))

 2
3C!Q=ODAq KKQWWQZK0MM#A#40OXF..
'#YY**+=> /  	AccF$56AvvbjjA&''''rP   c                    t        j                  ddgddgddgddgddgg      }t        d||       }d}t        j                  t
        |      5  |j                   ||             ddd       |j                  dk(  sJ y# 1 sw Y   xY w)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  Q  s     	1a&1a&1a&1a&1a&9:A	11		:B
RC	(	4
|A 
5 ::?? 
5	4s   BB)__doc__r   r   ior   numpyr@   rw   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   r   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 
 , D = "((!!! 	  
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   o7