use crate::{ClusteringError, Result};
use ndarray::{Array1, Array2, ArrayView2};
#[derive(Debug, Clone)]
pub enum AffinityType {
Precomputed,
NearestNeighbors { n_neighbors: usize },
RBF { gamma: f64 },
}
#[derive(Debug, Clone, Copy)]
pub enum EigenSolver {
Arpack,
Lobpcg,
Dense,
}
#[derive(Debug, Clone, Copy)]
pub enum AssignMethod {
KMeans,
Discretize,
}
pub struct SpectralClustering {
n_clusters: usize,
affinity: AffinityType,
eigen_solver: EigenSolver,
assign_labels: AssignMethod,
}
impl SpectralClustering {
pub fn builder(n_clusters: usize) -> SpectralClusteringBuilder {
SpectralClusteringBuilder::new(n_clusters)
}
pub fn new(n_clusters: usize) -> Self {
Self::builder(n_clusters).build()
}
pub fn fit_predict(&self, data: &ArrayView2<f64>) -> Result<Array1<usize>> {
unimplemented!("SpectralClustering::fit_predict")
}
}
pub struct SpectralClusteringBuilder {
n_clusters: usize,
affinity: AffinityType,
eigen_solver: EigenSolver,
assign_labels: AssignMethod,
}
impl SpectralClusteringBuilder {
pub fn new(n_clusters: usize) -> Self {
Self {
n_clusters,
affinity: AffinityType::RBF { gamma: 1.0 },
eigen_solver: EigenSolver::Arpack,
assign_labels: AssignMethod::KMeans,
}
}
pub fn affinity(mut self, affinity: AffinityType) -> Self {
self.affinity = affinity;
self
}
pub fn eigen_solver(mut self, solver: EigenSolver) -> Self {
self.eigen_solver = solver;
self
}
pub fn assign_labels(mut self, method: AssignMethod) -> Self {
self.assign_labels = method;
self
}
pub fn build(self) -> SpectralClustering {
SpectralClustering {
n_clusters: self.n_clusters,
affinity: self.affinity,
eigen_solver: self.eigen_solver,
assign_labels: self.assign_labels,
}
}
}