solvr 0.2.0-beta.2

Advanced computing library for real-world problem solving - optimization, differential equations, interpolation, statistics, and more
Documentation
//! Affinity Propagation clustering trait.
use crate::DType;

use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;

/// Options for Affinity Propagation.
#[derive(Debug, Clone)]
pub struct AffinityPropagationOptions {
    /// Damping factor in [0.5, 1.0).
    pub damping: f64,
    /// Maximum iterations.
    pub max_iter: usize,
    /// Number of iterations with no change for convergence.
    pub convergence_iter: usize,
    /// Preference (self-similarity). None = median of similarities.
    pub preference: Option<f64>,
}

impl Default for AffinityPropagationOptions {
    fn default() -> Self {
        Self {
            damping: 0.5,
            max_iter: 200,
            convergence_iter: 15,
            preference: None,
        }
    }
}

/// Result of Affinity Propagation.
#[derive(Debug, Clone)]
pub struct AffinityPropagationResult<R: Runtime<DType = DType>> {
    /// Cluster labels `[n]` I64.
    pub labels: Tensor<R>,
    /// Indices of exemplars `[k]` I64.
    pub cluster_centers_indices: Tensor<R>,
    /// Number of iterations run.
    pub n_iter: usize,
}

/// Affinity Propagation clustering algorithms.
pub trait AffinityPropagationAlgorithms<R: Runtime<DType = DType>> {
    /// Run Affinity Propagation on a similarity matrix `[n, n]`.
    fn affinity_propagation(
        &self,
        similarities: &Tensor<R>,
        options: &AffinityPropagationOptions,
    ) -> Result<AffinityPropagationResult<R>>;
}