
    Wi>                        d Z ddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZ ddlmZ ddlmZmZ  ej,                  d	e
       g dZg dZ eg deed      \  ZZ eddd      \  ZZedz  Ze ee      z  Z ej>                  eef      Z  ejB                  eef      Z" ee e"dd      \  Z Z#Z"Z$ e       Z%e%jM                  e       Z e%jO                  e#      Z#d Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d  Z1d! Z2y)"z9
Simple tests for flat clustering over HDBSCAN hierarchy
    N)HDBSCANapproximate_predict)HDBSCAN_flatapproximate_predict_flatmembership_vector_flat"all_points_membership_vectors_flat)
make_blobs
make_moons)StandardScaler)train_test_split)assert_array_equalassert_array_lessignorecategory))r      )gɿr   )皙?r   )g      ?r   )g       @g      ?)g      @g        )g      ?g{Gz?gQ?ffffff?r   r   )F      P   d   (         )	n_samplescenterscluster_stdrandom_statei,  gQ?*   )r   noiser   g      @r   )	test_sizer   c                 2    t        j                  |       dz   S )Nr   )npamax)labels_s    c/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/hdbscan/tests/test_flat.pyn_clusters_from_labelsr(   +   s    777a    c                     t        d      j                  t              } t        | j                        }t        t        |d      }t        |j                  | j                         t        |j                  | j                         t        d      j                  t              } t        | j                        }t        t        |d      }t        |j                  | j                         t        |j                  | j                         y)zE
    Verify that the default clustering of HDBSCAN is preserved.
    eom)cluster_selection_method
n_clustersr,   leafN)r   fitXr(   r&   r   r   probabilities_)	clustererr.   clusterer_flats      r'   test_flat_base_defaultr5   /   s    
 7;;A>I'	(9(9:J "!
;@BN ~--y/@/@A~44 //1 8<<Q?I'	(9(9:J "!
;ACN ~--y/@/@A~44 //1
r)   c                     d} t        t        | d      }|j                  }t        d|      j	                  t              }t        |j                  |j                         t        |j                  |j                         d} t        t        | d      }|j                  }t        d|      j	                  t              }t        |j                  |j                         t        |j                  |j                         y)zj
    Verify that a clustering of HDBSCAN specified by
        cluster_selection_epsilon is preserved.
       r+   r-   r,   cluster_selection_epsilon   r/   N)r   r1   r9   r   r0   r   r&   r2   )r.   r4   epsilonr3   s       r'   test_flat_base_epsilonr<   O   s     J!!
;@BN 66G29;;>3q6  ~--y/@/@A~44 //1
 J!!
;ACN 66G29;;>3q6  ~--y/@/@A~44 //1
r)   c                     t        dd      j                  t              } t        | j                        }t        j                  d      5 }t        t        d|dz         }t        |      dkD  sJ t        |d   j                  t              st        |d   j                  t              sJ d	d	d	       j                  d
k(  sJ d       |j                  }t        d
|      j                  t              }t        |j                  |j                         t        |j                   |j                          y	# 1 sw Y   xY w)z
    Verify that when we request more clusters than 'eom' can handle,
        method switches to 'leaf' and the results match 'leaf'.
    r+   r   r8   Trecordr   r,   r.   Nr/   z3cluster selection method has not switched to 'leaf')r   r0   r1   r(   r&   warningscatch_warningsr   len
issubclassr   UserWarningDeprecationWarningr,   r9   r   r2   )r3   max_clusterswr4   r;   clusterer_leafs         r'   test_switch_to_leafrK   v   s'    23558SV ))*;*;<L		 	 	- i%a%1=aA 1vzz!B%..+6*QrU^^Ug:hhhi 22f< CAC< 66Gf7>@@CA ~--~/E/EF~44%446
'i is   A"D99Ec                      t        ddd      j                  t              } t        | t        d      \  }}t        | t              \  }}t        ||       t        ||       y)zO
    Verify that approximate_predict_flat produces same results as default
    r+   r   T)r,   r9   prediction_dataNr.   )r   r0   r1   r   X_testr   r   )r3   labels_flat
proba_flatlabels_base
proba_bases        r'   test_approx_predict_defaultrT      se    
 23(,..1c!f 
 7$-v$HK 2)VDK{K0z:.
r)   c                      d} t        t        d|       }t        |t        d      \  }}t	        |      }|| k(  sJ t        |t        j                  t        |            dz          y)zU
    Verify that approximate_predict_flat produces as many clusters as clusterer
       r+   r@   NrN   +=)	r   r1   r   rO   r(   r   r$   onesrD   )r.   r3   rP   rQ   n_clusters_outs        r'   !test_approx_predict_same_clustersrZ      sl    
 JQ(24I 7$-v$HK ,K8NZ'('j"''#j/":6"AB
r)   c                  l   d} t        t        d| d      }d}t        |t        |      \  }}t	        |      }||k(  sJ t        |t        j                  t        |            dz          d}t        j                  d	      5 }t        |t        |      \  }}t        |      d
kD  sJ t        |d   j                  t              sJ dt        |d   j                        v sJ 	 ddd       t	        |      }||k(  sJ t        |t        j                  t        |            dz          y# 1 sw Y   GxY w)zQ
    Verify that approximate_predict_flat produces as many clusters as asked
    rV   r+   T)r,   r.   rM      rN   rW      r>   r   rA   zCannot predictN)r   r1   r   rO   r(   r   r$   rX   rD   rB   rC   rE   r   rF   strmessage)n_clusters_fitr3   n_clusters_predictrP   rQ   rY   rI   s          r'   !test_approx_predict_diff_clustersrb      s8   
 NQ(6-13I
 6%v:LNK ,K8N//0/j"''#j/":6"AB 		 	 	- 6":%v:L#NZ 1vzz!B%..+6663qu}}#55556 ,K8N//0/j"''#j/":6"AB
6 6s   A!D**D3c                  V   d} t        t        |       }t        |t              }|j                  d   t        |j                        k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          t        |j                        dz
  } t        t        |       }t        |t              }|j                  d   | k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          y)zH
    Verify membership vector produces same n_clusters as clusterer
    NrN   r   rW   r   )r   r1   r   rO   shaper(   r&   rD   r   r$   rX   r`   r3   membershipss      r'   test_mem_vec_same_clustersrg      s   
 NQ>:I )F;K Q#9):K:K#LLML{s6{*+*k277;+<+<#=f#DE ,I,=,=>BNQ>:I )F;K Q>121{s6{*+*k277;+<+<#=f#DE
r)   c                     t        j                  dt               d} t        t        |       }t        |j                        }|dz   }t        |t        |      }|j                  d   |k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          t        |j                        dz   } t        t        |       }| dz   }t        |t        |      }|j                  d   |k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          y	zI
    Verify membership vector produces as many clusters as requested
    r   r   NrN   r\   r   rW   r   )rB   filterwarningsrF   r   r1   r(   r&   r   rO   rd   rD   r   r$   rX   r`   r3   n_clusters_fittedra   rf   s        r'   test_mem_vec_diff_clustersrm   
  s>   
 H{; NQ>:I.y/@/@A +Q.(F4FHK Q#5565{s6{*+*k277;+<+<#=f#DE ,I,=,=>BNQ>:I (!+(F4FHK Q#5565{s6{*+*k277;+<+<#=f#DE
r)   c                  h   d} t        t        |       }t        |      }|j                  d   t	        |j
                        k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          t	        |j
                        dz
  } t        t        |       }t        |      }|j                  d   t	        |j
                        k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          y)za
    Verify membership vector for training set produces same n_clusters
        as clusterer
    NrN   r   rW   r   )
r   r1   r   rd   r(   r&   rD   r   r$   rX   re   s      r'   %test_all_points_mem_vec_same_clustersro   5  s    NQ>:I 5Y?K Q#9):K:K#LLML{s1v%&%k277;+<+<#=f#DE ,I,=,=>BNQ>:I 5Y?K Q#9):K:K#LLML{s1v%&%k277;+<+<#=f#DE
r)   c                     t        j                  dt               d} t        t        |       }t        |j                        }|dz   }t        ||      }|j                  d   |k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          t        |j                        dz   } t        t        |       }|dz   }t        ||      }|j                  d   |k(  sJ t        |      t        t              k(  sJ t        |t        j                  |j                        dz          yri   )rB   rj   rF   r   r1   r(   r&   r   rd   rD   r   r$   rX   rk   s        r'   %test_all_points_mem_vec_diff_clustersrq   Y  s<   
 H{; NQ>:I.y/@/@A +Q.4!.@BK Q#5565{s1v%&%k277;+<+<#=f#DE ,I,=,=>BNQ>:I +Q.4!.@BK Q#5565{s1v%&%k277;+<+<#=f#DE
r)   )3__doc__rB   numpyr$   hdbscanr   r   hdbscan.flatr   r   r   r   sklearn.datasetsr	   r
   sklearn.preprocessingr   sklearn.model_selectionr   sklearn.utils._testingr   r   rj   FutureWarningr   stdX0y0X1y1rD   vstackr1   concatenateyrO   y_testscalerfit_transform	transformr(   r5   r<   rK   rT   rZ   rb   rg   rm   ro   rq    r)   r'   <module>r      s>     0> >
 4 0 4 H   = 9* *	8# #!"
$B 
cB	?B b c'l BIIr2hBNNB8'1579 61f		
			&	! @$NB(*$N F(V!H(r)   