
    S_fV                     0   d dl Zd dlmZmZmZmZ d dlZd dlmZ	 d dl
Zd dl
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d	d
l1m2Z2 	 d dl3Z3 e3jh                  d       d dl5m6Z7 dZ8e-ejt                  jw                  d      gZ<ejt                  jz                  Z= G d d      Z> e=d       G d d             Z? e=d       G d d             Z@ e=d       G d d             ZA G d d      ZB e=d       G d d             ZC e=d       G d d             ZD e=ddg       G d  d!             ZE e=d       G d" d#             ZF e=d       G d$ d%             ZG G d& d'      ZH e=d       G d( d)             ZI e=d       G d* d+             ZJ e=d       G d, d-             ZK e=d       G d. d/             ZL G d0 d1      ZM G d2 d3      ZN e=d       G d4 d5             ZOd6 ZPd7efd8ZQ e=d      d9        ZRd: ZS e=d      d;        ZT e=d      d<        ZU e=dd=g      d>        ZV e=d      d?        ZW e=dd@g      dA        ZXy# e9$ r dZ8Y w xY w)B    N)assert_allcloseassert_equalassert_assert_warns)raises)ClusterWarninglinkagefrom_mlab_linkageto_mlab_linkagenum_obs_linkageinconsistentcophenetfclusterdatafclusteris_isomorphicsingleleaders
correspondis_monotonicmaxdistsmaxinconstsmaxRstatis_valid_linkageis_valid_imto_treeleaves_list
dendrogramset_link_color_palettecut_treeoptimal_leaf_ordering_order_cluster_tree
_hierarchy_LINKAGE_METHODS)pdist)Heap)array_api_compatible)xp_assert_closexp_assert_equal   )hierarchy_test_dataAggTFskip_if_array_apic                       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                 n    |j                  d      }|j                  |d<   t        t        t        |       y )N)   r   )zerosnanassert_raises
ValueErrorr	   selfxpys      Blib/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_matrixK   s*     HHTNvv!j'1-    c                 P    |j                  d      }t        t        t        |       y )Nr   )r3   r5   r6   r	   r7   s      r;   "test_linkage_empty_distance_matrixz.TestLinkage.test_linkage_empty_distance_matrixS   s     HHTNj'1-r=   c                 6    dD ]  }| j                  ||        y )N)r   completeaverageweighted)check_linkage_tdistr8   r9   methods      r;   test_linkage_tdistzTestLinkage.test_linkage_tdistY   s!    C 	1F$$VR0	1r=   c                     t        |j                  t        j                        |      }t	        t        d|z         }t        ||j                  |      d       y )Nlinkage_ytdist_绽|=atolr	   asarrayr*   ytdistgetattrr'   )r8   rG   r9   Z	expectedZs        r;   rE   zTestLinkage.check_linkage_tdist^   sF    BJJ299:FC/1BV1KL	2::i0u=r=   c                 6    dD ]  }| j                  ||        y )N)centroidmedianward)check_linkage_qrF   s      r;   test_linkage_XzTestLinkage.test_linkage_Xd   s!    4 	-F  ,	-r=   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_ư>rL   	euclidean)metric)
r	   rO   r*   XrQ   r'   scipyspatialdistancer$   )r8   rG   r9   rR   rS   r:   s         r;   rX   zTestLinkage.check_linkage_qi   s    BJJ2445v>/1FG	2::i0u=MM""(()<)>)>0; ) =BJJqM6*2::i0u=r=   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瞯<)rtolrM   )nprandomRandomStaterandr$   r#   itemsr"   r	   rO   r'   )
r8   r9   rngnr_   drG   code	Z_trivialrR   s
             r;   test_compare_with_trivialz%TestLinkage.test_compare_with_trivialt   s    ii##A&HHQN!H,224 	NLFD"**1a6I

1v.AArzz)45uM	Nr=   c                     t        |j                  t        j                        d      }t	        t        d      }t        ||j                  |      d       y )NT)optimal_orderinglinkage_ytdist_single_olorK   rL   rN   )r8   r9   rR   rS   s       r;   test_optimal_leaf_orderingz&TestLinkage.test_optimal_leaf_ordering   sA    BJJ299:TR/1LM	2::i0u=r=   N)__name__
__module____qualname__r,   r<   r@   rH   rE   rY   rX   rr   rv    r=   r;   r.   r.   I   s    %. &. %. &.
 %1 &1> %- &-	> %	N &	N %> &>r=   r.   r/   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?re   )re      r}   r~   )re   r~   g'e@r~   )re   r~   gev @r~   )re   r~   g@r~   r   rB   rC   rD   rU   rV   rW   c                 6    dD ]  }| j                  ||        y Nr   )check_linkage_tiesrF   s      r;   test_linkage_tiesz!TestLinkageTies.test_linkage_ties   s#    5 	0F##FB/	0r=   c                     |j                  ddgddgddgg      }t        ||      }| j                  |   }t        ||j                  |      d       y )Nr   r)   )rG   r\   rL   )rO   r	   _expectationsr'   )r8   rG   r9   r_   rR   rS   s         r;   r   z"TestLinkageTies.check_linkage_ties   sT    JJR1a&1a&12Af%&&v.	2::i0u=r=   N)rw   rx   ry   rh   arrayr   r   r   rz   r=   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
>r=   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)r8   r9   depths      r;   test_inconsistent_tdistz(TestInconsistent.test_inconsistent_tdist   s'    (<< 	5E))%4	5r=   c                     |j                  t        j                        }t        t	        ||      |j                  t        j
                  |                y r   )rO   r*   linkage_ytdist_singler'   r   r   )r8   r   r9   rR   s       r;   r   z)TestInconsistent.check_inconsistent_tdist   sA    JJ*@@AQ.

#6#J#J5#QR	Tr=   N)rw   rx   ry   r   r   rz   r=   r;   r   r      s    5Tr=   r   c                       e 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   dtyperK   rL   )rO   r*   r   r   r'   float64)r8   r9   	expectedMrR   Ms        r;   test_linkage_cophenet_tdist_Zz4TestCopheneticDistance.test_linkage_cophenet_tdist_Z   sP    JJ  9 :	JJ*@@AQK2::irzz:BOr=   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?rz   rK   rL   )rO   r*   r   r   rP   r   r'   )r8   r9   rR   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1r=   N)rw   rx   ry   r   r   rz   r=   r;   r   r      s    P2r=   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   )rO   r   r(   r
   r   )r8   r9   r_   s      r;   "test_mlab_linkage_conversion_emptyz<TestMLabLinkageConversion.test_mlab_linkage_conversion_empty   s7    JJrJ,)!,a0*A.r=   Tr/   c                    |j                  g dg      }|j                  g dg      }t        t        |      |j                  ||j                        d       t        t	        |      |j                  ||j                        d       y )N)              ?      @       @r)   re   r~   r   rf   rg   )rO   r'   r
   r   r   )r8   r9   rR   Zms       r;   'test_mlab_linkage_conversion_single_rowzATestMLabLinkageConversion.test_mlab_linkage_conversion_single_row   sq     JJ()*ZZ$)"-rzz!2::z/N"	$*BJJrJ,L"	$r=   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~   r2   r   )      r   )r)      r   )re   	   r   )   
   r   )r         @     @a@r   )r         @     `k@r   )r   g      @     o@r   )r   g       @     p@r   )      @g      "@     pr@r   r   rf   r   )rO   r   r'   r
   r   )r8   r9   r   rR   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"	$r=   N)rw   rx   ry   r   r,   r   r   rz   r=   r;   r   r      s9    / %$ &$ %$ &$r=   r   c                   6    e 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   rb   maxclust)r*   fcluster_inconsistentcheck_fclusterdatafcluster_distancefcluster_maxclustr8   r9   ts      r;   test_fclusterdatazTestFcluster.test_fclusterdata   sw    $:: 	;A##A~r:	;$66 	7A##Az26	7$66 	7A##Az26	7r=   c                     |j                  t        t        d|z         |         }|j                  t        j                        }t	        |||      }t        t        ||             y N	fcluster_	criterionr   )rO   rQ   r*   Q_Xr   r   r   )r8   r   r   r9   	expectedTr_   Ts          r;   r   zTestFcluster.check_fclusterdata   sU    JJw':K)<STUVWX	JJ*../i15a+,r=   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	3r=   c                     |j                  t        t        d|z         |         }t        |j                  t        j                              }t        |||      }t        t        ||             y r   )rO   rQ   r*   r   r   r   r   r   )r8   r   r   r9   r   rR   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+,r=   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	9r=   c                     |j                  t        j                  |         }t        |j                  t        j                              }t        ||dt        |            }t        t        ||             y )Nmonocritr   r   )	rO   r*   r   r   r   r   r   r   r   r8   r   r9   r   rR   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+,r=   c                     |j                  t        j                  |         }t        |j                  t        j                              }t        ||dt        |            }t        t        ||             y )Nmaxclust_monocritr   )	rO   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+,r=   N)
rw   rx   ry   r   r   r   r   r   r   r   rz   r=   r;   r   r      s%    7-3-9--r=   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   )re   r~   r)   r   rf   r   )r*   r   r$   rO   r	   r   int32r   r   rh   concatenate)r8   r9   r_   YrR   r   LrightLs           r;   test_leaders_singlezTestLeaders.test_leaders_single#  s    ##!HJJqMAJQ*2**\*BJJy,ABJJqJ)AqMq)2>>&+ANr=   N)rw   rx   ry   r   rz   r=   r;   r   r      s    
Or=   r   z+`is_isomorphic` only supports NumPy backendnp_onlyreasonsc                   l    e Zd Z eddg      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 Nr)   r)   r)   )re   re   re   )r   )r8   r9   s     r;   test_array_likez TestIsIsomorphic.test_array_like4  s$     Y	222R$$$r=   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y r   rO   r   r8   r9   abs       r;   test_is_isomorphic_1z%TestIsIsomorphic.test_is_isomorphic_1:  >    JJy!JJy!Q"""Q"""r=   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y )N)r)   r   r)   )re   r~   re   r   r   s       r;   test_is_isomorphic_2z%TestIsIsomorphic.test_is_isomorphic_2A  r   r=   c                 d    |j                  g       }|j                  g       }t        ||      sJ y r   r   r   s       r;   test_is_isomorphic_3z%TestIsIsomorphic.test_is_isomorphic_3H  s,    JJrNJJrNQ"""r=   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y )Nr   )r)   r~   re   r   r   s       r;   test_is_isomorphic_4Az&TestIsIsomorphic.test_is_isomorphic_4AN  @     JJy!JJy!Q"""Q"""r=   c                     |j                  g d      }|j                  g d      }t        ||      du sJ t        ||      du sJ y )N)r)   re   r~   r~   )r)   r~   re   r~   Fr   r   s       r;   test_is_isomorphic_4Bz&TestIsIsomorphic.test_is_isomorphic_4BV  sJ     JJ|$JJ|$Q"e+++Q"e+++r=   c                     |j                  g d      }|j                  g d      }t        ||      sJ t        ||      sJ y )N)r   re   r~   )r2   r~   re   r   r   s       r;   test_is_isomorphic_4Cz&TestIsIsomorphic.test_is_isomorphic_4C^  r  r=   c                 :    dD ]  }| j                  d||        y )Nre   r~   r     r9   help_is_isomorphic_randpermr8   r9   ncs      r;   test_is_isomorphic_5z%TestIsIsomorphic.test_is_isomorphic_5f  s(      	>B,,T2",=	>r=   c                 >    dD ]  }| j                  d|dd|        y )Nr  r  Tr   r  r  r  s      r;   test_is_isomorphic_6z%TestIsIsomorphic.test_is_isomorphic_6l  s.      	GB,,T2tQ2,F	Gr=   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_7s  s1    JJy!JJy! A&&&&r=   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)   )rangerh   ri   rk   astypeintr3   sizepermutationshaperO   r   )r8   nobs	nclustersnonisonerrorsr9   kr   r   PiQs               r;   r  z,TestIsIsomorphic.help_is_isomorphic_randpermy  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	7r=   N)Fr   )rw   rx   ry   r,   r   r   r  r  r  r  r
  r  r  r  r  rz   r=   r;   r   r   0  sX     t NOQ%Q%####,#>G'7r=   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestIsValidLinkagec                 B    dD ]  \  }}}| j                  ||||        y N))re   r   F)re   r~   F)r)   r   T)re   r   T)#check_is_valid_linkage_various_sizer8   r9   nrowncolvalids        r;   "test_is_valid_linkage_various_sizez5TestIsValidLinkage.test_is_valid_linkage_various_size  s0    "> 	LD$44T4K	Lr=   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   re   r   )r~   re   r   r~   r~   r   Tthrow)rO   r   r   r   r5   r6   )r8   r-  r.  r/  r9   rR   s         r;   r+  z6TestIsValidLinkage.check_is_valid_linkage_various_size  sf    JJ))+24**  >eteUdUlO #u,-*&6F r=   c                     |j                  g dg dg|j                        }t        t        |      du        t	        t
        t        |d       y Nr   r)   r   re   r~   re   r   r~   r   FTr3  )rO   int64r   r   r5   	TypeErrorr8   r9   rR   s      r;   test_is_valid_linkage_int_typez1TestIsValidLinkage.test_is_valid_linkage_int_type  sH    JJ&(/1xx  9 #u,-i!11DAr=   c                     |j                  d|j                        }t        t        |      du        t	        t
        t        |d       y Nr   r   r   FTr3  )r3   r   r   r   r5   r6   r;  s      r;   test_is_valid_linkage_emptyz.TestIsValidLinkage.test_is_valid_linkage_empty  s:    HHV2::H. #u,-j"2ATBr=   c                     t        ddd      D ]\  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        t        |      du        ^ y Nr      r~   r)   re   T)r  rh   ri   rk   rO   r	   r   r   r8   r9   r%  r:   rR   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		1r=   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   rC  r~   r)   re   r   FTr3  
r  rh   ri   rk   rO   r	   r   r   r5   r6   rD  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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   rC  r~   r)   re   rG  FTr3  rH  rD  s        r;   .test_is_valid_linkage_4_and_up_neg_index_rightzATestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_index_right  rJ  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   rC  r~   r)   re   g      FTr3  rH  rD  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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 rL  rH  rD  s        r;   )test_is_valid_linkage_4_and_up_neg_countsz<TestIsValidLinkage.test_is_valid_linkage_4_and_up_neg_counts  rJ  r=   N)rw   rx   ry   r0  r+  r<  r@  rE  rI  rM  rP  rR  rz   r=   r;   r(  r(    s7    L
GBC1	G	G	G	Gr=   r(  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestIsValidInconsistentc                     |j                  g dg dg|j                        }t        t        |      du        t	        t
        t        |d       y r6  )rO   r9  r   r   r5   r:  r8   r9   Rs      r;   test_is_valid_im_int_typez1TestIsValidInconsistent.test_is_valid_im_int_type  sE    JJ&(/1xx  9A%'(iat<r=   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r=   c                     |j                  g dg dg|j                        }|d |d |f   }t        t        |      |k(         |st	        t
        t        |d       y y r2  )rO   r   r   r   r5   r6   )r8   r-  r.  r/  r9   rW  s         r;   rZ  z6TestIsValidInconsistent.check_is_valid_im_various_size  sc    JJ))+24**  >eteUdUlOA%'(*k1DA r=   c                     |j                  d|j                        }t        t        |      du        t	        t
        t        |d       y r>  )r3   r   r   r   r5   r6   rV  s      r;   test_is_valid_im_emptyz.TestIsValidInconsistent.test_is_valid_im_empty  s7    HHV2::H.A%'(j+q=r=   c                     t        ddd      D ]g  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        |      }t        t        |      du        i y rB  )	r  rh   ri   rk   rO   r	   r   r   r   r8   r9   r%  r:   rR   rW  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*+	,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   rC  r~   r)   re          r   FTr3  r  rh   ri   rk   rO   r	   r   r   r   r5   r6   r`  s         r;   (test_is_valid_im_4_and_up_neg_index_leftz@TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_left       q"a 	BA		q!A#wz*A

1A
AQAAad1fIKNe+,*k1DA	B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   rC  r~   r)   re   rc  FTr3  rd  r`  s         r;   )test_is_valid_im_4_and_up_neg_index_rightzATestIsValidInconsistent.test_is_valid_im_4_and_up_neg_index_right  rf  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 rO  rd  r`  s         r;   "test_is_valid_im_4_and_up_neg_distz:TestIsValidInconsistent.test_is_valid_im_4_and_up_neg_dist  rf  r=   N)rw   rx   ry   rX  r[  rZ  r^  ra  re  rh  rj  rz   r=   r;   rT  rT    s/    =G
B>,
B
B
Br=   rT  c                   T    e Zd Z ed      d        Zd Zd Z ed      d        Zy)TestNumObsLinkageTr/   c                 h    |j                  d|j                        }t        t        t        |       y Nr?  r   )r3   r   r5   r6   r   r;  s      r;   test_num_obs_linkage_emptyz,TestNumObsLinkage.test_num_obs_linkage_empty.  s&     HHV2::H.j/15r=   c                 n    |j                  g dg|j                        }t        t        |      d       y )Nr7  r   re   rO   r   r   r   r;  s      r;   test_num_obs_linkage_1x4z*TestNumObsLinkage.test_num_obs_linkage_1x44  s*    JJ'rzzJ:_Q'+r=   c                 t    |j                  g dg dg|j                        }t        t        |      d       y )Nr7  r8  r   r~   rq  r;  s      r;   test_num_obs_linkage_2x4z*TestNumObsLinkage.test_num_obs_linkage_2x49  s5    JJ&(/1zz  ;_Q'+r=   c                     t        ddd      D ][  }t        j                  j                  ||dz
  z  dz        }|j	                  |      }t        |      }t        t        |      |       ] y )Nr   rC  r~   r)   re   )r  rh   ri   rk   rO   r	   r   r   rD  s        r;   test_num_obs_linkage_4_and_upz/TestNumObsLinkage.test_num_obs_linkage_4_and_up?  s^     q"a 	0A		q!A#wz*A

1A
A+Q/		0r=   N)rw   rx   ry   r,   ro  rr  rt  rv  rz   r=   r;   rl  rl  ,  s<    %6 &6
,
, %0 &0r=   rl  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 )Nr7  r   r   r)   rf   r   rO   r   r   r   r   r;  s      r;   test_leaves_list_1x4z#TestLeavesList.test_leaves_list_1x4M  s6    JJ'rzzJ:
AAU;r=   c                     |j                  g dg dg|j                        }t        |       t        t	        |      g dd       y )Nr7  r8  r   )r   r)   re   rf   r   rz  r;  s      r;   test_leaves_list_2x4z#TestLeavesList.test_leaves_list_2x4S  s=    JJ&(/1zz  ;
A	>r=   c                 6    dD ]  }| j                  ||        y r   )check_leaves_list_QrF   s      r;   test_leaves_list_Qz!TestLeavesList.test_leaves_list_QZ  s#    ) 	1F$$VR0	1r=   c                     |j                  t        j                        }t        ||      }t	        |      }t        |j                         t        |      d       y )Nrf   r   )rO   r*   r   r	   r   r   	pre_orderr   )r8   rG   r9   r_   rR   nodes         r;   r  z"TestLeavesList.check_leaves_list_Q_  sC    JJ*../Avqz(+a.uEr=   c                    |j                  t        j                        }t        |d      }t	        |      }t        |j                         |j                         j                         |j                         j                         z   d       y )Nr   rf   r   )	rO   r*   r   r	   r   r   r  get_left	get_right)r8   r9   r_   rR   r  s        r;   test_Q_subtree_pre_orderz'TestLeavesList.test_Q_subtree_pre_orderf  sj    JJ*../Ax qz(4==?+D+D+F-1^^-=-G-G-I,J"	$r=   N)rw   rx   ry   r{  r}  r  r  r  rz   r=   r;   rx  rx  J  s    <?1
F$r=   rx  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 )Nr?   r   r?  )r3   r   r5   r6   r   )r8   r9   r:   rR   s       r;   test_correspond_emptyz$TestCorrespond.test_correspond_emptys  s<    HHTH,HHU"**H-j*a3r=   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 )Nre   r   r)   rC  r~   )r  rh   ri   rk   rO   r	   r   r   rD  s        r;   test_correspond_2_and_upz'TestCorrespond.test_correspond_2_and_upy  s     q! 	&A		q!A#wz*A

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

1A
AJq!$%		&r=   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 )Nre   r   r~   r   r)   	listzipr  rh   ri   rk   rO   r	   r   r8   r9   r%  jr:   y2rR   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(((		)r=   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 )Nre   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(((		)r=   c                     t        dd      D ]^  }t        j                  j                  |d      }t	        |      }|j                  |      }t        |      }t        t        |      |       ` y )Nre   r   r   )	r  rh   ri   rk   r$   rO   r	   r   r   )r8   r9   rn   r_   r   rR   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/	0r=   N)rw   rx   ry   r  r  r  r  r  rz   r=   r;   r  r  p  s    4&))0r=   r  c                   N    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestIsMonotonicc                 h    |j                  d|j                        }t        t        t        |       y rn  )r3   r   r5   r6   r   r;  s      r;   test_is_monotonic_emptyz'TestIsMonotonic.test_is_monotonic_empty  s$    HHV2::H.j,2r=   c                 ^    |j                  g dg|j                        }t        |      sJ y )Nr   r)   333333?re   r   rO   r   r   r;  s      r;   test_is_monotonic_1x4z%TestIsMonotonic.test_is_monotonic_1x4  s'    JJ'rzzJ:Ar=   c                 d    |j                  g dg dg|j                        }t        |      sJ y )Nr  )re   r~   皙?r~   r   r  r;  s      r;   test_is_monotonic_2x4_Tz'TestIsMonotonic.test_is_monotonic_2x4_T  s2    JJ&(/1zz  ;Ar=   c                 d    |j                  g dg dg|j                        }t        |      rJ y )N)r   r)   r  re   )re   r~   r  r~   r   r  r;  s      r;   test_is_monotonic_2x4_Fz'TestIsMonotonic.test_is_monotonic_2x4_F  s5    JJ&(/1zz  ;?""?r=   c                 j    |j                  g dg dg dg|j                        }t        |      sJ y )Nr  re   r~   r  re   r   r   g333333?r   r   r  r;  s      r;   test_is_monotonic_3x4_Tz'TestIsMonotonic.test_is_monotonic_3x4_T  s7    JJ&&(/1zz  ; Ar=   c                 j    |j                  g dg dg dg|j                        }t        |      rJ y )Nr  )re   r~   皙?re   r  r   r  r;  s      r;   test_is_monotonic_3x4_F1z(TestIsMonotonic.test_is_monotonic_3x4_F1  :    JJ&&(/1zz  ;  ?""?r=   c                 j    |j                  g dg dg dg|j                        }t        |      rJ y )N)r   r)   g?re   r  r  r   r  r;  s      r;   test_is_monotonic_3x4_F2z(TestIsMonotonic.test_is_monotonic_3x4_F2  r  r=   c                 j    |j                  g dg dg dg|j                        }t        |      rJ y )Nr  r  )r   r   r  r   r   r  r;  s      r;   test_is_monotonic_3x4_F3z(TestIsMonotonic.test_is_monotonic_3x4_F3  r  r=   c                 p    t        |j                  t        j                        d      }t	        |      sJ y Nr   r	   rO   r*   rP   r   r;  s      r;    test_is_monotonic_tdist_linkage1z0TestIsMonotonic.test_is_monotonic_tdist_linkage1  s,     BJJ299:HEAr=   c                 z    t        |j                  t        j                        d      }d|d<   t	        |      rJ y )Nr   r   )re   re   r  r;  s      r;    test_is_monotonic_tdist_linkage2z0TestIsMonotonic.test_is_monotonic_tdist_linkage2  s8     BJJ299:HE#?""?r=   c                 t    |j                  t        j                        }t        |d      }t	        |      sJ y r  )rO   r*   r   r	   r   )r8   r9   r_   rR   s       r;   test_is_monotonic_Q_linkagez+TestIsMonotonic.test_is_monotonic_Q_linkage  s1     JJ*../Ax Ar=   N)rw   rx   ry   r  r  r  r  r  r  r  r  r  r  r  rz   r=   r;   r  r    s9    3

#####r=   r  c                   $    e Zd Zd Zd Zd Zd Zy)TestMaxDistsc                 h    |j                  d|j                        }t        t        t        |       y rn  )r3   r   r5   r6   r   r;  s      r;   test_maxdists_empty_linkagez(TestMaxDists.test_maxdists_empty_linkage  s$    HHV2::H.j(A.r=   c                     |j                  g dg|j                        }t        |      }t        ||      }t	        ||d       y )Nr   r)   r  r   r   rf   rL   )rO   r   r   calculate_maximum_distancesr'   )r8   r9   rR   MD
expectedMDs        r;   !test_maxdists_one_cluster_linkagez.TestMaxDists.test_maxdists_one_cluster_linkage  s<    JJ'rzzJ:a[0B7
JU3r=   c                 6    dD ]  }| j                  ||        y Nr   rB   rW   rU   rV   )check_maxdists_Q_linkagerF   s      r;   test_maxdists_Q_linkagez$TestMaxDists.test_maxdists_Q_linkage  s!    J 	6F))&"5	6r=   c                     |j                  t        j                        }t        ||      }t	        |      }t        ||      }t        ||d       y )Nrf   rL   )rO   r*   r   r	   r   r  r'   )r8   rG   r9   r_   rR   r  r  s          r;   r  z%TestMaxDists.check_maxdists_Q_linkage
  sD    JJ*../Ava[0B7
JU3r=   N)rw   rx   ry   r  r  r  r  rz   r=   r;   r  r    s    /
464r=   r  c                   r    e Zd Z ed      d        Zd Z ed      d        Z ed      d        Zd Zy)	TestMaxInconstsTr/   c                     |j                  d|j                        }|j                  d|j                        }t        t        t        ||       y rn  )r3   r   r5   r6   r   r8   r9   rR   rW  s       r;   test_maxinconsts_empty_linkagez.TestMaxInconsts.test_maxinconsts_empty_linkage  s>     HHV2::H.HHV2::H.j+q!4r=   c                     |j                  g dg|j                        }t        j                  j	                  dd      }|j                  |      }t        t        t        ||       y Nr  r   re   r   )rO   r   rh   ri   rk   r5   r6   r   r  s       r;   test_maxinconsts_difrow_linkagez/TestMaxInconsts.test_maxinconsts_difrow_linkage  sL     JJ'rzzJ:IINN1a JJqMj+q!4r=   c                     |j                  g dg|j                        }|j                  g dg|j                        }t        ||      }t        |||      }t	        ||d       y )Nr  r   r   r   r   r  r  rf   rL   )rO   r   r   !calculate_maximum_inconsistenciesr'   )r8   r9   rR   rW  r  r  s         r;   $test_maxinconsts_one_cluster_linkagez4TestMaxInconsts.test_maxinconsts_one_cluster_linkage$  s\     JJ'rzzJ:JJ'rzzJ:A6q!C
JU3r=   c                 6    dD ]  }| j                  ||        y r  )check_maxinconsts_Q_linkagerF   s      r;   test_maxinconsts_Q_linkagez*TestMaxInconsts.test_maxinconsts_Q_linkage-  s!    J 	9F,,VR8	9r=   c                     |j                  t        j                        }t        ||      }t	        |      }t        ||      }t        |||      }t        ||d       y )Nr  rf   rL   )rO   r*   r   r	   r   r   r  r'   )r8   rG   r9   r_   rR   rW  r  r  s           r;   r  z+TestMaxInconsts.check_maxinconsts_Q_linkage2  sR    JJ*../AvOA6q!C
JU3r=   N)	rw   rx   ry   r,   r  r  r  r  r  rz   r=   r;   r  r    sU    %5 &55 %4 &4 %9 &94r=   r  c                       e Zd Zd Zd Z ed      d        Zd Zd Zd Z	 ed      d	        Z
d
 Z ed      d        Zd Zy)TestMaxRStatc                 6    dD ]  }| j                  ||        y )N)gffffff
@r   r   )check_maxRstat_invalid_indexr8   r9   r%  s      r;   test_maxRstat_invalid_indexz(TestMaxRStat.test_maxRstat_invalid_index>  s!     	5A--a4	5r=   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  )rO   r   
isinstancer  r5   r6   r   r:  r8   r%  r9   rR   rW  s        r;   r  z)TestMaxRStat.check_maxRstat_invalid_indexB  s^    JJ'rzzJ:JJ'rzzJ:a*h1a8)Xq!Q7r=   Tr/   c                 H    t        d      D ]  }| j                  ||        y Nr   )r  check_maxRstat_empty_linkager  s      r;   test_maxRstat_empty_linkagez(TestMaxRStat.test_maxRstat_empty_linkageK  s%    q 	5A--a4	5r=   c                     |j                  d|j                        }|j                  d|j                        }t        t        t        |||       y rn  )r3   r   r5   r6   r   r  s        r;   r  z)TestMaxRStat.check_maxRstat_empty_linkageP  s>    HHV2::H.HHV2::H.j(Aq!4r=   c                 H    t        d      D ]  }| j                  ||        y r  )r  check_maxRstat_difrow_linkager  s      r;   test_maxRstat_difrow_linkagez)TestMaxRStat.test_maxRstat_difrow_linkageV  s%    q 	6A..q"5	6r=   c                     |j                  g dg|j                        }t        j                  j	                  dd      }|j                  |      }t        t        t        |||       y r  )rO   r   rh   ri   rk   r5   r6   r   r  s        r;   r  z*TestMaxRStat.check_maxRstat_difrow_linkageZ  sN     JJ'rzzJ:IINN1a JJqMj(Aq!4r=   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_linkageb  s%    q 	;A33Ar:	;r=   c                     |j                  g dg|j                        }|j                  g dg|j                        }t        ||d      }t        ||d|      }t	        ||d       y )Nr  r   r  r)   rf   rL   )rO   r   r   r  r'   )r8   r%  r9   rR   rW  r  r  s          r;   r  z/TestMaxRStat.check_maxRstat_one_cluster_linkageg  s^    JJ'rzzJ:JJ'rzzJ:aA6q!QC
JU3r=   c                 X    dD ]%  }t        d      D ]  }| j                  |||        ' y )Nr  r   )r  check_maxRstat_Q_linkage)r8   r9   rG   r%  s       r;   test_maxRstat_Q_linkagez$TestMaxRStat.test_maxRstat_Q_linkageo  s6    J 	=F1X =--fa<=	=r=   c                     |j                  t        j                        }t        ||      }t	        |      }t        ||d      }t        ||d|      }t        ||d       y )Nr)   rf   rL   )rO   r*   r   r	   r   r   r  r'   )	r8   rG   r%  r9   r_   rR   rW  r  r  s	            r;   r  z%TestMaxRStat.check_maxRstat_Q_linkageu  sV    JJ*../AvOaA6q!QC
JU3r=   N)rw   rx   ry   r  r  r,   r  r  r  r  r  r  r  r  rz   r=   r;   r  r  <  sp    58 %5 &5565 %; &;4 %= &=
4r=   r  c                      e Zd Zd Zd Zd Zej                  j                  e	 d      d        Z
ej                  j                  e	 d      d        Zd Zej                  j                  e	 d      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re   r   r)   r   r~   r   )r	   rO   r*   rP   r   r   )r8   r9   rR   rW  r  s        r;   $test_dendrogram_single_linkage_tdistz3TestDendrogram.test_dendrogram_single_linkage_tdist  s>    BJJ299:HEq$'8V/0r=   c                     t        |j                  t        j                        d      }t	        t
        t        |d       y )Nr   fooorientation)r	   rO   r*   rP   r5   r6   r   r;  s      r;   test_valid_orientationz%TestDendrogram.test_valid_orientation  s,    BJJ299:HEj*aUCr=   c                     t        |j                  t        j                        d      }|j                  g d      }t	        ||d      }t	        |t        |      d      }||k(  sJ y )Nr   )r)   r~   re   r2   r   r   T)labelsr  )r	   rO   r*   rP   r   r  )r8   r9   rR   r  result1result2s         r;   test_labels_as_array_or_listz+TestDendrogram.test_labels_as_array_or_list  s[    BJJ299:HE./Qvt<QtF|TB'!!!r=   zno matplotlib)reasonc           	         |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   )re   r~   r   r   )r   r   r   r2   d   )r  z.Dimensions of Z and labels must be consistent.)match)rO   pltfigurepytestr   r6   r   r  r  strvalueclose)r8   r9   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$c                 6    dD ]  }| j                  ||        y )N)topbottomleftright)check_dendrogram_plot)r8   r9   r  s      r;   test_dendrogram_plotz#TestDendrogram.test_dendrogram_plot  s!    = 	8K&&{B7	8r=   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C0r!  r!  r!  r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r         .@r&  )     F@r'       K@r(  )     A@r)        I@r*  )      9@r+       @E@r,  )      $@r-       @@r.  )251034r  )r   r   r!  r!  r!  r!  
color_listdcoordicoordivlr  leaves_color_list   )axr  r7  rd   Z   )r<  r  leaf_font_sizeleaf_rotation)r  r  r   )r<  r  r?  )r<  r  r>  r  )r	   rO   r*   rP   r  r  add_subplotr   rh   r   get_xticklabelsget_yticklabelsget_rotationget_sizer  )
r8   r  r9   rR   expectedfigr<  R1	testlabelR2s
             r;   r  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"r=   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   re   lastpT)show_contractedr7  r!  )r   r   r   r   r%  (2)z(4)r2   r   r5  mtica)r   r!  r!  r!  r"  )r   r   r   r   r#  r$  )r)  r)  r'  r'  )r+  r+        D@rO  )r-  r-       @@@rP  )r/  r0  r1  r2  rM  )re   r   r)   r   r   )r   r   r!  r!  r!  )	r	   rO   r*   rP   r   r  r  rh   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 	r=   c                     t        |j                  t        j                        d      }t	        g d       t        |ddd      }t	        g d       |d   }t        |g d	       t	        d        y )
Nr   )r   mr:   r#  Tg   )r  above_threshold_colorcolor_threshold)rT  rr   rS  r:   r#  r6  )r   rS  rT  rT  rT  )r	   rO   r*   rP   r   r   r   )r8   r9   rR   rW  r6  s        r;   test_dendrogram_colorsz%TestDendrogram.test_dendrogram_colors  sb    BJJ299:HE34q$-0#G=>|_
Z!:; 	t$r=   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   re   r   r   r)   r   r   Tr  r!  r   r   r!  C2r`  r:  rO   r	   r   r   r8   r9   xzro   
exp_colorscolorss          r;   %test_dendrogram_leaf_colors_zero_distz4TestDendrogram.test_dendrogram_leaf_colors_zero_dist  s\     JJ	!!!!!# $ Ax q$'9
&'VZ(r=   c           	          |j                  g dg dg dg dg dg dg      }t        |d      }t        |d      }g d	}|d
   }t        ||       y )Nr[  )r   r   g?r]  r\  r^  r   Tr  r_  r:  ra  rb  s          r;   test_dendrogram_leaf_colorsz*TestDendrogram.test_dendrogram_leaf_colors*  s\     JJ	#!!!!# $ Ax q$'9
&'VZ(r=   N)rw   rx   ry   r   r  r
  r  markskipifhave_matplotlibr  r  r  rQ  rY  rg  ri  rz   r=   r;   r  r    s    1D" [[O+OD E& [[O+OD8 E8<#| [[O+OD E>%))r=   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~   r   re   )r  r3   r   r  rO   r9  max)rR   r9   rn   Bqr%  r  r  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!	 Hr=   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 rn  )r  result_typer3   r  rO   r9  ro  )rR   rW  r#  r9   rn   r   rp  rq  r%  r  r  s              r;   r  r  L  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!	 Hr=   c           	      X    t        t        t        | j                  ddgddgg             y )Nr   r)   )r   r   r	   rO   r  s    r;   <test_unsupported_uncondensed_distance_matrix_linkage_warningru  _  s$    "**q!fq!f5E*FGr=   c           
          t         j                  j                  j                  D ]/  }t	        t
        t        | j                  ddgddgg      |d       1 y )Nr)   	cityblockrG   r^   )r`   cluster	hierarchy_EUCLIDEAN_METHODSr5   r6   r	   rO   )r9   rG   s     r;   "test_euclidean_linkage_value_errorr|  d  sJ    --))<< 9j'2::1v1v6F+G#K	99r=   c                     t        | j                  dg      dd      }t        | j                  ddgddgg      dd      }t        ||d       y )Nr)   r   r]   rx  r   rf   r   )r	   rO   r'   )r9   Z1r  s      r;   test_2x2_linkager  j  sJ    	QC+	FB	aVaV,-h{	SBB'r=   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   )rh   ri   seedrandnrO   r`   ry  rz  rW   r   r   r  r  )r9   r  r_   rR   trees        r;   test_node_comparer  q  s    IINN2D
		a A


1A$$Q'A1:DD4==?"#DNNt}}./DNN 001DNN/0r=   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   rf   F)rg   check_dtyper   r)   r   )
n_clustersr   ir   )height)rh   ri   r  r  rO   r`   ry  rz  rW   r   r'   aranger3   r   ro  r!   distsearchsorted)r9   r  r_   rR   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 )NrK   rL   rW   r\   )	r    r	   rO   r*   rP   ru   r'   r_   linkage_X_ward_olo)r9   rR   rS   s      r;   rv   rv     s     	gbjj1D1K1K&LM jj)<)C)CD	FA#==IArzz),59 	gbjj1D1F1F&GP jj)<)>)>?	AA#66IArzz),59r=   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)re   r   r         r~   keyr~   r  r  r)   r   g      @re   r   r   r   )rO   r%   get_minr   
remove_minchange_value)r9   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#r=   )Ynumpyrh   numpy.testingr   r   r   r   r  r   r5   scipy.cluster.hierarchyr`   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   scipy.spatial.distancer$   scipy.cluster._hierarchyr%   scipy.conftestr&   scipy._lib._array_apir'   r(    r*   
matplotlibusematplotlib.pyplotpyplotr  rl  	Exceptionrj  usefixtures
pytestmarkr,   r.   r|   r   r   r   r   r   r   r(  rT  rl  rx  r  r  r  r  r  r  r  r  ru  r|  r  r  r  rv   r  rz   r=   r;   <module>r     s[  D  N N  * 7 7 7 7 7 7 7 7 ) ) / B !
JNN5#O
 #FKK$;$;<O$PQ
KK11 ;> ;>| D!> > ">> D!	T 	T "	T D!2 2 "2*$ $D D!0- 0- "0-f D!O O "O 4IJLV7 V7LV7r D!PG PG "PGf D!IB IB "IBX0 0< D!"$ "$ ""$J D!90 90 "90x D!F F "FR D!4 4 "46&4 &4R@4 @4F D!w) w) "w)t$ /0B & D!H "H9 D!( "( D!
1 "
1 4*Q)RS= T=8 D!: ": 4*N)OP$ Q$W#  Os   <J
 
JJ