o
    ?Hh]                     @   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s&J d S )Nr   r   grq?r   r   nparrayr   )r   r   ratiosteep_downwardupwarde r+   a/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/sklearn/cluster/tests/test_optics.pytest_extend_downward      

r-   g @g@   gffffff@c                 C   sP   t | } | d d | dd   }|dk}|dk}t||dd}||ks&J d S )Nr   r   g?r   r   r$   )r   r   r'   steep_upwarddownwardr*   r+   r+   r,   test_extend_upward2   r.   r2   )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   )r3   r4   r5   labelsr+   r+   r,   test_the_extract_xi_labelsE   s   

r9   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{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_xiT   sd   $<

(6
"ra   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sHJ t |t ddgddgg }|t| dk sbJ d S )Nr   r:   r   Fr;   2   r=   r?   r   )rB   r@   )r   r   c      皙?)r%   rL   rM   rN   rP   rO   r   r   rR   cluster_hierarchy_shapesumr&   len)rU   rV   rW   rX   rY   r^   r4   diffr+   r+   r,   test_cluster_hierarchy_   s   

 rk   zcsr_container, metric)N	minkowskic                 C      g | ]}|d fqS 	euclideanr+   .0	containerr+   r+   r,   
<listcomp>       rs   c                 C   s"  d}t |d}tddd| d}||d ur||n| tt|jtd|jv  }||ks0J |jjt|fks;J |jjj	dksDJ |j
jt|fksOJ |j
jj	d	ksXJ |jjt|fkscJ |jjj	d	kslJ |jjt|fkswJ |jjj	dksJ t|jttt|ksJ d S )
Nr   )
n_clustersg      >@r   r   )rD   rB   r@   metricr   if)r   r   rR   ri   setrS   intrg   dtypekindreachability_core_distances_	ordering_range)rv   csr_containerru   r^   r`   n_clusters_1r+   r+   r,   test_correct_number_of_clusters   s   
"r   c                  C   sZ   d} ddgg}t dddd}tjt| d || W d    d S 1 s&w   Y  d S )Nz#min_samples must be no greater thanr   g      ?r         ?)rD   rB   rC   match)r   pytestraises
ValueErrorrR   )msgr^   r`   r+   r+   r,   #test_minimum_number_of_sample_check   s   
"r   c                  C   s|   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    d S 1 s7w   Y  d S )Nz.Specify an epsilon smaller than 0.15. Got 0.3.r   r     rA   r   	n_samplescenterscluster_stdr>   g333333?dbscanr   r   rD   rE   epsrB   r   )r   r   r   r   r   rR   r   r   r^   labels_truer`   r+   r+   r,   test_bad_extract   s   
"r   c                  C   sz   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    d S 1 s6w   Y  d S )Nz6All reachability values are inf. Set a larger max_eps.r   r   r   rA   r   r   r   gQ?r   )rD   rB   r   )r   r   warnsUserWarningr   rR   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    d S 1 s)w   Y  d S )Nrogerstanimotor   r   r   sizer{   errorrv   )
r%   rL   randintboolwarningscatch_warningssimplefilterr   r   rR   )pairwise_metricr^   r+   r+   r,   $test_nowarn_if_metric_bool_data_bool   s   
"r   c                  C   sv   d} t jjddt jd}d|  }tjt|d}t| d| t	|dks)J W d    d S 1 s4w   Y  d S )	Nr   r   r   r   z-Data will be converted to boolean for metric r   r   r   )
r%   rL   r   int32r   r   r   r   rR   ri   )r   r^   r   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    d S 1 s;w   Y  d S )Nrl   r   r   r   r   r   )r%   rL   r   r   r   r   r   r   r   r   rR   )r   X_bool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s)J d S )Nr   r   r   rA   r   r   r   r   r   r   r   r   )r   r   rR   maxrS   )r   r^   r   r`   r+   r+   r,   test_close_extract  s   
r   r   )r   r         ?rB   )r   r   r?   )Nro   c                 C   rm   rn   r+   rp   r+   r+   r,   rs   &  rt   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spJ d S )Nr   r      rA   r   r   Fr;   r   )rB   rE   r   rv   )r   rB   )axisr   re   )r   rP   r   rR   r   r
   rS   minr%   rh   r   rg   round)r   rB   rv   rU   r   r   r^   r   opdbcontingencyagreedisagree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 tddddd|}t|j| W d    d S 1 sw   Y  d S )Nr   r   rF   r   rG   rH   r:   `   j   Fr;   r   r   r   r#   r@   rK   )rB   rD   rE   r@   r   zAll reachability valuesr   r   )r%   rO   rP   rQ   r   rR   r   rS   r   r   r   )rU   rX   rY   rZ   r^   r_   r`   r+   r+   r,   test_min_samples_edge_caseG  s   """r   rC      c                 C   s   t d d d j|dd}td| d|}t|j|jdk }|jr+t|| ks+J td| |j	d  d}|| t
|j|j d S )Nr   Fr;   rG   )rB   rC   r   r   )r^   rP   r   rR   r%   bincountrS   r   r   rg   r   )rC   rU   redXr`   cluster_sizes
clust_fracr+   r+   r,   test_min_cluster_size\  s   
r   r   c                 C   s   t ttd d}tjtdd |t W d    n1 s w   Y  t ttd dd}tjtdd || t W d    d S 1 sIw   Y  d S )Nr   )rC   zmust be no greater than the r   ro   )rC   rv   )r   ri   r^   r   r   r   rR   )r   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      rB   rD   r6   )r   rR   r   r}   r%   rT   r~   r   )Yr`   r+   r+   r,   test_processing_orderw  s
   r   c            
      C   sN  g 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(}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sJ qg 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d0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t j}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 ?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   rG   r   r             "   !   &   '   #   %   $   ,      r         r               r?   (   -   .   r   r   rH                        /   1   +   0   *   )   5   9   3   4   8   ;   6   7   :   rb   )<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   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rB   r   g9'%?gΖF?gx?g*?)<r   r   r   r   r   r   r   r#   r/   rG   r   r   rH   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   rb   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   rH   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%   rT   r   rR   r^   r   r   r&   predecessor_r   r}   r~   where)
r1o1p1clust1rw   r2o2p2clust2indexr+   r+   r,   test_compare_to_ELKI  s  	
 !"#$%&'()*+,-./0123456789:;<>>B 	
 !"#$%&'()*+,-./0123456789:;<>>>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   Fr;   r   r   )rE   r   r6   )r%   rL   rM   rN   rO   rP   r   rR   r   sortuniquerS   )	rU   rV   rW   rX   rY   rZ   r[   r^   r`   r+   r+   r,   test_extract_dbscan  s    r  c                 C   s   t d d d j| dd}t|dd}|d ur||n|}t  tdt tddd	d
|}W d    n1 s;w   Y  tdddd
|}t	|j
|j
 t|j|j d S )Nr   Fr;   ro   r   ignorer   bruteprecomputed)rB   	algorithmrv   )r^   rP   r   r   r   r   r	   r   rR   r   r}   r   rS   )rU   r   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 s#J | }t	dd
| |j|jks7J t| |  dS )zCheck 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 r7   r+   )rq   rowcolr+   r+   r,   	<genexpr>?  s    zKtest_optics_input_not_modified_precomputed_sparse_nodiag.<locals>.<genexpr>r  r   N)r%   rL   rM   randfill_diagonalallzipnonzeror<   r   rR   nnzr   toarray)r   r^   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#   r:   r   r   )r   r   r   r   r   r   r#   r   r   ro   )rB   rv   N)r%   r&   reshaper   rR   r   rS   )X_1reorderX_2optics_1optics_2r+   r+   r,   +test_optics_predecessor_correction_orderingH  s   r  )Er   numpyr%   r   sklearn.clusterr   r   sklearn.cluster._opticsr   r   sklearn.cluster.tests.commonr   sklearn.datasetsr   sklearn.exceptionsr   r	   sklearn.metrics.clusterr
   sklearn.metrics.pairwiser   sklearn.utilsr   sklearn.utils._testingr   r   sklearn.utils.fixesr   rL   rM   rV   rW   rN   rX   rY   rZ   r[   r\   r]   rO   r^   markparametrizerT   r-   r2   r9   ra   rk   r   r   r   r   r   r   r   r   r   r   r   rg   r   r   r   r   r  r	  r  r  r+   r+   r+   r,   <module>   s   


	

	
""
	9



   

