§
    ¨éUgÑN  ã            	       óê  — 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¦   «          &                    e$¦  «        Z$g d¢Z'dhd„  ej(        ¦   «         D ¦   «         z  Z)dSd„Z*ej+         ,                    de¦  «        d„ ¦   «         Z-d„ Z.ej+         ,                    dg e#¢e"¢¦  «        d„ ¦   «         Z/d„ Z0ej+         ,                    d e'¦  «        ej+         ,                    d!e¦  «        d"„ ¦   «         ¦   «         Z1d#„ Z2ej+         ,                    d$d%¦  «        d&„ ¦   «         Z3d'„ Z4d(„ Z5d)„ Z6d*„ Z7ej+         ,                    d+d,d-g¦  «        d.„ ¦   «         Z8ej+         ,                    d/e#¦  «        d0„ ¦   «         Z9ej+         ,                    d1e'¦  «        d2„ ¦   «         Z:d3„ Z;d4„ Z<ej+         ,                    d5d!d6i ej=        d7ej>        gej>        d7gg¦  «        fd!d6id7d8gd8d7ggfi d7d8gd9d:ggfg¦  «        d;„ ¦   «         Z?ej+         ,                    d/e#¦  «        d<„ ¦   «         Z@ej+         ,                    d/e#¦  «        d=„ ¦   «         ZAd>„ ZBd?„ ZCd@„ ZDej+         ,                    dAdBdCg¦  «        ej+         ,                    dDddEg¦  «        dF„ ¦   «         ¦   «         ZEdG„ ZFdH„ ZGej+         ,                    dIdJdKg¦  «        dL„ ¦   «         ZHej+         ,                    dMdNdOg¦  «        dP„ ¦   «         ZIej+         ,                    dQd,d-g¦  «        dR„ ¦   «         ZJdS )TzF
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éÿÿÿÿc                 ó$   — h | ]\  }}|d          ’ŒS )Úlabel© )Ú.0Ú_Úouts      úa/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/cluster/tests/test_hdbscan.pyú	<setcomp>r'   &   s    € ÐKÐKÐK¡v q¨#�c˜'”lÐKÐKÐKó    ç®Gáz®ï?c                 ó”   — t          t          | ¦  «        t          z
  ¦  «        }|dk    sJ ‚t          | t          ¦  «        |k    sJ ‚d S )Né   )ÚlenÚsetÚOUTLIER_SETr   Úy)ÚlabelsÚ	thresholdÚ
n_clusterss      r&   Úcheck_label_qualityr3   )   sH   € Ý•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ˜Š?ˆ?ˆ?ˆ?Ý  ­Ñ+Ô+¨iÒ7Ð7Ð7Ð7Ð7Ð7r(   Úoutlier_typec                 ó  — t           j        t           j        dœ|          }d„ d„ dœ|          }t          |          d         }t          |          d         }t                               ¦   «         }|dg|d<   ||g|d<   t          ¦   «                              |¦  «        }|j        |k     	                    ¦   «         \  }t          |ddg¦  «          ||j        |¦  «         	                    ¦   «         \  }t          |ddg¦  «         t          t          dd¦  «        ¦  «        t          t          d	d
¦  «        ¦  «        z   }	t          ¦   «                              ||	         ¦  «        }
t          |
j        |j        |	         ¦  «         dS )úO
    Tests if np.inf and np.nan data are each treated as special outliers.
    )ÚinfiniteÚmissingc                 ó   — | |k    S ©Nr"   ©Úxr/   s     r&   ú<lambda>z#test_outlier_data.<locals>.<lambda>9   s
   €   a¢€ r(   c                 ó*   — t          j        | ¦  «        S r:   )ÚnpÚisnanr;   s     r&   r=   z#test_outlier_data.<locals>.<lambda>:   s   € ¥¤¨¡¤€ r(   r!   Úprobé   r   é   é   r   N)r?   ÚinfÚnanr	   ÚXÚcopyr   ÚfitÚlabels_Únonzeror   Úprobabilities_ÚlistÚrange)r4   ÚoutlierÚ
prob_checkr!   rA   Ú	X_outlierÚmodelÚmissing_labels_idxÚmissing_probs_idxÚclean_indicesÚclean_models              r&   Útest_outlier_datarW   /   ss  € õ ”FÝ”6ðð ð ô€Gð
 (Ð'Ø+Ð+ðð ð ô€Jõ ˜lÔ+¨GÔ4€EÝ˜\Ô*¨6Ô2€Då—’‘”€IØ˜Q�<€Iˆa�LØ˜WÐ%€Iˆa�LÝ‰IŒI�MŠM˜)Ñ$Ô$€Eà"œ]¨eÒ3×<Ò<Ñ>Ô>ÑÐÝÐ)¨A¨q¨6Ñ2Ô2Ð2à&˜J uÔ';¸TÑBÔB×KÒKÑMÔMÑÐÝÐ(¨1¨a¨&Ñ1Ô1Ð1å�˜q !™œÑ%Ô%­­U°1°c©]¬]Ñ(;Ô(;Ñ;€MÝ‘)”)—-’- 	¨-Ô 8Ñ9Ô9€KÝ�{Ô*¨E¬M¸-Ô,HÑIÔIÐIÐIÐIr(   c                  ó^  — t          t          ¦  «        } |                      ¦   «         }t          dd¬¦  «                             | ¦  «        }t          | |¦  «         t          |¦  «         d}t          j        t          |¬¦  «        5  t          dd¬¦  «                             t          ¦  «         ddd¦  «         n# 1 swxY w Y   d}d| d	<   d
| d<   t          j        t          |¬¦  «        5  t          d¬¦  «                             | ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zy
    Tests that HDBSCAN works with precomputed distance matrices, and throws the
    appropriate errors when needed.
    ÚprecomputedT)ÚmetricrH   z*The precomputed distance matrix.*has shape©ÚmatchNz'The precomputed distance matrix.*valuesr   )r   rB   rB   )rB   r   ©rZ   )
r   rG   rH   r   Úfit_predictr   r3   ÚpytestÚraisesÚ
ValueError)ÚDÚ
D_originalr0   Úmsgs       r&   Útest_hdbscan_distance_matrixre   O   s®  € õ
 	�AÑÔ€AØ—’‘”€JÝ˜M°Ð5Ñ5Ô5×AÒAÀ!ÑDÔD€Få�A�zÑ"Ô"Ð"Ý˜ÑÔÐà
7€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð @ð @Ý�}¨4Ð0Ñ0Ô0×<Ò<½QÑ?Ô?Ð?ð@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð 5€Cà€A€d�GØ€A€d�GÝ	Œ•z¨Ð	-Ñ	-Ô	-ð 5ð 5Ý�}Ð%Ñ%Ô%×1Ò1°!Ñ4Ô4Ð4ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð 5ð 5s$   Â	*B?Â?CÃCÃ1$D"Ä"D&Ä)D&Úsparse_constructorc                 óŒ  — t          j        t          j        t          ¦  «        ¦  «        }|t	          j        |¦  «        z  }t          j        |                     ¦   «         d¦  «        }d|||k    <    | |¦  «        }| 	                    ¦   «          t          d¬¦  «                             |¦  «        }t          |¦  «         dS )zA
    Tests that HDBSCAN works with sparse distance matrices.
    é2   ç        rY   r]   N)r   Ú
squareformÚpdistrG   r?   Úmaxr   ÚscoreatpercentileÚflattenÚeliminate_zerosr   r^   r3   )rf   rb   r1   r0   s       r&   Ú#test_hdbscan_sparse_distance_matrixrp   g   s«   € õ
 	Ô�HœN­1Ñ-Ô-Ñ.Ô.€AØ�Œ�‰Œ�N€AåÔ'¨¯	ª	©¬°RÑ8Ô8€Ià€A€aˆ9‚nÑØÐ˜1ÑÔ€AØ×ÒÑÔÐå˜MÐ*Ñ*Ô*×6Ò6°qÑ9Ô9€FÝ˜ÑÔÐÐÐr(   c                  óp   — t          ¦   «                              t          ¦  «        } t          | ¦  «         dS )z“
    Tests that HDBSCAN works with feature array, including an arbitrary
    goodness of fit check. Note that the check is a simple heuristic.
    N)r   r^   rG   r3   ©r0   s    r&   Útest_hdbscan_feature_arrayrs   y   s1   € õ
 ‰YŒY×"Ò"¥1Ñ%Ô%€Fõ ˜ÑÔÐÐÐr(   ÚalgorZ   c                 ól  — t          | ¬¦  «                             t          ¦  «        }t          |¦  «         | dv rdS 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
œ 
                    |d¦  «        }t          | ||¬¦  «        }|||          j        vrNt          j        t          ¦  «        5  |                     t          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS |dk    rNt          j        t"          ¦  «        5  |                     t          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS |                     t          ¦  «         dS )z
    Tests that HDBSCAN works with the expected combinations of algorithms and
    metrics, or raises the expected errors.
    ©Ú	algorithm)r   r   N)r   r   ÚVrB   Úpé   )ry   Úw)ÚmahalanobisÚ
seuclideanÚ	minkowskiÚ
wminkowski)rw   rZ   Úmetric_paramsr   )r   r^   rG   r3   r   r   r?   ÚeyeÚshapeÚonesÚgetÚvalid_metricsr_   r`   ra   rI   ÚwarnsÚFutureWarning)rt   rZ   r0   ÚALGOS_TREESr€   Úhdbs         r&   Útest_hdbscan_algorithmsrŠ   …   s%  € õ ˜tÐ$Ñ$Ô$×0Ò0µÑ3Ô3€FÝ˜ÑÔÐð Ð Ð Ð Øˆõ Ýðð €Kð
 �RœV¥A¤G¨A¤JÑ/Ô/Ð0Ø�BœG¥A¤G¨A¤JÑ/Ô/Ð0Ø˜1�XØ¥B¤G­A¬G°A¬JÑ$7Ô$7Ð8Ð8ð	ð ÷
 
‚cˆ&�$ÑÔð õ ØØØ#ðñ ô €Cð �[ Ô&Ô4Ð4Ð4ÝŒ]�:Ñ&Ô&ð 	ð 	Ø�GŠG•A‰JŒJˆJð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	à	�<Ò	Ð	ÝŒ\�-Ñ(Ô(ð 	ð 	Ø�GŠG•A‰JŒJˆJð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	�Š•‰
Œ
ˆ
ˆ
ˆ
s$   ÄD9Ä9D=Å D=Å%FÆFÆFc                  óž   — t          ¦   «                              t          ¦  «        } |                      d¦  «        }t	          |d¬¦  «         dS )z˜
    Tests that HDBSCAN can generate a sufficiently accurate dbscan clustering.
    This test is more of a sanity check than a rigorous evaluation.
    ç333333Ó?gq=
×£pí?)r1   N)r   rI   rG   Údbscan_clusteringr3   )Ú	clustererr0   s     r&   Útest_dbscan_clusteringr�   ®   sG   € õ
 ‘	”	—’�aÑ Ô €IØ×(Ò(¨Ñ-Ô-€Fõ ˜¨$Ð/Ñ/Ô/Ð/Ð/Ð/r(   Úcut_distance)çš™™™™™¹?ç      à?rB   c                 ó0  — t           d         d         }t           d         d         }t                               ¦   «         }t          j        dg|d<   dt          j        g|d<   t          j        t          j        g|d<   t          ¦   «                              |¦  «        }|                     | ¬¦  «        }t          j	        ||k    ¦  «        }t          |ddg¦  «         t          j	        ||k    ¦  «        }t          |dg¦  «         t          t          t          d	¦  «        ¦  «        t          ||z   ¦  «        z
  ¦  «        }t          ¦   «                              ||         ¦  «        }	|	                     | ¬¦  «        }
t          |
||         ¦  «         d
S )r6   r8   r!   r7   rB   r   rz   rC   )r�   r   N)r	   rG   rH   r?   rE   rF   r   rI   r�   Úflatnonzeror   rM   r-   rN   )r�   Úmissing_labelÚinfinite_labelrQ   rR   r0   rS   Úinfinite_labels_idxÚ	clean_idxrV   Úclean_labelss              r&   Ú#test_dbscan_clustering_outlier_datarš   »   sT  € õ
 & iÔ0°Ô9€MÝ& zÔ2°7Ô;€Nå—’‘”€IÝ”F˜A�;€Iˆa�LØ•r”v�;€Iˆa�LÝ”F�BœFÐ#€Iˆa�LÝ‰IŒI�MŠM˜)Ñ$Ô$€EØ×$Ò$°,Ð$Ñ?Ô?€Fåœ¨°-Ò(?Ñ@Ô@ÐÝÐ)¨A¨q¨6Ñ2Ô2Ð2åœ.¨°>Ò)AÑBÔBÐÝÐ*¨Q¨CÑ0Ô0Ð0å•S�˜s™œ‘_”_¥sÐ+=Ð@SÑ+SÑ'TÔ'TÑTÑUÔU€IÝ‘)”)—-’- 	¨)Ô 4Ñ5Ô5€KØ×0Ò0¸lÐ0ÑKÔK€LÝ�| V¨IÔ%6Ñ7Ô7Ð7Ð7Ð7r(   c                  ó¾   — t          ddt          j        t          j        d         ¦  «        i¬¦  «                             t          ¦  «        } t          | ¦  «         dS )z4
    Tests that HDBSCAN using `BallTree` works.
    r}   rx   rB   )rZ   r€   N)r   r?   rƒ   rG   r‚   r^   r3   rr   s    r&   Ú!test_hdbscan_best_balltree_metricrœ   Ö   sV   € õ Ø¨Cµ´½¼À¼Ñ1DÔ1DÐ+Eðñ ô ç‚k•!�n„nð õ ˜ÑÔÐÐÐr(   c                  óÒ   — t          t          t          ¦  «        dz
  ¬¦  «                             t          ¦  «        } t	          | ¦  «                             t          ¦  «        sJ ‚dS )zƒ
    Tests that HDBSCAN correctly does not generate a valid cluster when the
    `min_cluster_size` is too large for the data.
    rB   ©Úmin_cluster_sizeN)r   r,   rG   r^   r-   Úissubsetr.   rr   s    r&   Útest_hdbscan_no_clustersr¡   à   sR   € õ
 ¥c­!¡f¤f¨q¡jÐ1Ñ1Ô1×=Ò=½aÑ@Ô@€FÝˆv‰;Œ;×Ò¥Ñ,Ô,Ð,Ð,Ð,Ð,Ð,r(   c                  ó8  — t          dt          t          ¦  «        d¦  «        D ]u} t          | ¬¦  «                             t          ¦  «        }d„ |D ¦   «         }t          |¦  «        dk    r,t          j        t          j        |¦  «        ¦  «        | k    sJ ‚ŒvdS )zb
    Test that the smallest non-noise cluster has at least `min_cluster_size`
    many points
    rz   rB   rž   c                 ó   — g | ]
}|d k    ¯|‘ŒS )r   r"   )r#   r!   s     r&   ú
<listcomp>z1test_hdbscan_min_cluster_size.<locals>.<listcomp>ð   s   € Ð@Ð@Ð@ °E¸R²K°K�u°K°K°Kr(   r   N)rN   r,   rG   r   r^   r?   ÚminÚbincount)rŸ   r0   Útrue_labelss      r&   Útest_hdbscan_min_cluster_sizer¨   é   s    € õ
 " !¥S­¡V¤V¨QÑ/Ô/ð Hð HÐÝÐ*:Ð;Ñ;Ô;×GÒGÍÑJÔJˆØ@Ð@¨&Ð@Ñ@Ô@ˆÝˆ{ÑÔ˜qÒ Ð Ý”6�"œ+ kÑ2Ô2Ñ3Ô3Ð7GÒGÐGÐGÐGøð	Hð Hr(   c                  óŒ   — t           j        } t          | ¬¦  «                             t          ¦  «        }t          |¦  «         dS )zA
    Tests that HDBSCAN works when passed a callable metric.
    r]   N)r   Ú	euclideanr   r^   rG   r3   )rZ   r0   s     r&   Útest_hdbscan_callable_metricr«   õ   s>   € õ Ô€FÝ˜FÐ#Ñ#Ô#×/Ò/µÑ2Ô2€FÝ˜ÑÔÐÐÐr(   Útreer   r   c                 óÈ   — t          d| ¬¦  «        }d}t          j        t          |¬¦  «        5  |                     t
          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z�
    Tests that HDBSCAN correctly raises an error when passing precomputed data
    while requesting a tree-based algorithm.
    rY   ©rZ   rw   z%precomputed is not a valid metric forr[   N)r   r_   r`   ra   rI   rG   )r¬   r‰   rd   s      r&   Ú"test_hdbscan_precomputed_non_bruter¯   þ   s£   € õ ˜°$Ð
7Ñ
7Ô
7€CØ
1€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð ð Ø�Š•‰
Œ
ˆ
ðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ¯AÁAÁAÚcsr_containerc                 ó¨  — t          ¦   «                              t          ¦  «        j        }t	          |¦  «          | t          ¦  «        }|                     ¦   «         }t          ¦   «                              |¦  «        j        }t          ||¦  «         t          j        dft          j	        dffD ]Æ\  }}t                               ¦   «         }||d<   t          ¦   «                              |¦  «        j        }t	          |¦  «         |d         t          |         d         k    sJ ‚|                     ¦   «         }||d<   t          ¦   «                              |¦  «        j        }t          ||¦  «         ŒÇd}t          j        t          |¬¦  «        5  t          dd	¬
¦  «                             |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z¨
    Tests that HDBSCAN works correctly when passing sparse feature data.
    Evaluates correctness by comparing against the same data passed as a dense
    array.
    r7   r8   ©r   r   r   r!   z4Sparse data matrices only support algorithm `brute`.r[   rª   r   r®   N)r   rI   rG   rJ   r3   rH   r   r?   rE   rF   r	   r_   r`   ra   )	r°   Údense_labelsÚ	_X_sparseÚX_sparseÚsparse_labelsÚoutlier_valr4   ÚX_denserd   s	            r&   Útest_hdbscan_sparser¹   
  së  € õ ‘9”9—=’=¥Ñ#Ô#Ô+€LÝ˜Ñ%Ô%Ð%à��aÑ Ô €IØ�~Š~ÑÔ€HÝ‘I”I—M’M (Ñ+Ô+Ô3€MÝ�| ]Ñ3Ô3Ð3õ (*¤v¨zÐ&:½R¼VÀYÐ<OÐ%Pð 
8ð 
8Ñ!ˆ�\Ý—&’&‘(”(ˆØ#ˆ�‰Ý‘y”y—}’} WÑ-Ô-Ô5ˆÝ˜LÑ)Ô)Ð)Ø˜AŒÕ"3°LÔ"AÀ'Ô"JÒJÐJÐJÐJà—>’>Ñ#Ô#ˆØ$ˆ�‰Ý™	œ	Ÿš hÑ/Ô/Ô7ˆÝ˜<¨Ñ7Ô7Ð7Ð7à
@€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð Ið IÝ�{¨kÐ:Ñ:Ô:×>Ò>¸xÑHÔHÐHðIð Ið Iñ Iô Ið Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Ið Ið Is   Æ%GÇGÇGrw   c                 óä  — ddg}t          dd|d¬¦  «        \  }}t          d¬¦  «                             |¦  «        }t          ||j        |j        ¦  «        D ],\  }}}t          ||d	d
¬¦  «         t          ||d	d
¬¦  «         Œ-t          | dt          j        d         ¬¦  «                             t          ¦  «        }|j        j        d         dk    sJ ‚|j        j        d         dk    sJ ‚dS )zj
    Tests that HDBSCAN centers are calculated and stored properly, and are
    accurate to the data.
    )ri   ri   )ç      @r»   iÐ  r   r’   )r   r   ÚcentersÚcluster_stdÚboth)Ústore_centersrB   gš™™™™™©?)ÚrtolÚatol)rw   r¿   rŸ   N)	r
   r   rI   ÚzipÚ
centroids_Úmedoids_r   rG   r‚   )rw   r¼   ÚHr$   r‰   ÚcenterÚcentroidÚmedoids           r&   Útest_hdbscan_centersrÉ   -  s  € ð ˜:Ð&€GÝ °1¸gÐSVÐWÑWÔW�D€A€qÝ
 Ð
'Ñ
'Ô
'×
+Ò
+¨AÑ
.Ô
.€Cå$'¨°´ÀÄÑ$NÔ$Nð ;ð ;Ñ ˆ�˜&Ý˜ ¨q°tÐ<Ñ<Ô<Ð<Ý˜ ¨Q°TÐ:Ñ:Ô:Ð:Ð:õ Ø¨6ÅAÄGÈAÄJðñ ô ç	‚c�!�f„fð ð Œ>Ô Ô" aÒ'Ð'Ð'Ð'ØŒ<Ô˜aÔ  AÒ%Ð%Ð%Ð%Ð%Ð%r(   c                  ó
  — t           j                             d¦  «        } |                      dd¦  «        }t	          dddd¬¦  «                             |¦  «        }t          j        |d¬	¦  «        \  }}t          |¦  «        dk    sJ ‚||d
k             dk    sJ ‚t	          ddddd¬¦  «                             |¦  «        }t          j        |d¬	¦  «        \  }}t          |¦  «        dk    sJ ‚||d
k             dk    sJ ‚dS )zS
    Tests that HDBSCAN single-cluster selection with epsilon works correctly.
    r   é–   rz   rC   ri   ÚeomT)rŸ   Úcluster_selection_epsilonÚcluster_selection_methodÚallow_single_cluster)Úreturn_countsr   é   g
×£p=
Ç?r   )rŸ   rÍ   rÎ   rÏ   rw   N)r?   ÚrandomÚRandomStateÚrandr   r^   Úuniquer,   )ÚrngÚno_structurer0   Úunique_labelsÚcountss        r&   Ú.test_hdbscan_allow_single_cluster_with_epsilonrÚ   C  s;  € õ Œ)×
Ò
 Ñ
"Ô
"€CØ—8’8˜C Ñ#Ô#€LåØØ"%Ø!&Ø!ð	ñ ô ÷
 ‚k�,ÑÔð õ œI f¸DÐAÑAÔAÑ€M�6Ýˆ}ÑÔ Ò"Ð"Ð"Ð"ð �- 2Ò%Ô&¨Ò+Ð+Ð+Ð+õ ØØ"&Ø!&Ø!Øðñ ô ÷ ‚k�,ÑÔð õ œI f¸DÐAÑAÔAÑ€M�6Ýˆ}ÑÔ Ò"Ð"Ð"Ð"Ø�- 2Ò%Ô&¨!Ò+Ð+Ð+Ð+Ð+Ð+r(   c                  ó2  — ddgddgddgddgg} t          d| g d¢d¬¦  «        \  }}t          ¦   «                              |¦  «        j        }t	          t          |¦  «        ¦  «        t          d	|v ¦  «        z
  }|d
k    sJ ‚t          ||¦  «        dk     dS )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   r   é   r)   N)r
   r   rI   rJ   r,   r-   Úintr   )r¼   rG   r/   r0   r2   s        r&   Útest_hdbscan_better_than_dbscanrá   d  s²   € ð �uˆ~  t˜}¨q°!¨f°q¸"°gÐ>€GÝØØØ+Ð+Ð+Øð	ñ ô �D€A€qõ ‰YŒY�]Š]˜1ÑÔÔ%€Få•S˜‘[”[Ñ!Ô!¥C¨¨f¨Ñ$5Ô$5Ñ5€JØ˜Š?ˆ?ˆ?ˆ?Ý˜& !Ñ$Ô$ tÒ+Ð+Ð+Ð+r(   z	kwargs, XrY   rB   rz   r+   rß   c                 óH   — t          dddi|¤Ž                     | ¦  «         dS )zo
    Tests that HDBSCAN works correctly for array-likes and precomputed inputs
    with non-finite points.
    Úmin_samplesrB   Nr"   )r   rI   )rG   Úkwargss     r&   Útest_hdbscan_usable_inputsrå   x  s1   € õ Ð$Ð$˜Ð$˜VÐ$Ð$×(Ò(¨Ñ+Ô+Ð+Ð+Ð+r(   c                 óò   —  | t          j        d¦  «        ¦  «        }d}t          j        t          |¬¦  «        5  t          d¬¦  «                             |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zd
    Tests that HDBSCAN raises the correct error when there are too few
    non-zero distances.
    )r   r   z#There exists points with fewer thanr[   rY   r]   N)r?   Úzerosr_   r`   ra   r   rI   ©r°   rG   rd   s      r&   Ú-test_hdbscan_sparse_distances_too_few_nonzeroré   ˆ  sº   € ð 	ˆ•b”h˜xÑ(Ô(Ñ)Ô)€Aà
/€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð -ð -Ý�}Ð%Ñ%Ô%×)Ò)¨!Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s   »$A,Á,A0Á3A0c                 ó6  — 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dd¦  «         dS # 1 swxY w Y   dS )
zu
    Tests that HDBSCAN raises the correct error when the distance matrix
    has multiple connected components.
    )é   rë   rB   NrC   é   z2HDBSCAN cannot be perfomed on a disconnected graphr[   rY   r]   )r?   rç   ÚTr_   r`   ra   r   rI   rè   s      r&   Ú0test_hdbscan_sparse_distances_disconnected_graphrî   •  sô   € õ 	Œ�ÑÔ€AØ€A€b€q€bˆ"ˆ1ˆ"€f�IØ€A€a€b€bˆ"ˆ#ˆ#€g�JØ	ˆAŒC‰€AØˆ�aÑÔ€AØ
>€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð -ð -Ý�}Ð%Ñ%Ô%×)Ò)¨!Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s   Á$BÂBÂBc                  óð  — d„ } d}t          j        t          |¬¦  «        5  t          d| ¬¦  «                             t
          ¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          |¬¦  «        5  t          d| ¬¦  «                             t
          ¦  «         ddd¦  «         n# 1 swxY w Y   t          t          t          j	        ¦  «        t          t          j	        ¦  «        z
  ¦  «        }t          |¦  «        dk    ret          j        t          |¬¦  «        5  t          d|d         ¬¦  «                             t
          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS dS )	zR
    Tests that HDBSCAN correctly raises an error for invalid metric choices.
    c                 ó   — | S r:   r"   )r<   s    r&   r=   z2test_hdbscan_tree_invalid_metric.<locals>.<lambda>ª  s   €  € r(   zV.* is not a valid metric for a .*-based algorithm\. Please select a different metric\.r[   r   )rw   rZ   Nr   r   )r_   r`   ra   r   rI   rG   rM   r-   r   r…   r   r,   )Úmetric_callablerd   Úmetrics_not_kds      r&   Ú test_hdbscan_tree_invalid_metricró   ¦  sG  € ð "�k€Oð	ð õ 
Œ•z¨Ð	-Ñ	-Ô	-ð Dð DÝ˜)¨OÐ<Ñ<Ô<×@Ò@ÅÑCÔCÐCðDð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Då	Œ•z¨Ð	-Ñ	-Ô	-ð Fð FÝ˜+¨oÐ>Ñ>Ô>×BÒBÅ1ÑEÔEÐEðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fõ
 �#�hÔ4Ñ5Ô5½½FÔ<PÑ8QÔ8QÑQÑRÔR€NÝ
ˆ>ÑÔ˜QÒÐÝŒ]�:¨SÐ1Ñ1Ô1ð 	Jð 	JÝ˜i°¸qÔ0AÐBÑBÔB×FÒFÅqÑIÔIÐIð	Jð 	Jð 	Jñ 	Jô 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jøøøð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð Ðs5   ¡*AÁAÁAÁ=*B3Â3B7Â:B7Ä,0E)Å)E-Å0E-c                  óð   — t          t          t          ¦  «        dz   ¬¦  «        } d}t          j        t
          |¬¦  «        5  |                      t          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zx
    Tests that HDBSCAN correctly raises an error when setting `min_samples`
    larger than the number of samples.
    rB   )rã   z min_samples (.*) must be at mostr[   N)r   r,   rG   r_   r`   ra   rI   )r‰   rd   s     r&   Ú!test_hdbscan_too_many_min_samplesrõ   ¾  s«   € õ
 �c¥!™fœf q™jÐ
)Ñ
)Ô
)€CØ
-€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð ð Ø�Š•‰
Œ
ˆ
ðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÁA+Á+A/Á2A/c                  ó  — t                                ¦   «         } t          j        | d<   d}t	          d¬¦  «        }t          j        t          |¬¦  «        5  |                     | ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zu
    Tests that HDBSCAN correctly raises an error when providing precomputed
    distances with `np.nan` values.
    r²   z(np.nan values found in precomputed-denserY   r]   r[   N)	rG   rH   r?   rF   r   r_   r`   ra   rI   )ÚX_nanrd   r‰   s      r&   Ú"test_hdbscan_precomputed_dense_nanrø   É  s¹   € õ
 �FŠF‰HŒH€EÝ”&€Eˆ$�KØ
4€CÝ
˜Ð
'Ñ
'Ô
'€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð ð Ø�Š�‰Œˆðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÁA9Á9A=Â A=rÏ   TFÚepsilonr‘   c                 ó0  ‡‡‡— d}t          || ddgddgddgg¬¦  «        \  }Št          ¦   «                              |¦  «        }t          |j        |j        ¬¦  «        }|dz   |dz   |dz   h}|dz   d|dz   d	|dz   di}t          |||||¬
¦  «        Šˆfd„t          t          ‰¦  «        ¦  «        D ¦   «         Šˆˆfd„t          t          ‰¦  «        ¦  «        D ¦   «         }	 t          j
        |	j        ¦  «        ‰¦  «        }
t          ‰|
¦  «         dS )zR
    Tests that the `_do_labelling` helper function correctly assigns labels.
    é0   r   r   )r   r¼   rž   rz   r+   rß   rB   ©Úcondensed_treeÚclustersÚcluster_label_maprÏ   rÍ   c                 óZ   •— i | ]'}|t          j        ‰|k    ¦  «        d          d          “Œ(S )r   )r?   Úwhere)r#   Ú_yr/   s     €r&   ú
<dictcomp>z+test_labelling_distinct.<locals>.<dictcomp>ö  s3   ø€ ÐKÐKÐK¸˜�BœH Q¨"¢WÑ-Ô-¨aÔ0°Ô3ÐKÐKÐKr(   c                 ó.   •— i | ]}|‰‰|                  “ŒS r"   r"   )r#   r  Úfirst_with_labelr0   s     €€r&   r  z+test_labelling_distinct.<locals>.<dictcomp>÷  s&   ø€ ÐKÐKÐK¸�2�vÐ.¨rÔ2Ô3ÐKÐKÐKr(   N)r
   r   rI   r   Ú_single_linkage_tree_rŸ   r   rM   r-   r?   Ú	vectorizer„   r   )Úglobal_random_seedrÏ   rù   r   rG   Úestrý   rþ   rÿ   Úy_to_labelsÚaligned_targetr  r0   r/   s              @@@r&   Útest_labelling_distinctr  Ö  sZ  øøø€ ð €IÝØØ'ð �ˆFØ�ˆGØ�ˆGð
ð		ñ 	ô 	�D€A€qõ ‰)Œ)�-Š-˜Ñ
Ô
€CÝ#ØÔ!°CÔ4Hðñ ô €Nð ˜A‘˜y¨1™}¨i¸!©mÐ<€HØ" Q™¨¨9°q©=¸!¸YÈ¹]ÈAÐNÐÝØ%ØØ+Ø1Ø")ðñ ô €Fð LÐKÐKÐK½dÅ3ÀqÁ6Ä6¹l¼lÐKÑKÔKÐØKÐKÐKÐKÐK½dÅ3ÀqÁ6Ä6¹l¼lÐKÑKÔK€KØ2•R”\ +¤/Ñ2Ô2°1Ñ5Ô5€NÝ�v˜~Ñ.Ô.Ð.Ð.Ð.r(   c                  ó–  — 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 ‚dS )zž
    Tests that the `_do_labelling` helper function correctly thresholds the
    incoming lambda values given various `cluster_selection_epsilon` values.
    rC   g      ø?rz   rB   )rC   rB   r‘   rB   r   )rC   r+   rÝ   rB   )rC   rß   rŒ   rB   )ÚdtypeTrü   Úvaluer   N)r?   Úarrayr   r   Úsum)r   Ú
MAX_LAMBDArý   r0   Ú	num_noises        r&   Útest_labelling_thresholdingr  ü  s#  € ð
 €IØ€JÝ”Xà��:˜qÐ!ØØ��:˜qÐ!ØØð	
õ ð	ñ 	ô 	€Nõ Ø%Ø�Ø$ a¨°Q©¸Ð:Ø!Ø"#ðñ ô €Fð ˜wÔ'¨!Ò+€IÝˆy‰>Œ>�S ¨2¢Ñ.Ô.Ò.Ð.Ð.Ð.åØ%Ø�Ø$ a¨°Q©¸Ð:Ø!Ø"#ðñ ô €Fð ˜wÔ'¨*Ò4€IÝˆy‰>Œ>�S ¨2¢Ñ.Ô.Ò.Ð.Ð.Ð.Ð.Ð.r(   c                  ó|  — d} t          j        t          | ¬¦  «        5  t          d¬¦  «                             t
          ¦  «         d d d ¦  «         n# 1 swxY w Y   d} t          j        t          | ¬¦  «        5  t          d¬¦  «                             t
          ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nz�`algorithm='kdtree'`has been deprecated in 1.4 and will be renamed to'kd_tree'`in 1.6. To keep the past behaviour, set `algorithm='kd_tree'`.r[   Úkdtreerv   z“`algorithm='balltree'`has been deprecated in 1.4 and will be renamed to'ball_tree'`in 1.6. To keep the past behaviour, set `algorithm='ball_tree'`.Úballtree)r_   r†   r‡   r   rI   rG   )rd   s    r&   Ú1test_hdbscan_warning_on_deprecated_algorithm_namer  &  s<  € ð	Vð õ 
Œ•m¨3Ð	/Ñ	/Ô	/ð +ð +Ý˜(Ð#Ñ#Ô#×'Ò'­Ñ*Ô*Ð*ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð
	$ð õ
 
Œ•m¨3Ð	/Ñ	/Ô	/ð -ð -Ý˜*Ð%Ñ%Ô%×)Ò)­!Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s#   ž)AÁAÁAÁ;)B1Â1B5Â8B5r¿   rÇ   rÈ   c                 ó@  — t           j                             d¦  «        }|                     d¦  «        }t          |¦  «        }d}t	          j        t          |¬¦  «        5  t          d| ¬¦  «                             |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )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   rz   z>Cannot store centers when using a precomputed distance matrix.r[   rY   )rZ   r¿   N)	r?   rÒ   rÓ   r   r_   r`   ra   r   rI   )r¿   rÖ   rG   ÚX_distÚerr_msgs        r&   Ú0test_hdbscan_error_precomputed_and_store_centersr  9  sê   € õ Œ)×
Ò
 Ñ
"Ô
"€CØ�
Š
�8ÑÔ€AÝ  Ñ#Ô#€FØN€GÝ	Œ•z¨Ð	1Ñ	1Ô	1ð Oð OÝ�}°MÐBÑBÔB×FÒFÀvÑNÔNÐNðOð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oð Oð Os   Á!%BÂBÂBÚ
valid_algor   r   c                 óX   — t          d| ¬¦  «                             t          ¦  «         dS )z“Test that HDBSCAN works with the "cosine" metric when the algorithm is set
    to "brute" or "auto".

    Non-regression test for issue #28631
    Úcosiner®   N)r   r^   rG   )r  s    r&   Ú*test_hdbscan_cosine_metric_valid_algorithmr!  I  s+   € õ �8 zÐ2Ñ2Ô2×>Ò>½qÑAÔAÐAÐAÐAr(   Úinvalid_algoc                 óÄ   — t          d| ¬¦  «        }t          j        t          d¬¦  «        5  |                     t
          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z€Test that HDBSCAN raises an informative error is raised when an unsupported
    algorithm is used with the "cosine" metric.
    r   r®   zcosine is not a valid metricr[   N)r   r_   r`   ra   r^   rG   )r"  Úhdbscans     r&   Ú,test_hdbscan_cosine_metric_invalid_algorithmr%  S  s¤   € õ
 ˜X°Ð>Ñ>Ô>€GÝ	Œ•zÐ)GÐ	HÑ	HÔ	Hð ð Ø×Ò�AÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ­AÁAÁA)r)   )KÚ__doc__Únumpyr?   r_   Ú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   rG   r/   Úfit_transformÚ
ALGORITHMSÚitemsr.   r3   ÚmarkÚparametrizerW   re   rp   rs   rŠ   r�   rš   rœ   r¡   r¨   r«   r¯   r¹   rÉ   rÚ   rá   r  rE   rå   ré   rî   ró   rõ   rø   r  r  r  r  r!  r%  r"   r(   r&   ú<module>r:     s(  ððð ð
 Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "à #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð ð ð
 ?Ð >Ð >Ð >Ð >Ð >Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø !Ð !Ð !Ð !Ð !Ð !Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ >Ð >Ð >Ð >Ð >Ð >Ð >Ð >à€z˜C¨bÐ1Ñ1Ô1�€€1Ø€wˆq�! !Ð$Ñ$Ô$�€€1Ø€NÑÔ×"Ò" 1Ñ%Ô%€ðð ð €
ð ˆdÐKÐKÐ1HÐ1BÔ1HÑ1JÔ1JÐKÑKÔKÑK€ð8ð 8ð 8ð 8ð „×Ò˜Ð):Ñ;Ô;ðJð Jñ <Ô;ðJð>5ð 5ð 5ð0 „×ÒÐ-Ð/Q°Ð/QÀ.Ð/QÑRÔRð ð  ñ SÔRð ð"	 ð 	 ð 	 ð „×Ò˜ Ñ,Ô,Ø„×Ò˜ >Ñ2Ô2ð$ð $ñ 3Ô2ñ -Ô,ð$ðN
0ð 
0ð 
0ð „×Ò˜¨Ñ7Ô7ð8ð 8ñ 8Ô7ð8ð4 ð  ð  ð-ð -ð -ð	Hð 	Hð 	Hð ð  ð  ð „×Ò˜ )¨[Ð!9Ñ:Ô:ðð ñ ;Ô:ðð „×Ò˜¨.Ñ9Ô9ðIð Iñ :Ô9ðIðD „×Ò˜ jÑ1Ô1ð&ð &ñ 2Ô1ð&ð*,ð ,ð ,ðB,ð ,ð ,ð( „×ÒØà
�MÐ	" H B¤H¨q°"´&¨k¸B¼FÀA¸;Ð-GÑ$HÔ$HÐIØ
�MÐ	" a¨ V¨a°¨VÐ$4Ð5Ø	ˆq�!ˆf�q˜!�fÐÐðñô ð,ð ,ñô ð,ð „×Ò˜¨.Ñ9Ô9ð	-ð 	-ñ :Ô9ð	-ð „×Ò˜¨.Ñ9Ô9ð-ð -ñ :Ô9ð-ð Jð Jð Jð0ð ð ð
ð 
ð 
ð „×ÒÐ/°$¸°Ñ?Ô?Ø„×Ò˜ Q¨ HÑ-Ô-ð!/ð !/ñ .Ô-ñ @Ô?ð!/ðH&/ð &/ð &/ðT-ð -ð -ð& „×Ò˜¨:°xÐ*@ÑAÔAðOð Oñ BÔAðOð „×Ò˜¨°Ð'8Ñ9Ô9ðBð Bñ :Ô9ðBð „×Ò˜¨)°[Ð)AÑBÔBðð ñ CÔBðð ð r(   