o
    &ѹg"                     @   s  d Z ddlZddl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mZ dd	lmZ d
d Zdd Zdd Zdd Zejde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$ Z#d%d& Z$d'd( Z%d)d* Z&dS )+z+
Tests for the birch clustering algorithm.
    N)AgglomerativeClusteringBirch)generate_clustered_data)
make_blobs)ConvergenceWarning)pairwise_distances_argminv_measure_score)assert_allcloseassert_array_equal)CSR_CONTAINERSc                 C   s   t d| d\}}|j|dd}t }|| tdd |jjD }tdd | D }||jd ks6J ||jd ks?J d S )	N
   	n_samplesrandom_stateFcopyc                 S   s   g | ]}|j qS  )
n_samples_).0scr   r   d/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/sklearn/cluster/tests/test_birch.py
<listcomp>   s    z/test_n_samples_leaves_roots.<locals>.<listcomp>c                 S   s   g | ]}|j D ]}|jqqS r   )subclusters_r   )r   Zleafr   r   r   r   r      s    r   )	r   astyper   fitsumroot_r   Z_get_leavesshape)global_random_seedglobal_dtypeXybrcZn_samples_rootZn_samples_leavesr   r   r   test_n_samples_leaves_roots   s   
r#   c                 C   s   t d| d\}}|j|dd}tdd}|| td d}||d d  ||dd   t|j|j |jdd |d  t|j	|j	 d S )Nd   r   Fr      
n_clusters2   )
r   r   r   r   partial_fitr	   subcluster_centers_Z
set_paramsr
   subcluster_labels_)r   r   r    r!   r"   Zbrc_partialr   r   r   test_partial_fit   s   



r,   c           	      C   s   t j| }tdddd}|j|dd}t d}|| ||d d f }tddd	}|| |j	j
|ks9J t|j|| |j	}|jt|| }tt||jd d S )
Nr%   r   )r'   
n_featuresZn_samples_per_clusterFr         g      ?r'   	threshold)nprandomZRandomStater   r   Zarangeshuffler   r   r*   dtyper
   labels_Zpredictr+   r   r	   r   )	r   r   rngr    Zshuffle_indicesZ	X_shuffler"   Z	centroidsZnearest_centroidr   r   r   test_birch_predict1   s   


r8   c                 C   s   t dd| d\}}|j|dd}tdd}|| t|jdks#J tt|jdks/J t	dd}t|d}|| t
|j|j t
|j|j tdd}tt || W d    d S 1 sgw   Y  d S )	Nr$   r   r   Zcentersr   Fr   r&   g     @)r1   )r   r   r   r   lenr*   r2   uniquer6   r   r
   r+   pytestwarnsr   )r   r   r    r!   Zbrc1gcZbrc2Zbrc4r   r   r   test_n_clustersI   s   





"r?   csr_containerc                 C   s   t dd| d\}}|j|dd}tdd}|| ||}tdd}|| |jj|ks0J t|j|j t|j|j d S )Nr$   r   r9   Fr   r&   )	r   r   r   r   r*   r5   r
   r6   r	   )r   r   r@   r    r!   r"   ZcsrZ
brc_sparser   r   r   test_sparse_X`   s   



rA   c                  C   sv   t dd\} }tdd}|| | d}tjt|d || d d dgf | W d    d S 1 s4w   Y  d S )Nr$   )r   r%   r&   z3X has 1 features, but Birch is expecting 2 featuresmatchr   )r   r   r)   r<   Zraises
ValueError)r    r!   r"   msgr   r   r   )test_partial_fit_second_call_error_checkss   s   
"rF   c                 C   s6   | j }|t|ksJ |D ]}|jrt|j| qd S )N)r   r:   Zchild_check_branching_factor)nodebranching_factorsubclustersZclusterr   r   r   rG      s   rG   c                 C   sl   t | d\}}|j|dd}d}td |dd}|| t|j| td|dd}|| t|j| d S )Nr   Fr   	   g{Gz?)r'   rI   r1   r%   )r   r   r   r   rG   r   )r   r   r    r!   rI   r"   r   r   r   test_branching_factor   s   

rM   c                 C   s<   | j j}|r|j}|D ]	}||jksJ q|j}|sdS dS )z&Use the leaf linked list for traversalN)Zdummy_leaf_Z
next_leaf_r   Zradius)Zbirch_instancer1   Zcurrent_leafrJ   r   r   r   r   check_threshold   s   rN   c                 C   sd   t dd| d\}}|j|dd}tdd d}|| t|d tdd d}|| t|d d S )	NP   r/   r9   Fr   g      ?)r1   r'   g      @)r   r   r   r   rN   )r   r   r    r!   r"   r   r   r   test_threshold   s   


rP   c                  C   s,   t dd\} }td}t|d|  d S )Nr   rK      r&   )r   r2   Zint64r   r   )r    _r'   r   r   r   test_birch_n_clusters_long_int   s   
rS   c                  C   sV   t dddd\} }tdd}||  |jjd }| }tdd t|D | dS )	z*Check `get_feature_names_out` for `Birch`.rO   r/   r   r   r-   r   r&   c                 S   s   g | ]}d | qS )Zbirchr   )r   ir   r   r   r      s    z*test_feature_names_out.<locals>.<listcomp>N)r   r   r   r*   r   Zget_feature_names_outr
   range)r    rR   r"   r'   Z	names_outr   r   r   test_feature_names_out   s   

rW   c                 C   sL   t dd| d\}}tddd}||}||tj}t||dd d S )NrO   r/   rT   g?r0   gư>)Zatol)r   r   Zfit_transformr   r2   float32r	   )r   r    rR   r"   ZY_64ZY_32r   r   r   "test_transform_match_across_dtypes   s
   
rY   c                 C   s@   t ddddd j| dd}tdd}||jj| ksJ d S )NrO   r/   r   rT   Fr   r&   )r   r   r   r   r*   r5   )r   r    r"   r   r   r   test_subcluster_dtype   s
   
rZ   c                  C   s   t j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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dgddggt jd} tdddd|  dS )zCheck that both subclusters are updated when a node a split, even when there are
    duplicated data points. Non-regression test for #23269.
    g@̙Hg\sGg%g44Tg}Thg\Fgzog/IwgY+ctEgBlCg}
gr'g_ guXgaeR^g	AX7g.^g|SAgkg^#g@cgi8K)r5   rQ   gh㈵>N)rI   r1   r'   )r2   arrayrX   r   r   )r    r   r   r   test_both_subclusters_updated   s4   r\   c                  C   s\   t dddd\} }tddd}tjtdd ||  W d    d S 1 s'w   Y  d S )	NrO   r/   r   rT   T)r'   r   z`copy` was deprecatedrB   )r   r   r<   r=   FutureWarningr   )r    rR   r"   r   r   r   test_birch_copy_deprecated   s
   "r^   )'__doc__Znumpyr2   r<   Zsklearn.clusterr   r   Zsklearn.cluster.tests.commonr   Zsklearn.datasetsr   Zsklearn.exceptionsr   Zsklearn.metricsr   r   Zsklearn.utils._testingr	   r
   Zsklearn.utils.fixesr   r#   r,   r8   r?   markZparametrizerA   rF   rG   rM   rN   rP   rS   rW   rY   rZ   r\   r^   r   r   r   r   <module>   s6    

	%