o
    i                     @   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_dataZ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;   \/home/kim/smarthome/.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   )zerosr5   r6   r	   r7   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r8   r9   methodr;   r;   r<   test_linkage_tdist[      zTestLinkage.test_linkage_tdistc                 C   s8   t |tj|}ttd| }t|||dd d S )NZlinkage_ytdist_绽|=atolr	   r3   r,   ytdistgetattrr'   )r8   rG   r9   Z	expectedZr;   r;   r<   rE   `   s   zTestLinkage.check_linkage_tdistc                 C   rA   )N)centroidmedianward)check_linkage_qrF   r;   r;   r<   test_linkage_Xf   rI   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 )NZ
linkage_X_ư>rK   	euclidean)metric)
r	   r3   r,   XrO   r'   scipyZspatialdistancer$   )r8   rG   r9   rP   rQ   r:   r;   r;   r<   rU   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瞯<)rtolrL   )nprandomZRandomStaterandr$   r#   itemsr"   r	   r3   r'   )
r8   r9   rngnrZ   drG   codeZ	Z_trivialrP   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)Zoptimal_orderinglinkage_ytdist_single_olorJ   rK   rM   )r8   r9   rP   rQ   r;   r;   r<   test_optimal_leaf_ordering   s   
z&TestLinkage.test_optimal_leaf_orderingN)__name__
__module____qualname__r-   r=   r@   rH   rE   rV   rU   ri   rk   r;   r;   r;   r<   r.   L   s    




r.   r/   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?r^   )r^      rp   rq   )r^   rq   g'e@rq   )r^   rq   gev @rq   )r^   rq   g@rq   r   rB   rC   rD   rR   rS   rT   c                 C   rA   Nrr   )check_linkage_tiesrF   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+   rG   rW   rK   )r3   r	   _expectationsr'   )r8   rG   r9   rZ   rP   rQ   r;   r;   r<   rt      s   
z"TestLinkageTies.check_linkage_tiesN)rl   rm   rn   ra   arrayry   ru   rt   r;   r;   r;   r<   ro      s2    






ro   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)r8   r9   depthr;   r;   r<   test_inconsistent_tdist   s   
z(TestInconsistent.test_inconsistent_tdistc                 C   s,   | tj}tt||| tj|  d S r|   )r3   r,   linkage_ytdist_singler'   r   r}   )r8   r   r9   rP   r;   r;   r<   r~      s   
z)TestInconsistent.check_inconsistent_tdistN)rl   rm   rn   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   dtyperJ   rK   )r3   r,   r   r   r'   float64)r8   r9   	expectedMrP   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;   rJ   rK   )r3   r,   r   r   rN   r   r'   )r8   r9   rP   cr   r   Z	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)r1         ?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   r6   r   r3   )r8   r9   Zarrr;   r;   r<   test_gh_22183   s   "z$TestCopheneticDistance.test_gh_22183N)rl   rm   rn   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   )r3   r   r(   r
   r   )r8   r9   rZ   r;   r;   r<   "test_mlab_linkage_conversion_empty   s   z<TestMLabLinkageConversion.test_mlab_linkage_conversion_emptyTr/   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)r1   r   r   r   r+   r^   rq   r   r_   r`   )r3   r'   r
   r   r   )r8   r9   rP   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)rq      r   )   r2   r   )r+      r   )r^   	   r   )   
   r   )r   r        @a@r   )r   r        `k@r   )r1   r        o@r   )r   r        p@r   )r   r        pr@r   r   r_   r   )r3   r   r'   r
   r   )r8   r9   r   rP   r;   r;   r<   *test_mlab_linkage_conversion_multiple_rows   s   

zDTestMLabLinkageConversion.test_mlab_linkage_conversion_multiple_rowsN)rl   rm   rn   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r8   r9   tr;   r;   r<   test_fclusterdata     


zTestFcluster.test_fclusterdatac                 C   sD   | ttd| | }| tj}t|||d}tt|| d S NZ	fcluster_	criterionr   )r3   rO   r,   Q_Xr   r   r   )r8   r   r   r9   	expectedTrZ   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   )r3   rO   r,   r   r   r   r   r   )r8   r   r   r9   r   rP   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   )	r3   r,   r   r   r   r   r   r   r   r8   r   r9   r   rP   r   r;   r;   r<   r   (     z$TestFcluster.check_fcluster_monocritc                 C   r   )NZmaxclust_monocritr   )	r3   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   r2   r   )r   r   r+   r+   r+   r^   )r^   r+   r+   rq   r   )r3   r   r   r   r8   r9   r:   rP   r;   r;   r<   test_fcluster_maxclust_gh_126514  s   z,TestFcluster.test_fcluster_maxclust_gh_12651N)rl   rm   rn   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   rq   r   )5   7   8   )r^   rq   r+   r   r_   r   )r,   r   r$   r3   r	   r   Zint32r   r   ra   Zconcatenate)r8   r9   rZ   YrP   r   ZLrightLr;   r;   r<   test_leaders_singleD  s   

zTestLeaders.test_leaders_singleN)rl   rm   rn   r   r;   r;   r;   r<   r   A  s    r   z+`is_isomorphic` only supports NumPy backendZ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   )r^   r^   r^   )r   )r8   r9   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   r3   r   r8   r9   abr;   r;   r<   test_is_isomorphic_1[     z%TestIsIsomorphic.test_is_isomorphic_1c                 C   r   )N)r+   r   r+   )r^   rq   r^   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+   rq   r^   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+   r^   rq   rq   )r+   rq   r^   rq   Fr   r   r;   r;   r<   test_is_isomorphic_4Bw  s   z&TestIsIsomorphic.test_is_isomorphic_4Bc                 C   r   )N)r   r^   rq   )r   rq   r^   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r^   rq   r2     r9   help_is_isomorphic_randpermr8   r9   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   Tr2   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 )Nrq   r   r   r+   )rangera   rb   rc   Zastypeintr?   sizeZpermutationshaper3   r   )r8   nobsZ	nclustersZnonisoZnerrorsr9   kr   r   PiQr;   r;   r<   r     s   

z,TestIsIsomorphic.help_is_isomorphic_randpermN)Fr   )rl   rm   rn   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))r^   r2   F)r^   rq   F)r+   r   T)r^   r   T)#check_is_valid_linkage_various_sizer8   r9   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   r^   r2   )rq   r^   r   rq   rq   r   Tthrow)r3   r   r   r   r5   r6   )r8   r  r  r  r9   rP   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   r^   rq   r^   r   rq   r   FTr
  )r3   int64r   r   r5   	TypeErrorr8   r9   rP   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   r5   r6   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      rq   r+   r^   T)r   ra   rb   rc   r3   r	   r   r   r8   r9   r   r:   rP   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   r  rq   r+   r^   r   FTr
  
r   ra   rb   rc   r3   r	   r   r   r5   r6   r  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   r  rq   r+   r^   r"  FTr
  r#  r  r;   r;   r<   .test_is_valid_linkage_4_and_up_neg_index_right  r%  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   r  rq   r+   r^   g      FTr
  r#  r  r;   r;   r<   'test_is_valid_linkage_4_and_up_neg_dist  r%  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&  r#  r  r;   r;   r<   )test_is_valid_linkage_4_and_up_neg_counts  r%  z<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_countsN)rl   rm   rn   r  r  r  r  r  r-   r$  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  )r3   r  r   r   r5   r  r8   r9   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	  )r3   r   r   r   r5   r6   )r8   r  r  r  r9   r-  r;   r;   r<   r/    r  z6TestIsValidInconsistent.check_is_valid_im_various_sizec                 C   r  r  )r?   r   r   r   r5   r6   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   ra   rb   rc   r3   r	   r   r   r   r8   r9   r   r:   rP   r-  r;   r;   r<   test_is_valid_im_4_and_up&  s   
z1TestIsValidInconsistent.test_is_valid_im_4_and_upr  r   r!  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   r  rq   r+   r^          r   FTr
  r   ra   rb   rc   r3   r	   r   r   r   r5   r6   r2  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   r  rq   r+   r^   r4  FTr
  r5  r2  r;   r;   r<   )test_is_valid_im_4_and_up_neg_index_right=  r7  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(  r5  r2  r;   r;   r<   "test_is_valid_im_4_and_up_neg_distJ  r7  z:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_distN)rl   rm   rn   r.  r0  r/  r1  r3  r-   r6  r8  r9  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 )TestNumObsLinkageTr/   c                 C       |j d|jd}ttt| d S Nr  r   )r?   r   r5   r6   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   r^   r3   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   rq   r>  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   r  rq   r+   r^   )r   ra   rb   rc   r3   r	   r   r   r  r;   r;   r<   test_num_obs_linkage_4_and_upk  s   
z/TestNumObsLinkage.test_num_obs_linkage_4_and_upN)rl   rm   rn   r-   r=  r?  r@  rA  r;   r;   r;   r<   r:  X  s    
r:  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+   r_   r   r3   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+   r^   r_   r   rD  r  r;   r;   r<   test_leaves_list_2x4  s   
z#TestLeavesList.test_leaves_list_2x4c                 C   rA   rs   )check_leaves_list_QrF   r;   r;   r<   test_leaves_list_Q  rv   z!TestLeavesList.test_leaves_list_Qc                 C   s8   | tj}t||}t|}t| t|dd d S )Nr_   r   )r3   r,   r   r	   r   r   	pre_orderr   )r8   rG   r9   rZ   rP   noder;   r;   r<   rG    s   
z"TestLeavesList.check_leaves_list_Qc                 C   sH   | tj}t|d}t|}t| |  |   dd d S )Nr   r_   r   )	r3   r,   r   r	   r   r   rI  get_left	get_right)r8   r9   rZ   rP   rJ  r;   r;   r<   test_Q_subtree_pre_order  s   


z'TestLeavesList.test_Q_subtree_pre_orderN)rl   rm   rn   rE  rF  rH  rG  rM  r;   r;   r;   r<   rC  v  s    rC  c                   @   rB  )TestCorrespondc                 C   s2   |j d|jd}|j d|jd}ttt|| d S )Nr>   r   r  )r?   r   r5   r6   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 )Nr^   r   r+   r  rq   )r   ra   rb   rc   r3   r	   r   r   r  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 )Nr^   r   rq   r2   r+   	listzipr   ra   rb   rc   r3   r	   r   r8   r9   r   jr:   y2rP   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 )Nr^   r         r+   rQ  rT  r;   r;   r<   test_correspond_4_and_up_2  rY  z)TestCorrespond.test_correspond_4_and_up_2c                 C   sJ   t ddD ]}tj|d}t|}||}t|}tt|| qd S )Nr^   r   r   )	r   ra   rb   rc   r$   r3   r	   r   r   )r8   r9   rf   rZ   r   rP   r;   r;   r<   !test_num_obs_linkage_multi_matrix  s   
z0TestCorrespond.test_num_obs_linkage_multi_matrixN)rl   rm   rn   rO  rP  rX  r\  r]  r;   r;   r;   r<   rN    s    rN  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   r;  r<  )r?   r   r5   r6   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?r^   r   r3   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 )Nra  )r^   rq   皙?rq   r   rc  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+   re  r^   )r^   rq   rb  rq   r   rc  r  r;   r;   r<   test_is_monotonic_2x4_F  rg  z'TestIsMonotonic.test_is_monotonic_2x4_Fc                 C   s2   |j g dg dg dg|jd}t|sJ d S )Nra  r^   rq   re  r^   r   r2   g333333?r   r   rc  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 )Nra  )r^   rq   皙?r^   rj  r   rc  r  r;   r;   r<   test_is_monotonic_3x4_F1  rl  z(TestIsMonotonic.test_is_monotonic_3x4_F1c                 C   rm  )N)r   r+   g?r^   ri  rj  r   rc  r  r;   r;   r<   test_is_monotonic_3x4_F2   rl  z(TestIsMonotonic.test_is_monotonic_3x4_F2c                 C   rm  )Nra  ri  )r   r2   rn  r   r   rc  r  r;   r;   r<   test_is_monotonic_3x4_F3  rl  z(TestIsMonotonic.test_is_monotonic_3x4_F3c                 C   s"   t |tjd}t|sJ d S Nr   r	   r3   r,   rN   r   r  r;   r;   r<    test_is_monotonic_tdist_linkage1  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage1r  r   r!  c                 C   s*   t |tjd}d|d< t|rJ d S )Nr   r1   )r^   r^   rs  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 rr  )r3   r,   r   r	   r   )r8   r9   rZ   rP   r;   r;   r<   test_is_monotonic_Q_linkage  s   
z+TestIsMonotonic.test_is_monotonic_Q_linkageN)rl   rm   rn   r_  rd  rf  rh  rk  ro  rp  rq  rt  r-   ru  rv  r;   r;   r;   r<   r^    s    

r^  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   r;  r<  )r?   r   r5   r6   r   r  r;   r;   r<   test_maxdists_empty_linkage'  r`  z(TestMaxDists.test_maxdists_empty_linkager  r   r!  c                 C   s:   |j g dg|jd}t|}t||}t||dd d S )Nr   r+   rb  r   r   r_   rK   )r3   r   r   calculate_maximum_distancesr'   )r8   r9   rP   MD
expectedMDr;   r;   r<   !test_maxdists_one_cluster_linkage,  s   
z.TestMaxDists.test_maxdists_one_cluster_linkagec                 C   rA   Nr   rB   rT   rR   rS   )check_maxdists_Q_linkagerF   r;   r;   r<   test_maxdists_Q_linkage4  rI   z$TestMaxDists.test_maxdists_Q_linkagec                 C   s:   | tj}t||}t|}t||}t||dd d S )Nr_   rK   )r3   r,   r   r	   r   rz  r'   )r8   rG   r9   rZ   rP   r{  r|  r;   r;   r<   r  9  s
   

z%TestMaxDists.check_maxdists_Q_linkageN)rl   rm   rn   rx  r-   r}  r  r  r;   r;   r;   r<   rw  $  s    



rw  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 )TestMaxInconstsTr/   c                 C   s2   |j d|jd}|j d|jd}ttt|| d S r<  )r?   r   r5   r6   r   r8   r9   rP   r-  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 Nry  r   r^   r   )r3   r   ra   rb   rc   r5   r6   r   r  r;   r;   r<   test_maxinconsts_difrow_linkageK  s   
z/TestMaxInconsts.test_maxinconsts_difrow_linkager  r   r   r0   c                 C   sV   |j g dg|jd}|j g dg|jd}t||}t|||d}t||dd d S )Nry  r   r   r   r   rb  r   r_   rK   )r3   r   r   !calculate_maximum_inconsistenciesr'   )r8   r9   rP   r-  r{  r|  r;   r;   r<   $test_maxinconsts_one_cluster_linkageS  s
   
z4TestMaxInconsts.test_maxinconsts_one_cluster_linkagec                 C   rA   r~  )check_maxinconsts_Q_linkagerF   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   r_   rK   )r3   r,   r   r	   r   r   r  r'   )r8   rG   r9   rZ   rP   r-  r{  r|  r;   r;   r<   r  c  s   

z+TestMaxInconsts.check_maxinconsts_Q_linkageN)	rl   rm   rn   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   rA   )N)gffffff
@rw   r   )check_maxRstat_invalid_indexr8   r9   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 )Nry  r   r  )r3   r   
isinstancer   r5   r6   r   r  r8   r   r9   rP   r-  r;   r;   r<   r  s  s
   
z)TestMaxRStat.check_maxRstat_invalid_indexTr/   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 r<  )r?   r   r5   r6   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  )r3   r   ra   rb   rc   r5   r6   r   r  r;   r;   r<   r    s   
z*TestMaxRStat.check_maxRstat_difrow_linkager  r   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 )Nry  r   r  r+   r_   rK   )r3   r   r   r  r'   )r8   r   r9   rP   r-  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)r8   r9   rG   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+   r_   rK   )r3   r,   r   r	   r   r   r  r'   )	r8   rG   r   r9   rZ   rP   r-  r{  r|  r;   r;   r<   r    s   
z%TestMaxRStat.check_maxRstat_Q_linkageN)rl   rm   rn   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r^   r2   r+   r   rq   r   )r	   r3   r,   rN   r   r   )r8   r9   rP   r-  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   Zfooorientation)r	   r3   r,   rN   r5   r6   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+   rq   r^   r   r   r2   T)labelsr  )r	   r3   r,   rN   r   )r8   r9   rP   r  Zresult1Zresult2r;   r;   r<   test_labels_as_array_or_list  s
   z+TestDendrogram.test_labels_as_array_or_listzno matplotlibr!  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   )r^   rq   r   r2   )r   r2   r   r   d   )r  z.Dimensions of Z and labels must be consistent.r   )r3   pltfigurer   r   r6   r   rR  r   strvalueclose)r8   r9   linkexc_infor;   r;   r<   test_valid_label_size  s&   z$TestDendrogram.test_valid_label_sizeZtorchzFMPL 3.9.2 & torch DeprecationWarning from __array_wrap__ and NumPy 2.0c                 C   rA   )N)topbottomleftright)check_dendrogram_plot)r8   r9   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  r1   r   r   r1   )r1   r   r   r1   )r1   r   r   r   r1   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dcoordZicoordZivlr  leaves_color_list   )axr  r  r]   Z   )r  r  leaf_font_sizeleaf_rotation)r  r  r   )r  r  r  )r  r  r  r  )r	   r3   r,   rN   r  r  Zadd_subplotr   ra   r   Zget_xticklabelsZget_yticklabelsZget_rotationget_sizer  )
r8   r  r9   rP   expectedZfigr  ZR1Z	testlabelZ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   r^   ZlastpT)Zshow_contractedr  r  )r1   r   r   r1   r  (2)z(4)r   r   r  Zmtica)r  r  r  r  r  )r1   r   r   r1   r  r  )r  r  r  r  )r  r        D@r  )r   r        @@@r  )r  r  r  r  r  )r^   r2   r+   r   r   )r  r  r  r  r  )	r	   r3   r,   rN   r   r  r  ra   r   r  r;   r;   r<   test_dendrogram_truncate_mode#  s:   
z,TestDendrogram.test_dendrogram_truncate_modec                 C   s   t  S r|   r)   )r8   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  Zabove_threshold_colorZcolor_threshold)r  rr   r  r:   r   r  )r   r  r  r  r  )r	   r3   r,   rN   r   r   r   )r8   r9   r  rP   r-  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   r^   r   r   r+   r   r   Tr  r  r  r  r  C2r  r  r3   r	   r   r   r8   r9   xzrg   Z
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)rl   rm   rn   r  r  r  r   markZskipifhave_matplotlibr  r-   r  r  r  Z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   )rq   r1   r^   )r   r?   r   r   r3   r  max)rP   r9   rf   Bqr   r  r  r;   r;   r<   rz  {  s   
rz  rq   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   Zresult_typer?   r   r3   r  r  )rP   r-  r   r9   rf   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	   r3   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+   Z	cityblockrG   rY   )r[   cluster	hierarchyZ_EUCLIDEAN_METHODSr5   r6   r	   r3   )r9   rG   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   rX   r  r   r_   r   )r	   r3   r'   )r9   ZZ1rW  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   )ra   rb   seedrandnr3   r[   r  r  rT   r   r   rK  rL  )r9   r   rZ   rP   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   r_   F)r`   Zcheck_dtyperw   r+   r2   )Z
n_clustersr   ir   c                 S   s   g | ]}|j qS r;   )dist).0rJ  r;   r;   r<   
<listcomp>  s    z!test_cut_tree.<locals>.<listcomp>)height)ra   rb   r  r  r3   r[   r  r  rT   r   r'   Zaranger?   r   r  r!   Zsearchsorted)r9   r   rZ   rP   ZcutreenodesZheightsr;   r;   r<   test_cut_tree  s.   
""$$**
r  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 )NrJ   rK   rT   rW   )	r    r	   r3   r,   rN   rj   r'   rZ   Zlinkage_X_ward_olo)r9   rP   rQ   r;   r;   r<   rk     s   

rk   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)r^   rw   r         rq   keyrq   r  r  r+   rw   g      @r^   r   r   r   )r3   r%   Zget_minr   Z
remove_minZchange_value)r9   valuesheappairr;   r;   r<   	test_Heap  s.   r  c                 C   sJ   |  g d}tt t|dd W d    d S 1 sw   Y  d S )N)r   r   rw   rR   rx   )r3   r   r   r6   r	   )r9   r  r;   r;   r<   test_centroid_neg_distance  s   "r  )^numpyra   Znumpy.testingr   r   r   r   r   r   r   r5   Z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#   Zscipy.spatial.distancer$   Zscipy.cluster._hierarchyr%   Zscipy.conftestr&   Zscipy._lib._array_apir'   r(   	threadingr*    r,   Z
matplotlibZuseZmatplotlib.pyplotZpyplotr  r  	Exceptionr  ZusefixturesZ
pytestmarkr-   r.   ro   r{   r   r   r   r   r   r   r+  r:  rC  rN  r^  rw  r  r  r  rz  r  Zthread_unsafer  r  r  r  r  rk   r  r  r;   r;   r;   r<   <module>   s   !x
=("?Y[O%<J+E I






 