
    _nd>                     &   d Z ddlZddlZddlZddlZddlmZ ddl	Z	ddl
mZ ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddlm Z  ddlm!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z% ddl"m&Z& ddl"m'Z' ddl"m(Z( ddl"m)Z) ddl
m*Z* ddl+m,Z, ddl-m.Z. dZ/e	j0        1                    de/z             Z2 ej3        g dg dg dg          Z4d Z5e4j6        \  Z7Z8 e,e5e4d!d"#          \  Z9Z: ej;        e9          Z<e	j0        =                    d$ej3        ej;        gd%d&g'          e	j0        =                    d(d)d*g          e	j0        =                    d+ej>        ej?        g          d,                                     Z@e	j0        =                    d$ej3        ej;        gd%d&g'          e	j0        =                    d(d)d*g          d-                         ZAe	j0        =                    d$ej3        ej;        gd%d&g'          d.             ZBe	j0        =                    d/d0d1g          e	j0        =                    d$ej3        ej;        gd%d&g'          e	j0        =                    d2g d3          d4                                     ZCe	j0        =                    d5d)d*g          d6             ZDe	j0        =                    d5d7d8g          d9             ZEd: ZFd; ZGe	j0        =                    d<e9e<gd%d&g'          e	j0        =                    d=d>d?e4d@ gg dA'          e	j0        =                    dBeeg          dC                                     ZHe	j0        =                    d=d>d?e4dD gg dA'          dE             ZIe	j0        =                    dBeeg          dF             ZJdG ZKe	j0        =                    d5d)d*g          e	j0        =                    d2dHdg          dI                         ZLdJ ZMe	j0        =                    dBeeg          dK             ZNdL ZOe	j0        =                    d<e9e<gd%d&g'          dM             ZPdN ZQdO ZRe	j0        =                    dPdQdRg          dS             ZSdT ZTdU ZUe	j0        =                    dBeeg          dV             ZVe	j0        =                    d$ej3        ej;        gd%d&g'          e	j0        =                    dWed)fed*fedfg          e	j0        =                    dXdYd g          dZ                                     ZWe	j0        =                    dBeeg          d[             ZXe	j0        =                    d=d>d?e4gg d\'          e	j0        =                    dBeeg          d]                         ZYe	j0        =                    d$ej3        ej;        gd%d&g'          e	j0        =                    d+ejZ        ej[        g          e	j0        =                    d=d?d^g          e	j0        =                    dBeeg          d_                                                 Z\e	j0        =                    dBeeg          d`             Z]e	j0        =                    dBeeg          da             Z^db Z_dc Z`e	j0        =                    d<e9e<gd%d&g'          e	j0        =                    dBeeg          dd                         Zae	j0        =                    d+ejZ        ej[        ej>        ej?        g          e	j0        =                    dBeeg          de                         Zbe	j0        =                    d<e9e<gd%d&g'          df             Zcdg Zddh Zedi Zfe	j0        =                    d<e9e<gd%d&g'          e	j0        =                    dBeeg          dj                         Zge	j0        =                    d<e9e<gd%d&g'          e	j0        =                    dBeeg          dk                         Zhdl Zie	j0        =                    d$ej3        ej;        gd%d&g'          dm             Zje	j0        =                    dBeeg          dn             Zkdo Zle	j0        =                    d$ej3        ej;        gd%d&g'          e	j0        =                    d(d)d*g          dp                         Zme	j0        =                    d+ej>        ej?        g          e	j0        =                    dqdrdsg          dt                         Zne	j0        =                    d+ej>        ej?        g          du             Zoe	j0        =                    dvedwfedxfg          dy             Zpe	j0        =                    dvedwfedxfg          dz             Zqe	j0        =                    dBeeg          d{             Zre	j0        =                    dBeeg          e	j0        =                    d|d}e5d~z   idfd=e9ddY         idfd=d idfd=e9ddddYf         idfd=d idfg          d                         Zse	j0        =                    d|de9ddY         idfg          d             Zte	j0        =                    d<e9e<g          e	j0        =                    d+ej?        ej>        g          d                         Zue	j0        =                    d ee9dr          dg          d             Zvd Zwd Zxe	j0        =                    dd= ejy        d?          iddgd~d~ggd~df          d             Zze	j0        =                    dedfedfedfg          d             Z{e	j0        =                    ddrdsg          d             Z|dS )zTesting for K-means    N)sparse)assert_array_equal)assert_allclose)threadpool_limits)clone)ConvergenceWarning)	row_norms)pairwise_distances)pairwise_distances_argmin)v_measure_score)KMeansk_meanskmeans_plusplus)MiniBatchKMeans)_labels_inertia)_mini_batch_step)_relocate_empty_clusters_dense)_relocate_empty_clusters_sparse)_euclidean_dense_dense_wrapper)_euclidean_sparse_dense_wrapper)_inertia_dense)_inertia_sparse)_is_same_clustering)create_memmap_backed_data)
make_blobs)StringIOzThe default value of `n_init` will change from \d* to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning:FutureWarningzignore:)              @r   r   r   )      ?r   g      @r   r   )r   r   r   r   r   d   r   *   )	n_samplescenterscluster_stdrandom_statearray_constrdenser   )idsalgolloydelkandtypec                     | ddgddgddgddgg|          }g d}t          j        ddgddgg|          }g d}d}t          j        ddgd	dgg|          }d
}	t          d
d||          }
|
                    ||           t	          |
j        |           t          |
j        |           t          |
j        |           |
j	        |	k    sJ d S )Nr         ?   r,   )   r/   r/   r1   r   r   r/   r/   g      ?g      ?g      ?   
n_clustersn_initinit	algorithmsample_weight)
nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_)r&   r)   r,   Xr:   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeanss              Blib/python3.11/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_resultsrJ   ;   s    	q!fsAha1a&9GGGA LLM8aVaV,E:::L"llOx%eQZ 8FFFOqNNNF
JJqJ...v~777FO%5666F+-=>>>>_,,,,,,    c                      | ddgddgddgddgg          }t          j        ddgddgg          }t          dd||          }|                    |           d}d}t	          |j        |           |j        |k    sJ 	 g d}ddgd	dgg}t          |j        |           t	          |j	        |           d S # t          $ r: g d
}d	dgddgg}t          |j        |           t	          |j	        |           Y d S w xY w)Nr   r.   r/   r1   r3   r4   g      ?r2   g      ?)r/   r/   r   r   r   r   )r;   r<   r   r=   r   r?   rA   r   r>   r@   AssertionError)	r&   r)   rB   rC   rH   rG   rE   rD   rF   s	            rI   test_kmeans_relocated_clustersrN   U   sX    	q!fsAha1a&9::A 8c3Z!Q011LqNNNF
JJqMMMOFO%5666>_,,,,	C&,,!1Iay16>?;;;/1ABBBBB C C C&,,!3K$56>?;;;/1ABBBBBB	Cs   6B9 9A C=<C=c           
         t          j        g d                              dd          } | |          }t          j        d          }t          j        g d                              dd          }t          j        g d                              dd          }t          j        g d          }t          j        dt           j                  }| t           j        u rt          ||||||           n%t          |j        |j	        |j
        |||||           t          |g d	           t          |d
gdgdgg           d S )N)
      $g      #ig      !ir/   	         #@
   rQ   r/   rT   )rP   rU   )g     0rU   rU   )g      $@r   r   r0   )   r/   r/   irS   )r;   r<   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r&   rB   r:   centers_oldcenters_newweight_in_clusterslabelss          rI   test_relocate_empty_clustersrb   v   s\    	???@@HHQOOAQAGBKKM (,,,--55b!<<K
 (,,,--55b!<<K,,,//Xb)))Frx&}k;8JF	
 	
 	
 	
 	(FIH		
 		
 		
 )999555K3%"u!566666rK   distributionnormalblobstol){Gz?g:0yE>g0.++r   c                 F   t           j                            |          }| dk    r|                    d          }nt	          |          \  }}d||dk     <    ||          }t          d|d|          }t          d	d|d|
          }|                    |           |                    |           t          |j        |j                   t          |j
        |j
                   |j        |j        k    sJ |j        t          j        |j        d          k    sJ d S )Nrd   i  rT   sizer%   r      r/   )r5   r%   r6   rf   r+   )r8   r5   r%   r6   rf   ư>)rel)r;   randomRandomStaterd   r   r   r=   r   r@   r   r>   rA   r?   pytestapprox)	rc   r&   rf   global_random_seedrndrB   _km_lloydkm_elkans	            rI   test_kmeans_elkan_resultsry      s2    )

 2
3
3CxJJJJ''s+++1Aa!eHQA1CASVWWWH'  H LLOOOLLOOOH-x/HIIIx')9:::x/////h.?T J J JJJJJJJrK   r8   c                     t           j                            |          }|                    d          }d}t	          | d|dd|                              |          }|j        |k     sJ d S )Nri   rj   i,  rm   r/   r   )r8   r5   r%   r6   rf   max_iter)r;   rp   rq   rd   r   r=   rA   )r8   rt   ru   rB   r{   kms         rI   test_kmeans_convergencer}      s     )

 2
3
3C



##AH	'
 
 
 
c!ff  :      rK   autofullc                    t           j                            dd          }t          |           }t	          j        t          d|  d          5  |                    |           |j        dk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr    r3   r8   zalgorithm='zB' is deprecated, it will be removed in 1.3. Using 'lloyd' instead.matchr*   )	r;   rp   randr   rr   warnsFutureWarningr=   
_algorithm)r8   rB   rH   s      rI   ,test_algorithm_auto_full_deprecation_warningr      s    
	sAAi(((F	8) 8 8 8
 
 
 , , 	

1 G+++++, , , , , , , , , , , , , , , , , ,s   #BBBc           
      d   t           j                            |           }t          |                    t          j                  z   }|                                }t          j        |          }t          j        |          }t          j        |j        d         t          j
                  }t          j        |j        d         t          j
                  }t          j        t          j        d         t          j
                  }t          d d         }	t          d d         }
|d d         }t          |	||||t           j                            |           d          }|dk    sJ t          |	||          \  }}|dk    sJ ||k     sJ t          |
||||t           j                            |           d          }|dk    sJ t          |
||          \  }}|dk    sJ ||k     sJ t          ||           t!          ||           t!          ||           t!          ||           d S )Nrj   r   r0   rT   F)random_reassignr   )r;   rp   rq   r#   rd   shapecopy
zeros_likerY   rB   r,   rX   X_csrr   r   r   r   )rt   rngr^   centers_old_csrr_   centers_new_csrweight_sumsweight_sums_csrr:   X_mbX_mb_csrsample_weight_mbold_inertiara   new_inertiaold_inertia_csr
labels_csrnew_inertia_csrs                     rI   !test_minibatch_update_consistencyr      sG   
)

 2
3
3CCJJGMJ:::K!&&((O-,,KmO44O(;,Q/qw???Kh{0317CCCOGAGAJag666M SbS6DSbSzH$SbS) #
	011  K  *$0@+NNFK$$$$ '
	011  O S     #2"O# #J S    _,,,, vz***K111K111K11111rK   c                    | j         }|j        t          t          fk    sJ | j        }t          j        |          j        d         t          k    sJ t          t          t          |          d           | j
        dk    sJ d S )Nr   r   r   )r@   r   r5   
n_featuresr>   r;   uniquer   r   true_labelsr?   )r|   r#   ra   s      rI   _check_fitted_modelr   #  s     !G=Z44444ZF9V"1%3333 OK88#>>>;rK   r[   r7   rp   	k-means++c                     t           S Nr#   rB   kr%   s      rI   <lambda>r   4       rK   )rp   r   ndarraycallable	Estimatorc                     t          |t                    rdnd} | |t          d|                              |          }t	          |           d S )NrT   r/   r!   r7   r5   r%   r6   )
isinstancestrr5   r=   r   )r   r[   r7   r6   r|   s        rI   test_all_initr   1  s_     dC((/RRaF	jr&
 
 
	c$ii  rK   c                     t           S r   r   r   s      rI   r   r   C  r   rK   c                     t          | t                    rdnd}t          | t          d|          }t	          d          D ]}|                    t                     t          |           d S )NrT   r/   r   r   r    )r   r   r   r5   rangepartial_fitrB   r   )r7   r6   r|   is       rI   &test_minibatch_kmeans_partial_fit_initr   A  sy     dC((/RRaF	jq
 
 
B 3ZZ  
qrK   c                    t          j        t                    }t          j        t                    } | t          t          d|                              t                    } | t          |d|                              |          }t          |j        |j                   t          |j	        |j	                   d S )Nr/   r5   r7   r6   r%   )
r;   asfortranarrayrB   r#   r5   r=   r   r@   r   r>   )r   rt   	X_fortrancenters_fortrankm_ckm_fs         rI   test_fortran_aligned_datar   R  s     !!$$I'00O9GADV  	c!ff 	 9'	  
 
c)nn 	 D)4+@AAAt|T\22222rK   c                      t          t          dd          } t          j        }t	                      t          _        	 |                     t                     |t          _        d S # |t          _        w xY w)Nr!   r/   )r5   r%   verbose)r   r5   sysstdoutr   r=   rB   )r|   
old_stdouts     rI   test_minibatch_kmeans_verboser   e  sZ    	JR	K	K	KBJCJ 
q			


Z
s   A% %A3rg   c           	         t           j                            d                              d          }t	          | t
          ddd|d                              |           |                                }t          j	        d|j
                  sJ t          j	        d	|j
                  sJ |dk    rt          j	        d
|j
                  sJ d S t          j	        d|j
                  sJ d S )Nr   ri   rj   r!   rp   r/   )r8   r5   r%   r7   r6   rf   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r;   rp   rq   rd   r   r5   r=   
readouterrresearchout)r8   rf   capsysrB   captureds        rI   test_kmeans_verboser   p  s     		a  ''Z'88A
   
c!fff  ""H9/>>>>>918<@@@@@
axxy.=======y<hlKKKKKKKrK   c                      t          j        t          d          5  t          dd                              t
                     d d d            d S # 1 swxY w Y   d S )Nz,init_size.* should be larger than n_clustersr   rT      )	init_sizer5   )rr   r   RuntimeWarningr   r=   rB    rK   rI   'test_minibatch_kmeans_warning_init_sizer     s    	M
 
 
 < < 	"44488;;;< < < < < < < < < < < < < < < < < <   *AAAc                     t          j        t          d          5   | t          t          d                              t                     d d d            d S # 1 swxY w Y   d S )NzAExplicit initial center position passed: performing only one initr   rT   r7   r5   r6   )rr   r   r   r#   r5   r=   rB   )r   s    rI   'test_warning_n_init_precomputed_centersr     s     
Q
 
 
 I I 		w:bAAAEEaHHH	I I I I I I I I I I I I I I I I I Is   1AA!Ac                    t          dd|           \  }}d|d d dd d f<   t          dd| d	                              |          }|j                            d
                                          dk    sJ t          dd| d	                              |          }|j                            d
                                          dk    sJ t          d| d          }t          d          D ]}|                    |           |j                            d
                                          dk    sJ d S )Nr    rm   )r"   r#   r%   r   r3   r   rT   rp   )r5   
batch_sizer%   r7   r/   axis   )r5   r%   r7   )r   r   r=   r@   anysumr   r   )rt   zeroed_Xr   r|   r   s        rI    test_minibatch_sensible_reassignr     sw    'q/A  Hk HSSqS!!!V	"3EH
 
 
	c(mm  """**..0025555 
#4FX
 
 
	c(mm  """**..0025555 
B5Gh	W	W	WB3ZZ ! !
x    """**..002555555rK   c           
         t          j        t          t          f          }t	          t                    D ]/}t
          t          |k                                 d          ||<   0t          j        t                    }t          j
        |          }t          | ||d          d          }t          | |||t          j        t                    t           j                            |          dd           t          | ||d          d          }||k    sJ t          | |||t          j        t                    t           j                            |          dd           t!          ||           d S )Nr   r   r/   T)r   reassignment_ratiogV瞯<)r;   emptyr5   r   r   rB   r   meanrX   r"   
empty_liker   r   rY   rp   rq   r   )r[   rt   perfect_centersr   r:   r_   score_beforescore_afters           rI   test_minibatch_reassignr     sn    h
J788O: > >{a/05515==GI&&M-00K
 $D-!LLQOOL

	011	 	 	 	 #4QGGJJK+%%%% 

	011 	 	 	 	 K11111rK   c                  h    t          ddt          dd                              t                     d S )Nr    rT   r!   T)r5   r   r   r%   r   )r   r"   r=   rB   r   rK   rI   &test_minibatch_with_many_reassignmentsr     s8    
    
c!fffffrK   c                  l   t          ddd                              t                    } | j        dk    sJ t          ddd                              t                    } | j        dk    sJ t          dddt          dz                                 t                    } | j        t          k    sJ d S )NrT   rm   r/   )r5   r   r6         )r5   r   r6   r   )r   r=   rB   
_init_sizer"   r|   s    rI   test_minibatch_kmeans_init_sizer     s     
B1Q	?	?	?	C	CA	F	FB=B 
B1Q	?	?	?	C	CA	F	FB=B 
!AQ
 
 
	c!ff  =I%%%%%%rK   ztol, max_no_improvement)-C6?N)r   rT   c                     t          ddd          \  }}}t          d|d|dddd|	  	        }|                    |           d|j        cxk     rdk     sn J |                                 }|d	|j        v sJ |dk    rd
|j        v sJ d S d S )Nr1   r   T)r#   r%   return_centersr   rT   r/   )	r5   r7   r   rf   r%   r{   r6   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   r=   rA   r   r   )r   rf   r   rB   rv   r#   r|   r   s           rI   #test_minibatch_declared_convergencer     s     qqNNNMAq'	-

 

 

B FF1IIIrzB  ""H!1X\AAAA
axx;x|KKKK xKKrK   c                     d} t           j        d         }t          d| d                              t                     }|j        t          j        |j        | z  |z            k    sJ t          |j        t                    sJ t          d| ddd d                              t                     }|j        dk    sJ |j        d|z  | z  k    sJ t          |j        t                    sJ d S )Nr   r   r1   )r5   r   r%   rT   )r5   r   r%   rf   r   r{   )
rB   r   r   r=   rA   r;   ceiln_steps_r   int)r   r"   r|   s      rI   test_minibatch_iter_stepsr   '  s    J
I	A*1	M	M	M	Q	QRS	T	TB :"+
":i!GHHHHHHbj#&&&&& 

 
 
 
c!ff  :;2	>j88888bk3'''''''rK   c                      t                                           } t          dt          d          }|                    |            t          |           t          | t                      d S )NFr!   )copy_xr5   r%   )rB   r   r   r5   r=   r   r   )my_Xr|   s     rI   test_kmeans_copyxr   @  sX    6688D	u"	E	E	EBFF4LLL D!rK   c                 T   t           j                            |                              dd          } | d|d          }|                    |                              |          } | d|d          }|                    |                              |          }||k    sJ d S )Nr    rT   r/   )r6   r%   r{   )r;   rp   rq   randnr=   score)r   rt   rB   km1s1km2s2s          rI   test_score_max_iterr  K  s     		01177R@@A
)1+=
J
J
JC			!		B
)1+=
K
K
KC			!		B777777rK   zEstimator, algorithmr{   r3   c                    t          ddd|          \  }} |||          } | ddd||          }||                    |           |                    |           |j        }	|                    |          }
t          |
|	           |                    |          }
t          |
|	           |                    |j                  }
t          |
t          j	        d                     d S )Nr   rT   r"   r   r#   r%   r0   rp   )r5   r7   r6   r{   r%   r   )
r   
set_paramsr=   r>   predictr   fit_predictr@   r;   arange)r   r8   r&   r{   global_dtypert   rB   rv   r|   ra   preds              rI   test_kmeans_predictr  X  s    "b?Q  DAq 	Ql+++A	'
 
 
B 
	***FF1IIIZF ::a==DtV$$$ >>!DtV$$$ ::b)**DtRYr]]+++++rK   c                    t           j                            |                              t          f          } | t
          |d          }|                    t          |            | t
          |d          }|                    t          |           t          |j
        |j
                   t          |j        |j                   d S Nr/   r5   r%   r6   r9   )r;   rp   rq   random_sampler"   r5   r=   rB   r   r   r>   r   r@   )r   rt   r:   km_dense	km_sparses        rI   test_dense_sparser    s     I))*<==KK	 M y,>q  H LL-L000	,>q  I MM%}M555x'):;;;H-y/IJJJJJrK   )rp   r   r   c                 |   t          |t                    rdnd} | t          ||d          }|                    t                     t          |                    t                    |j                   |                    t                     t          |                    t                    |j                   d S )NrT   r/   r   r   )	r   r   r5   r=   r   r   r  rB   r>   )r   r7   r6   r|   s       rI   test_predict_dense_sparser    s     dC((/RRaF	jtFQR	S	S	SBFF5MMMrzz!}}bj111FF1IIIrzz%(("*55555rK   r   c           	      B   t          j        ddgddgddgddgddgddgg          } |||	          }|d
k    rdnd}|d
k    r
|d d         n|} | d|||          }| t          u r|                    d           |                    |           |j        j        t           j        k    sJ g d}	t          t          |j
        |	          d           | t          u r>t          |                              |          }|j        j        t           j        k    sJ d S d S )Nr   rT      rR   rQ   r/   r3   rV   r0   r   r   )r   )r   r/   r/   r   r   r/   r   )r;   r<   r   r
  r=   r@   r,   float64r   r   r>   r   r   )
r   r&   r,   r7   rt   X_denserB   r6   r|   rD   s
             rI   test_integer_inputr    sY    hAR2q'B7QFQGLMMGWE***A)##QQF)++72A2;;D	4=O
 
 
B O##
###FF1III $
2222(((OOBJ@@#FFF O##2YY""1%%"(BJ6666 $#66rK   c                     | t           |                              t                    }|                    |j                  }t          |t          |j                             t          |                                t          j
        t                                |                    t                    }t          |t          t          |j                             d S )Nr5   r%   )r5   r=   rB   	transformr@   r   r
   r   diagonalr;   rY   )r   rt   r|   Xts       rI   test_transformr$    s     
j7I	J	J	J	N	Nq	Q	QB 
b)	*	*BB*2+>??@@@r{{}}bhz&:&:;;; 
aBB*1b.ABBCCCCCrK   c                      | |d                               t                                        t                    } | |d                              t                    }t	          ||           d S )Nr/   )r%   r6   )r=   rB   r!  fit_transformr   )r   rt   X1X2s       rI   test_fit_transformr)    sn     
 21	=	=	=	A	A!	D	D	N	Nq	Q	QB	 21	=	=	=	K	KA	N	NBBrK   c                     t           j        }dD ]@}t          t          d|| d                              t
                    }|j        |k    sJ Ad S )N)r/   rm   rT   rp   r/   )r5   r7   r6   r%   r{   )r;   infr   r5   r=   rB   r?   )rt   previous_inertiar6   r|   s       rI   test_n_initr-    sq    v 
/ 
/ !+
 
 
 #a&& 	 {......
/ 
/rK   c                 $   t          t          t          d |           \  }}}|j        t          t          fk    sJ t          j        |          j        d         t          k    sJ t          t          t          |          d           |dk    sJ d S )N)r5   r:   r%   r   r   r   )
r   rB   r5   r   r   r;   r   r   r   r   )rt   cluster_centersra   inertias       rI   test_k_means_functionr1    s    '.	jCU( ( ($OVW  Z$<<<<<9V"1%3333 OK88#>>>S======rK   c                     | d|          }i }i }i }i }t           j        t           j        fD ]}|                    |d          }	|                    |	           |j        ||<   |                    |	          ||<   |j        ||<   |j        ||<   |j        j	        |k    sJ | t          u r/|                    |	dd                    |j        j	        |k    sJ t          |t           j                 |t           j                 d           t          |t           j                 |t           j                 |t           j                                                 dz  	           t          |t           j                 |t           j                 |t           j                                                 dz  	           t          |t           j                 |t           j                            d S )
Nr/   )r6   r%   Fr   r   r1   r   rtol)atol)r;   r  float32astyper=   r?   r!  r@   r>   r,   r   r   r   maxr   )
r   r[   rt   r|   r0  r#  r#   ra   r,   rB   s
             rI   test_float_precisionr:    s    
!*<	=	=	=BG	BGF*bj) 6 6KKEK**
q			LLOO5	,
u "(E1111 ''NN1QqS6"""&,5555 GBJ')<4HHHHBrzNBrzNBJ9K9K9M9MPT9TUUUU
WRZ0wrz7J7N7N7P7PSW7W    vbj)6"*+=>>>>>rK   c                     t                               |d          }t                              |d          } | |t          d          }|                    |           t          j        |j        |          rJ d S )NFr3  r/   r   )rB   r8  r#   r5   r=   r;   may_share_memoryr@   )r   r,   
X_new_typecenters_new_typer|   s        rI   test_centers_not_mutatedr?  '  s{     %e,,J~~e%~88	(Z	J	J	JBFF:"2#68HIIIIIIIrK   c                     t          t                                        |           }t          t          |j        d                              |           }t	          |j        |j                   d S )N)r5   r/   r5   r7   r6   )r   r5   r=   r@   r   )r[   r  r  s      rI   test_kmeans_init_fitted_centersrB  6  sd     J
'
'
'
+
+D
1
1C
JS-A!
L
L
L
P
PQU
V
VCC(#*>?????rK   c                 h   t          j        ddgddgddgddgg          }t          d|           }d}t          j        t
          |          5  |                    |           t          |j                  t          t          d                    k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r/      r   zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.r   r1   )
r;   asarrayr   rr   r   r   r=   setr>   r   )rt   rB   r|   msgs       rI   1test_kmeans_warns_less_centers_than_unique_pointsrH  @  s    

QFQFQFQF344A	1+=	>	>	>B	D  
(	4	4	4 0 0
q			 2:#eAhh--/////	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   A
B''B+.B+c                 .    t          j        | d          S Nr   r   )r;   sortr   s    rI   _sort_centersrL  Q  s    77####rK   c                 |   t           j                            |                               ddt                    }t          j        t          |d          }t          t          dt          |           }t          |                              t          |          }t          j        |j        |          }t          |                              |          }t          |j        |           t          |j        |j                   t          t!          |j                  t!          |j                             d S )Nr/   rm   rj   r   r   )r7   r6   r5   r%   r9   )r;   rp   rq   randintr"   repeatrB   r   r#   r5   r   r=   r>   r   r   r?   rL  r@   )rt   r:   X_repeatr|   km_weightedrepeated_labelskm_repeateds          rI   test_weighted_vs_repeatedrT  U  s   
 I))*<==EE	19 F  M yM222H	Q:DV
 
 
B ))---??Ki 3]CCO))--))K{*O<<<K(+*>???k233k233    rK   c                 V   t          j        t                    } | t          |d          }t	          |                              |d           }t	          |                              ||          }t          |j        |j                   t          |j	        |j	                   d S r  )
r;   rX   r"   r5   r   r=   r   r>   r   r@   )r   r[   rt   r:   r|   km_nonekm_oness          rI   test_unit_weights_vs_no_weightsrX  o  s    
 GI&&M	j7IRS	T	T	TBBiimmDm55GBiimmDm>>Gw888G,g.FGGGGGrK   c                    t           j                            |                              t                    } | t
          |d          }t          |                              ||          }t          |                              |d|z            }t          |j	        |j	                   t          |j        |j                   d S )Nrj   r/   r  r9   r.   )r;   rp   rq   uniformr"   r5   r   r=   r   r>   r   r@   )r   r[   rt   r:   r|   km_orig	km_scaleds          rI   test_scaled_weightsr]  ~  s    
 I))*<==EE9EUUM	j7IRS	T	T	TBBiimmDm>>Gb		d#2EFFIw	(9:::G,i.HIIIIIrK   c                  r    t          dd                              t                    } | j        dk    sJ d S )Nr+   r/   )r8   r{   )r   r=   rB   rA   r   s    rI    test_kmeans_elkan_iter_attributer_    s7     
'A	.	.	.	2	21	5	5B:??????rK   c                 .    | dgdgg          }ddg}t          j        dgdgg          }t          d|d          }|                    ||           t	          t          |j                            dk    sJ t          |j        dgdgg           d S )	NrQ   r/   gffffff?g?rT   r3   rA  r9   )	r;   r<   r   r=   lenrF  r>   r   r@   )r&   rB   r:   r7   r|   s        rI   #test_kmeans_empty_cluster_relocatedrb    s     	rdQC[!!A#JM8bTB4L!!D	14	2	2	2BFF1MF***s2:1$$$$B'2$55555rK   c                    t           j                            |          }|                    d          }t	          dd          5   | t
          |                              |          j        }d d d            n# 1 swxY w Y   t	          dd          5   | t
          |                              |          j        }d d d            n# 1 swxY w Y   t          ||           d S )N)2   rT   rj   r/   openmp)limitsuser_apir   r3   )	r;   rp   rq   rd   r   r5   r=   r>   r   )r   rt   ru   rB   result_1result_2s         rI   #test_result_equal_in_diff_n_threadsrj    sc    )

 2
3
3C


!!A	!h	7	7	7 
 
I:LMMMSVV 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
!h	7	7	7 
 
I:LMMMSVV 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 x*****s$   +A>>BB+CCCc                      t          j        t          d          5  t          dd                              t
                     d d d            d S # 1 swxY w Y   d S )Nz9algorithm='elkan' doesn't make sense for a single clusterr   r/   r+   )r5   r8   )rr   r   r   r   r=   rB   r   rK   rI   test_warning_elkan_1_clusterrl    s    	I
 
 
 7 7 	!w///33A666	7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7r   c                 d   t           j                            |                              d          }|d d         } | |          }d } |||          \  }}t	          dd||d                              |          }|j        }	|j        }
t          ||	           t          ||
           d S )N)r    rm   rj   rm   c                     |                                 }t          | |          }t          |j        d                   D ]%}| ||k                                 d          ||<   &t          | |          }||fS rJ  )r   r   r   r   r   )rB   r7   new_centersra   labels        rI   	py_kmeansz+test_k_means_1_iteration.<locals>.py_kmeans  s~    iikk*1d334:a=)) 	A 	AE!"6U?!3!8!8a!8!@!@K*1k::{""rK   r/   )r5   r6   r7   r8   r{   )
r;   rp   rq   rZ  r   r=   r>   r@   r   r   )r&   r)   rt   rB   rC   rq  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              rI   test_k_means_1_iterationrw    s     		01199x9HHARaR5LQA# # # &Ia66IzQ\TA  	c!ff  !I+Jy),,,J
+++++rK   squaredTFc                    t           j                            |          }t          j        dddd||           }|                                                    d          }|                    d                              | d          }|d	z                                  }||z
  d	z                                  }|r|nt          j	        |          }t          |||          }	t          |j        |j        |||          }
| t           j        k    rd
nd}t          |	|
|           t          |	||           t          |
||           d S )Nr/   r    r.   csrdensityformatr%   r,   rQ   Fr3  r3   r   gHz>r4  )r;   rp   rq   sptoarrayrW   r  r8  r   sqrtr   r   r[   r\   r7  r   )r,   rx  rt   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denser5  s               rI   test_euclidean_distancer    sU   
 )

 2
3
3Cy	3E5  H   ((,,G		#e%00AdZZ\\N1"''))H"9xx(9(9H9'1gNN;x'NG  BJ&&44DD(*?dKKKK((>>>>)8$??????rK   c                 >   t           j                            |          }t          j        dddd||           }|                                }|                    d                              | d          }|                    dd                              | d          }|                    ddt           j        	          }|||         z
  d
z  	                    d          }t          j	        ||z            }	t          ||||d          }
t          ||||d          }| t           j        k    rdnd}t          |
||           t          |
|	|           t          ||	|           d}||k    }||         ||         z
  d
z  	                    d          }t          j	        |||         z            }	t          ||||d|          }
t          ||||d|          }t          |
||           t          |
|	|           t          ||	|           d S )Nr    rT   r.   rz  r{  Fr3  rm   )rk   r,   r3   r/   r   )	n_threadsr   rn   r4  )r  single_label)r;   rp   rq   r~  r  r  r8  rN  rZ   r   r   r   r7  r   )r,   rt   r   X_sparser  r:   r#   ra   	distancesr  inertia_denseinertia_sparser5  rp  masks                  rI   test_inertiar    sS    )

 2
3
3CyRUE  H   GIIcNN))%e)<<Mii2%%e%%88G[[BH[55FGFO+166A6>>Ivi-/00H"7M7FVWXXXM$-&A  N BJ&&44DDM>====M8$7777NH48888 EU?D$-'%.0Q6;;;CCIvi-"5566H"15  M %-&AE  N M>====M8$7777NH4888888rK   zKlass, default_n_initrT   r1   c                     | d          }t          j                    5  t          j        dt                     |                    t
                     d d d            n# 1 swxY w Y   | j        dk    rdnd}d| d} |             }t          j        t          |	          5  |                    t
                     d d d            d S # 1 swxY w Y   d S )
Nr/   r6   errorr   rT   r1   z/The default value of `n_init` will change from z to 'auto' in 1.4r   )	warningscatch_warningssimplefilterr   r=   rB   __name__rr   r   )Klassdefault_n_initestrG  s       rI   !test_change_n_init_future_warningr  *  s^   
%q///C		 	"	"  g}555


               !>X55RR1N	. 	 	 	  %''C	m3	/	/	/  


                 s#   5A!!A%(A%&CCCc                      | dd          }|                     t                     |j        dk    sJ  | dd          }|                     t                     | j        dk    r|j        dk    snd S J d S )Nr~   r   )r6   r7   r/   rp   r   rT   )r=   rB   _n_initr  )r  r  r  s      rI   test_n_init_autor  ;  s    
%vK
0
0
0CGGAJJJ;!
%vH
-
-
-CGGAJJJ %( : :3;"rK   c                     t          j        dgdgdgg          }t          j        g d          } | dd                              ||           t          |t          j        g d                     d S )Nr/   r3   rD  )r.   g?g333333?r   r   r9   )r;   r<   r=   r   )r   rB   r:   s      rI   test_sample_weight_unchangedr  F  s~     	1#sQC!!AH___--MI+++///OOO}bh&?&?@@@@@rK   zparam, matchr5   r/   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                     | d d         S )Nr3   r   X_r   r%   s      rI   r   r   [  s    BQB rK   rV   zUThe shape of the initial centers .* does not match the number of features of the datac                     | d dd df         S )NrV   r3   r   r  s      rI   r   r   e  s    BQBF rK   c                      | d          }t          j        t          |          5   |j        di |                    t
                     d d d            d S # 1 swxY w Y   d S )Nr/   r  r   r   )rr   raises
ValueErrorr
  r=   rB   )r   paramr   r|   s       rI   test_wrong_paramsr  P  s    > 
!			B	z	/	/	/ & &""1%%%& & & & & & & & & & & & & & & & & &s   &AA"Ax_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc                     t          j        t          |          5  t          t          t
          fi |  d d d            d S # 1 swxY w Y   d S )Nr   )rr   r  r  r   rB   r5   )r  r   s     rI   !test_kmeans_plusplus_wrong_paramsr  t  s     
z	/	/	/ 0 0://///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   AA	Ac                    |                      |          } t          | t          |          \  }}|j        d         t          k    sJ |dk                                    sJ || j        d         k                                    sJ |j        d         t          k    sJ |                    d          |                     d          k                                    sJ |                    d          |                     d          k                                    sJ t          t          |                              |          |           d S )Nrl   r   r   )	r8  r   r5   r   allr9  minr   rB   )r[   r,   rt   r#   r\   s        rI   test_kmeans_plusplus_outputr    sE    ;;uD&j'9  GW =z))))qLtz!}$))+++++ =z))))KKQK4888#3#3388:::::KKQK4888#3#3388:::::
 AgJ%%e,,g66666rK   )rx  c                 z    t          t          t          |           \  }}t          t          |         |           d S )N)r  )r   rB   r5   r   )r  r#   r\   s      rI   test_kmeans_plusplus_normsr    s7     'q*oVVVGWAgJ(((((rK   c                     t          t          t          |           \  }}t          j        t                    }t          |t          |           \  }}t          ||           d S )Nrl   )r   rB   r5   r;   r   r   )rt   	centers_crv   r   r   s        rI   test_kmeans_plusplus_dataorderr    sd    "1j?QRRRLIq!!$$I(:,>  OQ I/////rK   c                  D   t          j        g dt           j                  } t          | | d          sJ t          j        g dt           j                  }t          | |d          sJ t          j        g dt           j                  }t          | |d          rJ d S )N)r/   r   r   r/   r3   r   r3   r/   r0   r1   )r   r3   r3   r   r/   r3   r/   r   )r/   r   r   r3   r3   r   r3   r/   )r;   r<   rZ   r   )labels1labels2labels3s      rI   test_is_same_clusteringr    s    h///rx@@@Gw33333 h///rx@@@Gw33333 h///rx@@@G"7GQ7777777rK   kwargs)r7   r6   c                     t          j        ddgddgddgddggt           j                  }t          dddi| }|                    |           dS )	zZCheck that init works with numpy scalar strings.

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

    Non-regression test for gh-24253.
    r   rT   r   r	  N)
r   r~  
csr_matrixr   r  r   r@   r>   r  r   )r  rB   rv   rH   y_pred1y_pred2s         rI   ,test_predict_does_not_change_cluster_centersr    s     BQOOODAq M!XXF  ##G78OPPF.v~>>FNnnQGw(((((rK   )}__doc__r   r   r  numpyr;   scipyr   r~  rr   sklearn.utils._testingr   r   sklearn.utils.fixesr   sklearn.baser   sklearn.exceptionsr   sklearn.utils.extmathr	   sklearn.metricsr
   r   sklearn.metrics.clusterr   sklearn.clusterr   r   r   r   sklearn.cluster._kmeansr   r   sklearn.cluster._k_means_commonr   r   r   r   r   r   r   r   sklearn.datasetsr   ior   rG  markfilterwarnings
pytestmarkr<   r#   r"   r   r5   r   rB   r   r  r   parametrizer7  r  rJ   rN   rb   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  rZ   int64r  r$  r)  r-  r1  r:  r?  rB  rH  rL  rT  rX  r]  r_  rb  rj  rl  rw  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r   rK   rI   <module>r     s     				 



             5 5 5 5 5 5 2 2 2 2 2 2 1 1 1 1 1 1       1 1 1 1 1 1 + + + + + + . . . . . . 5 5 5 5 5 5 3 3 3 3 3 3 < < < < < < < < < < + + + + + + 3 3 3 3 3 3 4 4 4 4 4 4 J J J J J J K K K K K K J J J J J J K K K K K K : : : : : : ; ; ; ; ; ; ? ? ? ? ? ? < < < < < < ' ' ' ' ' '      K  [''	C88
 "(!!!!!!!!!  	  
Jc  ; 	a RXr}-GX3F    '7!3442:rz":;;- - <; 54 
-* RXr}-GX3F    '7!344C C 54 C: RXr}-GX3F   &7 &7 &7R (G)<==RXr}-GX3F     7 7 788K K 98  >=
K6 w&899! ! :9!$ vv&677, , 87,<2 <2 <2~   !U'81DEE
{G%G%GH666   
 v&?@@  A@  FE 
{G%G%GH666   
	 	 
	 v&?@@3 3 A@3$      w&899q	**L L +* :9L2< < < v&?@@I I A@I6 6 6< !U'81DEE+2 +2 FE+2\  & & &$ 2\74KLLL L MLL6( ( (2   v&?@@	 	 A@	 RXr}-GX3F    g)OT+BC  aX.. ,  , /.	   ,F v&?@@K K A@K$ 
X{G,2T2T2T    v&?@@
6 
6 A@ 
6 RXr}-GX3F    28RX"677+y!9::v&?@@7 7 A@ ;: 87 78 v&?@@D D A@D" v&?@@  A@/ / /    !U'81DEEv&?@@!? !? A@ FE!?H 28RXrz2:"NOOv&?@@
J 
J A@ PO
J !U'81DEE@ @ FE@0 0 0"$ $ $  4 !U'81DEEv&?@@
H 
H A@ FE
H !U'81DEEv&?@@
J 
J A@ FE
J   RXr}-GX3F   6 6 6 v&?@@+ + A@+*7 7 7 RXr}-GX3F    '7!344, , 54 ,6 2:rz":;;T5M22@ @ 32 <;@2 2:rz":;;'9 '9 <;'9V 0FB</STAU2VWW  XW  0FB</STAU2VWWB B XWB v&?@@A A A@A v&?@@
	A	&(NOQrrUO&	
 778&	
 Qrr2A2vY2	
 ;;<2	
# 4& &5  A@6&  "1"&3	
	 	0 0	 	0
 !U,,2:rz":;;7 7 <; -,70 *YYq$-G-G-G,NOO) ) PO)
0 
0 
08 8 8  ,,-!Q!Q8HTU/V/VW 	 	 	 e_.-0PQ S S	 S tUm44) ) 54) ) )rK   