o
    Z&iM                  
   @   s  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m Z  d dl!m"Z"m#Z# eeeeeeegZ$ej%&d	e$d
d Z'dd Z(ej%&d	e$dd Z)ej%&d	eegej%&dg ddd Z*dd Z+dd Z,dd Z-dd Z.dd Z/d]d d!Z0d"d# Z1d$d% Z2d&d' Z3d(d) Z4d*d+ Z5ej%j&d,e  ed-d.d/ Z6d0d1 Z7d2d3 Z8d4d5 Z9d^d7d8Z:d9d: Z;d;d< Z<ej%&d=d>gd? g d@fdAgd? g d@fg d@d>gd? fg d@dAgd? fd>gd? d>gd? fgdBdC Z=dDdE Z>dFdG Z?dHdI Z@dJdK ZAej%&dLeBeCdMeBeCdMfeDdNeDdNfgdOdP ZEdQdR ZFdSdT ZGej%&dg dUdVdW ZHej%&dXdYdZgd[d\ ZIdS )_    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)_get_namespace_device_dtype_ids)yield_namespace_device_dtype_combinations)_array_api_for_testsassert_almost_equal
score_funcc                 C   s   d}t jt|d | ddgg d W d    n1 sw   Y  d}t jt|d | ddgddggg d W d    n1 sCw   Y  d}t jt|d | g dddgddgg W d    d S 1 sjw   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   )pytestraises
ValueError)r   expected r$   XC:\wamp64\www\opt\env\Lib\site-packages\sklearn/metrics/cluster/tests/test_supervised.py"test_error_messages_on_wrong_input+   s   "r&   c                     s   d\ g d}  fdd| D }|d |d   kr*|d   kr*|d ks-J  J d	\fd
d| D }|d |d   krS|d   krS|d ksVJ  J d S )N)r      min	geometric
arithmeticmaxc                       g | ]}t  |qS r$   r   .0method)abr$   r%   
<listcomp>=       z,test_generalized_average.<locals>.<listcomp>r   r   r'      )   r7   c                    r-   r$   r.   r/   )cdr$   r%   r4   @   r5   r$   )methodsZmeansr$   )r2   r3   r8   r9   r%   test_generalized_average:   s   6:r;   c                 C   s   | g g t dksJ | dgdgt dksJ | g dg dt dks*J | g dg dt dks:J | g dg dt dksJJ | g d	g d
t dksZJ | g dg dt dksjJ d S )N      ?r   r   r   r   r   r   *      r?           r<   rB         E@      @rD   rB   r<          @rD   rE   rG   r   r   r'   r?   r@   r'   r    approx)r   r$   r$   r%   test_perfect_matchesD   s       $rM   average_methodr(   c                 C   s<  | g g |dt dksJ | dgdg|dt dksJ | g dg d|dt dks0J | g dg d|dt dksBJ | g dg d	|dt dksTJ | g d
g d|dt dksfJ | g dg d|dt dksxJ | ddgddg|dt dksJ | g dg d|dt dksJ d S )NrN   r<   r   r   r=   r   r>   rA   rC   rF   rH   rI   rJ   )r   r   r'   r6   rK   )r   rN   r$   r$   r%   (test_perfect_matches_with_changing_meansO   sF   	 
rP   c                  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   hr8   vr$   r$   r%   *test_homogeneous_but_not_complete_labelingr      rW   c                  C   rQ   )Nr   r   r   r   r'   r'   )r   r   r   r   r   r   g(\?r'   r<   g\(\?rS   rT   r$   r$   r%   *test_complete_but_not_homogeneous_labelingz   rX   rZ   c                  C   rQ   )NrR   r   r   r   r   r'   r'   q=
ףp?r'   zG?p=
ף?rS   rT   r$   r$   r%   .test_not_complete_and_not_homogeneous_labeling   rX   r_   c                  C   s   d} d}d}d|  | | | | |  }t g dg d| d\}}}t||d t||d t||d tg dg d| d}t||d d S )	Ng?r\   r]   r   rR   r[   )betar'   )r   r   r   )Z	beta_testZh_testZc_testZv_testrU   r8   rV   r$   r$   r%   test_beta_parameter   s   ra   c                  C   s   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^   rR   )r      r   rb   r'   r'   gQ?gQ?)r   r   r   r   )rU   r8   rV   Zari_1Zari_2Zri_1Zri_2r$   r$   r%   test_non_consecutive_labels   s    rc   
   r?   c                 C   sr   t j|j}t t||f}t|D ]"\}}t|D ]}	|d||d}
|d||d}| |
||||	f< qq|S )Nr   )lowhighsize)nprandomRandomStaterandintzeroslen	enumeraterange)r   	n_samplesZk_rangen_runsseedZrandom_labelsscoresikjlabels_alabels_br$   r$   r%   uniform_labelings_scores   s   ry   c                  C   sD   g d} d}d}t t|| |}t|jdd}t|g dd d S )N)r'   rd   2   Z   d   rd   r   )Zaxis){Gz?Q?r~   r}   r'   )ry   r   rh   absr,   r   )Zn_clusters_rangerp   rq   rs   Zmax_abs_scoresr$   r$   r%   test_adjustment_for_chance   s   r   c            	      C   s   t g d} t g d}t| |}t|dd t| |dd}t| ||d}t|dd t| |}t| ||d}t|dd | }t||}t|dd t| |}t|d	d tg d
g d}|t	dkskJ t t
| d g }t t
|d 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)ZcontingencygpUj@?gP1?)r   r   r'   r'   )r'   r'   r6   r6   r<   n   gRQ?r'   )rh   arrayr   r   r	   sumr   r   r    rL   listflatten)	rw   rx   miCrp   ZemiZamiZa110Zb110r$   r$   r%   test_adjusted_mutual_info_score   s*   




r   c                   C   s    t tdggddksJ d S )Nip r   )r   rh   r   r$   r$   r$   r%   "test_expected_mutual_info_overflow   s    r   c                  C   s   t dgd dgd  dgd  dgd  d	gd
  } t dgd dgd  dgd  dgd  dgd  dgd  dgd  dgd  dgd  dgd  }tt| | tt| | d S )Nr   iy  r'   i]<  r6   i  rb   iU  r   iP  r   i  i	  iD9  i  i     i.  '   i<     )rh   r   r   r   r   )xyr$   r$   r%   3test_int_overflow_mutual_info_fowlkes_mallows_score   sD   	r   c                   C   s:   t tg ddd t tg d tg ddksJ d S )Nr   r   rD   ,^R^?r   r   r   r   r   r   r   )r   r
   r$   r$   r$   r%   test_entropy  s   r   z#array_namespace, device, dtype_name)Zidsc                 C   s   t | |}|jtjg d|d|d}|jg |j|d}|jg d|d}tdd& t|tjdd	d
ks8J t|dks@J t|dksHJ W d    d S 1 sSw   Y  d S )Nr   dtype)device)r   r   r   T)Zarray_api_dispatchr   gh㈵>)r   r   r   )r   Zasarrayrh   Zint32r   r
   r    rL   )Zarray_namespacer   Z
dtype_nameZxpZfloat_labelsZempty_int32_labelsZ
int_labelsr$   r$   r%   test_entropy_array_api  s   
"r   c                  C   sx   t g d} t g d}t| |}t j| |t ddt ddfdd }t|| t| |dd}t||d  d S )	Nr   r   r   r   )Zbinsr   g?)eps)rh   r   r	   Zhistogram2daranger   )rw   rx   r   ZC2r$   r$   r%   test_contingency_matrix$  s   
(
r   c                  C   s   t g d} t g d}t| |}t| |dd }t|| tjtdd t| |ddd W d    d S 1 s<w   Y  d S )	Nr   r   Tr   z!Cannot set 'eps' when sparse=Truer   g|=)r   r   )rh   r   r	   Ztoarrayr   r    r!   r"   )rw   rx   r   ZC_sparser$   r$   r%   test_contingency_matrix_sparse.  s   

"r   c                  C   s   t dddtD ]\} t j| tdt j| td}}t||tdks'J t	||tdks3J t
||dks<J t||tdksHJ dD ]}t
|||ddksWJ t|||dtdkseJ qJq
d S )Nr   rb   r   rB   r(   rO   )rh   logspaceastypeintZonesr   r   r    rL   r   r   )rt   rw   rx   r1   r$   r$   r%   test_exactly_zero_info_score8  s"   
r   $   c                 C   s   t dddtD ]<}t j| }|dd||dd|}}tt||dt	|| t
|t
|  d d}tt||t|||d q
d S )Nr   rb   r   rd   rG   r+   rO   )rh   r   r   r   ri   rj   rk   r   r   r   r
   r   )rr   rt   Zrandom_staterw   rx   Zavgr$   r$   r%   %test_v_measure_and_mutual_informationJ  s(   r   c                  C   sb   t g dg d} t| dtd  t g dg d}t|d t g dg d}t|d	 d S )
NrR   rY   g      @g      R@)r   r   r   r   r   r   r<   )r   r   r   r   r   r   )r   r   r'   r6   rb   r   rB   )r   r   rh   sqrt)ZscoreZperfect_scoreZworst_scorer$   r$   r%   test_fowlkes_mallows_score`  s   
r   c                  C   s   t g d} t g d}dt d }t| |}t|| t|| }t|| t| d d |}t|| t|| d d }t|| d S )N)r   r   r   r   r   r'   )r   r   r'   r'   r   r   r<   g      (@r   r6   r'   )rh   r   r   r   r   )rw   rx   r#   Zscore_originalZscore_symmetricZscore_permutedZ
score_bothr$   r$   r%   %test_fowlkes_mallows_score_propertiesn  s   




r   zlabels_true, labels_predr2      )r   r   r   r   r   r   r   c                 C   s   t | |dks	J d S )Nr   )r   )Zlabels_trueZlabels_predr$   r$   r%   .test_mutual_info_score_positive_constant_label  s   r   c                  C   sj   t jd} | d}t dddd }d}tjt|d t|| W d    d S 1 s.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   )	rh   ri   rj   ZrandZlinspacer    warnsUserWarningr   )rngnoiseZ
wavelengthmsgr$   r$   r%   test_check_clustering_error  s   
"r   c                  C   sF   d} t t| }|}t| | d  dgddgg}tt||| d S )Nr|   r   r   )r   ro   rh   r   r   r   Nclustering1clustering2r#   r$   r$   r%   *test_pair_confusion_matrix_fully_dispersed  
   r   c                  C   sF   d} t | f}|}t ddgd| | d  gg}tt||| d S )Nr|   r   r   )rh   rl   r   r   r   r   r$   r$   r%   )test_pair_confusion_matrix_single_cluster  r   r   c                     s   d  d } t  fddt D }t  fddt D d |  }t jdt jd}tt|D ]-}tt|D ]$}||kr`t|| || k}t|| || k}|||f  d7  < q<q4tt||| d S )	Nrd   r'   c                    s   g | ]	}|d  g  qS r   r$   r0   rt   nr$   r%   r4     s    z.test_pair_confusion_matrix.<locals>.<listcomp>c                    s   g | ]}|d  g d   qS r   r$   r   r   r$   r%   r4     s    )r'   r'   )shaper   r   )	rh   Zhstackro   rl   Zint64rm   r   r   r   )r   r   r   r#   rt   rv   Zsame_cluster_1Zsame_cluster_2r$   r   r%   test_pair_confusion_matrix  s   $r   zclustering1, clustering2r|   )r|   c                 C   s   t t| |d d S )Nr<   r   r   )r   r   r$   r$   r%   test_rand_score_edge_cases  s   r   c            	      C   s`   g d} g d}d}d}d}d| | | }|| }|| | | }|| }t t| || d S )NrR   r[   rb      r'      r   )	r   r   ZD11ZD10ZD01ZD00Zexpected_numeratorZexpected_denominatorr#   r$   r$   r%   test_rand_score  s   r   c                  C   sx   t jd} | jdddt jd}| jdddt jd}t  tdt t	|| W d   dS 1 s5w   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)
rh   ri   rj   rk   Zint8warningscatch_warningssimplefilterRuntimeWarningr   )r   Zy_trueZy_predr$   r$   r%   !test_adjusted_rand_score_overflow  s   
"r   )r)   r+   r*   r,   c                 C   sx   dgd }dg|dd  }ddg|dd  }t ||| d}|dks%J t ||| d}d|  kr7dk s:J  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'   rO   )r   )rN   Zlabels1Zlabels2Zlabels3Znmir$   r$   r%   )test_normalized_mutual_info_score_bounded  s   
 r   r   TFc                 C   sJ   t jtdd tddgddg| d W d   dS 1 sw   Y  dS )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   FutureWarningr   r   r$   r$   r%   &test_fowlkes_mallows_sparse_deprecated  s
   "r   )rd   r?   )r   )Jr   numpyrh   r    Znumpy.testingr   r   r   Zsklearn.baser   Zsklearn.metrics.clusterr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Z#sklearn.metrics.cluster._supervisedr   r   Zsklearn.utilsr   Zsklearn.utils._array_apir   r   Zsklearn.utils._testingr   r   Zscore_funcsmarkZparametrizer&   r;   rM   rP   rW   rZ   r_   ra   rc   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ro   rl   r   r   r   r   r   r$   r$   r$   r%   <module>   s    @










		*

