§
    ¥˜ºh±F  ã            	       ó:  — d Z ddlZddl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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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(ej)         *                    de¦  «        d„ ¦   «         Z+d„ Z,ej)         *                    dej-        ej.        g¦  «        d„ ¦   «         Z/d„ Z0ej)         *                    de&¦  «        ej)         *                    de¦  «        d „ ¦   «         ¦   «         Z1d!„ Z2ej)         *                    d"d#¦  «        d$„ ¦   «         Z3d%„ Z4d&„ Z5d'„ Z6d(„ Z7d)„ Z8ej)         *                    d*d+d,g¦  «        d-„ ¦   «         Z9d.„ Z:ej)         *                    d/e&¦  «        d0„ ¦   «         Z;d1„ Z<d2„ Z=ej)         *                    d3dd4i ej>        d5ej?        gej?        d5gg¦  «        fdd4id5d6gd6d5ggfi d5d6gdd7ggfg¦  «        d8„ ¦   «         Z@d9„ ZAd:„ ZBd;„ ZCd<„ ZDej)         *                    d=d>d?g¦  «        ej)         *                    d@ddAg¦  «        dB„ ¦   «         ¦   «         ZEdC„ ZFdS )DzF
Tests for HDBSCAN clustering algorithm
Based on the DBSCAN test code
é    N)ÚsparseÚ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é   éÈ   é
   )Ú	n_samplesÚrandom_stateé   )r   )ÚkdtreeÚballtreeÚbruteÚautoéÿÿÿÿc                 ó$   — h | ]\  }}|d          ’ŒS )Úlabel© )Ú.0Ú_Úouts      új/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sklearn/cluster/tests/test_hdbscan.pyú	<setcomp>r'   %   s    € ÐKÐKÐK¡v q¨#�c˜'”lÐKÐKÐKó    Ú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"   ©ÚxÚys     r&   ú<lambda>z#test_outlier_data.<locals>.<lambda>2   s
   €   a¢€ r(   c                 ó*   — t          j        | ¦  «        S r/   )ÚnpÚisnanr0   s     r&   r3   z#test_outlier_data.<locals>.<lambda>3   s   € ¥¤¨¡¤€ r(   r!   Úprobé   r   é   é   r   N)r5   ÚinfÚnanr
   ÚXÚcopyr   ÚfitÚlabels_Únonzeror   Úprobabilities_ÚlistÚrange)r)   ÚoutlierÚ
prob_checkr!   r7   Ú	X_outlierÚmodelÚmissing_labels_idxÚmissing_probs_idxÚclean_indicesÚclean_models              r&   Útest_outlier_datarM   (   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          t          |¦  «        t          z
  ¦  «        }|t          k    sJ ‚t          t          |¦  «        }|dk    sJ ‚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)Úmetricr>   ç\�Âõ(\ï?z*The precomputed distance matrix.*has shape©ÚmatchNz'The precomputed distance matrix.*valuesr   )r   r8   r8   )r8   r   ©rP   )r   r=   r>   r   Úfit_predictr   ÚlenÚsetÚOUTLIER_SETÚn_clusters_truer   r2   ÚpytestÚraisesÚ
ValueError)ÚDÚ
D_originalÚlabelsÚ
n_clustersÚscoreÚmsgs         r&   Útest_hdbscan_distance_matrixrc   H   sç  € õ
 	�AÑÔ€AØ—’‘”€JÝ˜M°Ð5Ñ5Ô5×AÒAÀ!ÑDÔD€Få�A�zÑ"Ô"Ð"Ý•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(õ "¥! VÑ,Ô,€EØ�DŠ=ˆ=ˆ=ˆ=à
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$   Ã*C>Ã>DÄDÄ0$E!Å!E%Å(E%Úsparse_constructorc                 óÐ  — t          j        t          j        t          ¦  «        ¦  «        }|t	          j        |¦  «        z  }t          j        |                     ¦   «         d¦  «        }d|||k    <    | |¦  «        }| 	                    ¦   «          t          d¬¦  «                             |¦  «        }t          t          |¦  «        t          z
  ¦  «        }|t          k    sJ ‚dS )zA
    Tests that HDBSCAN works with sparse distance matrices.
    é2   ç        rO   rT   N)r   Ú
squareformÚpdistr=   r5   Úmaxr   ÚscoreatpercentileÚflattenÚeliminate_zerosr   rU   rV   rW   rX   rY   )rd   r]   Ú	thresholdr_   r`   s        r&   Ú#test_hdbscan_sparse_distance_matrixro   f   sÆ   € õ
 	Ô�HœN­1Ñ-Ô-Ñ.Ô.€AØ�Œ�‰Œ�N€AåÔ'¨¯	ª	©¬°RÑ8Ô8€Ià€A€aˆ9‚nÑØÐ˜1ÑÔ€AØ×ÒÑÔÐå˜MÐ*Ñ*Ô*×6Ò6°qÑ9Ô9€FÝ•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(Ð(Ð(r(   c                  óî   — t          ¦   «                              t          ¦  «        } t          t	          | ¦  «        t
          z
  ¦  «        }|t          k    sJ ‚t          t          | ¦  «        }|dk    sJ ‚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.
    rQ   N)	r   rU   r=   rV   rW   rX   rY   r   r2   )r_   r`   ra   s      r&   Útest_hdbscan_feature_arrayrq   y   sf   € õ
 ‰YŒY×"Ò"¥1Ñ%Ô%€FÝ•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(õ "¥! VÑ,Ô,€EØ�DŠ=ˆ=ˆ=ˆ=ˆ=ˆ=r(   ÚalgorP   c                 ó°  — t          | ¬¦  «                             t          ¦  «        }t          t	          |¦  «        t
          z
  ¦  «        }|t          k    sJ ‚| 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   ÚVr8   Úpé   )rv   Úw)ÚmahalanobisÚ
seuclideanÚ	minkowskiÚ
wminkowski©rt   rP   Úmetric_paramsr|   )r   rU   r=   rV   rW   rX   rY   r   r   r5   ÚeyeÚshapeÚonesÚgetÚvalid_metricsrZ   r[   r\   r?   ÚwarnsÚFutureWarning)rr   rP   r_   r`   ÚALGOS_TREESr~   Úhdbs          r&   Útest_hdbscan_algorithmsrˆ   ˆ   s@  € õ ˜tÐ$Ñ$Ô$×0Ò0µÑ3Ô3€FÝ•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(ð Ð Ð Ð Øˆõ Ýðð €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$   Ä3EÅEÅ"EÆF/Æ/F3Æ6F3c                  óÞ   — t          ¦   «                              t          ¦  «        } |                      d¦  «        }t	          t          |¦  «        t          z
  ¦  «        }|t          k    sJ ‚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.

    TODO: Improve and strengthen this test if at all possible.
    ç333333Ó?N)r   r?   r=   Údbscan_clusteringrV   rW   rX   rY   )Ú	clustererr_   r`   s      r&   Útest_dbscan_clusteringr�   ²   s[   € õ ‘	”	—’�aÑ Ô €IØ×(Ò(¨Ñ-Ô-€FÝ•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(Ð(Ð(r(   Úcut_distance)çš™™™™™¹?ç      à?r8   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 )r+   r-   r!   r,   r8   r   rw   r9   )rŽ   r   N)r
   r=   r>   r5   r;   r<   r   r?   r‹   Úflatnonzeror   rC   rW   rD   )rŽ   Úmissing_labelÚinfinite_labelrG   rH   r_   rI   Úinfinite_labels_idxÚ	clean_idxrL   Ú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d¬¦  «        \  } }t          ¦   «                              | ¦  «        } t          dddt	          j        | j        d         ¦  «        i¬	¦  «                             | ¦  «        }t          t          |¦  «        t          z
  ¦  «        }|t          k    sJ ‚d
S )zQ
    Tests that HDBSCAN using `BallTree` works with higher-dimensional data.
    rf   r   é@   )r   r   Ú
n_featuresr   rz   ru   r8   r}   N)r   r   Úfit_transformr   r5   r�   r€   rU   rV   rW   rX   rY   )ÚHr2   r_   r`   s       r&   Útest_hdbscan_high_dimensionalrž   Ú   s¨   € õ  °¸rÐBÑBÔB�D€A€qÝÑÔ×&Ò& qÑ)Ô)€AÝØØØ�BœG A¤G¨A¤JÑ/Ô/Ð0ðñ ô ÷ ‚k�!�n„nð	 õ
 •S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(Ð(Ð(r(   c                  ó  — t          ddt          j        t          j        d         ¦  «        i¬¦  «                             t          ¦  «        } t          t          | ¦  «        t          z
  ¦  «        }|t          k    sJ ‚dS )z4
    Tests that HDBSCAN using `BallTree` works.
    rz   ru   r8   )rP   r~   N)
r   r5   r�   r=   r€   rU   rV   rW   rX   rY   ©r_   r`   s     r&   Ú!test_hdbscan_best_balltree_metricr¡   é   sq   € õ Ø¨Cµ´½¼À¼Ñ1DÔ1DÐ+Eðñ ô ç‚k•!�n„nð õ •S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(Ð(Ð(r(   c                  óØ   — t          t          t          ¦  «        dz
  ¬¦  «                             t          ¦  «        } t          t	          | ¦  «        t
          z
  ¦  «        }|dk    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.
    r8   ©Úmin_cluster_sizer   N)r   rV   r=   rU   rW   rX   r    s     r&   Útest_hdbscan_no_clustersr¥   ô   sU   € õ
 ¥c­!¡f¤f¨q¡jÐ1Ñ1Ô1×=Ò=½aÑ@Ô@€FÝ•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ˜Š?ˆ?ˆ?ˆ?ˆ?ˆ?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
    rw   r8   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)rD   rV   r=   r   rU   r5   ÚminÚbincount)r¤   r_   Ú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          t          |¦  «        t          z
  ¦  «        }|t          k    sJ ‚dS )zA
    Tests that HDBSCAN works when passed a callable metric.
    rT   N)	r   Ú	euclideanr   rU   r=   rV   rW   rX   rY   )rP   r_   r`   s      r&   Útest_hdbscan_callable_metricr¯   
  sY   € õ Ô€FÝ˜FÐ#Ñ#Ô#×/Ò/µÑ2Ô2€FÝ•S˜‘[”[¥;Ñ.Ñ/Ô/€JØ�Ò(Ð(Ð(Ð(Ð(Ð(r(   ÚtreeÚkdÚballc                 óÈ   — t          d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.
    rO   Úprims_r°   ©rP   rt   N)r   rZ   r[   r\   r?   r=   )r°   r‡   s     r&   Ú"test_hdbscan_precomputed_non_bruter¶     s¥   € õ ˜Ð2E¸4Ð2EÐ2EÐ2EÐ
FÑ
FÔ
F€CÝ	Œ•zÑ	"Ô	"ð ð Ø�Š•‰
Œ
ˆ
ðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ¯AÁAÁAc                  ó.  — t          ¦   «                              t          ¦  «        j        } t	          t          | ¦  «        t          z
  ¦  «        }|dk    sJ ‚t          j        t          ¦  «        }| 	                    ¦   «         }t          ¦   «                              |¦  «        j        }t          | |¦  «         t          j        dft          j        dffD ]ã\  }}t           	                    ¦   «         }||d<   t          ¦   «                              |¦  «        j        } t	          t          | ¦  «        t          z
  ¦  «        }|dk    sJ ‚| 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.
    r   r,   r-   ©r   r   r   r!   z4Sparse data matrices only support algorithm `brute`.rR   r®   r   rµ   N)r   r?   r=   r@   rV   rW   rX   r   Ú
csr_matrixr>   r   r5   r;   r<   r
   rZ   r[   r\   )	Údense_labelsr`   Ú	_X_sparseÚX_sparseÚsparse_labelsÚoutlier_valr)   ÚX_denserb   s	            r&   Útest_hdbscan_sparserÀ     s  € õ ‘9”9—=’=¥Ñ#Ô#Ô+€LÝ•S˜Ñ&Ô&­Ñ4Ñ5Ô5€JØ˜Š?ˆ?ˆ?ˆ?åÔ!¥!Ñ$Ô$€IØ�~Š~ÑÔ€HÝ‘I”I—M’M (Ñ+Ô+Ô3€MÝ�| ]Ñ3Ô3Ð3õ (*¤v¨zÐ&:½R¼VÀYÐ<OÐ%Pð 8ð 8Ñ!ˆ�\Ý—&’&‘(”(ˆØ#ˆ�‰Ý‘y”y—}’} WÑ-Ô-Ô5ˆÝ�˜\Ñ*Ô*­[Ñ8Ñ9Ô9ˆ
Ø˜QŠˆˆˆØ˜AŒÕ"3°LÔ"AÀ'Ô"JÒJÐJÐJÐJà—>’>Ñ#Ô#ˆØ$ˆ�‰Ý™	œ	Ÿš hÑ/Ô/Ô7ˆÝ˜<¨Ñ7Ô7Ð7Ð7à
@€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð Hð HÝ�{¨jÐ9Ñ9Ô9×=Ò=¸hÑGÔGÐGðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hð Hð Hs   Ç%H
È
HÈHrt   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.
    )rg   rg   )ç      @rÂ   iè  r   r�   )r   r   ÚcentersÚcluster_stdÚboth)Ústore_centersr8   gš™™™™™©?)ÚrtolÚatol)rt   rÆ   r¤   N)	r   r   r?   ÚzipÚ
centroids_Úmedoids_r   r=   r€   )rt   rÃ   r�   r$   r‡   ÚcenterÚcentroidÚmedoids           r&   Útest_hdbscan_centersrÏ   C  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   é–   rw   r9   rg   ÚeomT)r¤   Úcluster_selection_epsilonÚcluster_selection_methodÚallow_single_cluster)Úreturn_countsr   é   g
×£p=
Ç?r   )r¤   rÓ   rÔ   rÕ   rt   N)r5   ÚrandomÚRandomStateÚrandr   rU   ÚuniquerV   )ÚrngÚno_structurer_   Úunique_labelsÚcountss        r&   Ú.test_hdbscan_allow_single_cluster_with_epsilonrà   Y  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                  ó  — ddgddgddgddgg} t          d| g d¢d¬¦  «        \  }}t          ¦   «                              |¦  «        }t          t	          |j        ¦  «        ¦  «        t          d	|j        v ¦  «        z
  }|d
k    sJ ‚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   é   N)r   r   r?   rV   rW   r@   Úint)rÃ   r=   r$   r‡   r`   s        r&   Útest_hdbscan_better_than_dbscanrç   z  sŸ   € ð �uˆ~  t˜}¨q°!¨f°q¸"°gÐ>€GÝØØØ+Ð+Ð+Øð	ñ ô �D€A€qõ ‰)Œ)�-Š-˜Ñ
Ô
€CÝ•S˜œÑ%Ô%Ñ&Ô&­¨R°3´;Ð->Ñ)?Ô)?Ñ?€JØ˜Š?ˆ?ˆ?ˆ?ˆ?ˆ?r(   z	kwargs, XrO   r8   rw   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_samplesr8   Nr"   )r   r?   )r=   Úkwargss     r&   Útest_hdbscan_usable_inputsrë   Œ  s1   € õ Ð$Ð$˜Ð$˜VÐ$Ð$×(Ò(¨Ñ+Ô+Ð+Ð+Ð+r(   c                  ó  — t          j        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 thanrR   rO   rT   N)	r   r¹   r5   ÚzerosrZ   r[   r\   r   r?   )r=   rb   s     r&   Ú-test_hdbscan_sparse_distances_too_few_nonzerorî   œ  s»   € õ
 	Ô�"œ( 8Ñ,Ô,Ñ-Ô-€Aà
/€CÝ	Œ•z¨Ð	-Ñ	-Ô	-ð -ð -Ý�}Ð%Ñ%Ô%×)Ò)¨!Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s   Á$A5Á5A9Á<A9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"   )r1   s    r&   r3   z2test_hdbscan_tree_invalid_metric.<locals>.<lambda>¬  s   €  € r(   zV.* is not a valid metric for a .*-based algorithm\. Please select a different metric\.rR   r   )rt   rP   Nr   r   )rZ   r[   r\   r   r?   r=   rC   rW   r   rƒ   r   rV   )Úmetric_callablerb   Úmetrics_not_kds      r&   Ú test_hdbscan_tree_invalid_metricró   ¨  sG  € ð "�k€Oð	ð õ 
Œ•z¨Ð	-Ñ	-Ô	-ð Cð CÝ˜(¨?Ð;Ñ;Ô;×?Ò?ÅÑBÔBÐBðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cå	Œ•z¨Ð	-Ñ	-Ô	-ð Eð EÝ˜*¨_Ð=Ñ=Ô=×AÒAÅ!ÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eõ
 �#�hÔ4Ñ5Ô5½½FÔ<PÑ8QÔ8QÑQÑRÔR€NÝ
ˆ>ÑÔ˜QÒÐÝŒ]�:¨SÐ1Ñ1Ô1ð 	Ið 	IÝ˜h¨~¸aÔ/@ÐAÑAÔA×EÒEÅaÑHÔHÐHð	Ið 	Ið 	Iñ 	Iô 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Iøøøð 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið Ð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.
    r8   )ré   z min_samples (.*) must be at mostrR   N)r   rV   r=   rZ   r[   r\   r?   )r‡   rb   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-denserO   rT   rR   N)	r=   r>   r5   r<   r   rZ   r[   r\   r?   )ÚX_nanrb   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£   rw   r   rå   r8   ©Úcondensed_treeÚclustersÚcluster_label_maprÕ   rÓ   c                 óZ   •— i | ]'}|t          j        ‰|k    ¦  «        d          d          “Œ(S )r   )r5   Úwhere)r#   Ú_yr2   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_labelr_   s     €€r&   r  z+test_labelling_distinct.<locals>.<dictcomp>ù  s&   ø€ ÐKÐKÐK¸�2�vÐ.¨rÔ2Ô3ÐKÐKÐKr(   N)r   r   r?   r   Ú_single_linkage_tree_r¤   r	   rC   rW   r5   Ú	vectorizer‚   r   )Úglobal_random_seedrÕ   rù   r   r=   Úestrý   rþ   rÿ   Úy_to_labelsÚaligned_targetr  r_   r2   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.
    r9   g      ø?rw   r8   )r9   r8   r�   r8   r   )r9   r   rã   r8   )r9   rå   rŠ   r8   )ÚdtypeTrü   Úvaluer   N)r5   Úarrayr   r	   Úsum)r   Ú
MAX_LAMBDArý   r_   Ú	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(   )GÚ__doc__Únumpyr5   rZ   Úscipyr   r   Ú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   rY   r=   r2   rœ   Ú
ALGORITHMSÚitemsrX   ÚmarkÚparametrizerM   rc   r¹   Ú
csc_matrixro   rq   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&   ú<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€ð „×Ò˜Ð):Ñ;Ô;ðJð Jñ <Ô;ðJð>5ð 5ð 5ð< „×ÒÐ-°Ô0AÀ6ÔCTÐ/UÑVÔVð)ð )ñ WÔVð)ð$ð ð ð „×Ò˜ Ñ,Ô,Ø„×Ò˜ >Ñ2Ô2ð%ð %ñ 3Ô2ñ -Ô,ð%ðP
)ð 
)ð 
)ð „×Ò˜¨Ñ7Ô7ð8ð 8ñ 8Ô7ð8ð4)ð )ð )ð)ð )ð )ðð ð ð	Hð 	Hð 	Hð)ð )ð )ð „×Ò˜ $¨ Ñ0Ô0ðð ñ 1Ô0ðð!Hð !Hð !HðH „×Ò˜ 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ÐÐðñô ð,ð ,ñô ð,ð	-ð 	-ð 	-ðIð Ið Ið0ð ð ð
ð 
ð 
ð „×ÒÐ/°$¸°Ñ?Ô?Ø„×Ò˜ Q¨ HÑ-Ô-ð!/ð !/ñ .Ô-ñ @Ô?ð!/ðH&/ð &/ð &/ð &/ð &/r(   