
    {KgE              
          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&d.dZ'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d/dZ0d Z1d Z2ejf                  ji                  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jf                  ji                  d% e: e;d&             e: e;d&            f ejx                  d'       ejx                  d'      fg      d(        Z=d) Z>d* Z?ejf                  ji                  d+g d,      d-        Z@y)0    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        d}t        j                  t        |      5   | ddgddggg d       d d d        d}t        j                  t        |      5   | g dddgddgg       d d d         y # 1 sw Y   zxY w# 1 sw Y   OxY w# 1 sw Y   xY w)	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     q/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/metrics/cluster/tests/test_supervised.py"test_error_messages_on_wrong_inputr$   &   s    !
W 	 ]]:X61vy) 7 ;]]:X6AA'3 7 ;]]:X6yAq6Aq6"23 76 " 76 76 76s#   B.B:C.B7	:C	C	c                  $   d\  } }g d}|D cg c]  }t        | ||       }}|d   |d   cxk  r|d   cxk  r	|d   k  sJ  J d\  }}|D cg c]  }t        |||       }}|d   |d   cxk(  r|d   cxk(  r	|d   k(  sJ  J y c c}w c c}w )N)r      min	geometric
arithmeticmaxr   r   r&      )   r-   )r   )abmethodsmethodmeanscds          r#   test_generalized_averager5   7   s    DAq7G>EFgF!!Q/gEF8uQx7587uQx77777DAq>EFgF!!Q/gEF8uQx7587uQx77777	 G Gs   BBc                  n   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(  r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(  rJ   y )N      ?r   r   )r   r   r   r   )*      r8   )        r7   r:   )      E@      @r;   )r:   r7          @)r;   r<   r=   )r   r   r&   )r8   r9   r&   >   r+   r(   r)   r*   average_method)r   r   approxr   r   )r!   score_funcs_with_changing_meansr2   means       r#   test_perfect_matchesrC   A   s/   !
"b!V]]3%77771#s#v}}S'9999)Y/6==3EEEE)[1V]]35GGGG/+<=sASSSS/+;<c@RRRR)Z0FMM#4FFFF " 	%"'# 6E5
Db"T:fmmC>PPPPqcA3t<c@RRRR9Ts#$ $ $ ;ts#$ $ $ !24s#$ $ $ !1$s#$ $ $ :ds#$ $ $  6    c                  z    t        g dg d      \  } }}t        | dd       t        |dd       t        |dd       y )Nr   r   r   r   r   r   )r   r   r   r   r&   r&   r7   r&   gGz?gQ?r   r   hr3   vs      r#   *test_homogeneous_but_not_complete_labelingrK   d   :    01CEWXGAq!4#4#4#rD   c                  z    t        g dg d      \  } }}t        | dd       t        |dd       t        |dd       y )Nr   r   r   r   r&   r&   )r   r   r   r   r   r   g(\?r&   r7   g\(\?rG   rH   s      r#   *test_complete_but_not_homogeneous_labelingrO   l   rL   rD   c                  z    t        g dg d      \  } }}t        | dd       t        |dd       t        |dd       y )NrF   r   r   r   r   r&   r&   q=
ףp?r&   zG?p=
ף?rG   rH   s      r#   .test_not_complete_and_not_homogeneous_labelingrU   t   rL   rD   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       y )	Ng?rR   rS   r   rF   rQ   )betar&   )r   r   r   )	beta_testh_testc_testv_testrI   r3   rJ   s          r#   test_beta_parameterr\   |   s     IFF)mv%.)f2Dv2MNF0.YGAq! 61%61%61%*,>YOA61%rD   c                     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       y )N)r   r   r   r&   r&   r&   rQ   rR   r&   rS   rT   rF   )r      r   r^   r&   r&   gQ?gQ?)r   r   r   r   )rI   r3   rJ   ari_1ari_2ri_1ri_2s          r#   test_non_consecutive_labelsrc      s    01CEWXGAq!4#4#4#01CEWXGAq!4#4#4# 24FGE 24FGEtQ'tQ'(*<=D(*<=DdA&dA&rD   c                 &   t         j                  j                  |      j                  }t        j                  t        |      |f      }t        |      D ]9  \  }}t        |      D ]&  }	 |d||      }
 |d||      } | |
|      |||	f<   ( ; |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    II))$/77MXXs7|V,-F'"1vA$CH$CH%h9F1a4L  #
 MrD   c                      g d} d}d}t        t        || |      }t        j                  |      j	                  d      }t        |g dd       y )N)r&   
   2   Z   d   r}   r   )axis){Gz?Q?r   r   r&   )r{   r   rh   absr+   r   )n_clusters_rangerp   rr   ru   max_abs_scoress        r#   test_adjustment_for_chancer      sP    &IF%Y(8&F VVF^''Q'/Nn.FJrD   c                     t        j                  g d      } t        j                  g d      }t        | |      }t        |dd       t	        | |d      }t        | ||      }t        |dd       t	        | |      }t        | ||      }t        |dd       |j                         }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      j                         }t        j                  t        |      dz  g      j                         }t        ||      }t        |dd       y )N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,   r   r,   r,   r,   r&   r&   gS
cA?   Tsparse)contingencygpUj@?gP1?)r   r   r&   r&   )r&   r&   r,   r,   r7   n   gRQ?r&   )rh   arrayr   r   r	   sumr   r   r   r@   listflatten)	ry   rz   miCrp   emiamia110b110s	            r#   test_adjusted_mutual_info_scorer      sB   xxKLHxxKLH	8X	.BGQ'8Xd;A	8X1	=BGQ'8X.A	8X1	=BGQ'I
%a
3CWa(
$Xx
8CWa(
$\<
@C&--$$$$88T(^c)*+335D88T(^c)*+335D
$T4
0CT1%rD   c                  P    t        t        j                  dgg      d      dk  sJ y )Nip r   )r   rh   r    rD   r#   "test_expected_mutual_info_overflowr      s&     'rxx%	':EBaGGGrD   c                  r   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	        | |             y )Nr   iy  r&   i]<  r,   i  r^   iU  r   iP  r   i  i	  iD9  i  i     i.  '   i<     )rh   r   r   r   r   )xys     r#   3test_int_overflow_mutual_info_fowlkes_mallows_scorer      s!   
	
|#
	#
	 #
	 #
			A 		
e#*	#+	 #)	 #*		
 #)	 #)	 #(	 #)	 #(			A '1-.+Aq12rD   c                      t        g d      } t        | dd       t        t        g       d       t        g d      dk(  sJ y )N)r   r   r;   g,^R^?r   r   )r   r   r   r   r   )r
   r   )ents    r#   test_entropyr      s9    
,
CY*Q'< A%%%rD   c            	      T   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          y )	Nr   r   r   r   )binsr   g?)eps)rh   r   r	   histogram2daranger   )ry   rz   r   C2s       r#   test_contingency_matrixr     s    xxKLHxxKLH8X.A	("))Aq/299QPQ?1S	TUV	WBa$8X37Aac*rD   c                  F   t        j                  g d      } t        j                  g d      }t        | |      }t        | |d      j                         }t	        ||       t        j                  t        d      5  t        | |dd       d d d        y # 1 sw Y   y xY w)	Nr   r   Tr   z!Cannot set 'eps' when sparse=Truer   g|=)r   r   )rh   r   r	   toarrayr   r   r   r    )ry   rz   r   C_sparses       r#   test_contingency_matrix_sparser     sw    xxKLHxxKLH8X.A!(HTBJJLHa*	z)L	M8X5F 
N	M	Ms   >BB c                     t        j                  ddd      j                  t              D ]  } 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 ]N  }t        |||      t        j                  d      k(  sJ t        |||      t        j                  d      k(  rNJ   y )Nr   r^   dtyper:   r'   r>   )rh   logspaceastypeintonesr   r   r   r@   r   r   )rv   ry   rz   r1   s       r#   test_exactly_zero_info_scorer     s   [[Aq!((- ggas3RYYq5L(+Hh?6==QTCUUUUx2fmmC6HHHH)(H=sASSSS+Hh?6==QTCUUUU?F-(6s#$ $ $ 0(6s#$ $ $	 @ .rD   c           	         t        j                  ddd      j                  t              D ]  }t         j                  j                  |       }|j                  dd|      |j                  dd|      }}t        t        ||      dt        ||      z  t        |      t        |      z   z  d       d}t        t        ||      t        |||              y )Nr   r^   r   r}   r=   r*   r>   )rh   r   r   r   ri   rj   rk   r   r   r   r
   r   )rs   rv   random_statery   rz   avgs         r#   %test_v_measure_and_mutual_informationr   ,  s    [[Aq!((-yy,,T2  B*  B*  	Hh/(34x 78#446 	
 Hh/(8CP	
 .rD   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	       y )
NrF   rN   g      @g      R@)r   r   r   r   r   r   r7   )r   r   r   r   r   r   )r   r   r&   r,   r^   r   r:   )r   r   rh   sqrt)scoreperfect_scoreworst_scores      r#   test_fowlkes_mallows_scorer   B  s\    !"46HIEsRWWZ%889 **<>PQMs+ ((:<NOKS)rD   c                  h   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	        ||       y )N)r   r   r   r   r   r&   )r   r   r&   r&   r   r   r7   g      (@r   r,   r&   )rh   r   r   r   r   )ry   rz   r"   score_originalscore_symmetricscore_permuted
score_boths          r#   %test_fowlkes_mallows_score_propertiesr   P  s    xx*+Hxx*+HRWW677H +8X>N1 ,Hh?O2 +HqLA+=xHN1 'x(Q,!1CDJ
H-rD   zlabels_true, labels_predr.      )r   r   r   r   r   r   r   c                 &    t        | |      dk(  sJ y )Nr   )r   )labels_truelabels_preds     r#   .test_mutual_info_score_positive_constant_labelr   g  s     [+6!;;;rD   c                     t         j                  j                  d      } | j                  d      }t        j                  ddd      dz  }d}t        j                  t        |      5  t        ||       d d d        y # 1 sw Y   y xY w)Nr8   i  g{Gz?r   gư>zuClustering metrics expects discrete values but received continuous values for label, and continuous values for targetr   )	rh   ri   rj   randlinspacer   warnsUserWarningr   )rngnoise
wavelengthmsgs       r#   test_check_clustering_errorr   w  sj    
))


#CHHSMET1c*T1J	  
k	-*e, 
.	-	-s   (A>>Bc                      d} t        t        |             }|}t        j                  | | dz
  z  dgddgg      }t	        t        ||      |       y )Nr   r   r   )r   ro   rh   r   r   r   Nclustering1clustering2r"   s       r#   *test_pair_confusion_matrix_fully_dispersedr     sO    AuQx.KKxx!q1u+q)Aq623H,[+FQrD   c                      d} t        j                  | f      }|}t        j                  ddgd| | dz
  z  gg      }t        t	        ||      |       y )Nr   r   r   )rh   rl   r   r   r   r   s       r#   )test_pair_confusion_matrix_single_clusterr     sQ    A((A4.KKxx!Q!Q!a%[!123H,[+FQrD   c                  R   d} | dz  }t        j                  t        |       D cg c]  }|dz   g| z   c}      }t        j                  t        |       D cg c]  }|dz   g| dz   z   c}      d | }t        j                  dt         j                        }t        t        |            D ]X  }t        t        |            D ]?  }||k7  s	t        ||   ||   k(        }t        ||   ||   k(        }|||fxx   dz  cc<   A Z t        t        ||      |       y c c}w c c}w )Nr}   r&   r   )r&   r&   )shaper   )	rh   hstackro   rl   int64rm   r   r   r   )	nr   rv   r   r   r"   rx   same_cluster_1same_cluster_2s	            r#   test_pair_confusion_matrixr     s   
A	1A))%(;(Qa!eWq[(;<K))aA1a!eWA.AB2AFKxxfBHH5H3{#$s;'(AAv!$[^{1~%E!F!$[^{1~%E!F78A=8	 ) % ,[+FQ <As   DD$zclustering1, clustering2r   )r   c                 0    t        t        | |      d       y )Nr7   r   r   )r   r   s     r#   test_rand_score_edge_casesr     s     J{K8#>rD   c                      g d} g d}d}d}d}d|z
  |z
  |z
  }||z   }||z   |z   |z   }||z  }t        t        | |      |       y )NrF   rQ   r^      r&      r   )	r   r   D11D10D01D00expected_numeratorexpected_denominatorr"   s	            r#   test_rand_scorer     sg    $K$K
C
C
C
#+
c
!Cs9s?S0!$88HJ{K8(CrD   c                  l   t         j                  j                  d      } | j                  dddt         j                        }| j                  dddt         j                        }t        j                         5  t        j                  dt               t        ||       ddd       y# 1 sw Y   yxY w)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)
rh   ri   rj   rk   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FF+ 
#	"	"s   :'B**B3r?   )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J  J y)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&   r>   )r   )r?   labels1labels2labels3nmis        r#   )test_normalized_mutual_info_score_boundedr    su     cCiGcGABKG!fwqr{"G 'w
WC!8O8 'w
WC<a<<<rD   )r}   r8   )$   )Ar   numpyrh   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$   r5   rC   rK   rO   rU   r\   rc   r{   r   r   r   r   r   r   r   r   r   r   r   markparametrizer   r   r   r   r   r   ro   rl   r   r   r   r  r   rD   r#   <module>r     s      X X     X + 6  4"8 $F$$$&('.	K&>H34&+G$"
,*.. 
&'
q$%	cUQY'	aS1W%
SEAI	<	<-RRR" 
5:U3Z()HBHHV,<hbhhv>N+OP?	?D , )+TU VrD   