
    >[gr                     r   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/ ddl0m1Z1  ejd                  g dg dg dg      Z3dZ4e3jj                  \  Z6Z7 ee4e3dd      \  Z8Z9e/D  cg c]
  }  | e8       c} Z:ejd                  ge/z   Z; e<e:      dk(  rg dnddgZ=ej|                  j                  de;e=      ej|                  j                  dd d!g      ej|                  j                  d"ej                  ej                  g      d#                      ZBej|                  j                  de;e=      ej|                  j                  dd d!g      d$               ZCej|                  j                  de;e=      d%        ZDej|                  j                  d&d'd(g      ej|                  j                  de;e=      ej|                  j                  d)g d*      d+                      ZEej|                  j                  d,d d!g      d-        ZFej|                  j                  d.e:      d/        ZGd0 ZHej|                  j                  d1e8ge:z   e=      ej|                  j                  d2d3d4e3d5 gg d6      ej|                  j                  d7eeg      d8                      ZIej|                  j                  d2d3d4e3d9 gg d6      d:        ZJej|                  j                  d;d<d=d> d?fd@g      ej|                  j                  d7eeg      dA               ZKej|                  j                  d7eeg      dB        ZLdC ZMej|                  j                  d,d d!g      ej|                  j                  d)dDdg      dE               ZNdF ZOej|                  j                  d7eeg      dG        ZPdH ZQej|                  j                  d1e8ge:z   e=      dI        ZRdJ ZSdK ZTej|                  j                  dLdMdNg      dO        ZUdP ZVdQ ZWej|                  j                  d7eeg      dR        ZXej|                  j                  de;e=      ej|                  j                  dSed fed!fedfg      ej|                  j                  dTddg      dU                      ZYej|                  j                  d.e:      ej|                  j                  d7eeg      dV               ZZej|                  j                  d.e:      ej|                  j                  d2d3d4e3gg dW      ej|                  j                  d7eeg      dX                      Z[ej|                  j                  de;e=      ej|                  j                  d"ej                  ej                  g      ej|                  j                  d2d4dYg      ej|                  j                  d7eeg      dZ                             Z^ej|                  j                  d7eeg      d[        Z_ej|                  j                  d7eeg      d\        Z`d] Zad^ Zbej|                  j                  d1e8ge:z   e=      ej|                  j                  d7eeg      d_               Zcej|                  j                  d"ej                  ej                  ej                  ej                  g      ej|                  j                  d7eeg      d`               Zdej|                  j                  d1e8ge:z   e=      da        Zedb Zfdc Zgdd Zhej|                  j                  d1e8ge:z   e=      ej|                  j                  d7eeg      de               Ziej|                  j                  d1e8ge:z   e=      ej|                  j                  d7eeg      df               Zjdg Zkej|                  j                  de;e=      dh        Zlej|                  j                  d7eeg      di        Zmdj Znej|                  j                  de;e=      ej|                  j                  dd d!g      dk               Zoej|                  j                  d"ej                  ej                  g      ej|                  j                  dldmdng      do               Zpej|                  j                  d"ej                  ej                  g      dp        Zqej|                  j                  dqedrfedsfg      dt        Zrej|                  j                  d7eeg      du        Zsej|                  j                  d7eeg      ej|                  j                  dvdwe4dxz   idyfd2e8dd idzfd2d{ idzfd2e8dd|ddf   id}fd2d~ id}fg      d               Ztej|                  j                  dvde8dd idfg      d        Zuej|                  j                  d1e8ge:z         ej|                  j                  d"ej                  ej                  g      d               Zvej|                  j                  d e-e8dm      dg      d        Zwd Zxd Zyej|                  j                  dd2 ej                  d4      iddgdxdxggdxdf      d        Z{ej|                  j                  dedfedfedfg      d        Z|ej|                  j                  de/dgz         d        Z}ej|                  j                  d2d4d3g      d        Z~ej|                  j                  d2d4d3g      d        Zej|                  j                  de;e=      ej|                  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)_get_threadpool_controller)              @r   r   r   )      ?r!   g      @r   r   )r!   r   r   r    r!   d   r!   *   )	n_samplescenterscluster_stdrandom_state   )densesparse_matrixsparse_arrayr)   r*   array_constr)idsalgolloydelkandtypec                     | ddgddgddgddgg|      }g d}t        j                  ddgddgg|      }g d}d}t        j                  ddgd	dgg|      }d
}	t        d
d||      }
|
j                  ||       t	        |
j
                  |       t        |
j                  |       t        |
j                  |       |
j                  |	k(  sJ y )Nr         ?   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              ]/var/www/html/bid-api/venv/lib/python3.12/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_resultsrN   ;   s     	q!fsAha1a&9GA M88aVaV,E:L"Oxx%eQZ 8FOqNF
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   S   s    	q!fsAha1a&9:A 88c3Z!Q01LqNF
JJqMOFOO%56>>_,,,	C&!1Iay16>>?;//1AB C&!3K$56>>?;//1AB	Cs   <8B5 5AC98C9c           
         t        j                  g d      j                  dd      } | |      }t        j                  d      }t        j                  g d      j                  dd      }t        j                  g d      j                  dd      }t        j                  g d      }t        j                  dt         j
                        }| t         j                  u rt        ||||||       n0t        |j                  |j                  |j                  |||||       t        |g d	       t        |d
gdgdgg       y )N)
      $g      #ig      !ir4   	         #@
   rU   r4   rX   )rT   rY   )g     0rY   rY   )g      $@r   r   r5   )   r4   r4   irW   )r?   r@   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r,   rF   r>   centers_oldcenters_newweight_in_clusterslabelss          rM   test_relocate_empty_clustersrf   r   s	   
 	?@HHQOAQAGGBKM ((,-55b!<K
 ((,-55b!<K,/XXb)Frxx&}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   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callable	Estimatorc                     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   1  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   /  sM     dC(RaF	jq
B 3Z
q  rO   zinit, expected_n_init)r   r4   )rt   defaultc                 D    |j                  || j                  d   f      S )Nr4   rn   )uniformr   )rF   r9   r'   s      rM   r   r   F  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   @  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   _  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   r  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_clustersmatchrX      )	init_sizer9   )rv   warnsRuntimeWarningr   rA   rF    rO   rM   'test_minibatch_kmeans_warning_init_sizer     s;    	M
 	"488;
 
 
   !AAc                     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     s?     
Q
 	w:bAEEaH	
 
 
s   'AAc                 p   t        dd|       \  }}d|d d dd d f<   t        dd| d	      j                  |      }|j                  j	                  d
      j                         }|dkD  sJ d|d       t        dd| d	      j                  |      }|j                  j	                  d
      j                         }|dkD  sJ d|d       t        d| d      }t        d      D ]  }|j                  |        |j                  j	                  d
      j                         }|dkD  sJ d|d       y )Nr"   rq   )r$   r%   r'   r   r(   r   rX   rt   )r9   
batch_sizer'   r;   r4   axisrV   znum_non_zero_clusters=z is too small   )r9   r'   r;   )r   r   rA   rD   anysumr   r   )rx   zeroed_Xr   r   num_non_zero_clustersr   s         rM    test_minibatch_sensible_reassignr     sh    'q/AHk HSqS!V	"3EH
	c(m  //333;??A 1$N)?)>(@&NN$ 
#4FX
	c(m  //333;??A 1$N)?)>(@&NN$ 
B5Gh	WB3Z
x   //333;??A 1$N)?)>(@&NN$rO   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  ;  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	  T  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  _  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   predictr   fit_predictrD   r?   arange)r   r<   r,   r   global_dtyperx   rF   rz   r   re   preds              rM   test_kmeans_predictr  l  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_transformr-    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_transformr2    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_initr6    sT    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   r9  r,  r%   re   r1   rF   s
             rM   test_float_precisionrC    s    
!*<	=BG	BGF**bjj)e%0
q	LLO5	,,

u ""((E111 'NN1Qq6"&&,,555 *& 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   rA  r%   r9   rA   r?   may_share_memoryrD   )r   r1   
X_new_typecenters_new_typer   s        rM   test_centers_not_mutatedrH  =  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_centersrJ  L  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_pointsrP  \  s    


QFQFQFQF34A	1+=	>B	D  
(	4
q	 2::#eAh-///	 
5	4	4s   >BBc                 0    t        j                  | d      S Nr   r   )r?   sortr   s    rM   _sort_centersrT  m  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   rT  rD   )rx   r>   X_repeatr   km_weightedrepeated_labelskm_repeateds          rM   test_weighted_vs_repeatedr\  q  s    
 II))*<=EE	19 F M yyM2H	Q:DV
B )---?Kii 3 3]CO)--)K{**O<K((+*>*>?k223k223rO   c                 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_weightsr`    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_weightsrd    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_attributerf    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   lenrN  rB   r   rD   )r,   rF   r>   r;   r   s        rM   #test_kmeans_empty_cluster_relocatedri    s     	rdQC[!A#JM88bTB4L!D	14	2BFF1MF*s2::1$$$B''2$5rO   c                    t         j                  j                  |      }|j                  d      }t	               j                  dd      5   | t        |      j                  |      j                  }d d d        t	               j                  dd      5   | t        |      j                  |      j                  }d d d        t               y # 1 sw Y   axY w# 1 sw Y   "xY w)N)2   rX   rn   r4   openmp)limitsuser_apir)  r(   )
r?   rt   ru   rh   r   limitr9   rA   rB   r   )r   rx   ry   rF   result_1result_2s         rM   #test_result_equal_in_diff_n_threadsrr    s     ))

 2
3C


!A	#	%	+	+1x	+	H:LMSVW 	 
I 
$	%	+	+1x	+	H:LMSVW 	 
I x* 
I	H 
I	Hs   (C(C!C!C*c                      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_clusterrt    s;    	I
 	!w/33A6	
 
 
r   c                 8   t         j                  j                  |      j                  d      }|d d } | |      }d } |||      \  }}t	        dd||d      j                  |      }|j                  }	|j                  }
t        ||	       t        ||
       y )N)r"   rq   rn   rq   c                     |j                         }t        | |      }t        |j                  d         D ]  }| ||k(     j	                  d      ||<    t        | |      }||fS rR  )r   r   r   r   r   )rF   r;   new_centersre   labels        rM   	py_kmeansz+test_k_means_1_iteration.<locals>.py_kmeans  sh    iik*1d34::a=)E!"6U?!3!8!8a!8!@K **1k:{""rO   r4   )r9   r:   r;   r<   r   )
r?   rt   ru   r   r   rA   rB   rD   r   r   )r,   r.   rx   rF   rG   ry  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              rM   test_k_means_1_iterationr    s    
 			0199x9HARa5LQA# &a6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>r=  )r?   rt   ru   sptoarrayr[   r   rA  r   sqrtr
   r   r_   r`   r@  r   )r1   r  rx   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denser>  s               rM   test_euclidean_distancer    s   
 ))

 2
3Cyy	3E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   r=  )r  single_label)r?   rt   ru   r  r  r   rA  rV  r^   r   r   r   r@  r   )r1   rx   r   X_sparser&  r>   r%   re   	distancesr  inertia_denseinertia_sparser>  rx  masks                  rM   test_inertiar    s    ))

 2
3CyyRU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  I  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(   rL  )r3   g?g333333?r   r)  r=   )r?   r@   rA   r   )r   rF   r>   s      rM   test_sample_weight_unchangedr  T  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   i  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  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  ^  sD    > 
!	B	z	/""1% 
0	/	/s   &AAx_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc                     t        j                  t        |      5  t        t        t
        fi |  d d d        y # 1 sw Y   y xY w)Nr   )rv   r  r  r	   rF   r9   )r  r   s     rM   !test_kmeans_plusplus_wrong_paramsr    s-     
z	/:// 
0	/	/s	   ;Ac                 6   | j                  |      }t        |t        |      \  }}|j                  d   t        k(  sJ |dk\  j	                         sJ ||j                  d   k  j	                         sJ |j                  d   t        k(  sJ |j                  d      |j                  d      k  j	                         sJ |j                  d      |j                  d      k\  j	                         sJ t        t        |   j                  |      |       y )Nrp   r   r   )	rA  r	   r9   r   allrB  minr   rF   )r   r1   rx   r_   r%   r`   s         rM   test_kmeans_plusplus_outputr    s    U#D&j'9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?   rM  r%  r   rA   )r  rF   
clusterings      rM   -test_kmeans_with_array_like_or_np_scalar_initr    sO     	

QFS!HsAhA7rzzJA/1//JNN1rO   zKlass, methodrA   r   c                    | 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    s~     %%'JWFGFFA((..q1J,,.IE*4EF4Eq:,qc*4EF	RFs   3B	csr_containerc                    t        dddd      \  }}|  | |      }t               }|j                  |      }t        |j                        |_        t        |j
                        |_        |j                  |      }t        ||       y)z_Check that predict does not change cluster centers.

    Non-regression test for gh-24253.
    r   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 
~	&)84 
'	&	&s   DD&c           
         t         j                  j                  |      }t        ddd|      \  }}|j	                  |j
                  d         }d|ddd<   t        |d	      }t               }|j                  ||| |d
t         j                  j                  |            }t        |ddd   |      }	t        j                  t        j                  |	d            rJ y)zCheck that if sample weight is 0, this sample won't be chosen.

    `_init_centroids` is shared across all classes inheriting from _BaseKMeans so
    it's enough to check for KMeans.
    r"   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   rO  s        rM   test_relocating_with_duplicatesr  E  s     	1a&1a&1a&1a&1a&9:A	11		:B
RC	(	4
|A 
5 ::?? 
5	4s   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   sklearn.utils.parallelr   r@   r%   r$   r   r9   r   rF   r   X_as_any_csrdata_containersrh  data_containers_idsmarkparametrizer@  r%  rN   rR   rf   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r   r"  r^   int64r'  r-  r2  r6  r:  rC  rH  rJ  rP  rT  r\  r`  rd  rf  ri  rr  rt  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r  r  r  )	containers   0rM   <module>r     s    	 
      M M   F ' 1 I 3 8 
 , . = "((!!! 	  
Jc; /==n	!n=88*~- <A /
?	#  >QR'7!342::rzz":;- < 5 S-* >QR'7!34C 5 SC: >QR&7 S&7R (G)<=>QR 78K 9 S >K6 w&89! :!$ ,/<2 0<2~ C,  
 
{G%GH6  
 v&?@ A 
{G%GH6  
	
	  		
 	
 v&?@- A-  v&?@3 A3$  w&89q	*L + :L2< v&?@I AIOB C,  
+2
+2\&$ 2\74KLL ML6(2 v&?@	 A	 >QRg)OT+BC aX. , /	 S ,F ,/v&?@K A 0K$ ,/
X{G,2T   v&?@
6 A 0

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