use crate::EigenTrustError;
#[derive(Debug, Clone, PartialEq)]
pub struct EigenTrustOptions {
alpha: f64,
epsilon: Option<f64>,
max_iterations: usize,
}
impl EigenTrustOptions {
pub const DEFAULT_ALPHA: f64 = 0.5;
pub const DEFAULT_MAX_ITERATIONS: usize = 10_000;
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_alpha(mut self, alpha: f64) -> Self {
self.alpha = alpha;
self
}
#[must_use]
pub fn with_epsilon(mut self, epsilon: f64) -> Self {
self.epsilon = Some(epsilon);
self
}
#[must_use]
pub fn with_max_iterations(mut self, max_iterations: usize) -> Self {
self.max_iterations = max_iterations;
self
}
pub fn alpha(&self) -> f64 {
self.alpha
}
pub fn epsilon(&self) -> Option<f64> {
self.epsilon
}
pub fn max_iterations(&self) -> usize {
self.max_iterations
}
pub(crate) fn validate(&self) -> Result<(), EigenTrustError> {
if !(0.0..=1.0).contains(&self.alpha) {
return Err(EigenTrustError::InvalidAlpha(self.alpha));
}
if let Some(e) = self.epsilon {
if !(e.is_finite() && e > 0.0) {
return Err(EigenTrustError::InvalidEpsilon(e));
}
}
if self.max_iterations == 0 {
return Err(EigenTrustError::InvalidMaxIterations);
}
Ok(())
}
pub(crate) fn epsilon_for(&self, peers: usize) -> f64 {
self.epsilon.unwrap_or(1e-6 / peers as f64)
}
}
impl Default for EigenTrustOptions {
fn default() -> Self {
EigenTrustOptions {
alpha: Self::DEFAULT_ALPHA,
epsilon: None,
max_iterations: Self::DEFAULT_MAX_ITERATIONS,
}
}
}