#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct NoiseBudget {
pub log_bound: u32,
}
impl NoiseBudget {
pub fn fresh(initial_bound: u32) -> Self {
NoiseBudget {
log_bound: initial_bound,
}
}
pub fn after_add(a: &NoiseBudget, b: &NoiseBudget) -> NoiseBudget {
let max_log = if a.log_bound > b.log_bound {
a.log_bound
} else {
b.log_bound
};
NoiseBudget {
log_bound: max_log + 1,
}
}
pub fn after_mul(a: &NoiseBudget, b: &NoiseBudget, n: usize) -> NoiseBudget {
let log_n = (n as u32).trailing_zeros();
NoiseBudget {
log_bound: a.log_bound + b.log_bound + log_n,
}
}
pub fn after_bootstrap(bootstrap_noise: u32) -> NoiseBudget {
NoiseBudget {
log_bound: bootstrap_noise,
}
}
pub fn needs_bootstrap(budget: &NoiseBudget, max_budget: u32) -> bool {
budget.log_bound >= max_budget
}
pub fn remaining(budget: &NoiseBudget, max_budget: u32) -> u32 {
max_budget.saturating_sub(budget.log_bound)
}
}