
    -i/                        S SK r S SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJrJrJrJr  S SKJr  S SKJr  S S	KJrJrJrJr  \R4                  R7                  S
S/\-   \-   \-   \-   5      \R4                  R7                  SSS/5      S 5       5       rS rS rS rS r S r!\R4                  R7                  S\RD                  \RF                  45      S 5       r$\R4                  R7                  S
\\-   \-   \-   5      S 5       r%\R4                  R7                  S
\\-   \-   \-   5      S 5       r&\R4                  R7                  S
\\-   \-   5      S 5       r'S r(S r)S r*S r+S r,g)    N)assert_allclose)issparse)datasets)pairwise_distances)calinski_harabasz_scoredavies_bouldin_scoresilhouette_samplessilhouette_score)_silhouette_reduce)assert_array_equal)CSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERSsparse_containersample_sizehalfc                 T   [         R                  " 5       nUR                  UR                  pCU b  U " U5      nUS:X  a  [	        UR
                  S   S-  5      OUn[        USS9n[        XTSUSS9n[        X4SUSS9nUS:  d   eUS:  d   eU[        R                  " U5      :X  d   eg )Nr   r      	euclideanmetricprecomputed)r   r   random_state)
r   	load_irisdatatargetintshaper   r
   pytestapprox)r   r   datasetXyDscore_precomputedscore_euclideans           b/var/www/html/venv/lib/python3.13/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.pytest_silhouetter)      s       "G<<q#Q)4)>#aggaj1n%KK1[1A(	]! '	[kO q   Qo >>>>    c                      S/S/S/S/S/S//n [         R                  " / SQ5      n[        X5      n[         R                  " U5      (       a   e[	        X5      n[        U/ SQ5        g )N              ?g       @      @)r      r/   r/   r   r   )r         ?r0   r   r/   r/   )nparrayr
   isnanr	   r   )r#   labels
silhouettesss       r(   test_cluster_size_1r7   4   sg     usecUSE2AXX()F "!,Jxx
####	A	&Br12r*   c                     / SQn [         R                  " S5      nX[         R                  " SS5      '   XR                  -  n/ SQn/ SQnSSS	S
SSSSSSSSS.nSn/ SQnSSSSSSSSSSSSS.nSnX4U4XgU44 H  u  pnU Vs/ s H  oU   PM	     n
n[        R
                  " U
[        U[         R                  " U	5      S S!9S"S#9  [        R
                  " U[        U[         R                  " U	5      S S!9S"S#9  M     g s  snf )$N)BRQ@      @      @gRQ@r:   gp=
ף@RQ@gRQ@gףp=
W @RQ@g\(\@      @Gz@Gz@Gz@Gz@      @r9         @gGz@rB   g\(\@g      @rB   rB   rC   g\(\@Gz@g      @rA   g      @gRQ@      @g      @gRQ@g      @RQ@r?   g      @g\(\@rD   rE   rE   r@   rE   g      @gRQ@rF   g      @r>   gGz@rG   r=   r?   g\(\@g      @r.   rG   r?   rC   r9   r<   rE   gGz@r;   r@   )   rH   rH   )BELBRACHICUBEGYFRAINDISRUSAUSSYUGZAI)r/   r/   r   r   r/   r/   r   r/   r/   r   r   r/   gQ?g(\?gffffff?g333333?g)\(?皙?gRQ?g?g(\?gQ?gp=
ף?g{Gz)rR   rJ   rO   rQ   rK   rN   rU   rM   rS   rL   rT   rP   gQ?)r/   r      rW   r/   r/   r   r/   r/   rW   rW   r   gGz?g)\(?gzG?gGz?g{Gz?g      ?g(\?gQ?gףp=
?)rR   rO   rJ   rQ   rN   rU   rK   rP   rM   rS   rT   rL   r   r   g{Gz?)abs)	r1   zerostril_indicesTr    r!   r	   r2   r
   )lowerr%   nameslabels1	expected1score1labels2	expected2score2r4   expectedscorenames                r(   test_silhouette_paper_examplerg   K   sB   CEH 	A!&boob"HAE  3GI F 3GI F 
V$	V$$% 055utTNu5q"((6"2=I	

 	#Arxx'7NTX	
$ 6s   C=c                  R   [         R                  " 5       n U R                  n[        R                  " UR
                  S   5      nS[        [        R                  " U5      5      -  n[        R                  " [        US9   [        X5        S S S 5        [        R                  " UR
                  S   5      nS[        [        R                  " U5      5      -  n[        R                  " [        US9   [        X5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   zJNumber of labels is %d\. Valid values are 2 to n_samples - 1 \(inclusive\)match)r   r   r   r1   aranger   lenuniquer    raises
ValueErrorr
   rY   )r"   r#   r$   err_msgs       r(   test_correct_labelsizerq      s      "GA 			!''!*A	*,/		!,=	>  
z	1 
2 	A	*,/		!,=	>  
z	1 
2	1 
2	1 
2	1s    D2D
D
D&c                      [         R                  " 5       n U R                  nU R                  n[	        XS-  S-   5      [	        X5      :X  d   e[        [        XS-  S-   5      [        X5      5        g )Nr   
   )r   r   r   r   r
   r   r	   )r"   r#   r4   s      r(   test_non_encoded_labelsrt      sc      "GA^^FAzB/3CA3NNNN1qj2o.0B10Mr*   c                      [         R                  " 5       n U R                  nU R                  n[	        [        U5      [        U5      5      [	        X5      :X  d   eg )N)r   r   r   r   r
   list)r"   r#   r$   s      r(   test_non_numpy_labelsrw      sE      "GAADGT!W-1A!1GGGGr*   dtypec                    [        [        R                  " / SQ/U S9R                  5      n/ SQn[        R                  " UR
                  5      R                  S-  US   S'   [        XSS9  [        R                  " UR
                  5      R                  S-  US   S'   [        R                  " [        S	S
9   [        XSS9  S S S 5        g ! , (       d  f       g = f)N)rV   皙?gQ?gq=
ףp?g(\?皙?rx   )r   r   r   r/   r/   r/   rs   r   r   r   i  contains non-zerori   )r   r1   r2   r[   finforx   epsr	   r    rn   ro   )rx   distsr4   s      r(   test_silhouette_nonzero_diagr     s     
34EBDDE  F ((5;;'++b0E!HQKu]; ((5;;'++d2E!HQK	z)<	=5? 
>	=	=s   9C
Cc                     [         R                  " / SQ/[         R                  S9R                  n/ SQn[	        U5      nU " U5      n[        U5      (       d   e[        XBSS9n[        X2SS9n[        XV5        g)BCheck that silhouette_samples works for sparse matrices correctly.rV   rz   rz   rV   rz   r{   rV   rz   r|   r   r   r   r   r/   r/   r/   r/   r   r   Nr1   r2   float32r[   r   r   r	   r   r   r#   r$   pdist_densepdist_sparseoutput_with_sparse_inputoutput_with_dense_inputs          r(   *test_silhouette_samples_precomputed_sparser     so     	:;2::NPPA A$Q'K#K0LL!!!!1,-X0V,Fr*   c                     [         R                  " / SQ/[         R                  S9R                  n/ SQn[	        U5      nU " U5      n[        U5      (       d   e[        XB5      n[        X25      n[        XV5        g)r   r   r|   r   Nr   r   s          r(   (test_silhouette_samples_euclidean_sparser   '  sk     	:;2::NPPA A$Q'K#K0LL!!!!1,B0@,Fr*   c                 :   [         R                  " / SQ/[         R                  S9R                  n[	        U5      nU " U5      n/ SQn[         R
                  " U5      n[        R                  " [        SS9   [        USXES9  SSS5        g! , (       d  f       g= f)	z?Check for non-CSR input to private method `_silhouette_reduce`.r   r|   r   z=Expected CSR matrix. Please pass sparse matrix in CSR format.ri   r   )startr4   label_freqsN)
r1   r2   r   r[   r   bincountr    rn   	TypeErrorr   )r   r#   r   r   r$   r   s         r(   test_silhouette_reducer   7  sx    
 	:;2::NPPA$Q'K#K0L A++a.K	M
 	<qT	
 
 
s   7B
Bc                     [         R                  R                  SS9n[        R                  " [
        SS9   U " UR                  SS5      [         R                  " S5      5        SSS5        g! , (       d  f       g= f)z+Assert message when there is only one labelr   seedNumber of labels isri   rs   r   N)r1   randomRandomStater    rn   ro   randrY   funcrngs     r(   assert_raises_on_only_one_labelr   H  sQ    
))

Q

'C	z)>	?SXXb!_bhhrl+ 
@	?	?   .A..
A<c                     [         R                  R                  SS9n[        R                  " [
        SS9   U " UR                  SS5      [         R                  " S5      5        SSS5        g! , (       d  f       g= f)z7Assert message when all point are in different clustersr   r   r   ri   rs   r   N)r1   r   r   r    rn   ro   r   rk   r   s     r(   (assert_raises_on_all_points_same_clusterr   O  sQ    
))

Q

'C	z)>	?SXXb!_biim, 
@	?	?r   c                     [        [        5        [        [        5        S[        [        R                  " S5      S/S-  S/S-  -   5      :X  d   eS[        SS/SS//S-  S/S-  S/S-  -   5      :X  d   eSS/SS//S-  S	S	/S
S
//S-  -   SS
/SS	//S-  -   S	S/S
S//S-  -   n S/S-  S/S-  -   S/S-  -   S	/S-  -   n[
        R                  " [        X5      S5        g )Nr-   rs   r   r      r/   r,   rI   rs   rW      r   g      [@)r   r   r   r1   onesr    r!   r#   r4   s     r(   test_calinski_harabasz_scorer   V  s1   #$;<,-DE )"'''*:QC!GqcAg<MNNNN )B8aV*<r*AA38qcTVhCVWWWW Q!Q1q6Aq6
Q
	q6Aq6
Q
	 q6Aq6
Q
	  S2Xb A38+qcBh6F
MM)!46STr*   c                  T   [        [        5        [        [        5        [        [        R                  " S5      S/S-  S/S-  -   5      [
        R                  " S5      :X  d   e[        SS/SS//S-  S/S-  S/S-  -   5      [
        R                  " S5      :X  d   eSS/SS//S-  SS/S	S	//S-  -   SS	/SS//S-  -   SS/S	S//S-  -   n S/S-  S/S-  -   S
/S-  -   S/S-  -   n[
        R                  " [        X5      S
[        R                  " S5      -  S-  5        [        R                  " 5          [        R                  " S[        5        [        X5        S S S 5        SS/S
S
/SS/SS//n / SQn[
        R                  " [        X5      S5        g ! , (       d  f       NA= f)Nr   r   r   r/   r,   rI   rs   rW   r   r   r0   error)r   r   r/   r   g?)r   r   r   r1   r   r    r!   sqrtwarningscatch_warningssimplefilterRuntimeWarningr   s     r(   test_davies_bouldin_scorer   l  s   #$89,-AB   01#'QC!G2CDI   
  
bAq6R!rQC"H!4	s	   Q!Q1q6Aq6
Q
	q6Aq6
Q
	 q6Aq6
Q
	  S2Xb A38+qcBh6F
MM&q11rwws|3Ca3GH 
	 	 	"g~6Q' 
#
 Q!Q!Q!Q(AF
MM&q1=A 
#	"s   7'F
F'c                      [        / SQ/ SQ/ SQ// SQSS9n U [        R                  " S5      :X  d   e[        R                  " [        SS	9   [        / S
Q/ SQ/ SQ// SQSS9  SSS5        g! , (       d  f       g= f)znCheck that silhouette_score works for precomputed metrics that are integers.

Non-regression test for #22107.
)r   r/   r   )r/   r   r/   )r   r/   r   )r   r   r/   r   r   gUUUUUU?r}   ri   )r/   r/   r   N)r
   r    r!   rn   ro   )results    r(   )test_silhouette_score_integer_precomputedr     sh    
 	Iy)9]F V]]5)))) 
z)<	=	9-y	
 
>	=	=s   A,,
A:)-r   numpyr1   r    numpy.testingr   scipy.sparser   sklearnr   sklearn.metricsr   sklearn.metrics.clusterr   r   r	   r
   %sklearn.metrics.cluster._unsupervisedr   sklearn.utils._testingr   sklearn.utils.fixesr   r   r   r   markparametrizer)   r7   rg   rq   rt   rw   r   float64r   r   r   r   r   r   r   r   r    r*   r(   <module>r      s      ) !  .  E 5  	F^n,~=N v7? 8	
?*3.K
\0H 2::rzz":;@ <@( ^#n4~E	G		G ^#n4~E	G		G 7.HUU,-U, BF
r*   