#[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 {
if budget.log_bound >= max_budget {
0
} else {
max_budget - budget.log_bound
}
}
}