
    ri.                         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 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l0m1Z1 ddl2m3Z3  ejh                  g dg dg dg      Z5dZ6e5jn                  \  Z8Z9 e e6e5dd      \  Z:Z;e1D  cg c]
  }  | e:       c} Z<ejh                  ge1z   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$                      ZDej                  j                  de=e?      ej                  j                  d d!d"g      d%               ZEej                  j                  de=e?      d&        ZFej                  j                  d'd(d)g      ej                  j                  de=e?      ej                  j                  d*g d+      d,                      ZGej                  j                  d-d!d"g      d.        ZHej                  j                  d/e<      d0        ZId1 ZJej                  j                  d2e:ge<z   e?      ej                  j                  d3d4d5e5j                         d6 gg d7      ej                  j                  d8eeg      d9                      ZLej                  j                  d3d4d5e5d: gg d7      d;        ZMej                  j                  d<d=d>d? d@fdAg      ej                  j                  d8eeg      dB               ZNej                  j                  d8eeg      dC        ZOdD ZPej                  j                  d-d!d"g      ej                  j                  d*dEdg      dF               ZQdG ZRej                  j                  d8eeg      dH        ZSdI ZTej                  j                  d2e:ge<z   e?      dJ        ZUdK ZVdL ZWej                  j                  dMdNdOg      dP        ZXdQ ZYdR ZZej                  j                  d8eeg      dS        Z[ej                  j                  de=e?      ej                  j                  dTed!fed"fedfg      ej                  j                  dUddg      dV                      Z\ej                  j                  d/e<      ej                  j                  d8eeg      dW               Z]ej                  j                  d/e<      ej                  j                  d3d4d5e5gg dX      ej                  j                  d8eeg      dY                      Z^ej                  j                  de=e?      ej                  j                  d#ej                  ej                  g      ej                  j                  d3d5dZg      ej                  j                  d8eeg      d[                             Zaej                  j                  d8eeg      d\        Zbej                  j                  d8eeg      d]        Zcd^ Zdd_ Zeej                  j                  d2e:ge<z   e?      ej                  j                  d8eeg      ej                  j                   egd`  e       D               dab      dc                      Zhej                  j                  d#ej                  ej                  ej                  ej                  g      ej                  j                  d8eeg      dd               Ziej                  j                  d2e:ge<z   e?      de        Zjdf Zkdg Zldh Zmej                  j                  d2e:ge<z   e?      ej                  j                  d8eeg      di               Znej                  j                  d2e:ge<z   e?      ej                  j                  d8eeg      dj               Zodk Zpej                  j                  de=e?      dl        Zqej                  j                  d8eeg      dm        Zrdn Zsej                  j                  de=e?      ej                  j                  d d!d"g      do               Ztej                  j                  d#ej                  ej                  g      ej                  j                  dpdqdrg      ds               Zuej                  j                  d#ej                  ej                  g      dt        Zvej                  j                  duedvfedwfg      dx        Zwej                  j                  d8eeg      dy        Zxej                  j                  d8eeg      ej                  j                  dzd{e6d|z   id}fd3e:dd id~fd3d id~fd3e:ddddf   idfd3d idfg      d               Zyej                  j                  dzde:dd idfg      d        Zzej                  j                  d2e:ge<z         ej                  j                  d#ej                  ej                  g      d               Z{ej                  j                  d e/e:dq      dg      d        Z|d Z}d Z~ej                  j                  dd3 ej                  d5      iddgd|d|ggd|df      d        Zej                  j                  dedfedfedfg      d        Zej                  j                  de1dgz         d        Zej                  j                  d3d5d4g      d        Zej                  j                  d3d5d4g      d        Zej                  j                  de=e?      ej                  j                  d-d!d"g      d               Zyc c} w )zTesting for K-means    N)StringIO)sparse)threadpool_info)clone)KMeansMiniBatchKMeansk_meanskmeans_plusplus)_euclidean_dense_dense_wrapper_euclidean_sparse_dense_wrapper_inertia_dense_inertia_sparse_is_same_clustering_relocate_empty_clusters_dense_relocate_empty_clusters_sparse)_labels_inertia_mini_batch_step)
make_blobs)ConvergenceWarning)pairwise_distancespairwise_distances_argmin)v_measure_score)euclidean_distances)assert_allcloseassert_array_equalcreate_memmap_backed_data)	row_norms)CSR_CONTAINERS)_get_threadpool_controller)              @r    r    r    )      ?r"   g      @r    r    )r"   r    r    r!   r"   d   r"   *   )	n_samplescenterscluster_stdrandom_state   )densesparse_matrixsparse_arrayr*   r+   array_constr)idsalgolloydelkandtypec                     | ddgddgddgddgg|      }g d}t        j                  ddgddgg|      }g d}d}t        j                  ddgd	dgg|      }d
}	t        d
d||      }
|
j                  ||       t	        |
j
                  |       t        |
j                  |       t        |
j                  |       |
j                  |	k(  sJ y )Nr         ?   r2   )   r5   r5   r7   r   r   r5   r5   g      ?g      ?g      ?r)   
n_clustersn_initinit	algorithmsample_weight)
nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_)r-   r/   r2   Xr?   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeanss              `/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_resultsrO   <   s     	q!fsAha1a&9GA M88aVaV,E:L"Oxx%eQZ 8FOqNF
JJqJ.v~~7FOO%56F++-=>>>_,,,    c                     | ddgddgddgddgg      }t        j                  ddgddgg      }t        dd||      }|j                  |       d}d}t	        |j
                  |       |j                  |k(  sJ 	 g d}ddgd	dgg}t        |j                  |       t	        |j                  |       y # t        $ r; g d
}d	dgddgg}t        |j                  |       t	        |j                  |       Y y w xY w)Nr   r4   r5   r7   r)   r9   g      ?r8   g      ?)r5   r5   r   r   r"   r    )r@   rA   r   rB   r   rD   rF   r   rC   rE   AssertionError)	r-   r/   rG   rH   rM   rL   rJ   rI   rK   s	            rN   test_kmeans_relocated_clustersrS   T   s    	q!fsAha1a&9:A 88c3Z!Q01LqNF
JJqMOFOO%56>>_,,,	C&!1Iay16>>?;//1AB C&!3K$56>>?;//1AB	Cs   <8B5 5AC98C9c           
         t        j                  g d      j                  dd      } | |      }t        j                  d      }t        j                  g d      j                  dd      }t        j                  g d      j                  dd      }t        j                  g d      }t        j                  dt         j
                        }| t         j                  u rt        ||||||       n0t        |j                  |j                  |j                  |||||       t        |g d	       t        |d
gdgdgg       y )N)
      $g      #ig      !ir5   	         #@
   rV   r5   rY   )rU   rZ   )g     0rZ   rZ   )g      $@r   r   r6   )   r5   r5   irX   )r@   rA   reshapeoneszerosint32r   r   dataindicesindptrr   r   )r-   rG   r?   centers_oldcenters_newweight_in_clusterslabelss          rN   test_relocate_empty_clustersrg   s   s	   
 	?@HHQOAQAGGBKM ((,-55b!<K
 ((,-55b!<K,/XXb)Frxx&}k;8JF	
 	(FFIIHH		
 )95K3%"u!56rP   distributionnormalblobstol){Gz?g:0yE>g0.++r   c                 H   t         j                  j                  |      }| dk(  r|j                  d      }nt	        |      \  }}d||dk  <    ||      }t        d|d|      }t        d	d|d|
      }|j                  |       |j                  |       t        |j                  |j                         t        |j                  |j                         |j                  |j                  k(  sJ |j                  t        j                  |j                  d      k(  sJ y )Nri   i  rY   sizer(   r      r5   )r:   r(   r;   rk   r1   )r=   r:   r(   r;   rk   ư>)rel)r@   randomRandomStateri   r   r   rB   r   rE   r   rC   rF   rD   pytestapprox)	rh   r-   rk   global_random_seedrndrG   _km_lloydkm_elkans	            rN   test_kmeans_elkan_resultsr~      s   
 ))

 2
3CxJJJJ's+1Aa!eHQA1CASVWH'H LLOLLOH--x/H/HIx'')9)9:x/////h.?.?T JJJJrP   r=   c                     t         j                  j                  |      }|j                  d      }d}t	        | d|dd|      j                  |      }|j                  |k  sJ y )Nrn   ro   i,  rr   r5   r   )r=   r:   r(   r;   rk   max_iter)r@   ru   rv   ri   r   rB   rF   )r=   ry   rz   rG   r   kms         rN   test_kmeans_convergencer      sl     ))

 2
3C



#AH	'
 
c!f  ::   rP   X_csrc           
         t         j                  j                  |      }t        |j	                  t        j
                        z   }|j                         }t        j                  |      }t        j                  |      }t        j                  |j
                  d   t        j                        }t        j                  |j
                  d   t        j                        }t        j                  t        j
                  d   t        j                        }	t        d d }
| d d }|	d d }t        |
||||t         j                  j                  |      d      }|dkD  sJ t        |
||      \  }}|dkD  sJ ||k  sJ t        |||||t         j                  j                  |      d      }|dkD  sJ t        |||      \  }}|dkD  sJ ||k  sJ t        ||       t        ||       t        ||       t        ||       y )Nro   r   r6   rY   F)random_reassignr    )r@   ru   rv   r&   ri   shapecopy
zeros_liker^   rG   r2   r]   r   r   r   r   )r   ry   rngrc   centers_old_csrrd   centers_new_csrweight_sumsweight_sums_csrr?   X_mbX_mb_csrsample_weight_mbold_inertiarf   new_inertiaold_inertia_csr
labels_csrnew_inertia_csrs                      rN   !test_minibatch_update_consistencyr      s    ))

 2
3CCJJGMMJ::K!&&(O--,KmmO4O((;,,Q/qww?Khh{003177COGGAGGAJagg6M Sb6DSbzH$Sb) #
		01K  *$0@+NFK$$$ '
		01O S    #2"O#J S   _,,, vz*K1K1K1rP   c                    | j                   }|j                  t        t        fk(  sJ | j                  }t        j                  |      j                  d   t        k(  sJ t        t        t        |      d       | j                  dkD  sJ y )Nr   r"   r    )rE   r   r:   
n_featuresrC   r@   uniquer   r   true_labelsrD   )r   r&   rf   s      rN   _check_fitted_modelr     sv     !!G==Z4444ZZF99V""1%333 OK8#>;;rP   
input_datar<   ru   	k-means++c                 *    t         j                         S Nr&   r   rG   kr(   s      rN   <lambda>r   #  s    w||~ rP   )ru   r   ndarraycallable	Estimatorc                     t        |t              rdnd} | |t        d|      j                  |      }t	        |       y )NrY   r5   r$   r<   r:   r(   r;   )
isinstancestrr:   rB   r   )r   r   r<   r;   r   s        rN   test_all_initr     s=     dC(RaF	jr&
	c*o  rP   c                 *    t         j                         S r   r   r   s      rN   r   r   2  s     rP   c                     t        | d      r| j                         } t        | t              rdnd}t	        | t
        d|      }t        d      D ]  }|j                  t                t        |       y )Nr   rY   r5   r   r   r#   )
hasattrr   r   r   r   r:   rangepartial_fitrG   r   )r<   r;   r   is       rN   &test_minibatch_kmeans_partial_fit_initr   0  si     tVyy{ dC(RaF	jq
B 3Z 
q rP   zinit, expected_n_init)r   r5   )ru   defaultc                 D    |j                  || j                  d   f      S )Nr5   ro   )uniformr   )rG   r:   r(   s      rN   r   r   K  s'    0D0D !''!*- 1E 1 rP   r   )
array-liker5   c                    d\  }}}t         j                  j                  ||      }|dk(  r t         j                  j                  ||      }|dk(  r| t        u rdnd} | ||d      j	                  |      }|j
                  |k(  sJ y)	zCheck that `n_init="auto"` chooses the right number of initializations.
    Non-regression test for #26657:
    https://github.com/scikit-learn/scikit-learn/pull/26657
    )r#   rY   rr   r   r   r7   rY   autor:   r<   r;   N)r@   ru   randnr   rB   _n_init)r   r<   expected_n_initn_sampler   r:   rG   rM   s           rN   ,test_kmeans_init_auto_with_initial_centroidsr   E  s    ( (2$Hj*
		*-A|yyz:6)#(O;!*4GKKANF>>_,,,rP   c                 t   t        j                  t              }t        j                  t              } | t        t        d|      j                  t              } | t        |d|      j                  |      }t        |j                  |j                         t        |j                  |j                         y )Nr5   r:   r<   r;   r(   )
r@   asfortranarrayrG   r&   r:   rB   r   rE   r   rC   )r   ry   	X_fortrancenters_fortrankm_ckm_fs         rN   test_fortran_aligned_datar   d  s     !!!$I''0OGADV	c!f 	 '	
 
c)n 	 D))4+@+@At||T\\2rP   c                      t        t        dd      } t        j                  }t	               t        _        	 | j                  t               |t        _        y # |t        _        w xY w)Nr$   r5   )r:   r(   verbose)r   r:   sysstdoutr   rB   rG   )r   
old_stdouts     rN   test_minibatch_kmeans_verboser   w  sA    	JR	KBJCJ 
q	
Z
s   A A%rl   c           	         t         j                  j                  d      j                  d      }t	        | t
        ddd|d      j                  |       |j                         }t        j                  d|j                        sJ t        j                  d	|j                        sJ |dk(  r#t        j                  d
|j                        sJ y t        j                  d|j                        sJ y )Nr   rn   ro   r$   ru   r5   )r=   r:   r(   r<   r;   rk   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r@   ru   rv   ri   r   r:   rB   
readouterrresearchout)r=   rk   capsysrG   captureds        rN   test_kmeans_verboser     s     			a ''Z'8A
 
c!f  "H99/>>>9918<<@@@
axyy.===yy<hllKKKrP   c                      t        j                  t        d      5  t        dd      j	                  t
               d d d        y # 1 sw Y   y xY w)Nz,init_size.* should be larger than n_clustersmatchrY      )	init_sizer:   )rw   warnsRuntimeWarningr   rB   rG    rP   rN   'test_minibatch_kmeans_warning_init_sizer     s@    	M
 < 	"488;< < <   !AAc                     t        j                  t        d      5   | t        t        d      j                  t               d d d        y # 1 sw Y   y xY w)NzAExplicit initial center position passed: performing only one initr   rY   r<   r:   r;   )rw   r   r   r&   r:   rB   rG   )r   s    rN   'test_warning_n_init_precomputed_centersr     sH     
Q
 I 	w:bAEEaH	I I Is   'AAc                 p   t        dd|       \  }}d|d d dd d f<   t        dd| d	      j                  |      }|j                  j	                  d
      j                         }|dkD  sJ d|d       t        dd| d	      j                  |      }|j                  j	                  d
      j                         }|dkD  sJ d|d       t        d| d      }t        d      D ]  }|j                  |        |j                  j	                  d
      j                         }|dkD  sJ d|d       y )Nr#   rr   )r%   r&   r(   r   r)   r   rY   ru   )r:   
batch_sizer(   r<   r5   axisrW   znum_non_zero_clusters=z is too small   )r:   r(   r<   )r   r   rB   rE   anysumr   r   )ry   zeroed_Xr   r   num_non_zero_clustersr   s         rN    test_minibatch_sensible_reassignr     sm    'q/AHk HSqS!V	"3EH
	c(m  //333;??A 1$N)?)>(@&NN$ 
#4FX
	c(m  //333;??A 1$N)?)>(@&NN$ 
B5Gh	WB3Z !
x ! //333;??A 1$N)?)>(@&NN$rP   c           
         t        j                  t        t        f      }t	        t              D ]%  }t
        t        |k(     j                  d      ||<   ' t        j                  t              }t        j                  |      }t        | ||d      d    }t        | |||t        j                  t              t         j                  j                  |      dd       t        | ||d      d    }||kD  sJ t        | |||t        j                  t              t         j                  j                  |      dd       t!        ||       y )Nr   r   r5   T)r   reassignment_ratiogV瞯<)r@   emptyr:   r   r   rG   r   meanr]   r%   
empty_liker   r   r^   ru   rv   r   )r   ry   perfect_centersr   r?   rd   score_beforescore_afters           rN   test_minibatch_reassignr     s/    hh
J78O: >{a/05515=> GGI&M--0K
 $JPQRSTUUL

		01	 #:}k1MaPPK+%%% 

		01 	 K1rP   c                  R    t        ddt        dd      j                  t               y )Nr#   rY   r$   T)r:   r   r   r(   r   )r   r%   rB   rG   r   rP   rN   &test_minibatch_with_many_reassignmentsr     s&    
  
c!frP   c                  H   t        ddd      j                  t              } | j                  dk(  sJ t        ddd      j                  t              } | j                  dk(  sJ t        dddt        dz         j                  t              } | j                  t        k(  sJ y )NrY   rr   r5   )r:   r   r;         )r:   r   r;   r   )r   rB   rG   
_init_sizer%   r   s    rN   test_minibatch_kmeans_init_sizer     s     
B1Q	?	C	CA	FB==B 
B1Q	?	C	CA	FB==B 
!AQ
	c!f  ==I%%%rP   ztol, max_no_improvement)-C6?N)r   rY   c                    t        ddd      \  }}}t        d|d|dddd|	      }|j                  |       d|j                  cxk  rdk  sJ  J | j	                         }|d	|j
                  v sJ |dk(  rd
|j
                  v sJ y y )Nr7   r   T)r&   r(   return_centersr   rY   r5   )	r:   r<   r   rk   r(   r   r;   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   rB   rF   r   r   )r   rk   r   rG   r{   r&   r   r   s           rN   #test_minibatch_declared_convergencer  $  s     qqNMAq'	-

B FF1IrzzB  "H!1X\\AAA
ax;x||KKK rP   c                     d} t         j                  d   }t        d| d      j                  t               }|j                  t        j                  |j                  | z  |z        k(  sJ t        |j                  t              sJ t        d| ddd d      j                  t               }|j                  dk(  sJ |j                  d|z  | z  k(  sJ t        |j                  t              sJ y )Nr   r   r7   )r:   r   r(   rY   )r:   r   r(   rk   r   r   )
rG   r   r   rB   rF   r@   ceiln_steps_r   int)r   r%   r   s      rN   test_minibatch_iter_stepsr  @  s    J
I	A*1	M	Q	QRS	TB ::"++
":i!GHHHHbjj#&&& 

 
c!f  ::;;2	>j8888bkk3'''rP   c                      t         j                         } t        dt        d      }|j	                  |        t        |       t        | t                y )NFr$   )copy_xr:   r(   )rG   r   r   r:   rB   r   r   )my_Xr   s     rN   test_kmeans_copyxr
  Y  s:    668D	u"	EBFF4L D!rP   c                    t         j                  j                  |      j                  dd      } | d|d      }|j	                  |      j                  |      } | d|d      }|j	                  |      j                  |      }||kD  sJ y )Nr#   rY   r5   )r;   r(   r   )r@   ru   rv   r   rB   score)r   ry   rG   km1s1km2s2s          rN   test_score_max_iterr  d  s     			0177R@A
1+=
JC			!	B
1+=
KC			!	B7N7rP   zEstimator, algorithmr   c                    t        ddd|      \  }} |||      } | ddd||      }||j                  |       |j                  |       |j                  }	|j	                  |      }
t        |
|	       |j                  |      }
t        |
|	       |j	                  |j                        }
t        |
t        j                  d             y )Nr   rY   r%   r   r&   r(   r6   ru   )r:   r<   r;   r   r(   )r=   )
r   
set_paramsrB   rC   predictr   fit_predictrE   r@   arange)r   r=   r-   r   global_dtypery   rG   r{   r   rf   preds              rN   test_kmeans_predictr  q  s     "b?QDAq 	Ql+A	'
B 
	*FF1IZZF ::a=DtV$ >>!DtV$ ::b))*DtRYYr]+rP   c                 z   t         j                  j                  |      j                  t        f      } | t
        |d      }|j                  t        |        | t
        |d      }|j                  ||       t        |j                  |j                         t        |j                  |j                         y Nr5   r:   r(   r;   r>   )r@   ru   rv   random_sampler%   r:   rB   rG   r   rC   r   rE   )r   r   ry   r?   km_dense	km_sparses         rN   test_dense_sparser!    s     II))*<=KK	M ,>qH LL-L0,>qI MM%}M5x''):):;H--y/I/IJrP   )ru   r   r   c                 4   t        |t              rdnd} | t        ||d      }|j                  |       t	        |j                  t              |j                         |j                  t               t	        |j                  |      |j                         y )NrY   r5   r   r   )r   r   r:   rB   r   r  rG   rC   )r   r<   r   r;   r   s        rN   test_predict_dense_sparser#    sh     dC(RaF	jtFQR	SBFF5Mrzz!}bjj1FF1Irzz%("**5rP   r   c           	      0   t        j                  ddgddgddgddgddgddgg      } |||	      }|d
k(  rdnd}|d
k(  r|d d n|} | d|||      }| t        u r|j                  d       |j	                  |       |j
                  j                  t         j                  k(  sJ g d}	t        t        |j                  |	      d       | t        u rDt        |      j                  |      }|j
                  j                  t         j                  k(  sJ y y )Nr   rY      rW   rV   r5   r)   r[   r6   r   r   )r   )r   r5   r5   r   r   r5   r"   )r@   rA   r   r  rB   rE   r2   float64r   r   rC   r   r   )
r   r-   r2   r<   ry   X_denserG   r;   r   rI   s
             rN   test_integer_inputr(    s    hhAR2q'B7QFQGLMGWE*A)#QF)+72A;D	4=O
B O#
#FF1I $$

222(OOBJJ@#F O#2Y""1%""((BJJ666 $rP   c                     | t         |      j                  t              }|j                  |j                        }t        |t        |j                               t        |j                         t        j                  t                      |j                  t              }t        |t        t        |j                               y )Nr:   r(   )r:   rB   rG   	transformrE   r   r   r   diagonalr@   r^   )r   ry   r   Xts       rN   test_transformr.    s     
j7I	J	N	Nq	QB 
b))	*BB*2+>+>?@r{{}bhhz&:; 
aBB*1b.A.ABCrP   c                      | |d      j                  t              j                  t              } | |d      j                  t              }t	        ||       y )Nr5   )r(   r;   )rB   rG   r+  fit_transformr   )r   ry   X1X2s       rN   test_fit_transformr3    sI     
 21	=	A	A!	D	N	Nq	QB	 21	=	K	KA	NBBrP   c                     t         j                  }dD ]:  }t        t        d|| d      j	                  t
              }|j                  |k  r:J  y )N)r5   rr   rY   ru   r5   )r:   r<   r;   r(   r   )r@   infr   r:   rB   rG   rD   )ry   previous_inertiar;   r   s       rN   test_n_initr7    sY    vv 
/ !+
 #a& 	 {{....
/rP   c                    t        t        t        d |       \  }}}|j                  t        t        fk(  sJ t        j                  |      j                  d   t        k(  sJ t        t        t        |      d       |dkD  sJ y )N)r:   r?   r(   r   r"   r    )
r	   rG   r:   r   r   r@   r   r   r   r   )ry   cluster_centersrf   inertias       rN   test_k_means_functionr;  
  sy    '.	jCU($OVW   Z$<<<<99V""1%333 OK8#>S==rP   c              #   2   K   | ]  }|d    dk(  s|  yw)user_apiblasNr   ).0r   s     rN   	<genexpr>r@    s     D!AjMV,CADs   zUFails for some global_random_seed on Atlas which cannot be detected by threadpoolctl.)reasonc                     | d|      }i }i }i }i }t         j                  t         j                  fD ]  }|j                  |d      }	|j	                  |	       |j
                  ||<   |j                  |	      ||<   |j                  ||<   |j                  ||<   |j                  j                  |k(  sJ | t        u s|j                  |	dd        |j                  j                  |k(  rJ  d}
t        |t         j                     |t         j                     |
       t        |t         j                     |t         j                     |t         j                     j                         |
z  	       t        |t         j                     |t         j                     |t         j                     j                         |
z  	       t        |t         j                     |t         j                            y )
Nr5   )r;   r(   Fr   r   r7   r   rtol)atol)r@   r&  float32astyperB   rD   r+  rE   rC   r2   r   r   r   maxr   )r   r   ry   r   r:  r-  r&   rf   r2   rG   rE  s              rN   test_float_precisionrJ    s    
!*<	=BG	BGF**bjj) 6e%0
q	LLO5	,,

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

WRZZ0wrzz7J7N7N7PSW7W vbjj)6"**+=>rP   c                     t         j                  |d      }t        j                  |d      } | |t        d      }|j	                  |       t        j                  |j                  |      rJ y )NFrC  r5   r   )rG   rH  r&   r:   rB   r@   may_share_memoryrE   )r   r2   
X_new_typecenters_new_typer   s        rN   test_centers_not_mutatedrO  J  sd     %e,J~~e%~8	(Z	JBFF:""2#6#68HIIIIrP   c                     t        t              j                  |       }t        t        |j                  d      j                  |       }t	        |j                  |j                         y )N)r:   r5   r   )r   r:   rB   rE   r   )r   r  r  s      rN   test_kmeans_init_fitted_centersrQ  Y  sS     J
'
+
+J
7C
JS-A-A!
L
P
PC C((#*>*>?rP   c                 @   t        j                  ddgddgddgddgg      }t        d|       }d}t        j                  t
        |      5  |j                  |       t        |j                        t        t        d            k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   r5      r*  zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.r   r7   )
r@   asarrayr   rw   r   r   rB   setrC   r   )ry   rG   r   msgs       rN   1test_kmeans_warns_less_centers_than_unique_pointsrW  i  s    


QFQFQFQF34A	1+=	>B	D  
(	4 0
q	 2::#eAh-///	0 0 0s   >BBc                 0    t        j                  | d      S Nr   r   )r@   sort)r&   s    rN   _sort_centersr[  z  s    777##rP   c                 X   t         j                  j                  |       j                  ddt              }t        j
                  t        |d      }t        t        dt        |       }t        |      j                  t        |      }t        j
                  |j                  |      }t        |      j                  |      }t        |j                  |       t        |j                  |j                         t        t!        |j"                        t!        |j"                               y )Nr5   rr   ro   r   r   )r<   r;   r:   r(   r>   )r@   ru   rv   randintr%   repeatrG   r   r&   r:   r   rB   rC   r   r   rD   r[  rE   )ry   r?   X_repeatr   km_weightedrepeated_labelskm_repeateds          rN   test_weighted_vs_repeatedrc  ~  s    
 II))*<=EE	19 F M yyM2H	Q:DV
B )---?Kii 3 3]CO)--)K{**O<K((+*>*>?k223k223rP   c                 D   t        j                  t              } | t        |d      }t	        |      j                  |d       }t	        |      j                  ||      }t        |j                  |j                         t        |j                  |j                         y r  )
r@   r]   r%   r:   r   rB   r   rC   r   rE   )r   r   ry   r?   r   km_nonekm_oness          rN   test_unit_weights_vs_no_weightsrg    sv     GGI&M	j7IRS	TBBimmJdm;GBimmJmmDGw8G,,g.F.FGrP   c                 ~   t         j                  j                  |      j                  t              } | t
        |d      }t        |      j                  ||      }t        |      j                  |d|z        }t        |j                  |j                         t        |j                  |j                         y )Nro   r5   r  r>   r4   )r@   ru   rv   r   r%   r:   r   rB   r   rC   r   rE   )r   r   ry   r?   r   km_orig	km_scaleds          rN   test_scaled_weightsrk    s     II))*<=EE9EUM	j7IRS	TBBimmJmmDGb	jm8KLIw	(9(9:G,,i.H.HIrP   c                  f    t        dd      j                  t              } | j                  dk(  sJ y )Nr1   r5   )r=   r   )r   rB   rG   rF   r   s    rN    test_kmeans_elkan_iter_attributerm    s+     
'A	.	2	21	5B::??rP   c                     | dgdgg      }ddg}t        j                  dgdgg      }t        d|d      }|j                  ||       t	        t        |j                              dk(  sJ t        |j                  dgdgg       y )	NrV   r5   gffffff?g?rY   r)   r   r>   )	r@   rA   r   rB   lenrU  rC   r   rE   )r-   rG   r?   r<   r   s        rN   #test_kmeans_empty_cluster_relocatedrp    s     	rdQC[!A#JM88bTB4L!D	14	2BFF1MF*s2::1$$$B''2$5rP   c                    t         j                  j                  |      }|j                  d      }t	               j                  dd      5   | t        |      j                  |      j                  }d d d        t	               j                  dd      5   | t        |      j                  |      j                  }d d d        t               y # 1 sw Y   axY w# 1 sw Y   "xY w)N)2   rY   ro   r5   openmp)limitsr=  r*  r)   )
r@   ru   rv   ri   r   limitr:   rB   rC   r   )r   ry   rz   rG   result_1result_2s         rN   #test_result_equal_in_diff_n_threadsrx    s     ))

 2
3C


!A	#	%	+	+1x	+	H 
:LMSVW 	
 
$	%	+	+1x	+	H 
:LMSVW 	
 x*
 

 
s   (C(C!C!C*c                      t        j                  t        d      5  t        dd      j	                  t
               d d d        y # 1 sw Y   y xY w)Nz9algorithm='elkan' doesn't make sense for a single clusterr   r5   r1   )r:   r=   )rw   r   r   r   rB   rG   r   rP   rN   test_warning_elkan_1_clusterrz    s@    	I
 7 	!w/33A6	7 7 7r   c                 8   t         j                  j                  |      j                  d      }|d d } | |      }d } |||      \  }}t	        dd||d      j                  |      }|j                  }	|j                  }
t        ||	       t        ||
       y )N)r#   rr   ro   rr   c                     |j                         }t        | |      }t        |j                  d         D ]  }| ||k(     j	                  d      ||<    t        | |      }||fS rY  )r   r   r   r   r   )rG   r<   new_centersrf   labels        rN   	py_kmeansz+test_k_means_1_iteration.<locals>.py_kmeans  so    iik*1d34::a=) 	AE!"6U?!3!8!8a!8!@K	A*1k:{""rP   r5   )r:   r;   r<   r=   r   )
r@   ru   rv   r   r   rB   rC   rE   r   r   )r-   r/   ry   rG   rH   r  	py_labels
py_centers	cy_kmeans	cy_labels
cy_centerss              rN   test_k_means_1_iterationr    s    
 			0199x9HARa5LQA# &a6IzQ\TA	c!f  !!I++Jy),J
+rP   squaredTFc                 `   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 )Nr5   r#   r4   csrdensityformatr(   r2   rV   FrC  r)   r   gHz>rD  )r@   ru   rv   sptoarrayr\   r   rH  r   sqrtr   r   r`   ra   rG  r   )r2   r  ry   r   a_sparsea_densebb_squared_normexpecteddistance_dense_densedistance_sparse_denserE  s               rN   test_euclidean_distancer    s   
 ))

 2
3Cyy	3E5H  ((,G		#e%0AdZZ\N1"'')H"x(9H9'1gN;x''NG BJJ&4DD(*?dK((>)8$?rP   c                    t         j                  j                  |      }t        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#   rY   r4   r  r  FrC  rr   )rp   r2   r)   r5   r   )	n_threadsr   rs   rD  )r  single_label)r@   ru   rv   r  r  r   rH  r]  r_   r   r   r   rG  r   )r2   ry   r   X_sparser'  r?   r&   rf   	distancesr  inertia_denseinertia_sparserE  r~  masks                  rN   test_inertiar  +  s    ))

 2
3CyyRU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8rP   zKlass, default_n_initrY   r7   c                      | dd      }|j                  t               |j                  dk(  sJ  | dd      }|j                  t               | j                  dk(  r|j                  dk(  sJ y y )Nr   r   )r;   r<   r5   ru   r   rY   )rB   rG   r   __name__)Klassdefault_n_initests      rN   test_n_init_autor  V  sd    
vK
0CGGAJ;;!
vH
-CGGAJ %( :3;;"AArP   c                     t        j                  dgdgdgg      }t        j                  g d      } | dd      j                  ||       t        |t        j                  g d             y )Nr5   r)   rS  )r4   g?g333333?r   r*  r>   )r@   rA   rB   r   )r   rG   r?   s      rN   test_sample_weight_unchangedr  a  sY     	1#sQC!AHH_-M+///O}bhh&?@rP   zparam, matchr:   r5   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                     | d d S )Nr)   r   X_r   r(   s      rN   r   r   v  s    BQ rP   r[   zUThe shape of the initial centers .* does not match the number of features of the datac                     | d dd df   S )Nr[   r)   r   r  s      rN   r   r     s    BQBF rP   c                      | d      }t        j                  t        |      5   |j                  di |j	                  t
               d d d        y # 1 sw Y   y xY w)Nr5   )r;   r   r   )rw   raises
ValueErrorr  rB   rG   )r   paramr   r   s       rN   test_wrong_paramsr  k  sM    > 
!	B	z	/ &""1%& & &s   &AAx_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc                     t        j                  t        |      5  t        t        t
        fi |  d d d        y # 1 sw Y   y xY w)Nr   )rw   r  r  r
   rG   r:   )r  r   s     rN   !test_kmeans_plusplus_wrong_paramsr    s6     
z	/ 0://0 0 0s	   ;Ac                 6   | j                  |      }t        |t        |      \  }}|j                  d   t        k(  sJ |dk\  j	                         sJ ||j                  d   k  j	                         sJ |j                  d   t        k(  sJ |j                  d      |j                  d      k  j	                         sJ |j                  d      |j                  d      k\  j	                         sJ t        t        |   j                  |      |       y )Nrq   r   r   )	rH  r
   r:   r   allrI  minr   rG   )r   r2   ry   r`   r&   ra   s         rN   test_kmeans_plusplus_outputr    s    U#D&j'9GW ==z)))qLtzz!}$))+++ ==z)))KKQK4888#3388:::KKQK4888#3388:::
 AgJ%%e,g6rP   r  c                 \    t        t        t        |       \  }}t        t        |   |       y )N)r  )r
   rG   r:   r   )r  r&   ra   s      rN   test_kmeans_plusplus_normsr    s%     'q*oVGWAgJ(rP   c                     t        t        t        |       \  }}t        j                  t              }t        |t        |       \  }}t        ||       y )Nrq   )r
   rG   r:   r@   r   r   )ry   	centers_cr{   r   r   s        rN   test_kmeans_plusplus_dataorderr    sH    "1j?QRLIq!!!$I(:,>OQ I/rP   c                  H   t        j                  g dt         j                        } t        | | d      sJ t        j                  g dt         j                        }t        | |d      sJ t        j                  g dt         j                        }t        | |d      rJ y )N)r5   r   r   r5   r)   r   r)   r5   r6   r7   )r   r)   r)   r   r5   r)   r5   r   )r5   r   r   r)   r)   r   r)   r5   )r@   rA   r_   r   )labels1labels2labels3s      rN   test_is_same_clusteringr    s~    hh/rxx@Gw333 hh/rxx@Gw333 hh/rxx@G"7GQ7777rP   kwargs)r<   r;   c                     t        j                  ddgddgddgddggt         j                        }t        dddi| }|j	                  |       y)	zZCheck that init works with numpy scalar strings.

    Non-regression test for #21964.
    r   r4   r5   r6   r:   r)   Nr   )r@   rT  r&  r   rB   )r  rG   
clusterings      rN   -test_kmeans_with_array_like_or_np_scalar_initr    sO     	

QFS!HsAhA7rzzJA/1//JNN1rP   zKlass, methodrB   r   c                    | j                   j                         } |        } t        ||      t               |j                  j
                  d   }|j                         }t        t        |      D cg c]  }| | 
 c}|       yc c}w )z=Check `feature_names_out` for `KMeans` and `MiniBatchKMeans`.r   N)	r  lowergetattrrG   rE   r   get_feature_names_outr   r   )r  method
class_namerM   r:   	names_outr   s          rN   test_feature_names_outr    sx     %%'JWFGFFA((..q1J,,.IE*4EFq:,qc*F	RFs   3B	csr_containerc                    t        dddd      \  }}|  | |      }t               }|j                  |      }t        |j                        |_        t        |j
                        |_        |j                  |      }t        ||       y)z_Check that predict does not change cluster centers.

    Non-regression test for gh-24253.
    r   rY   r   r  N)r   r   r  r   rE   rC   r  r   )r  rG   r{   rM   y_pred1y_pred2s         rN   ,test_predict_does_not_change_cluster_centersr    sz     BQODAq !XF  #G78O8OPF.v~~>FNnnQGw(rP   c           
      R   t         j                  j                  |      }t        ddd|      \  }}t	        |d      }t               }|j                  ||| |j                  |j                  d         dt         j                  j                  |      	      }|j                  ||| t        j                  |j                  d         dt         j                  j                  |      	      }t        j                  t              5  t        ||       d
d
d
       y
# 1 sw Y   y
xY w)zCheck that sample weight is used during init.

    `_init_centroids` is shared across all classes inheriting from _BaseKMeans so
    it's enough to check for KMeans.
    r   rY   r  Tr  r   ro   rr   rG   r  r<   r?   n_centroidsr(   N)r@   ru   rv   r   r   r   _init_centroidsr   r   r]   rw   r  rR   r   )	r<   ry   r   rG   r{   r  rM   clusters_weightedclusterss	            rN   test_sample_weight_initr    s	    ))

 2
3C"b?QDAq  40OXF..
'kkqwwqzk2YY**+=> /  %%
'ggaggaj)YY**+=> & H 
~	& 5)845 5 5s   DD&c           
         t         j                  j                  |      }t        ddd|      \  }}|j	                  |j
                  d         }d|ddd<   t        |d	      }t               }|j                  ||| |d
t         j                  j                  |            }t        |ddd   |      }	t        j                  t        j                  |	d            rJ y)zCheck that if sample weight is 0, this sample won't be chosen.

    `_init_centroids` is shared across all classes inheriting from _BaseKMeans so
    it's enough to check for KMeans.
    r#   rr   r  r   ro   Nr)   Tr  rY   r  )r@   ru   rv   r   r   r   r   r   r  r   r   isclose)
r<   ry   r   rG   r{   r?   r  rM   r  ds
             rN   test_sample_weight_zeror  4  s     ))

 2
3C!Q=ODAq KKQWWQZK0MM#A#40OXF..
'#YY**+=> /  	AccF$56AvvbjjA&''''rP   c                    t        j                  ddgddgddgddgddgg      }t        d||       }d}t        j                  t
        |      5  |j                   ||             ddd       |j                  dk(  sJ y# 1 sw Y   xY w)zCheck that kmeans stops when there are more centers than non-duplicate samples

    Non-regression test for issue:
    https://github.com/scikit-learn/scikit-learn/issues/28055
    r   r5   rr   )r:   r<   r=   zENumber of distinct clusters \(4\) found smaller than n_clusters \(5\)r   N)r@   rA   r   rw   r   r   rB   rF   )r=   r-   rG   r   rV  s        rN   test_relocating_with_duplicatesr  R  s     	1a&1a&1a&1a&1a&9:A	11		:B
RC	(	4  
|A  ::??   s   BB)__doc__r   r   ior   numpyr@   rw   scipyr   r  threadpoolctlr   sklearn.baser   sklearn.clusterr   r   r	   r
   sklearn.cluster._k_means_commonr   r   r   r   r   r   r   sklearn.cluster._kmeansr   r   sklearn.datasetsr   sklearn.exceptionsr   sklearn.metricsr   r   sklearn.metrics.clusterr   sklearn.metrics.pairwiser   sklearn.utils._testingr   r   r   sklearn.utils.extmathr   sklearn.utils.fixesr   sklearn.utils.parallelr   rA   r&   r%   r   r:   r   rG   r   X_as_any_csrdata_containersro  data_containers_idsmarkparametrizerG  r&  rO   rS   rg   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r!  r#  r_   int64r(  r.  r3  r7  r;  skipifr   rJ  rO  rQ  rW  r[  rc  rg  rk  rm  rp  rx  rz  r  r  r  r  r  r  r  r  r  r  r  str_r  r  r  r  r  r  )	containers   0rN   <module>r     s    	 
     )  M M   F ' 1 I 3 8 
 , . = "((!!! 	  
Jc; /==	!=88*~- <A /
?	#  >QR'7!342::rzz":;- < 5 S-* >QR'7!34C 5 SC: >QR&7 S&7R (G)<=>QR 78K 9 S >K6 w&89! :!$ ,/<2 0<2~ C,  
 
{GLLN,UV6  
 v&?@ A 
{G%NO6  

   		
 	
 v&?@- A-  v&?@3 A3$  w&89q	*L + :L2< v&?@I AIOB C,  
+2
+2\&$ 2\74KLL ML6(2 v&?@	 A	 >QRg)OT+BC aX. , /	 S ,F ,/v&?@K A 0K$ ,/
X{G,2T   v&?@
6 A 0

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