Ë
    ÷Q(hÈK  ã            	       óÈ  — 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)dQd„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„ «       ZIyc c}} w )RzF
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      ú`/var/www/skyplay_api_hub/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        «       j                  |«      }|j                  |k(  j                  «       \  }t        |ddg«        ||j                  |«      j                  «       \  }t        |ddg«       t        t        dd«      «      t        t        d	d
«      «      z   }	t        «       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   é   é   r   N)r9   ÚinfÚnanr	   ÚXÚcopyr   Ú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_datarQ   /   s8  € ô —F‘FÜ—6‘6ñð ñ€Gñ
 (Ù+ñð ñ€Jô ˜lÑ+¨GÑ4€EÜ˜\Ñ*¨6Ñ2€Dä—‘“€IØ˜Q�<€Iˆa�LØ˜WÐ%€Iˆa�LÜ‹I�M‰M˜)Ó$€Eà"Ÿ]™]¨eÑ3×<Ñ<Ó>ÑÐÜÐ)¨A¨q¨6Ô2á& u×';Ñ';¸TÓB×KÑKÓMÑÐÜÐ(¨1¨a¨&Ô1äœ˜q !›Ó%¬¬U°1°c«]Ó(;Ñ;€MÜ“)—-‘- 	¨-Ñ 8Ó9€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¬«      j	                  | «       ddd«       y# 1 sw Y   ŒUx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)ÚmetricrB   z*The precomputed distance matrix.*has shape©ÚmatchNz'The precomputed distance matrix.*valuesr   )r   r<   r<   )r<   r   ©rT   )
r   rA   rB   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Ñ1°!Ô4÷5ð 5÷@ð @ú÷5ð 5ús   Á0!C%Ã C1Ã%C.Ã1C:Úsparse_constructorc                 ó`  — t        j                  t        j                  t        «      «      }|t	        j
                  |«      z  }t        j                  |j                  «       d«      }d|||k\  <    | |«      }|j                  «        t        d¬«      j                  |«      }t        |«       y)zA
    Tests that HDBSCAN works with sparse distance matrices.
    é2   ç        rS   rW   N)r   Ú
squareformÚpdistrA   r9   Úmaxr   ÚscoreatpercentileÚflattenÚeliminate_zerosr   rX   r+   )r`   r\   r(   r'   s       r*   Ú#test_hdbscan_sparse_distance_matrixrj   g   s‡   € ô
 	×ÑœHŸN™N¬1Ó-Ó.€AØŒ�‰�‹�N€Aä×'Ñ'¨¯	©	«°RÓ8€Ià€A€aˆ9�nÑÙ˜1Ó€AØ×ÑÔä˜MÔ*×6Ñ6°qÓ9€FÜ˜Õr,   c                  óT   — t        «       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.
    N)r   rX   rA   r+   ©r'   s    r*   Útest_hdbscan_feature_arrayrm   y   s    € ô
 ‹Y×"Ñ"¤1Ó%€Fô ˜Õr,   ÚalgorT   c                 ó  — t        | ¬«      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        | ||¬«      }|||    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.
    )Ú	algorithm)r   r   N)r   r   ÚVr<   Úpé   )rr   Úw)ÚmahalanobisÚ
seuclideanÚ	minkowskiÚ
wminkowski)rp   rT   Úmetric_paramsrx   )r   rX   rA   r+   r   r   r9   ÚeyeÚshapeÚonesÚgetÚvalid_metricsrY   rZ   r[   rC   ÚwarnsÚFutureWarning)rn   rT   r'   ÚALGOS_TREESry   Úhdbs         r*   Útest_hdbscan_algorithmsrƒ   …   sK  € ô ˜tÔ$×0Ñ0´Ó3€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   ÄE3Ä>E?Å3E<Å?Fc                  óz   — t        «       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.
    ç333333Ó?gq=
×£pí?)r(   N)r   rC   rA   Údbscan_clusteringr+   )Ú	clustererr'   s     r*   Útest_dbscan_clusteringrˆ   ®   s0   € ô
 “	—‘œaÓ €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        «       j                  |«      }|j                  | ¬«      }t        j                  ||k(  «      }t        |ddg«       t        j                  ||k(  «      }t        |dg«       t        t        t        d	«      «      t        ||z   «      z
  «      }t        «       j                  ||   «      }	|	j                  | ¬«      }
t        |
||   «       y
)r/   r1   r    r0   r<   r   rs   r=   )r‰   r   N)r	   rA   rB   r9   r?   r@   r   rC   r†   Úflatnonzeror   rG   r$   rH   )r‰   Úmissing_labelÚinfinite_labelrK   rL   r'   rM   Úinfinite_labels_idxÚ	clean_idxrP   Úclean_labelss              r*   Ú#test_dbscan_clustering_outlier_datar“   »   s&  € ô
 & 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�M‰M˜)Ó$€EØ×$Ñ$°,Ð$Ó?€FäŸ™¨°-Ñ(?Ó@ÐÜÐ)¨A¨q¨6Ô2äŸ.™.¨°>Ñ)AÓBÐÜÐ*¨Q¨CÔ0ä”Sœ˜s›“_¤sÐ+=Ð@SÑ+SÓ'TÑTÓU€IÜ“)—-‘- 	¨)Ñ 4Ó5€KØ×0Ñ0¸lÐ0ÓK€LÜ�| V¨IÑ%6Õ7r,   c                  ó¦   — t        ddt        j                  t        j                  d   «      i¬«      j                  t        «      } t        | «       y)z4
    Tests that HDBSCAN using `BallTree` works.
    rv   rq   r<   )rT   ry   N)r   r9   r|   rA   r{   rX   r+   rl   s    r*   Ú!test_hdbscan_best_balltree_metricr•   Ö   s?   € ô Ø¨C´·±¼¿¹À¹Ó1DÐ+Eôç�k”!ƒnð ô ˜Õr,   c                  ó¢   — t        t        t        «      dz
  ¬«      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<   ©Úmin_cluster_sizeN)r   r#   rA   rX   r$   Úissubsetr%   rl   s    r*   Útest_hdbscan_no_clustersrš   à   s9   € ô
 ¤c¬!£f¨q¡jÔ1×=Ñ=¼aÓ@€FÜˆv‹;×Ñ¤Ô,Ð,Ñ,r,   c                  ó,  — t        dt        t        «      d«      D ]r  } t        | ¬«      j	                  t        «      }|D �cg c]
  }|dk7  sŒ	|‘Œ }}t        |«      dk7  sŒFt        j                  t        j                  |«      «      | k\  rŒrJ ‚ yc c}w )zb
    Test that the smallest non-noise cluster has at least `min_cluster_size`
    many points
    rs   r<   r—   r   r   N)rH   r#   rA   r   rX   r9   ÚminÚbincount)r˜   r'   r    Útrue_labelss       r*   Útest_hdbscan_min_cluster_sizerŸ   é   sƒ   € ô
 " !¤S¬£V¨QÓ/ò HÐÜÐ*:Ô;×GÑGÌÓJˆØ*0Ö@ °E¸R³K’uÐ@ˆÐ@Üˆ{Ó˜qÓ Ü—6‘6œ"Ÿ+™+ kÓ2Ó3Ð7GÓGÐGÐGñ	Hùâ@s   Á
BÁBc                  óx   — t         j                  } t        | ¬«      j                  t        «      }t        |«       y)zA
    Tests that HDBSCAN works when passed a callable metric.
    rW   N)r   Ú	euclideanr   rX   rA   r+   )rT   r'   s     r*   Útest_hdbscan_callable_metricr¢   õ   s,   € ô ×Ñ€FÜ˜FÔ#×/Ñ/´Ó2€FÜ˜Õr,   Útreer   r   c                 ó¬   — t        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.
    rS   ©rT   rp   z%precomputed is not a valid metric forrU   N)r   rY   rZ   r[   rC   rA   )r£   r‚   r^   s      r*   Ú"test_hdbscan_precomputed_non_bruter¦   þ   sC   € ô ˜°$Ô
7€CØ
1€CÜ	�‰”z¨Ô	-ñ Ø�‰”Œ
÷÷ ñ ús   «A
Á
AÚcsr_containerc                 ó0  — t        «       j                  t        «      j                  }t	        |«        | t        «      }|j                  «       }t        «       j                  |«      j                  }t        ||«       t        j                  dft        j                  dffD ]¤  \  }}t        j                  «       }||d<   t        «       j                  |«      j                  }t	        |«       |d   t        |   d   k(  sJ ‚|j                  «       }||d<   t        «       j                  |«      j                  }t        ||«       Œ¦ d}t        j                  t        |¬«      5  t        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.
    r0   r1   ©r   r   r   r    z4Sparse data matrices only support algorithm `brute`.rU   r¡   r   r¥   N)r   rC   rA   rD   r+   rB   r   r9   r?   r@   r	   rY   rZ   r[   )	r§   Údense_labelsÚ	_X_sparseÚX_sparseÚsparse_labelsÚoutlier_valr-   ÚX_denser^   s	            r*   Útest_hdbscan_sparser°   
  sM  € ô “9—=‘=¤Ó#×+Ñ+€LÜ˜Ô%áœaÓ €IØ�~‰~Ó€HÜ“I—M‘M (Ó+×3Ñ3€MÜ�| ]Ô3ô (*§v¡v¨zÐ&:¼R¿V¹VÀYÐ<OÐ%Pò 
8Ñ!ˆ�\Ü—&‘&“(ˆØ#ˆ�‰Ü“y—}‘} WÓ-×5Ñ5ˆÜ˜LÔ)Ø˜A‰Ô"3°LÑ"AÀ'Ñ"JÒJÐJÐJà—>‘>Ó#ˆØ$ˆ�‰Ü›	Ÿ™ hÓ/×7Ñ7ˆÜ˜<¨Õ7ð
8ð A€CÜ	�‰”z¨Ô	-ñ IÜ�{¨kÔ:×>Ñ>¸xÔH÷I÷ Iñ Iús   Å&FÆFrp   c                 óÒ  — ddg}t        dd|d¬«      \  }}t        d¬«      j                  |«      }t        ||j                  |j
                  «      D ]$  \  }}}t        ||d	d
¬«       t        ||d	d
¬«       Œ& t        | dt        j                  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.
    )rc   rc   )ç      @r²   iÐ  r   r‹   )r   r   ÚcentersÚcluster_stdÚboth)Ústore_centersr<   gš™™™™™©?)ÚrtolÚatol)rp   r¶   r˜   N)	r
   r   rC   ÚzipÚ
centroids_Úmedoids_r   rA   r{   )rp   r³   ÚHÚ_r‚   ÚcenterÚcentroidÚmedoids           r*   Útest_hdbscan_centersrÁ   -  sÞ   € ð ˜:Ð&€GÜ °1¸gÐSVÔW�D€A€qÜ
 Ô
'×
+Ñ
+¨AÓ
.€Cä$'¨°·±ÀÇÁÓ$Nò ;Ñ ˆ�˜&Ü˜ ¨q°tÕ<Ü˜ ¨Q°TÖ:ð;ô
 Ø¨6ÄAÇGÁGÈAÁJôç	�cŒ!ƒfð ð �>‰>×Ñ Ñ" aÒ'Ð'Ð'Ø�<‰<×Ñ˜aÑ  AÒ%Ð%Ñ%r,   c                  ó¼  — t         j                  j                  d«      } | j                  dd«      }t	        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¬«      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   é–   rs   r=   rc   ÚeomT)r˜   Úcluster_selection_epsilonÚcluster_selection_methodÚallow_single_cluster)Úreturn_countsr   é   g
×£p=
Ç?r   )r˜   rÅ   rÆ   rÇ   rp   N)r9   ÚrandomÚRandomStateÚrandr   rX   Úuniquer#   )ÚrngÚno_structurer'   Úunique_labelsÚcountss        r*   Ú.test_hdbscan_allow_single_cluster_with_epsilonrÒ   C  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        «       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   r   é   ç®Gáz®ï?N)r
   r   rC   rD   r#   r$   Úintr   )r³   rA   r&   r'   r)   s        r*   Útest_hdbscan_better_than_dbscanrÚ   d  s‹   € ð �uˆ~  t˜}¨q°!¨f°q¸"°gÐ>€GÜØØÚ+Øô	�D€A€qô ‹Y�]‰]˜1Ó×%Ñ%€Fä”S˜“[Ó!¤C¨¨f¨Ó$5Ñ5€JØ˜Š?Ðˆ?Ü˜& !Ó$ tÓ+r,   z	kwargs, XrS   r<   rs   r"   r×   c                 ó<   — t        dddi|¤Žj                  | «       y)zo
    Tests that HDBSCAN works correctly for array-likes and precomputed inputs
    with non-finite points.
    Úmin_samplesr<   Nr4   )r   rC   )rA   Úkwargss     r*   Útest_hdbscan_usable_inputsrÞ   x  s   € ô Ñ$˜Ð$˜VÑ$×(Ñ(¨Õ+r,   c                 óÔ   —  | t        j                  d«      «      }d}t        j                  t        |¬«      5  t        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 thanrU   rS   rW   N)r9   ÚzerosrY   rZ   r[   r   rC   ©r§   rA   r^   s      r*   Ú-test_hdbscan_sparse_distances_too_few_nonzerorâ   ˆ  sR   € ñ 	”b—h‘h˜xÓ(Ó)€Aà
/€CÜ	�‰”z¨Ô	-ñ -Ü�}Ô%×)Ñ)¨!Ô,÷-÷ -ñ -ú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¬	«      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=   é   z2HDBSCAN cannot be perfomed on a disconnected graphrU   rS   rW   )r9   rà   ÚTrY   rZ   r[   r   rC   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¨Ô	-ñ -Ü�}Ô%×)Ñ)¨!Ô,÷-÷ -ñ -ús   Á BÂBc                  óŠ  — d„ } d}t        j                  t        |¬«      5  t        d| ¬«      j	                  t
        «       ddd«       t        j                  t        |¬«      5  t        d| ¬«      j	                  t
        «       ddd«       t        t        t        j                  «      t        t        j                  «      z
  «      }t        |«      dkD  rHt        j                  t        |¬«      5  t        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\.rU   r   )rp   rT   Nr   r   )rY   rZ   r[   r   rC   rA   rG   r$   r   r~   r   r#   )Úmetric_callabler^   Úmetrics_not_kds      r*   Ú test_hdbscan_tree_invalid_metricrì   ¦  s  € ñ "€Oð	ð ô 
�‰”z¨Ô	-ñ DÜ˜)¨OÔ<×@Ñ@ÄÔC÷Dä	�‰”z¨Ô	-ñ FÜ˜+¨oÔ>×BÑBÄ1ÔE÷Fô
 œ#œh×4Ñ4Ó5¼¼F×<PÑ<PÓ8QÑQÓR€NÜ
ˆ>Ó˜QÒÜ�]‰]œ:¨SÔ1ñ 	JÜ˜i°¸qÑ0AÔB×FÑFÄqÔI÷	Jð 	Jð ÷Dð Dú÷Fð Fú÷	Jð 	Jús#   ¡!D!Á%!D-Ã3$D9Ä!D*Ä-D6Ä9Ec                  óÊ   — t        t        t        «      dz   ¬«      } 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<   )rÜ   z min_samples (.*) must be at mostrU   N)r   r#   rA   rY   rZ   r[   rC   )r‚   r^   s     r*   Ú!test_hdbscan_too_many_min_samplesrî   ¾  sI   € ô
 œc¤!›f q™jÔ
)€CØ
-€CÜ	�‰”z¨Ô	-ñ Ø�‰”Œ
÷÷ ñ ús   ºAÁA"c                  óð   — t         j                  «       } t        j                  | d<   d}t	        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-denserS   rW   rU   N)	rA   rB   r9   r@   r   rY   rZ   r[   rC   )ÚX_nanr^   r‚   s      r*   Ú"test_hdbscan_precomputed_dense_nanrñ   É  sY   € ô
 �F‰F‹H€EÜ—&‘&€Eˆ$�KØ
4€CÜ
˜Ô
'€CÜ	�‰”z¨Ô	-ñ Ø�‰�Œ÷÷ ñ ús   ÁA,Á,A5rÇ   TFÚepsilonrŠ   c                 óP  — d}t        || ddgddgddgg¬«      \  }}t        «       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³   r—   rs   r"   r×   r<   ©Úcondensed_treeÚclustersÚcluster_label_maprÇ   rÅ   N)r
   r   rC   r   Ú_single_linkage_tree_r˜   r   rG   r$   r9   ÚwhereÚ	vectorizer}   r   )Úglobal_random_seedrÇ   rò   r   rA   r&   Úeströ   r÷   rø   r'   Ú_yÚfirst_with_labelÚy_to_labelsÚaligned_targets                  r*   Útest_labelling_distinctr  Ö  sJ  € ð €IÜØØ'ð �ˆFØ�ˆGØ�ˆGð
ô		�D€A€qô ‹)�-‰-˜Ó
€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¸˜œBŸH™H Q¨"¡WÓ-¨aÑ0°Ñ3Ñ3ÐKÐÐKÜ>BÄ3ÀqÃ6»lÖK¸�2�vÐ.¨rÑ2Ñ3Ñ3ÐK€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      ø?rs   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| ¬«      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   rs   z>Cannot store centers when using a precomputed distance matrix.rU   rS   )rT   r¶   N)	r9   rÊ   rË   r   rY   rZ   r[   r   rC   )r¶   rÎ   rA   ÚX_distÚerr_msgs        r*   Ú0test_hdbscan_error_precomputed_and_store_centersr  %  sq   € ô �)‰)×
Ñ
 Ó
"€CØ�
‰
�8Ó€AÜ  Ó#€FØN€GÜ	�‰”z¨Ô	1ñ OÜ�}°MÔB×FÑFÀvÔN÷O÷ Oñ Oús   ÁA?Á?BÚ
valid_algor   r   c                 óD   — t        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
    Úcosiner¥   N)r   rX   rA   )r  s    r*   Ú*test_hdbscan_cosine_metric_valid_algorithmr  5  s   € ô �8 zÔ2×>Ñ>¼qÕAr,   Úinvalid_algoc                 ó¨   — t        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  r¥   zcosine is not a valid metricrU   N)r   rY   rZ   r[   rX   rA   )r  Úhdbscans     r*   Ú,test_hdbscan_cosine_metric_invalid_algorithmr  ?  sB   € ô
 ˜X°Ô>€GÜ	�‰”zÐ)GÔ	Hñ Ø×ÑœAÔ÷÷ ñ ús   ©AÁA)rØ   )JÚ__doc__Únumpyr9   rY   Ú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   rA   r&   Úfit_transformÚ
ALGORITHMSÚitemsr%   r+   ÚmarkÚparametrizerQ   r_   rj   rm   rƒ   rˆ   r“   r•   rš   rŸ   r¢   r¦   r°   rÁ   rÒ   rÚ   r  r?   rÞ   râ   rç   rì   rî   rñ   r  r
  r  r  r  )r½   Úouts   00r*   ú<module>r-     sÐ  ðñó
 Û Ý Ý "å #÷ñ õ
 ?Ý 'Ý 1ß Hß .Ý 0Ý !ß Fß >á˜C¨bÔ1�€€1Ùˆq�! !Ô$�€€1ÙÓ×"Ñ" 1Ó%€ò€
ð ˆdÐ1HÐ1B×1HÑ1HÓ1J×K¡v q¨#�c˜'“lÓKÑK€ó8ð ‡�×Ñ˜Ð):Ó;ñJó <ðJò>5ð0 ‡�×ÑÐ-Ð/Q°Ð/QÀ.Ð/QÓRñ ó Sð ò"	 ð ‡�×Ñ˜ Ó,Ø‡�×Ñ˜ >Ó2ñ$ó 3ó -ð$òN
0ð ‡�×Ñ˜¨Ó7ñ8ó 8ð8ò4 ò-ò	Hò ð ‡�×Ñ˜ )¨[Ð!9Ó:ñó ;ðð ‡�×Ñ˜¨.Ó9ñIó :ðIðD ‡�×Ñ˜ jÓ1ñ&ó 2ð&ò*,òB,ð( ‡�×ÑØà
�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ÐÐðóñ,óð,ð ‡�×Ñ˜¨.Ó9ñ	-ó :ð	-ð ‡�×Ñ˜¨.Ó9ñ-ó :ð-ò Jò0ò
ð ‡�×ÑÐ/°$¸°Ó?Ø‡�×Ñ˜ Q¨ HÓ-ñ!/ó .ó @ð!/òH&/ðR ‡�×Ñ˜¨:°xÐ*@ÓAñOó BðOð ‡�×Ñ˜¨°Ð'8Ó9ñBó :ðBð ‡�×Ñ˜¨)°[Ð)AÓBñó Cñùóu Ls   Â0M