use crate::DType;
use numr::error::Result;
use numr::ops::DistanceMetric;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ClusterSelectionMethod {
#[default]
EOM,
Leaf,
}
#[derive(Debug, Clone)]
pub struct HdbscanOptions {
pub min_cluster_size: usize,
pub min_samples: Option<usize>,
pub metric: DistanceMetric,
pub cluster_selection_method: ClusterSelectionMethod,
pub allow_single_cluster: bool,
}
impl Default for HdbscanOptions {
fn default() -> Self {
Self {
min_cluster_size: 5,
min_samples: None,
metric: DistanceMetric::Euclidean,
cluster_selection_method: ClusterSelectionMethod::EOM,
allow_single_cluster: false,
}
}
}
#[derive(Debug, Clone)]
pub struct HdbscanResult<R: Runtime<DType = DType>> {
pub labels: Tensor<R>,
pub probabilities: Tensor<R>,
pub cluster_persistence: Tensor<R>,
}
pub trait HdbscanAlgorithms<R: Runtime<DType = DType>> {
fn hdbscan(&self, data: &Tensor<R>, options: &HdbscanOptions) -> Result<HdbscanResult<R>>;
}