
    e!h                        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 e6jn                  d       d dl8m9Z: dZ;e.ejz                  j}                  d      gZ?ejz                  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jz                  j                   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]y# e<$ r dZ;Y w xY w)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y)TestLinkageTcpu_onlyc                 t    |j                  |j                  gdgdz  z         }t        t        t        |       y )N           )asarraynanassert_raises
ValueErrorr
   selfxpys      j/var/www/html/diagnosisapp-backend/venv/lib/python3.12/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                 P    |j                  d      }t        t        t        |       y )Nr   )zerosr9   r:   r
   r;   s      r?   "test_linkage_empty_distance_matrixz.TestLinkage.test_linkage_empty_distance_matrixU   s     HHTNj'1-rA   c                 6    dD ]  }| j                  ||        y )N)r   completeaverageweighted)check_linkage_tdistr<   r=   methods      r?   test_linkage_tdistzTestLinkage.test_linkage_tdist[   s!    C 	1F$$VR0	1rA   c                     t        |j                  t        j                        |      }t	        t        d|z         }t        ||j                  |      d       y )Nlinkage_ytdist_绽|=atolr
   r7   r-   ytdistgetattrr(   )r<   rL   r=   Z	expectedZs        r?   rJ   zTestLinkage.check_linkage_tdist`   sF    BJJ299:FC/1BV1KL	2::i0u=rA   c                 6    dD ]  }| j                  ||        y )N)centroidmedianward)check_linkage_qrK   s      r?   test_linkage_XzTestLinkage.test_linkage_Xf   s!    4 	-F  ,	-rA   c                    t        |j                  t        j                        |      }t	        t        d|z         }t        ||j                  |      d       t        j                  j                  j                  t        j                  d      }t        |j                  |      |      }t        ||j                  |      d       y )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45v>/1FG	2::i0u=MM""(()<)>)>0; ) =BJJqM6*2::i0u=rA   c                 X   t         j                  j                  d      }d}|j                  |d      }t	        |      }t        j                         D ]U  \  }}t        j                  |||      }t        |j                  |      |      }	t        |	|j                  |      dd       W y )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    ii##A&HHQN!H,224 	NLFD"**1a6I

1v.AArzz)45uM	NrA   c                     t        |j                  t        j                        d      }t	        t        d      }t        ||j                  |      d       y )NT)optimal_orderinglinkage_ytdist_single_olorP   rQ   rS   )r<   r=   rV   rW   s       r?   test_optimal_leaf_orderingz&TestLinkage.test_optimal_leaf_ordering   sA    BJJ299:TR/1LM	2::i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> t$- %-	> t$	N %	N t$> %>rA   r1   r2   c                   `   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y	)
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                 6    dD ]  }| j                  ||        y Nr   )check_linkage_tiesrK   s      r?   test_linkage_tiesz!TestLinkageTies.test_linkage_ties   s#    5 	0F##FB/	0rA   c                     |j                  ddgddgddgg      }t        ||      }| j                  |   }t        ||j                  |      d       y )Nr   r,   rL   r`   rQ   )r7   r
   _expectationsr(   )r<   rL   r=   rc   rV   rW   s         r?   r   z"TestLinkageTies.check_linkage_ties   sT    JJR1a&1a&12Af%&&v.	2::i0u=rA   N)r{   r|   r}   rl   arrayr   r   r   r~   rA   r?   r   r      s     "((113 4BHH335 6288224 5BHH335 6BHH335 6"((113 4//1 2M"0
>rA   r   c                       e Zd Zd Zd Zy)TestInconsistentc                 R    t         j                  D ]  }| j                  ||        y N)r-   inconsistent_ytdistcheck_inconsistent_tdist)r<   r=   depths      r?   test_inconsistent_tdistz(TestInconsistent.test_inconsistent_tdist   s'    (<< 	5E))%4	5rA   c                     |j                  t        j                        }t        t	        ||      |j                  t        j
                  |                y r   )r7   r-   linkage_ytdist_singler(   r   r   )r<   r   r=   rV   s       r?   r   z)TestInconsistent.check_inconsistent_tdist   sA    JJ*@@AQ.

#6#J#J5#QR	TrA   N)r{   r|   r}   r   r   r~   rA   r?   r   r      s    5TrA   r   c                       e Zd Zd Zd Zd Zy)TestCopheneticDistancec                     |j                  g d      }|j                  t        j                        }t        |      }t	        ||j                  ||j
                        d       y )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   sP    JJ  9 :	JJ*@@AQK2::irzz:BOrA   c                 P   |j                  t        j                        }t        ||j                  t        j                              \  }}|j                  g d|j
                        }|j                  d|j
                        d   }t        ||d       t        ||d       y )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!RZZ(;(B(BCDAJJ  9@B

  L	JJ?rzzJRSUV	95195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        |j	                  |             d d d        y # 1 sw Y   y xY w)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   sb    
 ""!"!""##$$
& ]]:-EF 	&RZZ_%	& 	& 	&s   A##A,N)r{   r|   r}   r   r   r   r~   rA   r?   r   r      s    P2&rA   r   c                   N    e Zd Zd Z ed      d        Z ed      d        Zy)TestMLabLinkageConversionc                     |j                  g |j                        }t        t        |      |       t        t	        |      |       y )Nr   )r7   r   r)   r   r   )r<   r=   rc   s      r?   "test_mlab_linkage_conversion_emptyz<TestMLabLinkageConversion.test_mlab_linkage_conversion_empty   s7    JJrJ,)!,a0*A.rA   Tr2   c                    |j                  g dg      }|j                  g dg      }t        t        |      |j                  ||j                        d       t        t	        |      |j                  ||j                        d       y )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   sq     JJ()*ZZ$)"-rzz!2::z/N"	$*BJJrJ,L"	$rA   c                 .   |j                  g dg dg dg dg dg      }|j                  g dg dg dg d	g d
g|j                        }t        t        |      |d       t        t	        |      |j                  ||j                        d       y )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k$k<A BJJ*****	,
  ZZ  ) 	)"-qu=*BJJrJ,L"	$rA   N)r{   r|   r}   r   r/   r   r   r~   rA   r?   r   r      s9    / 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
y	)
TestFclusterc                     t         j                  D ]  }| j                  |d|        t         j                  D ]  }| j                  |d|        t         j                  D ]  }| j                  |d|        y Nr   rf   maxclust)r-   fcluster_inconsistentcheck_fclusterdatafcluster_distancefcluster_maxclustr<   r=   ts      r?   test_fclusterdatazTestFcluster.test_fclusterdata  sw    $:: 	;A##A~r:	;$66 	7A##Az26	7$66 	7A##Az26	7rA   c                     |j                  t        t        d|z         |         }|j                  t        j                        }t	        |||      }t        t        ||             y N	fcluster_	criterionr   )r7   rU   r-   Q_Xr   r   r   )r<   r   r   r=   	expectedTrc   Ts          r?   r   zTestFcluster.check_fclusterdata  sU    JJw':K)<STUVWX	JJ*../i15a+,rA   c                     t         j                  D ]  }| j                  |d|        t         j                  D ]  }| j                  |d|        t         j                  D ]  }| j                  |d|        y r   )r-   r   check_fclusterr   r   r   s      r?   test_fclusterzTestFcluster.test_fcluster  sw    $:: 	7A>26	7$66 	3A:r2	3$66 	3A:r2	3rA   c                     |j                  t        t        d|z         |         }t        |j                  t        j                              }t        |||      }t        t        ||             y r   )r7   rU   r-   r   r   r   r   r   )r<   r   r   r=   r   rV   r   s          r?   r   zTestFcluster.check_fcluster  sZ    JJw':K)<STUVWX	2::15567Q)q1a+,rA   c                     t         j                  D ]  }| j                  ||        t         j                  D ]  }| j	                  ||        y r   )r-   r   check_fcluster_monocritr    check_fcluster_maxclust_monocritr   s      r?   test_fcluster_monocritz#TestFcluster.test_fcluster_monocrit"  sL    $66 	0A((B/	0$66 	9A11!R8	9rA   c                     |j                  t        j                  |         }t        |j                  t        j                              }t        ||dt        |            }t        t        ||             y )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(  sY    JJ2DDQGH	2::15567QZ(1+Fa+,rA   c                     |j                  t        j                  |         }t        |j                  t        j                              }t        ||dt        |            }t        t        ||             y )Nmaxclust_monocritr   )	r7   r-   r   r   r   r   r   r   r   r   s         r?   r   z-TestFcluster.check_fcluster_maxclust_monocrit.  sZ    JJ2DDQGH	2::15567Q%88A;Oa+,rA   c                    |j                  dgdgdgg      }t        |      }t        t        |dd      |j                  g d             t        t        |dd      |j                  g d             t        t        |d	d      |j                  g d
             t        t        |dd      |j                  g d
             y )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#'1I8AjA::i0	28AjA::i0	28AjA::i0	28AjA::i0	2rA   N)r{   r|   r}   r   r   r   r   r   r   r   r   r~   rA   r?   r   r     s*    7-3-9--
2rA   r   c                       e Zd Zd Zy)TestLeadersc                    t         j                  }t        |      }|j                  |      }t	        |      }t        |dd      }|j                  g d      |j                  g d      f}|j                  ||j                        }t        ||      }t        t        j                  |      t        j                  |      d       y )	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    ##!HJJqMAJQ*2**\*BJJy,ABJJqJ)AqMq)2>>&+ANrA   N)r{   r|   r}   r  r~   rA   r?   r   r   A  s    
OrA   r   z+`is_isomorphic` only supports NumPy backendnp_onlyreasonc                   j    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y)TestIsIsomorphicTz,array-likes only supported for NumPy backendr  c                 D    t        g dg d      sJ t        g g       sJ y Nr   )ri   ri   ri   )r   )r<   r=   s     r?   test_array_likez TestIsIsomorphic.test_array_likeU  s$     Y	222R$$$rA   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y r
  r7   r   r<   r=   abs       r?   test_is_isomorphic_1z%TestIsIsomorphic.test_is_isomorphic_1[  >    JJy!JJy!Q"""Q"""rA   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y )N)r,   r   r,   )ri   r   ri   r  r  s       r?   test_is_isomorphic_2z%TestIsIsomorphic.test_is_isomorphic_2b  r  rA   c                 d    |j                  g       }|j                  g       }t        ||      sJ y r   r  r  s       r?   test_is_isomorphic_3z%TestIsIsomorphic.test_is_isomorphic_3i  s,    JJrNJJrNQ"""rA   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y )Nr   )r,   r   ri   r  r  s       r?   test_is_isomorphic_4Az&TestIsIsomorphic.test_is_isomorphic_4Ao  @     JJy!JJy!Q"""Q"""rA   c                     |j                  g d      }|j                  g d      }t        ||      du sJ t        ||      du sJ y )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                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y )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 ]  }| j                  d||        y )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 ]  }| j                  d|dd|        y )Nr  r   Tr6   r!  r"  r$  s      r?   test_is_isomorphic_6z%TestIsIsomorphic.test_is_isomorphic_6  s.      	GB,,T2tQ2,F	GrA   c                 l    |j                  g d      }|j                  g d      }t        ||      rJ y )Nr   r   r  r  s       r?   test_is_isomorphic_7z%TestIsIsomorphic.test_is_isomorphic_7  s1    JJy!JJy! A&&&&rA   c                z   t        d      D ],  }t        j                  j                  |      |z  j	                  t
              }t        j                  |j                  t
              }t        j                  j                  |      }	t        d|j                  d         D ]  }
|	||
      ||
<    |r?t        j                  j                  |      }||d| xx   dz  cc<   ||d| xx   |z  cc<   |j                  |      }|j                  |      }t        ||      | k(  sJ t        ||      | k(  r-J  y )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  s   q 	7A%	199#>As+A		%%i0A1aggaj) 1w!II))$/!Ag,1$!Ag,9,

1A

1A A&v:666 A&v:666	7rA   N)Fr   )r{   r|   r}   r/   r  r  r  r  r  r  r  r&  r(  r*  r#  r~   rA   r?   r  r  Q  sU     dKM%M%####,#>G'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y)TestIsValidLinkagec                 B    dD ]  \  }}}| j                  ||||        y 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  s0    "> 	LD$44T4K	LrA   c                     |j                  g dg dg|j                        }|d |d |f   }t        t        |      |k(         |st	        t
        t        |d       y y 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  sf    JJ))+24**  >eteUdUlO #u,-*&6F rA   c                     |j                  g dg dg|j                        }t        t        |      du        t	        t
        t        |d       y 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  sH    JJ&(/1xx  9 #u,-i!11DArA   c                     |j                  d|j                        }t        t        |      du        t	        t
        t        |d       y 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  s:    HHV2::H. #u,-j"2ATBrA   c                     t        ddd      D ]\  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        t        |      du        ^ y 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  sb     q"a 	1A		q!A#wz*A

1A
A$Q'4/0		1rA   	jax.numpy)jax arrays do not support item assignmentr  c                    t        ddd      D ]}  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	
        y )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A		q!A#wz*A

1A
AAad1fI$Q'501*&6F	GrA   c                    t        ddd      D ]}  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	        y 
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                    t        ddd      D ]}  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	        y 
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A		q!A#wz*A

1A
AAad1fI$Q'501*&6F	GrA   c                    t        ddd      D ]}  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	        y 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;    s    L
GBC1 kHJ	GJ	G kHJ	GJ	G kHJ	GJ	G kHJ	GJ	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y)TestIsValidInconsistentc                     |j                  g dg dg|j                        }t        t        |      du        t	        t
        t        |d       y rI  )r7   rL  r   r   r9   rM  r<   r=   Rs      r?   test_is_valid_im_int_typez1TestIsValidInconsistent.test_is_valid_im_int_type  sE    JJ&(/1xx  9A%'(iat<rA   c                 B    dD ]  \  }}}| j                  ||||        y r=  )check_is_valid_im_various_sizer?  s        r?   test_is_valid_im_various_sizez5TestIsValidInconsistent.test_is_valid_im_various_size  s0    "> 	GD$//dE2F	GrA   c                     |j                  g dg dg|j                        }|d |d |f   }t        t        |      |k(         |st	        t
        t        |d       y y rE  )r7   r   r   r   r9   r:   )r<   r@  rA  rB  r=   rm  s         r?   rp  z6TestIsValidInconsistent.check_is_valid_im_various_size  sc    JJ))+24**  >eteUdUlOA%'(*k1DA rA   c                     |j                  d|j                        }t        t        |      du        t	        t
        t        |d       y rQ  )rD   r   r   r   r9   r:   rl  s      r?   test_is_valid_im_emptyz.TestIsValidInconsistent.test_is_valid_im_empty   s7    HHV2::H.A%'(j+q=rA   c                     t        ddd      D ]g  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        |      }t        t        |      du        i y 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&  si     q"a 	,A		q!A#wz*A

1A
AQAKNd*+	,rA   rY  rZ  r[  c                 4   t        ddd      D ]  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	
        y )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A		q!A#wz*A

1A
AQAAad1fIKNe+,*k1DA	BrA   c                 4   t        ddd      D ]  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	        y )
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                 4   t        ddd      D ]  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        |      }d||dz  df<   t        t        |      du        t        t        t        |d	        y 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    sz    =G
B>, k*UV
B W
B k*UV
B W
B k*UV
B W
BrA   rj  c                   T    e Zd Z ed      d        Zd Zd Z ed      d        Zy)TestNumObsLinkageTr2   c                 h    |j                  d|j                        }t        t        t        |       y NrR  r   )rD   r   r9   r:   r   rN  s      r?   test_num_obs_linkage_emptyz,TestNumObsLinkage.test_num_obs_linkage_emptyZ  s&     HHV2::H.j/15rA   c                 n    |j                  g dg|j                        }t        t        |      d       y )NrJ  r   ri   r7   r   r   r   rN  s      r?   test_num_obs_linkage_1x4z*TestNumObsLinkage.test_num_obs_linkage_1x4`  s*    JJ'rzzJ:_Q'+rA   c                 t    |j                  g dg dg|j                        }t        t        |      d       y )NrJ  rK  r   r   r  rN  s      r?   test_num_obs_linkage_2x4z*TestNumObsLinkage.test_num_obs_linkage_2x4e  s5    JJ&(/1zz  ;_Q'+rA   c                     t        ddd      D ][  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        t        |      |       ] y )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 	0A		q!A#wz*A

1A
A+Q/		0rA   N)r{   r|   r}   r/   r  r  r  r  r~   rA   r?   r  r  X  s<    t$6 %6
,
, t$0 %0rA   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestLeavesListc                     |j                  g dg|j                        }t        |       t        t	        |      ddgd       y )NrJ  r   r   r,   rj   r   r7   r   r   r   r   rN  s      r?   test_leaves_list_1x4z#TestLeavesList.test_leaves_list_1x4y  s6    JJ'rzzJ:
AAU;rA   c                     |j                  g dg dg|j                        }t        |       t        t	        |      g dd       y )NrJ  rK  r   )r   r,   ri   rj   r   r  rN  s      r?   test_leaves_list_2x4z#TestLeavesList.test_leaves_list_2x4  s=    JJ&(/1zz  ;
A	>rA   c                 6    dD ]  }| j                  ||        y r   )check_leaves_list_QrK   s      r?   test_leaves_list_Qz!TestLeavesList.test_leaves_list_Q  s#    ) 	1F$$VR0	1rA   c                     |j                  t        j                        }t        ||      }t	        |      }t        |j                         t        |      d       y )Nrj   r   )r7   r-   r   r
   r   r   	pre_orderr   )r<   rL   r=   rc   rV   nodes         r?   r  z"TestLeavesList.check_leaves_list_Q  sC    JJ*../Avqz(+a.uErA   c                    |j                  t        j                        }t        |d      }t	        |      }t        |j                         |j                         j                         |j                         j                         z   d       y )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  sj    JJ*../Ax qz(4==?+D+D+F-1^^-=-G-G-I,J"	$rA   N)r{   r|   r}   r  r  r  r  r  r~   rA   r?   r  r  v  s    <?1
F$rA   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestCorrespondc                     |j                  d|j                        }|j                  d|j                        }t        t        t        ||       y )NrC   r   rR  )rD   r   r9   r:   r   r   s       r?   test_correspond_emptyz$TestCorrespond.test_correspond_empty  s<    HHTH,HHU"**H-j*a3rA   c                    t        dd      D ][  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        t        ||             ] t        ddd      D ][  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        t        ||             ] y )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                 J   t        t        t        t        dd            t        t        dd                        t        t        t        t        dd            t        t        dd                        z   D ]  \  }}t        j                  j                  ||dz
  z  dz        }t        j                  j                  ||dz
  z  dz        }|j                  |      }|j                  |      }t        |      }t        |      }t        ||      rJ t        ||      sJ  y )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[ 14a3DEFCU1a[ 14a3DEFG 		)FQ		q!A#wz*A1Q3
+B

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

1ABB
AB!!R(((!"a(((		)rA   c                     t        dd      D ]^  }t        j                  j                  |d      }t	        |      }|j                  |      }t        |      }t        t        |      |       ` y )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  sY    q" 	0A		q!$AaA

1A
A+Q/	0rA   N)r{   r|   r}   r  r  r  r  r  r~   rA   r?   r  r    s    4&))0rA   r  c                   h    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y)TestIsMonotonicc                 h    |j                  d|j                        }t        t        t        |       y r  )rD   r   r9   r:   r   rN  s      r?   test_is_monotonic_emptyz'TestIsMonotonic.test_is_monotonic_empty  s$    HHV2::H.j,2rA   c                 ^    |j                  g dg|j                        }t        |      sJ y )Nr   r,   333333?ri   r   r7   r   r   rN  s      r?   test_is_monotonic_1x4z%TestIsMonotonic.test_is_monotonic_1x4  s'    JJ'rzzJ:ArA   c                 d    |j                  g dg dg|j                        }t        |      sJ y )Nr  )ri   r   皙?r   r   r  rN  s      r?   test_is_monotonic_2x4_Tz'TestIsMonotonic.test_is_monotonic_2x4_T  s2    JJ&(/1zz  ;ArA   c                 d    |j                  g dg dg|j                        }t        |      rJ y )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  s5    JJ&(/1zz  ;?""?rA   c                 j    |j                  g dg dg dg|j                        }t        |      sJ y )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  s7    JJ&&(/1zz  ; ArA   c                 j    |j                  g dg dg dg|j                        }t        |      rJ y )Nr  )ri   r   皙?ri   r  r   r  rN  s      r?   test_is_monotonic_3x4_F1z(TestIsMonotonic.test_is_monotonic_3x4_F1  :    JJ&&(/1zz  ;  ?""?rA   c                 j    |j                  g dg dg dg|j                        }t        |      rJ y )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                 j    |j                  g dg dg dg|j                        }t        |      rJ y )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                 p    t        |j                  t        j                        d      }t	        |      sJ y Nr   r
   r7   r-   rT   r   rN  s      r?    test_is_monotonic_tdist_linkage1z0TestIsMonotonic.test_is_monotonic_tdist_linkage1  s,     BJJ299:HEArA   rY  rZ  r[  c                 z    t        |j                  t        j                        d      }d|d<   t	        |      rJ y )Nr   r5   )ri   ri   r  rN  s      r?    test_is_monotonic_tdist_linkage2z0TestIsMonotonic.test_is_monotonic_tdist_linkage2  s8     BJJ299:HE#?""?rA   c                 t    |j                  t        j                        }t        |d      }t	        |      sJ y r  )r7   r-   r   r
   r   )r<   r=   rc   rV   s       r?   test_is_monotonic_Q_linkagez+TestIsMonotonic.test_is_monotonic_Q_linkage  s1     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    sQ    3

#### k*UV# W#rA   r  c                   X    e Zd Zd Z edd      d        Z edd      d        Zd Zy)	TestMaxDistsc                 h    |j                  d|j                        }t        t        t        |       y r  )rD   r   r9   r:   r   rN  s      r?   test_maxdists_empty_linkagez(TestMaxDists.test_maxdists_empty_linkage'  s$    HHV2::H.j(A.rA   rY  rZ  r[  c                     |j                  g dg|j                        }t        |      }t        ||      }t	        ||d       y )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,  s>     JJ'rzzJ:a[0B7
JU3rA   c                 6    dD ]  }| j                  ||        y Nr   rG   r[   rY   rZ   )check_maxdists_Q_linkagerK   s      r?   test_maxdists_Q_linkagez$TestMaxDists.test_maxdists_Q_linkage4  s!    J 	6F))&"5	6rA   c                     |j                  t        j                        }t        ||      }t	        |      }t        ||      }t        ||d       y )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  sD    JJ*../Ava[0B7
JU3rA   N)r{   r|   r}   r  r/   r  r  r  r~   rA   r?   r  r  $  sF    /
 k*UV4 W4 k*UV6 W64rA   r  c                   z    e Zd Z ed      d        Zd Z eddd      d        Z eddd      d	        Zd
 Zy)TestMaxInconstsTr2   c                     |j                  d|j                        }|j                  d|j                        }t        t        t        ||       y r  )rD   r   r9   r:   r   r<   r=   rV   rm  s       r?   test_maxinconsts_empty_linkagez.TestMaxInconsts.test_maxinconsts_empty_linkageD  s>     HHV2::H.HHV2::H.j+q!4rA   c                     |j                  g dg|j                        }t        j                  j	                  dd      }|j                  |      }t        t        t        ||       y Nr  r   ri   r   )r7   r   rl   rm   ro   r9   r:   r   r  s       r?   test_maxinconsts_difrow_linkagez/TestMaxInconsts.test_maxinconsts_difrow_linkageK  sL     JJ'rzzJ:IINN1a JJqMj+q!4rA   rY  rZ  r  r3   c                     |j                  g dg|j                        }|j                  g dg|j                        }t        ||      }t        |||      }t	        ||d       y )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'rzzJ:JJ'rzzJ:A6q!C
JU3rA   c                 6    dD ]  }| j                  ||        y r  )check_maxinconsts_Q_linkagerK   s      r?   test_maxinconsts_Q_linkagez*TestMaxInconsts.test_maxinconsts_Q_linkage]  s$     K 	9F,,VR8	9rA   c                     |j                  t        j                        }t        ||      }t	        |      }t        ||      }t        |||      }t        ||d       y )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  sR    JJ*../AvOA6q!C
JU3rA   N)	r{   r|   r}   r/   r  r  r  r  r  r~   rA   r?   r  r  B  se    t$5 %55 k*U#%4%4 k*U#%9%9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y)TestMaxRStatc                 6    dD ]  }| j                  ||        y )N)gffffff
@r   r   )check_maxRstat_invalid_indexr<   r=   r8  s      r?   test_maxRstat_invalid_indexz(TestMaxRStat.test_maxRstat_invalid_indexo  s!     	5A--a4	5rA   c                    |j                  g dg|j                        }|j                  g dg|j                        }t        |t              rt	        t
        t        |||       y t	        t        t        |||       y )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'rzzJ:JJ'rzzJ:a*h1a8)Xq!Q7rA   Tr2   c                 H    t        d      D ]  }| j                  ||        y Nr   )r,  check_maxRstat_empty_linkager  s      r?   test_maxRstat_empty_linkagez(TestMaxRStat.test_maxRstat_empty_linkage|  s%    q 	5A--a4	5rA   c                     |j                  d|j                        }|j                  d|j                        }t        t        t        |||       y r  )rD   r   r9   r:   r   r  s        r?   r  z)TestMaxRStat.check_maxRstat_empty_linkage  s>    HHV2::H.HHV2::H.j(Aq!4rA   c                 H    t        d      D ]  }| j                  ||        y r   )r,  check_maxRstat_difrow_linkager  s      r?   test_maxRstat_difrow_linkagez)TestMaxRStat.test_maxRstat_difrow_linkage  s%    q 	6A..q"5	6rA   c                     |j                  g dg|j                        }t        j                  j	                  dd      }|j                  |      }t        t        t        |||       y r  )r7   r   rl   rm   ro   r9   r:   r   r  s        r?   r  z*TestMaxRStat.check_maxRstat_difrow_linkage  sN     JJ'rzzJ:IINN1a JJqMj(Aq!4rA   rY  rZ  r  c                 H    t        d      D ]  }| j                  ||        y 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                     |j                  g dg|j                        }|j                  g dg|j                        }t        ||d      }t        ||d|      }t	        ||d       y )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'rzzJ:JJ'rzzJ:aA6q!QC
JU3rA   c                 X    dD ]%  }t        d      D ]  }| j                  |||        ' y )Nr  r   )r,  check_maxRstat_Q_linkage)r<   r=   rL   r8  s       r?   test_maxRstat_Q_linkagez$TestMaxRStat.test_maxRstat_Q_linkage  s9     K 	=F1X =--fa<=	=rA   c                     |j                  t        j                        }t        ||      }t	        |      }t        ||d      }t        ||d|      }t        ||d       y )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  sV    JJ*../AvOaA6q!QC
JU3rA   N)r{   r|   r}   r  r  r/   r  r  r  r  r
  r	  r  r  r~   rA   r?   r  r  m  s    58 t$5 %5565 k*U#%;%;4 k*U#%=%=
4rA   r  c                   f   e Zd Zd Zd Zd Zej                  j                  e	 d      d        Z
 edd      ej                  j                  e	 d      d	               Zd
 Z edd      ej                  j                  e	 d      d               Zej                  d        Zd Zd Zd Zy)TestDendrogramc                     t        |j                  t        j                        d      }t	        |d      }|d   }t        |g d       y )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  s>    BJJ299:HEq$'8V/0rA   c                     t        |j                  t        j                        d      }t	        t
        t        |d       y )Nr   fooorientation)r
   r7   r-   rT   r9   r:   r   rN  s      r?   test_valid_orientationz%TestDendrogram.test_valid_orientation  s,    BJJ299:HEj*aUCrA   c                     t        |j                  t        j                        d      }g d}t	        ||j                  |      d      }t	        ||d      }||k(  sJ y )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  sV    BJJ299:HE#Qrzz&'94HQvt<'!!!rA   zno matplotlibr[  c           	         |j                  g dg dg dg      }t        j                          t        j                  t
              5 }t        |t        t        d                   d d d        dt        j                        v sJ t        j                  t
        d      5  t        |g        d d d        t        j                          y # 1 sw Y   hxY w# 1 sw Y   *xY w)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
 
 	

]]:& 	6(tDs$45	6?hnn%& 	& & ]]FH 	( tB'	(
 				6 	6
	( 	(s    C$CCC$torchzFMPL 3.9.2 & torch DeprecationWarning from __array_wrap__ and NumPy 2.0c                 6    dD ]  }| j                  ||        y )N)topbottomleftright)check_dendrogram_plot)r<   r=   r  s      r?   test_dendrogram_plotz#TestDendrogram.test_dendrogram_plot  s#     > 	8K&&{B7	8rA   c                 H   t        |j                  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
                         }|j                  d      }t        |||      }t        j                  |d         |d<   t        ||       t        |||dd       |dv r|j                         d   n|j                         d   }t        |j                         d       t        |j                         d       t        |||d       |dv r|j                         d   n|j                         d   }t        |j                         d       t        |||d       |dv r|j                         d   n|j                         d   }t        |j                         d       t	        j                          t        ||      }	t	        j                          t        j                  |	d         |	d<   t        |	|       y )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9:HE"@7799;	=
  67779	;
 :0)M  jjl__S! bk:zz"X,/8R" 	1"$B	8 //  ###%a( 	
 	Y++-r2Y'')2.1!#	% //  ###%a( 	
 	Y++-r21"$	& //  ###%a( 	
 	Y'')2.		 {3		zz"X,/8R"rA   c           
         t        |j                  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       y )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9:HEq!Wd;		jj8-(Qv$<#=$:#;!&$%q6/3Tl 	 q!Wd;		jj8-(Q'?$<$<$>$@$B %;$<$<$<$> !<#2.L 	rA   c                     t               S r   r*   )r<   s    r?   dendrogram_lockzTestDendrogram.dendrogram_lockG  s	    vrA   c                    t        |j                  t        j                        d      }|5  t	        g d       t        |ddd      }t	        g d       |d   }t        |g d	       t	        d        d d d        y # 1 sw Y   y xY w)
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  sz    BJJ299:HE 	)"#781d.13HA"#AB<J%>? #4(	) 	) 	)s   AA==Bc           	          |j                  g dg dg dg dg dg dg      }t        |d      }t        |d      }g d}|d	   }t        ||       y )
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
&'VZ(rA   c           	          |j                  g dg dg dg dg dg dg      }t        |d      }t        |d      }g d	}|d
   }t        ||       y )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
&'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D" [[O+OD E& g! [[O+OD8 E	
8<#| g" [[O+OD E	
> ^^ )"))rA   r  c                    | j                   d   dz   }|j                  |dz
  f| j                        }|j                  d      }t        d|dz
        D ]  }d|d d  | |df   }| |df   }||k\  r&||j	                  ||j
                        |z
     |d<   ||k\  r&||j	                  ||j
                        |z
     |d<   | |df   |d<   |j                  |      ||<    |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#qww'A
A1a!e_ 	!Aw!Q$19RZZBHHZ59:AaDA:RZZRXXZ6:;AaDAw!vvay!	 HrA   r   c                    | j                   d   dz   }|j                  | |      }|j                  |dz
  f|      }|j                  d      }t        d|dz
        D ]  }d|d d  | |df   }	| |df   }
|	|k\  r&||j	                  |	|j
                        |z
     |d<   |
|k\  r&||j	                  |
|j
                        |z
     |d<   |||f   |d<   |j                  |      ||<    |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$19RZZBHHZ59:AaDA:RZZRXXZ6:;AaDAw!vvay!	 HrA   c           	      X    t        t        t        | j                  ddgddgg             y )Nr   r,   )r   r	   r
   r7   r!  s    r?   <test_unsupported_uncondensed_distance_matrix_linkage_warningr    s&     "**q!fq!f5E*FGrA   c           
          t         j                  j                  j                  D ]/  }t	        t
        t        | j                  ddgddgg      |d       1 y )Nr,   	cityblockrL   rb   )rd   cluster	hierarchy_EUCLIDEAN_METHODSr9   r:   r
   r7   )r=   rL   s     r?   "test_euclidean_linkage_value_errorr    sJ    --))<< 9j'2::1v1v6F+G#K	99rA   c                     t        | j                  dg      dd      }t        | j                  ddgddgg      dd      }t        ||d       y )Nr,   r   ra   r  r   rj   r   )r
   r7   r(   )r=   Z1r  s      r?   test_2x2_linkager    sJ    	QC+	FB	aVaV,-h{	SBB'rA   c                 D   t         j                  j                  d       d}t         j                  j                  |d      }| j	                  |      }t
        j                  j                  j                  |      }t        |      }t        ||j                         kD         t        |j                         |j                         kD         t        |j                         |j                         k(         t        |j                         |j                         k7         y )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    IINN2D
		a A


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


1A$$Q'Aa[F F1a4L"))D/5QF1b5M288D>5QF#''*BIIdQhB,GHF1rd7OXaA%>UKF1r3i<((1!R*IPUVF1sBi<((1"a*IPUV"Ejj6$))67GF1boogs;;<Qq)7F1boog2w??@Q2w/e=F1boogAw??@QAw/e= 7s   Ic                    t        t        | j                  t        j                              | j                  t        j                              }t        j
                  }t        || j                  |      d       t        t        | j                  t        j                        d      | j                  t        j                              }t        j                  }t        || j                  |      d       y )NrP   rQ   r[   r`   )	r!   r
   r7   r-   rT   ry   r(   rc   linkage_X_ward_olo)r=   rV   rW   s      r?   rz   rz     s     	gbjj1D1K1K&LM jj)<)C)CD	FA#==IArzz),59 	gbjj1D1F1F&GP jj)<)>)>?	AA#66IArzz),59rA   z"`Heap` only supports NumPy backendc                    | j                  g d      }t        |      }|j                         }t        |d   d       t        |d   d       |j	                          |j                         }t        |d   d       t        |d   d       |j                  dd       |j                         }t        |d   d	       t        |d   d
       |j	                          |j	                          |j                  dd       |j                         }t        |d   d       t        |d   d       |j	                          |j                         }t        |d   d       t        |d   d       y )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                     | j                  g d      }t        j                  t              5  t	        |d       d d d        y # 1 sw Y   y xY w)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)^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 ) ) / B  !
JNN5#O
 #FKK$;$;<N$OP
;;// :> :>z 4 > > !>> 4 	T 	T !	T 4 %& %& !%&P$ $D 4 <2 <2 !<2~ 4 O O !O $FHV7 V7HV7r 4 XG XG !XGv 4 LB LB !LB^0 0< 4 "$ "$ !"$J 4 90 90 !90x 4 G G !GT 4 4 4 !4:(4 (4VB4 B4J 4 E) E) !E)P$ /0B & 4 H ! H9 4 ( !( 4 
1 !
1 $'NO= P=8 4 : !: $'KL$ M$@ 4 + !+W&  Os   J7 7KK