o
    4BiV                     @   sb  d dl Zd dl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.m/Z/m0Z0 d	d
l1m2Z2 zd dl3Z3e34d d dl5m6Z7 dZ8W n e9y   dZ8Y nw e-ej:;dgZ<ej:j=Z=G dd dZ>e=ddG dd dZ?e=ddG dd dZ@e=ddG dd dZAG dd dZBe=ddG dd dZCe=ddG dd dZDe=ddgdG d d! d!ZEe=ddG d"d# d#ZFe=ddG d$d% d%ZGG d&d' d'ZHe=ddG d(d) d)ZIe=ddG d*d+ d+ZJe=ddG d,d- d-ZKe=ddG d.d/ d/ZLG d0d1 d1ZMG d2d3 d3ZNe=ddG d4d5 d5ZOd6d7 ZPd8efd9d:ZQe=ddd;d< ZRd=d> ZSe=ddd?d@ ZTe=dddAdB ZUe=ddCgddDdE ZVe=dddFdG ZWe=ddHgddIdJ ZXdS )K    N)assert_allcloseassert_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   )hierarchy_test_dataAggTFskip_if_array_apic                   @   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$   | d}|j|d< ttt| d S )N)   r   )zerosnanassert_raises
ValueErrorr   selfxpy r8   b/var/www/html/Trade-python/venv/lib/python3.10/site-packages/scipy/cluster/tests/test_hierarchy.py3test_linkage_non_finite_elements_in_distance_matrixK   s   

z?TestLinkage.test_linkage_non_finite_elements_in_distance_matrixc                 C   s   | d}ttt| d S )Nr   )r0   r2   r3   r   r4   r8   r8   r9   "test_linkage_empty_distance_matrixS   s   
z.TestLinkage.test_linkage_empty_distance_matrixc                 C      dD ]}|  || qd S )N)r   completeaverageweighted)check_linkage_tdistr5   r6   methodr8   r8   r9   test_linkage_tdistY      zTestLinkage.test_linkage_tdistc                 C   s8   t |tj|}ttd| }t|||dd d S )Nlinkage_ytdist_绽|=atolr   asarrayr)   ytdistgetattrr&   )r5   rC   r6   Z	expectedZr8   r8   r9   rA   ^   s   zTestLinkage.check_linkage_tdistc                 C   r=   )N)centroidmedianward)check_linkage_qrB   r8   r8   r9   test_linkage_Xd   rE   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_ư>rH   	euclidean)metric)
r   rK   r)   XrM   r&   scipyspatialdistancer#   )r5   rC   r6   rN   rO   r7   r8   r8   r9   rS   i   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瞯<)rtolrI   )nprandomRandomStaterandr#   r"   itemsr!   r   rK   r&   )
r5   r6   rngnrY   drC   code	Z_trivialrN   r8   r8   r9   test_compare_with_trivialt   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_olorG   rH   rJ   )r5   r6   rN   rO   r8   r8   r9   test_optimal_leaf_ordering   s   
z&TestLinkage.test_optimal_leaf_orderingN)__name__
__module____qualname__r+   r:   r<   rD   rA   rT   rS   rk   rn   r8   r8   r8   r9   r,   I   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^      rs   rt   )r^   rt   g'e@rt   )r^   rt   gev @rt   )r^   rt   g@rt   r   r>   r?   r@   rP   rQ   rR   c                 C   r=   Nru   )check_linkage_tiesrB   r8   r8   r9   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(   )rC   rV   rH   )rK   r   _expectationsr&   )r5   rC   r6   rY   rN   rO   r8   r8   r9   rw      s   
z"TestLinkageTies.check_linkage_tiesN)ro   rp   rq   ra   arrayr{   rx   rw   r8   r8   r8   r9   rr      s2    






rr   c                   @      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)r5   r6   depthr8   r8   r9   test_inconsistent_tdist   s   
z(TestInconsistent.test_inconsistent_tdistc                 C   s,   | tj}tt||| tj|  d S r   )rK   r)   linkage_ytdist_singler&   r   r   )r5   r   r6   rN   r8   r8   r9   r      s   
z)TestInconsistent.check_inconsistent_tdistN)ro   rp   rq   r   r   r8   r8   r8   r9   r~      s    r~   c                   @   r}   )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   dtyperG   rH   )rK   r)   r   r   r&   float64)r5   r6   	expectedMrN   Mr8   r8   r9   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?r8   rG   rH   )rK   r)   r   r   rL   r   r&   )r5   r6   rN   cr   r   	expectedcr8   r8   r9   test_linkage_cophenet_tdist_Z_Y   s   
z6TestCopheneticDistance.test_linkage_cophenet_tdist_Z_YN)ro   rp   rq   r   r   r8   r8   r8   r9   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   )rK   r   r'   r	   r
   )r5   r6   rY   r8   r8   r9   "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)              ?      @       @r(   r^   rt   r   r_   r`   )rK   r&   r	   r   r
   )r5   r6   rN   Zmr8   r8   r9   '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)rt   r/   r   )      r   )r(      r   )r^   	   r   )   
   r   )r         @     @a@r   )r         @     `k@r   )r   g      @     o@r   )r   g       @     p@r   )      @g      "@     pr@r   r   r_   r   )rK   r   r&   r	   r
   )r5   r6   r   rN   r8   r8   r9   *test_mlab_linkage_conversion_multiple_rows   s   

zDTestMLabLinkageConversion.test_mlab_linkage_conversion_multiple_rowsN)ro   rp   rq   r   r+   r   r   r8   r8   r8   r9   r      s    
	r   c                   @   sD   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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r5   r6   tr8   r8   r9   test_fclusterdata      


zTestFcluster.test_fclusterdatac                 C   sD   | ttd| | }| tj}t|||d}tt|| d S N	fcluster_	criterionr   )rK   rM   r)   Q_Xr   r   r   )r5   r   r   r6   	expectedTrY   Tr8   r8   r9   r      s   zTestFcluster.check_fclusterdatac                 C   r   r   )r)   r   check_fclusterr   r   r   r8   r8   r9   test_fcluster   r   zTestFcluster.test_fclusterc                 C   sH   | ttd| | }t| tj}t|||d}tt|| d S r   )rK   rM   r)   r   r   r   r   r   )r5   r   r   r6   r   rN   r   r8   r8   r9   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   r8   r8   r9   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   )	rK   r)   r   r   r   r   r   r   r   r5   r   r6   r   rN   r   r8   r8   r9   r        z$TestFcluster.check_fcluster_monocritc                 C   r   )Nmaxclust_monocritr   )	rK   r)   r   r   r   r   r   r   r   r   r8   r8   r9   r     r   z-TestFcluster.check_fcluster_maxclust_monocritN)
ro   rp   rq   r   r   r   r   r   r   r   r8   r8   r8   r9   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   rt   r   )5   7   8   )r^   rt   r(   r   r_   r   )r)   r   r#   rK   r   r   int32r   r   ra   concatenate)r5   r6   rY   YrN   r   LrightLr8   r8   r9   test_leaders_single#  s   

zTestLeaders.test_leaders_singleN)ro   rp   rq   r   r8   r8   r8   r9   r      s    r   z+`is_isomorphic` only supports NumPy backendnp_onlyreasonsc                   @   st   e Zd Zeddg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 Nr(   r(   r(   )r^   r^   r^   )r   )r5   r6   r8   r8   r9   test_array_like4  s   z TestIsIsomorphic.test_array_likec                 C   <   | g d}| g d}t||sJ t||sJ d S r   rK   r   r5   r6   abr8   r8   r9   test_is_isomorphic_1:     z%TestIsIsomorphic.test_is_isomorphic_1c                 C   r   )N)r(   r   r(   )r^   rt   r^   r   r   r8   r8   r9   test_is_isomorphic_2A  r   z%TestIsIsomorphic.test_is_isomorphic_2c                 C   s&   | g }| g }t||sJ d S r   r   r   r8   r8   r9   test_is_isomorphic_3H  s   

z%TestIsIsomorphic.test_is_isomorphic_3c                 C   r   )Nr   )r(   rt   r^   r   r   r8   r8   r9   test_is_isomorphic_4AN     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^   rt   rt   )r(   rt   r^   rt   Fr   r   r8   r8   r9   test_is_isomorphic_4BV  s   z&TestIsIsomorphic.test_is_isomorphic_4Bc                 C   r   )N)r   r^   rt   )r/   rt   r^   r   r   r8   r8   r9   test_is_isomorphic_4C^  r   z&TestIsIsomorphic.test_is_isomorphic_4Cc                 C   s   dD ]
}| j d||d qd S )Nr^   rt   r     r6   help_is_isomorphic_randpermr5   r6   ncr8   r8   r9   test_is_isomorphic_5f  s   z%TestIsIsomorphic.test_is_isomorphic_5c                 C   s"   dD ]}| j d|dd|d qd S )Nr   r   Tr   r   r   r   r8   r8   r9   test_is_isomorphic_6l  s   z%TestIsIsomorphic.test_is_isomorphic_6c                 C   s.   | g d}| g d}t||rJ d S )Nr   r   r   r   r8   r8   r9   test_is_isomorphic_7s  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 )Nrt   r   r   r(   )rangera   rb   rd   astypeintr0   sizepermutationshaperK   r   )r5   nobs	nclustersnonisonerrorsr6   kr   r   PiQr8   r8   r9   r   y  s   

z,TestIsIsomorphic.help_is_isomorphic_randpermN)Fr   )ro   rp   rq   r+   r   r   r   r   r   r   r   r   r   r   r   r8   r8   r8   r9   r   0  s    
r   c                   @   sT   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dS )TestIsValidLinkagec                 C   $   dD ]\}}}|  |||| qd S N))r^   r   F)r^   rt   F)r(   r   T)r^   r   T)#check_is_valid_linkage_various_sizer5   r6   nrowncolvalidr8   r8   r9   "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^   r   )rt   r^   r   rt   rt   r   Tthrow)rK   r   r   r   r2   r3   )r5   r  r  r	  r6   rN   r8   r8   r9   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^   rt   r^   r   rt   r   FTr  )rK   int64r   r   r2   	TypeErrorr5   r6   rN   r8   r8   r9   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  )r0   r   r   r   r2   r3   r  r8   r8   r9   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      rt   r(   r^   T)r   ra   rb   rd   rK   r   r   r   r5   r6   r   r7   rN   r8   r8   r9   test_is_valid_linkage_4_and_up  s   
z1TestIsValidLinkage.test_is_valid_linkage_4_and_upc                 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   rt   r(   r^   r   FTr  
r   ra   rb   rd   rK   r   r   r   r2   r3   r!  r8   r8   r9   -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   rt   r(   r^   r#  FTr  r$  r!  r8   r8   r9   .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   rt   r(   r^   g      FTr  r$  r!  r8   r8   r9   '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!  r8   r8   r9   )test_is_valid_linkage_4_and_up_neg_counts  r&  z<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_countsN)ro   rp   rq   r
  r  r  r  r"  r%  r(  r*  r+  r8   r8   r8   r9   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 )TestIsValidInconsistentc                 C   r  r  )rK   r  r   r   r2   r  r5   r6   Rr8   r8   r9   test_is_valid_im_int_type  r  z1TestIsValidInconsistent.test_is_valid_im_int_typec                 C   r  r  )check_is_valid_im_various_sizer  r8   r8   r9   test_is_valid_im_various_size  r  z5TestIsValidInconsistent.test_is_valid_im_various_sizec                 C   r  r  )rK   r   r   r   r2   r3   )r5   r  r  r	  r6   r.  r8   r8   r9   r0    r  z6TestIsValidInconsistent.check_is_valid_im_various_sizec                 C   r  r  )r0   r   r   r   r2   r3   r-  r8   r8   r9   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   rd   rK   r   r   r   r   r5   r6   r   r7   rN   r.  r8   r8   r9   test_is_valid_im_4_and_up  s   
z1TestIsValidInconsistent.test_is_valid_im_4_and_upc                 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   rt   r(   r^          r   FTr  r   ra   rb   rd   rK   r   r   r   r   r2   r3   r3  r8   r8   r9   (test_is_valid_im_4_and_up_neg_index_left     
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   rt   r(   r^   r5  FTr  r6  r3  r8   r8   r9   )test_is_valid_im_4_and_up_neg_index_right  r8  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)  r6  r3  r8   r8   r9   "test_is_valid_im_4_and_up_neg_dist  r8  z:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_distN)ro   rp   rq   r/  r1  r0  r2  r4  r7  r9  r:  r8   r8   r8   r9   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   )r0   r   r2   r3   r   r  r8   r8   r9   test_num_obs_linkage_empty.  s   z,TestNumObsLinkage.test_num_obs_linkage_emptyc                 C   s(   |j g dg|jd}tt|d d S )Nr  r   r^   rK   r   r   r   r  r8   r8   r9   test_num_obs_linkage_1x44  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   rt   r?  r  r8   r8   r9   test_num_obs_linkage_2x49  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   rt   r(   r^   )r   ra   rb   rd   rK   r   r   r   r!  r8   r8   r9   test_num_obs_linkage_4_and_up?  s   
z/TestNumObsLinkage.test_num_obs_linkage_4_and_upN)ro   rp   rq   r+   r>  r@  rA  rB  r8   r8   r8   r9   r;  ,  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   rK   r   r   r   r   r  r8   r8   r9   test_leaves_list_1x4M  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   rE  r  r8   r8   r9   test_leaves_list_2x4S  s   
z#TestLeavesList.test_leaves_list_2x4c                 C   r=   rv   )check_leaves_list_QrB   r8   r8   r9   test_leaves_list_QZ  ry   z!TestLeavesList.test_leaves_list_Qc                 C   s8   | tj}t||}t|}t| t|dd d S )Nr_   r   )rK   r)   r   r   r   r   	pre_orderr   )r5   rC   r6   rY   rN   noder8   r8   r9   rH  _  s   
z"TestLeavesList.check_leaves_list_Qc                 C   sH   | tj}t|d}t|}t| |  |   dd d S )Nr   r_   r   )	rK   r)   r   r   r   r   rJ  get_left	get_right)r5   r6   rY   rN   rK  r8   r8   r9   test_Q_subtree_pre_orderf  s   


z'TestLeavesList.test_Q_subtree_pre_orderN)ro   rp   rq   rF  rG  rI  rH  rN  r8   r8   r8   r9   rD  J  s    rD  c                   @   rC  )TestCorrespondc                 C   s2   |j d|jd}|j d|jd}ttt|| d S )Nr;   r   r  )r0   r   r2   r3   r   )r5   r6   r7   rN   r8   r8   r9   test_correspond_emptys  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   rt   )r   ra   rb   rd   rK   r   r   r   r!  r8   r8   r9   test_correspond_2_and_upy  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   rt   r   r(   	listzipr   ra   rb   rd   rK   r   r   r5   r6   r   jr7   y2rN   Z2r8   r8   r9   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(   rR  rU  r8   r8   r9   test_correspond_4_and_up_2  rZ  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   rd   r#   rK   r   r   r   )r5   r6   rg   rY   r   rN   r8   r8   r9   !test_num_obs_linkage_multi_matrix  s   
z0TestCorrespond.test_num_obs_linkage_multi_matrixN)ro   rp   rq   rP  rQ  rY  r]  r^  r8   r8   r8   r9   rO  p  s    rO  c                   @   sd   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dd Zdd ZdS )TestIsMonotonicc                 C   r<  r=  )r0   r   r2   r3   r   r  r8   r8   r9   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   rK   r   r   r  r8   r8   r9   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 )Nrb  )r^   rt   皙?rt   r   rd  r  r8   r8   r9   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(   rf  r^   )r^   rt   rc  rt   r   rd  r  r8   r8   r9   test_is_monotonic_2x4_F  rh  z'TestIsMonotonic.test_is_monotonic_2x4_Fc                 C   s2   |j g dg dg dg|jd}t|sJ d S )Nrb  r^   rt   rf  r^   r   r   g333333?r   r   rd  r  r8   r8   r9   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 )Nrb  )r^   rt   皙?r^   rk  r   rd  r  r8   r8   r9   test_is_monotonic_3x4_F1  rm  z(TestIsMonotonic.test_is_monotonic_3x4_F1c                 C   rn  )N)r   r(   g?r^   rj  rk  r   rd  r  r8   r8   r9   test_is_monotonic_3x4_F2  rm  z(TestIsMonotonic.test_is_monotonic_3x4_F2c                 C   rn  )Nrb  rj  )r   r   ro  r   r   rd  r  r8   r8   r9   test_is_monotonic_3x4_F3  rm  z(TestIsMonotonic.test_is_monotonic_3x4_F3c                 C   s"   t |tjd}t|sJ d S Nr   r   rK   r)   rL   r   r  r8   r8   r9    test_is_monotonic_tdist_linkage1  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage1c                 C   s*   t |tjd}d|d< t|rJ d S )Nr   r   )r^   r^   rt  r  r8   r8   r9    test_is_monotonic_tdist_linkage2  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage2c                 C   s&   | tj}t|d}t|sJ d S rs  )rK   r)   r   r   r   )r5   r6   rY   rN   r8   r8   r9   test_is_monotonic_Q_linkage  s   
z+TestIsMonotonic.test_is_monotonic_Q_linkageN)ro   rp   rq   r`  re  rg  ri  rl  rp  rq  rr  ru  rv  rw  r8   r8   r8   r9   r_    s    r_  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestMaxDistsc                 C   r<  r=  )r0   r   r2   r3   r   r  r8   r8   r9   test_maxdists_empty_linkage  ra  z(TestMaxDists.test_maxdists_empty_linkagec                 C   s:   |j g dg|jd}t|}t||}t||dd d S )Nr   r(   rc  r   r   r_   rH   )rK   r   r   calculate_maximum_distancesr&   )r5   r6   rN   MD
expectedMDr8   r8   r9   !test_maxdists_one_cluster_linkage  s   
z.TestMaxDists.test_maxdists_one_cluster_linkagec                 C   r=   Nr   r>   rR   rP   rQ   )check_maxdists_Q_linkagerB   r8   r8   r9   test_maxdists_Q_linkage     z$TestMaxDists.test_maxdists_Q_linkagec                 C   s:   | tj}t||}t|}t||}t||dd d S )Nr_   rH   )rK   r)   r   r   r   r{  r&   )r5   rC   r6   rY   rN   r|  r}  r8   r8   r9   r  
  s
   

z%TestMaxDists.check_maxdists_Q_linkageN)ro   rp   rq   ry  r~  r  r  r8   r8   r8   r9   rx    s
    rx  c                   @   sR   e Zd Zedddd Zdd Zedddd Ze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=  )r0   r   r2   r3   r   r5   r6   rN   r.  r8   r8   r9   test_maxinconsts_empty_linkage  s   z.TestMaxInconsts.test_maxinconsts_empty_linkagec                 C   s@   |j g dg|jd}tjdd}| |}ttt|| d S Nrz  r   r^   r   )rK   r   ra   rb   rd   r2   r3   r   r  r8   r8   r9   test_maxinconsts_difrow_linkage  s   
z/TestMaxInconsts.test_maxinconsts_difrow_linkagec                 C   sV   |j g dg|jd}|j g dg|jd}t||}t|||d}t||dd d S )Nrz  r   r   r   r   rc  r   r_   rH   )rK   r   r   !calculate_maximum_inconsistenciesr&   )r5   r6   rN   r.  r|  r}  r8   r8   r9   $test_maxinconsts_one_cluster_linkage$  s
   
z4TestMaxInconsts.test_maxinconsts_one_cluster_linkagec                 C   r=   r  )check_maxinconsts_Q_linkagerB   r8   r8   r9   test_maxinconsts_Q_linkage-  rE   z*TestMaxInconsts.test_maxinconsts_Q_linkagec                 C   sH   | tj}t||}t|}t||}t|||d}t||dd d S )Nr   r_   rH   )rK   r)   r   r   r   r   r  r&   )r5   rC   r6   rY   rN   r.  r|  r}  r8   r8   r9   r  2  s   

z+TestMaxInconsts.check_maxinconsts_Q_linkageN)	ro   rp   rq   r+   r  r  r  r  r  r8   r8   r8   r9   r    s    


r  c                   @   sz   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 Z
dd Zedddd Zdd ZdS )TestMaxRStatc                 C   r=   )N)gffffff
@rz   r   )check_maxRstat_invalid_indexr5   r6   r   r8   r8   r9   test_maxRstat_invalid_index>  r  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 )Nrz  r   r  )rK   r   
isinstancer   r2   r3   r   r  r5   r   r6   rN   r.  r8   r8   r9   r  B  s
   
z)TestMaxRStat.check_maxRstat_invalid_indexTr-   c                 C      t dD ]}| || qd S Nr   )r   check_maxRstat_empty_linkager  r8   r8   r9   test_maxRstat_empty_linkageK     z(TestMaxRStat.test_maxRstat_empty_linkagec                 C   s4   |j d|jd}|j d|jd}ttt||| d S r=  )r0   r   r2   r3   r   r  r8   r8   r9   r  P  r  z)TestMaxRStat.check_maxRstat_empty_linkagec                 C   r  r  )r   check_maxRstat_difrow_linkager  r8   r8   r9   test_maxRstat_difrow_linkageV  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  )rK   r   ra   rb   rd   r2   r3   r   r  r8   r8   r9   r  Z  s   
z*TestMaxRStat.check_maxRstat_difrow_linkagec                 C   r  r  )r   "check_maxRstat_one_cluster_linkager  r8   r8   r9   !test_maxRstat_one_cluster_linkageb  r  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 )Nrz  r   r  r(   r_   rH   )rK   r   r   r  r&   )r5   r   r6   rN   r.  r|  r}  r8   r8   r9   r  g  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)r5   r6   rC   r   r8   r8   r9   test_maxRstat_Q_linkageo  s
   z$TestMaxRStat.test_maxRstat_Q_linkagec           	      C   sJ   | tj}t||}t|}t||d}t||d|}t||dd d S )Nr(   r_   rH   )rK   r)   r   r   r   r   r  r&   )	r5   rC   r   r6   rY   rN   r.  r|  r}  r8   r8   r9   r  u  s   
z%TestMaxRStat.check_maxRstat_Q_linkageN)ro   rp   rq   r  r  r+   r  r  r  r  r  r  r  r  r8   r8   r8   r9   r  <  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jje	 dddd Zdd Zejje	 dd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^   r   r(   r   rt   r   )r   rK   r)   rL   r   r   )r5   r6   rN   r.  r  r8   r8   r9   $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   rK   r)   rL   r2   r3   r   r  r8   r8   r9   test_valid_orientation  s   z%TestDendrogram.test_valid_orientationc                 C   sP   t |tjd}|g d}t||dd}t|t|dd}||ks&J d S )Nr   )r(   rt   r^   r/   r   r   T)labelsr  )r   rK   r)   rL   r   rS  )r5   r6   rN   r  result1result2r8   r8   r9   test_labels_as_array_or_list  s
   z+TestDendrogram.test_labels_as_array_or_listzno matplotlib)reasonc                 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^   rt   r   r   )r   r   r   r/   d   )r  z.Dimensions of Z and labels must be consistent.)match)rK   pltfigurepytestr   r3   r   rS  r   strvalueclose)r5   r6   linkexc_infor8   r8   r9   test_valid_label_size  s&   z$TestDendrogram.test_valid_label_sizec                 C   r=   )N)topbottomleftright)check_dendrogram_plot)r5   r6   r  r8   r8   r9   test_dendrogram_plot  rE   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  r   r   r   r   )r   r   r   r   )r   r   r   r   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  )251034r  )r  r  r  r  r  r  
color_listdcoordicoord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   rK   r)   rL   r  r  add_subplotr   ra   r   get_xticklabelsget_yticklabelsget_rotationget_sizer  )
r5   r  r6   rN   expectedfigr  R1	testlabelR2r8   r8   r9   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^   lastpT)show_contractedr  r  )r   r   r   r   r  (2)z(4)r/   r   r  mtica)r  r  r  r  r  )r   r   r   r   r  r  )r  r  r  r  )r  r        D@r  )r  r       @@@r  )r  r  r  r  r  )r^   r   r(   r   r   )r  r  r  r  r  )	r   rK   r)   rL   r   r  r  ra   r   r  r8   r8   r9   test_dendrogram_truncate_mode  s:   
z,TestDendrogram.test_dendrogram_truncate_modec                 C   s\   t |tjd}tg d t|dddd}tg d |d }t|g d	 td  d S )
Nr   )r   mr7   r   Tg   )r  above_threshold_colorcolor_threshold)r  rr   r  r7   r   r  )r   r  r  r  r  )r   rK   r)   rL   r   r   r   )r5   r6   rN   r.  r  r8   r8   r9   test_dendrogram_colors  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  rK   r   r   r   r5   r6   xzrh   
exp_colorscolorsr8   r8   r9   %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  r8   r8   r9   test_dendrogram_leaf_colors*  r  z*TestDendrogram.test_dendrogram_leaf_colorsN)ro   rp   rq   r  r  r  r  markskipifhave_matplotlibr  r  r  r  r  r  r  r8   r8   r8   r9   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   )rt   r   r^   )r   r0   r   r   rK   r  max)rN   r6   rg   Bqr   r  r  r8   r8   r9   r{  :  s   
r{  rt   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_typer0   r   rK   r  r
  )rN   r.  r   r6   rg   r   r  r  r   r  r  r8   r8   r9   r  L  s   
r  c                 C   s"   t tt| ddgddgg d S )Nr   r(   )r   r   r   rK   r   r8   r8   r9   <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rC   rX   )rZ   cluster	hierarchy_EUCLIDEAN_METHODSr2   r3   r   rK   )r6   rC   r8   r8   r9   "test_euclidean_linkage_value_errord  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   rW   r  r   r_   r   )r   rK   r&   )r6   Z1rX  r8   r8   r9   test_2x2_linkagej  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randnrK   rZ   r  r  rR   r   r   rL  rM  )r6   r   rY   rN   treer8   r8   r9   test_node_compareq  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`   check_dtyperz   r(   r   )
n_clustersr   ir   c                 S   s   g | ]}|j qS r8   )dist).0rK  r8   r8   r9   
<listcomp>  s    z!test_cut_tree.<locals>.<listcomp>)height)ra   rb   r  r  rK   rZ   r  r  rR   r   r&   aranger0   r   r
  r    searchsorted)r6   r   rY   rN   cutreenodesheightsr8   r8   r9   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 )NrG   rH   rR   rV   )	r   r   rK   r)   rL   rm   r&   rY   linkage_X_ward_olo)r6   rN   rO   r8   r8   r9   rn     s   

rn   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^   rz   r         rt   keyrt   r  r+  r(   rz   g      @r^   r   r   r   )rK   r$   get_minr   
remove_minchange_value)r6   valuesheappairr8   r8   r9   	test_Heap  s.   r3  )Ynumpyra   numpy.testingr   r   r   r   r  r   r2   scipy.cluster.hierarchyrZ   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'    r)   
matplotlibusematplotlib.pyplotpyplotr  r  	Exceptionr  usefixtures
pytestmarkr+   r,   rr   r~   r   r   r   r   r   r  r,  r;  rD  rO  r_  rx  r  r  r  r{  r  r  r  r  r  r)  rn   r3  r8   r8   r8   r9   <module>   s   !x
>"3YSL%<I)C ;




