
    ^Mh                        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 	 d dl6Z6 e6j7        d           d dl8m9Z: dZ;n# e<$ r dZ;Y nw xY we.ej=        >                    d          gZ?ej=        j@        Z@ G d d          ZA e@d           G d d                      ZB e@d           G d d                      ZC e@d           G d d                      ZD G d d          ZE e@d           G d d                      ZF e@d           G d d                      ZG e@dd            G d! d"                      ZH e@d           G d# d$                      ZI e@d           G d% d&                      ZJ G d' d(          ZK e@d           G d) d*                      ZL e@d           G d+ d,                      ZM e@d           G d- d.                      ZN e@d           G d/ d0                      ZO G d1 d2          ZP G d3 d4          ZQ e@d           G d5 d6                      ZRd7 ZSd8efd9ZTej=        jU         e@d          d:                         ZVd; ZW e@d          d<             ZX e@d          d=             ZY e@dd>           d?             ZZ e@d          d@             Z[ e@ddA           dB             Z\ e@d          dC             Z]dS )D    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                      e Zd Z ed          d             Z ed          d             Z ed          d             Zd Z ed          d             Zd Z	 ed          d	             Z
 ed          d
             ZdS )TestLinkageTcpu_onlyc                     |                     |j        gdgdz  z             }t          t          t          |           d S )N           )asarraynanassert_raises
ValueErrorr
   selfxpys      b/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/cluster/tests/test_hierarchy.py3test_linkage_non_finite_elements_in_distance_matrixz?TestLinkage.test_linkage_non_finite_elements_in_distance_matrixN   s<     JJx3%')**j'1-----    c                 f    |                     d          }t          t          t          |           d S )Nr   )zerosr9   r:   r
   r;   s      r?   "test_linkage_empty_distance_matrixz.TestLinkage.test_linkage_empty_distance_matrixU   s+     HHTNNj'1-----rA   c                 <    dD ]}|                      ||           d S )N)r   completeaverageweighted)check_linkage_tdistr<   r=   methods      r?   test_linkage_tdistzTestLinkage.test_linkage_tdist[   s4    C 	1 	1F$$VR0000	1 	1rA   c                     t          |                    t          j                  |          }t	          t          d|z             }t          ||                    |          d           d S )Nlinkage_ytdist_绽|=atolr
   r7   r-   ytdistgetattrr(   )r<   rL   r=   Z	expectedZs        r?   rJ   zTestLinkage.check_linkage_tdist`   s^    BJJ29::FCC/1BV1KLL	2::i00u======rA   c                 <    dD ]}|                      ||           d S )N)centroidmedianward)check_linkage_qrK   s      r?   test_linkage_XzTestLinkage.test_linkage_Xf   s4    4 	- 	-F  ,,,,	- 	-rA   c                    t          |                    t          j                  |          }t	          t          d|z             }t          ||                    |          d           t          j        j        	                    t          j        d          }t          |                    |          |          }t          ||                    |          d           d S )N
linkage_X_ư>rQ   	euclidean)metric)
r
   r7   r-   XrU   r(   scipyspatialdistancer%   )r<   rL   r=   rV   rW   r>   s         r?   r\   zTestLinkage.check_linkage_qk   s    BJJ2455v>>/1FGG	2::i00u====M"(()<)>0; ) = =BJJqMM6**2::i00u======rA   c                    t           j                            d          }d}|                    |d          }t	          |          }t          j                    D ]d\  }}t          j        |||          }t          |	                    |          |          }	t          |	|	                    |          dd           ed S )Nr         g+=V瞯<)rtolrR   )nprandomRandomStaterandr%   r$   itemsr#   r
   r7   r(   )
r<   r=   rngnrc   drL   code	Z_trivialrV   s
             r?   test_compare_with_trivialz%TestLinkage.test_compare_with_trivialv   s    i##A&&HHQNN!HH,244 	N 	NLFD"*1a66I

1v..AArzz)445uMMMMM	N 	NrA   c                     t          |                    t          j                  d          }t	          t          d          }t          ||                    |          d           d S )NT)optimal_orderinglinkage_ytdist_single_olorP   rQ   rS   )r<   r=   rV   rW   s       r?   test_optimal_leaf_orderingz&TestLinkage.test_optimal_leaf_ordering   s\    BJJ29::TRRR/1LMM	2::i00u======rA   N)__name__
__module____qualname__r/   r@   rE   rM   rJ   r]   r\   rv   rz    rA   r?   r1   r1   L   s/       t$$$. . %$. t$$$. . %$.
 t$$$1 1 %$1> > > t$$$- - %$-	> 	> 	> t$$$	N 	N %$	N t$$$> > %$> > >rA   r1   r2   c                   F   e Zd Z ej        g dg dg           ej        g dg dg           ej        g dg dg           ej        g dg dg           ej        g dg dg           ej        g dg dg           ej        g dg dg          dZd Zd Zd	S )
TestLinkageTies)r   r,   'e?ri   )ri      r   r   )ri   r   g'e@r   )ri   r   gev @r   )ri   r   g@r   r   rG   rH   rI   rY   rZ   r[   c                 <    dD ]}|                      ||           d S Nr   )check_linkage_tiesrK   s      r?   test_linkage_tiesz!TestLinkageTies.test_linkage_ties   s6    5 	0 	0F##FB////	0 	0rA   c                     |                     ddgddgddgg          }t          ||          }| j        |         }t          ||                     |          d           d S )Nr   r,   rL   r`   rQ   )r7   r
   _expectationsr(   )r<   rL   r=   rc   rV   rW   s         r?   r   z"TestLinkageTies.check_linkage_ties   sl    JJR1a&1a&122Af%%%&v.	2::i00u======rA   N)r{   r|   r}   rl   arrayr   r   r   r~   rA   r?   r   r      sX        "(1111113 4 4BH3333335 6 6282222224 5 5BH3333335 6 6BH3333335 6 6"(1111113 4 4//////1 2 2 M"0 0 0
> > > > >rA   r   c                       e Zd Zd Zd ZdS )TestInconsistentc                 P    t           j        D ]}|                     ||           d S N)r-   inconsistent_ytdistcheck_inconsistent_tdist)r<   r=   depths      r?   test_inconsistent_tdistz(TestInconsistent.test_inconsistent_tdist   s7    (< 	5 	5E))%4444	5 	5rA   c                     |                     t          j                  }t          t	          ||          |                     t          j        |                              d S r   )r7   r-   linkage_ytdist_singler(   r   r   )r<   r   r=   rV   s       r?   r   z)TestInconsistent.check_inconsistent_tdist   s\    JJ*@AAQ..

#6#J5#QRR	T 	T 	T 	T 	TrA   N)r{   r|   r}   r   r   r~   rA   r?   r   r      s7        5 5 5T T T T TrA   r   c                        e Zd Zd Zd Zd ZdS )TestCopheneticDistancec                     |                     g d          }|                     t          j                  }t          |          }t	          ||                     ||j                  d           d S )N  '     r   r   r   r   r   r   r   r         r   r   dtyperP   rQ   )r7   r-   r   r   r(   float64)r<   r=   	expectedMrV   Ms        r?   test_linkage_cophenet_tdist_Zz4TestCopheneticDistance.test_linkage_cophenet_tdist_Z   sq    JJ  9  9  9 : :	JJ*@AAQKK2::irz:BBOOOOOOrA   c                 l   |                     t          j                  }t          ||                     t          j                            \  }}|                     g d|j                  }|                     d|j                  d         }t          ||d           t          ||d           d S )Nr   r   g*ɻ2Qz?r~   rP   rQ   )r7   r-   r   r   rT   r   r(   )r<   r=   rV   cr   r   	expectedcs          r?   test_linkage_cophenet_tdist_Z_Yz6TestCopheneticDistance.test_linkage_cophenet_tdist_Z_Y   s    JJ*@AA!RZZ(;(BCCDDAJJ  9  9  9@B
  L L	JJ?rzJRRSUV	95111195111111rA   c                     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          5  t          |                    |                     d d d            d S # 1 swxY w Y   d S )N)r5         ?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   r:   r   r7   )r<   r=   arrs      r?   test_gh_22183z$TestCopheneticDistance.test_gh_22183   s   
 "!!"""!!!"""!!!""""""######$$$$$$
& ]:-EFFF 	& 	&RZZ__%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   #A//A36A3N)r{   r|   r}   r   r   r   r~   rA   r?   r   r      sD        P P P2 2 2& & & & &rA   r   c                   h    e Zd Zd Z ed          d             Z ed          d             ZdS )TestMLabLinkageConversionc                     |                     g |j                  }t          t          |          |           t          t	          |          |           d S )Nr   )r7   r   r)   r   r   )r<   r=   rc   s      r?   "test_mlab_linkage_conversion_emptyz<TestMLabLinkageConversion.test_mlab_linkage_conversion_empty   sP    JJrJ,,)!,,a000**A.....rA   Tr2   c                 J   |                     g dg          }|                     g dg          }t          t          |          |                     ||j                  d           t          t	          |          |                     ||j                  d           d S )N)r5   r   r   r   r,   ri   r   r   rj   rk   )r7   r(   r   r   r   )r<   r=   rV   Zms       r?   'test_mlab_linkage_conversion_single_rowzATestMLabLinkageConversion.test_mlab_linkage_conversion_single_row   s     JJ((()**ZZ$$)"--rzz!2:z/N/N"	$ 	$ 	$ 	$**BJJrJ,L,L"	$ 	$ 	$ 	$ 	$ 	$rA   c                 T   |                     g dg dg dg dg dg          }|                     g dg dg dg d	g d
g|j                  }t          t          |          |d           t          t	          |          |                     ||j                  d           d S )N)r      r   )   r6   r   )r,      r   )ri   	   r   )   
   r   )r   r        @a@r   )r   r        `k@r   )r5   r        o@r   )r   r        p@r   )r   r        pr@r   r   rj   r   )r7   r   r(   r   r   )r<   r=   r   rV   s       r?   *test_mlab_linkage_conversion_multiple_rowszDTestMLabLinkageConversion.test_mlab_linkage_conversion_multiple_rows   s     ZZkkk$kkk<<<A B BJJ***************	,
  Z  ) ) 	)"--qu====**BJJrJ,L,L"	$ 	$ 	$ 	$ 	$ 	$rA   N)r{   r|   r}   r   r/   r   r   r~   rA   r?   r   r      sw        / / / t$$$$ $ %$$ t$$$$ $ %$$ $ $rA   r   c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
TestFclusterc                     t           j        D ]}|                     |d|           t           j        D ]}|                     |d|           t           j        D ]}|                     |d|           d S Nr   rf   maxclust)r-   fcluster_inconsistentcheck_fclusterdatafcluster_distancefcluster_maxclustr<   r=   ts      r?   test_fclusterdatazTestFcluster.test_fclusterdata  s    $: 	; 	;A##A~r::::$6 	7 	7A##Az26666$6 	7 	7A##Az26666	7 	7rA   c                    |                     t          t          d|z             |                   }|                     t          j                  }t	          |||          }t          t          ||                     d S N	fcluster_	criterionr   )r7   rU   r-   Q_Xr   r   r   )r<   r   r   r=   	expectedTrc   Ts          r?   r   zTestFcluster.check_fclusterdata  sp    JJw':K)<STTUVWXX	JJ*.//i1555a++,,,,,rA   c                     t           j        D ]}|                     |d|           t           j        D ]}|                     |d|           t           j        D ]}|                     |d|           d S r   )r-   r   check_fclusterr   r   r   s      r?   test_fclusterzTestFcluster.test_fcluster  s    $: 	7 	7A>26666$6 	3 	3A:r2222$6 	3 	3A:r2222	3 	3rA   c                    |                     t          t          d|z             |                   }t          |                     t          j                            }t          |||          }t          t          ||                     d S r   )r7   rU   r-   r   r   r   r   r   )r<   r   r   r=   r   rV   r   s          r?   r   zTestFcluster.check_fcluster  sx    JJw':K)<STTUVWXX	2::156677Q)q111a++,,,,,rA   c                     t           j        D ]}|                     ||           t           j        D ]}|                     ||           d S r   )r-   r   check_fcluster_monocritr    check_fcluster_maxclust_monocritr   s      r?   test_fcluster_monocritz#TestFcluster.test_fcluster_monocrit"  sb    $6 	0 	0A((B////$6 	9 	9A11!R8888	9 	9rA   c                 "   |                     t          j        |                   }t          |                     t          j                            }t          ||dt          |                    }t          t          ||                     d S )Nmonocritr   r   )	r7   r-   r   r   r   r   r   r   r   r<   r   r=   r   rV   r   s         r?   r   z$TestFcluster.check_fcluster_monocrit(  ss    JJ2DQGHH	2::156677QZ(1++FFFa++,,,,,rA   c                 "   |                     t          j        |                   }t          |                     t          j                            }t          ||dt          |                    }t          t          ||                     d S )Nmaxclust_monocritr   )	r7   r-   r   r   r   r   r   r   r   r   s         r?   r   z-TestFcluster.check_fcluster_maxclust_monocrit.  st    JJ2DQGHH	2::156677Q%88A;;OOOa++,,,,,rA   c                    |                     dgdgdgg          }t          |          }t          t          |dd          |                     g d                     t          t          |dd          |                     g d                     t          t          |d	d          |                     g d
                     t          t          |dd          |                     g d
                     d S )Nr,   r   r6   r   )r   r   r,   r,   r,   ri   )ri   r,   r,   r   r   )r7   r   r   r   r<   r=   r>   rV   s       r?   test_fcluster_maxclust_gh_12651z,TestFcluster.test_fcluster_maxclust_gh_126514  s   JJaS1#''1II8AjAAA::iii00	2 	2 	28AjAAA::iii00	2 	2 	28AjAAA::iii00	2 	2 	28AjAAA::iii00	2 	2 	2 	2 	2rA   N)r{   r|   r}   r   r   r   r   r   r   r   r   r~   rA   r?   r   r     s        7 7 7- - -3 3 3- - -9 9 9- - -- - -
2 
2 
2 
2 
2rA   r   c                       e Zd Zd ZdS )TestLeadersc                    t           j        }t          |          }|                    |          }t	          |          }t          |dd          }|                    g d          |                    g d          f}|                    ||j                  }t          ||          }t          t          j
        |          t          j
        |          d           d S )	Nr   r   r   )5   7   8   )ri   r   r,   r   rj   r   )r-   r   r%   r7   r
   r   int32r   r   rl   concatenate)r<   r=   rc   YrV   r   LrightLs           r?   test_leaders_singlezTestLeaders.test_leaders_singleD  s    #!HHJJqMMAJJQ*222**\\\**BJJyyy,A,ABJJqJ))AqMMq))2>&+A+ANNNNNNrA   N)r{   r|   r}   r  r~   rA   r?   r   r   A  s(        
O 
O 
O 
O 
OrA   r   z+`is_isomorphic` only supports NumPy backendnp_onlyreasonc                   x    e Zd Z edd          d             Zd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd ZddZdS )TestIsIsomorphicTz,array-likes only supported for NumPy backendr  c                 V    t          g dg d          sJ t          g g           sJ d S Nr   )ri   ri   ri   )r   )r<   r=   s     r?   test_array_likez TestIsIsomorphic.test_array_likeU  s>     YYY			22222R$$$$$$$rA   c                     |                     g d          }|                     g d          }t          ||          sJ t          ||          sJ d S r
  r7   r   r<   r=   abs       r?   test_is_isomorphic_1z%TestIsIsomorphic.test_is_isomorphic_1[  ^    JJyyy!!JJyyy!!Q"""""Q"""""""rA   c                     |                     g d          }|                     g d          }t          ||          sJ t          ||          sJ d S )N)r,   r   r,   )ri   r   ri   r  r  s       r?   test_is_isomorphic_2z%TestIsIsomorphic.test_is_isomorphic_2b  r  rA   c                 ~    |                     g           }|                     g           }t          ||          sJ d S r   r  r  s       r?   test_is_isomorphic_3z%TestIsIsomorphic.test_is_isomorphic_3i  s<    JJrNNJJrNNQ"""""""rA   c                     |                     g d          }|                     g d          }t          ||          sJ t          ||          sJ d S )Nr   )r,   r   ri   r  r  s       r?   test_is_isomorphic_4Az&TestIsIsomorphic.test_is_isomorphic_4Ao  `     JJyyy!!JJyyy!!Q"""""Q"""""""rA   c                     |                     g d          }|                     g d          }t          ||          du sJ t          ||          du sJ d S )N)r,   ri   r   r   )r,   r   ri   r   Fr  r  s       r?   test_is_isomorphic_4Bz&TestIsIsomorphic.test_is_isomorphic_4Bw  sj     JJ|||$$JJ|||$$Q""e++++Q""e++++++rA   c                     |                     g d          }|                     g d          }t          ||          sJ t          ||          sJ d S )N)r   ri   r   )r   r   ri   r  r  s       r?   test_is_isomorphic_4Cz&TestIsIsomorphic.test_is_isomorphic_4C  r  rA   c                 @    dD ]}|                      d||           d S )Nri   r   r6     r=   help_is_isomorphic_randpermr<   r=   ncs      r?   test_is_isomorphic_5z%TestIsIsomorphic.test_is_isomorphic_5  s;      	> 	>B,,T2",====	> 	>rA   c                 D    dD ]}|                      d|dd|           d S )Nr  r   Tr6   r!  r"  r$  s      r?   test_is_isomorphic_6z%TestIsIsomorphic.test_is_isomorphic_6  sC      	G 	GB,,T2tQ2,FFFF	G 	GrA   c                     |                     g d          }|                     g d          }t          ||          rJ d S )Nr   r   r  r  s       r?   test_is_isomorphic_7z%TestIsIsomorphic.test_is_isomorphic_7  sH    JJyyy!!JJyyy!! A&&&&&&&rA   Fr   c                   t          d          D ]T}t          j                            |          |z                      t
                    }t          j        |j        t
                    }t          j                            |          }	t          d|j	        d                   D ]}
|	||
                  ||
<   |rOt          j                            |          }||d|         xx         dz  cc<   ||d|         xx         |z  cc<   |
                    |          }|
                    |          }t          ||          | k    sJ t          ||          | k    sJ Vd S )Nr   r   r   r,   )rangerl   rm   ro   astypeintrD   sizepermutationshaper7   r   )r<   nobs	nclustersnonisonerrorsr=   kr  r  PiQs               r?   r#  z,TestIsIsomorphic.help_is_isomorphic_randperm  sX   q 	7 	7A%%	199#>>As+++A	%%i00A1agaj))  1w! -I))$//!AgI,1$!AgI,9,

1A

1A A&&v:6666 A&&v:66666	7 	7rA   N)Fr   )r{   r|   r}   r/   r  r  r  r  r  r  r  r&  r(  r*  r#  r~   rA   r?   r  r  Q  s         dKM M M% %M M%# # ## # ## # ## # #, , ,# # #> > >G G G' ' '7 7 7 7 7 7rA   r  c                       e Zd Zd Zd Zd Zd Zd Z edd          d	             Z	 edd          d
             Z
 edd          d             Z edd          d             ZdS )TestIsValidLinkagec                 H    dD ]\  }}}|                      ||||           d S N))ri   r6   F)ri   r   F)r,   r   T)ri   r   T)#check_is_valid_linkage_various_sizer<   r=   nrowncolvalids        r?   "test_is_valid_linkage_various_sizez5TestIsValidLinkage.test_is_valid_linkage_various_size  sE    "> 	L 	LD$44T4KKKK	L 	LrA   c                     |                     g dg dg|j                  }|d |d |f         }t          t          |          |k               |st	          t
          t          |d           d S d S N)r   r,   r   ri   r6   )r   ri   r   r   r   r   Tthrow)r7   r   r   r   r9   r:   )r<   r@  rA  rB  r=   rV   s         r?   r>  z6TestIsValidLinkage.check_is_valid_linkage_various_size  s    JJ))))))+24*  > >eteUdUlO ##u,--- 	G*&6FFFFFF	G 	GrA   c                     |                     g dg dg|j                  }t          t          |          du            t	          t
          t          |d           d S Nr   r,   r   ri   r   ri   r   r   r   FTrF  )r7   int64r   r   r9   	TypeErrorr<   r=   rV   s      r?   test_is_valid_linkage_int_typez1TestIsValidLinkage.test_is_valid_linkage_int_type  sk    JJ&(/1x  9 9 ##u,---i!11DAAAAAArA   c                     |                     d|j                  }t          t          |          du            t	          t
          t          |d           d S Nr   r   r   FTrF  )rD   r   r   r   r9   r:   rN  s      r?   test_is_valid_linkage_emptyz.TestIsValidLinkage.test_is_valid_linkage_empty  sS    HHV2:H.. ##u,---j"2ATBBBBBBrA   c                    t          ddd          D ]l}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          t          |          du            md S Nr      r   r,   ri   T)r,  rl   rm   ro   r7   r
   r   r   r<   r=   r8  r>   rV   s        r?   test_is_valid_linkage_4_and_upz1TestIsValidLinkage.test_is_valid_linkage_4_and_up  s     q"a 	1 	1A	q!A#wz**A

1A

A$Q''4/0000		1 	1rA   	jax.numpy)jax arrays do not support item assignmentr  c                 P   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	
           d S )Nr   rV  r   r,   ri   r   FTrF  
r,  rl   rm   ro   r7   r
   r   r   r9   r:   rW  s        r?   -test_is_valid_linkage_4_and_up_neg_index_leftz@TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_left      
 q"a 	G 	GA	q!A#wz**A

1A

AAad1fI$Q''50111*&6FFFFF	G 	GrA   c                 P   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	           d S 
Nr   rV  r   r,   ri   r]  FTrF  r^  rW  s        r?   .test_is_valid_linkage_4_and_up_neg_index_rightzATestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_right  r`  rA   c                 P   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	           d S 
Nr   rV  r   r,   ri   g      FTrF  r^  rW  s        r?   'test_is_valid_linkage_4_and_up_neg_distz:TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_dist  s    
 q"a 	G 	GA	q!A#wz**A

1A

AAad1fI$Q''50111*&6FFFFF	G 	GrA   c                 P   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	           d S rb  r^  rW  s        r?   )test_is_valid_linkage_4_and_up_neg_countsz<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_counts  r`  rA   N)r{   r|   r}   rC  r>  rO  rS  rX  r/   r_  rc  rf  rh  r~   rA   r?   r;  r;    sa       L L L
G G GB B BC C C1 1 1 kHJ J J	G 	GJ J	G kHJ J J	G 	GJ J	G kHJ J J	G 	GJ J	G kHJ J J	G 	GJ J	G 	G 	GrA   r;  c                       e Zd Zd Zd Zd Zd Zd Z edd          d	             Z	 edd          d
             Z
 edd          d             ZdS )TestIsValidInconsistentc                     |                     g dg dg|j                  }t          t          |          du            t	          t
          t          |d           d S rI  )r7   rL  r   r   r9   rM  r<   r=   Rs      r?   test_is_valid_im_int_typez1TestIsValidInconsistent.test_is_valid_im_int_type  sg    JJ&(/1x  9 9A%'(((iat<<<<<<rA   c                 H    dD ]\  }}}|                      ||||           d S r=  )check_is_valid_im_various_sizer?  s        r?   test_is_valid_im_various_sizez5TestIsValidInconsistent.test_is_valid_im_various_size  sE    "> 	G 	GD$//dE2FFFF	G 	GrA   c                     |                     g dg dg|j                  }|d |d |f         }t          t          |          |k               |st	          t
          t          |d           d S d S rE  )r7   r   r   r   r9   r:   )r<   r@  rA  rB  r=   rm  s         r?   rp  z6TestIsValidInconsistent.check_is_valid_im_various_size  s    JJ))))))+24*  > >eteUdUlOA%'((( 	B*k1DAAAAAA	B 	BrA   c                     |                     d|j                  }t          t          |          du            t	          t
          t          |d           d S rQ  )rD   r   r   r   r9   r:   rl  s      r?   test_is_valid_im_emptyz.TestIsValidInconsistent.test_is_valid_im_empty   sO    HHV2:H..A%'(((j+q======rA   c                     t          ddd          D ]{}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          |          }t          t          |          du            |d S rU  )	r,  rl   rm   ro   r7   r
   r   r   r   r<   r=   r8  r>   rV   rm  s         r?   test_is_valid_im_4_and_upz1TestIsValidInconsistent.test_is_valid_im_4_and_up&  s     q"a 	, 	,A	q!A#wz**A

1A

AQAKNNd*++++	, 	,rA   rY  rZ  r[  c                 n   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	
           d S )Nr   rV  r   r,   ri          r   FTrF  r,  rl   rm   ro   r7   r
   r   r   r   r9   r:   rv  s         r?   (test_is_valid_im_4_and_up_neg_index_leftz@TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_left0       q"a 	B 	BA	q!A#wz**A

1A

AQAAad1fIKNNe+,,,*k1DAAAAA	B 	BrA   c                 n   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	           d S )
Nr   rV  r   r,   ri   ry  FTrF  rz  rv  s         r?   )test_is_valid_im_4_and_up_neg_index_rightzATestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_right=  r|  rA   c                 n   t          ddd          D ]}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          |          }d||dz  df<   t          t          |          du            t          t          t          |d	           d S re  rz  rv  s         r?   "test_is_valid_im_4_and_up_neg_distz:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_distJ  r|  rA   N)r{   r|   r}   rn  rq  rp  rt  rw  r/   r{  r~  r  r~   rA   r?   rj  rj    s        = = =G G G
B B B> > >, , , k*UVVV
B 
B WV
B k*UVVV
B 
B WV
B k*UVVV
B 
B WV
B 
B 
BrA   rj  c                   n    e Zd Z ed          d             Zd Zd Z ed          d             ZdS )TestNumObsLinkageTr2   c                 t    |                     d|j                  }t          t          t          |           d S NrR  r   )rD   r   r9   r:   r   rN  s      r?   test_num_obs_linkage_emptyz,TestNumObsLinkage.test_num_obs_linkage_emptyZ  s3     HHV2:H..j/155555rA   c                 ~    |                     g dg|j                  }t          t          |          d           d S )NrJ  r   ri   r7   r   r   r   rN  s      r?   test_num_obs_linkage_1x4z*TestNumObsLinkage.test_num_obs_linkage_1x4`  s>    JJ'rzJ::_Q''+++++rA   c                     |                     g dg dg|j                  }t          t          |          d           d S )NrJ  rK  r   r   r  rN  s      r?   test_num_obs_linkage_2x4z*TestNumObsLinkage.test_num_obs_linkage_2x4e  sO    JJ&(/1z  ; ;_Q''+++++rA   c                     t          ddd          D ]k}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          t          |          |           ld S )Nr   rV  r   r,   ri   )r,  rl   rm   ro   r7   r
   r   r   rW  s        r?   test_num_obs_linkage_4_and_upz/TestNumObsLinkage.test_num_obs_linkage_4_and_upk  s{     q"a 	0 	0A	q!A#wz**A

1A

A++Q////		0 	0rA   N)r{   r|   r}   r/   r  r  r  r  r~   rA   r?   r  r  X  s        t$$$6 6 %$6
, , ,
, , , t$$$0 0 %$0 0 0rA   r  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )TestLeavesListc                     |                     g dg|j                  }t          |           t          t	          |          ddgd           d S )NrJ  r   r   r,   rj   r   r7   r   r   r   r   rN  s      r?   test_leaves_list_1x4z#TestLeavesList.test_leaves_list_1x4y  sP    JJ'rzJ::


AAU;;;;;;rA   c                     |                     g dg dg|j                  }t          |           t          t	          |          g dd           d S )NrJ  rK  r   )r   r,   ri   rj   r   r  rN  s      r?   test_leaves_list_2x4z#TestLeavesList.test_leaves_list_2x4  sa    JJ&(/1z  ; ;


A			>>>>>>rA   c                 <    dD ]}|                      ||           d S r   )check_leaves_list_QrK   s      r?   test_leaves_list_Qz!TestLeavesList.test_leaves_list_Q  s6    ) 	1 	1F$$VR0000	1 	1rA   c                     |                     t          j                  }t          ||          }t	          |          }t          |                                t          |          d           d S )Nrj   r   )r7   r-   r   r
   r   r   	pre_orderr   )r<   rL   r=   rc   rV   nodes         r?   r  z"TestLeavesList.check_leaves_list_Q  s\    JJ*.//Avqzz((+a..uEEEEEErA   c                 `   |                     t          j                  }t          |d          }t	          |          }t          |                                |                                                                |                                                                z   d           d S )Nr   rj   r   )	r7   r-   r   r
   r   r   r  get_left	get_right)r<   r=   rc   rV   r  s        r?   test_Q_subtree_pre_orderz'TestLeavesList.test_Q_subtree_pre_order  s    JJ*.//Ax  qzz((4==??+D+D+F+F-1^^-=-=-G-G-I-I,J"	$ 	$ 	$ 	$ 	$ 	$rA   N)r{   r|   r}   r  r  r  r  r  r~   rA   r?   r  r  v  sb        < < <? ? ?1 1 1
F F F$ $ $ $ $rA   r  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )TestCorrespondc                     |                     d|j                  }|                     d|j                  }t          t          t          ||           d S )NrC   r   rR  )rD   r   r9   r:   r   r   s       r?   test_correspond_emptyz$TestCorrespond.test_correspond_empty  sJ    HHTH,,HHU"*H--j*a33333rA   c                    t          dd          D ]k}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          t          ||                     lt          ddd          D ]k}t          j                            ||dz
  z  dz            }|                    |          }t          |          }t          t          ||                     ld S )Nri   r   r,   rV  r   )r,  rl   rm   ro   r7   r
   r   r   rW  s        r?   test_correspond_2_and_upz'TestCorrespond.test_correspond_2_and_up  s     q! 	& 	&A	q!A#wz**A

1A

AJq!$$%%%%q"a 	& 	&A	q!A#wz**A

1A

AJq!$$%%%%		& 	&rA   c                    t          t          t          t          dd                    t          t          dd                                        t          t          t          t          dd                    t          t          dd                                        z   D ]\  }}t          j                            ||dz
  z  dz            }t          j                            ||dz
  z  dz            }|                    |          }|                    |          }t          |          }t          |          }t          ||          rJ t          ||          rJ d S )Nri   r   r   r6   r,   	listzipr,  rl   rm   ro   r7   r
   r   r<   r=   r8  jr>   y2rV   Z2s           r?   test_correspond_4_and_upz'TestCorrespond.test_correspond_4_and_up  s/    CU1a[[ 1 14a3D3DEEFFCU1a[[ 1 14a3D3DEEFFG 		) 		)FQ	q!A#wz**A1Q3
++B

1ABB

AB!!R(((((!"a((((((		) 		)rA   c                    t          t          t          t          dd                    t          t          dd                                        t          t          t          t          dd                    t          t          dd                                        z   D ]\  }}t          j                            ||dz
  z  dz            }t          j                            ||dz
  z  dz            }|                    |          }|                    |          }t          |          }t          |          }t          ||          rJ t          ||          rJ d S )Nri   r         r,   r  r  s           r?   test_correspond_4_and_up_2z)TestCorrespond.test_correspond_4_and_up_2  s/    CU1a[[ 1 14b"3F3FGGHHCU1a[[ 1 14b"3F3FGGHHI 		) 		)FQ	q!A#wz**A1Q3
++B

1ABB

AB!!R(((((!"a((((((		) 		)rA   c                    t          dd          D ]r}t          j                            |d          }t	          |          }|                    |          }t          |          }t          t          |          |           sd S )Nri   r   r   )	r,  rl   rm   ro   r%   r7   r
   r   r   )r<   r=   rr   rc   r   rV   s         r?   !test_num_obs_linkage_multi_matrixz0TestCorrespond.test_num_obs_linkage_multi_matrix  sx    q" 	0 	0A	q!$$AaA

1A

A++Q////	0 	0rA   N)r{   r|   r}   r  r  r  r  r  r~   rA   r?   r  r    s_        4 4 4& & &) ) )) ) )0 0 0 0 0rA   r  c                   v    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z ed
d          d             Zd ZdS )TestIsMonotonicc                 t    |                     d|j                  }t          t          t          |           d S r  )rD   r   r9   r:   r   rN  s      r?   test_is_monotonic_emptyz'TestIsMonotonic.test_is_monotonic_empty  s1    HHV2:H..j,22222rA   c                 f    |                     g dg|j                  }t          |          sJ d S )Nr   r,   333333?ri   r   r7   r   r   rN  s      r?   test_is_monotonic_1x4z%TestIsMonotonic.test_is_monotonic_1x4  s8    JJ'rzJ::ArA   c                 l    |                     g dg dg|j                  }t          |          sJ d S )Nr  )ri   r   皙?r   r   r  rN  s      r?   test_is_monotonic_2x4_Tz'TestIsMonotonic.test_is_monotonic_2x4_T  sI    JJ&(/1z  ; ;ArA   c                 l    |                     g dg dg|j                  }t          |          rJ d S )N)r   r,   r  ri   )ri   r   r  r   r   r  rN  s      r?   test_is_monotonic_2x4_Fz'TestIsMonotonic.test_is_monotonic_2x4_F  sI    JJ&(/1z  ; ;??"""""rA   c                 r    |                     g dg dg dg|j                  }t          |          sJ d S )Nr  ri   r   r  ri   r   r6   g333333?r   r   r  rN  s      r?   test_is_monotonic_3x4_Tz'TestIsMonotonic.test_is_monotonic_3x4_T  sR    JJ&&(/1z  ; ; ArA   c                 r    |                     g dg dg dg|j                  }t          |          rJ d S )Nr  )ri   r   皙?ri   r  r   r  rN  s      r?   test_is_monotonic_3x4_F1z(TestIsMonotonic.test_is_monotonic_3x4_F1  R    JJ&&(/1z  ; ;  ??"""""rA   c                 r    |                     g dg dg dg|j                  }t          |          rJ d S )N)r   r,   g?ri   r  r  r   r  rN  s      r?   test_is_monotonic_3x4_F2z(TestIsMonotonic.test_is_monotonic_3x4_F2   r  rA   c                 r    |                     g dg dg dg|j                  }t          |          rJ d S )Nr  r  )r   r6   r  r   r   r  rN  s      r?   test_is_monotonic_3x4_F3z(TestIsMonotonic.test_is_monotonic_3x4_F3  r  rA   c                     t          |                    t          j                  d          }t	          |          sJ d S Nr   r
   r7   r-   rT   r   rN  s      r?    test_is_monotonic_tdist_linkage1z0TestIsMonotonic.test_is_monotonic_tdist_linkage1  s;     BJJ29::HEEArA   rY  rZ  r[  c                     t          |                    t          j                  d          }d|d<   t	          |          rJ d S )Nr   r5   )ri   ri   r  rN  s      r?    test_is_monotonic_tdist_linkage2z0TestIsMonotonic.test_is_monotonic_tdist_linkage2  sD     BJJ29::HEE#??"""""rA   c                     |                     t          j                  }t          |d          }t	          |          sJ d S r  )r7   r-   r   r
   r   )r<   r=   rc   rV   s       r?   test_is_monotonic_Q_linkagez+TestIsMonotonic.test_is_monotonic_Q_linkage  s@     JJ*.//Ax  ArA   N)r{   r|   r}   r  r  r  r  r  r  r  r  r  r/   r  r  r~   rA   r?   r  r    s        3 3 3
  
  # # #  # # ## # ## # #   k*UVVV# # WV#    rA   r  c                   r    e Zd Zd Z edd          d             Z edd          d             Zd ZdS )	TestMaxDistsc                 t    |                     d|j                  }t          t          t          |           d S r  )rD   r   r9   r:   r   rN  s      r?   test_maxdists_empty_linkagez(TestMaxDists.test_maxdists_empty_linkage'  s1    HHV2:H..j(A.....rA   rY  rZ  r[  c                     |                     g dg|j                  }t          |          }t          ||          }t	          ||d           d S )Nr   r,   r  r   r   rj   rQ   )r7   r   r   calculate_maximum_distancesr(   )r<   r=   rV   MD
expectedMDs        r?   !test_maxdists_one_cluster_linkagez.TestMaxDists.test_maxdists_one_cluster_linkage,  sW     JJ'rzJ::a[[0B77
JU333333rA   c                 <    dD ]}|                      ||           d S Nr   rG   r[   rY   rZ   )check_maxdists_Q_linkagerK   s      r?   test_maxdists_Q_linkagez$TestMaxDists.test_maxdists_Q_linkage4  s4    J 	6 	6F))&"5555	6 	6rA   c                     |                     t          j                  }t          ||          }t	          |          }t          ||          }t          ||d           d S )Nrj   rQ   )r7   r-   r   r
   r   r  r(   )r<   rL   r=   rc   rV   r  r  s          r?   r  z%TestMaxDists.check_maxdists_Q_linkage9  s[    JJ*.//Ava[[0B77
JU333333rA   N)r{   r|   r}   r  r/   r  r  r  r~   rA   r?   r  r  $  s        / / /
 k*UVVV4 4 WV4 k*UVVV6 6 WV64 4 4 4 4rA   r  c                       e Zd Z ed          d             Zd Z eddd          d             Z eddd          d	             Zd
 ZdS )TestMaxInconstsTr2   c                     |                     d|j                  }|                     d|j                  }t          t          t          ||           d S r  )rD   r   r9   r:   r   r<   r=   rV   rm  s       r?   test_maxinconsts_empty_linkagez.TestMaxInconsts.test_maxinconsts_empty_linkageD  sL     HHV2:H..HHV2:H..j+q!44444rA   c                     |                     g dg|j                  }t          j                            dd          }|                     |          }t          t          t          ||           d S Nr  r   ri   r   )r7   r   rl   rm   ro   r9   r:   r   r  s       r?   test_maxinconsts_difrow_linkagez/TestMaxInconsts.test_maxinconsts_difrow_linkageK  s`     JJ'rzJ::INN1a  JJqMMj+q!44444rA   rY  rZ  r  r3   c                     |                     g dg|j                  }|                     g dg|j                  }t          ||          }t          |||          }t	          ||d           d S )Nr  r   r   r   r   r  r!  rj   rQ   )r7   r   r   !calculate_maximum_inconsistenciesr(   )r<   r=   rV   rm  r  r  s         r?   $test_maxinconsts_one_cluster_linkagez4TestMaxInconsts.test_maxinconsts_one_cluster_linkageS  s~     JJ'rzJ::JJ'rzJ::A6q!CCC
JU333333rA   c                 <    dD ]}|                      ||           d S r  )check_maxinconsts_Q_linkagerK   s      r?   test_maxinconsts_Q_linkagez*TestMaxInconsts.test_maxinconsts_Q_linkage]  s7     K 	9 	9F,,VR8888	9 	9rA   c                     |                     t          j                  }t          ||          }t	          |          }t          ||          }t          |||          }t          ||d           d S )Nr!  rj   rQ   )r7   r-   r   r
   r   r   r  r(   )r<   rL   r=   rc   rV   rm  r  r  s           r?   r  z+TestMaxInconsts.check_maxinconsts_Q_linkagec  so    JJ*.//AvOOA6q!CCC
JU333333rA   N)	r{   r|   r}   r/   r  r  r  r  r  r~   rA   r?   r  r  B  s        t$$$5 5 %$55 5 5 k*U#% % %4 4% %4 k*U#% % %9 9% %94 4 4 4 4rA   r  c                       e Zd Zd Zd Z ed          d             Zd Zd Zd Z	 ed	d
d          d             Z
d Z ed	d
d          d             Zd ZdS )TestMaxRStatc                 <    dD ]}|                      ||           d S )N)gffffff
@r   r   )check_maxRstat_invalid_indexr<   r=   r8  s      r?   test_maxRstat_invalid_indexz(TestMaxRStat.test_maxRstat_invalid_indexo  s4     	5 	5A--a4444	5 	5rA   c                 $   |                     g dg|j                  }|                     g dg|j                  }t          |t                    rt	          t
          t          |||           d S t	          t          t          |||           d S )Nr  r   r  )r7   r   
isinstancer.  r9   r:   r   rM  r<   r8  r=   rV   rm  s        r?   r  z)TestMaxRStat.check_maxRstat_invalid_indexs  s    JJ'rzJ::JJ'rzJ::a 	8*h1a88888)Xq!Q77777rA   Tr2   c                 V    t          d          D ]}|                     ||           d S Nr   )r,  check_maxRstat_empty_linkager  s      r?   test_maxRstat_empty_linkagez(TestMaxRStat.test_maxRstat_empty_linkage|  s:    q 	5 	5A--a4444	5 	5rA   c                     |                     d|j                  }|                     d|j                  }t          t          t          |||           d S r  )rD   r   r9   r:   r   r  s        r?   r  z)TestMaxRStat.check_maxRstat_empty_linkage  sL    HHV2:H..HHV2:H..j(Aq!44444rA   c                 V    t          d          D ]}|                     ||           d S r   )r,  check_maxRstat_difrow_linkager  s      r?   test_maxRstat_difrow_linkagez)TestMaxRStat.test_maxRstat_difrow_linkage  s:    q 	6 	6A..q"5555	6 	6rA   c                     |                     g dg|j                  }t          j                            dd          }|                     |          }t          t          t          |||           d S r  )r7   r   rl   rm   ro   r9   r:   r   r  s        r?   r  z*TestMaxRStat.check_maxRstat_difrow_linkage  sb     JJ'rzJ::INN1a  JJqMMj(Aq!44444rA   rY  rZ  r  c                 V    t          d          D ]}|                     ||           d S r   )r,  "check_maxRstat_one_cluster_linkager  s      r?   !test_maxRstat_one_cluster_linkagez.TestMaxRStat.test_maxRstat_one_cluster_linkage  s<     q 	; 	;A33Ar::::	; 	;rA   c                     |                     g dg|j                  }|                     g dg|j                  }t          ||d          }t          ||d|          }t	          ||d           d S )Nr  r   r  r,   rj   rQ   )r7   r   r   r  r(   )r<   r8  r=   rV   rm  r  r  s          r?   r	  z/TestMaxRStat.check_maxRstat_one_cluster_linkage  s}    JJ'rzJ::JJ'rzJ::aA6q!QCC
JU333333rA   c                 b    dD ]+}t          d          D ]}|                     |||           ,d S )Nr  r   )r,  check_maxRstat_Q_linkage)r<   r=   rL   r8  s       r?   test_maxRstat_Q_linkagez$TestMaxRStat.test_maxRstat_Q_linkage  sS     K 	= 	=F1XX = =--fa<<<<=	= 	=rA   c                     |                     t          j                  }t          ||          }t	          |          }t          ||d          }t          ||d|          }t          ||d           d S )Nr,   rj   rQ   )r7   r-   r   r
   r   r   r  r(   )	r<   rL   r8  r=   rc   rV   rm  r  r  s	            r?   r  z%TestMaxRStat.check_maxRstat_Q_linkage  sp    JJ*.//AvOOaA6q!QCC
JU333333rA   N)r{   r|   r}   r  r  r/   r  r  r  r  r
  r	  r  r  r~   rA   r?   r  r  m  s       5 5 58 8 8 t$$$5 5 %$55 5 56 6 65 5 5 k*U#% % %; ;% %;4 4 4 k*U#% % %= =% %=
4 4 4 4 4rA   r  c                      e Zd Zd Zd Zd Zej                            e	 d          d             Z
 edd          ej                            e	 d          d	                         Zd
 Z edd          ej                            e	 d          d                         Zej        d             Zd Zd Zd ZdS )TestDendrogramc                     t          |                    t          j                  d          }t	          |d          }|d         }t          |g d           d S )Nr   Tno_plotleavesri   r6   r,   r   r   r   )r
   r7   r-   rT   r   r   )r<   r=   rV   rm  r  s        r?   $test_dendrogram_single_linkage_tdistz3TestDendrogram.test_dendrogram_single_linkage_tdist  sY    BJJ29::HEEq$'''8V///00000rA   c                     t          |                    t          j                  d          }t	          t
          t          |d           d S )Nr   fooorientation)r
   r7   r-   rT   r9   r:   r   rN  s      r?   test_valid_orientationz%TestDendrogram.test_valid_orientation  s>    BJJ29::HEEj*aUCCCCCCrA   c                     t          |                    t          j                  d          }g d}t	          ||                    |          d          }t	          ||d          }||k    sJ d S )Nr   )r,   r   ri   r   r   r6   T)labelsr  )r
   r7   r-   rT   r   )r<   r=   rV   r  result1result2s         r?   test_labels_as_array_or_listz+TestDendrogram.test_labels_as_array_or_list  sw    BJJ29::HEE###Qrzz&'9'94HHHQvt<<<'!!!!!!rA   zno matplotlibr[  c           	         |                     g dg dg dg          }t          j                     t          j        t
                    5 }t          |t          t          d                               d d d            n# 1 swxY w Y   dt          |j
                  v sJ t          j        t
          d          5  t          |g            d d d            n# 1 swxY w Y   t          j                     d S )N)r   r,   r   r   )ri   r   r   r6   )r   r6   r   r   d   )r  z.Dimensions of Z and labels must be consistent.r   )r7   pltfigurer   r   r:   r   r  r,  strvalueclose)r<   r=   linkexc_infos       r?   test_valid_label_sizez$TestDendrogram.test_valid_label_size  s   zzNNNNNN
  
 	
]:&& 	6(tDs$4$45555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6?hn%%& & & & ]FH H H 	( 	( tB''''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(
 		s$   ,BB
BCC#&C#torchzFMPL 3.9.2 & torch DeprecationWarning from __array_wrap__ and NumPy 2.0c                 <    dD ]}|                      ||           d S )N)topbottomleftright)check_dendrogram_plot)r<   r=   r  s      r?   test_dendrogram_plotz#TestDendrogram.test_dendrogram_plot  s6     > 	8 	8K&&{B7777	8 	8rA   c                 (   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	          j                    }|                    d          }t          |||          }t          j        |d                   |d<   t          ||           t          |||dd           |dv r|
                                d         n|                                d         }t          |                                d           t          |                                d           t          |||d           |dv r|
                                d         n|                                d         }t          |                                d           t          |||d           |dv r|
                                d         n|                                d         }t          |                                d           t	          j                     t          ||          }	t	          j                     t          j        |	d                   |	d<   t          |	|           d S )Nr   )C1C0r6  r6  r6  r5   r   r   r5   )r5   r   r   r5   )r5   r   r   r   r5   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        @@rA  )251034r  )r5  r5  r6  r6  r6  r6  
color_listdcoordicoordivlr  leaves_color_list   )axr  rJ  rh   Z   )rO  r  leaf_font_sizeleaf_rotation)r.  r/  r   )rO  r  rR  )rO  r  rQ  r  )r
   r7   r-   rT   r$  r%  add_subplotr   rl   r   get_xticklabelsget_yticklabelsget_rotationget_sizer(  )
r<   r  r=   rV   expectedfigrO  R1	testlabelR2s
             r?   r2  z$TestDendrogram.check_dendrogram_plot  s   BJJ29::HEE"@"@"@777777999999;;;	=
  655777777777999	;
 :99000)M)M)M   jll__S!! bk:::z"X,//8R""" 	1"$B	8 	8 	8 	8 ///   ####%%a( 	
 	Y++--r222Y''))2...1!#	% 	% 	% 	% ///   ####%%a( 	
 	Y++--r2221"$	& 	& 	& 	& ///   ####%%a( 	
 	Y''))2...	 {333	z"X,//8R"""""rA   c           
      "   t          |                    t          j                  d          }t	          |ddd          }t          j                     t          j        |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          }t          j                     t          j        |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   ri   lastpT)show_contractedrJ  r6  )r5   r   r   r5   r:  (2)z(4)r   r   rH  mtica)r5  r6  r6  r6  r7  )r5   r   r   r5   r8  r9  )r=  r=  r;  r;  )r?  r?        D@rb  )r   r        @@@rc  )rB  rC  rD  rE  r`  )ri   r6   r,   r   r   )r5  r5  r6  r6  r6  )	r
   r7   r-   rT   r   r$  r(  rl   r   r  s       r?   test_dendrogram_truncate_modez,TestDendrogram.test_dendrogram_truncate_mode#  s    BJJ29::HEEq!Wd;;;	j8--(Qv$<$<$<#=$:$:$:#;!&$%q6/3Tl  	 	 	 q!Wd;;;	j8--(Q'?'?'?$<$<$<$<$<$<$>$>$>$@$@$@$B %;$:$:$<$<$<$<$<$<$<$<$<$> !< ; ;#2??.L.L.L  	 	 	 	 	rA   c                     t                      S r   r*   )r<   s    r?   dendrogram_lockzTestDendrogram.dendrogram_lockG  s    vvrA   c                 R   t          |                    t          j                  d          }|5  t	          g d           t          |ddd          }t	          g d           |d         }t          |g d	           t	          d            d d d            d S # 1 swxY w Y   d S )
Nr   )r   mr>   r6  Tg   )r  above_threshold_colorcolor_threshold)ri  rr   rh  r>   r6  rI  )r   rh  ri  ri  ri  )r
   r7   r-   rT   r   r   r   )r<   r=   rf  rV   rm  rI  s         r?   test_dendrogram_colorsz%TestDendrogram.test_dendrogram_colorsK  s   BJJ29::HEE 	) 	)"#7#7#78881d.13H H HA"#A#A#ABBB<J%>%>%>??? #4(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   ABB #B c           	          |                     g dg dg dg dg dg dg          }t          |d          }t          |d          }g d}|d	         }t          ||           d S )
Nr,   r   r   r   r   r,   r   ri   r   r   r,   r   r   Tr  r6  r5  r5  r6  C2ru  rM  r7   r
   r   r   r<   r=   xzrs   
exp_colorscolorss          r?   %test_dendrogram_leaf_colors_zero_distz4TestDendrogram.test_dendrogram_leaf_colors_zero_dist\  s     JJ			!		!		!		!		!		# $ $ Ax  q$'''999
&'VZ(((((rA   c           	          |                     g dg dg dg dg dg dg          }t          |d          }t          |d          }g d	}|d
         }t          ||           d S )Nrp  )r   r   g?rr  rq  rs  r   Tr  rt  rM  rv  rw  s          r?   test_dendrogram_leaf_colorsz*TestDendrogram.test_dendrogram_leaf_colorsk  s     JJ			#!		!		!		!		# $ $ Ax  q$'''999
&'VZ(((((rA   N)r{   r|   r}   r  r  r!  r   markskipifhave_matplotlibr+  r/   r3  r2  rd  fixturerf  rn  r|  r~  r~   rA   r?   r  r    s       1 1 1D D D" " " [O+ODD  ED& g!   [O+ODD8 8 ED	 
8<# <# <#| g"   [O+ODD  ED	 
> ^  ^) ) )") ) )) ) ) ) )rA   r  c                    | j         d         dz   }|                    |dz
  f| j                  }|                    d          }t          d|dz
            D ]}d|d d <   | |df         }| |df         }||k    r(||                    ||j                  |z
           |d<   ||k    r(||                    ||j                  |z
           |d<   | |df         |d<   |                    |          ||<   |S Nr   r,   r   )r   r5   ri   )r1  rD   r   r,  r7   rL  max)rV   r=   rr   Bqr8  r0  r1  s           r?   r  r  {  s   	
QA
!A#qw''A
A1a!e__ 	 	!!!Aw!Q$199RZZBHZ559:AaDA::RZZRXZ66:;AaDAw!vvayy!HrA   r   c                    | j         d         dz   }|                    | |          }|                    |dz
  f|          }|                    d          }t          d|dz
            D ]}d|d d <   | |df         }	| |df         }
|	|k    r(||                    |	|j                  |z
           |d<   |
|k    r(||                    |
|j                  |z
           |d<   |||f         |d<   |                    |          ||<   |S r  )r1  result_typerD   r,  r7   rL  r  )rV   rm  r6  r=   rr   r   r  r  r8  r0  r1  s              r?   r  r    s   	
QANN1a  E
!A#u%%A
A1a!e__ 	 	!!!Aw!Q$199RZZBHZ559:AaDA::RZZRXZ66:;AaDAw!vvayy!HrA   c           	      n    t          t          t          |                     ddgddgg                     d S )Nr   r,   )r   r	   r
   r7   r!  s    r?   <test_unsupported_uncondensed_distance_matrix_linkage_warningr    s5     "**q!fq!f5E*F*FGGGGGrA   c           
          t           j        j        j        D ]9}t	          t
          t          |                     ddgddgg          |d           :d S )Nr,   	cityblockrL   rb   )rd   cluster	hierarchy_EUCLIDEAN_METHODSr9   r:   r
   r7   )r=   rL   s     r?   "test_euclidean_linkage_value_errorr    sc    -)< 9 9j'2::1v1v6F+G+G#K	9 	9 	9 	9 	99 9rA   c                     t          |                     dg          dd          }t          |                     ddgddgg          dd          }t          ||d           d S )Nr,   r   ra   r  r   rj   r   )r
   r7   r(   )r=   Z1r  s      r?   test_2x2_linkager    sj    	QC+	F	F	FB	aVaV,--h{	S	S	SBB''''''rA   c                    t           j                            d           d}t           j                            |d          }|                     |          }t
          j        j                            |          }t          |          }t          ||                                k               t          |                                |                                k               t          |                                |                                k               t          |                                |                                k               d S )N   2   r   )rl   rm   seedrandnr7   rd   r  r  r[   r   r   r  r  )r=   r2  rc   rV   trees        r?   test_node_comparer    s    INN2D
	a  A


1A$$Q''A1::DD4==??"###DNNt}}.///DNN 0 00111DNN/00000rA   z%`cut_tree` uses non-standard indexingc           	      f   t           j                            d           d}t           j                            |d          }|                     |          }t
          j        j                            |          }t          |          }t          |d d df         |                     |          dd           t          |d d df         |                     |          dd           t          t          j        |                              d          t          j        |d	z
  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          |          }|                     d |D                       }t          |d d t          j        |dg          f         t          |d          d           t          |d d t          j        |ddg          f         t          |ddg          d           t          |d d t          j        |ddg          f         t          |ddg          d           d S )Nr  r  r   r   rj   F)rk   check_dtyper   r,   r6   )
n_clustersr   ir   c                     g | ]	}|j         
S r~   )dist).0r  s     r?   
<listcomp>z!test_cut_tree.<locals>.<listcomp>  s    666$)666rA   )height)rl   rm   r  r  r7   rd   r  r  r[   r    r(   arangerD   r   r  r"   searchsorted)r=   r2  rc   rV   cutreenodesheightss          r?   test_cut_treer    s   INN2D
	a  A


1A$$Q''Aa[[F F111a4L"))D//5QQQQF111b5M288D>>5QQQQF##''**BIdQhB,G,GHHHF111rd7OXaA%>%>%>UKKKKF111r3i<((1!R*I*I*IPUVVVVF111sBi<((1"a*I*I*IPUVVVV""Ejj6666677GF111bogs;;;<Qq)))7 7 7 7F111bog2w???@Q2w///e= = = =F111bogAw???@QAw///e= = = = = =rA   c                 (   t          t          |                     t          j                            |                     t          j                            }t          j        }t          ||                     |          d           t          t          |                     t          j                  d          |                     t          j                            }t          j        }t          ||                     |          d           d S )NrP   rQ   r[   r`   )	r!   r
   r7   r-   rT   ry   r(   rc   linkage_X_ward_olo)r=   rV   rW   s      r?   rz   rz     s     	gbjj1D1K&L&LMM jj)<)CDD	F 	FA#=IArzz),,59999 	gbjj1D1F&G&GPP jj)<)>??	A 	AA#6IArzz),,5999999rA   z"`Heap` only supports NumPy backendc                    |                      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)ri   r   r         r   keyr   r'  r  r,   r   g      @ri   r   r   r   )r7   r&   get_minr   
remove_minchange_value)r=   valuesheappairs       r?   	test_Heapr    s   ZZ+++,,F<<D<<>>Dea   g%%%OO<<>>Dea   g###a<<>>Dea   g"""OOOOa<<>>Dea   g"""OO<<>>Dea   g#####rA   c                     |                      g d          }t          j        t                    5  t	          |d           d d d            d S # 1 swxY w Y   d S )N)r   r   r   rY   r   )r7   r   r   r:   r
   )r=   r  s     r?   test_centroid_neg_distancer    s     ZZ


##F	z	"	" + +z****+ + + + + + + + + + + + + + + + + +s   AAA)^numpyrl   numpy.testingr   r   r   r   r   r   r   r9   scipy.cluster.hierarchyrd   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/   r1   r   r   r   r   r   r   r  r;  rj  r  r  r  r  r  r  r  r  r  r  thread_unsafer  r  r  r  r  rz   r  r  r~   rA   r?   <module>r     s  D    ) ) ) ) ) ) ) ) ) ) ) ) ) )  * * * * * *    7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ) ( ( ( ( ( ) ) ) ) ) ) / / / / / / B B B B B B B B       ! ! ! ! ! !
JN5######OO   OOO #FK$;$;<N$O$OP
;/ :> :> :> :> :> :> :> :>z 4   > > > > > > > ! >> 4   	T 	T 	T 	T 	T 	T 	T ! 	T 4   %& %& %& %& %& %& %& ! %&P$ $ $ $ $ $ $ $D 4   <2 <2 <2 <2 <2 <2 <2 ! <2~ 4   O O O O O O O ! O $FH H HV7 V7 V7 V7 V7 V7 V7H HV7r 4   XG XG XG XG XG XG XG ! XGv 4   LB LB LB LB LB LB LB ! LB^0 0 0 0 0 0 0 0< 4   "$ "$ "$ "$ "$ "$ "$ ! "$J 4   90 90 90 90 90 90 90 ! 90x 4   G G G G G G G ! GT 4   4 4 4 4 4 4 4 ! 4:(4 (4 (4 (4 (4 (4 (4 (4VB4 B4 B4 B4 B4 B4 B4 B4J 4   E) E) E) E) E) E) E) ! E)P  $ /0B    & 4   H H !  H9 9 9 4   ( ( ! ( 4   
1 
1 ! 
1 $'NOOO= = PO=8 4   : : ! : $'KLLL$ $ ML$@ 4   + + ! + + +s   B! !B+*B+