use crate::{ClusteringError, Result};
use ndarray::{Array1, Array2, ArrayView2};
#[derive(Debug, Clone, Copy)]
pub enum Linkage {
Single,
Complete,
Average,
Ward,
Centroid,
}
pub struct AgglomerativeClustering {
n_clusters: Option<usize>,
linkage: Linkage,
distance_threshold: Option<f64>,
compute_full_tree: bool,
}
impl AgglomerativeClustering {
pub fn builder() -> AgglomerativeClusteringBuilder {
AgglomerativeClusteringBuilder::new()
}
pub fn new(n_clusters: usize) -> Self {
Self::builder().n_clusters(Some(n_clusters)).build()
}
pub fn fit(&self, data: &ArrayView2<f64>) -> Result<HierarchicalResult> {
unimplemented!("AgglomerativeClustering::fit")
}
}
pub struct AgglomerativeClusteringBuilder {
n_clusters: Option<usize>,
linkage: Linkage,
distance_threshold: Option<f64>,
compute_full_tree: bool,
}
impl AgglomerativeClusteringBuilder {
pub fn new() -> Self {
Self {
n_clusters: None,
linkage: Linkage::Ward,
distance_threshold: None,
compute_full_tree: false,
}
}
pub fn n_clusters(mut self, n: Option<usize>) -> Self {
self.n_clusters = n;
self
}
pub fn linkage(mut self, linkage: Linkage) -> Self {
self.linkage = linkage;
self
}
pub fn distance_threshold(mut self, threshold: Option<f64>) -> Self {
self.distance_threshold = threshold;
self
}
pub fn compute_full_tree(mut self, compute: bool) -> Self {
self.compute_full_tree = compute;
self
}
pub fn build(self) -> AgglomerativeClustering {
AgglomerativeClustering {
n_clusters: self.n_clusters,
linkage: self.linkage,
distance_threshold: self.distance_threshold,
compute_full_tree: self.compute_full_tree,
}
}
}
pub struct HierarchicalResult {
pub labels: Array1<usize>,
dendrogram: Option<Dendrogram>,
}
impl HierarchicalResult {
pub fn labels(&self) -> &Array1<usize> {
&self.labels
}
pub fn dendrogram(&self) -> Result<&Dendrogram> {
self.dendrogram.as_ref().ok_or_else(|| {
ClusteringError::InvalidParameter("compute_full_tree was not enabled".to_string())
})
}
}
pub struct Dendrogram {
}
impl Dendrogram {
pub fn plot(&self) -> DendrogramPlot {
unimplemented!("Dendrogram::plot")
}
}
pub struct DendrogramPlot;
impl DendrogramPlot {
pub fn save(&self, path: &str) -> Result<()> {
unimplemented!("DendrogramPlot::save")
}
}