o
    Ö­j�Ë  ã                   @   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l6Z6e6 7d¡ d dl8m9Z: dZ;W n e<y    dZ;Y nw e.ej= >d¡gZ?ej=j@Z@G dd„ dƒZAe@dd�G dd„ dƒƒZBe@dd�G dd„ dƒƒZCe@dd�G dd„ dƒƒZDG dd„ dƒZEe@dd�G dd„ dƒƒZFe@dd�G dd„ dƒƒZGe@ddd �G d!d"„ d"ƒƒZHe@dd�G d#d$„ d$ƒƒZIe@dd�G d%d&„ d&ƒƒZJG d'd(„ d(ƒZKe@dd�G d)d*„ d*ƒƒZLe@dd�G d+d,„ d,ƒƒZMe@dd�G d-d.„ d.ƒƒZNe@dd�G d/d0„ d0ƒƒZOG d1d2„ d2ƒZPG d3d4„ d4ƒZQe@dd�G d5d6„ d6ƒƒZRd7d8„ ZSd9efd:d;„ZTej=jUe@dd�d<d=„ ƒƒZVd>d?„ ZWe@dd�d@dA„ ƒZXe@dd�dBdC„ ƒZYe@ddDd �dEdF„ ƒZZe@dd�dGdH„ ƒZ[e@ddId �dJdK„ ƒZ\e@dd�dLdM„ ƒZ]dS )Né    N)Úassert_allcloseÚassert_equalÚassert_array_equalÚassert_Úassert_warns)Úraises)ÚClusterWarningÚlinkageÚfrom_mlab_linkageÚto_mlab_linkageÚnum_obs_linkageÚinconsistentÚcophenetÚfclusterdataÚfclusterÚis_isomorphicÚsingleÚleadersÚ
correspondÚis_monotonicÚmaxdistsÚmaxinconstsÚmaxRstatÚis_valid_linkageÚis_valid_imÚto_treeÚleaves_listÚ
dendrogramÚset_link_color_paletteÚcut_treeÚoptimal_leaf_orderingÚ_order_cluster_treeÚ
_hierarchyÚ_LINKAGE_METHODS)Úpdist)ÚHeap)Úarray_api_compatible)Úxp_assert_closeÚxp_assert_equal©ÚLocké   )Úhierarchy_test_dataÚAggTFÚskip_xp_backendsc                   @   sˆ   e Zd Zedd�dd„ ƒZedd�dd„ ƒZedd�dd„ ƒZd	d
„ Zedd�dd„ ƒZdd„ Z	edd�dd„ ƒZ
edd�dd„ ƒZdS )ÚTestLinkageT©Úcpu_onlyc                 C   s(   |  |jgdgd  ¡}ttt|ƒ d S )Nç        é   )ÚasarrayÚnanÚassert_raisesÚ
ValueErrorr	   ©ÚselfÚxpÚy© r<   ú_/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/cluster/tests/test_hierarchy.pyÚ3test_linkage_non_finite_elements_in_distance_matrixN   s   z?TestLinkage.test_linkage_non_finite_elements_in_distance_matrixc                 C   s   |  d¡}ttt|ƒ d S )N©r   )Úzerosr6   r7   r	   r8   r<   r<   r=   Ú"test_linkage_empty_distance_matrixU   s   
z.TestLinkage.test_linkage_empty_distance_matrixc                 C   ó   dD ]}|   ||¡ qd S )N)r   ÚcompleteÚaverageÚweighted)Úcheck_linkage_tdist©r9   r:   Úmethodr<   r<   r=   Útest_linkage_tdist[   ó   ÿzTestLinkage.test_linkage_tdistc                 C   s8   t | tj¡|ƒ}ttd| ƒ}t|| |¡dd� d S )NÚlinkage_ytdist_ç»½×Ùß|Û=©Úatol©r	   r4   r,   ÚytdistÚgetattrr'   )r9   rH   r:   ÚZÚ	expectedZr<   r<   r=   rF   `   s   zTestLinkage.check_linkage_tdistc                 C   rB   )N)ÚcentroidÚmedianÚward)Úcheck_linkage_qrG   r<   r<   r=   Útest_linkage_Xf   rJ   zTestLinkage.test_linkage_Xc                 C   sp   t | tj¡|ƒ}ttd| ƒ}t|| |¡dd� tjjj	tjdd�}t | |¡|ƒ}t|| |¡dd� d S )NÚ
linkage_X_ç�íµ ÷Æ°>rM   Ú	euclidean)Úmetric)
r	   r4   r,   ÚXrQ   r'   ÚscipyÚspatialÚdistancer$   )r9   rH   r:   rR   rS   r;   r<   r<   r=   rW   k   s   ÿzTestLinkage.check_linkage_qc           
      C   sn   t j d¡}d}| |d¡}t|ƒ}t ¡ D ]\}}t |||¡}t| 	|¡|ƒ}	t
|	| 	|¡ddd� qd S )Nr   é   é   g›+¡†›„=çVçž¯Ò<)ÚrtolrN   )ÚnpÚrandomÚRandomStateÚrandr$   r#   Úitemsr"   r	   r4   r'   )
r9   r:   ÚrngÚnr]   ÚdrH   ÚcodeÚ	Z_trivialrR   r<   r<   r=   Útest_compare_with_trivialv   s   ýz%TestLinkage.test_compare_with_trivialc                 C   s6   t | tj¡dd�}ttdƒ}t|| |¡dd� d S )NT)Úoptimal_orderingÚlinkage_ytdist_single_olorL   rM   rO   )r9   r:   rR   rS   r<   r<   r=   Útest_optimal_leaf_ordering‚   s   
z&TestLinkage.test_optimal_leaf_orderingN)Ú__name__Ú
__module__Ú__qualname__r.   r>   rA   rI   rF   rX   rW   ro   rr   r<   r<   r<   r=   r/   L   s    




r/   r0   c                   @   s®   e Zd Ze g d¢g d¢g¡e g d¢g d¢g¡e g d¢g d¢g¡e g d¢g d¢g¡e g d¢g d¢g¡e g d¢g d¢g¡e g d¢g d¢g¡dœZdd„ Zd	d
„ ZdS )ÚTestLinkageTies)r   r+   çß'Üež ö?rb   )rb   é   rw   rx   )rb   rx   gß'Üež @rx   )rb   rx   gçeÌvø @rx   )rb   rx   g€©Ž˜@rx   ©r   rC   rD   rE   rT   rU   rV   c                 C   rB   ©Nry   )Úcheck_linkage_tiesrG   r<   r<   r=   Útest_linkage_ties�   ó   þz!TestLinkageTies.test_linkage_tiesc                 C   sJ   |  ddgddgddgg¡}t||d�}| j| }t||  |¡dd� d S )Néÿÿÿÿr   r+   ©rH   rZ   rM   )r4   r	   Ú_expectationsr'   )r9   rH   r:   r]   rR   rS   r<   r<   r=   r{   ¢   s   
z"TestLinkageTies.check_linkage_tiesN)rs   rt   ru   re   Úarrayr€   r|   r{   r<   r<   r<   r=   rv   ‰   s2    
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿórv   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestInconsistentc                 C   s   t jD ]}|  ||¡ qd S ©N)r,   Úinconsistent_ytdistÚcheck_inconsistent_tdist)r9   r:   Údepthr<   r<   r=   Útest_inconsistent_tdist¬   s   
ÿz(TestInconsistent.test_inconsistent_tdistc                 C   s,   |  tj¡}tt||ƒ|  tj| ¡ƒ d S rƒ   )r4   r,   Úlinkage_ytdist_singler'   r   r„   )r9   r†   r:   rR   r<   r<   r=   r…   °   s   
ÿz)TestInconsistent.check_inconsistent_tdistN)rs   rt   ru   r‡   r…   r<   r<   r<   r=   r‚   ©   s    r‚   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestCopheneticDistancec                 C   s@   |  g d¢¡}|  tj¡}t|ƒ}t||j ||jd�dd� d S )N©é  é'  éÿ   r�   rŒ   rŒ   r‹   r‹   rŒ   rŒ   rŒ   éŠ   éÛ   rŒ   rŒ   ©ÚdtyperL   rM   )r4   r,   rˆ   r   r'   Úfloat64)r9   r:   Ú	expectedMrR   ÚMr<   r<   r=   Útest_linkage_cophenet_tdist_Z¹   s   z4TestCopheneticDistance.test_linkage_cophenet_tdist_Zc                 C   sj   |  tj¡}t||  tj¡ƒ\}}|j g d¢|jd�}|j d|jd�d }t||dd� t||dd� d S )NrŠ   r�   g*É»2Qzä?r<   rL   rM   )r4   r,   rˆ   r   rP   r’   r'   )r9   r:   rR   Úcr”   r“   Ú	expectedcr<   r<   r=   Útest_linkage_cophenet_tdist_Z_YÁ   s   
ÿz6TestCopheneticDistance.test_linkage_cophenet_tdist_Z_Yc                 C   sˆ   g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g}t jtdd�� t| |¡ƒ W d   ƒ d S 1 s=w   Y  d S )N)r2   ç      ð?r™   ç       @)rš   ç      (@r™   ç      @)rœ   ç      @r™   rš   )ç      @g      ,@r™   rœ   )ç      @ç      @r™   rš   )ç       @g      0@r™   rœ   )ç      "@ç      $@r™   rš   )g      &@g      2@r™   rœ   )g      *@ç      .@rš   rŸ   )g      1@g      4@rš   g      @@)g      3@g      5@rš   r›   zexcessive observations©Úmatch)Úpytestr   r7   r   r4   )r9   r:   Úarrr<   r<   r=   Útest_gh_22183Ë   s   ö"ÿz$TestCopheneticDistance.test_gh_22183N)rs   rt   ru   r•   r˜   r©   r<   r<   r<   r=   r‰   ¶   s    
r‰   c                   @   s8   e Zd Zdd„ Zedd�dd„ ƒZedd�dd„ ƒZd	S )
ÚTestMLabLinkageConversionc                 C   s0   |j g |jd�}tt|ƒ|ƒ tt|ƒ|ƒ d S )Nr�   )r4   r’   r(   r
   r   )r9   r:   r]   r<   r<   r=   Ú"test_mlab_linkage_conversion_emptyá   s   z<TestMLabLinkageConversion.test_mlab_linkage_conversion_emptyTr0   c                 C   s`   |  g d¢g¡}|  g d¢g¡}tt|ƒ|j ||jd�dd� tt|ƒ|j ||jd�dd� d S )N)r2   r™   rœ   rš   ©r+   rb   rx   r�   rc   ©rd   )r4   r'   r
   r’   r   )r9   r:   rR   ÚZmr<   r<   r=   Ú'test_mlab_linkage_conversion_single_rowç   s   ÿ
ÿzATestMLabLinkageConversion.test_mlab_linkage_conversion_single_rowc                 C   sŠ   |  g d¢g d¢g d¢g d¢g d¢g¡}|j g d¢g d¢g d¢g d	¢g d
¢g|jd�}tt|ƒ|dd� tt|ƒ|j ||jd�dd� d S )N)rx   é   rŽ   )é   r3   r�   )r+   é   r�   )rb   é	   r‹   )é   é
   rŒ   )rš   rž   ç     @a@rš   )rœ   r�   ç     `k@rš   )r2   r    ç     ào@rœ   )r™   r¡   ç     Àp@r�   )rŸ   r¢   ç     pr@rŸ   r�   rc   r­   )r4   r’   r'   r
   r   )r9   r:   r®   rR   r<   r<   r=   Ú*test_mlab_linkage_conversion_multiple_rowsñ   s   ÿ
üû
ÿzDTestMLabLinkageConversion.test_mlab_linkage_conversion_multiple_rowsN)rs   rt   ru   r«   r.   r¯   r»   r<   r<   r<   r=   rª   ß   s    
	rª   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestFclusterc                 C   óR   t jD ]	}|  |d|¡ qt jD ]	}|  |d|¡ qt jD ]	}|  |d|¡ qd S ©Nr   r`   Úmaxclust)r,   Úfcluster_inconsistentÚcheck_fclusterdataÚfcluster_distanceÚfcluster_maxclust©r9   r:   Útr<   r<   r=   Útest_fclusterdata  ó   


ÿzTestFcluster.test_fclusterdatac                 C   sD   |  ttd| ƒ| ¡}|  tj¡}t|||d�}tt||ƒƒ d S ©NÚ	fcluster_©Ú	criterionrÅ   )r4   rQ   r,   ÚQ_Xr   r   r   )r9   rÅ   rË   r:   Ú	expectedTr]   ÚTr<   r<   r=   rÁ     s   zTestFcluster.check_fclusterdatac                 C   r½   r¾   )r,   rÀ   Úcheck_fclusterrÂ   rÃ   rÄ   r<   r<   r=   Útest_fcluster  rÇ   zTestFcluster.test_fclusterc                 C   sH   |  ttd| ƒ| ¡}t|  tj¡ƒ}t|||d�}tt||ƒƒ d S rÈ   )r4   rQ   r,   r   rÌ   r   r   r   )r9   rÅ   rË   r:   rÍ   rR   rÎ   r<   r<   r=   rÏ     s   zTestFcluster.check_fclusterc                 C   s4   t jD ]}|  ||¡ qt jD ]}|  ||¡ qd S rƒ   )r,   rÂ   Úcheck_fcluster_monocritrÃ   Ú check_fcluster_maxclust_monocritrÄ   r<   r<   r=   Útest_fcluster_monocrit"  s
   

ÿz#TestFcluster.test_fcluster_monocritc                 C   óF   |  tj| ¡}t|  tj¡ƒ}t||dt|ƒd�}tt||ƒƒ d S )NÚmonocrit©rË   rÕ   )	r4   r,   rÂ   r   rÌ   r   r   r   r   ©r9   rÅ   r:   rÍ   rR   rÎ   r<   r<   r=   rÑ   (  ó   z$TestFcluster.check_fcluster_monocritc                 C   rÔ   )NÚmaxclust_monocritrÖ   )	r4   r,   rÃ   r   rÌ   r   r   r   r   r×   r<   r<   r=   rÒ   .  rØ   z-TestFcluster.check_fcluster_maxclust_monocritc                 C   sš   |  dgdgdgg¡}t|ƒ}tt|ddd�|  g d¢¡ƒ tt|ddd�|  g d¢¡ƒ tt|d	dd�|  g d
¢¡ƒ tt|ddd�|  g d
¢¡ƒ d S )Nr+   r±   r3   r¿   )rÅ   rË   ©r+   r+   r+   rb   )rb   r+   r+   rx   r¬   )r4   r   r   r   ©r9   r:   r;   rR   r<   r<   r=   Útest_fcluster_maxclust_gh_126514  s   ÿÿÿÿz,TestFcluster.test_fcluster_maxclust_gh_12651N)rs   rt   ru   rÆ   rÁ   rÐ   rÏ   rÓ   rÑ   rÒ   rÜ   r<   r<   r<   r=   r¼     s    r¼   c                   @   s   e Zd Zdd„ ZdS )ÚTestLeadersc                 C   s‚   t j}t|ƒ}| |¡}t|ƒ}t|ddd�}| g d¢¡| g d¢¡f}|j||jd�}t||ƒ}tt	 
|¡t	 
|¡dd� d S )	Nr¿   rx   rÊ   )é5   é7   é8   )rb   rx   r+   r�   rc   r­   )r,   rÌ   r$   r4   r	   r   Úint32r   r   re   Úconcatenate)r9   r:   r]   ÚYrR   rÎ   ÚLrightÚLr<   r<   r=   Útest_leaders_singleD  s   

zTestLeaders.test_leaders_singleN)rs   rt   ru   ræ   r<   r<   r<   r=   rÝ   A  s    rÝ   z+`is_isomorphic` only supports NumPy backend©Únp_onlyÚreasonc                   @   sr   e Zd Zeddd�dd„ ƒZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zddd„ZdS )ÚTestIsIsomorphicTz,array-likes only supported for NumPy backendrç   c                 C   s(   t g d¢g d¢ƒsJ ‚t g g ƒsJ ‚d S ©NrÚ   )rb   rb   rb   )r   )r9   r:   r<   r<   r=   Útest_array_likeU  s   z TestIsIsomorphic.test_array_likec                 C   ó<   |  g d¢¡}|  g d¢¡}t||ƒsJ ‚t||ƒsJ ‚d S rë   ©r4   r   ©r9   r:   ÚaÚbr<   r<   r=   Útest_is_isomorphic_1[  ó   z%TestIsIsomorphic.test_is_isomorphic_1c                 C   rí   )N)r+   r´   r+   )rb   rx   rb   rî   rï   r<   r<   r=   Útest_is_isomorphic_2b  ró   z%TestIsIsomorphic.test_is_isomorphic_2c                 C   s&   |  g ¡}|  g ¡}t||ƒsJ ‚d S rƒ   rî   rï   r<   r<   r=   Útest_is_isomorphic_3i  s   

z%TestIsIsomorphic.test_is_isomorphic_3c                 C   rí   )Nr¬   )r+   rx   rb   rî   rï   r<   r<   r=   Útest_is_isomorphic_4Ao  ó   z&TestIsIsomorphic.test_is_isomorphic_4Ac                 C   sD   |  g d¢¡}|  g d¢¡}t||ƒdu sJ ‚t||ƒdu s J ‚d S )N)r+   rb   rx   rx   )r+   rx   rb   rx   Frî   rï   r<   r<   r=   Útest_is_isomorphic_4Bw  s   z&TestIsIsomorphic.test_is_isomorphic_4Bc                 C   rí   )N)r´   rb   rx   )r°   rx   rb   rî   rï   r<   r<   r=   Útest_is_isomorphic_4C  r÷   z&TestIsIsomorphic.test_is_isomorphic_4Cc                 C   s   dD ]
}| j d||d� qd S )N©rb   rx   r3   éè  ©r:   ©Úhelp_is_isomorphic_randperm©r9   r:   Úncr<   r<   r=   Útest_is_isomorphic_5‡  s   ÿz%TestIsIsomorphic.test_is_isomorphic_5c                 C   s"   dD ]}| j d|dd|d� qd S )Nrú   rû   Tr3   rü   rý   rÿ   r<   r<   r=   Útest_is_isomorphic_6�  s   ÿz%TestIsIsomorphic.test_is_isomorphic_6c                 C   s.   |  g d¢¡}|  g d¢¡}t||ƒrJ ‚d S )Nr¬   rÚ   rî   rï   r<   r<   r=   Útest_is_isomorphic_7”  s   z%TestIsIsomorphic.test_is_isomorphic_7Fr   c                C   sæ   t dƒD ]l}tj |¡|  t¡}tj|jtd�}tj |¡}	t d|j	d ƒD ]
}
|	||
  ||
< q'|rRtj |¡}||d|…   d7  < ||d|…   |;  < | 
|¡}| 
|¡}t||ƒ| ksfJ ‚t||ƒ| kspJ ‚qd S )Nrx   r�   r   r+   )Úrangere   rf   rh   ÚastypeÚintr@   ÚsizeÚpermutationÚshaper4   r   )r9   ÚnobsÚ	nclustersÚnonisoÚnerrorsr:   Úkrð   rñ   ÚPÚiÚQr<   r<   r=   rþ   š  s   

óz,TestIsIsomorphic.help_is_isomorphic_randpermN)Fr   )rs   rt   ru   r.   rì   rò   rô   rõ   rö   rø   rù   r  r  r  rþ   r<   r<   r<   r=   rê   Q  s    ÿ
rê   c                   @   s„   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zeddd�dd„ ƒZ	eddd�dd„ ƒZ
eddd�dd„ ƒZeddd�dd„ ƒZdS )ÚTestIsValidLinkagec                 C   ó$   dD ]\}}}|   ||||¡ qd S ©N))rb   r3   F)rb   rx   F)r+   r±   T)rb   r±   T)Ú#check_is_valid_linkage_various_size©r9   r:   ÚnrowÚncolÚvalidr<   r<   r=   Ú"test_is_valid_linkage_various_size¯  ó   þz5TestIsValidLinkage.test_is_valid_linkage_various_sizec                 C   ó\   |j g d¢g d¢g|jd�}|d |…d |…f }tt|ƒ|kƒ |s,ttt|dd� d S d S ©N)r   r+   rœ   rb   r3   )rx   rb   r�   rx   rx   r�   T©Úthrow)r4   r’   r   r   r6   r7   )r9   r  r  r  r:   rR   r<   r<   r=   r  ´  ó   
ÿÿÿz6TestIsValidLinkage.check_is_valid_linkage_various_sizec                 C   ó@   |j g d¢g d¢g|jd�}tt|ƒdu ƒ ttt|dd� d S ©N©r   r+   rœ   rb   ©rx   rb   r�   rx   r�   FTr  )r4   Úint64r   r   r6   Ú	TypeError©r9   r:   rR   r<   r<   r=   Útest_is_valid_linkage_int_type½  ó   
ÿÿz1TestIsValidLinkage.test_is_valid_linkage_int_typec                 C   ó4   |j d|jd�}tt|ƒdu ƒ ttt|dd� d S ©N©r   r±   r�   FTr  )r@   r’   r   r   r6   r7   r'  r<   r<   r=   Útest_is_valid_linkage_emptyÄ  ó   z.TestIsValidLinkage.test_is_valid_linkage_emptyc                 C   sP   t dddƒD ]}tj ||d  d ¡}| |¡}t|ƒ}tt|ƒdu ƒ qd S ©Nr±   é   rx   r+   rb   T)r  re   rf   rh   r4   r	   r   r   ©r9   r:   r  r;   rR   r<   r<   r=   Útest_is_valid_linkage_4_and_upÊ  s   
üz1TestIsValidLinkage.test_is_valid_linkage_4_and_upú	jax.numpyú)jax arrays do not support item assignment©ré   c                 C   sp   t dddƒD ]/}tj ||d  d ¡}| |¡}t|ƒ}d||d df< tt|ƒdu ƒ tt	t|d	d
� qd S )Nr±   r0  rx   r+   rb   éþÿÿÿr   FTr  ©
r  re   rf   rh   r4   r	   r   r   r6   r7   r1  r<   r<   r=   Ú-test_is_valid_linkage_4_and_up_neg_index_leftÓ  ó   
úz@TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_leftc                 C   sp   t dddƒD ]/}tj ||d  d ¡}| |¡}t|ƒ}d||d df< tt|ƒdu ƒ tt	t|dd	� qd S ©
Nr±   r0  rx   r+   rb   r6  FTr  r7  r1  r<   r<   r=   Ú.test_is_valid_linkage_4_and_up_neg_index_rightà  r9  zATestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_rightc                 C   sp   t dddƒD ]/}tj ||d  d ¡}| |¡}t|ƒ}d||d df< tt|ƒdu ƒ tt	t|dd	� qd S ©
Nr±   r0  rx   r+   rb   g      à¿FTr  r7  r1  r<   r<   r=   Ú'test_is_valid_linkage_4_and_up_neg_distí  r9  z:TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_distc                 C   sp   t dddƒD ]/}tj ||d  d ¡}| |¡}t|ƒ}d||d df< tt|ƒdu ƒ tt	t|dd	� qd S r:  r7  r1  r<   r<   r=   Ú)test_is_valid_linkage_4_and_up_neg_countsú  r9  z<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_countsN)rs   rt   ru   r  r  r(  r-  r2  r.   r8  r;  r=  r>  r<   r<   r<   r=   r  ¬  s,    		ÿ
ÿ
ÿ
ÿr  c                   @   sp   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zeddd�dd„ ƒZ	eddd�dd„ ƒZ
eddd�dd„ ƒZdS )ÚTestIsValidInconsistentc                 C   r!  r"  )r4   r%  r   r   r6   r&  ©r9   r:   ÚRr<   r<   r=   Útest_is_valid_im_int_type  r)  z1TestIsValidInconsistent.test_is_valid_im_int_typec                 C   r  r  )Úcheck_is_valid_im_various_sizer  r<   r<   r=   Útest_is_valid_im_various_size  r  z5TestIsValidInconsistent.test_is_valid_im_various_sizec                 C   r  r  )r4   r’   r   r   r6   r7   )r9   r  r  r  r:   rA  r<   r<   r=   rC    r   z6TestIsValidInconsistent.check_is_valid_im_various_sizec                 C   r*  r+  )r@   r’   r   r   r6   r7   r@  r<   r<   r=   Útest_is_valid_im_empty   r.  z.TestIsValidInconsistent.test_is_valid_im_emptyc                 C   sX   t dddƒD ]#}tj ||d  d ¡}| |¡}t|ƒ}t|ƒ}tt|ƒdu ƒ qd S r/  )	r  re   rf   rh   r4   r	   r   r   r   ©r9   r:   r  r;   rR   rA  r<   r<   r=   Útest_is_valid_im_4_and_up&  s   
ûz1TestIsValidInconsistent.test_is_valid_im_4_and_upr3  r4  r5  c                 C   sx   t dddƒD ]3}tj ||d  d ¡}| |¡}t|ƒ}t|ƒ}d||d df< tt|ƒdu ƒ t	t
t|d	d
� qd S )Nr±   r0  rx   r+   rb   ç       Àr   FTr  ©r  re   rf   rh   r4   r	   r   r   r   r6   r7   rF  r<   r<   r=   Ú(test_is_valid_im_4_and_up_neg_index_left0  ó   
ùz@TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_leftc                 C   sx   t dddƒD ]3}tj ||d  d ¡}| |¡}t|ƒ}t|ƒ}d||d df< tt|ƒdu ƒ t	t
t|dd	� qd S )
Nr±   r0  rx   r+   rb   rH  FTr  rI  rF  r<   r<   r=   Ú)test_is_valid_im_4_and_up_neg_index_right=  rK  zATestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_rightc                 C   sx   t dddƒD ]3}tj ||d  d ¡}| |¡}t|ƒ}t|ƒ}d||d df< tt|ƒdu ƒ t	t
t|dd	� qd S r<  rI  rF  r<   r<   r=   Ú"test_is_valid_im_4_and_up_neg_distJ  rK  z:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_distN)rs   rt   ru   rB  rD  rC  rE  rG  r.   rJ  rL  rM  r<   r<   r<   r=   r?    s    	





r?  c                   @   s@   e Zd Zedd�dd„ ƒZdd„ Zdd„ Zedd�d	d
„ ƒZdS )ÚTestNumObsLinkageTr0   c                 C   ó    |j d|jd�}ttt|ƒ d S ©Nr,  r�   )r@   r’   r6   r7   r   r'  r<   r<   r=   Útest_num_obs_linkage_emptyZ  s   z,TestNumObsLinkage.test_num_obs_linkage_emptyc                 C   s(   |j g d¢g|jd�}tt|ƒdƒ d S )Nr#  r�   rb   ©r4   r’   r   r   r'  r<   r<   r=   Útest_num_obs_linkage_1x4`  s   z*TestNumObsLinkage.test_num_obs_linkage_1x4c                 C   s.   |j g d¢g d¢g|jd�}tt|ƒdƒ d S )Nr#  r$  r�   rx   rR  r'  r<   r<   r=   Útest_num_obs_linkage_2x4e  s   
ÿÿz*TestNumObsLinkage.test_num_obs_linkage_2x4c                 C   sN   t dddƒD ]}tj ||d  d ¡}| |¡}t|ƒ}tt|ƒ|ƒ qd S )Nr±   r0  rx   r+   rb   )r  re   rf   rh   r4   r	   r   r   r1  r<   r<   r=   Útest_num_obs_linkage_4_and_upk  s   
üz/TestNumObsLinkage.test_num_obs_linkage_4_and_upN)rs   rt   ru   r.   rQ  rS  rT  rU  r<   r<   r<   r=   rN  X  s    
rN  c                   @   ó4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestLeavesListc                 C   s8   |j g d¢g|jd�}t|ƒ tt|ƒddgdd� d S )Nr#  r�   r   r+   rc   r­   ©r4   r’   r   r   r   r'  r<   r<   r=   Útest_leaves_list_1x4y  s   z#TestLeavesList.test_leaves_list_1x4c                 C   s>   |j g d¢g d¢g|jd�}t|ƒ tt|ƒg d¢dd� d S )Nr#  r$  r�   )r   r+   rb   rc   r­   rX  r'  r<   r<   r=   Útest_leaves_list_2x4  s   
ÿÿz#TestLeavesList.test_leaves_list_2x4c                 C   rB   rz   )Úcheck_leaves_list_QrG   r<   r<   r=   Útest_leaves_list_Q†  r}   z!TestLeavesList.test_leaves_list_Qc                 C   s8   |  tj¡}t||ƒ}t|ƒ}t| ¡ t|ƒdd� d S )Nrc   r­   )r4   r,   rÌ   r	   r   r   Ú	pre_orderr   )r9   rH   r:   r]   rR   Únoder<   r<   r=   r[  ‹  s   
z"TestLeavesList.check_leaves_list_Qc                 C   sH   |  tj¡}t|dƒ}t|ƒ}t| ¡ | ¡  ¡ | ¡  ¡  dd� d S )Nr   rc   r­   )	r4   r,   rÌ   r	   r   r   r]  Úget_leftÚ	get_right)r9   r:   r]   rR   r^  r<   r<   r=   Útest_Q_subtree_pre_order’  s   

ÿ
þz'TestLeavesList.test_Q_subtree_pre_orderN)rs   rt   ru   rY  rZ  r\  r[  ra  r<   r<   r<   r=   rW  v  s    rW  c                   @   rV  )ÚTestCorrespondc                 C   s2   |j d|jd�}|j d|jd�}ttt||ƒ d S )Nr?   r�   r,  )r@   r’   r6   r7   r   rÛ   r<   r<   r=   Útest_correspond_emptyŸ  s   z$TestCorrespond.test_correspond_emptyc                 C   s–   t ddƒD ]}tj ||d  d ¡}| |¡}t|ƒ}tt||ƒƒ qt dddƒD ]}tj ||d  d ¡}| |¡}t|ƒ}tt||ƒƒ q*d S )Nrb   r±   r+   r0  rx   )r  re   rf   rh   r4   r	   r   r   r1  r<   r<   r=   Útest_correspond_2_and_up¥  s   

üz'TestCorrespond.test_correspond_2_and_upc                 C   sÂ   t tt tddƒƒt tddƒƒƒƒt tt tddƒƒt tddƒƒƒƒ D ]<\}}tj ||d  d ¡}tj ||d  d ¡}| |¡}| |¡}t|ƒ}t|ƒ}t||ƒrWJ ‚t||ƒr^J ‚q"d S )Nrb   r±   rx   r3   r+   ©	ÚlistÚzipr  re   rf   rh   r4   r	   r   ©r9   r:   r  Újr;   Úy2rR   ÚZ2r<   r<   r=   Útest_correspond_4_and_up³  ó     ÿ

÷z'TestCorrespond.test_correspond_4_and_upc                 C   sÂ   t tt tddƒƒt tddƒƒƒƒt tt tddƒƒt tddƒƒƒƒ D ]<\}}tj ||d  d ¡}tj ||d  d ¡}| |¡}| |¡}t|ƒ}t|ƒ}t||ƒrWJ ‚t||ƒr^J ‚q"d S )Nrb   r´   é   é   r+   re  rh  r<   r<   r=   Útest_correspond_4_and_up_2Á  rm  z)TestCorrespond.test_correspond_4_and_up_2c                 C   sJ   t ddƒD ]}tj |d¡}t|ƒ}| |¡}t|ƒ}tt|ƒ|ƒ qd S )Nrb   rµ   r±   )	r  re   rf   rh   r$   r4   r	   r   r   )r9   r:   rk   r]   rã   rR   r<   r<   r=   Ú!test_num_obs_linkage_multi_matrixÏ  s   
ûz0TestCorrespond.test_num_obs_linkage_multi_matrixN)rs   rt   ru   rc  rd  rl  rp  rq  r<   r<   r<   r=   rb  œ  s    rb  c                   @   sp   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zeddd�dd„ ƒZdd„ ZdS )ÚTestIsMonotonicc                 C   rO  rP  )r@   r’   r6   r7   r   r'  r<   r<   r=   Útest_is_monotonic_emptyÜ  ó   z'TestIsMonotonic.test_is_monotonic_emptyc                 C   s&   |j g d¢g|jd�}t|ƒsJ ‚d S )N©r   r+   ç333333Ó?rb   r�   ©r4   r’   r   r'  r<   r<   r=   Útest_is_monotonic_1x4á  s   z%TestIsMonotonic.test_is_monotonic_1x4c                 C   s,   |j g d¢g d¢g|jd�}t|ƒsJ ‚d S )Nru  )rb   rx   çš™™™™™Ù?rx   r�   rw  r'  r<   r<   r=   Útest_is_monotonic_2x4_Tæ  ó   
ÿÿz'TestIsMonotonic.test_is_monotonic_2x4_Tc                 C   s,   |j g d¢g d¢g|jd�}t|ƒrJ ‚d S )N)r   r+   ry  rb   )rb   rx   rv  rx   r�   rw  r'  r<   r<   r=   Útest_is_monotonic_2x4_Fì  r{  z'TestIsMonotonic.test_is_monotonic_2x4_Fc                 C   s2   |j g d¢g d¢g d¢g|jd�}t|ƒsJ ‚d S )Nru  ©rb   rx   ry  rb   ©r±   r3   g333333ã?r±   r�   rw  r'  r<   r<   r=   Útest_is_monotonic_3x4_Tò  ó   
þþz'TestIsMonotonic.test_is_monotonic_3x4_Tc                 C   ó2   |j g d¢g d¢g d¢g|jd�}t|ƒrJ ‚d S )Nru  )rb   rx   çš™™™™™É?rb   r~  r�   rw  r'  r<   r<   r=   Útest_is_monotonic_3x4_F1ù  r€  z(TestIsMonotonic.test_is_monotonic_3x4_F1c                 C   r�  )N)r   r+   gš™™™™™é?rb   r}  r~  r�   rw  r'  r<   r<   r=   Útest_is_monotonic_3x4_F2   r€  z(TestIsMonotonic.test_is_monotonic_3x4_F2c                 C   r�  )Nru  r}  )r±   r3   r‚  r±   r�   rw  r'  r<   r<   r=   Útest_is_monotonic_3x4_F3  r€  z(TestIsMonotonic.test_is_monotonic_3x4_F3c                 C   s"   t | tj¡dƒ}t|ƒsJ ‚d S ©Nr   ©r	   r4   r,   rP   r   r'  r<   r<   r=   Ú test_is_monotonic_tdist_linkage1  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage1r3  r4  r5  c                 C   s*   t | tj¡dƒ}d|d< t|ƒrJ ‚d S )Nr   r2   )rb   rb   r‡  r'  r<   r<   r=   Ú test_is_monotonic_tdist_linkage2  s   z0TestIsMonotonic.test_is_monotonic_tdist_linkage2c                 C   s&   |  tj¡}t|dƒ}t|ƒsJ ‚d S r†  )r4   r,   rÌ   r	   r   )r9   r:   r]   rR   r<   r<   r=   Útest_is_monotonic_Q_linkage  s   
z+TestIsMonotonic.test_is_monotonic_Q_linkageN)rs   rt   ru   rs  rx  rz  r|  r  rƒ  r„  r…  rˆ  r.   r‰  rŠ  r<   r<   r<   r=   rr  Ù  s    

rr  c                   @   sD   e Zd Zdd„ Zeddd�dd„ ƒZeddd�dd	„ ƒZd
d„ ZdS )ÚTestMaxDistsc                 C   rO  rP  )r@   r’   r6   r7   r   r'  r<   r<   r=   Útest_maxdists_empty_linkage'  rt  z(TestMaxDists.test_maxdists_empty_linkager3  r4  r5  c                 C   s:   |j g d¢g|jd�}t|ƒ}t||ƒ}t||dd� d S )N©r   r+   rv  r±   r�   rc   rM   )r4   r’   r   Úcalculate_maximum_distancesr'   )r9   r:   rR   ÚMDÚ
expectedMDr<   r<   r=   Ú!test_maxdists_one_cluster_linkage,  s   
z.TestMaxDists.test_maxdists_one_cluster_linkagec                 C   rB   ©N©r   rC   rV   rT   rU   )Úcheck_maxdists_Q_linkagerG   r<   r<   r=   Útest_maxdists_Q_linkage4  rJ   z$TestMaxDists.test_maxdists_Q_linkagec                 C   s:   |  tj¡}t||ƒ}t|ƒ}t||ƒ}t||dd� d S )Nrc   rM   )r4   r,   rÌ   r	   r   rŽ  r'   )r9   rH   r:   r]   rR   r�  r�  r<   r<   r=   r”  9  s
   

z%TestMaxDists.check_maxdists_Q_linkageN)rs   rt   ru   rŒ  r.   r‘  r•  r”  r<   r<   r<   r=   r‹  $  s    



r‹  c                   @   sZ   e Zd Zedd�dd„ ƒZdd„ Zedddd	�d
d„ ƒZedddd	�dd„ ƒZdd„ ZdS )ÚTestMaxInconstsTr0   c                 C   s2   |j d|jd�}|j d|jd�}ttt||ƒ d S rP  )r@   r’   r6   r7   r   ©r9   r:   rR   rA  r<   r<   r=   Útest_maxinconsts_empty_linkageD  s   z.TestMaxInconsts.test_maxinconsts_empty_linkagec                 C   s@   |j g d¢g|jd�}tj dd¡}|  |¡}ttt||ƒ d S ©Nr�  r�   rb   r±   )r4   r’   re   rf   rh   r6   r7   r   r—  r<   r<   r=   Útest_maxinconsts_difrow_linkageK  s   
z/TestMaxInconsts.test_maxinconsts_difrow_linkager3  r4  ©ré   r1   c                 C   sV   |j g d¢g|jd�}|j g d¢g|jd�}t||ƒ}t|||d�}t||dd� d S )Nr�  r�   ©r   r   r   rv  rü   rc   rM   )r4   r’   r   Ú!calculate_maximum_inconsistenciesr'   )r9   r:   rR   rA  r�  r�  r<   r<   r=   Ú$test_maxinconsts_one_cluster_linkageS  s
   
z4TestMaxInconsts.test_maxinconsts_one_cluster_linkagec                 C   rB   r’  )Úcheck_maxinconsts_Q_linkagerG   r<   r<   r=   Útest_maxinconsts_Q_linkage]  s   ÿz*TestMaxInconsts.test_maxinconsts_Q_linkagec                 C   sH   |  tj¡}t||ƒ}t|ƒ}t||ƒ}t|||d�}t||dd� d S )Nrü   rc   rM   )r4   r,   rÌ   r	   r   r   r�  r'   )r9   rH   r:   r]   rR   rA  r�  r�  r<   r<   r=   rŸ  c  s   

z+TestMaxInconsts.check_maxinconsts_Q_linkageN)	rs   rt   ru   r.   r˜  rš  rž  r   rŸ  r<   r<   r<   r=   r–  B  s    
ÿ
ÿ
r–  c                   @   s‚   e Zd Zdd„ Zdd„ Zedd�dd„ ƒZd	d
„ Zdd„ Zdd„ Z	edddd�dd„ ƒZ
dd„ Zedddd�dd„ ƒZdd„ ZdS )ÚTestMaxRStatc                 C   rB   )N)gffffff
@r~   r±   )Úcheck_maxRstat_invalid_index©r9   r:   r  r<   r<   r=   Útest_maxRstat_invalid_indexo  s   ÿz(TestMaxRStat.test_maxRstat_invalid_indexc                 C   s^   |j g d¢g|jd�}|j g d¢g|jd�}t|tƒr%ttt|||ƒ d S ttt|||ƒ d S )Nr�  r�   rœ  )r4   r’   Ú
isinstancer  r6   r7   r   r&  ©r9   r  r:   rR   rA  r<   r<   r=   r¢  s  s
   
z)TestMaxRStat.check_maxRstat_invalid_indexTr0   c                 C   ó   t dƒD ]}|  ||¡ qd S ©Nr±   )r  Úcheck_maxRstat_empty_linkager£  r<   r<   r=   Útest_maxRstat_empty_linkage|  s   ÿz(TestMaxRStat.test_maxRstat_empty_linkagec                 C   s4   |j d|jd�}|j d|jd�}ttt|||ƒ d S rP  )r@   r’   r6   r7   r   r¦  r<   r<   r=   r©  �  r.  z)TestMaxRStat.check_maxRstat_empty_linkagec                 C   r§  r¨  )r  Úcheck_maxRstat_difrow_linkager£  r<   r<   r=   Útest_maxRstat_difrow_linkage‡  s   ÿz)TestMaxRStat.test_maxRstat_difrow_linkagec                 C   sB   |j g d¢g|jd�}tj dd¡}|  |¡}ttt|||ƒ d S r™  )r4   r’   re   rf   rh   r6   r7   r   r¦  r<   r<   r=   r«  ‹  s   
z*TestMaxRStat.check_maxRstat_difrow_linkager3  r4  r›  c                 C   r§  r¨  )r  Ú"check_maxRstat_one_cluster_linkager£  r<   r<   r=   Ú!test_maxRstat_one_cluster_linkage“  s   ÿz.TestMaxRStat.test_maxRstat_one_cluster_linkagec                 C   sX   |j g d¢g|jd�}|j g d¢g|jd�}t||dƒ}t||d|ƒ}t||dd� d S )Nr�  r�   rœ  r+   rc   rM   )r4   r’   r   r�  r'   )r9   r  r:   rR   rA  r�  r�  r<   r<   r=   r­  ™  s
   z/TestMaxRStat.check_maxRstat_one_cluster_linkagec                 C   s*   dD ]}t dƒD ]	}|  |||¡ qqd S )Nr“  r±   )r  Úcheck_maxRstat_Q_linkage)r9   r:   rH   r  r<   r<   r=   Útest_maxRstat_Q_linkage¡  s
   ÿÿz$TestMaxRStat.test_maxRstat_Q_linkagec           	      C   sJ   |  tj¡}t||ƒ}t|ƒ}t||dƒ}t||d|ƒ}t||dd� d S )Nr+   rc   rM   )r4   r,   rÌ   r	   r   r   r�  r'   )	r9   rH   r  r:   r]   rR   rA  r�  r�  r<   r<   r=   r¯  ¨  s   
z%TestMaxRStat.check_maxRstat_Q_linkageN)rs   rt   ru   r¤  r¢  r.   rª  r©  r¬  r«  r®  r­  r°  r¯  r<   r<   r<   r=   r¡  m  s$    	
ÿ
ÿ
r¡  c                   @   s¸   e Zd Zdd„ Zdd„ Zdd„ Zejje	 dd�d	d
„ ƒZ
eddd�ejje	 dd�dd„ ƒƒZdd„ Zeddd�ejje	 dd�dd„ ƒƒZejdd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚTestDendrogramc                 C   s8   t | tj¡dƒ}t|dd�}|d }t|g d¢ƒ d S )Nr   T©Úno_plotÚleaves©rb   r3   r+   r   rx   r±   )r	   r4   r,   rP   r   r   )r9   r:   rR   rA  r´  r<   r<   r=   Ú$test_dendrogram_single_linkage_tdistµ  s   z3TestDendrogram.test_dendrogram_single_linkage_tdistc                 C   s&   t | tj¡dƒ}ttt|dd� d S )Nr   Úfoo©Úorientation)r	   r4   r,   rP   r6   r7   r   r'  r<   r<   r=   Útest_valid_orientation¼  s   z%TestDendrogram.test_valid_orientationc                 C   sL   t | tj¡dƒ}g d¢}t|| |¡dd�}t||dd�}||ks$J ‚d S )Nr   )r+   rx   rb   r°   r±   r3   T)Úlabelsr³  )r	   r4   r,   rP   r   )r9   r:   rR   r»  Úresult1Úresult2r<   r<   r=   Útest_labels_as_array_or_listÀ  s
   z+TestDendrogram.test_labels_as_array_or_listzno matplotlibr5  c                 C   sº   |  g d¢g d¢g d¢g¡}t ¡  t t¡�}t|ttdƒƒd� W d   ƒ n1 s,w   Y  dt	|j
ƒv s:J ‚tjtdd�� t|g d� W d   ƒ n1 sRw   Y  t ¡  d S )N)r   r+   r™   r±   )rb   rx   r™   r3   )r±   r3   rš   r°   éd   )r»  z.Dimensions of Z and labels must be consistent.r¥   )r4   ÚpltÚfigurer§   r   r7   r   rf  r  ÚstrÚvalueÚclose)r9   r:   ÚlinkÚexc_infor<   r<   r=   Útest_valid_label_sizeÈ  s&   ýÿÿþýz$TestDendrogram.test_valid_label_sizeÚtorchzFMPL 3.9.2 & torch DeprecationWarning from __array_wrap__ and NumPy 2.0c                 C   rB   )N)ÚtopÚbottomÚleftÚright)Úcheck_dendrogram_plot)r9   r:   r¹  r<   r<   r=   Útest_dendrogram_plotÜ  s   ÿz#TestDendrogram.test_dendrogram_plotc           
      C   s²  t | tj¡dƒ}g d¢g d¢g d¢g d¢g d¢g d¢gg d¢g d	¢g d
¢g d¢g d¢gg d¢g d¢g d¢dœ}t ¡ }| d¡}t|||d�}t |d ¡|d< t	||ƒ t|||ddd� |dv ri| 
¡ d n| ¡ d }t	| ¡ dƒ t	| ¡ dƒ t|||dd� |dv r�| 
¡ d n| ¡ d }t	| ¡ dƒ t|||dd� |dv r®| 
¡ d n| ¡ d }t	| ¡ dƒ t ¡  t||d�}	t ¡  t |	d ¡|	d< t	|	|ƒ d S )Nr   )ÚC1ÚC0rÐ  rÐ  rÐ  ©r2   r¶   r¶   r2   )r2   r·   r·   r2   )r2   r¸   r¸   r·   ©r2   r¹   r¹   r¸   ©r¶   rº   rº   r¹   ©rž   rž   r¤   r¤   )ç     €F@rÕ  ç     €K@rÖ  )ç     €A@r×  ç      I@rØ  )ç      9@rÙ  ç     @E@rÚ  )r£   r£   ç     à@@rÛ  )Ú2Ú5Ú1Ú0Ú3Ú4rµ  )rÏ  rÏ  rÐ  rÐ  rÐ  rÐ  ©Ú
color_listÚdcoordÚicoordÚivlr´  Úleaves_color_listéÝ   )Úaxr¹  rä  ra   éZ   )ré  r¹  Úleaf_font_sizeÚleaf_rotation)rÉ  rÊ  r   )ré  r¹  rì  )ré  r¹  rë  r¸  )r	   r4   r,   rP   rÀ  rÁ  Úadd_subplotr   re   r   Úget_xticklabelsÚget_yticklabelsÚget_rotationÚget_sizerÄ  )
r9   r¹  r:   rR   ÚexpectedÚfigré  ÚR1Ú	testlabelÚR2r<   r<   r=   rÍ  å  sj   üüó

ÿÿ
ýÿÿ
ýÿÿ
ýz$TestDendrogram.check_dendrogram_plotc              	   C   sô   t | tj¡dƒ}t|dddd�}t ¡  t |d ¡|d< t|dgg d¢gg d	¢gd
dgddgddgdœƒ t|dddd�}t ¡  t |d ¡|d< t|g d¢g d¢g d¢g d¢g d¢gg d	¢g d¢g d¢g d¢gg d¢g d¢g d¢dœƒ d S )Nr   rb   ÚlastpT)Úshow_contractedrä  rÐ  )r2   rº   rº   r2   rÔ  ú(2)z(4)r°   r³   râ  Úmtica)rÏ  rÐ  rÐ  rÐ  rÑ  )r2   r¸   r¸   r2   rÒ  rÓ  )r×  r×  rÕ  rÕ  )rÙ  rÙ  ç      D@rû  )r£   r£   ç     @@@rü  )rÜ  rÝ  rÞ  rß  rù  )rb   r3   r+   r   r´   )rÏ  rÏ  rÐ  rÐ  rÐ  )	r	   r4   r,   rP   r   rÀ  rÄ  re   r   r—  r<   r<   r=   Útest_dendrogram_truncate_mode#  s:   û
ýýõz,TestDendrogram.test_dendrogram_truncate_modec                 C   s   t ƒ S rƒ   r)   )r9   r<   r<   r=   Údendrogram_lockG  s   zTestDendrogram.dendrogram_lockc                 C   s‚   t | tj¡dƒ}|�, tg d¢ƒ t|dddd�}tg d¢ƒ |d }t|g d	¢ƒ td ƒ W d   ƒ d S 1 s:w   Y  d S )
Nr   )r–   Úmr;   r  TÚgéú   )r³  Úabove_threshold_colorÚcolor_threshold)r   Úrr–   rÿ  r;   r  rã  )r–   rÿ  r   r   r   )r	   r4   r,   rP   r   r   r   )r9   r:   rþ  rR   rA  rã  r<   r<   r=   Útest_dendrogram_colorsK  s   ÿ
"õz%TestDendrogram.test_dendrogram_colorsc              	   C   sb   |  g d¢g d¢g d¢g d¢g d¢g d¢g¡}t|dƒ}t|dd�}g d¢}|d	 }t||ƒ d S )
N©r+   r   r   ©r   r   r+   ©r   rb   r   ©r   r+   r   r   Tr²  ©rÐ  rÏ  rÏ  rÐ  ÚC2r  rç  ©r4   r	   r   r   ©r9   r:   ÚxÚzrl   Ú
exp_colorsÚcolorsr<   r<   r=   Ú%test_dendrogram_leaf_colors_zero_dist\  ó   
û
z4TestDendrogram.test_dendrogram_leaf_colors_zero_distc              	   C   sb   |  g d¢g d¢g d¢g d¢g d¢g d¢g¡}t|dƒ}t|dd�}g d	¢}|d
 }t||ƒ d S )Nr  )r   r   gš™™™™™ñ?r  r  r	  r   Tr²  r
  rç  r  r  r<   r<   r=   Útest_dendrogram_leaf_colorsk  r  z*TestDendrogram.test_dendrogram_leaf_colorsN)rs   rt   ru   r¶  rº  r¾  r§   ÚmarkÚskipifÚhave_matplotlibrÇ  r.   rÎ  rÍ  rý  Úfixturerþ  r  r  r  r<   r<   r<   r=   r±  ²  s,    
ÿ>ÿ
r±  c                 C   sÐ   | j d d }|j|d f| jd�}| d¡}td|d ƒD ]G}d|d d …< | |df }| |df }||krD||j||jd�|  |d< ||krV||j||jd�|  |d< | |df |d< | |¡||< q|S ©Nr   r+   r�   )rx   r2   rb   )r	  r@   r‘   r  r4   r%  Úmax)rR   r:   rk   ÚBÚqr  rË  rÌ  r<   r<   r=   rŽ  {  s   
rŽ  rx   c                 C   sÚ   | j d d }| | |¡}|j|d f|d�}| d¡}td|d ƒD ]G}d|d d …< | |df }	| |df }
|	|krI||j|	|jd�|  |d< |
|kr[||j|
|jd�|  |d< |||f |d< | |¡||< q#|S r  )r	  Úresult_typer@   r  r4   r%  r  )rR   rA  r  r:   rk   r‘   r  r  r  rË  rÌ  r<   r<   r=   r�  �  s   
r�  c                 C   s"   t tt|  ddgddgg¡ƒ d S )Nr   r+   )r   r   r	   r4   rü   r<   r<   r=   Ú<test_unsupported_uncondensed_distance_matrix_linkage_warning   s   "r  c              	   C   s8   t jjjD ]}ttt|  ddgddgg¡|dd� qd S )Nr+   Ú	cityblock©rH   r\   )r^   ÚclusterÚ	hierarchyÚ_EUCLIDEAN_METHODSr6   r7   r	   r4   )r:   rH   r<   r<   r=   Ú"test_euclidean_linkage_value_error¦  s
   ÿÿr$  c                 C   sH   t |  dg¡ddd�}t |  ddgddgg¡ddd�}t||dd� d S )Nr+   r   r[   r   r   rc   r­   )r	   r4   r'   )r:   ÚZ1rk  r<   r<   r=   Útest_2x2_linkage¬  s    r&  c                 C   sŽ   t j d¡ d}t j |d¡}|  |¡}tjj |¡}t	|ƒ}t
|| ¡ kƒ t
| ¡ | ¡ kƒ t
| ¡ | ¡ kƒ t
| ¡ | ¡ kƒ d S )Né   é2   r±   )re   rf   ÚseedÚrandnr4   r^   r!  r"  rV   r   r   r_  r`  )r:   r
  r]   rR   Útreer<   r<   r=   Útest_node_compare³  s   
r,  z%`cut_tree` uses non-standard indexingc                 C   sÎ  t j d¡ d}t j |d¡}|  |¡}tjj |¡}t	|ƒ}t
|d d …df |  |¡ddd� t
|d d …df |  |¡ddd� tt  |¡ d¡t  |d	 dd¡ƒ t
|d d …d
gf t	|dd�dd� t
|d d …d
dgf t	|ddgd�dd� t
|d d …dd
gf t	|ddgd�dd� t|ƒ}|  dd„ |D ƒ¡}t
|d d …t  |dg¡f t	|dd�dd� t
|d d …t  |ddg¡f t	|ddgd�dd� t
|d d …t  |ddg¡f t	|ddgd�dd� d S )Nr'  r(  r±   r   rc   F)rd   Úcheck_dtyper~   r+   éûÿÿÿr3   )Ú
n_clustersr­   iöÿÿÿrµ   c                 S   s   g | ]}|j ‘qS r<   )Údist)Ú.0r^  r<   r<   r=   Ú
<listcomp>Ô  s    z!test_cut_tree.<locals>.<listcomp>)Úheight)re   rf   r)  r*  r4   r^   r!  r"  rV   r   r'   Úaranger@   r   r  r!   Úsearchsorted)r:   r
  r]   rR   ÚcutreeÚnodesÚheightsr<   r<   r=   Útest_cut_treeÁ  s.   
""$$**ÿÿ
ÿr9  c                 C   sv   t t|  tj¡ƒ|  tj¡ƒ}tj}t||  |¡dd� t t|  tj¡dƒ|  tj¡ƒ}tj}t||  |¡dd� d S )NrL   rM   rV   rZ   )	r    r	   r4   r,   rP   rq   r'   r]   Úlinkage_X_ward_olo)r:   rR   rS   r<   r<   r=   rr   Þ  s   
ÿ
ÿrr   z"`Heap` only supports NumPy backendc                 C   s  |   g d¢¡}t|ƒ}| ¡ }t|d dƒ t|d dƒ | ¡  | ¡ }t|d dƒ t|d dƒ | dd¡ | ¡ }t|d d	ƒ t|d d
ƒ | ¡  | ¡  | dd¡ | ¡ }t|d dƒ t|d dƒ | ¡  | ¡ }t|d dƒ t|d dƒ d S )N)rb   r~   r   ç      ø¿rx   Úkeyrx   rÃ  r;  r+   r~   g      @rb   r   rµ   r±   )r4   r%   Úget_minr   Ú
remove_minÚchange_value)r:   ÚvaluesÚheapÚpairr<   r<   r=   Ú	test_Heapí  s.   rC  c                 C   sJ   |   g d¢¡}t t¡� t|dd� W d   ƒ d S 1 sw   Y  d S )N)r   r   r~   rT   r   )r4   r§   r   r7   r	   )r:   r@  r<   r<   r=   Útest_centroid_neg_distance  s   "þrD  )^Únumpyre   Únumpy.testingr   r   r   r   r   r§   r   r6   Úscipy.cluster.hierarchyr^   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   Úscipy.spatial.distancer$   Úscipy.cluster._hierarchyr%   Úscipy.conftestr&   Úscipy._lib._array_apir'   r(   Ú	threadingr*   Ú r,   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrÀ  r  Ú	Exceptionr  ÚusefixturesÚ
pytestmarkr.   r/   rv   r‚   r‰   rª   r¼   rÝ   rê   r  r?  rN  rW  rb  rr  r‹  r–  r¡  r±  rŽ  r�  Úthread_unsafer  r$  r&  r,  r9  rr   rC  rD  r<   r<   r<   r=   Ú<module>   s”   !x
ÿ=("?ÿY[O%<J+E I






 