U
    3dW                     @   s  d dl Zd dlZd dlmZ d dl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 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 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ddd d!d"dgdgddd d!d#d"dg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,d dddgd dgddggd d ddggd dddgd dgddggd d ddggd dddgd dgddgd dggd d ddggdddd gd dgddgd dggdd dd gggd-d. Z.d/d0 Z/d1d2 Z0ej)*d3d4d5gd6d7ggd8d9 Z1d:d; Z2d<d= Z3d>d? Z4d@dA Z5dBdC Z6dDdE Z7dFdG Z8ej)*dHdddIgej)*dJdddKgej)*d3d4d5gd6d5gd6d7ggdLdM Z9dNdO Z:ej)*dPe;de(j<d  d dQdRdS Z=dTdU Z>dVdW Z?dXdY Z@dZd[ ZAej)*d\d5d7gd]d^ ZBdS )_    N)sparse)
make_blobs)OPTICS)_extend_region_extract_xi_labels)DataConversionWarning)contingency_matrix)pairwise_distances)DBSCAN)shuffle)assert_array_equal)assert_allclose)EfficiencyWarning)generate_clustered_data
   皙?      皙?   皙?   333333?g?      )r_plotendg!@g!@gffffff!@   g333333!@c                 C   sP   t | } | d d | dd   }|dk}|dk }t||dd}||ksLtd S )Nr   r   grq?r   r   nparrayr   AssertionError)r   r   ratioZsteep_downwardZupwarde r'   E/tmp/pip-unpacked-wheel-zrfo1fqw/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sLtd S )Nr   r   g?r   r   r!   )r   r   r%   Zsteep_upwardZdownwardr&   r'   r'   r(   test_extend_upward5   s    

r+   )orderingclustersexpectedc                 C   s   t | |}t|| d S )N)r   r   )r,   r-   r.   labelsr'   r'   r(   test_the_extract_xi_labelsH   s    

r0   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_methodr7   g{Gz?皙r   	      Z   n   {Gz?)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_xiW   s    $ <        ( 6    "    rX   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stt |t ddgddgg }|t| dk std S )Nr   r1   r   Fr2   2   r4   r6   r   )r9   r7   )r   r   c      皙?)r"   rC   rD   rE   rG   rF   r   r   rI   Zcluster_hierarchy_shaper$   sumr#   len)rL   rM   rN   rO   rP   rU   r-   Zdiffr'   r'   r(   test_cluster_hierarchy_   s      
 
 r`   zmetric, is_sparse	minkowskiF	euclideanTc                 C   s"  d}t |d}tddd| d}||r0t|n| tt|jtd|jk }||ks^t	|jj
t|fkstt	|jjjdkst	|jj
t|fkst	|jjjd	kst	|jj
t|fkst	|jjjd	kst	|jj
t|fkst	|jjjdkst	t|jttt|kst	d S )
Nr   )
n_clustersg      >@r   r   )r;   r9   r7   metricr   if)r   r   rI   r   
csr_matrixr_   setrJ   intr$   r]   dtypekindreachability_core_distances_	ordering_range)rd   	is_sparserc   rU   rW   Zn_clusters_1r'   r'   r(   test_correct_number_of_clusters   s    
rq   c               	   C   sD   d} ddgg}t dddd}tjt| d || W 5 Q R X d S )Nz#min_samples must be no greater thanr   g      ?r   )r;   r9   r:   match)r   pytestraises
ValueErrorrI   )msgrU   rW   r'   r'   r(   #test_minimum_number_of_sample_check   s
    
rx   c               	   C   sf   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 5 Q R X d S )Nz.Specify an epsilon smaller than 0.15. Got 0.3.r   r     r8   r   Z	n_samplescentersZcluster_stdr5   g333333?dbscanr   r   r;   r<   epsr9   rr   )r   r   rt   ru   rv   rI   rw   r{   rU   labels_truerW   r'   r'   r(   test_bad_extract   s       
r   c               	   C   sd   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 5 Q R X d S )Nz6All reachability values are inf. Set a larger max_eps.r   r   ry   r8   r   rz   rr   gQ?r   )r;   r9   r~   )r   rt   warnsUserWarningr   rI   r   r'   r'   r(   test_bad_reachability   s       
r   c               	   C   sJ   d} t jjddtd}t " tdt t| d	| W 5 Q R X d S )Nrogerstanimotor   r   r   sizerj   errorrd   )
r"   rC   randintboolwarningscatch_warningssimplefilterr   r   rI   )pairwise_metricrU   r'   r'   r(   $test_nowarn_if_metric_bool_data_bool   s
    
r   c               	   C   s`   d} t jjddt jd}d|  }tjt|d&}t| d| t	|dksRt
W 5 Q R X d S )	Nr   r   r   r   z-Data will be converted to boolean for metric rr   r   r   )r"   rC   r   int32rt   r   r   r   rI   r_   r$   )r   rU   rw   Zwarn_recordr'   r'   r(   %test_warn_if_metric_bool_data_no_bool   s    
r   c               	   C   sn   d} t jjddtd}t jjddt jd}t 2 tdt t	| d
| t	| d
| W 5 Q R X d S )Nra   r   r   r   r   r   )r"   rC   r   r   r   r   r   r   r   r   rI   )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sRtd S )Nr   r   ry   r8   r   rz   g      ?r|   r   r   r}   r   )r   r   rI   maxrJ   r$   )r{   rU   r   rW   r'   r'   r(   test_close_extract  s       
r   r~         ?r9   r6   c                 C   s   ddgddgddgg}t d|ddd\}}|r8t|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std S )Nr   r   ry   r8   r   rz   Fr2   r|   )r9   r<   r~   rd   )r~   r9   )Zaxisr   r\   )r   r   rg   rG   r   rI   r
   r   rJ   minr"   r^   r   r]   roundr$   )r~   r9   rd   rp   rL   r{   rU   r   opdbZcontingencyZagreeZdisagreeZpercent_mismatchr'   r'   r(   test_dbscan_optics_parity$  s4    	   
    r   c              	   C   s4  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( tddddd|}t|j| W 5 Q R X d S )Nr   r   r=   r   r>   r?   r1   `   j   Fr2   r   r   r   r    r7   rB   )r9   r;   r<   r7   r   zAll reachability valuesrr   r   )r"   rF   rG   rH   r   rI   r   rJ   rt   r   r   )rL   rO   rP   rQ   rU   rV   rW   r'   r'   r(   test_min_samples_edge_caseI  s    ""r   r:      c                 C   s   t d d d j|dd}td| d|}t|j|jdk }|jrVt|| ksVt	td| |j
d  d}|| t|j|j d S )Nr   Fr2   r>   )r9   r:   r   r   )rU   rG   r   rI   r"   ZbincountrJ   r   r   r$   r]   r   )r:   rL   redXrW   Zcluster_sizesZ
clust_fracr'   r'   r(   test_min_cluster_size^  s    
r   c               	   C   sx   t ttd d} tjtdd | t W 5 Q R X t ttd dd} tjtdd | tt W 5 Q R X d S )Nr   )r:   zmust be no greater than the rr   rb   )r:   rd   )	r   r_   rU   rt   ru   rv   rI   r   rg   )rW   r'   r'   r(   test_min_cluster_size_invalid2n  s    r   c                  C   sl   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ddd	dg d S )
Nr   r   i   r      r9   r;   r   r   )r   rI   r   rl   r"   rK   rm   rn   )YrW   r'   r'   r(   test_processing_orderx  s
    r   c            
   <   C   s2  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<} d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcg<}ddd(d)d*d*d*d-d)d,d0d1d2d3d3d5d5d5d4d4d:d;d<d=d>d?d@dAdAd@d@d@d=dGdHdIdJdKdKdMdMdKdLdOdKdJdTdQdHdSdVdXdZd[d[d[d[d_d_d_dbg<}td0det}t|jt | t|j|j t | t	|j
|j t |  |jd1d  D ]&}|j
| |j|j|  kstqt 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dft jdgdddddhdddt jd	d	d
d
d
d	d	ddit 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<}d(d1d.d)d+d0d*d,d-d/dJdKdLdMdNdOdPdQdRdSdTdIdFd@dAd>dBdCd?dDdEd=d3d4d5d6d7d8d9d:d;d2dGdYdXdVd<dHdWdUdcd\d]dZd`dad^d[dbd_g<}dddddddddddddddddddddddJdKdKdMdMdKdLdOdKdJdTdddFd@dAdAdAdAd@d@d>ddd3d3d5d5d5d4d4d:d7ddddddddddddddddddddddddddddddddddddg<}td0djdkt}t|jt | t|j|j t | t	|j
|j t | t |jdjkd( }	t	|j|	 |j|	  d S )lNg@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 ?guL?g*?g$&?g{P?gx?g\x*x?g~)N{?geE,?goF?g>Ek?gPR?gBQ?gW?g@*?gr2\k?ghG?g[؜]N?g!L?g@gwc?@g;éfh@gK!Q@g,@M@gZv@gr/%A@r   r   r   r   r    r*   r   r>   r   r             "   !   &   '   #   %   $   ,      r         r               r6   (   -   .   r   r   r?                        /   1   +   0   *   )   5   9   3   4   8   ;   6   7   :   rY   r   )r9   g9'%?gΖF?gx?g*?r   r   )r"   rK   r   rI   rU   r   rn   r#   Zpredecessor_r   rl   rm   r$   where)
Zr1Zo1p1clust1re   Zr2Zo2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dd	dd
g d S )Nr   r6   r   r   r   r   r   r   r   r   Fr2   r|   r   )r<   r~   )r"   rC   rD   rE   rF   rG   r   rI   r   sortuniquerJ   )	rL   rM   rN   rO   rP   rQ   rR   rU   rW   r'   r'   r(   test_extract_dbscan  s    r   rp   c              	   C   s   t d d d j|dd}t|dd}| r2t|n|}t & tdt t	ddd	d

|}W 5 Q R X t	dddd

|}t|j|j t|j|j d S )Nr   Fr2   rb   r   ignorer   ZbruteZprecomputed)r9   	algorithmrd   )rU   rG   r	   r   rg   r   r   r   r   r   rI   r   rl   r   rJ   )rp   rL   r   distsr   r   r'   r'   r(   test_precomputed_dists$  s    
r   )CZnumpyr"   rt   Zscipyr   r   Zsklearn.datasetsr   Zsklearn.clusterr   Zsklearn.cluster._opticsr   r   Zsklearn.exceptionsr   Zsklearn.metrics.clusterr   Zsklearn.metrics.pairwiser	   r
   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   Zsklearn.cluster.tests.commonr   rC   rD   rM   rN   rE   rO   rP   rQ   rR   rS   rT   rF   rU   markZparametrizerK   r)   r+   r0   rX   r`   rq   rx   r   r   r   r   r   r   r   r   ro   r]   r   r   r   r   r   r   r'   r'   r'   r(   <module>   s   	

	

$$**	
9


   