1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use crate::fvalue::FValue; pub trait Sensitivity { fn point_sensitivity(&self, x: usize) -> u32; fn max_sensitivity(&self) -> u32; fn mean_sensitivity(&self) -> f32; } impl Sensitivity for FValue<bool> { fn point_sensitivity(&self, x: usize) -> u32 { let value = self.get(x).unwrap(); (0..self.n_vars()) .map(move |b| x ^ (1 << b)) .filter(move |y| self.get(*y).unwrap() != value) .count() as u32 } fn max_sensitivity(&self) -> u32 { let max_value = 1 << self.n_vars(); (0..max_value) .map(|x| self.point_sensitivity(x)) .max() .unwrap() } fn mean_sensitivity(&self) -> f32 { let max_value = 1 << self.n_vars(); (0..max_value) .map(|x| self.point_sensitivity(x)) .sum::<u32>() as f32 / max_value as f32 } }