use crate::DType;
use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
use super::kmeans::KMeansResult;
#[derive(Debug, Clone)]
pub enum AffinityType {
RBF { gamma: Option<f64> },
NearestNeighbors { n_neighbors: usize },
Precomputed,
}
impl Default for AffinityType {
fn default() -> Self {
Self::RBF { gamma: None }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum LaplacianType {
Unnormalized,
RandomWalk,
#[default]
SymmetricNormalized,
}
#[derive(Debug, Clone)]
pub struct SpectralOptions {
pub n_clusters: usize,
pub affinity: AffinityType,
pub laplacian: LaplacianType,
pub n_init: usize,
}
impl Default for SpectralOptions {
fn default() -> Self {
Self {
n_clusters: 8,
affinity: AffinityType::default(),
laplacian: LaplacianType::default(),
n_init: 10,
}
}
}
pub trait SpectralClusteringAlgorithms<R: Runtime<DType = DType>> {
fn spectral_clustering(
&self,
data: &Tensor<R>,
options: &SpectralOptions,
) -> Result<KMeansResult<R>>;
}