Ë
    êÿæipO  ã            	       óÎ  — d Z ddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
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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  ddl!m"Z"m#Z#  edd¬«      \  Z$Z% ee$e%d¬«      \  Z$Z% e«       jM                  e$«      Z$g d¢Z'dh ejP                  «       D � �ch c]
  \  } }|d   ’Œ c}} z  Z)dRd„Z*ejV                  jY                  de«      d„ «       Z-d„ Z.ejV                  jY                  dg e#¢e"¢«      d„ «       Z/d„ Z0ejV                  jY                  de'«      ejV                  jY                  d e«      d!„ «       «       Z1d"„ Z2ejV                  jY                  d#d$«      d%„ «       Z3d&„ Z4d'„ Z5d(„ Z6d)„ Z7ejV                  jY                  d*d+d,g«      d-„ «       Z8ejV                  jY                  d.e#«      d/„ «       Z9ejV                  jY                  d0e'«      d1„ «       Z:d2„ Z;d3„ Z<ejV                  jY                  d4d d5i ejz                  d6ej|                  gej|                  d6gg«      fd d5id6d7gd7d6ggfi d6d7gd8d9ggfg«      d:„ «       Z?ejV                  jY                  d.e#«      d;„ «       Z@ejV                  jY                  d.e#«      d<„ «       ZAd=„ ZBd>„ ZCd?„ ZDejV                  jY                  d@dAdBg«      ejV                  jY                  dCddDg«      dE„ «       «       ZEdF„ ZFejV                  jY                  dGdHdIg«      dJ„ «       ZGejV                  jY                  dKdLdMg«      dN„ «       ZHejV                  jY                  dOd+d,g«      dP„ «       ZIdQ„ ZJyc c}} w )SzF
Tests for HDBSCAN clustering algorithm
Based on the DBSCAN test code
é    N)Ústats)Údistance)ÚHDBSCAN)ÚCONDENSED_dtypeÚ_condense_treeÚ_do_labelling)Ú_OUTLIER_ENCODING)Ú
make_blobs)Úfowlkes_mallows_score)Ú_VALID_METRICSÚeuclidean_distances)ÚBallTreeÚKDTree)ÚStandardScaler)Úshuffle)Úassert_allcloseÚassert_array_equal)ÚCSC_CONTAINERSÚCSR_CONTAINERSéÈ   é
   )Ú	n_samplesÚrandom_stateé   )r   )Úkd_treeÚ	ball_treeÚbruteÚautoéÿÿÿÿÚlabelc                 ór   — t        t        | «      t        z
  «      }|dk(  sJ ‚t        | t        «      |kD  sJ ‚y )Né   )ÚlenÚsetÚOUTLIER_SETr   Úy)ÚlabelsÚ	thresholdÚ
n_clusterss      úw/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/sklearn/cluster/tests/test_hdbscan.pyÚcheck_label_qualityr+   )   s6   € Ü”S˜“[¤;Ñ.Ó/€JØ˜Š?Ðˆ?Ü  ¬Ó+¨iÒ7Ð7Ñ7ó    Úoutlier_typec                 óž  — t         j                  t         j                  dœ|    }d„ d„ dœ|    }t        |    d   }t        |    d   }t        j                  «       }|dg|d<   ||g|d<   t        d	¬
«      j                  |«      }|j                  |k(  j                  «       \  }t        |ddg«        ||j                  |«      j                  «       \  }t        |ddg«       t        t        dd«      «      t        t        dd«      «      z   }	t        d	¬
«      j                  ||	   «      }
t        |
j                  |j                  |	   «       y)úO
    Tests if np.inf and np.nan data are each treated as special outliers.
    )ÚinfiniteÚmissingc                 ó   — | |k(  S ©N© ©Úxr&   s     r*   Ú<lambda>z#test_outlier_data.<locals>.<lambda>9   s   €   a¢r,   c                 ó,   — t        j                  | «      S r3   )ÚnpÚisnanr5   s     r*   r7   z#test_outlier_data.<locals>.<lambda>:   s   € ¤§¡¨¤r,   r    Úprobé   r   é   F©Úcopyé   r   N)r9   ÚinfÚnanr	   ÚXr?   r   ÚfitÚlabels_Únonzeror   Úprobabilities_ÚlistÚrange)r-   ÚoutlierÚ
prob_checkr    r;   Ú	X_outlierÚmodelÚmissing_labels_idxÚmissing_probs_idxÚclean_indicesÚclean_models              r*   Útest_outlier_datarR   /   sB  € ô —F‘FÜ—6‘6ñð ñ€Gñ
 (Ù+ñð ñ€Jô ˜lÑ+¨GÑ4€EÜ˜\Ñ*¨6Ñ2€Dä—‘“€IØ˜Q�<€Iˆa�LØ˜WÐ%€Iˆa�LÜ˜Ô×#Ñ# IÓ.€Eà"Ÿ]™]¨eÑ3×<Ñ<Ó>ÑÐÜÐ)¨A¨q¨6Ô2á& u×';Ñ';¸TÓB×KÑKÓMÑÐÜÐ(¨1¨a¨&Ô1äœ˜q !›Ó%¬¬U°1°c«]Ó(;Ñ;€MÜ˜uÔ%×)Ñ)¨)°MÑ*BÓC€KÜ�{×*Ñ*¨E¯M©M¸-Ñ,HÕIr,   c                  óü  — t        t        «      } | j                  «       }t        dd¬«      j	                  | «      }t        | |«       t        |«       d}t        j                  t        |¬«      5  t        dd¬«      j	                  t        «       ddd«       d}d| d	<   d
| d<   t        j                  t        |¬«      5  t        dd¬«      j	                  | «       ddd«       y# 1 sw Y   ŒVxY w# 1 sw Y   yxY w)zy
    Tests that HDBSCAN works with precomputed distance matrices, and throws the
    appropriate errors when needed.
    ÚprecomputedT©Úmetricr?   z*The precomputed distance matrix.*has shape©ÚmatchNz'The precomputed distance matrix.*valuesr   )r   r<   r<   )r<   r   F)
r   rC   r?   r   Úfit_predictr   r+   ÚpytestÚraisesÚ
ValueError)ÚDÚ
D_originalr'   Úmsgs       r*   Útest_hdbscan_distance_matrixr`   O   sÅ   € ô
 	œAÓ€AØ—‘“€JÜ˜M°Ô5×AÑAÀ!ÓD€Fä�A�zÔ"Ü˜Ôà
7€CÜ	�‰”z¨Ö	-Ü�}¨4Ô0×<Ñ<¼QÔ?÷ 
.ð 5€Cà€A€d�GØ€A€d�GÜ	�‰”z¨Ö	-Ü�}¨5Ô1×=Ñ=¸aÔ@÷ 
.Ð	-÷ 
.Ð	-ú÷ 
.Ð	-ús   Á0!C&Ã C2Ã&C/Ã2C;Úsparse_constructorc                 ób  — t        j                  t        j                  t        «      «      }|t	        j
                  |«      z  }t        j                  |j                  «       d«      }d|||k\  <    | |«      }|j                  «        t        dd¬«      j                  |«      }t        |«       y)zA
    Tests that HDBSCAN works with sparse distance matrices.
    é2   ç        rT   FrU   N)r   Ú
squareformÚpdistrC   r9   Úmaxr   ÚscoreatpercentileÚflattenÚeliminate_zerosr   rY   r+   )ra   r]   r(   r'   s       r*   Ú#test_hdbscan_sparse_distance_matrixrk   g   s‰   € ô
 	×ÑœHŸN™N¬1Ó-Ó.€AØŒ�‰�‹�N€Aä×'Ñ'¨¯	©	«°RÓ8€Ià€A€aˆ9�nÑÙ˜1Ó€AØ×ÑÔä˜M°Ô6×BÑBÀ1ÓE€FÜ˜Õr,   c                  óX   — t        d¬«      j                  t        «      } t        | «       y)z“
    Tests that HDBSCAN works with feature array, including an arbitrary
    goodness of fit check. Note that the check is a simple heuristic.
    Fr>   N)r   rY   rC   r+   ©r'   s    r*   Útest_hdbscan_feature_arrayrn   y   s#   € ô
 ˜%Ô ×,Ñ,¬QÓ/€Fô ˜Õr,   ÚalgorV   c                 ó  — t        | d¬«      j                  t        «      }t        |«       | dv ryt        t
        dœ}dt        j                  t        j                  d   «      idt        j                  t        j                  d   «      idd	id	t        j                  t        j                  d   «      d
œdœj                  |d«      }t        | ||d¬«      }|||    j                  vr8t        j                  t        «      5  |j                  t        «       ddd«       y|dk(  r8t        j                   t"        «      5  |j                  t        «       ddd«       y|j                  t        «       y# 1 sw Y   yxY w# 1 sw Y   yxY w)z
    Tests that HDBSCAN works with the expected combinations of algorithms and
    metrics, or raises the expected errors.
    F)Ú	algorithmr?   )r   r   N)r   r   ÚVr<   Úpé   )rs   Úw)ÚmahalanobisÚ
seuclideanÚ	minkowskiÚ
wminkowski)rq   rV   Úmetric_paramsr?   ry   )r   rY   rC   r+   r   r   r9   ÚeyeÚshapeÚonesÚgetÚvalid_metricsrZ   r[   r\   rD   ÚwarnsÚFutureWarning)ro   rV   r'   ÚALGOS_TREESrz   Úhdbs         r*   Útest_hdbscan_algorithmsr„   …   s>  € ô ˜t¨%Ô0×<Ñ<¼QÓ?€FÜ˜Ôð Ð Ñ Øô Üñ€Kð
 œRŸV™V¤A§G¡G¨A¡JÓ/Ð0ØœBŸG™G¤A§G¡G¨A¡JÓ/Ð0Ø˜1�XØ¤B§G¡G¬A¯G©G°A©JÓ$7Ñ8ñ	÷
 
�cˆ&�$Óð ô ØØØ#Øô	€Cð �[ Ñ&×4Ñ4Ñ4Ü�]‰]œ:Õ&Ø�G‰G”AŒJ÷ 'Ð&à	�<Ò	Ü�\‰\œ-Õ(Ø�G‰G”AŒJ÷ )Ð(ð 	�‰”�
÷ 'Ð&ú÷ )Ð(ús   ÄE5Å FÅ5E>ÆF
c                  ó~   — t        d¬«      j                  t        «      } | j                  d«      }t	        |d¬«       y)z˜
    Tests that HDBSCAN can generate a sufficiently accurate dbscan clustering.
    This test is more of a sanity check than a rigorous evaluation.
    Fr>   ç333333Ó?gq=
×£pí?)r(   N)r   rD   rC   Údbscan_clusteringr+   )Ú	clustererr'   s     r*   Útest_dbscan_clusteringr‰   ¯   s5   € ô
 ˜UÔ#×'Ñ'¬Ó*€IØ×(Ñ(¨Ó-€Fô ˜¨$Ö/r,   Úcut_distance)çš™™™™™¹?ç      à?r<   c                 ó¼  — t         d   d   }t         d   d   }t        j                  «       }t        j                  dg|d<   dt        j
                  g|d<   t        j                  t        j
                  g|d<   t        d¬	«      j                  |«      }|j                  | ¬
«      }t        j                  ||k(  «      }t        |ddg«       t        j                  ||k(  «      }t        |dg«       t        t        t        d«      «      t        ||z   «      z
  «      }t        d¬	«      j                  ||   «      }	|	j                  | ¬
«      }
t        |
||   «       y)r/   r1   r    r0   r<   r   rt   r=   Fr>   )rŠ   r   N)r	   rC   r?   r9   rA   rB   r   rD   r‡   Úflatnonzeror   rH   r$   rI   )rŠ   Úmissing_labelÚinfinite_labelrL   rM   r'   rN   Úinfinite_labels_idxÚ	clean_idxrQ   Úclean_labelss              r*   Ú#test_dbscan_clustering_outlier_datar”   ¼   s0  € ô
 & iÑ0°Ñ9€MÜ& zÑ2°7Ñ;€Nä—‘“€IÜ—F‘F˜A�;€Iˆa�LØ”r—v‘v�;€Iˆa�LÜ—F‘FœBŸF™FÐ#€Iˆa�LÜ˜Ô×#Ñ# IÓ.€EØ×$Ñ$°,Ð$Ó?€FäŸ™¨°-Ñ(?Ó@ÐÜÐ)¨A¨q¨6Ô2äŸ.™.¨°>Ñ)AÓBÐÜÐ*¨Q¨CÔ0ä”Sœ˜s›“_¤sÐ+=Ð@SÑ+SÓ'TÑTÓU€IÜ˜uÔ%×)Ñ)¨)°IÑ*>Ó?€KØ×0Ñ0¸lÐ0ÓK€LÜ�| V¨IÑ%6Õ7r,   c                  ó¨   — t        ddt        j                  t        j                  d   «      id¬«      j                  t        «      } t        | «       y)z4
    Tests that HDBSCAN using `BallTree` works.
    rw   rr   r<   F)rV   rz   r?   N)r   r9   r}   rC   r|   rY   r+   rm   s    r*   Ú!test_hdbscan_best_balltree_metricr–   ×   sA   € ô Ø¨C´·±¼¿¹À¹Ó1DÐ+EÈEôç�k”!ƒnð ô ˜Õr,   c                  ó¤   — t        t        t        «      dz
  d¬«      j                  t        «      } t	        | «      j                  t        «      sJ ‚y)zƒ
    Tests that HDBSCAN correctly does not generate a valid cluster when the
    `min_cluster_size` is too large for the data.
    r<   F©Úmin_cluster_sizer?   N)r   r#   rC   rY   r$   Úissubsetr%   rm   s    r*   Útest_hdbscan_no_clustersr›   á   s;   € ô
 ¤c¬!£f¨q¡j°uÔ=×IÑIÌ!ÓL€FÜˆv‹;×Ñ¤Ô,Ð,Ñ,r,   c                  ó.  — t        dt        t        «      d«      D ]s  } t        | d¬«      j	                  t        «      }|D �cg c]
  }|dk7  sŒ	|‘Œ }}t        |«      dk7  sŒGt        j                  t        j                  |«      «      | k\  rŒsJ ‚ yc c}w )zb
    Test that the smallest non-noise cluster has at least `min_cluster_size`
    many points
    rt   r<   Fr˜   r   r   N)rI   r#   rC   r   rY   r9   ÚminÚbincount)r™   r'   r    Útrue_labelss       r*   Útest_hdbscan_min_cluster_sizer    ê   s€   € ô
 " !¤S¬£V¨QÖ/ÐÜÐ*:ÀÔG×SÑSÔTUÓVˆÙ*0Ó@©& °E¸R³K’u¨&ˆÐ@Üˆ{Ó˜qÓ Ü—6‘6œ"Ÿ+™+ kÓ2Ó3Ð7GÓGÐGÐGñ	 0ùâ@s   Á
BÁBc                  óz   — t         j                  } t        | d¬«      j                  t        «      }t        |«       y)zA
    Tests that HDBSCAN works when passed a callable metric.
    FrU   N)r   Ú	euclideanr   rY   rC   r+   )rV   r'   s     r*   Útest_hdbscan_callable_metricr£   ö   s.   € ô ×Ñ€FÜ˜F¨Ô/×;Ñ;¼AÓ>€FÜ˜Õr,   Útreer   r   c                 ó®   — t        d| d¬«      }d}t        j                  t        |¬«      5  |j	                  t
        «       ddd«       y# 1 sw Y   yxY w)z�
    Tests that HDBSCAN correctly raises an error when passing precomputed data
    while requesting a tree-based algorithm.
    rT   F©rV   rq   r?   z%precomputed is not a valid metric forrW   N)r   rZ   r[   r\   rD   rC   )r¤   rƒ   r_   s      r*   Ú"test_hdbscan_precomputed_non_bruter§   ÿ   s<   € ô ˜°$¸UÔ
C€CØ
1€CÜ	�‰”z¨Ö	-Ø�‰”Œ
÷ 
.×	-Ñ	-ús   ¬AÁAÚcsr_containerc                 óB  — t        d¬«      j                  t        «      j                  }t	        |«        | t        «      }|j                  «       }t        d¬«      j                  |«      j                  }t        ||«       t        j                  dft        j                  dffD ]¨  \  }}t        j                  «       }||d<   t        d¬«      j                  |«      j                  }t	        |«       |d   t        |   d   k(  sJ ‚|j                  «       }||d<   t        d¬«      j                  |«      j                  }t        ||«       Œª d}t        j                  t        |¬	«      5  t        d
dd¬«      j                  |«       ddd«       y# 1 sw Y   yxY w)z¨
    Tests that HDBSCAN works correctly when passing sparse feature data.
    Evaluates correctness by comparing against the same data passed as a dense
    array.
    Fr>   r0   r1   ©r   r   r   r    z4Sparse data matrices only support algorithm `brute`.rW   r¢   r   r¦   N)r   rD   rC   rE   r+   r?   r   r9   rA   rB   r	   rZ   r[   r\   )	r¨   Údense_labelsÚ	_X_sparseÚX_sparseÚsparse_labelsÚoutlier_valr-   ÚX_denser_   s	            r*   Útest_hdbscan_sparser±     sR  € ô  Ô&×*Ñ*¬1Ó-×5Ñ5€LÜ˜Ô%áœaÓ €IØ�~‰~Ó€HÜ Ô'×+Ñ+¨HÓ5×=Ñ=€MÜ�| ]Ô3ô (*§v¡v¨zÐ&:¼R¿V¹VÀYÐ<OÓ%PÑ!ˆ�\Ü—&‘&“(ˆØ#ˆ�‰Ü EÔ*×.Ñ.¨wÓ7×?Ñ?ˆÜ˜LÔ)Ø˜A‰Ô"3°LÑ"AÀ'Ñ"JÒJÐJÐJà—>‘>Ó#ˆØ$ˆ�‰Ü UÔ+×/Ñ/°Ó9×AÑAˆÜ˜<¨Õ7ð &Qð A€CÜ	�‰”z¨Ö	-Ü�{¨kÀÔF×JÑJÈ8ÔT÷ 
.×	-Ñ	-ús   Å.FÆFrq   c                 óÖ  — ddg}t        dd|d¬«      \  }}t        dd¬	«      j                  |«      }t        ||j                  |j
                  «      D ]$  \  }}}t        ||d
d¬«       t        ||d
d¬«       Œ& t        | dt        j                  d   d¬«      j                  t        «      }|j                  j                  d   dk(  sJ ‚|j
                  j                  d   dk(  sJ ‚y)zj
    Tests that HDBSCAN centers are calculated and stored properly, and are
    accurate to the data.
    )rd   rd   )ç      @r³   iÐ  r   rŒ   )r   r   ÚcentersÚcluster_stdÚbothF)Ústore_centersr?   r<   gš™™™™™©?)ÚrtolÚatol)rq   r·   r™   r?   N)	r
   r   rD   ÚzipÚ
centroids_Úmedoids_r   rC   r|   )rq   r´   ÚHÚ_rƒ   ÚcenterÚcentroidÚmedoids           r*   Útest_hdbscan_centersrÂ   .  sã   € ð ˜:Ð&€GÜ °1¸gÐSVÔW�D€A€qÜ
 ¨UÔ
3×
7Ñ
7¸Ó
:€Cä$'¨°·±ÀÇÁÖ$NÑ ˆ�˜&Ü˜ ¨q°tÕ<Ü˜ ¨Q°TÖ:ð %Oô
 ØØÜŸ™ ™Øô	÷
 
�cŒ!ƒfð ð �>‰>×Ñ Ñ" aÒ'Ð'Ð'Ø�<‰<×Ñ˜aÑ  AÒ%Ð%Ñ%r,   c                  óÀ  — t         j                  j                  d«      } | j                  dd«      }t	        ddddd¬	«      j                  |«      }t        j                  |d¬
«      \  }}t        |«      dk(  sJ ‚||dk(     dkD  sJ ‚t	        dddddd¬«      j                  |«      }t        j                  |d¬
«      \  }}t        |«      dk(  sJ ‚||dk(     dk(  sJ ‚y)zS
    Tests that HDBSCAN single-cluster selection with epsilon works correctly.
    r   é–   rt   r=   rd   ÚeomTF)r™   Úcluster_selection_epsilonÚcluster_selection_methodÚallow_single_clusterr?   )Úreturn_countsr   é   g
×£p=
Ç?r   )r™   rÆ   rÇ   rÈ   rq   r?   N)r9   ÚrandomÚRandomStateÚrandr   rY   Úuniquer#   )ÚrngÚno_structurer'   Úunique_labelsÚcountss        r*   Ú.test_hdbscan_allow_single_cluster_with_epsilonrÓ   G  s  € ô �)‰)×
Ñ
 Ó
"€CØ—8‘8˜C Ó#€LäØØ"%Ø!&Ø!Øô÷ �k�,Óð ô ŸI™I f¸DÔAÑ€M�6Üˆ}Ó Ò"Ð"Ð"ð �- 2Ñ%Ñ&¨Ò+Ð+Ð+ô ØØ"&Ø!&Ø!ØØô÷ �k�,Óð ô ŸI™I f¸DÔAÑ€M�6Üˆ}Ó Ò"Ð"Ð"Ø�- 2Ñ%Ñ&¨!Ò+Ð+Ñ+r,   c                  ó  — ddgddgddgddgg} t        d| g d¢d¬«      \  }}t        d	¬
«      j                  |«      j                  }t	        t        |«      «      t        d|v «      z
  }|dk(  sJ ‚t        ||«      dkD   y)zœ
    Validate that HDBSCAN can properly cluster this difficult synthetic
    dataset. Note that DBSCAN fails on this (see HDBSCAN plotting
    example)
    g333333ë¿g333333ë?r"   éýÿÿÿiî  )çš™™™™™É?gffffffÖ?çš™™™™™õ?r×   r   )r   r´   rµ   r   Fr>   r   é   ç®Gáz®ï?N)r
   r   rD   rE   r#   r$   Úintr   )r´   rC   r&   r'   r)   s        r*   Útest_hdbscan_better_than_dbscanrÛ   j  s�   € ð �uˆ~  t˜}¨q°!¨f°q¸"°gÐ>€GÜØØÚ+Øô	�D€A€qô ˜%Ô ×$Ñ$ QÓ'×/Ñ/€Fä”S˜“[Ó!¤C¨¨f¨Ó$5Ñ5€JØ˜Š?Ðˆ?Ü˜& !Ó$ tÓ+r,   z	kwargs, XrT   r<   rt   r"   rØ   c                 ó>   — t        ddddœ|¤Žj                  | «       y)zo
    Tests that HDBSCAN works correctly for array-likes and precomputed inputs
    with non-finite points.
    r<   F©Úmin_samplesr?   Nr4   )r   rD   )rC   Úkwargss     r*   Útest_hdbscan_usable_inputsrà   ~  s!   € ô Ð0˜ Ñ0¨Ñ0×4Ñ4°QÕ7r,   c                 óÖ   —  | t        j                  d«      «      }d}t        j                  t        |¬«      5  t        dd¬«      j                  |«       ddd«       y# 1 sw Y   yxY w)zd
    Tests that HDBSCAN raises the correct error when there are too few
    non-zero distances.
    )r   r   z#There exists points with fewer thanrW   rT   FrU   N)r9   ÚzerosrZ   r[   r\   r   rD   ©r¨   rC   r_   s      r*   Ú-test_hdbscan_sparse_distances_too_few_nonzerorä   Ž  sK   € ñ 	”b—h‘h˜xÓ(Ó)€Aà
/€CÜ	�‰”z¨Ö	-Ü�}¨5Ô1×5Ñ5°aÔ8÷ 
.×	-Ñ	-ús   ¹AÁA(c                 ó$  — t        j                  d«      }d|dd…dd…f<   d|dd…dd…f<   ||j                  z   } | |«      }d}t        j                  t
        |¬«      5  t        dd	¬
«      j                  |«       ddd«       y# 1 sw Y   yxY w)zu
    Tests that HDBSCAN raises the correct error when the distance matrix
    has multiple connected components.
    )é   ræ   r<   Nr=   é   z3HDBSCAN cannot be performed on a disconnected graphrW   rT   FrU   )r9   râ   ÚTrZ   r[   r\   r   rD   rã   s      r*   Ú0test_hdbscan_sparse_distances_disconnected_graphré   ›  sƒ   € ô 	�‰�Ó€AØ€A€b€q€bˆ"ˆ1ˆ"€f�IØ€A€a�bˆ"‰#€g�JØ	ˆA�C‰C‰€AÙ�aÓ€AØ
?€CÜ	�‰”z¨Ö	-Ü�}¨5Ô1×5Ñ5°aÔ8÷ 
.×	-Ñ	-ús   Á BÂBc                  ó�  — d„ } d}t        j                  t        |¬«      5  t        d| d¬«      j	                  t
        «       ddd«       t        j                  t        |¬«      5  t        d| d¬«      j	                  t
        «       ddd«       t        t        t        j                  «      t        t        j                  «      z
  «      }t        |«      d	kD  rIt        j                  t        |¬«      5  t        d|d	   d¬«      j	                  t
        «       ddd«       yy# 1 sw Y   ŒâxY w# 1 sw Y   Œ©xY w# 1 sw Y   yxY w)
zR
    Tests that HDBSCAN correctly raises an error for invalid metric choices.
    c                 ó   — | S r3   r4   )r6   s    r*   r7   z2test_hdbscan_tree_invalid_metric.<locals>.<lambda>°  s   € ¡r,   zV.* is not a valid metric for a .*-based algorithm\. Please select a different metric\.rW   r   F)rq   rV   r?   Nr   r   )rZ   r[   r\   r   rD   rC   rH   r$   r   r   r   r#   )Úmetric_callabler_   Úmetrics_not_kds      r*   Ú test_hdbscan_tree_invalid_metricrî   ¬  sî   € ñ "€Oð	ð ô 
�‰”z¨Ö	-Ü˜)¨OÀ%ÔH×LÑLÌQÔO÷ 
.ä	�‰”z¨Ö	-Ü˜+¨oÀEÔJ×NÑNÌqÔQ÷ 
.ô
 œ#œh×4Ñ4Ó5¼¼F×<PÑ<PÓ8QÑQÓR€NÜ
ˆ>Ó˜QÒÜ�]‰]œ:¨SÖ1Ü˜i°¸qÑ0AÈÔN×RÑRÔSTÔU÷ 2Ð1ð ÷ 
.Ð	-úç	-Ð	-ú÷ 2Ð1ús#   ¡"D$Á&"D0Ã5%D<Ä$D-Ä0D9Ä<Ec                  óÌ   — t        t        t        «      dz   d¬«      } d}t        j                  t
        |¬«      5  | j                  t        «       ddd«       y# 1 sw Y   yxY w)zx
    Tests that HDBSCAN correctly raises an error when setting `min_samples`
    larger than the number of samples.
    r<   FrÝ   z min_samples (.*) must be at mostrW   N)r   r#   rC   rZ   r[   r\   rD   )rƒ   r_   s     r*   Ú!test_hdbscan_too_many_min_samplesrð   Ä  sB   € ô
 œc¤!›f q™j¨uÔ
5€CØ
-€CÜ	�‰”z¨Ö	-Ø�‰”Œ
÷ 
.×	-Ñ	-ús   »AÁA#c                  óò   — t         j                  «       } t        j                  | d<   d}t	        dd¬«      }t        j                  t        |¬«      5  |j                  | «       ddd«       y# 1 sw Y   yxY w)zu
    Tests that HDBSCAN correctly raises an error when providing precomputed
    distances with `np.nan` values.
    rª   z(np.nan values found in precomputed-denserT   FrU   rW   N)	rC   r?   r9   rB   r   rZ   r[   r\   rD   )ÚX_nanr_   rƒ   s      r*   Ú"test_hdbscan_precomputed_dense_nanró   Ï  sR   € ô
 �F‰F‹H€EÜ—&‘&€Eˆ$�KØ
4€CÜ
˜¨UÔ
3€CÜ	�‰”z¨Ö	-Ø�‰�Œ÷ 
.×	-Ñ	-ús   ÁA-Á-A6rÈ   TFÚepsilonr‹   c                 óT  — d}t        || ddgddgddgg¬«      \  }}t        d¬«      j                  |«      }t        |j                  |j
                  ¬«      }|dz   |d	z   |d
z   h}|dz   d|d	z   d|d
z   di}	t        |||	||¬«      }
t        t        |«      «      D �ci c]!  }|t        j                  ||k(  «      d   d   “Œ# }}t        t        |«      «      D �ci c]  }||
||      “Œ }} t        j                  |j                  «      |«      }t        |
|«       yc c}w c c}w )zR
    Tests that the `_do_labelling` helper function correctly assigns labels.
    é0   r   r   )r   r´   Fr>   ©r™   rt   r"   rØ   r<   ©Úcondensed_treeÚclustersÚcluster_label_maprÈ   rÆ   N)r
   r   rD   r   Ú_single_linkage_tree_r™   r   rH   r$   r9   ÚwhereÚ	vectorizer~   r   )Úglobal_random_seedrÈ   rô   r   rC   r&   Úestrù   rú   rû   r'   Ú_yÚfirst_with_labelÚy_to_labelsÚaligned_targets                  r*   Útest_labelling_distinctr  Ü  sQ  € ð €IÜØØ'ð �ˆFØ�ˆGØ�ˆGð
ô		�D€A€qô �uÔ
×
!Ñ
! !Ó
$€CÜ#Ø×!Ñ!°C×4HÑ4Hô€Nð ˜A‘˜y¨1™}¨i¸!©mÐ<€HØ" Q™¨¨9°q©=¸!¸YÈ¹]ÈAÐNÐÜØ%ØØ+Ø1Ø")ô€Fô ?CÄ3ÀqÃ6¼lÓK¹l¸˜œBŸH™H Q¨"¡WÓ-¨aÑ0°Ñ3Ñ3¸lÐÐKÜ>BÄ3ÀqÃ6¼lÓK¹l¸�2�vÐ.¨rÑ2Ñ3Ñ3¸l€KÐKØ2”R—\‘\ +§/¡/Ó2°1Ó5€NÜ�v˜~Õ.ùò LùÚKs   Â&D ÃD%c                  óL  — d} d}t        j                  dd|dfddd|dfddgt        ¬	«      }t        || h| d| dz   did
d¬«      }|d   dk  }t	        |«      t	        |dk(  «      k(  sJ ‚t        || h| d| dz   did
d¬«      }|d   |k  }t	        |«      t	        |dk(  «      k(  sJ ‚y)zž
    Tests that the `_do_labelling` helper function correctly thresholds the
    incoming lambda values given various `cluster_selection_epsilon` values.
    r=   g      ø?rt   r<   )r=   r<   r‹   r<   r   )r=   r"   rÖ   r<   )r=   rØ   r†   r<   )ÚdtypeTrø   Úvaluer   N)r9   Úarrayr   r   Úsum)r   Ú
MAX_LAMBDArù   r'   Ú	num_noises        r*   Útest_labelling_thresholdingr    sñ   € ð
 €IØ€JÜ—X‘Xà��:˜qÐ!ØØ��:˜qÐ!ØØð	
ô ô	€Nô Ø%Ø�Ø$ a¨°Q©¸Ð:Ø!Ø"#ô€Fð ˜wÑ'¨!Ñ+€IÜˆy‹>œS ¨2¡Ó.Ò.Ð.Ð.äØ%Ø�Ø$ a¨°Q©¸Ð:Ø!Ø"#ô€Fð ˜wÑ'¨*Ñ4€IÜˆy‹>œS ¨2¡Ó.Ò.Ð.Ñ.r,   r·   rÀ   rÁ   c                 ó  — t         j                  j                  d«      }|j                  d«      }t        |«      }d}t	        j
                  t        |¬«      5  t        d| d¬«      j                  |«       ddd«       y# 1 sw Y   yxY w)	zÈCheck that we raise an error if the centers are requested together with
    a precomputed input matrix.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/27893
    r   ©éd   rt   z>Cannot store centers when using a precomputed distance matrix.rW   rT   F)rV   r·   r?   N)	r9   rË   rÌ   r   rZ   r[   r\   r   rD   )r·   rÏ   rC   ÚX_distÚerr_msgs        r*   Ú0test_hdbscan_error_precomputed_and_store_centersr  +  sk   € ô �)‰)×
Ñ
 Ó
"€CØ�
‰
�8Ó€AÜ  Ó#€FØN€GÜ	�‰”z¨Ö	1ÜØ Ø'Øô	
÷ ‰#ˆfŒ+÷ 
2×	1Ñ	1ús   ÁB Â B	Ú
valid_algor   r   c                 óF   — t        d| d¬«      j                  t        «       y)z“Test that HDBSCAN works with the "cosine" metric when the algorithm is set
    to "brute" or "auto".

    Non-regression test for issue #28631
    ÚcosineFr¦   N)r   rY   rC   )r  s    r*   Ú*test_hdbscan_cosine_metric_valid_algorithmr  ?  s   € ô �8 z¸Ô>×JÑJÌ1ÕMr,   Úinvalid_algoc                 óª   — t        d| d¬«      }t        j                  t        d¬«      5  |j	                  t
        «       ddd«       y# 1 sw Y   yxY w)z€Test that HDBSCAN raises an informative error is raised when an unsupported
    algorithm is used with the "cosine" metric.
    r  Fr¦   zcosine is not a valid metricrW   N)r   rZ   r[   r\   rY   rC   )r  Úhdbscans     r*   Ú,test_hdbscan_cosine_metric_invalid_algorithmr  I  s<   € ô
 ˜X°ÀEÔJ€GÜ	�‰”zÐ)GÖ	HØ×ÑœAÔ÷ 
I×	HÑ	Hús   ªA	Á	Ac                  óþ   — t         j                  j                  d«      j                  d«      } d}t        j                  t
        |¬«      5  t        d¬«      }|j                  | «       ddd«       y# 1 sw Y   yxY w)z\
    Test that HDBSCAN raises a FutureWarning when the `copy`
    parameter is not set.
    r   r  zCThe default value of `copy` will change from False to True in 1.10.rW   ræ   r÷   N)r9   rË   rÌ   rZ   r€   r�   r   rD   )rC   r_   rƒ   s      r*   Ú!test_hdbscan_default_copy_warningr  T  sW   € ô
 	�	‰	×Ñ˜aÓ ×'Ñ'¨Ó1€AØ
P€CÜ	�‰”m¨3Ö	/Ü rÔ*ˆØ�‰�Œ
÷ 
0×	/Ñ	/ús   ÁA3Á3A<)rÙ   )KÚ__doc__Únumpyr9   rZ   Úscipyr   Úscipy.spatialr   Úsklearn.clusterr   Úsklearn.cluster._hdbscan._treer   r   r   Ú sklearn.cluster._hdbscan.hdbscanr	   Úsklearn.datasetsr
   Úsklearn.metricsr   Úsklearn.metrics.pairwiser   r   Úsklearn.neighborsr   r   Úsklearn.preprocessingr   Úsklearn.utilsr   Úsklearn.utils._testingr   r   Úsklearn.utils.fixesr   r   rC   r&   Úfit_transformÚ
ALGORITHMSÚitemsr%   r+   ÚmarkÚparametrizerR   r`   rk   rn   r„   r‰   r”   r–   r›   r    r£   r§   r±   rÂ   rÓ   rÛ   r	  rA   rà   rä   ré   rî   rð   ró   r  r  r  r  r  r  )r¾   Úouts   00r*   Ú<module>r3     sÚ  ðñó
 Û Ý Ý "å #÷ñ õ
 ?Ý 'Ý 1ß Hß .Ý 0Ý !ß Fß >á˜C¨bÔ1�€€1Ùˆq�! !Ô$�€€1ÙÓ×"Ñ" 1Ó%€ò€
ð ˆdÐ1HÐ1B×1HÑ1HÔ1JÔKÑ1J¡v q¨#�c˜'“lÐ1JÒKÑK€ó8ð ‡�×Ñ˜Ð):Ó;ñJó <ðJò>Að0 ‡�×ÑÐ-Ð/Q°Ð/QÀ.Ð/QÓRñ ó Sð ò"	 ð ‡�×Ñ˜ Ó,Ø‡�×Ñ˜ >Ó2ñ%ó 3ó -ð%òP
0ð ‡�×Ñ˜¨Ó7ñ8ó 8ð8ò4 ò-ò	Hò ð ‡�×Ñ˜ )¨[Ð!9Ó:ñó ;ðð ‡�×Ñ˜¨.Ó9ñUó :ðUðD ‡�×Ñ˜ jÓ1ñ&ó 2ð&ò0 ,òF,ð( ‡�×ÑØà
�MÐ	" H B§H¡H¨q°"·&±&¨k¸B¿F¹FÀA¸;Ð-GÓ$HÐIØ
�MÐ	" a¨ V¨a°¨VÐ$4Ð5Ø	ˆq�!ˆf�q˜!�fÐÐðóñ8óð8ð ‡�×Ñ˜¨.Ó9ñ	9ó :ð	9ð ‡�×Ñ˜¨.Ó9ñ9ó :ð9ò Vò0ò
ð ‡�×ÑÐ/°$¸°Ó?Ø‡�×Ñ˜ Q¨ HÓ-ñ!/ó .ó @ð!/òH&/ðR ‡�×Ñ˜¨:°xÐ*@ÓAñó Bðð& ‡�×Ñ˜¨°Ð'8Ó9ñNó :ðNð ‡�×Ñ˜¨)°[Ð)AÓBñó Cðó	ùó] Ls   Â0M!