U
    -eȾ                     @   s	  d Z ddlZddlZddlZddlmZ ddlZddl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/m0Z0 dZ1ej23de1 Z4e5dddddgdddddgdddddggZ6dZ7e6j8\Z9Z:ee7e6ddd\Z;Z<e=e;Z>ej2j?dej5ej=gddgdej2?ddd gej2?d!ej@ejAgd"d# ZBej2j?dej5ej=gddgdej2?ddd gd$d% ZCej2j?dej5ej=gddgdd&d' ZDej2?d(d)d*gej2j?dej5ej=gddgdej2?d+d,d-d.dgd/d0 ZEej2?d1dd gd2d3 ZFej2?d1d4d5gd6d7 ZGej2?d8eegd9d: ZHd;d< ZId=d> ZJej2j?d?e;e>gddgdej2j?d@dAdBe6dCdD gdAdBdEdFgdej2?d8eegdGdH ZKej2j?d@dAdBe6dIdD gdAdBdEdFgddJdK ZLej2?dLdMdNdOdD dPfdQgej2?d8eegdRdS ZMej2?d8eegdTdU ZNdVdW ZOej2?d1dd gej2?d+d,dgdXdY ZPdZd[ ZQej2?d8eegd\d] ZRd^d_ ZSej2j?d?e;e>gddgdd`da ZTdbdc ZUddde ZVej2?dfdgdhgdidj ZWdkdl ZXdmdn ZYej2?d8eegdodp ZZej2j?dej5ej=gddgdej2?dqedfed fedfgej2?drdsdgdtdu Z[ej2?d8eegdvdw Z\ej2j?d@dAdBe6gdAdBdEgdej2?d8eegdxdy Z]ej2j?dej5ej=gddgdej2?d!ej^ej_gej2?d@dBdEgej2?d8eegdzd{ Z`ej2?d8eegd|d} Zaej2?d8eegd~d Zbdd Zcdd Zdej2j?d?e;e>gddgdej2?d8eegdd Zeej2?d!ej^ej_ej@ejAgej2?d8eegdd Zfej2j?d?e;e>gddgddd Zgdd Zhdd Zidd Zjej2j?d?e;e>gddgdej2?d8eegdd Zkej2j?d?e;e>gddgdej2?d8eegdd Zldd Zmej2j?dej5ej=gddgddd Znej2?d8eegdd Zodd Zpej2j?dej5ej=gddgdej2?ddd gdd Zqej2?d!ej@ejAgej2?dddgdd Zrej2?d!ej@ejAgdd Zsej2?dedfedfgdd Ztej2?dedfedfgdd Zuej2?d8eegdd Zvej2?d8eegej2?dde7d idfd@e;dds idfd@ddD idfd@e;ddddsf idfd@ddD idfgdd Zwej2?dde;dds idfgdd Zxej2?d?e;e>gej2?d!ejAej@gdd Zyej2?de.e;dddgdd ZzddÄ Z{ddń Z|ej2?dd@e}dBiddgddggddǜfddɄ Z~ej2?dedfedfedfgdd΄ Zej2?dddgddф Zej2?d@dBdAgddӄ Zej2?d@dBdAgddՄ ZdS )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)threadpool_limitszThe default value of `n_init` will change from \d* to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning:FutureWarningzignore:        g      @      ?g      @d   *   )	n_samplescentersZcluster_stdrandom_statearray_constrZdenser   )Zidsalgolloydelkandtypec                 C   s   | ddgddgddgddgg|d}ddddg}t jddgddgg|d}ddddg}d}t jddgddgg|d}d	}	td	d||d
}
|
j||d t|
j| t|
j| t|
j| |
j	|	kst
d S )Nr         ?   r(      g      ?g      ?g      ?   
n_clustersn_initinit	algorithmsample_weight)nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_AssertionError)r$   r%   r(   Xr4   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeans rD   c/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.pytest_kmeans_results;   s    $rF   c           	      C   s   | ddgddgddgddgg}t ddgddgg}tdd||d}|| d}d}t|j| |j|ksrtz8ddddg}ddgddgg}t|j	| t|j
| W nH tk
r   ddddg}dd	gdd
gg}t|j	| t|j
| Y nX d S )Nr   r)   r*   r,   r-   r.   g      ?g      ?r   r   )r5   r6   r   r7   r   r9   r;   r<   r   r8   r:   )	r$   r%   r=   r>   rC   rB   r@   r?   rA   rD   rD   rE   test_kmeans_relocated_clustersU   s$     
rG   c                 C   s   t ddddddddd	d
g
dd}| |}t d
}t dddgdd}t dddgdd}t dddg}t jd
t jd}| t jkrt|||||| nt|j|j	|j
||||| t|dddg t|dgd
gd	gg d S )Ng      $g      #ig      !ir*   	   g      #@
   ig     0g      $@r   r+      i)r5   r6   reshapeoneszerosint32r   r   dataindicesZindptrr   r   )r$   r=   r4   centers_oldcenters_newZweight_in_clusterslabelsrD   rD   rE   test_relocate_empty_clustersv   s8    &

     rU   distributionnormalZblobstolg{Gz?g:0yE>g0.++c           	      C   s   t j|}| dkr"|jdd}nt|d\}}d||dk < ||}td|d|d}td	d|d|d
}|| || t|j|j t	|j
|j
 |j|jkst|jtj|jddkstd S )NrW   i  rJ   sizer#   r      r*   )r/   r#   r0   rX   r'   )r2   r/   r#   r0   rX   ư>)rel)r5   randomRandomStaterW   r   r   r7   r   r:   r   r8   r;   r<   r9   pytestZapprox)	rV   r$   rX   global_random_seedrndr=   _Zkm_lloydZkm_elkanrD   rD   rE   test_kmeans_elkan_results   s(    

rf   r2   c                 C   sH   t j|}|jdd}d}t| d|dd|d|}|j|k sDtd S )NrY   rZ   i,  r]   r*   r   )r2   r/   r#   r0   rX   max_iter)r5   r`   ra   rW   r   r7   r;   r<   )r2   rc   rd   r=   rg   kmrD   rD   rE   test_kmeans_convergence   s    	ri   autofullc              	   C   sV   t jdd}t| d}tjtd|  dd || |jdksHt	W 5 Q R X d S )Nr   r-   r2   zalgorithm='zB' is deprecated, it will be removed in 1.3. Using 'lloyd' instead.matchr&   )
r5   r`   randr   rb   warnsFutureWarningr7   
_algorithmr<   )r2   r=   rC   rD   rD   rE   ,test_algorithm_auto_full_deprecation_warning   s    


rs   	Estimatorc              	   C   s`   t jdd}t jjdd}|  }|j||d d}tjt|d |j||d W 5 Q R X d S )Nr   r-   rZ   r3   zI'sample_weight' was deprecated in version 1.3 and will be removed in 1.5.rm   )	r5   r`   ro   uniformr7   rb   rp   rq   predict)rt   r=   r4   rC   Zwarn_msgrD   rD   rE   .test_predict_sample_weight_deprecation_warning   s    rw   c              	   C   sv  t j| }t|jtjd }| }t |}t |}t j|jd t	j
d}t j|jd t	j
d}t jt	jd t	j
d}t	d d }	td d }
|d d }t|	||||t j| dd}|dkstt|	||\}}|dkst||k stt|
||||t j| dd}|dkstt|
||\}}|dks<t||k sJtt|| t|| t|| t|| d S )NrZ   r   r+   rJ   F)random_reassignr   )r5   r`   ra   r"   rW   shapecopyZ
zeros_likerN   r=   r(   rM   X_csrr   r<   r   r   r   )rc   rngrR   Zcenters_old_csrrS   Zcenters_new_csrZweight_sumsZweight_sums_csrr4   ZX_mbZX_mb_csrZsample_weight_mbZold_inertiarT   Znew_inertiaZold_inertia_csrZ
labels_csrZnew_inertia_csrrD   rD   rE   !test_minibatch_update_consistency   sZ    


	
	  


r}   c                 C   sX   | j }|jttfkst| j}t|jd tks6ttt	t
|d | jdksTtd S )Nr   r   r   )r:   ry   r/   
n_featuresr<   r8   r5   uniquer   r   true_labelsr9   )rh   r"   rT   rD   rD   rE   _check_fitted_model0  s    r   rP   r1   r`   	k-means++c                 C   s   t S Nr"   r=   kr#   rD   rD   rE   <lambda>A      r   ndarraycallablec                 C   s4   t |trdnd}| |td|d|}t| d S )NrJ   r*   r    r1   r/   r#   r0   )
isinstancestrr/   r7   r   )rt   rP   r1   r0   rh   rD   rD   rE   test_all_init>  s    	   r   c                 C   s   t S r   r   r   rD   rD   rE   r   P  r   c                 C   sF   t | trdnd}t| td|d}tdD ]}|t q*t| d S )NrJ   r*   r   r   r   )r   r   r   r/   rangepartial_fitr=   r   )r1   r0   rh   irD   rD   rE   &test_minibatch_kmeans_partial_fit_initN  s       r   zinit, expected_n_init)r   r*   )r`   defaultc                 C   s   |j || jd fdS )Nr*   rZ   )ru   ry   )r=   r/   r#   rD   rD   rE   r   e  s   r   )
array-liker*   c                 C   sl   d\}}}t j||}|dkr.t j||}|dkrF| tkrBdnd}| ||dd|}|j|kshtdS )	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   rJ   r]   r   r   r,   rJ   rj   r/   r1   r0   N)r5   r`   randnr   r7   _n_initr<   )rt   r1   Zexpected_n_initZn_sampler~   r/   r=   rC   rD   rD   rE   ,test_kmeans_init_auto_with_initial_centroids_  s    
r   c                 C   s`   t t}t t}| ttd|dt}| t|d|d|}t|j|j t|j	|j	 d S )Nr*   r/   r1   r0   r#   )
r5   asfortranarrayr=   r"   r/   r7   r   r:   r   r8   )rt   rc   	X_fortrancenters_fortranZkm_cZkm_frD   rD   rE   test_fortran_aligned_data~  s(    

   r   c                  C   s8   t tddd} tj}t t_z| t W 5 |t_X d S )Nr    r*   )r/   r#   verbose)r   r/   sysstdoutr   r7   r=   )rh   Z
old_stdoutrD   rD   rE   test_minibatch_kmeans_verbose  s    r   c              	   C   s   t jdjdd}t| tddd|dd| | }t	d|j
sJtt	d	|j
s\t|dkrxt	d
|j
stnt	d|j
std S )Nr   rY   rZ   r    r`   r*   )r2   r/   r#   r1   r0   rX   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r5   r`   ra   rW   r   r/   r7   
readouterrresearchoutr<   )r2   rX   capsysr=   capturedrD   rD   rE   test_kmeans_verbose  s$    
r   c                	   C   s0   t jtdd tdddt W 5 Q R X d S )Nz,init_size.* should be larger than n_clustersrm   rJ      )	init_sizer/   )rb   rp   RuntimeWarningr   r7   r=   rD   rD   rD   rE   'test_minibatch_kmeans_warning_init_size  s
     r   c              	   C   s2   t jtdd | ttddt W 5 Q R X d S )NzAExplicit initial center position passed: performing only one initrm   rJ   r1   r/   r0   )rb   rp   r   r"   r/   r7   r=   )rt   rD   rD   rE   'test_warning_n_init_precomputed_centers  s
    r   c                 C   s   t dd| d\}}d|d d dd d f< tdd| dd	|}|jjd
d dksXttdd| dd	|}|jjd
d dksttd| dd}tdD ]}|| q|jjd
d dkstd S )Nr   r]   )r!   r"   r#   r   r-   r   rJ   r`   )r/   
batch_sizer#   r1   r*   Zaxis   )r/   r#   r1   )	r   r   r7   r:   anysumr<   r   r   )rc   Zzeroed_Xr   rh   r   rD   rD   rE    test_minibatch_sensible_reassign  s8      
      r   c              
   C   s   t ttf}ttD ]}tt|k jdd||< qt t	}t 
|}t| ||dd  }t| |||t tt j|ddd t| ||dd  }||kstt| |||t tt j|ddd t|| d S )Nr   r   r*   T)rx   Zreassignment_ratiogV瞯<)r5   emptyr/   r~   r   r=   r   meanrM   r!   Z
empty_liker   r   rN   r`   ra   r<   r   )rP   rc   Zperfect_centersr   r4   rS   Zscore_beforeZscore_afterrD   rD   rE   test_minibatch_reassign  s:    



r   c                   C   s   t ddtdddt d S )Nr   rJ   r    T)r/   r   r   r#   r   )r   r!   r7   r=   rD   rD   rD   rE   &test_minibatch_with_many_reassignments  s    r   c                  C   sp   t ddddt} | jdks"tt ddddt} | jdksDtt dddtd dt} | jtksltd S )NrJ   r]   r*   )r/   r   r0         )r/   r   r0   r   )r   r7   r=   Z
_init_sizer<   r!   rh   rD   rD   rE   test_minibatch_kmeans_init_size%  s       r   ztol, max_no_improvement)-C6?N)r   rJ   c                 C   s   t dddd\}}}td|d|dddd|d	}|| d|j  k rNdk sTn t|  }|d krrd	|jksrt|dkrd
|jkstd S )Nr,   r   T)r"   r#   Zreturn_centersr   rJ   r*   )	r/   r1   r   rX   r#   rg   r0   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   r7   r;   r<   r   r   )r   rX   r   r=   re   r"   rh   r   rD   rD   rE   #test_minibatch_declared_convergence7  s&    
r   c                  C   s   d} t jd }td| ddt }|jt|j|  | ks@tt	|jt
sPttd| ddd ddt }|jdksxt|jd| |  kstt	|jt
std S )Nr   r   r,   )r/   r   r#   rJ   )r/   r   r#   rX   r   rg   )r=   ry   r   r7   r;   r5   ceilZn_steps_r<   r   int)r   r!   rh   rD   rD   rE   test_minibatch_iter_stepsS  s$    
	r   c                  C   s6   t  } tdtdd}||  t| t| t  d S )NFr    )Zcopy_xr/   r#   )r=   rz   r   r/   r7   r   r   )Zmy_Xrh   rD   rD   rE   test_kmeans_copyxl  s
    
r   c                 C   s`   t j|dd}| d|dd}|||}| d|dd}|||}||ks\td S )Nr   rJ   r*   )r0   r#   rg   )r5   r`   ra   r   r7   Zscorer<   )rt   rc   r=   km1s1km2s2rD   rD   rE   test_score_max_iterw  s    r   zEstimator, algorithmrg   r-   c                 C   s   t ddd|d\}}|||d}| ddd||d}|d k	rF|j|d || |j}	||}
t|
|	 ||}
t|
|	 ||j}
t|
t	d d S )Nr   rJ   r!   r~   r"   r#   r+   r`   )r/   r1   r0   rg   r#   rl   )
r   
set_paramsr7   r8   rv   r   fit_predictr:   r5   Zarange)rt   r2   r$   rg   Zglobal_dtyperc   r=   re   rh   rT   predrD   rD   rE   test_kmeans_predict  s0       





r   c                 C   sl   t j|tf}| t|dd}|jt|d | t|dd}|jt|d t	|j
|j
 t|j|j d S Nr*   r/   r#   r0   r3   )r5   r`   ra   Zrandom_sampler!   r/   r7   r=   r{   r   r8   r   r:   )rt   rc   r4   Zkm_denseZ	km_sparserD   rD   rE   test_dense_sparse  s"        r   c                 C   s^   t |trdnd}| t||dd}|t t|t|j |t t|t|j d S )NrJ   r*   r   r   )	r   r   r/   r7   r{   r   rv   r=   r8   )rt   r1   r0   rh   rD   rD   rE   test_predict_dense_sparse  s    

r   c           
   	   C   s   t ddgddgddgddgddgddgg}|||d	}|d
krFdnd}|d
kr^|d d n|}| d|||d}| tkr|jdd || |jjt jkstddddddg}	t	t
|j|	d | tkrt||}|jjt jkstd S )Nr   rJ      rI   rH   r*   r-   rK   r+   r   r   )r   r   )r5   r6   r   r   r7   r:   r(   float64r<   r   r   r8   r   r   )
rt   r$   r(   r1   rc   X_denser=   r0   rh   r?   rD   rD   rE   test_integer_input  s&    .   
r   c                 C   sb   | t |dt}||j}t|t|j t| t	
t  |t}t|tt|j d S )Nr/   r#   )r/   r7   r=   	transformr:   r   r   r   Zdiagonalr5   rN   )rt   rc   rh   XtrD   rD   rE   test_transform  s    
r   c                 C   s8   | |dd tt}| |ddt}t|| d S )Nr*   )r#   r0   )r7   r=   r   Zfit_transformr   )rt   rc   ZX1ZX2rD   rD   rE   test_fit_transform  s    r   c                 C   s:   t j}dD ]*}ttd|| ddt}|j|ks
tq
d S )N)r*   r]   rJ   r`   r*   )r/   r1   r0   r#   rg   )r5   infr   r/   r7   r=   r9   r<   )rc   Zprevious_inertiar0   rh   rD   rD   rE   test_n_init  s    r   c                 C   s`   t ttd | d\}}}|jttfks(tt|jd tks@ttt	t
|d |dks\td S )N)r/   r4   r#   r   r   r   )r   r=   r/   ry   r~   r<   r5   r   r   r   r   )rc   Zcluster_centersrT   inertiarD   rD   rE   test_k_means_function  s       r   c           
      C   s0  | d|d}i }i }i }i }t jt jfD ]}|j|dd}	||	 |j||< ||	||< |j||< |j||< |jj	|kst
| tkr(||	dd  |jj	|ks(t
q(t|t j |t j dd t|t j |t j |t j  d d	 t|t j |t j |t j  d d	 t|t j |t j  d S )
Nr*   )r0   r#   Frz   r   r,   r   rtol)Zatol)r5   r   float32astyper7   r9   r   r:   r8   r(   r<   r   r   r   maxr   )
rt   rP   rc   rh   r   r   r"   rT   r(   r=   rD   rD   rE   test_float_precision-  s0    



(  r   c                 C   sJ   t j|dd}tj|dd}| |tdd}|| t|j|rFtd S )NFr   r*   r   )	r=   r   r"   r/   r7   r5   Zmay_share_memoryr:   r<   )rt   r(   Z
X_new_typeZcenters_new_typerh   rD   rD   rE   test_centers_not_mutatedS  s
    
r   c                 C   s8   t td| }t t|jdd| }t|j|j d S )N)r/   r*   r   )r   r/   r7   r:   r   )rP   r   r   rD   rD   rE   test_kmeans_init_fitted_centersb  s    r   c              	   C   st   t ddgddgddgddgg}td| d}d}tjt|d* || t|jtt	dksft
W 5 Q R X d S )Nr   r*      r   zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.rm   r,   )r5   asarrayr   rb   rp   r   r7   setr8   r   r<   )rc   r=   rh   msgrD   rD   rE   1test_kmeans_warns_less_centers_than_unique_pointsl  s    "
r   c                 C   s   t j| ddS Nr   r   )r5   sortr   rD   rD   rE   _sort_centers}  s    r   c                 C   s   t j| jddtd}t jt|dd}ttdt	| d}t
|jt|d}t |j|}t
||}t|j| t|j|j tt|jt|j d S )Nr*   r]   rZ   r   r   )r1   r0   r/   r#   r3   )r5   r`   ra   randintr!   repeatr=   r   r"   r/   r   r7   r8   r   r   r9   r   r:   )rc   r4   ZX_repeatrh   Zkm_weightedZrepeated_labelsZkm_repeatedrD   rD   rE   test_weighted_vs_repeated  s*         r   c                 C   s\   t t}| t|dd}t|j|d d}t|j||d}t|j|j t|j	|j	 d S r   )
r5   rM   r!   r/   r   r7   r   r8   r   r:   )rt   rP   rc   r4   rh   Zkm_noneZkm_onesrD   rD   rE   test_unit_weights_vs_no_weights  s    
r   c                 C   sj   t j|jtd}| t|dd}t|j||d}t|j|d| d}t|j	|j	 t
|j|j d S )NrZ   r*   r   r3   r)   )r5   r`   ra   ru   r!   r/   r   r7   r   r8   r   r:   )rt   rP   rc   r4   rh   Zkm_origZ	km_scaledrD   rD   rE   test_scaled_weights  s    r   c                  C   s$   t dddt} | jdks td S )Nr'   r*   )r2   rg   )r   r7   r=   r;   r<   r   rD   rD   rE    test_kmeans_elkan_iter_attribute  s    r   c                 C   st   | dgdgg}ddg}t dgdgg}td|dd}|j||d tt|jdks\tt|j	dgdgg d S )	NrH   r*   gffffff?g?rJ   r-   r   r3   )
r5   r6   r   r7   lenr   r8   r<   r   r:   )r$   r=   r4   r1   rh   rD   rD   rE   #test_kmeans_empty_cluster_relocated  s    r   c              	   C   s~   t j|}|jdd}tddd | t|d|j}W 5 Q R X tddd | t|d|j}W 5 Q R X t|| d S )N)2   rJ   rZ   r*   Zopenmp)ZlimitsZuser_apir   r-   )	r5   r`   ra   rW   r   r/   r7   r8   r   )rt   rc   rd   r=   Zresult_1Zresult_2rD   rD   rE   #test_result_equal_in_diff_n_threads  s    r   c                	   C   s0   t jtdd tdddt W 5 Q R X d S )Nz9algorithm='elkan' doesn't make sense for a single clusterrm   r*   r'   )r/   r2   )rb   rp   r   r   r7   r=   rD   rD   rD   rE   test_warning_elkan_1_cluster  s
    r   c                 C   sz   t j|jdd}|d d }| |}dd }|||\}}tdd||dd|}|j}	|j}
t||	 t	||
 d S )N)r   r]   rZ   r]   c                 S   sP   |  }t| |}t|jd D ]}| ||k jdd||< q t| |}||fS r   )rz   r   r   ry   r   )r=   r1   Znew_centersrT   labelrD   rD   rE   	py_kmeans  s    

z+test_k_means_1_iteration.<locals>.py_kmeansr*   )r/   r0   r1   r2   rg   )
r5   r`   ra   ru   r   r7   r8   r:   r   r   )r$   r%   rc   r=   r>   r   Z	py_labelsZ
py_centersZ	cy_kmeansZ	cy_labelsZ
cy_centersrD   rD   rE   test_k_means_1_iteration  s$        
r   squaredTFc                 C   s   t j|}tjdddd|| d}| d}|dj| dd}|d	  }|| d	  }|rh|nt 	|}t
|||}	t|j|j|||}
| t jkrd
nd}t|	|
|d t|	||d t|
||d d S )Nr*   r   r)   csrZdensityformatr#   r(   rH   Fr   r-   r   gHz>r   )r5   r`   ra   sptoarrayrL   r   r   r   sqrtr	   r
   rP   rQ   r   r   )r(   r   rc   r|   Za_sparseZa_densebZb_squared_normexpectedZdistance_dense_denseZdistance_sparse_denser   rD   rD   rE   test_euclidean_distance  s4             r  c                 C   s|  t j|}tjdddd|| d}| }|dj| dd}|ddj| dd}|jddt jd	}|||  d
 j	dd}t 	|| }	t
||||dd}
t||||dd}| t jkrdnd}t|
||d t|
|	|d t||	|d d}||k}|| ||  d
 j	dd}t 	|||  }	t
||||d|d}
t||||d|d}t|
||d t|
|	|d t||	|d d S )Nr   rJ   r)   r   r   Fr   r]   )r[   r(   r-   r*   r   )	n_threadsr   r^   r   )r  Zsingle_label)r5   r`   ra   r  r  r   r   r   rO   r   r   r   r   r   )r(   rc   r|   ZX_sparser   r4   r"   rT   Z	distancesr  Zinertia_denseZinertia_sparser   r   maskrD   rD   rE   test_inertia*  sd                       r
  zKlass, default_n_initrJ   r,   c              	   C   s   | dd}t   t dt |t W 5 Q R X | jdkrBdnd}d| d}|  }tjt|d	 |t W 5 Q R X d S )
Nr*   r0   errorr   rJ   r,   z/The default value of `n_init` will change from z to 'auto' in 1.4rm   )	warningscatch_warningssimplefilterrq   r7   r=   __name__rb   rp   )Klassdefault_n_initestr   rD   rD   rE   !test_change_n_init_future_warningV  s    


r  c                 C   s\   | ddd}| t |jdks$t| ddd}| t | jdkrP|jdksXndsXtd S )	Nrj   r   )r0   r1   r*   r`   r   rJ   r,   )r7   r=   r   r<   r  )r  r  r  rD   rD   rE   test_n_init_autog  s    

r  c                 C   sV   t dgdgdgg}t dddg}| dddj||d	 t|t dddg d S )
Nr*   r-   r   r)   g?g333333?r   r   r3   )r5   r6   r7   r   )rt   r=   r4   rD   rD   rE   test_sample_weight_unchangedr  s    r  zparam, matchr/   r*   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                 C   s   | d d S )Nr-   rD   ZX_r   r#   rD   rD   rE   r     r   rK   zUThe shape of the initial centers .* does not match the number of features of the datac                 C   s   | d dd df S )NrK   r-   rD   r  rD   rD   rE   r     r   c              	   C   s:   | dd}t jt|d |jf |t W 5 Q R X d S )Nr*   r  rm   )rb   raises
ValueErrorr   r7   r=   )rt   paramrn   rh   rD   rD   rE   test_wrong_params|  s    
r  x_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc              	   C   s,   t jt|d tttf|  W 5 Q R X d S )Nrm   )rb   r  r  r   r=   r/   )r  rn   rD   rD   rE   !test_kmeans_plusplus_wrong_params  s    r  c                 C   s   |  |} t| t|d\}}|jd tks.t|dk s>t|| jd k sTt|jd tksft|jdd| jddk st|jdd| jddk sttt	|  || d S )Nr\   r   r   )
r   r   r/   ry   r<   allr   minr   r=   )rP   r(   rc   r"   rQ   rD   rD   rE   test_kmeans_plusplus_output  s    
  
  r   r   c                 C   s$   t tt| d\}}tt| | d S )N)r  )r   r=   r/   r   )r  r"   rQ   rD   rD   rE   test_kmeans_plusplus_norms  s    r"  c                 C   s<   t tt| d\}}tt}t |t| d\}}t|| d S )Nr\   )r   r=   r/   r5   r   r   )rc   Z	centers_cre   r   r   rD   rD   rE   test_kmeans_plusplus_dataorder  s    
  
r#  c               	   C   s   t jddddddddgt jd} t| | ds0tt jddddddddgt jd}t| |ds`tt jddddddddgt jd}t| |drtd S )Nr*   r   r-   r+   r,   )r5   r6   rO   r   r<   )Zlabels1Zlabels2Zlabels3rD   rD   rE   test_is_same_clustering  s       r$  kwargs)r1   r0   c                 C   sH   t jddgddgddgddggt jd}tf ddi| }|| dS )zZCheck that init works with numpy scalar strings.

    Non-regression test for #21964.
    r   r)   r*   r+   r/   r-   N)r5   r   r   r   r7   )r%  r=   Z
clusteringrD   rD   rE   -test_kmeans_with_array_like_or_np_scalar_init  s    (r&  zKlass, methodr7   r   c                    sR   | j   |  }t||t |jjd }| }t fddt|D | dS )z=Check `feature_names_out` for `KMeans` and `MiniBatchKMeans`.r   c                    s   g | ]}  | qS rD   rD   ).0r   
class_namerD   rE   
<listcomp>	  s     z*test_feature_names_out.<locals>.<listcomp>N)	r  lowergetattrr=   r:   ry   Zget_feature_names_outr   r   )r  methodrC   r/   Z	names_outrD   r(  rE   test_feature_names_out  s    
r.  	is_sparsec                 C   sb   t ddddd\}}| r"t|}t }||}t|j|_t|j|_||}t	|| dS )z_Check that predict does not change cluster centers.

    Non-regression test for gh-24253.
    r   rJ   r   r   N)
r   r  
csr_matrixr   r   r   r:   r8   rv   r   )r/  r=   re   rC   Zy_pred1Zy_pred2rD   rD   rE   ,test_predict_does_not_change_cluster_centers  s    


r1  c           	   	   C   s   t j|}tddd|d\}}t|dd}t }|j||| |j|jd ddt j|d	}|j||| t 	|jd dt j|d	}t
t t|| W 5 Q R X d
S )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   rJ   r   Tr!  r   rZ   r]   r=   r  r1   r4   Zn_centroidsr#   N)r5   r`   ra   r   r   r   _init_centroidsru   ry   rM   rb   r  r<   r   )	r1   rc   r|   r=   re   r  rC   clusters_weightedZclustersrD   rD   rE   test_sample_weight_init   s6       


r5  c           
   	   C   s   t j|}tddd|d\}}|j|jd d}d|ddd< t|dd	}t }|j||| |d
t j|d}t	|ddd |}	t 
t |	drtdS )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   r]   r   r   rZ   Nr-   Tr!  rJ   r2  )r5   r`   ra   r   ru   ry   r   r   r3  r   r   iscloser<   )
r1   rc   r|   r=   re   r4   r  rC   r4  drD   rD   rE   test_sample_weight_zeroB  s*       


r8  )__doc__r   r   r  ior   numpyr5   rb   Zscipyr   r  Zsklearn.baser   Zsklearn.clusterr   r   r   r   Zsklearn.cluster._k_means_commonr	   r
   r   r   r   r   r   Zsklearn.cluster._kmeansr   r   Zsklearn.datasetsr   Zsklearn.exceptionsr   Zsklearn.metricsr   r   Zsklearn.metrics.clusterr   Zsklearn.metrics.pairwiser   Zsklearn.utils._testingr   r   r   Zsklearn.utils.extmathr   Zsklearn.utils.fixesr   r   markfilterwarningsZ
pytestmarkr6   r"   r!   ry   r/   r~   r=   r   r0  r{   Zparametrizer   r   rF   rG   rU   rf   ri   rs   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   Zint64r   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   r"  r#  r$  Zstr_r&  r.  r1  r5  r8  rD   rD   rD   rE   <module>   s  $	
   

 
  
  
 
) 
 


?
	





.

 
 #
   
 

$
	 
 

	 
 
+



	

	


 "



!