o
    ?Hh                     @   s  d dl Zd dlmZmZmZmZmZ d dlZd dlm	Z
 d dlZd dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d d	l2m3Z3 d
dl4m5Z5 zd dl6Z6e67d d dl8m9Z: dZ;W n e<y   dZ;Y nw e.ej=>dgZ?ej=j@Z@G dd dZAe@ddG dd dZBe@ddG dd dZCe@ddG dd dZDG dd dZEe@ddG dd dZFe@ddG dd dZGe@ddd G d!d" d"ZHe@ddG d#d$ d$ZIe@ddG d%d& d&ZJG d'd( d(ZKe@ddG d)d* d*ZLe@ddG d+d, d,ZMe@ddG d-d. d.ZNe@ddG d/d0 d0ZOG d1d2 d2ZPG d3d4 d4ZQe@ddG d5d6 d6ZRd7d8 ZSd9efd:d;ZTej=jUe@ddd<d= ZVd>d? ZWe@ddd@dA ZXe@dddBdC ZYe@ddDd dEdF ZZe@dddGdH Z[e@ddId dJdK Z\e@dddLdM Z]dS )N    N)assert_allcloseassert_equalassert_array_equalassert_assert_warns)raises)ClusterWarninglinkagefrom_mlab_linkageto_mlab_linkagenum_obs_linkageinconsistentcophenetfclusterdatafclusteris_isomorphicsingleleaders
correspondis_monotonicmaxdistsmaxinconstsmaxRstatis_valid_linkageis_valid_imto_treeleaves_list
dendrogramset_link_color_palettecut_treeoptimal_leaf_ordering_order_cluster_tree
_hierarchy_LINKAGE_METHODS)pdist)Heap)array_api_compatible)xp_assert_closexp_assert_equalLock   )hierarchy_test_dataAggTFskip_xp_backendsc                   @   s   e Zd Zedddd Zedddd Zedddd Zd	d
 Zedddd Zdd Z	edddd Z
edddd ZdS )TestLinkageTcpu_onlyc                 C   s(   | |jgdgd  }ttt| d S )N           )asarraynanassert_raises
ValueErrorr	   selfxpy r<   b/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/scipy/cluster/tests/test_hierarchy.py3test_linkage_non_finite_elements_in_distance_matrixN   s   z?TestLinkage.test_linkage_non_finite_elements_in_distance_matrixc                 C   s   | d}ttt| d S )Nr   )zerosr6   r7   r	   r8   r<   r<   r=   "test_linkage_empty_distance_matrixU   s   
z.TestLinkage.test_linkage_empty_distance_matrixc                 C      dD ]}|  || qd S )N)r   completeaverageweighted)check_linkage_tdistr9   r:   methodr<   r<   r=   test_linkage_tdist[      zTestLinkage.test_linkage_tdistc                 C   s8   t |tj|}ttd| }t|||dd d S )Nlinkage_ytdist_绽|=atolr	   r4   r,   ytdistgetattrr'   )r9   rH   r:   Z	expectedZr<   r<   r=   rF   `   s   zTestLinkage.check_linkage_tdistc                 C   rB   )N)centroidmedianward)check_linkage_qrG   r<   r<   r=   test_linkage_Xf   rJ   zTestLinkage.test_linkage_Xc                 C   sp   t |tj|}ttd| }t|||dd tjjj	tjdd}t |||}t|||dd d S )N
linkage_X_ư>rM   	euclidean)metric)
r	   r4   r,   XrQ   r'   scipyspatialdistancer$   )r9   rH   r:   rR   rS   r;   r<   r<   r=   rW   k   s   zTestLinkage.check_linkage_qc           
      C   sn   t jd}d}||d}t|}t D ]\}}t|||}t|	||}	t
|	|	|ddd qd S )Nr         g+=V瞯<)rtolrN   )nprandomRandomStaterandr$   r#   itemsr"   r	   r4   r'   )
r9   r:   rngnr]   drH   code	Z_trivialrR   r<   r<   r=   test_compare_with_trivialv   s   z%TestLinkage.test_compare_with_trivialc                 C   s6   t |tjdd}ttd}t|||dd d S )NT)optimal_orderinglinkage_ytdist_single_olorL   rM   rO   )r9   r:   rR   rS   r<   r<   r=   test_optimal_leaf_ordering   s   
z&TestLinkage.test_optimal_leaf_orderingN)__name__
__module____qualname__r.   r>   rA   rI   rF   rX   rW   ro   rr   r<   r<   r<   r=   r/   L   s    




r/   r0   c                   @   s   e Zd Zeg dg dgeg dg dgeg dg dgeg dg dgeg dg dgeg dg dgeg dg dgdZdd Zd	d
 ZdS )TestLinkageTies)r   r+   'e?rb   )rb      rw   rx   )rb   rx   g'e@rx   )rb   rx   gev @rx   )rb   rx   g@rx   r   rC   rD   rE   rT   rU   rV   c                 C   rB   Nry   )check_linkage_tiesrG   r<   r<   r=   test_linkage_ties      z!TestLinkageTies.test_linkage_tiesc                 C   sJ   | ddgddgddgg}t||d}| j| }t|| |dd d S )Nr   r+   rH   rZ   rM   )r4   r	   _expectationsr'   )r9   rH   r:   r]   rR   rS   r<   r<   r=   r{      s   
z"TestLinkageTies.check_linkage_tiesN)rs   rt   ru   re   arrayr   r|   r{   r<   r<   r<   r=   rv      s2    






rv   c                   @   s   e Zd Zdd Zdd ZdS )TestInconsistentc                 C   s   t jD ]}| || qd S N)r,   inconsistent_ytdistcheck_inconsistent_tdist)r9   r:   depthr<   r<   r=   test_inconsistent_tdist   s   
z(TestInconsistent.test_inconsistent_tdistc                 C   s,   | tj}tt||| tj|  d S r   )r4   r,   linkage_ytdist_singler'   r   r   )r9   r   r:   rR   r<   r<   r=   r      s   
z)TestInconsistent.check_inconsistent_tdistN)rs   rt   ru   r   r   r<   r<   r<   r=   r      s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestCopheneticDistancec                 C   s@   | g d}| tj}t|}t||j ||jddd d S )N  '     r   r   r   r   r   r   r   r         r   r   dtyperL   rM   )r4   r,   r   r   r'   float64)r9   r:   	expectedMrR   Mr<   r<   r=   test_linkage_cophenet_tdist_Z   s   z4TestCopheneticDistance.test_linkage_cophenet_tdist_Zc                 C   sj   | tj}t|| tj\}}|j g d|jd}|j d|jdd }t||dd t||dd d S )Nr   r   g*ɻ2Qz?r<   rL   rM   )r4   r,   r   r   rP   r   r'   )r9   r:   rR   cr   r   	expectedcr<   r<   r=   test_linkage_cophenet_tdist_Z_Y   s   
z6TestCopheneticDistance.test_linkage_cophenet_tdist_Z_Yc                 C   s   g dg dg dg dg dg dg dg dg d	g d
g dg}t jtdd t|| W d    d S 1 s=w   Y  d S )N)r2         ?r          @)r         (@r         @)r         @r   r   )      @g      ,@r   r   )      @      @r   r   )       @g      0@r   r   )      "@      $@r   r   )g      &@g      2@r   r   )g      *@      .@r   r   )g      1@g      4@r   g      @@)g      3@g      5@r   r   zexcessive observationsmatch)pytestr   r7   r   r4   )r9   r:   arrr<   r<   r=   test_gh_22183   s   "z$TestCopheneticDistance.test_gh_22183N)rs   rt   ru   r   r   r   r<   r<   r<   r=   r      s    
r   c                   @   s8   e Zd Zdd Zedddd Zedddd Zd	S )
TestMLabLinkageConversionc                 C   s0   |j g |jd}tt|| tt|| d S )Nr   )r4   r   r(   r
   r   )r9   r:   r]   r<   r<   r=   "test_mlab_linkage_conversion_empty   s   z<TestMLabLinkageConversion.test_mlab_linkage_conversion_emptyTr0   c                 C   s`   | g dg}| g dg}tt||j ||jddd tt||j ||jddd d S )N)r2   r   r   r   r+   rb   rx   r   rc   rd   )r4   r'   r
   r   r   )r9   r:   rR   Zmr<   r<   r=   'test_mlab_linkage_conversion_single_row   s   
zATestMLabLinkageConversion.test_mlab_linkage_conversion_single_rowc                 C   s   | g dg dg dg dg dg}|j g dg dg dg d	g d
g|jd}tt||dd tt||j ||jddd d S )N)rx      r   )   r3   r   )r+      r   )rb   	   r   )   
   r   )r   r        @a@r   )r   r        `k@r   )r2   r        o@r   )r   r        p@r   )r   r        pr@r   r   rc   r   )r4   r   r'   r
   r   )r9   r:   r   rR   r<   r<   r=   *test_mlab_linkage_conversion_multiple_rows   s   

zDTestMLabLinkageConversion.test_mlab_linkage_conversion_multiple_rowsN)rs   rt   ru   r   r.   r   r   r<   r<   r<   r=   r      s    
	r   c                   @   sL   e Z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 )TestFclusterc                 C   R   t jD ]	}| |d| qt jD ]	}| |d| qt jD ]	}| |d| qd S Nr   r`   maxclust)r,   fcluster_inconsistentcheck_fclusterdatafcluster_distancefcluster_maxclustr9   r:   tr<   r<   r=   test_fclusterdata     


zTestFcluster.test_fclusterdatac                 C   sD   | ttd| | }| tj}t|||d}tt|| d S N	fcluster_	criterionr   )r4   rQ   r,   Q_Xr   r   r   )r9   r   r   r:   	expectedTr]   Tr<   r<   r=   r     s   zTestFcluster.check_fclusterdatac                 C   r   r   )r,   r   check_fclusterr   r   r   r<   r<   r=   test_fcluster  r   zTestFcluster.test_fclusterc                 C   sH   | ttd| | }t| tj}t|||d}tt|| d S r   )r4   rQ   r,   r   r   r   r   r   )r9   r   r   r:   r   rR   r   r<   r<   r=   r     s   zTestFcluster.check_fclusterc                 C   s4   t jD ]}| || qt jD ]}| || qd S r   )r,   r   check_fcluster_monocritr    check_fcluster_maxclust_monocritr   r<   r<   r=   test_fcluster_monocrit"  s
   

z#TestFcluster.test_fcluster_monocritc                 C   F   | tj| }t| tj}t||dt|d}tt|| d S )Nmonocritr   r   )	r4   r,   r   r   r   r   r   r   r   r9   r   r:   r   rR   r   r<   r<   r=   r   (     z$TestFcluster.check_fcluster_monocritc                 C   r   )Nmaxclust_monocritr   )	r4   r,   r   r   r   r   r   r   r   r   r<   r<   r=   r   .  r   z-TestFcluster.check_fcluster_maxclust_monocritc                 C   s   | dgdgdgg}t|}tt|ddd| g d tt|ddd| g d tt|d	dd| g d
 tt|ddd| g d
 d S )Nr+   r   r3   r   )r   r   r+   r+   r+   rb   )rb   r+   r+   rx   r   )r4   r   r   r   r9   r:   r;   rR   r<   r<   r=   test_fcluster_maxclust_gh_126514  s   z,TestFcluster.test_fcluster_maxclust_gh_12651N)rs   rt   ru   r   r   r   r   r   r   r   r   r<   r<   r<   r=   r     s    r   c                   @   s   e Zd Zdd ZdS )TestLeadersc                 C   s   t j}t|}||}t|}t|ddd}|g d|g df}|j||jd}t||}tt	
|t	
|dd d S )	Nr   rx   r   )5   7   8   )rb   rx   r+   r   rc   r   )r,   r   r$   r4   r	   r   int32r   r   re   concatenate)r9   r:   r]   YrR   r   LrightLr<   r<   r=   test_leaders_singleD  s   

zTestLeaders.test_leaders_singleN)rs   rt   ru   r   r<   r<   r<   r=   r   A  s    r   z+`is_isomorphic` only supports NumPy backendnp_onlyreasonc                   @   sr   e Zd Zeddd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dZdS )TestIsIsomorphicTz,array-likes only supported for NumPy backendr   c                 C   s(   t g dg dsJ t g g sJ d S Nr   )rb   rb   rb   )r   )r9   r:   r<   r<   r=   test_array_likeU  s   z TestIsIsomorphic.test_array_likec                 C   <   | g d}| g d}t||sJ t||sJ d S r   r4   r   r9   r:   abr<   r<   r=   test_is_isomorphic_1[     z%TestIsIsomorphic.test_is_isomorphic_1c                 C   r   )N)r+   r   r+   )rb   rx   rb   r   r   r<   r<   r=   test_is_isomorphic_2b  r   z%TestIsIsomorphic.test_is_isomorphic_2c                 C   s&   | g }| g }t||sJ d S r   r   r   r<   r<   r=   test_is_isomorphic_3i  s   

z%TestIsIsomorphic.test_is_isomorphic_3c                 C   r   )Nr   )r+   rx   rb   r   r   r<   r<   r=   test_is_isomorphic_4Ao     z&TestIsIsomorphic.test_is_isomorphic_4Ac                 C   sD   | g d}| g d}t||du sJ t||du s J d S )N)r+   rb   rx   rx   )r+   rx   rb   rx   Fr   r   r<   r<   r=   test_is_isomorphic_4Bw  s   z&TestIsIsomorphic.test_is_isomorphic_4Bc                 C   r   )N)r   rb   rx   )r   rx   rb   r   r   r<   r<   r=   test_is_isomorphic_4C  r   z&TestIsIsomorphic.test_is_isomorphic_4Cc                 C   s   dD ]
}| j d||d qd S )Nrb   rx   r3     r:   help_is_isomorphic_randpermr9   r:   ncr<   r<   r=   test_is_isomorphic_5  s   z%TestIsIsomorphic.test_is_isomorphic_5c                 C   s"   dD ]}| j d|dd|d qd S )Nr   r   Tr3   r   r   r   r<   r<   r=   test_is_isomorphic_6  s   z%TestIsIsomorphic.test_is_isomorphic_6c                 C   s.   | g d}| g d}t||rJ d S )Nr   r   r   r   r<   r<   r=   test_is_isomorphic_7  s   z%TestIsIsomorphic.test_is_isomorphic_7Fr   c                C   s   t dD ]l}tj|| t}tj|jtd}tj|}	t d|j	d D ]
}
|	||
  ||
< q'|rRtj|}||d|   d7  < ||d|   |;  < |
|}|
|}t||| ksfJ t||| kspJ qd S )Nrx   r   r   r+   )rangere   rf   rh   astypeintr@   sizepermutationshaper4   r   )r9   nobs	nclustersnonisonerrorsr:   kr   r   PiQr<   r<   r=   r     s   

z,TestIsIsomorphic.help_is_isomorphic_randpermN)Fr   )rs   rt   ru   r.   r   r   r   r   r   r   r   r  r  r  r   r<   r<   r<   r=   r   Q  s    
r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zeddddd Z	eddddd Z
eddddd Zeddddd ZdS )TestIsValidLinkagec                 C   $   dD ]\}}}|  |||| qd S N))rb   r3   F)rb   rx   F)r+   r   T)rb   r   T)#check_is_valid_linkage_various_sizer9   r:   nrowncolvalidr<   r<   r=   "test_is_valid_linkage_various_size     z5TestIsValidLinkage.test_is_valid_linkage_various_sizec                 C   \   |j g dg dg|jd}|d |d |f }tt||k |s,ttt|dd d S d S N)r   r+   r   rb   r3   )rx   rb   r   rx   rx   r   Tthrow)r4   r   r   r   r6   r7   )r9   r  r  r  r:   rR   r<   r<   r=   r       
z6TestIsValidLinkage.check_is_valid_linkage_various_sizec                 C   @   |j g dg dg|jd}tt|du  ttt|dd d S Nr   r+   r   rb   rx   rb   r   rx   r   FTr  )r4   int64r   r   r6   	TypeErrorr9   r:   rR   r<   r<   r=   test_is_valid_linkage_int_type     
z1TestIsValidLinkage.test_is_valid_linkage_int_typec                 C   4   |j d|jd}tt|du  ttt|dd d S Nr   r   r   FTr  )r@   r   r   r   r6   r7   r'  r<   r<   r=   test_is_valid_linkage_empty     z.TestIsValidLinkage.test_is_valid_linkage_emptyc                 C   sP   t dddD ]}tj||d  d }||}t|}tt|du  qd S Nr      rx   r+   rb   T)r  re   rf   rh   r4   r	   r   r   r9   r:   r  r;   rR   r<   r<   r=   test_is_valid_linkage_4_and_up  s   
z1TestIsValidLinkage.test_is_valid_linkage_4_and_up	jax.numpy)jax arrays do not support item assignmentr   c                 C   sp   t dddD ]/}tj||d  d }||}t|}d||d df< tt|du  tt	t|d	d
 qd S )Nr   r0  rx   r+   rb   r   FTr  
r  re   rf   rh   r4   r	   r   r   r6   r7   r1  r<   r<   r=   -test_is_valid_linkage_4_and_up_neg_index_left     
z@TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_leftc                 C   sp   t dddD ]/}tj||d  d }||}t|}d||d df< tt|du  tt	t|dd	 qd S 
Nr   r0  rx   r+   rb   r6  FTr  r7  r1  r<   r<   r=   .test_is_valid_linkage_4_and_up_neg_index_right  r9  zATestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_rightc                 C   sp   t dddD ]/}tj||d  d }||}t|}d||d df< tt|du  tt	t|dd	 qd S 
Nr   r0  rx   r+   rb   g      FTr  r7  r1  r<   r<   r=   'test_is_valid_linkage_4_and_up_neg_dist  r9  z:TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_distc                 C   sp   t dddD ]/}tj||d  d }||}t|}d||d df< tt|du  tt	t|dd	 qd S r:  r7  r1  r<   r<   r=   )test_is_valid_linkage_4_and_up_neg_counts  r9  z<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_countsN)rs   rt   ru   r  r  r(  r-  r2  r.   r8  r;  r=  r>  r<   r<   r<   r=   r    s,    		


r  c                   @   sp   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zeddddd Z	eddddd Z
eddddd ZdS )TestIsValidInconsistentc                 C   r!  r"  )r4   r%  r   r   r6   r&  r9   r:   Rr<   r<   r=   test_is_valid_im_int_type  r)  z1TestIsValidInconsistent.test_is_valid_im_int_typec                 C   r  r  )check_is_valid_im_various_sizer  r<   r<   r=   test_is_valid_im_various_size  r  z5TestIsValidInconsistent.test_is_valid_im_various_sizec                 C   r  r  )r4   r   r   r   r6   r7   )r9   r  r  r  r:   rA  r<   r<   r=   rC    r   z6TestIsValidInconsistent.check_is_valid_im_various_sizec                 C   r*  r+  )r@   r   r   r   r6   r7   r@  r<   r<   r=   test_is_valid_im_empty   r.  z.TestIsValidInconsistent.test_is_valid_im_emptyc                 C   sX   t dddD ]#}tj||d  d }||}t|}t|}tt|du  qd S r/  )	r  re   rf   rh   r4   r	   r   r   r   r9   r:   r  r;   rR   rA  r<   r<   r=   test_is_valid_im_4_and_up&  s   
z1TestIsValidInconsistent.test_is_valid_im_4_and_upr3  r4  r5  c                 C   sx   t dddD ]3}tj||d  d }||}t|}t|}d||d df< tt|du  t	t
t|d	d
 qd S )Nr   r0  rx   r+   rb          r   FTr  r  re   rf   rh   r4   r	   r   r   r   r6   r7   rF  r<   r<   r=   (test_is_valid_im_4_and_up_neg_index_left0     
z@TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_leftc                 C   sx   t dddD ]3}tj||d  d }||}t|}t|}d||d df< tt|du  t	t
t|dd	 qd S )
Nr   r0  rx   r+   rb   rH  FTr  rI  rF  r<   r<   r=   )test_is_valid_im_4_and_up_neg_index_right=  rK  zATestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_rightc                 C   sx   t dddD ]3}tj||d  d }||}t|}t|}d||d df< tt|du  t	t
t|dd	 qd S r<  rI  rF  r<   r<   r=   "test_is_valid_im_4_and_up_neg_distJ  rK  z:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_distN)rs   rt   ru   rB  rD  rC  rE  rG  r.   rJ  rL  rM  r<   r<   r<   r=   r?    s    	





r?  c                   @   s@   e Zd Zedddd Zdd Zdd Zeddd	d
 ZdS )TestNumObsLinkageTr0   c                 C       |j d|jd}ttt| d S Nr,  r   )r@   r   r6   r7   r   r'  r<   r<   r=   test_num_obs_linkage_emptyZ  s   z,TestNumObsLinkage.test_num_obs_linkage_emptyc                 C   s(   |j g dg|jd}tt|d d S )Nr#  r   rb   r4   r   r   r   r'  r<   r<   r=   test_num_obs_linkage_1x4`  s   z*TestNumObsLinkage.test_num_obs_linkage_1x4c                 C   s.   |j g dg dg|jd}tt|d d S )Nr#  r$  r   rx   rR  r'  r<   r<   r=   test_num_obs_linkage_2x4e  s   
z*TestNumObsLinkage.test_num_obs_linkage_2x4c                 C   sN   t dddD ]}tj||d  d }||}t|}tt|| qd S )Nr   r0  rx   r+   rb   )r  re   rf   rh   r4   r	   r   r   r1  r<   r<   r=   test_num_obs_linkage_4_and_upk  s   
z/TestNumObsLinkage.test_num_obs_linkage_4_and_upN)rs   rt   ru   r.   rQ  rS  rT  rU  r<   r<   r<   r=   rN  X  s    
rN  c                   @   4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestLeavesListc                 C   s8   |j g dg|jd}t| tt|ddgdd d S )Nr#  r   r   r+   rc   r   r4   r   r   r   r   r'  r<   r<   r=   test_leaves_list_1x4y  s   z#TestLeavesList.test_leaves_list_1x4c                 C   s>   |j g dg dg|jd}t| tt|g ddd d S )Nr#  r$  r   )r   r+   rb   rc   r   rX  r'  r<   r<   r=   test_leaves_list_2x4  s   
z#TestLeavesList.test_leaves_list_2x4c                 C   rB   rz   )check_leaves_list_QrG   r<   r<   r=   test_leaves_list_Q  r}   z!TestLeavesList.test_leaves_list_Qc                 C   s8   | tj}t||}t|}t| t|dd d S )Nrc   r   )r4   r,   r   r	   r   r   	pre_orderr   )r9   rH   r:   r]   rR   noder<   r<   r=   r[    s   
z"TestLeavesList.check_leaves_list_Qc                 C   sH   | tj}t|d}t|}t| |  |   dd d S )Nr   rc   r   )	r4   r,   r   r	   r   r   r]  get_left	get_right)r9   r:   r]   rR   r^  r<   r<   r=   test_Q_subtree_pre_order  s   


z'TestLeavesList.test_Q_subtree_pre_orderN)rs   rt   ru   rY  rZ  r\  r[  ra  r<   r<   r<   r=   rW  v  s    rW  c                   @   rV  )TestCorrespondc                 C   s2   |j d|jd}|j d|jd}ttt|| d S )Nr?   r   r,  )r@   r   r6   r7   r   r   r<   r<   r=   test_correspond_empty  s   z$TestCorrespond.test_correspond_emptyc                 C   s   t ddD ]}tj||d  d }||}t|}tt|| qt dddD ]}tj||d  d }||}t|}tt|| q*d S )Nrb   r   r+   r0  rx   )r  re   rf   rh   r4   r	   r   r   r1  r<   r<   r=   test_correspond_2_and_up  s   

z'TestCorrespond.test_correspond_2_and_upc                 C   s   t tt tddt tddt tt tddt tdd D ]<\}}tj||d  d }tj||d  d }||}||}t|}t|}t||rWJ t||r^J q"d S )Nrb   r   rx   r3   r+   	listzipr  re   rf   rh   r4   r	   r   r9   r:   r  jr;   y2rR   Z2r<   r<   r=   test_correspond_4_and_up       

z'TestCorrespond.test_correspond_4_and_upc                 C   s   t tt tddt tddt tt tddt tdd D ]<\}}tj||d  d }tj||d  d }||}||}t|}t|}t||rWJ t||r^J q"d S )Nrb   r         r+   re  rh  r<   r<   r=   test_correspond_4_and_up_2  rm  z)TestCorrespond.test_correspond_4_and_up_2c                 C   sJ   t ddD ]}tj|d}t|}||}t|}tt|| qd S )Nrb   r   r   )	r  re   rf   rh   r$   r4   r	   r   r   )r9   r:   rk   r]   r   rR   r<   r<   r=   !test_num_obs_linkage_multi_matrix  s   
z0TestCorrespond.test_num_obs_linkage_multi_matrixN)rs   rt   ru   rc  rd  rl  rp  rq  r<   r<   r<   r=   rb    s    rb  c                   @   sp   e Z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eddddd Zdd ZdS )TestIsMonotonicc                 C   rO  rP  )r@   r   r6   r7   r   r'  r<   r<   r=   test_is_monotonic_empty     z'TestIsMonotonic.test_is_monotonic_emptyc                 C   s&   |j g dg|jd}t|sJ d S )Nr   r+   333333?rb   r   r4   r   r   r'  r<   r<   r=   test_is_monotonic_1x4  s   z%TestIsMonotonic.test_is_monotonic_1x4c                 C   s,   |j g dg dg|jd}t|sJ d S )Nru  )rb   rx   皙?rx   r   rw  r'  r<   r<   r=   test_is_monotonic_2x4_T     
z'TestIsMonotonic.test_is_monotonic_2x4_Tc                 C   s,   |j g dg dg|jd}t|rJ d S )N)r   r+   ry  rb   )rb   rx   rv  rx   r   rw  r'  r<   r<   r=   test_is_monotonic_2x4_F  r{  z'TestIsMonotonic.test_is_monotonic_2x4_Fc                 C   s2   |j g dg dg dg|jd}t|sJ d S )Nru  rb   rx   ry  rb   r   r3   g333333?r   r   rw  r'  r<   r<   r=   test_is_monotonic_3x4_T     
z'TestIsMonotonic.test_is_monotonic_3x4_Tc                 C   2   |j g dg dg dg|jd}t|rJ d S )Nru  )rb   rx   皙?rb   r~  r   rw  r'  r<   r<   r=   test_is_monotonic_3x4_F1  r  z(TestIsMonotonic.test_is_monotonic_3x4_F1c                 C   r  )N)r   r+   g?rb   r}  r~  r   rw  r'  r<   r<   r=   test_is_monotonic_3x4_F2   r  z(TestIsMonotonic.test_is_monotonic_3x4_F2c                 C   r  )Nru  r}  )r   r3   r  r   r   rw  r'  r<   r<   r=   test_is_monotonic_3x4_F3  r  z(TestIsMonotonic.test_is_monotonic_3x4_F3c                 C   s"   t |tjd}t|sJ d S Nr   r	   r4   r,   rP   r   r'  r<   r<   r=    test_is_monotonic_tdist_linkage1  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage1r3  r4  r5  c                 C   s*   t |tjd}d|d< t|rJ d S )Nr   r2   )rb   rb   r  r'  r<   r<   r=    test_is_monotonic_tdist_linkage2  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage2c                 C   s&   | tj}t|d}t|sJ d S r  )r4   r,   r   r	   r   )r9   r:   r]   rR   r<   r<   r=   test_is_monotonic_Q_linkage  s   
z+TestIsMonotonic.test_is_monotonic_Q_linkageN)rs   rt   ru   rs  rx  rz  r|  r  r  r  r  r  r.   r  r  r<   r<   r<   r=   rr    s    

rr  c                   @   sD   e Zd Zdd Zeddddd Zeddddd	 Zd
d ZdS )TestMaxDistsc                 C   rO  rP  )r@   r   r6   r7   r   r'  r<   r<   r=   test_maxdists_empty_linkage'  rt  z(TestMaxDists.test_maxdists_empty_linkager3  r4  r5  c                 C   s:   |j g dg|jd}t|}t||}t||dd d S )Nr   r+   rv  r   r   rc   rM   )r4   r   r   calculate_maximum_distancesr'   )r9   r:   rR   MD
expectedMDr<   r<   r=   !test_maxdists_one_cluster_linkage,  s   
z.TestMaxDists.test_maxdists_one_cluster_linkagec                 C   rB   Nr   rC   rV   rT   rU   )check_maxdists_Q_linkagerG   r<   r<   r=   test_maxdists_Q_linkage4  rJ   z$TestMaxDists.test_maxdists_Q_linkagec                 C   s:   | tj}t||}t|}t||}t||dd d S )Nrc   rM   )r4   r,   r   r	   r   r  r'   )r9   rH   r:   r]   rR   r  r  r<   r<   r=   r  9  s
   

z%TestMaxDists.check_maxdists_Q_linkageN)rs   rt   ru   r  r.   r  r  r  r<   r<   r<   r=   r  $  s    



r  c                   @   sZ   e Zd Zedddd Zdd Zedddd	d
d Zedddd	dd Zdd ZdS )TestMaxInconstsTr0   c                 C   s2   |j d|jd}|j d|jd}ttt|| d S rP  )r@   r   r6   r7   r   r9   r:   rR   rA  r<   r<   r=   test_maxinconsts_empty_linkageD  s   z.TestMaxInconsts.test_maxinconsts_empty_linkagec                 C   s@   |j g dg|jd}tjdd}| |}ttt|| d S Nr  r   rb   r   )r4   r   re   rf   rh   r6   r7   r   r  r<   r<   r=   test_maxinconsts_difrow_linkageK  s   
z/TestMaxInconsts.test_maxinconsts_difrow_linkager3  r4  r   r1   c                 C   sV   |j g dg|jd}|j g dg|jd}t||}t|||d}t||dd d S )Nr  r   r   r   r   rv  r   rc   rM   )r4   r   r   !calculate_maximum_inconsistenciesr'   )r9   r:   rR   rA  r  r  r<   r<   r=   $test_maxinconsts_one_cluster_linkageS  s
   
z4TestMaxInconsts.test_maxinconsts_one_cluster_linkagec                 C   rB   r  )check_maxinconsts_Q_linkagerG   r<   r<   r=   test_maxinconsts_Q_linkage]  s   z*TestMaxInconsts.test_maxinconsts_Q_linkagec                 C   sH   | tj}t||}t|}t||}t|||d}t||dd d S )Nr   rc   rM   )r4   r,   r   r	   r   r   r  r'   )r9   rH   r:   r]   rR   rA  r  r  r<   r<   r=   r  c  s   

z+TestMaxInconsts.check_maxinconsts_Q_linkageN)	rs   rt   ru   r.   r  r  r  r  r  r<   r<   r<   r=   r  B  s    


r  c                   @   s   e Zd Zdd Zdd Zedddd Zd	d
 Zdd Zdd Z	edddddd Z
dd Zedddddd Zdd ZdS )TestMaxRStatc                 C   rB   )N)gffffff
@r~   r   )check_maxRstat_invalid_indexr9   r:   r  r<   r<   r=   test_maxRstat_invalid_indexo  s   z(TestMaxRStat.test_maxRstat_invalid_indexc                 C   s^   |j g dg|jd}|j g dg|jd}t|tr%ttt||| d S ttt||| d S )Nr  r   r  )r4   r   
isinstancer  r6   r7   r   r&  r9   r  r:   rR   rA  r<   r<   r=   r  s  s
   
z)TestMaxRStat.check_maxRstat_invalid_indexTr0   c                 C      t dD ]}| || qd S Nr   )r  check_maxRstat_empty_linkager  r<   r<   r=   test_maxRstat_empty_linkage|  s   z(TestMaxRStat.test_maxRstat_empty_linkagec                 C   s4   |j d|jd}|j d|jd}ttt||| d S rP  )r@   r   r6   r7   r   r  r<   r<   r=   r    r.  z)TestMaxRStat.check_maxRstat_empty_linkagec                 C   r  r  )r  check_maxRstat_difrow_linkager  r<   r<   r=   test_maxRstat_difrow_linkage  s   z)TestMaxRStat.test_maxRstat_difrow_linkagec                 C   sB   |j g dg|jd}tjdd}| |}ttt||| d S r  )r4   r   re   rf   rh   r6   r7   r   r  r<   r<   r=   r    s   
z*TestMaxRStat.check_maxRstat_difrow_linkager3  r4  r  c                 C   r  r  )r  "check_maxRstat_one_cluster_linkager  r<   r<   r=   !test_maxRstat_one_cluster_linkage  s   z.TestMaxRStat.test_maxRstat_one_cluster_linkagec                 C   sX   |j g dg|jd}|j g dg|jd}t||d}t||d|}t||dd d S )Nr  r   r  r+   rc   rM   )r4   r   r   r  r'   )r9   r  r:   rR   rA  r  r  r<   r<   r=   r    s
   z/TestMaxRStat.check_maxRstat_one_cluster_linkagec                 C   s*   dD ]}t dD ]	}| ||| qqd S )Nr  r   )r  check_maxRstat_Q_linkage)r9   r:   rH   r  r<   r<   r=   test_maxRstat_Q_linkage  s
   z$TestMaxRStat.test_maxRstat_Q_linkagec           	      C   sJ   | tj}t||}t|}t||d}t||d|}t||dd d S )Nr+   rc   rM   )r4   r,   r   r	   r   r   r  r'   )	r9   rH   r  r:   r]   rR   rA  r  r  r<   r<   r=   r    s   
z%TestMaxRStat.check_maxRstat_Q_linkageN)rs   rt   ru   r  r  r.   r  r  r  r  r  r  r  r  r<   r<   r<   r=   r  m  s$    	


r  c                   @   s   e Zd Zdd Zdd Zdd Zejje	 ddd	d
 Z
edddejje	 dddd Zdd Zedddejje	 dddd Zejdd Zdd Zdd Zdd ZdS )TestDendrogramc                 C   s8   t |tjd}t|dd}|d }t|g d d S )Nr   Tno_plotleavesrb   r3   r+   r   rx   r   )r	   r4   r,   rP   r   r   )r9   r:   rR   rA  r  r<   r<   r=   $test_dendrogram_single_linkage_tdist  s   z3TestDendrogram.test_dendrogram_single_linkage_tdistc                 C   s&   t |tjd}ttt|dd d S )Nr   fooorientation)r	   r4   r,   rP   r6   r7   r   r'  r<   r<   r=   test_valid_orientation  s   z%TestDendrogram.test_valid_orientationc                 C   sL   t |tjd}g d}t|||dd}t||dd}||ks$J d S )Nr   )r+   rx   rb   r   r   r3   T)labelsr  )r	   r4   r,   rP   r   )r9   r:   rR   r  result1result2r<   r<   r=   test_labels_as_array_or_list  s
   z+TestDendrogram.test_labels_as_array_or_listzno matplotlibr5  c                 C   s   | g dg dg dg}t  tt}t|ttdd W d    n1 s,w   Y  dt	|j
v s:J tjtdd t|g d W d    n1 sRw   Y  t  d S )N)r   r+   r   r   )rb   rx   r   r3   )r   r3   r   r   d   )r  z.Dimensions of Z and labels must be consistent.r   )r4   pltfigurer   r   r7   r   rf  r  strvalueclose)r9   r:   linkexc_infor<   r<   r=   test_valid_label_size  s&   z$TestDendrogram.test_valid_label_sizetorchzFMPL 3.9.2 & torch DeprecationWarning from __array_wrap__ and NumPy 2.0c                 C   rB   )N)topbottomleftright)check_dendrogram_plot)r9   r:   r  r<   r<   r=   test_dendrogram_plot  s   z#TestDendrogram.test_dendrogram_plotc           
      C   s  t |tjd}g dg dg dg dg dg dgg dg d	g d
g dg dgg dg dg dd}t }|d}t|||d}t|d |d< t	|| t|||ddd |dv ri|
 d n| d }t	| d t	| d t|||dd |dv r|
 d n| d }t	| d t|||dd |dv r|
 d n| d }t	| d t  t||d}	t  t|	d |	d< t	|	| d S )Nr   )C1C0r  r  r  r2   r   r   r2   )r2   r   r   r2   )r2   r   r   r   r2   r   r   r   r   r   r   r   r   r   r   r   )     F@r       K@r  )     A@r        I@r  )      9@r       @E@r  )r   r        @@r  )251034r  )r  r  r  r  r  r  
color_listdcoordicoordivlr  leaves_color_list   )axr  r  ra   Z   )r  r  leaf_font_sizeleaf_rotation)r  r  r   )r  r  r  )r  r  r  r  )r	   r4   r,   rP   r  r  add_subplotr   re   r   get_xticklabelsget_yticklabelsget_rotationget_sizer  )
r9   r  r:   rR   expectedfigr  R1	testlabelR2r<   r<   r=   r    sj   




z$TestDendrogram.check_dendrogram_plotc              	   C   s   t |tjd}t|dddd}t  t|d |d< t|dgg dgg d	gd
dgddgddgd t|dddd}t  t|d |d< t|g dg dg dg dg dgg d	g dg dg dgg dg dg dd d S )Nr   rb   lastpT)show_contractedr  r  )r2   r   r   r2   r  (2)z(4)r   r   r  mtica)r  r  r  r  r  )r2   r   r   r2   r  r  )r  r  r  r  )r  r        D@r  )r   r        @@@r  )r  r  r  r  r  )rb   r3   r+   r   r   )r  r  r  r  r  )	r	   r4   r,   rP   r   r  r  re   r   r  r<   r<   r=   test_dendrogram_truncate_mode#  s:   
z,TestDendrogram.test_dendrogram_truncate_modec                 C   s   t  S r   r)   )r9   r<   r<   r=   dendrogram_lockG  s   zTestDendrogram.dendrogram_lockc                 C   s   t |tjd}|, tg d t|dddd}tg d |d }t|g d	 td  W d    d S 1 s:w   Y  d S )
Nr   )r   mr;   r  Tg   )r  above_threshold_colorcolor_threshold)r   rr   r  r;   r  r  )r   r  r   r   r   )r	   r4   r,   rP   r   r   r   )r9   r:   r  rR   rA  r  r<   r<   r=   test_dendrogram_colorsK  s   
"z%TestDendrogram.test_dendrogram_colorsc              	   C   sb   | g dg dg dg dg dg dg}t|d}t|dd}g d}|d	 }t|| d S )
Nr+   r   r   r   r   r+   r   rb   r   r   r+   r   r   Tr  r  r  r  r  C2r  r  r4   r	   r   r   r9   r:   xzrl   
exp_colorscolorsr<   r<   r=   %test_dendrogram_leaf_colors_zero_dist\     

z4TestDendrogram.test_dendrogram_leaf_colors_zero_distc              	   C   sb   | g dg dg dg dg dg dg}t|d}t|dd}g d	}|d
 }t|| d S )Nr  )r   r   g?r  r  r	  r   Tr  r
  r  r  r  r<   r<   r=   test_dendrogram_leaf_colorsk  r  z*TestDendrogram.test_dendrogram_leaf_colorsN)rs   rt   ru   r  r  r  r   markskipifhave_matplotlibr  r.   r  r  r  fixturer  r  r  r  r<   r<   r<   r=   r    s,    
>
r  c                 C   s   | j d d }|j|d f| jd}|d}td|d D ]G}d|d d < | |df }| |df }||krD||j||jd|  |d< ||krV||j||jd|  |d< | |df |d< ||||< q|S Nr   r+   r   )rx   r2   rb   )r	  r@   r   r  r4   r%  max)rR   r:   rk   Bqr  r  r  r<   r<   r=   r  {  s   
r  rx   c                 C   s   | j d d }|| |}|j|d f|d}|d}td|d D ]G}d|d d < | |df }	| |df }
|	|krI||j|	|jd|  |d< |
|kr[||j|
|jd|  |d< |||f |d< ||||< q#|S r  )r	  result_typer@   r  r4   r%  r  )rR   rA  r  r:   rk   r   r  r  r  r  r  r<   r<   r=   r    s   
r  c                 C   s"   t tt| ddgddgg d S )Nr   r+   )r   r   r	   r4   r   r<   r<   r=   <test_unsupported_uncondensed_distance_matrix_linkage_warning  s   "r  c              	   C   s8   t jjjD ]}ttt| ddgddgg|dd qd S )Nr+   	cityblockrH   r\   )r^   cluster	hierarchy_EUCLIDEAN_METHODSr6   r7   r	   r4   )r:   rH   r<   r<   r=   "test_euclidean_linkage_value_error  s
   r$  c                 C   sH   t | dgddd}t | ddgddggddd}t||dd d S )Nr+   r   r[   r   r   rc   r   )r	   r4   r'   )r:   Z1rk  r<   r<   r=   test_2x2_linkage  s    r&  c                 C   s   t jd d}t j|d}| |}tjj|}t	|}t
|| k t
| | k t
| | k t
| | k d S )N   2   r   )re   rf   seedrandnr4   r^   r!  r"  rV   r   r   r_  r`  )r:   r
  r]   rR   treer<   r<   r=   test_node_compare  s   
r,  z%`cut_tree` uses non-standard indexingc                 C   s  t jd d}t j|d}| |}tjj|}t	|}t
|d d df | |ddd t
|d d df | |ddd tt |dt |d	 dd t
|d d d
gf t	|dddd t
|d d d
dgf t	|ddgddd t
|d d dd
gf t	|ddgddd t|}| dd |D }t
|d d t |dgf t	|dddd t
|d d t |ddgf t	|ddgddd t
|d d t |ddgf t	|ddgddd d S )Nr'  r(  r   r   rc   F)rd   check_dtyper~   r+   r3   )
n_clustersr   ir   c                 S   s   g | ]}|j qS r<   )dist).0r^  r<   r<   r=   
<listcomp>  s    z!test_cut_tree.<locals>.<listcomp>)height)re   rf   r)  r*  r4   r^   r!  r"  rV   r   r'   aranger@   r   r  r!   searchsorted)r:   r
  r]   rR   cutreenodesheightsr<   r<   r=   test_cut_tree  s.   
""$$**
r9  c                 C   sv   t t| tj| tj}tj}t|| |dd t t| tjd| tj}tj}t|| |dd d S )NrL   rM   rV   rZ   )	r    r	   r4   r,   rP   rq   r'   r]   linkage_X_ward_olo)r:   rR   rS   r<   r<   r=   rr     s   

rr   z"`Heap` only supports NumPy backendc                 C   s  |  g d}t|}| }t|d d t|d d |  | }t|d d t|d d |dd | }t|d d	 t|d d
 |  |  |dd | }t|d d t|d d |  | }t|d d t|d d d S )N)rb   r~   r         rx   keyrx   r  r;  r+   r~   g      @rb   r   r   r   )r4   r%   get_minr   
remove_minchange_value)r:   valuesheappairr<   r<   r=   	test_Heap  s.   rC  c                 C   sJ   |  g d}tt t|dd W d    d S 1 sw   Y  d S )N)r   r   r~   rT   r   )r4   r   r   r7   r	   )r:   r@  r<   r<   r=   test_centroid_neg_distance  s   "rD  )^numpyre   numpy.testingr   r   r   r   r   r   r   r6   scipy.cluster.hierarchyr^   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#   scipy.spatial.distancer$   scipy.cluster._hierarchyr%   scipy.conftestr&   scipy._lib._array_apir'   r(   	threadingr*    r,   
matplotlibusematplotlib.pyplotpyplotr  r  	Exceptionr  usefixtures
pytestmarkr.   r/   rv   r   r   r   r   r   r   r  r?  rN  rW  rb  rr  r  r  r  r  r  r  thread_unsafer  r$  r&  r,  r9  rr   rC  rD  r<   r<   r<   r=   <module>   s   !x
=("?Y[O%<J+E I






 