#[cfg(feature = "__commons_serialization")]
use serde::{Deserialize, Serialize};
pub trait DispersionParameter: Copy {
fn get_standard_dev(&self) -> f64;
fn get_variance(&self) -> f64;
fn get_log_standard_dev(&self) -> f64;
fn get_modular_standard_dev(&self, log2_modulus: u32) -> f64;
fn get_modular_variance(&self, log2_modulus: u32) -> f64;
fn get_modular_log_standard_dev(&self, log2_modulus: u32) -> f64;
}
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
pub struct LogStandardDev(pub f64);
impl LogStandardDev {
pub fn from_log_standard_dev(log_std: f64) -> LogStandardDev {
LogStandardDev(log_std)
}
pub fn from_modular_log_standard_dev(log_std: f64, log2_modulus: u32) -> LogStandardDev {
LogStandardDev(log_std - log2_modulus as f64)
}
}
impl DispersionParameter for LogStandardDev {
fn get_standard_dev(&self) -> f64 {
f64::powf(2., self.0)
}
fn get_variance(&self) -> f64 {
f64::powf(2., self.0 * 2.)
}
fn get_log_standard_dev(&self) -> f64 {
self.0
}
fn get_modular_standard_dev(&self, log2_modulus: u32) -> f64 {
f64::powf(2., log2_modulus as f64 + self.0)
}
fn get_modular_variance(&self, log2_modulus: u32) -> f64 {
f64::powf(2., (log2_modulus as f64 + self.0) * 2.)
}
fn get_modular_log_standard_dev(&self, log2_modulus: u32) -> f64 {
log2_modulus as f64 + self.0
}
}
#[cfg_attr(feature = "__commons_serialization", derive(Serialize, Deserialize))]
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
pub struct StandardDev(pub f64);
impl StandardDev {
pub fn from_standard_dev(std: f64) -> StandardDev {
StandardDev(std)
}
pub fn from_modular_standard_dev(std: f64, log2_modulus: u32) -> StandardDev {
StandardDev(std / 2_f64.powf(log2_modulus as f64))
}
}
impl DispersionParameter for StandardDev {
fn get_standard_dev(&self) -> f64 {
self.0
}
fn get_variance(&self) -> f64 {
self.0.powi(2)
}
fn get_log_standard_dev(&self) -> f64 {
self.0.log2()
}
fn get_modular_standard_dev(&self, log2_modulus: u32) -> f64 {
2_f64.powf(log2_modulus as f64 + self.0.log2())
}
fn get_modular_variance(&self, log2_modulus: u32) -> f64 {
2_f64.powf(2. * (log2_modulus as f64 + self.0.log2()))
}
fn get_modular_log_standard_dev(&self, log2_modulus: u32) -> f64 {
log2_modulus as f64 + self.0.log2()
}
}
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
pub struct Variance(pub f64);
impl Variance {
pub fn from_variance(var: f64) -> Variance {
Variance(var)
}
pub fn from_modular_variance(var: f64, log2_modulus: u32) -> Variance {
Variance(var / 2_f64.powf(log2_modulus as f64 * 2.))
}
}
impl DispersionParameter for Variance {
fn get_standard_dev(&self) -> f64 {
self.0.sqrt()
}
fn get_variance(&self) -> f64 {
self.0
}
fn get_log_standard_dev(&self) -> f64 {
self.0.sqrt().log2()
}
fn get_modular_standard_dev(&self, log2_modulus: u32) -> f64 {
2_f64.powf(log2_modulus as f64 + self.0.sqrt().log2())
}
fn get_modular_variance(&self, log2_modulus: u32) -> f64 {
2_f64.powf(2. * (log2_modulus as f64 + self.0.sqrt().log2()))
}
fn get_modular_log_standard_dev(&self, log2_modulus: u32) -> f64 {
log2_modulus as f64 + self.0.sqrt().log2()
}
}