
    /ЦiwL              
          S SK r S SKrS SKrS SKJrJrJr  S SKJ	r	  S SK
JrJrJrJrJrJrJrJrJrJrJrJrJr  S SKJrJrJrJr  S SKJr  S SKJ r J!r!  S SK"J#r#J$r$  \\\\\\\/r%\RL                  RO                  S	\%5      S
 5       r(S r)\RL                  RO                  S	\%5      S 5       r*\RL                  RO                  S	\\/5      \RL                  RO                  S/ SQ5      S 5       5       r+S r,S r-S r.S r/S r0S;S jr1S r2S r3S r4S r5S r6S r7\RL                  RO                  S\!" 5       \ S9S 5       r8S r9S  r:S! r;S<S" jr<S# r=S$ r>\RL                  RO                  S%S&/S'-  / S(Q4S)/S'-  / S(Q4/ S(QS&/S'-  4/ S(QS)/S'-  4S&/S'-  S&/S'-  4/5      S* 5       r?S+ r@S, rAS- rBS. rC\RL                  RO                  S/\D" \E" S05      5      \D" \E" S05      5      4\R                  " S15      \R                  " S15      4/5      S2 5       rGS3 rHS4 rI\RL                  RO                  S/ S5Q5      S6 5       rJ\RL                  RO                  S7S8S9/5      S: 5       rKg)=    N)assert_allcloseassert_array_almost_equalassert_array_equal)config_context)adjusted_mutual_info_scoreadjusted_rand_scorecompleteness_scorecontingency_matrixexpected_mutual_informationfowlkes_mallows_score"homogeneity_completeness_v_measurehomogeneity_scoremutual_info_scorenormalized_mutual_info_scorepair_confusion_matrix
rand_scorev_measure_score)_entropy_generalized_averagecheck_clusteringsentropy)assert_all_finite)_get_namespace_device_dtype_ids)yield_namespace_device_dtype_combinations)_array_api_for_testsassert_almost_equal
score_funcc                    Sn[         R                  " [        US9   U " SS// SQ5        S S S 5        Sn[         R                  " [        US9   U " SS/SS/// SQ5        S S S 5        Sn[         R                  " [        US9   U " / SQSS/SS//5        S S S 5        g ! , (       d  f       Ny= f! , (       d  f       NU= f! , (       d  f       g = f)	NzDFound input variables with inconsistent numbers of samples: \[2, 3\]matchr      )r!   r!   r!   z$labels_true must be 1D: shape is \(2z$labels_pred must be 1D: shape is \(2r   r!   r   )pytestraises
ValueError)r   expecteds     l/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/sklearn/metrics/cluster/tests/test_supervised.py"test_error_messages_on_wrong_inputr(   /   s    VH	z	2Aq69% 
3 7H	z	2QFQF#Y/ 
3 7H	z	291v1v./ 
3	2 
3	2 
3	2 
3	2s#   BB.B?
B+.
B<?
Cc                  4   Su  p/ SQnU Vs/ s H  n[        XU5      PM     nnUS   US   s=::  a  US   s=::  a
  US   ::  d   e   eSu  pVU Vs/ s H  n[        XVU5      PM     nnUS   US   s=:X  a  US   s=:X  a
  US   :X  d   e   eg s  snf s  snf )N)r!      min	geometric
arithmeticmaxr   r!   r*      )   r1   )r   )abmethodsmethodmeanscds          r'   test_generalized_averager9   >   s    DA7G>EFgF!!/gEF8uQx7587uQx77777DA>EFgF!!/gEF8uQx7587uQx77777	 G Gs   BBc                    U " / / 5      [         R                  " S5      :X  d   eU " S/S/5      [         R                  " S5      :X  d   eU " / SQ/ SQ5      [         R                  " S5      :X  d   eU " / SQ/ SQ5      [         R                  " S5      :X  d   eU " / SQ/ SQ5      [         R                  " S5      :X  d   eU " / S	Q/ S
Q5      [         R                  " S5      :X  d   eU " / SQ/ SQ5      [         R                  " S5      :X  d   eg )N      ?r   r!   r   r   r   r"   *      r>           r;   rA         E@      @rC   rA   r;          @rC   rD   rF   r   r!   r*   r>   r?   r*   r#   approx)r   s    r'   test_perfect_matchesrL   H   s    b"s!3333qcA36==#5555i+v}}S/AAAAi-s1CCCCo'89V]]3=OOOOo'78FMM#<NNNNi,c0BBBB    average_methodr+   c                    U " / / US9[         R                  " S5      :X  d   eU " S/S/US9[         R                  " S5      :X  d   eU " / SQ/ SQUS9[         R                  " S5      :X  d   eU " / SQ/ SQUS9[         R                  " S5      :X  d   eU " / SQ/ S	QUS9[         R                  " S5      :X  d   eU " / S
Q/ SQUS9[         R                  " S5      :X  d   eU " / SQ/ SQUS9[         R                  " S5      :X  d   eU " SS/SS/US9[         R                  " S5      :X  d   eU " / SQ/ SQUS9[         R                  " S5      :X  d   eg )NrN   r;   r   r!   r<   r"   r=   r@   rB   rE   rG   rH   rI   )r   r!   r*   r0   rJ   )r   rN   s     r'   (test_perfect_matches_with_changing_meansrQ   S   s    b"^<c@RRRRqcA3~>&--PSBTTTT9^	s	   ;~	s	   *>	s	   ).	s	   :n	s	   q!fq!f^DI    l>	s	  rM   c                  x    [        / SQ/ SQ5      u  pn[        U SS5        [        USS5        [        USS5        g )Nr   r   r   r!   r!   r!   )r   r   r   r!   r*   r*   r;   r*   gGz?gQ?r   r   hr7   vs      r'   *test_homogeneous_but_not_complete_labelingrX   v   8    01CEWXGA!4#4#4#rM   c                  x    [        / SQ/ SQ5      u  pn[        U SS5        [        USS5        [        USS5        g )Nr   r   r!   r!   r*   r*   )r   r   r!   r!   r!   r!   g(\?r*   r;   g\(\?rT   rU   s      r'   *test_complete_but_not_homogeneous_labelingr\   ~   rY   rM   c                  x    [        / SQ/ SQ5      u  pn[        U SS5        [        USS5        [        USS5        g )NrS   r   r!   r   r!   r*   r*   q=
ףp?r*   zG?p=
ף?rT   rU   s      r'   .test_not_complete_and_not_homogeneous_labelingrb      rY   rM   c                      Sn SnSnSU -   U-  U-  X-  U-   -  n[        / SQ/ SQU S9u  pEn[        XAS5        [        XRS5        [        XcS5        [        / SQ/ SQU S9n[        XcS5        g )	Ng?r_   r`   r!   rS   r^   )betar*   )r   r   r   )	beta_testh_testc_testv_testrV   r7   rW   s          r'   test_beta_parameterri      s     IFF)mv%.)2Dv2MNF0.YGA! 1%1%1%*,>YOA1%rM   c                     [        / SQ/ SQ5      u  pn[        U SS5        [        USS5        [        USS5        [        / SQ/ SQ5      u  pn[        U SS5        [        USS5        [        USS5        [        / SQ/ SQ5      n[        / SQ/ SQ5      n[        US	S5        [        US	S5        [        / SQ/ SQ5      n[        / SQ/ SQ5      n[        US
S5        [        US
S5        g )N)r   r   r   r*   r*   r*   r^   r_   r*   r`   ra   rS   )r      r   rk   r*   r*   gQ?gQ?)r   r   r   r   )rV   r7   rW   ari_1ari_2ri_1ri_2s          r'   test_non_consecutive_labelsrp      s    01CEWXGA!4#4#4#01CEWXGA!4#4#4# 24FGE 24FGEtQ'tQ'(*<=D(*<=DdA&dA&rM   c                    [         R                  R                  U5      R                  n[         R                  " [        U5      U45      n[        U5       H1  u  px[        U5       H  n	U" SXS9n
U" SXS9nU " X5      XgU	4'   M     M3     U$ )Nr   )lowhighsize)nprandomRandomStaterandintzeroslen	enumeraterange)r   	n_samplesk_rangen_runsseedrandom_labelsscoresikjlabels_alabels_bs               r'   uniform_labelings_scoresr      s    II))$/77MXXs7|V,-F'"vA$CH$CH%h9Fa4L  #
 MrM   c                      / SQn SnSn[        [        XU5      n[        R                  " U5      R	                  SS9n[        U/ SQS5        g )N)r*   
   2   Z   d   r   r!   )axis){Gz?Q?r   r   r*   )r   r   ru   absr/   r   )n_clusters_ranger}   r   r   max_abs_scoress        r'   test_adjustment_for_chancer      sM    &IF%Y&F VVF^''Q'/Nn.FJrM   c                     [         R                  " / SQ5      n [         R                  " / SQ5      n[        X5      n[        USS5        [	        XSS9n[        XUS9n[        USS5        [	        X5      n[        XUS9n[        USS5        UR                  5       n[        X45      n[        USS5        [        X5      n[        US	S5        [        / S
Q/ SQ5      nU[        R                  " S5      :X  d   e[         R                  " [        U 5      S-  /5      R                  5       n[         R                  " [        U5      S-  /5      R                  5       n[        Xx5      n[        USS5        g )Nr!   r!   r!   r!   r!   r!   r*   r*   r*   r*   r*   r*   r0   r0   r0   r0   r0   r!   r!   r!   r!   r*   r!   r*   r*   r*   r*   r0   r!   r0   r0   r0   r*   r*   gS
cA?   Tsparse)contingencygpUj@?gP1?)r!   r!   r*   r*   )r*   r*   r0   r0   r;   n   gRQ?r*   )ru   arrayr   r   r
   sumr   r   r#   rK   listflatten)	r   r   miCr}   emiamia110b110s	            r'   test_adjusted_mutual_info_scorer      s2   xxKLHxxKLH	8	.BGQ'8d;A	81	=BGQ'8.A	81	=BGQ'I
%a
3CWa(
$X
8CWa(
$\<
@C&--$$$$88T(^c)*+335D88T(^c)*+335D
$T
0CT1%rM   c                  T    [        [        R                  " S//5      S5      S::  d   eg )Nip r!   )r   ru   r    rM   r'   "test_expected_mutual_info_overflowr      s&     'rxx%	':EBaGGGrM   c                  r   [         R                  " S/S-  S/S-  -   S/S-  -   S/S-  -   S	/S
-  -   5      n [         R                  " S/S-  S/S-  -   S/S-  -   S/S-  -   S/S-  -   S/S-  -   S/S-  -   S/S-  -   S/S-  -   S/S-  -   5      n[        [        X5      5        [        [	        X5      5        g )Nr!   iy  r*   i]<  r0   i  rk   iU  r   iP  r   i  i	  iD9  i  i     i.  '   i<     )ru   r   r   r   r   )xys     r'   3test_int_overflow_mutual_info_fowlkes_mallows_scorer      s   
	
|#
	#
	 #
	 #
			A 		
e#*	#+	 #)	 #*		
 #)	 #)	 #(	 #)	 #(			A '-.+A12rM   c                      [         R                  " [        SS9   [        / SQ5        S S S 5        g ! , (       d  f       g = f)NzFunction entropy is deprecatedr   r   r   rC   )r#   warnsFutureWarningr   r   rM   r'   test_public_entropy_deprecationr     s&    	m+K	L 
M	L	Ls   1
?c                      [        [        / SQ5      SS5        [        [        / 5      S5        [        / SQ5      S:X  d   eg )Nr   ,^R^?r   r!   r!   r!   r!   r!   r   )r   r   r   rM   r'   test_entropyr     s4    .	1=a(L!Q&&&rM   z#array_namespace, device, dtype_name)idsc                    [        X5      nUR                  [        R                  " / SQUS9US9nUR                  / UR                  US9nUR                  / SQUS9n[	        SS9   [        U5      [        R                  " SS	S
9:X  d   e[        U5      S:X  d   e[        U5      S:X  d   e S S S 5        g ! , (       d  f       g = f)Nr   dtype)device)r   r   r   T)array_api_dispatchr   gh㈵>)r   r!   r   )r   asarrayru   int32r   r   r#   rK   )array_namespacer   
dtype_namexpfloat_labelsempty_int32_labels
int_labelss          r'   test_entropy_array_apir     s     
o	6B::bjjZHQW:XLBbhhvFL8J	4	0%yd)KKKK*+q000
#q((( 
1	0	0s   'AB88
Cc            	      H   [         R                  " / SQ5      n [         R                  " / SQ5      n[        X5      n[         R                  " X[         R                  " SS5      [         R                  " SS5      4S9S   n[        X#5        [        XSS9n[        X#S-   5        g )	Nr   r   r!   r   )binsr   g?)eps)ru   r   r
   histogram2daranger   )r   r   r   C2s       r'   test_contingency_matrixr   .  sz    xxKLHxxKLH8.A	"))Aq/299QPQ?1S	TUV	WBa$837Aac*rM   c                  <   [         R                  " / SQ5      n [         R                  " / SQ5      n[        X5      n[        XSS9R                  5       n[	        X#5        [
        R                  " [        SS9   [        XSSS9  S S S 5        g ! , (       d  f       g = f)	Nr   r   Tr   z!Cannot set 'eps' when sparse=Truer   g|=)r   r   )ru   r   r
   toarrayr   r#   r$   r%   )r   r   r   C_sparses       r'   test_contingency_matrix_sparser   8  so    xxKLHxxKLH8.A!(TBJJLHa*	z)L	M85F 
N	M	Ms   8B
Bc                  D   [         R                  " SSS5      R                  [        5       H  n [         R                  " U [        S9[         R
                  " U [        S9p![        X5      [        R                  " S5      :X  d   e[        X5      [        R                  " S5      :X  d   e[        X5      S:X  d   e[        X5      [        R                  " S5      :X  d   eS H7  n[        XUS9S:X  d   e[        XUS9[        R                  " S5      :X  a  M7   e   M     g )Nr!   rk   r   rA   r+   rP   )ru   logspaceastypeintonesr   r   r#   rK   r   r   )r   r   r   r5   s       r'   test_exactly_zero_info_scorer   B  s    [[Aq!((- ggas3RYYq5L(+H?6==QTCUUUUx2fmmC6HHHH)(=DDD+H?6==QTCUUUU?F*8fU 06s#$ $ $ @ .rM   c           
         [         R                  " SSS5      R                  [        5       H  n[         R                  R                  U 5      nUR                  SSU5      UR                  SSU5      pC[        [        X45      S[        X45      -  [        U5      [        U5      -   -  S5        Sn[        [        X45      [        X4US95        M     g )Nr!   rk   r   r   rF   r.   rP   )ru   r   r   r   rv   rw   rx   r   r   r   r   r   )r   r   random_stater   r   avgs         r'   %test_v_measure_and_mutual_informationr   T  s    [[Aq!((-yy,,T2  B*  B*  	H/34!HX$668 	
 H/(CP	
 .rM   c                      [        / SQ/ SQ5      n [        U S[        R                  " S5      -  5        [        / SQ/ SQ5      n[        US5        [        / SQ/ SQ5      n[        US	5        g )
NrS   r[   g      @g      R@)r!   r!   r!   r   r   r   r;   )r   r   r   r   r   r   )r   r!   r*   r0   rk   r   rA   )r   r   ru   sqrt)scoreperfect_scoreworst_scores      r'   test_fowlkes_mallows_scorer   j  s\    !"46HIEsRWWZ%889 **<>PQMs+ ((:<NOKS)rM   c                  `   [         R                  " / SQ5      n [         R                  " / SQ5      nS[         R                  " S5      -  n[        X5      n[	        X25        [        X5      n[	        XB5        [        U S-   S-  U5      n[	        XR5        [        XS-   S-  5      n[	        Xb5        g )N)r   r   r   r!   r!   r*   )r!   r!   r*   r*   r   r   r;   g      (@r!   r0   r*   )ru   r   r   r   r   )r   r   r&   score_originalscore_symmetricscore_permuted
score_boths          r'   %test_fowlkes_mallows_score_propertiesr   x  s    xx*+Hxx*+HRWW677H +8>N1 ,H?O2 +HqLA+=xHN1 'xQ,!1CDJ
-rM   zlabels_true, labels_predr2      )r!   r!   r   r   r!   r!   r!   c                 &    [        X5      S:X  d   eg )Nr   )r   )labels_truelabels_preds     r'   .test_mutual_info_score_positive_constant_labelr     s     [6!;;;rM   c                     [         R                  R                  S5      n U R                  S5      n[         R                  " SSS5      S-  nSn[
        R                  " [        US9   [        X!5        S S S 5        g ! , (       d  f       g = f)Nr>   i  g{Gz?r!   gư>zuClustering metrics expects discrete values but received continuous values for label, and continuous values for targetr   )	ru   rv   rw   randlinspacer#   r   UserWarningr   )rngnoise
wavelengthmsgs       r'   test_check_clustering_errorr     sh    
))


#CHHSMET1c*T1J	  
k	-*, 
.	-	-s   'A<<
B
c                      Sn [        [        U 5      5      nUn[        R                  " X S-
  -  S/SS//5      n[	        [        X5      U5        g )Nr   r!   r   )r   r|   ru   r   r   r   Nclustering1clustering2r&   s       r'   *test_pair_confusion_matrix_fully_dispersedr     sK    AuQx.KKxx!1u+q)Aq623H,[FQrM   c                      Sn [         R                  " U 45      nUn[         R                  " SS/SX S-
  -  //5      n[        [	        X5      U5        g )Nr   r   r!   )ru   ry   r   r   r   r   s       r'   )test_pair_confusion_matrix_single_clusterr     sM    A((A4.KKxx!Q!Qa%[!123H,[FQrM   c                  X   Sn U S-  n[         R                  " [        U 5       Vs/ s H  o"S-   /U -  PM     sn5      n[         R                  " [        U 5       Vs/ s H  o"S-   /U S-   -  PM     sn5      S U n[         R                  " S[         R                  S9n[        [        U5      5       HW  n[        [        U5      5       H<  nX&:w  d  M
  [        X2   X6   :H  5      n[        XB   XF   :H  5      nXWU4==   S-  ss'   M>     MY     [        [        X45      U5        g s  snf s  snf )Nr   r*   r!   )r*   r*   )shaper   )	ru   hstackr|   ry   int64rz   r   r   r   )	nr   r   r   r   r&   r   same_cluster_1same_cluster_2s	            r'   test_pair_confusion_matrixr    s   
A	1A))%(;(Q!eWq[(;<K))aA1!eWA.AB2AFKxxfBHH5H3{#$s;'(Av!$[^{~%E!F!$[^{~%E!F78A=8	 ) % ,[FQ <As   D"D'zclustering1, clustering2r   )r   c                 .    [        [        X5      S5        g )Nr;   r   r   )r   r   s     r'   test_rand_score_edge_casesr    s     J{8#>rM   c                      / SQn / SQnSnSnSnSU-
  U-
  U-
  nXR-   nXT-   U-   U-   nXg-  n[        [        X5      U5        g )NrS   r^   rk      r*      r
  )	r   r   D11D10D01D00expected_numeratorexpected_denominatorr&   s	            r'   test_rand_scorer    s^    $K$K
C
C
C
#+
c
!C9s?S0!8HJ{8(CrM   c                  l   [         R                  R                  S5      n U R                  SSS[         R                  S9nU R                  SSS[         R                  S9n[
        R                  " 5          [
        R                  " S[        5        [        X5        SSS5        g! , (       d  f       g= f)zCheck that large amount of data will not lead to overflow in
`adjusted_rand_score`.
Non-regression test for:
https://github.com/scikit-learn/scikit-learn/issues/20305
r   r*   i r   errorN)
ru   rv   rw   rx   int8warningscatch_warningssimplefilterRuntimeWarningr   )r   y_truey_preds      r'   !test_adjusted_rand_score_overflowr    s|     ))


"C[[Awbgg[6F[[Awbgg[6F		 	 	"g~6F+ 
#	"	"s   5'B%%
B3)r,   r.   r-   r/   c                     S/S-  nS/USS -   nSS/USS -   n[        XU S9nUS:X  d   e[        X#U S9nSUs=::  a  S:  d   e   eg)zCheck that nmi returns a score between 0 (included) and 1 (excluded
for non-perfect match)

Non-regression test for issue #13836
r   i  r!   Nr*   rP   )r   )rN   labels1labels2labels3nmis        r'   )test_normalized_mutual_info_score_boundedr%    sq     cCiGcGABKG!fwqr{"G 'w
WC!8O8 'w
WC<a<<<rM   r   TFc                     [         R                  " [        SS9   [        SS/SS/U S9  SSS5        g! , (       d  f       g= f)zJCheck deprecation warning for 'sparse' parameter of fowlkes_mallows_score.z,The 'sparse' parameter was deprecated in 1.7r   r   r!   r   N)r#   r   r   r   r   s    r'   &test_fowlkes_mallows_sparse_deprecatedr'    s<     
K
 	q!fq!fV<
 
 
s	   3
A)r   r>   )$   )Lr  numpyru   r#   numpy.testingr   r   r   sklearn.baser   sklearn.metrics.clusterr   r   r	   r
   r   r   r   r   r   r   r   r   r   #sklearn.metrics.cluster._supervisedr   r   r   r   sklearn.utilsr   sklearn.utils._array_apir   r   sklearn.utils._testingr   r   score_funcsmarkparametrizer(   r9   rL   rQ   rX   r\   rb   ri   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r|   ry   r  r  r  r%  r'  r   rM   r'   <module>r4     s      X X '     , M   {30 408 {3C 4C $" )+TU V6$$$&('.	K&>H36
' )-/'  
)
)+G$$
,*.. 
&'
q$%	cUQY'	aS1W%
SEAI	<	<-RRR" 
5:U3Z()BHHV,<bhhv>N+OP?	?D , )+TU V( D%=1= 2=rM   