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 LinkageMethod {
Single,
Complete,
#[default]
Average,
Weighted,
Centroid,
Median,
Ward,
}
#[derive(Debug, Clone)]
pub enum FClusterCriterion {
Distance(f64),
MaxClust(usize),
}
#[derive(Debug, Clone)]
pub struct LinkageMatrix<R: Runtime<DType = DType>> {
pub z: Tensor<R>,
}
pub trait HierarchyAlgorithms<R: Runtime<DType = DType>> {
fn linkage(
&self,
distances: &Tensor<R>,
n: usize,
method: LinkageMethod,
) -> Result<LinkageMatrix<R>>;
fn linkage_from_data(
&self,
data: &Tensor<R>,
method: LinkageMethod,
metric: DistanceMetric,
) -> Result<LinkageMatrix<R>>;
fn fcluster(&self, z: &LinkageMatrix<R>, criterion: FClusterCriterion) -> Result<Tensor<R>>;
fn fclusterdata(
&self,
data: &Tensor<R>,
criterion: FClusterCriterion,
method: LinkageMethod,
metric: DistanceMetric,
) -> Result<Tensor<R>>;
fn leaves_list(&self, z: &LinkageMatrix<R>) -> Result<Tensor<R>>;
fn cut_tree(&self, z: &LinkageMatrix<R>, n_clusters: &[usize]) -> Result<Tensor<R>>;
}