
    0PhH              
          d dl Z d dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZ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" eeeeeeegZ#d	 Z$d
 Z%d Z&d Z'd Z(d Z)d Z*d Z+d5dZ,d Z-d Z.d Z/d Z0d Z1ej2        3                    d e                      d             Z4d Z5d Z6d Z7d6dZ8d  Z9d! Z:ej2        3                    d"d#gd$z  g d%fd&gd$z  g d%fg d%d#gd$z  fg d%d&gd$z  fd#gd$z  d#gd$z  fg          d'             Z;d( Z<d) Z=d* Z>d+ Z?ej2        3                    d, e@ eAd-                     e@ eAd-                    f ejB        d.           ejB        d.          fg          d/             ZCd0 ZDd1 ZEej2        3                    d2g d3          d4             ZFdS )7    N)assert_allcloseassert_array_almost_equalassert_array_equal)config_context)adjusted_mutual_info_scoreadjusted_rand_scorecompleteness_scorecontingency_matrixentropy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)_generalized_averagecheck_clusterings)assert_all_finite))yield_namespace_device_dtype_combinations)_array_api_for_testsassert_almost_equalc                     t           D ]} d}t          j        t          |          5   | ddgg d           d d d            n# 1 swxY w Y   d}t          j        t          |          5   | ddgddggg d           d d d            n# 1 swxY w Y   d}t          j        t          |          5   | g dddgddgg           d d d            n# 1 swxY w Y   d S )	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   )score_funcspytestraises
ValueError)
score_funcexpecteds     m/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/metrics/cluster/tests/test_supervised.py"test_error_messages_on_wrong_inputr'   (   s   ! 4 4
W 	 ]:X666 	* 	*J1vyyy)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* ;]:X666 	4 	4JAA'333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 ;]:X666 	4 	4JyyyAq6Aq6"2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	44 4s5   AA	A	,BB	B	5CC	C	c                  &   d\  g d} fd| D             }|d         |d         cxk    r|d         cxk    r|d         k    sn J d\  fd	| D             }|d         |d         cxk    r|d         cxk    r|d         k    sn J d S )
N)r      min	geometric
arithmeticmaxc                 2    g | ]}t          |          S  r   ).0methodabs     r&   
<listcomp>z,test_generalized_average.<locals>.<listcomp><   &    FFFF!!Q//FFF    r   r   r)      )   r:   c                 2    g | ]}t          |          S r0   r1   )r2   r3   cds     r&   r6   z,test_generalized_average.<locals>.<listcomp>?   r7   r8   r0   )methodsmeansr4   r5   r<   r=   s     @@@@r&   test_generalized_averager@   9   s    DAq777GFFFFFgFFFE8uQx7777587777uQx777777DAqFFFFFgFFFE8uQx7777587777uQx77777777r8   c                     t           D ]}  | g g           t          j        d          k    sJ  | dgdg          t          j        d          k    sJ  | g dg d          t          j        d          k    sJ  | g dg d          t          j        d          k    sJ  | g dg d          t          j        d          k    sJ  | g d	g d
          t          j        d          k    sJ  | g dg d          t          j        d          k    sJ t          t          g}h d}|D ]*} |D ]#} | g g |          t          j        d          k    sJ  | dgdg|          t          j        d          k    sJ  | g dg d|          t          j        d          k    sJ  | g dg d|          t          j        d          k    sJ  | g dg d|          t          j        d          k    sJ  | g d	g d
|          t          j        d          k    sJ  | g dg d|          t          j        d          k    sJ %,d S )N      ?r   r   )r   r   r   r   )*      rC   )        rB   rE   )      E@      @rF   )rE   rB          @)rF   rG   rH   )r   r   r)   )rC   rD   r)   >   r.   r+   r,   r-   average_method)r    r!   approxr   r   )r$   score_funcs_with_changing_meansr?   means       r&   test_perfect_matchesrN   C   sd   ! G G
z"b!!V]3%7%77777z1#s##v}S'9'99999z)))YYY//6=3E3EEEEEz)))[[[11V]35G5GGGGGz///+<+<+<==sASASSSSSz///+;+;+;<<c@R@RRRRRz)))ZZZ00FM#4F4FFFFFF$"'# 655E5 $ $
 	$ 	$D:b"T:::fmC>P>PPPPP:qcA3t<<<c@R@RRRRR:		999T  s##$ $ $ $ :		;;;t  s##$ $ $ $ :!2!2!24  s##$ $ $ $ :!1!1!1$  s##$ $ $ $ :		:::d  s##$ $ $ $ $	$$ $r8   c                      t          g dg d          \  } }}t          | dd           t          |dd           t          |dd           d S )Nr   r   r   r   r   r   )r   r   r   r   r)   r)   rB   r)   gGz?gQ?r   r   hr<   vs      r&   *test_homogeneous_but_not_complete_labelingrU   f   a    01C1C1CEWEWEWXXGAq!4###4###4#####r8   c                      t          g dg d          \  } }}t          | dd           t          |dd           t          |dd           d S )Nr   r   r   r   r)   r)   )r   r   r   r   r   r   g(\?r)   rB   g\(\?rQ   rR   s      r&   *test_complete_but_not_homogeneous_labelingrY   n   rV   r8   c                      t          g dg d          \  } }}t          | dd           t          |dd           t          |dd           d S )NrP   r   r   r   r   r)   r)   q=
ףp?r)   zG?p=
ף?rQ   rR   s      r&   .test_not_complete_and_not_homogeneous_labelingr_   v   rV   r8   c                  "   d} d}d}d| z   |z  |z  | |z  |z   z  }t          g dg d|           \  }}}t          ||d           t          ||d           t          ||d           t          g dg d|           }t          ||d           d S )	Ng?r\   r]   r   rP   r[   )betar)   )r   r   r   )	beta_testh_testc_testv_testrS   r<   rT   s          r&   test_beta_parameterrf   ~   s     IFF)mv%.)f2Dv2MNF0...Y  GAq! 61%%%61%%%61%%%***,>,>,>YOOOA61%%%%%r8   c                  Z   t          g dg d          \  } }}t          | dd           t          |dd           t          |dd           t          g dg d          \  } }}t          | dd           t          |dd           t          |dd           t          g dg d          }t          g dg d          }t          |d	d           t          |d	d           t          g dg d          }t          g dg d          }t          |d
d           t          |d
d           d S )N)r   r   r   r)   r)   r)   r[   r\   r)   r]   r^   rP   )r      r   rh   r)   r)   gQ?gQ?)r   r   r   r   )rS   r<   rT   ari_1ari_2ri_1ri_2s          r&   test_non_consecutive_labelsrm      sv   01C1C1CEWEWEWXXGAq!4###4###4###01C1C1CEWEWEWXXGAq!4###4###4### 2 2 24F4F4FGGE 2 2 24F4F4FGGEtQ'''tQ'''(((*<*<*<==D(((*<*<*<==DdA&&&dA&&&&&r8   
   rC   c                 <   t           j                            |          j        }t          j        t          |          |f          }t          |          D ]D\  }}t          |          D ]/}	 |d||          }
 |d||          } | |
|          |||	f<   0E|S )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    I))$//7MXs7||V,--F'"" : :1v 	: 	:A$}CCCH$}CCCH%:h99F1a4LL	: Mr8   c                      g d} d}d}t          t          || |          }t          j        |                              d          }t          |g dd           d S )N)r)   rn   2   Z   d   rn   r   )axis){Gz?Q?r   r   r)   )r   r   rs   absr.   r   )n_clusters_ranger{   r}   r   max_abs_scoress        r&   test_adjustment_for_chancer      sn    &IF%Y(8& F VF^^''Q'//Nn.F.F.FJJJJJr8   c                     t          j        g d          } t          j        g d          }t          | |          }t          |dd           t	          | |d          }t          | ||          }t          |dd           t	          | |          }t          | ||          }t          |dd           |                                }t          ||          }t          |dd           t          | |          }t          |d	d           t          g d
g d          }|t          j	        d          k    sJ t          j        t          |           dz  g                                          }t          j        t          |          dz  g                                          }t          ||          }t          |dd           d S )Nr   r   r   r   r   r   r)   r)   r)   r)   r)   r)   r9   r9   r9   r9   r9   r   r   r   r   r)   r   r)   r)   r)   r)   r9   r   r9   r9   r9   r)   r)   gS
cA?   Tsparse)contingencygpUj@?gP1?)r   r   r)   r)   )r)   r)   r9   r9   rB   n   gRQ?r)   )rs   arrayr   r   r
   sumr   r   r!   rK   listflatten)	r   r   miCr{   emiamia110b110s	            r&   test_adjusted_mutual_info_scorer      s   xKKKLLHxKKKLLH	8X	.	.BGQ'''8Xd;;;A	8X1	=	=	=BGQ'''8X..A	8X1	=	=	=BGQ'''I
%a
3
3CWa(((
$Xx
8
8CWa(((
$\\\<<<
@
@C&-$$$$$$8T(^^c)*++3355D8T(^^c)*++3355D
$T4
0
0CT1%%%%%r8   c                  Z    t          t          j        dgg          d          dk    sJ d S )Nip r   )r   rs   r   r0   r8   r&   "test_expected_mutual_info_overflowr      s3     'rx%	':':EBBaGGGGGGr8   c                     t          j        dgdz  dgdz  z   dgdz  z   dgdz  z   d	gd
z  z             } t          j        dgdz  dgdz  z   dgdz  z   dgdz  z   dgdz  z   dgdz  z   dgdz  z   dgdz  z   dgdz  z   dgdz  z             }t          t          | |                     t          t	          | |                     d S )Nr   iy  r)   i]<  r9   i  rh   iU  r   iP  r   i  i	  iD9  i  i     i.  '   i<     )rs   r   r   r   r   )xys     r&   3test_int_overflow_mutual_info_fowlkes_mallows_scorer      s?   
	
|#
	#
	 #
	 #
			 	A 		
e#*	#+	 #)	 #*		
 #)	 #)	 #(	 #)	 #(			 	A '1--...+Aq1122222r8   c                      t          t          g d          dd           t          t          g           d           t          g d          dk    sJ d S )Nr   r   rF   ,^R^?r   r   r   r   r   r   r   )r   r   r0   r8   r&   test_entropyr     sY    --y!<<<Q'''<<<  A%%%%%%r8   z#array_namespace, device, dtype_namec                    t          | |          }|                    t          j        g d|          |          }|                    g |j        |          }|                    g d|          }t	          d          5  t          |          t          j        dd	
          k    sJ t          |          dk    sJ t          |          dk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   dtype)device)r   r   r   T)array_api_dispatchr   gh㈵>)r   r   r   )r   asarrayrs   int32r   r   r!   rK   )array_namespacer   
dtype_namexpfloat_labelsempty_int32_labels
int_labelss          r&   test_entropy_array_apir     sB    
ov	6	6B::bjZHHHQW:XXLBbhvFFLLL88J	4	0	0	0 ( (|$$iT(J(J(JJJJJ)**a////z""a'''''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   AC&&C*-C*c            	      r   t          j        g d          } t          j        g d          }t          | |          }t          j        | |t          j        dd          t          j        dd          f          d         }t          ||           t          | |d          }t          ||dz              d S )	Nr   r   r   r   )binsr   g?)eps)rs   r   r
   histogram2daranger   )r   r   r   C2s       r&   test_contingency_matrixr     s    xKKKLLHxKKKLLH8X..A	(")Aq//29QPQ??1S	T	T	TUV	WBa$$$8X3777Aac*****r8   c                  t   t          j        g d          } t          j        g d          }t          | |          }t          | |d                                          }t	          ||           t          j        t          d          5  t          | |dd           d d d            d S # 1 swxY w Y   d S )	Nr   r   Tr   z!Cannot set 'eps' when sparse=Truer   g|=)r   r   )rs   r   r
   toarrayr   r!   r"   r#   )r   r   r   C_sparses       r&   test_contingency_matrix_sparser      s   xKKKLLHxKKKLLH8X..A!(HTBBBJJLLHa***	z)L	M	M	M G G8X5FFFFG G G G G G G G G G G G G G G G G Gs   B--B14B1c                     t          j        ddd                              t                    D ]2} t          j        | t                    t          j        | t                    }}t          ||          t          j        d          k    sJ t          ||          t          j        d          k    sJ t          ||          t          j        d          k    sJ t          ||          t          j        d          k    sJ dD ]V}t          |||          t          j        d          k    sJ t          |||          t          j        d          k    sJ W4d S )Nr   rh   r   rE   r*   rI   )rs   logspaceastypeintonesr   r   r!   rK   r   r   )r   r   r   r3   s       r&   test_exactly_zero_info_scorer   *  s   [Aq!!((-- $ $ gas333RYq5L5L5L(+Hh??6=QTCUCUUUUUx22fmC6H6HHHHH)(H==sASASSSSS+Hh??6=QTCUCUUUUU? 	$ 	$F-(6  s##$ $ $ $ 0(6  s##$ $ $ $ $		$$ $r8   $   c           	         t          j        ddd                              t                    D ]}t           j                            |           }|                    dd|          |                    dd|          }}t          t          ||          dt          ||          z  t          |          t          |          z   z  d           d}t          t          ||          t          |||                     d S )Nr   rh   r   rn   rH   r-   rI   )rs   r   r   r   rt   ru   rv   r   r   r   r   r   )r~   r   random_stater   r   avgs         r&   %test_v_measure_and_mutual_informationr   ;  s   [Aq!!((-- 
 
y,,T22  B**  B**  	Hh//(334x  78#4#446 	
 	
 	
 Hh//(8CPPP	
 	
 	
 	

 
r8   c                     t          g dg d          } t          | dt          j        d          z             t          g dg d          }t          |d           t          g dg d          }t          |d	           d S )
NrP   rX   g      @g      R@)r   r   r   r   r   r   rB   )r   r   r   r   r   r   )r   r   r)   r9   rh   r   rE   )r   r   rs   sqrt)scoreperfect_scoreworst_scores      r&   test_fowlkes_mallows_scorer   Q  s    !"4"4"46H6H6HIIEsRWZ%8%88999 **<*<*<>P>P>PQQMs+++ ((:(:(:<N<N<NOOKS)))))r8   c                     t          j        g d          } t          j        g d          }dt          j        d          z  }t          | |          }t	          ||           t          ||           }t	          ||           t          | dz   dz  |          }t	          ||           t          || dz   dz            }t	          ||           d S )N)r   r   r   r   r   r)   )r   r   r)   r)   r   r   rB   g      (@r   r9   r)   )rs   r   r   r   r   )r   r   r%   score_originalscore_symmetricscore_permuted
score_boths          r&   %test_fowlkes_mallows_score_propertiesr   _  s    x***++Hx***++HRW6777H +8X>>N111 ,Hh??O222 +HqLA+=xHHN111 'x(Q,!1CDDJ
H-----r8   zlabels_true, labels_predr4      )r   r   r   r   r   r   r   c                 2    t          | |          dk    sJ d S )Nr   )r   )labels_truelabels_preds     r&   .test_mutual_info_score_positive_constant_labelr   v  s%     [+66!;;;;;;r8   c                  ,   t           j                            d          } |                     d          }t          j        ddd          dz  }d}t          j        t          |          5  t          ||           d d d            d S # 1 swxY w Y   d S )NrC   i  g{Gz?r   gư>zuClustering metrics expects discrete values but received continuous values for label, and continuous values for targetr   )	rs   rt   ru   randlinspacer!   warnsUserWarningr   )rngnoise
wavelengthmsgs       r&   test_check_clustering_errorr     s    
)


#
#CHHSMMET1c**T1J	  
k	-	-	- - -*e,,,- - - - - - - - - - - - - - - - - -s   +B		BBc                      d} t          t          |                     }|}t          j        | | dz
  z  dgddgg          }t	          t          ||          |           d S )Nr   r   r   )r   rz   rs   r   r   r   Nclustering1clustering2r%   s       r&   *test_pair_confusion_matrix_fully_dispersedr     sc    AuQxx..KKx!q1u+q)Aq6233H,[+FFQQQQQr8   c                      d} t          j        | f          }|}t          j        ddgd| | dz
  z  gg          }t          t	          ||          |           d S )Nr   r   r   )rs   rw   r   r   r   r   s       r&   )test_pair_confusion_matrix_single_clusterr     sa    A(A4..KKx!Q!Q!a%[!1233H,[+FFQQQQQr8   c                  ~   ddz  } t          j        fdt                    D                       }t          j        fdt                    D                       d |          }t          j        dt           j                  }t          t          |                    D ]w}t          t          |                    D ]X}||k    rPt          ||         ||         k              }t          ||         ||         k              }|||fxx         dz  cc<   Yxt          t          ||          |           d S )Nrn   r)   c                 "    g | ]}|d z   gz  S r   r0   r2   r   ns     r&   r6   z.test_pair_confusion_matrix.<locals>.<listcomp>  s#    ;;;Qa!eWq[;;;r8   c                 (    g | ]}|d z   gd z   z  S r   r0   r   s     r&   r6   z.test_pair_confusion_matrix.<locals>.<listcomp>  s(    AAA1a!eWA.AAAr8   )r)   r)   )shaper   r   )	rs   hstackrz   rw   int64rx   r   r   r   )	r   r   r   r%   r   r   same_cluster_1same_cluster_2r   s	           @r&   test_pair_confusion_matrixr    sI   
A	1A);;;;%((;;;<<K)AAAAaAAABB2A2FKxfBH555H3{##$$ > >s;''(( 	> 	>AAvv!$[^{1~%E!F!F!$[^{1~%E!F!F7888A=888		>
 ,[+FFQQQQQr8   zclustering1, clustering2r   )r   c                 B    t          t          | |          d           d S )NrB   r   r   )r   r   s     r&   test_rand_score_edge_casesr    s$     J{K88#>>>>>r8   c                      g d} g d}d}d}d}d|z
  |z
  |z
  }||z   }||z   |z   |z   }||z  }t          t          | |          |           d S )NrP   r[   rh      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s9s?S0!$88HJ{K88(CCCCCr8   c                  |   t           j                            d          } |                     dddt           j                  }|                     dddt           j                  }t          j                    5  t          j        dt                     t          ||           ddd           dS # 1 swxY w Y   dS )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)
rs   rt   ru   rv   int8warningscatch_warningssimplefilterRuntimeWarningr   )r   y_truey_preds      r&   !test_adjusted_rand_score_overflowr    s     )


"
"C[[Awbg[66F[[Awbg[66F		 	"	" , ,g~666FF+++, , , , , , , , , , , , , , , , , ,s   9+B11B58B5rJ   )r+   r-   r,   r.   c                     dgdz  }dg|dd         z   }ddg|dd         z   }t          |||           }|dk    sJ t          |||           }d|cxk    rdk     sn J dS )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)   rI   )r   )rJ   labels1labels2labels3nmis        r&   )test_normalized_mutual_info_score_boundedr"    s     cCiGcGABBKG!fwqrr{"G 'w
W
W
WC!8888 'w
W
W
WC<<<<a<<<<<<<<r8   )rn   rC   )r   )Gr  numpyrs   r!   numpy.testingr   r   r   sklearn.baser   sklearn.metrics.clusterr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   #sklearn.metrics.cluster._supervisedr   r   sklearn.utilsr   sklearn.utils._array_apir   sklearn.utils._testingr   r   r    r'   r@   rN   rU   rY   r_   rf   rm   r   r   r   r   r   r   markparametrizer   r   r   r   r   r   r   r   r   r   r   r  r   rz   rw   r  r  r  r"  r0   r8   r&   <module>r-     s         X X X X X X X X X X ' ' ' ' ' '                                 X W W W W W W W + + + + + + N N N N N N L L L L L L L L  4 4 4"8 8 8 $  $  $F$ $ $$ $ $$ $ $& & &(' ' '.	 	 	 	K K K& & &>H H H3 3 34& & & )+T+T+V+V ( ( (+ + +G G G$ $ $"
 
 
 
,* * *. . .. 
&&&'
q$$$%			cUQY'			aS1W%
SEAI	 	< <	 	<- - -R R RR R RR R R" 
d55::UU3ZZ(()HBHV,<,<hbhv>N>N+OP ? ?	 ?D D D , , , )+T+T+TUU  VU  r8   