
    UgE              
          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	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 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&d1dZ'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d2dZ0d Z1d Z2ej3        4                    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#             Z5d$ Z6d% Z7d& Z8d' Z9ej3        4                    d( e: e;d)                     e: e;d)                    f ej<        d*           ej<        d*          fg          d+             Z=d, Z>d- Z?ej3        4                    d.g d/          d0             Z@dS )3    N)assert_allcloseassert_array_almost_equalassert_array_equal)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)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     l/var/www/surfInsights/venv3-11/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&      )   r7   c                 2    g | ]}t          |          S r-   r.   )r/   r0   cds     r#   r3   z,test_generalized_average.<locals>.<listcomp>=   r4   r5   r-   )methodsmeansr1   r2   r9   r:   s     @@@@r#   test_generalized_averager=   7   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7r5   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   )*      r@   )        r?   rB   )      E@      @rC   )rB   r?          @)rC   rD   rE   )r   r   r&   )r@   rA   r&   >   r+   r(   r)   r*   average_method)r   r   approxr   r   )r!   score_funcs_with_changing_meansr<   means       r#   test_perfect_matchesrK   A   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##$ $ $ $ $	$$ $r5   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&   r?   r&   gGz?gQ?r   r   hr9   vs      r#   *test_homogeneous_but_not_complete_labelingrR   d   a    01C1C1CEWEWEWXXGAq!4###4###4#####r5   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&   r?   g\(\?rN   rO   s      r#   *test_complete_but_not_homogeneous_labelingrV   l   rS   r5   c                      t          g dg d          \  } }}t          | dd           t          |dd           t          |dd           d S )NrM   r   r   r   r   r&   r&   q=
ףp?r&   zG?p=
ף?rN   rO   s      r#   .test_not_complete_and_not_homogeneous_labelingr\   t   rS   r5   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?rY   rZ   r   rM   rX   )betar&   )r   r   r   )	beta_testh_testc_testv_testrP   r9   rQ   s          r#   test_beta_parameterrc   |   s     IFF)mv%.)f2Dv2MNF0...Y  GAq! 61%%%61%%%61%%%***,>,>,>YOOOA61%%%%%r5   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&   rX   rY   r&   rZ   r[   rM   )r      r   re   r&   r&   gQ?gQ?)r   r   r   r   )rP   r9   rQ   ari_1ari_2ri_1ri_2s          r#   test_non_consecutive_labelsrj      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&&&&&r5   
   r@   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	: Mr5   c                      g d} d}d}t          t          || |          }t          j        |                              d          }t          |g dd           d S )N)r&   rk   2   Z   d   rk   r   )axis){Gz?Q?r   r   r&   )r   r   rp   absr+   r   )n_clusters_rangerx   rz   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Jr5   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&   r6   r6   r6   r6   r6   r   r   r   r   r&   r   r&   r&   r&   r&   r6   r   r6   r6   r6   r&   r&   gS
cA?   Tsparse)contingencygpUj@?gP1?)r   r   r&   r&   )r&   r&   r6   r6   r?   n   gRQ?r&   )rp   arrayr   r   r	   sumr   r   r   rH   listflatten)	r   r   miCrx   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%%%%%r5   c                  Z    t          t          j        dgg          d          dk    sJ d S )Nip r   )r   rp   r   r-   r5   r#   "test_expected_mutual_info_overflowr      s3     'rx%	':':EBBaGGGGGGr5   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]<  r6   i  re   iU  r   iP  r   i  i	  iD9  i  i     i.  '   i<     )rp   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2r5   c                      t          g d          } t          | dd           t          t          g           d           t          g d          dk    sJ d S )N)r   r   rC   g,^R^?r   r   )r   r   r   r   r   )r
   r   )ents    r#   test_entropyr      s^    
,,,

CY***Q'''<<<  A%%%%%%r5   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)rp   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*****r5   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   )rp   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   re   dtyperB   r'   rF   )rp   logspaceastypeintonesr   r   r   rH   r   r   )r~   r   r   r0   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##$ $ $ $ $		$$ $r5   $   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   re   r   rk   rE   r*   rF   )rp   r   r   r   rq   rr   rs   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	
 	
 	
 	

 
r5   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 )
NrM   rU   g      @g      R@)r   r   r   r   r   r   r?   )r   r   r   r   r   r   )r   r   r&   r6   re   r   rB   )r   r   rp   sqrt)scoreperfect_scoreworst_scores      r#   test_fowlkes_mallows_scorer   B  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)))))r5   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   r?   g      (@r   r6   r&   )rp   r   r   r   r   )r   r   r"   score_originalscore_symmetricscore_permuted
score_boths          r#   %test_fowlkes_mallows_score_propertiesr   P  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-----r5   zlabels_true, labels_predr1      )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   g  s%     [+66!;;;;;;r5   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 )Nr@   i  g{Gz?r   gư>zuClustering metrics expects discrete values but received continuous values for label, and continuous values for targetr   )	rp   rq   rr   randlinspacer   warnsUserWarningr   )rngnoise
wavelengthmsgs       r#   test_check_clustering_errorr   w  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   rw   rp   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Qr5   c                      d} t          j        | f          }|}t          j        ddgd| | dz
  z  gg          }t          t	          ||          |           d S )Nr   r   r   )rp   rt   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Qr5   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 )Nrk   r&   c                 "    g | ]}|d z   gz  S r   r-   r/   r~   ns     r#   r3   z.test_pair_confusion_matrix.<locals>.<listcomp>  s#    ;;;Qa!eWq[;;;r5   c                 (    g | ]}|d z   gd z   z  S r   r-   r   s     r#   r3   z.test_pair_confusion_matrix.<locals>.<listcomp>  s(    AAA1a!eWA.AAAr5   )r&   r&   )shaper   r   )	rp   hstackrw   rt   int64ru   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Qr5   zclustering1, clustering2r   )r   c                 B    t          t          | |          d           d S )Nr?   r   r   )r   r   s     r#   test_rand_score_edge_casesr     s$     J{K88#>>>>>r5   c                      g d} g d}d}d}d}d|z
  |z
  |z
  }||z   }||z   |z   |z   }||z  }t          t          | |          |           d S )NrM   rX   re      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Cr5   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)
rp   rq   rr   rs   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rG   )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&   rF   )r   )rG   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<<<<<<<<r5   )rk   r@   )r   )Ar  numpyrp   r   numpy.testingr   r   r   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._testingr   r   r$   r=   rK   rR   rV   r\   rc   rj   r   r   r   r   r   r   r   r   r   r   r   r   markparametrizer   r   r   r   r   r   rw   rt   r   r  r  r  r-   r5   r#   <module>r     sD         X X X X X X X X X X                                 X W W W W W W W + + + + + + 6 6 6 6 6 6  4 4 4"8 8 8 $  $  $F$ $ $$ $ $$ $ $& & &(' ' '.	 	 	 	K K K& & &>H H H3 3 34& & &+ + +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  r5   