U
    ½mœdŒG  ã                   @   sÒ  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZ eeeeeeegZdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd „ Z$d!d"„ Z%d#d$„ Z&d^d'd(„Z'd)d*„ Z(d+d,„ Z)d-d.„ Z*d/d0„ Z+d1d2„ Z,d3d4„ Z-d5d6„ Z.d7d8„ Z/d_d:d;„Z0d<d=„ Z1d>d?„ Z2ej3 4d@dAgdB dCdCd d dCdCgfdCgdB dCdCd d dCdCgfdCdCd d dCdCgdAgdB fdCdCd d dCdCgdCgdB fdAgdB dAgdB fg¡dDdE„ ƒZ5dFdG„ Z6dHdI„ Z7dJdK„ Z8dLdM„ Z9ej3 4dNe:e;dOƒƒe:e;dOƒƒfe <dP¡e <dP¡fg¡dQdR„ ƒZ=dSdT„ Z>dUdV„ Z?ej3 4dWdXdYdZd[g¡d\d]„ ƒZ@dS )`é    N)Úadjusted_mutual_info_score)Úadjusted_rand_score)Ú
rand_score)Úcompleteness_score)Úcontingency_matrix)Úpair_confusion_matrix)Úentropy)Úexpected_mutual_information)Úfowlkes_mallows_score)Ú"homogeneity_completeness_v_measure)Úhomogeneity_score)Úmutual_info_score)Únormalized_mutual_info_score)Úv_measure_score©Ú_generalized_average)Úcheck_clusterings)Úassert_all_finite)Úassert_almost_equal)Úassert_array_equalÚassert_array_almost_equalÚassert_allclosec               
   C   s´   t D ]ª} d}tjt|d�� | ddgdddgƒ W 5 Q R X d}tjt|d��" | ddgddggdddgƒ W 5 Q R X d}tjt|d��" | dddgddgddggƒ W 5 Q R X qd S )NzDFound input variables with inconsistent numbers of samples: \[2, 3\]©Úmatchr   é   z$labels_true must be 1D: shape is \(2z$labels_pred must be 1D: shape is \(2)Úscore_funcsÚpytestÚraisesÚ
ValueError)Ú
score_funcÚexpected© r!   úf/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_supervised.pyÚ"test_error_messages_on_wrong_input'   s    ÿ&r#   c                     s°   d\‰ ‰ddddg} ‡ ‡fdd„| D ƒ}|d |d	   krV|d
   krV|d ks\n t ‚d\‰‰‡‡fdd„| D ƒ}|d |d	   kr¦|d
   kr¦|d ks¬n t ‚d S )N)r   é   ÚminÚ	geometricÚ
arithmeticÚmaxc                    s   g | ]}t ˆ ˆ|ƒ‘qS r!   r   ©Ú.0Úmethod)ÚaÚbr!   r"   Ú
<listcomp>;   s     z,test_generalized_average.<locals>.<listcomp>r   r   r$   é   )é   r0   c                    s   g | ]}t ˆ ˆ|ƒ‘qS r!   r   r)   )ÚcÚdr!   r"   r.   >   s     )ÚAssertionError)ÚmethodsÚmeansr!   )r,   r-   r1   r2   r"   Útest_generalized_average8   s    4r6   c                  C   s8  t D ]ì} | g g ƒt d¡ks t‚| dgdgƒt d¡ks<t‚| dddgdddgƒt d¡ks`t‚| dddgdddgƒt d¡ks„t‚| dddgdddgƒt d¡ks¨t‚| ddd	gddd	gƒt d¡ksÌt‚| ddd
gddd
gƒt d¡kst‚qttg}ddddh}|D �]&} |D �]}| g g |d�t d¡k�s8t‚| dgdg|d�t d¡k�sZt‚| dddgdddg|d�t d¡k�s„t‚| dddgdddg|d�t d¡k�s®t‚| dddgdddg|d�t d¡k�sØt‚| ddd	gddd	g|d�t d¡k�st‚| ddd
gddd
g|d�t d¡k�st‚�q�q
d S )Nç      ð?r   r   é*   é   ç        ç      E@g      @ç       @r$   r%   r&   r'   r(   ©Úaverage_method)r   r   Úapproxr3   r   r   )r   Zscore_funcs_with_changing_meansr5   Zmeanr!   r!   r"   Útest_perfect_matchesB   sf    $$$$&þ

"  ÿþ
  ÿþ
  ÿþ
  ÿþ
  ÿþr@   c                  C   sP   t ddddddgddddddgƒ\} }}t| ddƒ t|ddƒ t|ddƒ d S )Nr   r   r$   r7   g®Gázæ?gìQ¸…ëé?©r   r   ©Úhr1   Úvr!   r!   r"   Ú*test_homogeneous_but_not_complete_labelinge   s    (rE   c                  C   sP   t ddddddgddddddgƒ\} }}t| ddƒ t|ddƒ t|ddƒ d S )Nr   r   r$   g�Âõ(\�â?r7   g\�Âõ(\ç?rA   rB   r!   r!   r"   Ú*test_complete_but_not_homogeneous_labelingm   s    (rF   c                  C   sP   t ddddddgddddddgƒ\} }}t| ddƒ t|ddƒ t|ddƒ d S )Nr   r   r$   çq=
×£på?çáz®GáÚ?ç¤p=
×£à?rA   rB   r!   r!   r"   Ú.test_not_complete_and_not_homogeneous_labelingu   s    (rJ   c                  C   s®   d} d}d}d|  | | | | |  }t ddddddgddddddg| d�\}}}t||dƒ t||dƒ t||dƒ tddddddgddddddg| d�}t||dƒ d S )Ngš™™™™™É?rG   rH   r   r   r$   )Úbeta)r   r   r   )Z	beta_testZh_testZc_testZv_testrC   r1   rD   r!   r!   r"   Útest_beta_parameter}   s      ÿ&rL   c                  C   sT  t ddddddgddddddgƒ\} }}t| ddƒ t|ddƒ t|ddƒ t ddddddgddddddgƒ\} }}t| ddƒ t|ddƒ t|ddƒ tddddddgddddddgƒ}tddddddgddddddgƒ}t|ddƒ t|ddƒ tddddddgddddddgƒ}tddddddgddddddgƒ}t|d	dƒ t|d	dƒ d S )
Nr   r$   r   rG   rH   rI   é   g¸…ëQ¸Î?g…ëQ¸å?)r   r   r   r   )rC   r1   rD   Zari_1Zari_2Zri_1Zri_2r!   r!   r"   Útest_non_consecutive_labels‘   s     ((""""rN   é
   r8   c                 C   sr   t j |¡j}t  t|ƒ|f¡}t|ƒD ]D\}}t|ƒD ]2}	|d||d�}
|d||d�}| |
|ƒ|||	f< q8q(|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    rd   c                  C   sL   ddddg} d}d}t t|| |ƒ}t |¡jdd�}t|dd	d	dgdƒ d S )
Nr$   rO   é2   éZ   éd   r   )Zaxisg{®Gáz”?g¸…ëQ¸ž?)rd   r   rS   Úabsr(   r   )Zn_clusters_ranger[   r\   r^   Zmax_abs_scoresr!   r!   r"   Útest_adjustment_for_chance´   s       ÿri   c            	      C   sf  t  dddddddddddddddddg¡} t  dddddddddddddddddg¡}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ddddgddddgƒ}|t 	d¡k�st
‚t  t| ƒd g¡ ¡ }t  t|ƒd g¡ ¡ }t||ƒ}t|ddƒ d S )Nr   r$   r/   gS‘
cAÚ?é   T©Úsparse)ZcontingencygpUjö@Ã?gçãÚP1ÎÑ?r7   én   gR¸…ëQØ?)rS   Úarrayr   r   r   Úsumr	   r   r   r?   r3   ÚlistÚflatten)	rb   rc   ÚmiÚCr[   ZemiZamiZa110Zb110r!   r!   r"   Útest_adjusted_mutual_info_scoreÂ   s*    ,,




rt   c                   C   s    t t dgg¡dƒdkst‚d S )Nip r   )r	   rS   rn   r3   r!   r!   r!   r"   Ú"test_expected_mutual_info_overflowá   s    ru   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]<  r/   i“  rM   iU  rj   iP  r   i˜Í  iá	  iD9  i  iÇ  éÌ   i.  é'   i<  é   )rS   rn   r   r   r
   )ÚxÚyr!   r!   r"   Ú3test_int_overflow_mutual_info_fowlkes_mallows_scoreç   sD    ÿþýüÿÿþýüûúùø	÷ÿr{   c                  C   sD   t dddgƒ} t| ddƒ tt g ƒdƒ t ddddgƒdks@t‚d S )Nr   r;   g,^ÑR^ä?rj   r   )r   r   r3   )Úentr!   r!   r"   Útest_entropy  s    r}   c                  C   s´   t  dddddddddddddddddg¡} t  dddddddddddddddddg¡}t| |ƒ}t j| |t  dd¡t  dd¡fd�d }t||ƒ t| |dd�}t||d ƒ d S )	Nr   r$   r/   rj   )Zbinsr   gš™™™™™¹?)Úeps)rS   rn   r   Zhistogram2dÚaranger   )rb   rc   rs   ZC2r!   r!   r"   Útest_contingency_matrix  s    ,,
(
r€   c                  C   s¬   t  dddddddddddddddddg¡} t  dddddddddddddddddg¡}t| |ƒ}t| |dd� ¡ }t||ƒ tjtdd�� t| |ddd	� W 5 Q R X d S )
Nr   r$   r/   Trk   z!Cannot set 'eps' when sparse=Truer   g»½×Ùß|Û=)r~   rl   )rS   rn   r   Ztoarrayr   r   r   r   )rb   rc   rs   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sNt	‚t
||ƒt d¡ksft	‚t||ƒt d¡ks~t	‚t||ƒt d¡ks–t	‚dD ]<}t|||d�t d¡ksºt	‚t|||d�t d¡ksšt	‚qšqd S )Nr   rM   ©Údtyper:   )r%   r&   r'   r(   r=   )rS   ÚlogspaceÚastypeÚintZonesr   r   r   r?   r3   r   r   )r_   rb   rc   r+   r!   r!   r"   Útest_exactly_zero_info_score  s*      ÿþ  ÿþr‡   é$   c                 C   s’   t  ddd¡ t¡D ]x}t j | ¡}| dd|¡| dd|¡ }}tt||ƒdt	||ƒ t
|ƒt
|ƒ  dƒ d}tt||ƒt|||d�ƒ qd S )Nr   rM   r   rO   r<   r'   r=   )rS   r„   r…   r†   rT   rU   rV   r   r   r   r   r   )r]   r_   Zrandom_staterb   rc   Úavgr!   r!   r"   Ú%test_v_measure_and_mutual_information-  s&    þÿþûþrŠ   c                  C   s’   t ddddddgddddddgƒ} t| dt d¡ ƒ t ddddddgddddddgƒ}t|dƒ t ddddddgdddddd	gƒ}t|d
ƒ d S )Nr   r   r$   g      @g      R@r7   r/   rM   rj   r:   )r
   r   rS   Úsqrt)ZscoreZperfect_scoreZworst_scorer!   r!   r"   Útest_fowlkes_mallows_scoreC  s    ""
"rŒ   c                  C   sž   t  ddddddg¡} t  ddddddg¡}dt  d¡ }t| |ƒ}t||ƒ t|| ƒ}t||ƒ t| d d |ƒ}t||ƒ t|| d d ƒ}t||ƒ d S )Nr   r   r$   r7   g      (@r/   )rS   rn   r‹   r
   r   )rb   rc   r    Zscore_originalZscore_symmetricZscore_permutedZ
score_bothr!   r!   r"   Ú%test_fowlkes_mallows_score_propertiesQ  s    




r�   zlabels_true, labels_predr,   é   r   c                 C   s   t | |ƒdkst‚d S )Nr   )r   r3   )Zlabels_trueZlabels_predr!   r!   r"   Ú.test_mutual_info_score_positive_constant_labelh  s    r�   c               	   C   sT   t j d¡} |  d¡}t  ddd¡d }d}tjt|d�� t||ƒ W 5 Q R X d S )Nr8   iô  g{®Gáz„?r   g�íµ ÷Æ°>zuClustering metrics expects discrete values but received continuous values for label, and continuous values for targetr   )	rS   rT   rU   ZrandZlinspacer   ZwarnsÚUserWarningr   )ÚrngÚnoiseZ
wavelengthÚmsgr!   r!   r"   Útest_check_clustering_errorx  s    
ÿr”   c                  C   sF   d} t t| ƒƒ}|}t | | d  dgddgg¡}tt||ƒ|ƒ d S )Nrg   r   r   )rp   rZ   rS   rn   r   r   ©ÚNÚclustering1Úclustering2r    r!   r!   r"   Ú*test_pair_confusion_matrix_fully_dispersed‡  s
    r™   c                  C   sF   d} t  | f¡}|}t  ddgd| | d  gg¡}tt||ƒ|ƒ d S )Nrg   r   r   )rS   rW   rn   r   r   r•   r!   r!   r"   Ú)test_pair_confusion_matrix_single_cluster�  s
    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 ]Z}tt|ƒƒD ]H}||krxt|| || kƒ}t|| || kƒ}|||f  d7  < qxqhtt||ƒ|ƒ d S )	NrO   r$   c                    s   g | ]}|d  gˆ  ‘qS ©r   r!   ©r*   r_   ©Únr!   r"   r.   �  s     z.test_pair_confusion_matrix.<locals>.<listcomp>c                    s   g | ]}|d  gˆ d   ‘qS r›   r!   rœ   r�   r!   r"   r.   ž  s     )r$   r$   )Úshaperƒ   r   )	rS   ZhstackrZ   rW   Zint64rX   r†   r   r   )r–   r—   r˜   r    r_   ra   Zsame_cluster_1Zsame_cluster_2r!   r�   r"   Útest_pair_confusion_matrix™  s    $r    zclustering1, clustering2rg   )rg   c                 C   s   t t| |ƒdƒ d S )Nr7   ©r   r   )r—   r˜   r!   r!   r"   Útest_rand_score_edge_casesª  s    r¢   c            	      C   sp   ddddddg} ddddddg}d}d}d}d| | | }|| }|| | | }|| }t t| |ƒ|ƒ d S )Nr   r   r$   rM   é   é   r¡   )	r—   r˜   ZD11ZD10ZD01ZD00Zexpected_numeratorZexpected_denominatorr    r!   r!   r"   Útest_rand_score´  s    r¥   c               	   C   sb   t j d¡} | jdddt jd�}| jdddt jd�}t ¡ � t dt¡ t	||ƒ W 5 Q R X dS )z·Check 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   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&   r(   c                 C   sv   dgd }dg|dd…  }ddg|dd…  }t ||| d�}|dksJt‚t ||| d�}d|  krldk srn t‚dS )z�Check 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   r3   )r>   Zlabels1Zlabels2Zlabels3Znmir!   r!   r"   Ú)test_normalized_mutual_info_score_boundedÒ  s    
r¬   )rO   r8   )rˆ   )Ar§   ÚnumpyrS   r   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._testingr   Znumpy.testingr   r   r   r   r#   r6   r@   rE   rF   rJ   rL   rN   rd   ri   rt   ru   r{   r}   r€   r�   r‡   rŠ   rŒ   r�   ÚmarkZparametrizer�   r”   r™   rš   r    rp   rZ   rW   r¢   r¥   r«   r¬   r!   r!   r!   r"   Ú<module>   s�   ù
#



ûþ

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