
    h$,f                        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/m0Z0  ejb                  g dg dg dg      Z2dZ3e2jh                  \  Z5Z6 ee3e2dd      \  Z7Z8e/D  cg c]
  }  | e7       c} Z9ejb                  ge/z   Z: e;e9      dk(  rg dnddgZ<ejz                  j}                  de:e<      ejz                  j}                  ddd g      ejz                  j}                  d!ej~                  ej                  g      d"                      ZAejz                  j}                  de:e<      ejz                  j}                  ddd g      d#               ZBejz                  j}                  de:e<      d$        ZCejz                  j}                  d%d&d'g      ejz                  j}                  de:e<      ejz                  j}                  d(g d)      d*                      ZDejz                  j}                  d+dd g      d,        ZEejz                  j}                  d-eeg      d.        ZFejz                  j}                  d/e9      d0        ZGd1 ZHejz                  j}                  d2e7ge9z   e<      ejz                  j}                  d3d4d5e2d6 gg d7      ejz                  j}                  d-eeg      d8                      ZIejz                  j}                  d3d4d5e2d9 gg d7      d:        ZJejz                  j}                  d;d<d=d> d?fd@g      ejz                  j}                  d-eeg      dA               ZKejz                  j}                  d-eeg      dB        ZLdC ZMejz                  j}                  d+dd g      ejz                  j}                  d(dDdg      dE               ZNdF ZOejz                  j}                  d-eeg      dG        ZPdH ZQejz                  j}                  d2e7ge9z   e<      dI        ZRdJ ZSdK ZTejz                  j}                  dLdMdNg      dO        ZUdP ZVdQ ZWejz                  j}                  d-eeg      dR        ZXejz                  j}                  de:e<      ejz                  j}                  dSedfed fedfg      ejz                  j}                  dTddg      dU                      ZYejz                  j}                  d/e9      ejz                  j}                  d-eeg      dV               ZZejz                  j}                  d/e9      ejz                  j}                  d3d4d5e2gg dW      ejz                  j}                  d-eeg      dX                      Z[ejz                  j}                  de:e<      ejz                  j}                  d!ej                  ej                  g      ejz                  j}                  d3d5dYg      ejz                  j}                  d-eeg      dZ                             Z^ejz                  j}                  d-eeg      d[        Z_ejz                  j}                  d-eeg      d\        Z`d] Zad^ Zbejz                  j}                  d2e7ge9z   e<      ejz                  j}                  d-eeg      d_               Zcejz                  j}                  d!ej                  ej                  ej~                  ej                  g      ejz                  j}                  d-eeg      d`               Zdejz                  j}                  d2e7ge9z   e<      da        Zedb Zfdc Zgdd Zhejz                  j}                  d2e7ge9z   e<      ejz                  j}                  d-eeg      de               Ziejz                  j}                  d2e7ge9z   e<      ejz                  j}                  d-eeg      df               Zjdg Zkejz                  j}                  de:e<      dh        Zlejz                  j}                  d-eeg      di        Zmdj Znejz                  j}                  de:e<      ejz                  j}                  ddd g      dk               Zoejz                  j}                  d!ej~                  ej                  g      ejz                  j}                  dldmdng      do               Zpejz                  j}                  d!ej~                  ej                  g      dp        Zqejz                  j}                  dqedrfedsfg      dt        Zrejz                  j}                  d-eeg      du        Zsejz                  j}                  d-eeg      ejz                  j}                  dvdwe3dxz   idyfd3e7dd idzfd3d{ idzfd3e7dd|ddf   id}fd3d~ id}fg      d               Ztejz                  j}                  dvde7dd idfg      d        Zuejz                  j}                  d2e7ge9z         ejz                  j}                  d!ej                  ej~                  g      d               Zvejz                  j}                  d e-e7dm      dg      d        Zwd Zxd Zyejz                  j}                  dd3 ej                  d5      iddgdxdxggdxdf      d        Z{ejz                  j}                  dedfedfedfg      d        Z|ejz                  j}                  de/dgz         d        Z}ejz                  j}                  d3d5d4g      d        Z~ejz                  j}                  d3d5d4g      d        Zejz                  j}                  de:e<      ejz                  j}                  d+dd g      d               Zyc c} w )zTesting for K-means    N)StringIO)sparse)clone)KMeansMiniBatchKMeansk_meanskmeans_plusplus)_euclidean_dense_dense_wrapper_euclidean_sparse_dense_wrapper_inertia_dense_inertia_sparse_is_same_clustering_relocate_empty_clusters_dense_relocate_empty_clusters_sparse)_labels_inertia_mini_batch_step)
make_blobs)ConvergenceWarning)pairwise_distancespairwise_distances_argmin)v_measure_score)euclidean_distances)assert_allcloseassert_array_equalcreate_memmap_backed_data)	row_norms)CSR_CONTAINERSthreadpool_limits)              @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         ?   r1   )   r4   r4   r6   r   r   r4   r4   g      ?g      ?g      ?r(   
n_clustersn_initinit	algorithmsample_weight)
nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_)r,   r.   r1   Xr>   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeanss              Blib/python3.12/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_resultsrN   9   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   r3   r4   r6   r(   r8   g      ?r7   g      ?)r4   r4   r   r   r!   r   )r?   r@   r   rA   r   rC   rE   r   rB   rD   AssertionError)	r,   r.   rF   rG   rL   rK   rI   rH   rJ   s	            rM   test_kmeans_relocated_clustersrR   Q   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      !ir4   	         #@
   rU   r4   rX   )rT   rY   )g     0rY   rY   )g      $@r   r   r5   )   r4   r4   irW   )r?   r@   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r,   rF   r>   centers_oldcenters_newweight_in_clusterslabelss          rM   test_relocate_empty_clustersrf   p   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6rO   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 )Nrh   i  rX   sizer'   r      r4   )r9   r'   r:   rj   r0   )r<   r9   r'   r:   rj   ư>)rel)r?   randomRandomStaterh   r   r   rA   r   rD   r   rB   rE   rC   pytestapprox)	rg   r,   rj   global_random_seedrndrF   _km_lloydkm_elkans	            rM   test_kmeans_elkan_resultsr}      s   
 ))

 2
3CxJJJJ's+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JrO   r<   c                     t         j                  j                  |      }|j                  d      }d}t	        | d|dd|      j                  |      }|j                  |k  sJ y )Nrm   rn   i,  rq   r4   r   )r<   r9   r'   r:   rj   max_iter)r?   rt   ru   rh   r   rA   rE   )r<   rx   ry   rF   r   kms         rM   test_kmeans_convergencer      sl     ))

 2
3C



#AH	'
 
c!f  ::   rO   	Estimatorc                 B   t         j                  j                  dd      }t         j                  j                  d      } |        }|j	                  ||       d}t        j                  t        |      5  |j                  ||       d d d        y # 1 sw Y   y xY w)Nr"   r(   rn   r=   zI'sample_weight' was deprecated in version 1.3 and will be removed in 1.5.match)	r?   rt   randuniformrA   rv   warnsFutureWarningpredict)r   rF   r>   rL   warn_msgs        rM   .test_predict_sample_weight_deprecation_warningr      s    
		sAAII%%3%/M[F
JJqJ.S  
m8	4 7q67 7 7s   8BB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 )Nrn   r   r5   rX   F)random_reassignr   )r?   rt   ru   r%   rh   shapecopy
zeros_liker]   rF   r1   r\   r   r   r   r   )r   rx   rngrb   centers_old_csrrc   centers_new_csrweight_sumsweight_sums_csrr>   X_mbX_mb_csrsample_weight_mbold_inertiare   new_inertiaold_inertia_csr
labels_csrnew_inertia_csrs                      rM   !test_minibatch_update_consistencyr      s    ))

 2
3CCJJGMMJ::K!&&(O--,KmmO4O((;,,Q/qww?Khh{003177COGGAGGAJagg6M Sb6DSbzH$Sb) #
		01K  *$0@+NFK$$$ '
		01O S    #2"O#J S   _,,, vz*K1K1K1rO   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   )rD   r   r9   
n_featuresrB   r?   uniquer   r   true_labelsrC   )r   r%   re   s      rM   _check_fitted_modelr     sv     !!G==Z4444ZZF99V""1%333 OK8#>;;rO   
input_datar;   rt   	k-means++c                     t         S Nr%   rF   kr'   s      rM   <lambda>r   -       rO   )rt   r   ndarraycallablec                     t        |t              rdnd} | |t        d|      j                  |      }t	        |       y )NrX   r4   r#   r;   r9   r'   r:   )
isinstancestrr9   rA   r   )r   r   r;   r:   r   s        rM   test_all_initr   &  s=     dC(RaF	jr&
	c*o  rO   c                     t         S r   r   r   s      rM   r   r   <  r   rO   c                     t        | t              rdnd}t        | t        d|      }t	        d      D ]  }|j                  t                t        |       y )NrX   r4   r   r   r"   )r   r   r   r9   rangepartial_fitrF   r   )r;   r:   r   is       rM   &test_minibatch_kmeans_partial_fit_initr   :  sR     dC(RaF	jq
B 3Z 
q rO   zinit, expected_n_init)r   r4   )rt   defaultc                 D    |j                  || j                  d   f      S )Nr4   rn   )r   r   )rF   r9   r'   s      rM   r   r   Q  s'    0D0D !''!*- 1E 1 rO   r   )
array-liker4   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"   rX   rq   r   r   r6   rX   autor9   r;   r:   N)r?   rt   randnr   rA   _n_init)r   r;   expected_n_initn_sampler   r9   rF   rL   s           rM   ,test_kmeans_init_auto_with_initial_centroidsr   K  s    ( (2$Hj*
		*-A|yyz:6)#(O;!*4GKKANF>>_,,,rO   c                 t   t        j                  t              }t        j                  t              } | t        t        d|      j                  t              } | t        |d|      j                  |      }t        |j                  |j                         t        |j                  |j                         y )Nr4   r9   r;   r:   r'   )
r?   asfortranarrayrF   r%   r9   rA   r   rD   r   rB   )r   rx   	X_fortrancenters_fortrankm_ckm_fs         rM   test_fortran_aligned_datar   j  s     !!!$I''0OGADV	c!f 	 '	
 
c)n 	 D))4+@+@At||T\\2rO   c                      t        t        dd      } t        j                  }t	               t        _        	 | j                  t               |t        _        y # |t        _        w xY w)Nr#   r4   )r9   r'   verbose)r   r9   sysstdoutr   rA   rF   )r   
old_stdouts     rM   test_minibatch_kmeans_verboser   }  sA    	JR	KBJCJ 
q	
Z
s   A A%rk   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   rm   rn   r#   rt   r4   )r<   r9   r'   r;   r:   rj   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r?   rt   ru   rh   r   r9   rA   
readouterrresearchout)r<   rj   capsysrF   captureds        rM   test_kmeans_verboser     s     			a ''Z'8A
 
c!f  "H99/>>>9918<<@@@
axyy.===yy<hllKKKrO   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_clustersr   rX      )	init_sizer9   )rv   r   RuntimeWarningr   rA   rF    rO   rM   '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   rX   r;   r9   r:   )rv   r   r   r%   r9   rA   rF   )r   s    rM   'test_warning_n_init_precomputed_centersr     sH     
Q
 I 	w:bAEEaH	I I Is   'AAc                 .   t        dd|       \  }}d|d d dd d f<   t        dd| d	      j                  |      }|j                  j	                  d
      j                         dkD  sJ t        dd| d	      j                  |      }|j                  j	                  d
      j                         dkD  sJ t        d| d      }t        d      D ]  }|j                  |        |j                  j	                  d
      j                         dkD  sJ y )Nr"   rq   )r$   r%   r'   r   r(   r   rX   rt   )r9   
batch_sizer'   r;   r4   axis   )r9   r'   r;   )r   r   rA   rD   anysumr   r   )rx   zeroed_Xr   r   r   s        rM    test_minibatch_sensible_reassignr     s(    'q/AHk HSqS!V	"3EH
	c(m  """*..02555 
#4FX
	c(m  """*..02555 
B5Gh	WB3Z !
x ! """*..02555rO   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   r4   T)r   reassignment_ratiogV瞯<)r?   emptyr9   r   r   rF   r   meanr\   r$   
empty_liker   r   r]   rt   ru   r   )r   rx   perfect_centersr   r>   rc   score_beforescore_afters           rM   test_minibatch_reassignr     s/    hh
J78O: >{a/05515=> GGI&M--0K
 $JPQRSTUUL

		01	 #:}k1MaPPK+%%% 

		01 	 K1rO   c                  R    t        ddt        dd      j                  t               y )Nr"   rX   r#   T)r9   r   r   r'   r   )r   r$   rA   rF   r   rO   rM   &test_minibatch_with_many_reassignmentsr     s&    
  
c!frO   c                  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 )NrX   rq   r4   )r9   r   r:         )r9   r   r:   r   )r   rA   rF   
_init_sizer$   r   s    rM   test_minibatch_kmeans_init_sizer     s     
B1Q	?	C	CA	FB==B 
B1Q	?	C	CA	FB==B 
!AQ
	c!f  ==I%%%rO   ztol, max_no_improvement)-C6?N)r   rX   c                    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 )Nr6   r   T)r%   r'   return_centersr   rX   r4   )	r9   r;   r   rj   r'   r   r:   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   rA   rE   r   r   )r   rj   r  rF   rz   r%   r   r   s           rM   #test_minibatch_declared_convergencer  '  s     qqNMAq'	-

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

222(OOBJJ@#F O#2Y""1%""((BJJ666 $rO   c                     | t         |      j                  t              }|j                  |j                        }t        |t        |j                               t        |j                         t        j                  t                      |j                  t              }t        |t        t        |j                               y )Nr9   r'   )r9   rA   rF   	transformrD   r   r   r   diagonalr?   r]   )r   rx   r   Xts       rM   test_transformr1    s     
j7I	J	N	Nq	QB 
b))	*BB*2+>+>?@r{{}bhhz&:; 
aBB*1b.A.ABCrO   c                      | |d      j                  t              j                  t              } | |d      j                  t              }t	        ||       y )Nr4   )r'   r:   )rA   rF   r.  fit_transformr   )r   rx   X1X2s       rM   test_fit_transformr6    sI     
 21	=	A	A!	D	N	Nq	QB	 21	=	K	KA	NBBrO   c                     t         j                  }dD ]:  }t        t        d|| d      j	                  t
              }|j                  |k  r:J  y )N)r4   rq   rX   rt   r4   )r9   r;   r:   r'   r   )r?   infr   r9   rA   rF   rC   )rx   previous_inertiar:   r   s       rM   test_n_initr:    sY    vv 
/ !+
 #a& 	 {{....
/rO   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)r9   r>   r'   r   r!   r   )
r   rF   r9   r   r   r?   r   r   r   r   )rx   cluster_centersre   inertias       rM   test_k_means_functionr>    sy    '.	jCU($OVW   Z$<<<<99V""1%333 OK8#>S==rO   c                     | 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  t        |t         j                     |t         j                     d       t        |t         j                     |t         j                     |t         j                     j                         dz  	       t        |t         j                     |t         j                     |t         j                     j                         dz  	       t        |t         j                     |t         j                            y )
Nr4   )r:   r'   Fr   r   r6   r  rtol)atol)r?   r)  float32astyperA   rC   r.  rD   rB   r1   r   r   r   maxr   )
r   r   rx   r   r=  r0  r%   re   r1   rF   s
             rM   test_float_precisionrG    s    
!*<	=BG	BGF**bjj) 6e%0
q	LLO5	,,

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

WRZZ0wrzz7J7N7N7PSW7W vbjj)6"**+=>rO   c                     t         j                  |d      }t        j                  |d      } | |t        d      }|j	                  |       t        j                  |j                  |      rJ y )NFr@  r4   r   )rF   rE  r%   r9   rA   r?   may_share_memoryrD   )r   r1   
X_new_typecenters_new_typer   s        rM   test_centers_not_mutatedrL  E  sd     %e,J~~e%~8	(Z	JBFF:""2#6#68HIIIIrO   c                     t        t              j                  |       }t        t        |j                  d      j                  |       }t	        |j                  |j                         y )N)r9   r4   r   )r   r9   rA   rD   r   )r   r  r  s      rM   test_kmeans_init_fitted_centersrN  T  sS     J
'
+
+J
7C
JS-A-A!
L
P
PC C((#*>*>?rO   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   r4      r-  zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.r   r6   )
r?   asarrayr   rv   r   r   rA   setrB   r   )rx   rF   r   msgs       rM   1test_kmeans_warns_less_centers_than_unique_pointsrT  d  s    


QFQFQFQF34A	1+=	>B	D  
(	4 0
q	 2::#eAh-///	0 0 0s   >BBc                 0    t        j                  | d      S Nr   r   )r?   sortr   s    rM   _sort_centersrX  u  s    777##rO   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 )Nr4   rq   rn   r   r   )r;   r:   r9   r'   r=   )r?   rt   ru   randintr$   repeatrF   r   r%   r9   r   rA   rB   r   r   rC   rX  rD   )rx   r>   X_repeatr   km_weightedrepeated_labelskm_repeateds          rM   test_weighted_vs_repeatedr`  y  s    
 II))*<=EE	19 F M yyM2H	Q:DV
B )---?Kii 3 3]CO)--)K{**O<K((+*>*>?k223k223rO   c                 D   t        j                  t              } | t        |d      }t	        |      j                  |d       }t	        |      j                  ||      }t        |j                  |j                         t        |j                  |j                         y r  )
r?   r\   r$   r9   r   rA   r   rB   r   rD   )r   r   rx   r>   r   km_nonekm_oness          rM   test_unit_weights_vs_no_weightsrd    sv     GGI&M	j7IRS	TBBimmJdm;GBimmJmmDGw8G,,g.F.FGrO   c                 ~   t         j                  j                  |      j                  t              } | t
        |d      }t        |      j                  ||      }t        |      j                  |d|z        }t        |j                  |j                         t        |j                  |j                         y )Nrn   r4   r   r=   r3   )r?   rt   ru   r   r$   r9   r   rA   r   rB   r   rD   )r   r   rx   r>   r   km_orig	km_scaleds          rM   test_scaled_weightsrh    s     II))*<=EE9EUM	j7IRS	TBBimmJmmDGb	jm8KLIw	(9(9:G,,i.H.HIrO   c                  f    t        dd      j                  t              } | j                  dk(  sJ y )Nr0   r4   )r<   r   )r   rA   rF   rE   r   s    rM    test_kmeans_elkan_iter_attributerj    s+     
'A	.	2	21	5B::??rO   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 )	NrU   r4   gffffff?g?rX   r(   r   r=   )	r?   r@   r   rA   lenrR  rB   r   rD   )r,   rF   r>   r;   r   s        rM   #test_kmeans_empty_cluster_relocatedrm    s     	rdQC[!A#JM88bTB4L!D	14	2BFF1MF*s2::1$$$B''2$5rO   c                    t         j                  j                  |      }|j                  d      }t	        dd      5   | t
        |      j                  |      j                  }d d d        t	        dd      5   | t
        |      j                  |      j                  }d d d        t               y # 1 sw Y   SxY w# 1 sw Y   "xY w)N)2   rX   rn   r4   openmp)limitsuser_apir-  r(   )	r?   rt   ru   rh   r   r9   rA   rB   r   )r   rx   ry   rF   result_1result_2s         rM   #test_result_equal_in_diff_n_threadsru    s     ))

 2
3C


!A	!h	7 
:LMSVW 	
 
!h	7 
:LMSVW 	
 x*
 

 
s   (B9<(C9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   r4   r0   )r9   r<   )rv   r   r   r   rA   rF   r   rO   rM   test_warning_elkan_1_clusterrw    s@    	I
 7 	!w/33A6	7 7 7r   c                 8   t         j                  j                  |      j                  d      }|d d } | |      }d } |||      \  }}t	        dd||d      j                  |      }|j                  }	|j                  }
t        ||	       t        ||
       y )N)r"   rq   rn   rq   c                     |j                         }t        | |      }t        |j                  d         D ]  }| ||k(     j	                  d      ||<    t        | |      }||fS rV  )r   r   r   r   r   )rF   r;   new_centersre   labels        rM   	py_kmeansz+test_k_means_1_iteration.<locals>.py_kmeans  so    iik*1d34::a=) 	AE!"6U?!3!8!8a!8!@K	A*1k:{""rO   r4   )r9   r:   r;   r<   r   )
r?   rt   ru   r   r   rA   rB   rD   r   r   )r,   r.   rx   rF   rG   r|  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              rM   test_k_means_1_iterationr    s    
 			0199x9HARa5LQA# &a6IzQ\TA	c!f  !!I++Jy),J
+rO   squaredTFc                 `   t         j                  j                  |      }t        j                  d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 )Nr4   r"   r3   csrdensityformatr'   r1   rU   Fr@  r(   r  gHz>rA  )r?   rt   ru   sptoarrayr[   r   rE  r   sqrtr
   r   r_   r`   rD  r   )r1   r  rx   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denserB  s               rM   test_euclidean_distancer    s   
 ))

 2
3Cyy	3E5H  ((,G		#e%0AdZZ\N1"'')H"x(9H9'1gN;x''NG BJJ&4DD(*?dK((>)8$?rO   c                    t         j                  j                  |      }t        j                  d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 )Nr"   rX   r3   r  r  Fr@  rq   )ro   r1   r(   r4   r   )	n_threadsr  rr   rA  )r  single_label)r?   rt   ru   r  r  r   rE  rZ  r^   r   r   r   rD  r   )r1   rx   r   X_sparser*  r>   r%   re   	distancesr  inertia_denseinertia_sparserB  r{  masks                  rM   test_inertiar  &  s    ))

 2
3CyyRUE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8rO   zKlass, default_n_initrX   r6   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;   r4   rt   r   rX   )rA   rF   r   __name__)Klassdefault_n_initests      rM   test_n_init_autor  Q  sd    
vK
0CGGAJ;;!
vH
-CGGAJ %( :3;;"AArO   c                     t        j                  dgdgdgg      }t        j                  g d      } | dd      j                  ||       t        |t        j                  g d             y )Nr4   r(   rP  )r3   g?g333333?r   r-  r=   )r?   r@   rA   r   )r   rF   r>   s      rM   test_sample_weight_unchangedr  \  sY     	1#sQC!AHH_-M+///O}bhh&?@rO   zparam, matchr9   r4   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                     | d d S )Nr(   r   X_r   r'   s      rM   r   r   q  s    BQ rO   rZ   zUThe shape of the initial centers .* does not match the number of features of the datac                     | d dd df   S )NrZ   r(   r   r  s      rM   r   r   {  s    BQBF rO   c                      | d      }t        j                  t        |      5   |j                  di |j	                  t
               d d d        y # 1 sw Y   y xY w)Nr4   )r:   r   r   )rv   raises
ValueErrorr  rA   rF   )r   paramr   r   s       rM   test_wrong_paramsr  f  sM    > 
!	B	z	/ &""1%& & &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   )rv   r  r  r	   rF   r9   )r  r   s     rM   !test_kmeans_plusplus_wrong_paramsr    s6     
z	/ 0://0 0 0s	   ;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 )Nrp   r   r   )	rE  r	   r9   r   allrF  minr   rF   )r   r1   rx   r_   r%   r`   s         rM   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6rO   r  c                 \    t        t        t        |       \  }}t        t        |   |       y )N)r  )r	   rF   r9   r   )r  r%   r`   s      rM   test_kmeans_plusplus_normsr    s%     'q*oVGWAgJ(rO   c                     t        t        t        |       \  }}t        j                  t              }t        |t        |       \  }}t        ||       y )Nrp   )r	   rF   r9   r?   r   r   )rx   	centers_crz   r   r   s        rM   test_kmeans_plusplus_dataorderr    sH    "1j?QRLIq!!!$I(:,>OQ I/rO   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)r4   r   r   r4   r(   r   r(   r4   r5   r6   )r   r(   r(   r   r4   r(   r4   r   )r4   r   r   r(   r(   r   r(   r4   )r?   r@   r^   r   )labels1labels2labels3s      rM   test_is_same_clusteringr    s~    hh/rxx@Gw333 hh/rxx@Gw333 hh/rxx@G"7GQ7777rO   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   r3   r4   r5   r9   r(   Nr   )r?   rQ  r)  r   rA   )r  rF   
clusterings      rM   -test_kmeans_with_array_like_or_np_scalar_initr    sO     	

QFS!HsAhA7rzzJA/1//JNN1rO   zKlass, methodrA   r   c                    | 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getattrrF   rD   r   get_feature_names_outr   r   )r  method
class_namerL   r9   	names_outr   s          rM   test_feature_names_outr    sx     %%'JWFGFFA((..q1J,,.IE*4EFq:,qc*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   rX   r   r  N)r   r   r  r   rD   rB   r   r   )r  rF   rz   rL   y_pred1y_pred2s         rM   ,test_predict_does_not_change_cluster_centersr    sz     BQODAq !XF  #G78O8OPF.v~~>FNnnQGw(rO   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   rX   r  Tr  r   rn   rq   rF   r  r;   r>   n_centroidsr'   N)r?   rt   ru   r   r   r   _init_centroidsr   r   r\   rv   r  rQ   r   )	r;   rx   r   rF   rz   r  rL   clusters_weightedclusterss	            rM   test_sample_weight_initr    s	    ))

 2
3C"b?QDAq  40OXF..
'kkqwwqzk2YY**+=> /  %%
'ggaggaj)YY**+=> & H 
~	& 5)845 5 5s   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"   rq   r  r   rn   Nr(   Tr  rX   r  )r?   rt   ru   r   r   r   r   r   r  r   r   isclose)
r;   rx   r   rF   rz   r>   r  rL   r  ds
             rM   test_sample_weight_zeror  /  s     ))

 2
3C!Q=ODAq KKQWWQZK0MM#A#40OXF..
'#YY**+=> /  	AccF$56AvvbjjA&''''rO   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   r4   rq   )r9   r;   r<   zENumber of distinct clusters \(4\) found smaller than n_clusters \(5\)r   N)r?   r@   r   rv   r   r   rA   rE   )r<   r,   rF   r   rS  s        rM   test_relocating_with_duplicatesr  M  s     	1a&1a&1a&1a&1a&9:A	11		:B
RC	(	4  
|A  ::??   s   BB)__doc__r   r   ior   numpyr?   rv   scipyr   r  sklearn.baser   sklearn.clusterr   r   r   r	   sklearn.cluster._k_means_commonr
   r   r   r   r   r   r   sklearn.cluster._kmeansr   r   sklearn.datasetsr   sklearn.exceptionsr   sklearn.metricsr   r   sklearn.metrics.clusterr   sklearn.metrics.pairwiser   sklearn.utils._testingr   r   r   sklearn.utils.extmathr   sklearn.utils.fixesr   r   r@   r%   r$   r   r9   r   rF   r   X_as_any_csrdata_containersrl  data_containers_idsmarkparametrizerD  r)  rN   rR   rf   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r$  r&  r^   int64r+  r1  r6  r:  r>  rG  rL  rN  rT  rX  r`  rd  rh  rj  rm  ru  rw  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r  r  r  )	containers   0rM   <module>r     s    	 
      M M   F ' 1 I 3 8 
 , A "((!!! 	  
Jc; /==	!=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! :!$ v&?@	7 A	7 ,/<2 0<2~ C,  
 
{G%GH6  
 v&?@ A 
{G%GH6  
	
	  		
 	
 v&?@- A-  v&?@3 A3$  w&89q	*L + :L2< v&?@I AI6< C,  
+2
+2\&$ 2\74KLL ML6(2 v&?@	 A	 >QRg)OT+BC aX. , /	 S ,F ,/v&?@K A 0K$ ,/
X{G,2T   v&?@
6 A 0

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