o
    Eb/                     @   sh  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- zd dl.Z.e./d	 d dl0m1Z2 d
Z3W n e4y   dZ3Y nw G dd dZ5G dd dZ6G dd dZ7G dd dZ8G dd dZ9G dd dZ:G dd dZ;G dd dZ<G dd dZ=G dd dZ>G d d! d!Z?G d"d# d#Z@G d$d% d%ZAG d&d' d'ZBG d(d) d)ZCG d*d+ d+ZDG d,d- d-ZEG d.d/ d/ZFd0d1 ZGdEd3d4ZHd5d6 ZId7d8 ZJd9d: ZKd;d< ZLd=d> ZMd?d@ ZNdAdB ZOdCdD ZPdS )F    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   )hierarchy_test_dataZAggTFc                   @   L   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 )TestLinkagec                 C   s$   t d}t j|d< ttt| d S )N)   r   )npzerosnanassert_raises
ValueErrorr   selfy r2   D/usr/lib/python3/dist-packages/scipy/cluster/tests/test_hierarchy.py3test_linkage_non_finite_elements_in_distance_matrixD   s   

z?TestLinkage.test_linkage_non_finite_elements_in_distance_matrixc                 C      t d}ttt| d S )Nr   )r*   r+   r-   r.   r   r/   r2   r2   r3   "test_linkage_empty_distance_matrixK      
z.TestLinkage.test_linkage_empty_distance_matrixc                 C      dD ]}|  | qd S )N)r   completeaverageweighted)check_linkage_tdistr0   methodr2   r2   r3   test_linkage_tdistP      zTestLinkage.test_linkage_tdistc                 C   s,   t tj|}ttd| }t||dd d S )NZlinkage_ytdist_绽|=atolr   r&   ytdistgetattrr   )r0   r?   Z	expectedZr2   r2   r3   r=   T   s   zTestLinkage.check_linkage_tdistc                 C   r9   )N)centroidmedianward)check_linkage_qr>   r2   r2   r3   test_linkage_XZ   rA   zTestLinkage.test_linkage_Xc                 C   sX   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_ư>rC   	euclidean)metric)	r   r&   XrG   r   scipyZspatialdistancer#   )r0   r?   rH   rI   r1   r2   r2   r3   rM   ^   s   
zTestLinkage.check_linkage_qc           	      C   sb   t jd}d}||d}t|}t D ]\}}t|||}t||}t	||ddd qd S )Nr         g+=V瞯<)ZrtolrD   )
r*   randomZRandomStaterandr#   r"   itemsr!   r   r   )	r0   rngnrR   dr?   codeZ	Z_trivialrH   r2   r2   r3   test_compare_with_triviali   s   
z%TestLinkage.test_compare_with_trivialc                 C   s*   t tjdd}ttd}t||dd d S )NT)Zoptimal_orderinglinkage_ytdist_single_olorB   rC   rE   )r0   rH   rI   r2   r2   r3   test_optimal_leaf_orderingt   s   
z&TestLinkage.test_optimal_leaf_orderingN)__name__
__module____qualname__r4   r7   r@   r=   rN   rM   r_   ra   r2   r2   r2   r3   r(   C   s    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?rV   )rV      rf   rg   )rV   rg   g'e@rg   )rV   rg   gev @rg   )rV   rg   g@rg   r   r:   r;   r<   rJ   rK   rL   c                 C   r9   Nrh   )check_linkage_tiesr>   r2   r2   r3   test_linkage_ties   rA   z!TestLinkageTies.test_linkage_tiesc                 C   sD   t ddgddgddgg}t||d}| j| }t||dd d S )Nr   r%   r?   rO   rC   )r*   arrayr   _expectationsr   )r0   r?   rR   rH   rI   r2   r2   r3   rj      s   
z"TestLinkageTies.check_linkage_tiesN)rb   rc   rd   r*   rn   ro   rk   rj   r2   r2   r2   r3   re   z   s2    






re   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)r0   depthr2   r2   r3   test_inconsistent_tdist   s   
z(TestInconsistent.test_inconsistent_tdistc                 C   s    t j}tt||t j|  d S rr   )r&   linkage_ytdist_singler   r   rs   )r0   ru   rH   r2   r2   r3   rt      s   
z)TestInconsistent.check_inconsistent_tdistN)rb   rc   rd   rv   rt   r2   r2   r2   r3   rq      s    rq   c                   @   rp   )TestCopheneticDistancec                 C   s.   t g d}tj}t|}t||dd d S )N  '     r|   r{   r{   rz   rz   r{   r{   r{         r{   r{   rB   rC   )r*   rn   r&   rw   r   r   )r0   	expectedMrH   Mr2   r2   r3   test_linkage_cophenet_tdist_Z   s   z4TestCopheneticDistance.test_linkage_cophenet_tdist_Zc                 C   sH   t j}t|t j\}}tg d}d}t||dd t||dd d S )Nry   g*ɻ2Qz?rB   rC   )r&   rw   r   rF   r*   rn   r   )r0   rH   cr   r   Z	expectedcr2   r2   r3   test_linkage_cophenet_tdist_Z_Y   s   z6TestCopheneticDistance.test_linkage_cophenet_tdist_Z_YN)rb   rc   rd   r   r   r2   r2   r2   r3   rx      s    rx   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestMLabLinkageConversionc                 C   s*   t g }ttg | ttg | d S rr   r*   asarrayr   r	   r
   )r0   rR   r2   r2   r3   "test_mlab_linkage_conversion_empty   s   
z<TestMLabLinkageConversion.test_mlab_linkage_conversion_emptyc                 C   s:   t g dg}g dg}tt|| tt|| d S )N)              ?      @       @r%   rV   rg   r   )r0   rH   Zmr2   r2   r3   'test_mlab_linkage_conversion_single_row   s   
zATestMLabLinkageConversion.test_mlab_linkage_conversion_single_rowc                 C   sv   t g dg dg dg dg dg}t jg dg dg dg d	g d
gt jd}tt|| tt|| d S )N)rg   r)   r}   )      r~   )r%      r|   )rV   	   rz   )   
   r{   )r         @     @a@r   )r         @     `k@r   )r   g      @     o@r   )r   g       @     p@r   )      @g      "@     pr@r   Zdtype)r*   r   rn   doubler   r	   r
   )r0   r   rH   r2   r2   r3   *test_mlab_linkage_conversion_multiple_rows   s   
zDTestMLabLinkageConversion.test_mlab_linkage_conversion_multiple_rowsN)rb   rc   rd   r   r   r   r2   r2   r2   r3   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   L   t jD ]}| |d qt jD ]}| |d qt jD ]}| |d qd S Nr   rT   maxclust)r&   fcluster_inconsistentcheck_fclusterdatafcluster_distancefcluster_maxclustr0   tr2   r2   r3   test_fclusterdata      


zTestFcluster.test_fclusterdatac                 C   s8   t td| | }tj}t|||d}tt|| d S NZ	fcluster_	criterionr   )rG   r&   Q_Xr   r   r   )r0   r   r   	expectedTrR   Tr2   r2   r3   r      s   zTestFcluster.check_fclusterdatac                 C   r   r   )r&   r   check_fclusterr   r   r   r2   r2   r3   test_fcluster   r   zTestFcluster.test_fclusterc                 C   s<   t td| | }ttj}t|||d}tt|| d S r   )rG   r&   r   r   r   r   r   )r0   r   r   r   rH   r   r2   r2   r3   r      s   
zTestFcluster.check_fclusterc                 C   s0   t jD ]}| | qt jD ]}| | qd S rr   )r&   r   check_fcluster_monocritr    check_fcluster_maxclust_monocritr   r2   r2   r3   test_fcluster_monocrit   s
   

z#TestFcluster.test_fcluster_monocritc                 C   :   t j| }tt j}t||dt|d}tt|| d S )Nmonocritr   r   )r&   r   r   r   r   r   r   r   r0   r   r   rH   r   r2   r2   r3   r         

z$TestFcluster.check_fcluster_monocritc                 C   r   )NZmaxclust_monocritr   )r&   r   r   r   r   r   r   r   r   r2   r2   r3   r      r   z-TestFcluster.check_fcluster_maxclust_monocritN)
rb   rc   rd   r   r   r   r   r   r   r   r2   r2   r2   r3   r      s    r   c                   @   s   e Zd Zdd ZdS )TestLeadersc                 C   sX   t j}t|}t|}t|ddd}tg dtg df}t||}t|| d S )Nr   rg   r   )5   7   8   )rV   rg   r%   )	r&   r   r#   r   r   r*   rn   r   r   )r0   rR   YrH   r   ZLrightLr2   r2   r3   test_leaders_single  s   
zTestLeaders.test_leaders_singleN)rb   rc   rd   r   r2   r2   r2   r3   r     s    r   c                   @   s^   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dZdS )TestIsIsomorphicc                 C   0   g d}g d}t t|| t t|| d S )Nr%   r%   r%   )rV   rV   rV   r   r   r0   abr2   r2   r3   test_is_isomorphic_1     z%TestIsIsomorphic.test_is_isomorphic_1c                 C   r   )N)r%   r   r%   )rV   rg   rV   r   r   r2   r2   r3   test_is_isomorphic_2  r   z%TestIsIsomorphic.test_is_isomorphic_2c                 C   s   g }g }t t|| d S rr   r   r   r2   r2   r3   test_is_isomorphic_3  s   z%TestIsIsomorphic.test_is_isomorphic_3c                 C   r   )Nr   )r%   rg   rV   r   r   r2   r2   r3   test_is_isomorphic_4A%  r   z&TestIsIsomorphic.test_is_isomorphic_4Ac                 C   s8   g d}g d}t t||dk t t||dk d S )N)r%   rV   rg   rg   )r%   rg   rV   rg   Fr   r   r2   r2   r3   test_is_isomorphic_4B,  s   z&TestIsIsomorphic.test_is_isomorphic_4Bc                 C   r   )N)r   rV   rg   )r)   rg   rV   r   r   r2   r2   r3   test_is_isomorphic_4C3  r   z&TestIsIsomorphic.test_is_isomorphic_4Cc                 C   s   dD ]}|  d| qd S )NrV   rg   r     help_is_isomorphic_randpermr0   Zncr2   r2   r3   test_is_isomorphic_5:  s   z%TestIsIsomorphic.test_is_isomorphic_5c                 C   s   dD ]
}|  d|dd qd S )Nr   r   Tr   r   r   r2   r2   r3   test_is_isomorphic_6@  s   z%TestIsIsomorphic.test_is_isomorphic_6c                 C   s   t tg dg d  d S )Nr   r   r   )r0   r2   r2   r3   test_is_isomorphic_7G  s   z%TestIsIsomorphic.test_is_isomorphic_7Fr   c                 C   s   t dD ]c}ttj|| }tj|jtjd}tj|}t d|jd D ]
}	|||	  ||	< q(|rStj|}
||
d|   d7  < ||
d|   |;  < t	t
||| k t	t
||| k qd S )Nrg   r   r   r%   )ranger*   Zint_rX   rY   r+   sizeZpermutationshaper   r   )r0   nobsZ	nclustersZnonisoZnerrorskr   r   PiQr2   r2   r3   r   K  s   z,TestIsIsomorphic.help_is_isomorphic_randpermN)Fr   )rb   rc   rd   r   r   r   r   r   r   r   r   r   r   r2   r2   r2   r3   r     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))rV   r   F)rV   rg   F)r%   r   T)rV   r   T)#check_is_valid_linkage_various_sizer0   nrowncolvalidr2   r2   r3   "test_is_valid_linkage_various_size[     z5TestIsValidLinkage.test_is_valid_linkage_various_sizec                 C   \   t jg dg dgt jd}|d |d |f }tt||k |s,ttt|dd d S d S N)r   r%   r   rV   r   )rg   rV   r   rg   rg   r   Tthrow)r*   r   r   r   r   r-   r.   )r0   r   r   r   rH   r2   r2   r3   r   `     
z6TestIsValidLinkage.check_is_valid_linkage_various_sizec                 C   >   t jg dg dgtd}tt|dk ttt|dd d S Nr   r%   r   rV   rg   rV   r   rg   r   FTr   )r*   r   intr   r   r-   	TypeErrorr0   rH   r2   r2   r3   test_is_valid_linkage_int_typei     
z1TestIsValidLinkage.test_is_valid_linkage_int_typec                 C   4   t jdt jd}tt|dk ttt|dd d S Nr   r   r   FTr   )r*   r+   r   r   r   r-   r.   r   r2   r2   r3   test_is_valid_linkage_emptyp     z.TestIsValidLinkage.test_is_valid_linkage_emptyc                 C   sF   t dddD ]}tj||d  d }t|}tt|dk qd S Nr      rg   r%   rV   T)r   r*   rX   rY   r   r   r   r0   r   r1   rH   r2   r2   r3   test_is_valid_linkage_4_and_upv  s
   z1TestIsValidLinkage.test_is_valid_linkage_4_and_upc                 C   sf   t dddD ]*}tj||d  d }t|}d||d df< tt|dk ttt|d	d
 qd S )Nr   r   rg   r%   rV   r   FTr   	r   r*   rX   rY   r   r   r   r-   r.   r   r2   r2   r3   -test_is_valid_linkage_4_and_up_neg_index_left~     z@TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_leftc                 C   sf   t dddD ]*}tj||d  d }t|}d||d df< tt|dk ttt|dd	 qd S 
Nr   r   rg   r%   rV   r  FTr   r  r   r2   r2   r3   .test_is_valid_linkage_4_and_up_neg_index_right  r  zATestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_rightc                 C   sf   t dddD ]*}tj||d  d }t|}d||d df< tt|dk ttt|dd	 qd S 
Nr   r   rg   r%   rV   g      FTr   r  r   r2   r2   r3   'test_is_valid_linkage_4_and_up_neg_dist  r  z:TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_distc                 C   sf   t dddD ]*}tj||d  d }t|}d||d df< tt|dk ttt|dd	 qd S r  r  r   r2   r2   r3   )test_is_valid_linkage_4_and_up_neg_counts  r  z<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_countsN)rb   rc   rd   r   r   r   r   r  r  r  r	  r
  r2   r2   r2   r3   r   Z  s    	


r   c                   @   r'   )TestIsValidInconsistentc                 C   r   r   )r*   r   r   r   r   r-   r   r0   Rr2   r2   r3   test_is_valid_im_int_type  r   z1TestIsValidInconsistent.test_is_valid_im_int_typec                 C   r   r   )check_is_valid_im_various_sizer   r2   r2   r3   test_is_valid_im_various_size  r   z5TestIsValidInconsistent.test_is_valid_im_various_sizec                 C   r   r   )r*   r   r   r   r   r-   r.   )r0   r   r   r   r  r2   r2   r3   r    r   z6TestIsValidInconsistent.check_is_valid_im_various_sizec                 C   r   r   )r*   r+   r   r   r   r-   r.   r  r2   r2   r3   test_is_valid_im_empty  r   z.TestIsValidInconsistent.test_is_valid_im_emptyc                 C   sN   t dddD ]}tj||d  d }t|}t|}tt|dk qd S r   )r   r*   rX   rY   r   r   r   r   r0   r   r1   rH   r  r2   r2   r3   test_is_valid_im_4_and_up  s   z1TestIsValidInconsistent.test_is_valid_im_4_and_upc                 C   sn   t dddD ].}tj||d  d }t|}t|}d||d df< tt|dk tt	t|d	d
 qd S )Nr   r   rg   r%   rV          r   FTr   
r   r*   rX   rY   r   r   r   r   r-   r.   r  r2   r2   r3   (test_is_valid_im_4_and_up_neg_index_left     z@TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_leftc                 C   sn   t dddD ].}tj||d  d }t|}t|}d||d df< tt|dk tt	t|dd	 qd S )
Nr   r   rg   r%   rV   r  FTr   r  r  r2   r2   r3   )test_is_valid_im_4_and_up_neg_index_right  r  zATestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_rightc                 C   sn   t dddD ].}tj||d  d }t|}t|}d||d df< tt|dk tt	t|dd	 qd S r  r  r  r2   r2   r3   "test_is_valid_im_4_and_up_neg_dist  r  z:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_distN)rb   rc   rd   r  r  r  r  r  r  r  r  r2   r2   r2   r3   r    s    		r  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestNumObsLinkagec                 C       t jdt jd}ttt| d S Nr   r   )r*   r+   r   r-   r.   r   r   r2   r2   r3   test_num_obs_linkage_empty     z,TestNumObsLinkage.test_num_obs_linkage_emptyc                 C   (   t jg dgt jd}tt|d d S )Nr   r   rV   r*   r   r   r   r   r   r2   r2   r3   test_num_obs_linkage_1x4     z*TestNumObsLinkage.test_num_obs_linkage_1x4c                 C   .   t jg dg dgt jd}tt|d d S )Nr   r   r   rg   r!  r   r2   r2   r3   test_num_obs_linkage_2x4     
z*TestNumObsLinkage.test_num_obs_linkage_2x4c                 C   sD   t dddD ]}tj||d  d }t|}tt|| qd S )Nr   r   rg   r%   rV   )r   r*   rX   rY   r   r   r   r   r2   r2   r3   test_num_obs_linkage_4_and_up  s
   z/TestNumObsLinkage.test_num_obs_linkage_4_and_upN)rb   rc   rd   r  r"  r%  r'  r2   r2   r2   r3   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   s4   t jg dgt jd}t| tt|ddg d S )Nr   r   r   r%   r*   r   r   r   r   r   r   r2   r2   r3   test_leaves_list_1x4	  s   z#TestLeavesList.test_leaves_list_1x4c                 C   s:   t jg dg dgt jd}t| tt|g d d S )Nr   r   r   )r   r%   rV   r*  r   r2   r2   r3   test_leaves_list_2x4  s   
z#TestLeavesList.test_leaves_list_2x4c                 C   r9   ri   )check_leaves_list_Qr>   r2   r2   r3   test_leaves_list_Q  s   z!TestLeavesList.test_leaves_list_Qc                 C   s.   t j}t||}t|}t| t| d S rr   )r&   r   r   r   r   	pre_orderr   )r0   r?   rR   rH   noder2   r2   r3   r-    s   
z"TestLeavesList.check_leaves_list_Qc                 C   s>   t j}t|d}t|}t| |  |    d S )Nr   )r&   r   r   r   r   r/  get_left	get_right)r0   rR   rH   r0  r2   r2   r3   test_Q_subtree_pre_order"  s   


z'TestLeavesList.test_Q_subtree_pre_orderN)rb   rc   rd   r+  r,  r.  r-  r3  r2   r2   r2   r3   r)    s    r)  c                   @   r(  )TestCorrespondc                 C   s&   t d}t d}ttt|| d S )Nr6   r   )r*   r+   r-   r.   r   )r0   r1   rH   r2   r2   r3   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 )NrV   r   r%   r   rg   )r   r*   rX   rY   r   r   r   r   r2   r2   r3   test_correspond_2_and_up2  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 ]4\}}tj||d  d }tj||d  d }t|}t|}tt||d tt||d q"d S )NrV   r   rg   r   r%   F	listzipr   r*   rX   rY   r   r   r   r0   r   jr1   Zy2rH   Z2r2   r2   r3   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 ]4\}}tj||d  d }tj||d  d }t|}t|}tt||d tt||d q"d S )NrV   r         r%   Fr7  r:  r2   r2   r3   test_correspond_4_and_up_2J  r>  z)TestCorrespond.test_correspond_4_and_up_2c                 C   s@   t ddD ]}tj|d}t|}t|}tt|| qd S )NrV   r   r   )r   r*   rX   rY   r#   r   r   r   )r0   r\   rR   r   rH   r2   r2   r3   !test_num_obs_linkage_multi_matrixV  s   z0TestCorrespond.test_num_obs_linkage_multi_matrixN)rb   rc   rd   r5  r6  r=  rA  rB  r2   r2   r2   r3   r4  +  s    r4  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   r5   )Nr   )r*   r+   r-   r.   r   r   r2   r2   r3   test_is_monotonic_empty`  r8   z'TestIsMonotonic.test_is_monotonic_emptyc                 C   r   )Nr   r%   333333?rV   r   Tr*   r   r   r   r   r   r2   r2   r3   test_is_monotonic_1x4e  r#  z%TestIsMonotonic.test_is_monotonic_1x4c                 C   r$  )NrE  )rV   rg   皙?rg   r   TrG  r   r2   r2   r3   test_is_monotonic_2x4_Tj  r&  z'TestIsMonotonic.test_is_monotonic_2x4_Tc                 C   r$  )N)r   r%   rI  rV   )rV   rg   rF  rg   r   FrG  r   r2   r2   r3   test_is_monotonic_2x4_Fp  r&  z'TestIsMonotonic.test_is_monotonic_2x4_Fc                 C   4   t jg dg dg dgt jd}tt|d d S )NrE  rV   rg   rI  rV   r   r   g333333?r   r   TrG  r   r2   r2   r3   test_is_monotonic_3x4_Tv     
z'TestIsMonotonic.test_is_monotonic_3x4_Tc                 C   rL  )NrE  )rV   rg   皙?rV   rN  r   FrG  r   r2   r2   r3   test_is_monotonic_3x4_F1}  rP  z(TestIsMonotonic.test_is_monotonic_3x4_F1c                 C   rL  )N)r   r%   g?rV   rM  rN  r   FrG  r   r2   r2   r3   test_is_monotonic_3x4_F2  rP  z(TestIsMonotonic.test_is_monotonic_3x4_F2c                 C   rL  )NrE  rM  )r   r   rQ  r   r   FrG  r   r2   r2   r3   test_is_monotonic_3x4_F3  rP  z(TestIsMonotonic.test_is_monotonic_3x4_F3c                 C   s   t tjd}tt|d d S Nr   Tr   r&   rF   r   r   r   r2   r2   r3    test_is_monotonic_tdist_linkage1  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage1c                 C   s&   t tjd}d|d< tt|d d S )Nr   r   )rV   rV   FrV  r   r2   r2   r3    test_is_monotonic_tdist_linkage2  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage2c                 C   s"   t j}t|d}tt|d d S rU  )r&   r   r   r   r   )r0   rR   rH   r2   r2   r3   test_is_monotonic_Q_linkage  s   
z+TestIsMonotonic.test_is_monotonic_Q_linkageN)rb   rc   rd   rD  rH  rJ  rK  rO  rR  rS  rT  rW  rX  rY  r2   r2   r2   r3   rC  _  s    rC  c                   @   r  )
TestMaxDistsc                 C   r  r  )r*   r+   r   r-   r.   r   r   r2   r2   r3   test_maxdists_empty_linkage  r  z(TestMaxDists.test_maxdists_empty_linkagec                 C   s8   t jg dgt jd}t|}t|}t||dd d S )Nr   r%   rF  r   r   rW   rC   )r*   r   r   r   calculate_maximum_distancesr   )r0   rH   MD
expectedMDr2   r2   r3   !test_maxdists_one_cluster_linkage  s   z.TestMaxDists.test_maxdists_one_cluster_linkagec                 C   r9   Nr   r:   rL   rJ   rK   )check_maxdists_Q_linkager>   r2   r2   r3   test_maxdists_Q_linkage  rA   z$TestMaxDists.test_maxdists_Q_linkagec                 C   s2   t j}t||}t|}t|}t||dd d S NrW   rC   )r&   r   r   r   r]  r   )r0   r?   rR   rH   r^  r_  r2   r2   r3   rc    s
   
z%TestMaxDists.check_maxdists_Q_linkageN)rb   rc   rd   r[  r`  rd  rc  r2   r2   r2   r3   rZ    s
    rZ  c                   @   r(  )TestMaxInconstsc                 C   s2   t jdt jd}t jdt jd}ttt|| d S r  )r*   r+   r   r-   r.   r   r0   rH   r  r2   r2   r3   test_maxinconsts_empty_linkage  s   z.TestMaxInconsts.test_maxinconsts_empty_linkagec                 C   s6   t jg dgt jd}t jdd}ttt|| d S Nr\  r   rV   r   )r*   r   r   rX   rY   r-   r.   r   rg  r2   r2   r3   test_maxinconsts_difrow_linkage  s   z/TestMaxInconsts.test_maxinconsts_difrow_linkagec                 C   sR   t jg dgt jd}t jg dgt jd}t||}t||}t||dd d S )Nr\  r   r   r   r   rF  rW   rC   )r*   r   r   r   !calculate_maximum_inconsistenciesr   )r0   rH   r  r^  r_  r2   r2   r3   $test_maxinconsts_one_cluster_linkage  s
   

z4TestMaxInconsts.test_maxinconsts_one_cluster_linkagec                 C   r9   ra  )check_maxinconsts_Q_linkager>   r2   r2   r3   test_maxinconsts_Q_linkage  rA   z*TestMaxInconsts.test_maxinconsts_Q_linkagec                 C   s>   t j}t||}t|}t||}t||}t||dd d S re  )r&   r   r   r   r   rl  r   )r0   r?   rR   rH   r  r^  r_  r2   r2   r3   rn    s   


z+TestMaxInconsts.check_maxinconsts_Q_linkageN)rb   rc   rd   rh  rj  rm  ro  rn  r2   r2   r2   r3   rf    s    rf  c                   @   s\   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S )TestMaxRStatc                 C   r9   )N)gffffff
@rl   r   )check_maxRstat_invalid_indexr0   r   r2   r2   r3   test_maxRstat_invalid_index  rA   z(TestMaxRStat.test_maxRstat_invalid_indexc                 C   s^   t jg dgt jd}t jg dgt jd}t|tr%ttt||| d S ttt||| d S )Nr\  r   rk  )	r*   r   r   
isinstancer   r-   r.   r   r   r0   r   rH   r  r2   r2   r3   rq    s
   
z)TestMaxRStat.check_maxRstat_invalid_indexc                 C      t dD ]}| | qd S Nr   )r   check_maxRstat_empty_linkagerr  r2   r2   r3   test_maxRstat_empty_linkage     z(TestMaxRStat.test_maxRstat_empty_linkagec                 C   s4   t jdt jd}t jdt jd}ttt||| d S r  )r*   r+   r   r-   r.   r   ru  r2   r2   r3   rx    r   z)TestMaxRStat.check_maxRstat_empty_linkagec                 C   rv  rw  )r   check_maxRstat_difrow_linkagerr  r2   r2   r3   test_maxRstat_difrow_linkage  rz  z)TestMaxRStat.test_maxRstat_difrow_linkagec                 C   s8   t jg dgt jd}t jdd}ttt||| d S ri  )r*   r   r   rX   rY   r-   r.   r   ru  r2   r2   r3   r{    s   z*TestMaxRStat.check_maxRstat_difrow_linkagec                 C   rv  rw  )r   "check_maxRstat_one_cluster_linkagerr  r2   r2   r3   !test_maxRstat_one_cluster_linkage  rz  z.TestMaxRStat.test_maxRstat_one_cluster_linkagec                 C   sV   t jg dgt jd}t jg dgt jd}t||d}t||d}t||dd d S )Nr\  r   rk  r%   rW   rC   )r*   r   r   r   rl  r   )r0   r   rH   r  r^  r_  r2   r2   r3   r}    s
   z/TestMaxRStat.check_maxRstat_one_cluster_linkagec                 C   s(   dD ]}t dD ]}| || qqd S )Nrb  r   )r   check_maxRstat_Q_linkage)r0   r?   r   r2   r2   r3   test_maxRstat_Q_linkage  s
   z$TestMaxRStat.test_maxRstat_Q_linkagec                 C   sB   t j}t||}t|}t||d}t||d}t||dd d S )Nr%   rW   rC   )r&   r   r   r   r   rl  r   )r0   r?   r   rR   rH   r  r^  r_  r2   r2   r3   r    s   
z%TestMaxRStat.check_maxRstat_Q_linkageN)rb   rc   rd   rs  rq  ry  rx  r|  r{  r~  r}  r  r  r2   r2   r2   r3   rp    s    	rp  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S )TestDendrogramc                 C   s2   t tjd}t|dd}|d }t|g d d S )Nr   T)no_plotleavesrV   r   r%   r   rg   r   )r   r&   rF   r   r   )r0   rH   r  r  r2   r2   r3   $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   r&   rF   r-   r.   r   r   r2   r2   r3   test_valid_orientation+  s   z%TestDendrogram.test_valid_orientationc                 C   sJ   t tjd}tg d}t||dd}t|| dd}||ks#J d S )Nr   )r%   rg   rV   r)   r   r   T)labelsr  )r   r&   rF   r*   rn   r   tolist)r0   rH   r  Zresult1Zresult2r2   r2   r3   test_labels_as_array_or_list/  s
   z+TestDendrogram.test_labels_as_array_or_listzno matplotlib)reasonc                 C   s   t 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   )rV   rg   r   r   )r   r   r   r)   d   )r  z.Dimensions of Z and labels must be consistent.)match)r*   rn   pltfigurepytestr   r.   r   r8  r   strvalueclose)r0   linkexc_infor2   r2   r3   test_valid_label_size7  s&   z$TestDendrogram.test_valid_label_sizec                 C   r9   )N)topbottomleftright)check_dendrogram_plot)r0   r  r2   r2   r3   test_dendrogram_plotK  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|| t|||ddd |dv r]| 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 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_listZdcoordZicoordZivlr  Zleaves_color_list   )axr  rU   Z   )r  r  leaf_font_sizeleaf_rotation)r  r  r   )r  r  r  )r  r  r  r  )r   r&   rF   r  r  Zadd_subplotr   r   Zget_xticklabelsZget_yticklabelsZget_rotationZget_sizer  )	r0   r  rH   ZexpectedZfigr  ZR1Z	testlabelZR2r2   r2   r3   r  P  sf   




z$TestDendrogram.check_dendrogram_plotc              	   C   s   t tjd}t|dddd}t  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|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   rV   ZlastpT)Zshow_contractedr  )r   r   r   r   r  (2)z(4)r)   r   r  Z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  )rV   r   r%   r   r   )r  r  r  r  r  )r   r&   rF   r   r  r  r   rg  r2   r2   r3   test_dendrogram_truncate_mode  s6   
z,TestDendrogram.test_dendrogram_truncate_modec                 C   sV   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   mr1   r   Tg   )r  Zabove_threshold_colorZcolor_threshold)r  rr   r  r1   r   r  )r   r  r  r  r  )r   r&   rF   r   r   r   )r0   rH   r  r  r2   r2   r3   test_dendrogram_colors  s   z%TestDendrogram.test_dendrogram_colorsN)rb   rc   rd   r  r  r  r  ZmarkZskipifhave_matplotlibr  r  r  r  r  r2   r2   r2   r3   r  #  s    

<
r  c                 C   s   | j d d }t|d f}td}td|d D ]>}d|d d < | |df }| |df }||kr=|t||  |d< ||krK|t||  |d< | |df |d< | ||< q|S Nr   r%   rg   r   rV   r   r*   r+   r   r   max)rH   r\   Bqr   r  r  r2   r2   r3   r]       
r]  rg   c           	      C   s   | j d d }t|d f}td}td|d D ]>}d|d d < | |df }| |df }||kr=|t||  |d< ||krK|t||  |d< |||f |d< | ||< q|S r  r  )	rH   r  r   r\   r  r  r   r  r  r2   r2   r3   rl    r  rl  c                 C   s   t | |  |k S rr   )r*   absr  )r   r   Ztolr2   r2   r3   
within_tol  s   r  c                   C   s   t ttddgddgg d S )Nr   r%   )r   r   r   r2   r2   r2   r3   <test_unsupported_uncondensed_distance_matrix_linkage_warning  s   r  c                  C   s2   t jjjD ]} tttddgddgg| dd qd S )Nr%   Z	cityblockr?   rQ   )rS   cluster	hierarchyZ_EUCLIDEAN_METHODSr-   r.   r   rm   r2   r2   r3   "test_euclidean_linkage_value_error  s
   r  c                  C   s8   t dgddd} t ddgddggddd}t| | d S )Nr%   r   rP   r  r   )r   r   )ZZ1r<  r2   r2   r3   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   )r*   rX   seedrandnrS   r  r  rL   r   r   r1  r2  )r   rR   rH   Ztreer2   r2   r3   test_node_compare  s   r  c                  C   s  t jd d} t j| d}tjj|}t|}t	|d d df t 
|  t	|d d df t |  t	|dt 
| d dd t	|d d dgf t|dd	 t	|d d dd
gf t|ddgd	 t	|d d d
dgf t|ddgd	 t|}t dd |D }t	|d d t |dgf t|dd t	|d d t |ddgf t|ddgd t	|d d t |ddgf t|ddgd d S )Nr  r  r   r   rl   r%   r   )Z
n_clustersir   c                 S   s   g | ]}|j qS r2   )Zdist).0r0  r2   r2   r3   
<listcomp>  s    z!test_cut_tree.<locals>.<listcomp>)Zheight)r*   rX   r  r  rS   r  r  rL   r   r   Zaranger+   r  r    rn   Zsearchsorted)r   rR   rH   ZcutreeZnodesZheightsr2   r2   r3   test_cut_tree  s,    &&
r  c                  C   sR   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 )NrB   rC   rL   rO   )r   r   r&   rF   r`   r   rR   Zlinkage_X_ward_olo)rH   rI   r2   r2   r3   ra     s   
ra   c                  C   s  t 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)rV   rl   r         rg   keyrg   r  r  r%   rl   g      @rV   r   r   r   )r*   rn   r$   Zget_minr   Z
remove_minZchange_value)valuesZheapZpairr2   r2   r3   	test_Heap&  s.   r  r  )QZnumpyr*   Znumpy.testingr   r   r   r   r  r   r-   Zscipy.cluster.hierarchyrS   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$    r&   Z
matplotlibZuseZmatplotlib.pyplotZpyplotr  r  	Exceptionr(   re   rq   rx   r   r   r   r   r   r  r  r)  r4  rC  rZ  rf  rp  r  r]  rl  r  r  r  r  r  r  ra   r  r2   r2   r2   r3   <module>   s\   !x
72JMG#4H$> 
