a
    �ù»jXa  ã                   @   sþ  d dl Z d dlZd dlZd dl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 d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ ej d ¡ZdZddgde  ed¡  Z!ddgde  ed¡  Z"ddgde  ed¡  Z#ddgde  ed¡  Z$ddgde  ed¡  Z%ddgde  ed¡  Z&e 'e!e"e#e$e%e&f¡Z(ej) *dg d¢dgg d¢d gdddd d!dej+gdgdddd d!dej+gdgg¡d"d#„ ƒZ,ej) *dddd$d%dd&d&ej+gdgddd$d%d'dd&d&ej+g	d gddd$dej+gd gddd$ej+gdgg¡d(d)„ ƒZ-ej) *d*g d+¢d dgddggg d,¢gg d+¢d dgddggg d-¢gg d+¢d dgddgd dggg d-¢gg d.¢d dgddgd dggg d/¢gg¡d0d1„ ƒZ.d2d3„ Z/d4d5„ Z0ej) *d6d7gd8d9„ eD ƒ ¡d:d;„ ƒZ1d<d=„ Z2d>d?„ Z3d@dA„ Z4dBdC„ Z5dDdE„ Z6dFdG„ Z7dHdI„ Z8ej) *dJg dK¢¡ej) *dLg dM¢¡ej) *d6d7dNgdOd9„ eD ƒ ¡dPdQ„ ƒƒƒZ9dRdS„ Z:ej) *dTe;de(j<d  d dUƒ¡dVdW„ ƒZ=ej) *dXe¡dYdZ„ ƒZ>d[d\„ Z?d]d^„ Z@d_d`„ ZAej) *dXdge ¡dadb„ ƒZBej) *dXe¡dcdd„ ƒZCdedf„ ZDdS )gé    N)ÚDBSCANÚOPTICS)Ú_extend_regionÚ_extract_xi_labels)Úgenerate_clustered_data)Ú
make_blobs)ÚDataConversionWarningÚEfficiencyWarning)Úcontingency_matrix)Úpairwise_distances)Úshuffle)Úassert_allcloseÚassert_array_equal)ÚCSR_CONTAINERSé
   éûÿÿÿéþÿÿÿçš™™™™™é?é   é   éÿÿÿÿçš™™™™™¹?é   çš™™™™™É?é   ç333333Ó?gš™™™™™ù?é   é   )Úr_plotÚend)r   çÍÌÌÌÌÌ!@çš™™™™™!@çffffff!@é   r   )r   r    r!   r"   g333333!@r#   r   r    r!   r"   r#   c                 C   sP   t  | ¡} | d d… | dd …  }|dk}|dk }t||ddƒ}||ksLJ ‚d S )Nr   r   grÇqÇñ?r   r   ©ÚnpÚarrayr   )r   r   ÚratioZsteep_downwardZupwardÚe© r)   úGE:\soccer\ml_env\Lib\site-packages\sklearn/cluster/tests/test_optics.pyÚtest_extend_downward   s    

r+   gÍÌÌÌÌÌ @gš™™™™™@é   gffffff@c                 C   sP   t  | ¡} | d d… | dd …  }|dk}|dk}t||ddƒ}||ksLJ ‚d S )Nr   r   gÍÌÌÌÌÌì?r   r   r$   )r   r   r'   Zsteep_upwardZdownwardr(   r)   r)   r*   Útest_extend_upward2   s    

r-   )ÚorderingÚclustersÚexpected©r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   c                 C   s   t | |ƒ}t||ƒ d S ©N)r   r   )r.   r/   r0   Úlabelsr)   r)   r*   Útest_the_extract_xi_labelsE   s    

r4   c                 C   sÖ  t j d¡}d}ddgd| |d¡  }ddgd	| |d¡  }d
dgd| |d¡  }ddgd| |d¡  }ddgd| |d¡  }ddgd| |d¡  }t  |||||t  ddgg¡|f¡j| dd�}	t jdgd dgd d
gd dgd d
gd ddgd f }
t|	|
|d�\}	}
t	dddddd� 
|	¡}t|j|
ƒ t	d	ddddd� 
|	¡}t|j|
ƒ t  |||||t  ddggd ¡|f¡j| dd�}	t jd
gd dgd dgd dgd dgd dddgd f }
t|	|
|d�\}	}
t	dddddd� 
|	¡}t|j|
ƒ ddgdd	gddgd	dgg}ddgddgddgddgg}ddgddgddgddgg}t  |||f¡j| dd�}	t jdgd d
gd dgd f }
t|	|
|d�\}	}
t	ddt jddd� 
|	¡}t|j|
ƒ d S ) Nr   r   r   r   r   r   r   r   r   r   r   r   r   g333333ã?r   éd   F©Úcopy©Úrandom_stateé   Úxiçš™™™™™Ù?)Úmin_samplesÚmin_cluster_sizeÚmax_epsÚcluster_methodr;   g{®Gáz´?çš™™™™™¹¿r   é	   é   éZ   én   ç{®Gáz¤?)r%   ÚrandomÚRandomStateÚrandnÚvstackr&   ÚastypeÚr_r   r   Úfitr   Úlabels_Úinf)Úglobal_dtypeÚrngÚn_points_per_clusterÚC1ÚC2ÚC3ÚC4ÚC5ÚC6ÚXÚexpected_labelsÚclustr)   r)   r*   Útest_extract_xiT   sd    $ÿ<
ÿþ
ÿþ(ÿ6ÿ
ÿþ"ÿþr\   c                 C   sÈ   t j d¡}d}ddgd| |d¡j| dd�  }ddgd| |d¡j| dd�  }t  ||f¡}t|dd�}tdd	d
� |¡j	}|j
dks�J ‚t  |t  ddgddgg¡ ¡}|t|ƒ dk sÄJ ‚d S )Nr   r5   r   Fr6   é2   r8   r:   r   )r=   r;   )r   r   éc   éÇ   çš™™™™™©?)r%   rG   rH   rI   rK   rJ   r   r   rM   Zcluster_hierarchy_ÚshapeÚsumr&   Úlen)rP   rQ   rR   rS   rT   rY   r/   Údiffr)   r)   r*   Útest_cluster_hierarchy_�   s    ÿ
ÿ
 re   zcsr_container, metric)NÚ	minkowskic                 C   s   g | ]}|d f‘qS ©Ú	euclideanr)   ©Ú.0Ú	containerr)   r)   r*   Ú
<listcomp>¡   ó    rl   c                 C   s&  d}t |d�}tddd| d�}| |d ur2||ƒn|¡ tt|jƒƒtd|jv ƒ }||ks`J ‚|jjt|ƒfksvJ ‚|jjj	dksˆJ ‚|j
jt|ƒfksžJ ‚|j
jj	d	ks°J ‚|jjt|ƒfksÆJ ‚|jjj	d	ksØJ ‚|jjt|ƒfksîJ ‚|jjj	dk�sJ ‚t|jƒttt|ƒƒƒk�s"J ‚d S )
Nr   )Ú
n_clustersg      >@r   r   )r?   r=   r;   Úmetricr   ÚiÚf)r   r   rM   rc   ÚsetrN   Úintra   ÚdtypeÚkindÚreachability_Úcore_distances_Ú	ordering_Úrange)ro   Úcsr_containerrn   rY   r[   Zn_clusters_1r)   r)   r*   Útest_correct_number_of_clustersŸ   s    
r{   c                  C   sX   d} ddgg}t dddd�}tjt| d�� | |¡ W d   ƒ n1 sJ0    Y  d S )Nz#min_samples must be no greater thanr   g      ø?r   ç      ð?)r?   r=   r>   ©Úmatch)r   ÚpytestÚraisesÚ
ValueErrorrM   )ÚmsgrY   r[   r)   r)   r*   Ú#test_minimum_number_of_sample_check¿   s
    
rƒ   c                  C   sz   d} ddgddgddgg}t d|ddd�\}}tdd	d
dd�}tjt| d�� | |¡ W d   ƒ n1 sl0    Y  d S )Nz.Specify an epsilon smaller than 0.15. Got 0.3.r   r   éî  r<   r   ©Z	n_samplesÚcentersZcluster_stdr9   g333333Ã?Údbscanr   r   ©r?   r@   Úepsr=   r}   )r   r   r   r€   r�   rM   ©r‚   r†   rY   Úlabels_truer[   r)   r)   r*   Útest_bad_extractÌ   s    ÿ
rŒ   c                  C   sx   d} ddgddgddgg}t d|ddd�\}}tjt| d��( td	d
d	d�}| |¡ W d   ƒ n1 sj0    Y  d S )Nz6All reachability values are inf. Set a larger max_eps.r   r   r„   r<   r   r…   r}   g¸…ëQ¸Ž?r   )r?   r=   r‰   )r   r   ÚwarnsÚUserWarningr   rM   rŠ   r)   r)   r*   Útest_bad_reachabilityÚ   s    ÿ
r�   c                  C   s^   d} t jjddtd�}t ¡ �, t dt¡ t| d� 	|¡ W d   ƒ n1 sP0    Y  d S )NÚrogerstanimotor   ©r   r   ©Úsizert   Úerror©ro   )
r%   rG   ÚrandintÚboolÚwarningsÚcatch_warningsÚsimplefilterr   r   rM   )Úpairwise_metricrY   r)   r)   r*   Ú$test_nowarn_if_metric_bool_data_boolæ   s
    
rœ   c                  C   st   d} t jjddt jd�}d| › �}tjt|d��0}t| d� |¡ t	|ƒdksRJ ‚W d   ƒ n1 sf0    Y  d S )	Nr�   r   r‘   r’   z-Data will be converted to boolean for metric r}   r•   r   )
r%   rG   r–   Úint32r   r�   r   r   rM   rc   )r›   rY   r‚   Zwarn_recordr)   r)   r*   Ú%test_warn_if_metric_bool_data_no_boolô   s    
rž   c                  C   s‚   d} t jjddtd�}t jjddt jd�}t ¡ �< t dt¡ t	| d� 
|¡ t	| d� 
|¡ W d   ƒ n1 st0    Y  d S )Nrf   r   r‘   r’   r”   r•   )r%   rG   r–   r—   r�   r˜   r™   rš   r   r   rM   )r›   ZX_boolZX_numr)   r)   r*   Útest_nowarn_if_metric_no_bool  s    
rŸ   c                  C   sV   ddgddgddgg} t d| ddd�\}}tddd	d
d� |¡}t|jƒdksRJ ‚d S )Nr   r   r„   r<   r   r…   r|   r‡   r   r   rˆ   r   )r   r   rM   ÚmaxrN   )r†   rY   r‹   r[   r)   r)   r*   Útest_close_extract  s    ÿ
r¡   r‰   )r   r   ç      à?r=   )r   r   r:   )Nrh   c                 C   s   g | ]}|d f‘qS rg   r)   ri   r)   r)   r*   rl   &  rm   c                 C   sä   ddgddgddgg}t d|ddd�\}}|d ur:||ƒn|}|j|dd�}t|d	| |d
� |¡}t| |d� |¡}	t|	j|jƒ}
tt 	tj
|
dd�¡t 	tj
|
dd�¡ƒ}|jd | }t |d |jd  d¡}|dksàJ ‚d S )Nr   r   é–   r<   r   r…   Fr6   r‡   )r=   r@   r‰   ro   )r‰   r=   )Zaxisr   r`   )r   rK   r   rM   r   r
   rN   Úminr%   rb   r    ra   Úround)r‰   r=   ro   rP   rz   r†   rY   r‹   ÚopÚdbZcontingencyZagreeZdisagreeZpercent_mismatchr)   r)   r*   Útest_dbscan_optics_parity!  s&    
ÿ
ÿþ$ÿr¨   c                 C   sJ  ddgddgddgg}ddgddgddgg}ddgddgdd	gg}t  |||f¡j| d
d�}t jdgd dgd dgd f }tddddd� |¡}t|j|ƒ t jdgd dgd dgd f }tddddd� |¡}t|j|ƒ t jdgd  }tj	t
dd��2 tddddd� |¡}t|j|ƒ W d   ƒ n1 �s<0    Y  d S )Nr   r   rA   r   rB   rC   r5   é`   éj   Fr6   r   r   r   r#   r;   rF   )r=   r?   r@   r;   r   zAll reachability valuesr}   r   )r%   rJ   rK   rL   r   rM   r   rN   r   r�   rŽ   )rP   rS   rT   rU   rY   rZ   r[   r)   r)   r*   Útest_min_samples_edge_caseG  s    ""r«   r>   é   c                 C   sˆ   t d d d… j|dd�}td| d� |¡}t |j|jdk ¡}|jrVt|ƒ| ksVJ ‚td| |j	d  d�}| |¡ t
|j|jƒ d S )Nr   Fr6   rB   )r=   r>   r   r   )rY   rK   r   rM   r%   ZbincountrN   r“   r¤   ra   r   )r>   rP   ÚredXr[   Zcluster_sizesZ
clust_fracr)   r)   r*   Útest_min_cluster_size\  s    þ
r®   rz   c                 C   sž   t ttƒd d�}tjtdd�� | t¡ W d   ƒ n1 s@0    Y  t ttƒd dd�}tjtdd�� | | tƒ¡ W d   ƒ n1 s�0    Y  d S )Nr   )r>   zmust be no greater than the r}   rh   )r>   ro   )r   rc   rY   r   r€   r�   rM   )rz   r[   r)   r)   r*   Útest_min_cluster_size_invalid2l  s    (r¯   c                  C   sh   dgdgdgdgg} t ddd� | ¡}t|jtjdddgƒ t|jddtjtjgƒ t|jg d¢ƒ d S )	Nr   r   iöÿÿÿé   r   é   ©r=   r?   r1   )r   rM   r   rv   r%   rO   rw   rx   )ÚYr[   r)   r)   r*   Útest_processing_orderw  s
    r´   c            
   <   C   s^  t jdddddddddddd	d	d
d
d
d	d	dddddddddddddddddddddddddddd dd!d"d#d$d%d%d%d%d&d&d&d'g<} g d(¢}g d)¢}td*d+� t¡}t|jt  |¡ƒ t|j|j t  |¡ƒ t	|j
|j t  | ¡ƒ |jd,d … D ]"}|j
| |j|j|  ksîJ ‚qît jt jt jt jt jt jt jt jt jt jt jddddddddddd-t jd.ddddd/dddt jd	d	d
d
d
d	d	dd0t jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jg<}g d1¢}g d2¢}td*d3d4� t¡}t|jt  |¡ƒ t|j|j t  |¡ƒ t	|j
|j t  |¡ƒ t  |jd3k¡d5 }	t	|j|	 |j|	 ƒ d S )6NgÕÓ@zëð?g­¯N	Hè?gÞ‡~NTç?gšu™õå?gæµ”åE²í?g#íšrýËò?gÜž™„2¯
@g`ÒzÁß?gP{¾
„VÐ?gØ:×“ÚíÏ?g}~ aÁÓ?gÊ$Ôáï¦@gÐ°{änøù?göŒ Ý?g€ŒuûºLÐ?gÀ»*æëÙÌ?g$¼ý&È?gÛÐ{æ˜PÇ?gÔê¦x²¬Ì?g\xð·*xò?gù~)ÔN{õ?göÞe’E,õ?go°¸F‹ë?g–Ç>E”kÑ?gPñÖRùÀ?g�ŒBåQ¹?g‚÷òªWÁ?gÃ@¸‹*Ä?g´r©2\kÆ?gúØhGÆ?g[Øœ]N†ã?g!ì´Lõ?gª´ƒá@g¿wÏc?�@g;¹Ã©fh@gK�!Q¡œ@gó,@ùM@gÄåZôvÄ@gr/É%ñA@)<r   r   r   r   r#   r,   r   rB   r   r   é   é   é    é"   é!   é&   é'   é#   é%   é$   é,   é   r¬   é   é   r°   é   é   é   é   r:   é(   é-   é.   r   r±   rC   é   é   é   é   é   é   é   é/   é1   é+   é0   é*   é)   é5   é9   é3   é4   é8   é;   é6   é7   é:   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Ç   rÈ   rÉ   r   r±   r±   rÊ   rÊ   r±   rC   rÌ   r±   r   rÑ   rÎ   rÈ   rÐ   rÓ   rÕ   r×   rØ   rØ   rØ   rØ   rÜ   rÜ   rÜ   rß   r   )r=   r   gÄ9'Ê%Šß?g�ÉÎ–FÑ?gx»ôåÕôÇ?gÑ*üùÖ?)<r   r   r   r   r   r   r   r#   r,   rB   r   r±   rC   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¿   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±   rC   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   r   r   r   r   r   r   r   r   r¢   r²   r   )r%   rO   r   rM   rY   r   rx   r&   Zpredecessor_r   rv   rw   Úwhere)
Úr1Zo1Úp1Úclust1rp   Úr2Úo2Zp2Úclust2Úindexr)   r)   r*   Útest_compare_to_ELKI‚  s   Ä>>B Ä>>>rè   c           	      C   s¾   t j d¡}d}ddgd| |d¡  }ddgd| |d¡  }d	dgd| |d¡  }dd
gd| |d¡  }t  ||||f¡j| dd�}tddd� |¡}tt  	t  
|j¡¡g d¢ƒ d S )Nr   r:   r   r   r   r   r   r   r   r   Fr6   r‡   r¢   )r@   r‰   r1   )r%   rG   rH   rI   rJ   rK   r   rM   r   ÚsortÚuniquerN   )	rP   rQ   rR   rS   rT   rU   rV   rY   r[   r)   r)   r*   Útest_extract_dbscan  s    rë   c                 C   s´   t d d d… j| dd�}t|dd�}|d ur4||ƒn|}t ¡ �0 t dt¡ tddd	d
� |¡}W d   ƒ n1 sv0    Y  tdddd
� |¡}t	|j
|j
ƒ t|j|jƒ d S )Nr   Fr6   rh   r•   Úignorer   ZbruteÚprecomputed)r=   Ú	algorithmro   )rY   rK   r   r˜   r™   rš   r	   r   rM   r   rv   r   rN   )rP   rz   r­   Údistsrã   ræ   r)   r)   r*   Útest_precomputed_dists#  s    
ÿ"rð   c                 C   s„   t j d¡ dd¡}t  |d¡ | |ƒ}tdd„ t| ¡ Ž D ƒƒsFJ ‚| ¡ }t	dd� 
|¡ |j|jksnJ ‚t| ¡ | ¡ ƒ dS )z£Check that we don't modify in-place the pre-computed sparse matrix.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/27508
    r   r   c                 s   s   | ]\}}||kV  qd S r2   r)   )rj   ÚrowÚcolr)   r)   r*   Ú	<genexpr>?  rm   zKtest_optics_input_not_modified_precomputed_sparse_nodiag.<locals>.<genexpr>rí   r•   N)r%   rG   rH   ZrandZfill_diagonalÚallÚzipZnonzeror7   r   rM   Znnzr   Ztoarray)rz   rY   ZX_copyr)   r)   r*   Ú8test_optics_input_not_modified_precomputed_sparse_nodiag3  s    rö   c                  C   s`   t  g d¢¡ dd¡} g d¢}| | }tddd� | ¡}tddd� |¡}t|j| |jƒ dS )	aƒ  Check that cluster correction using predecessor is working as expected.

    In the following example, the predecessor correction was not working properly
    since it was not using the right indices.

    This non-regression test check that reordering the data does not change the results.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/26324
    )r   r   r   r   r,   r,   r#   r5   r   r   )r   r   r   r   r   r   r#   r   r   rh   )r=   ro   N)r%   r&   Zreshaper   rM   r   rN   )ZX_1ZreorderZX_2Zoptics_1Zoptics_2r)   r)   r*   Ú+test_optics_predecessor_correction_orderingH  s    r÷   )Er˜   Únumpyr%   r   Zsklearn.clusterr   r   Zsklearn.cluster._opticsr   r   Zsklearn.cluster.tests.commonr   Zsklearn.datasetsr   Zsklearn.exceptionsr   r	   Zsklearn.metrics.clusterr
   Zsklearn.metrics.pairwiser   Zsklearn.utilsr   Zsklearn.utils._testingr   r   Zsklearn.utils.fixesr   rG   rH   rQ   rR   rI   rS   rT   rU   rV   rW   rX   rJ   rY   ÚmarkZparametrizerO   r+   r-   r4   r\   re   r{   rƒ   rŒ   r�   rœ   rž   rŸ   r¡   r¨   r«   ry   ra   r®   r¯   r´   rè   rë   rð   rö   r÷   r)   r)   r)   r*   Ú<module>   s®   

üþ	

üþ	

""üþ	
9þ
ÿþ


   

