pub struct DifferentialPrivacyEngine {
pub budget: BudgetTracker,
/* private fields */
}Expand description
Production-grade differential-privacy engine.
Manages a privacy budget, generates calibrated noise, and records an auditable history of answered queries.
Fields§
§budget: BudgetTrackerLive budget tracker.
Implementations§
Source§impl DifferentialPrivacyEngine
impl DifferentialPrivacyEngine
Sourcepub fn new(epsilon_budget: f64, delta_budget: f64, max_history: usize) -> Self
pub fn new(epsilon_budget: f64, delta_budget: f64, max_history: usize) -> Self
Construct a new engine with the given budget parameters.
The PRNG is seeded with 0xDEADBEEF42.
Sourcepub fn compute_noise_scale(mechanism: &PrivacyMechanism) -> NoiseScale
pub fn compute_noise_scale(mechanism: &PrivacyMechanism) -> NoiseScale
Compute the noise scale for a given mechanism.
- Laplace:
scale = sensitivity / epsilon - Gaussian:
scale = sensitivity * sqrt(2 * ln(1.25 / delta)) / epsilon - Randomized:
scale = 1 / (exp(epsilon) + 1)(flip probability)
Sourcepub fn sample_laplace(&mut self, scale: f64) -> f64
pub fn sample_laplace(&mut self, scale: f64) -> f64
Sample from Laplace(0, scale) using the inverse-CDF method.
Formula: -scale * sign(u - 0.5) * ln(1 - 2 * |u - 0.5|).
If the argument to ln is ≤ 0, uses 1e-10 as a floor.
Sourcepub fn sample_gaussian(&mut self, scale: f64) -> f64
pub fn sample_gaussian(&mut self, scale: f64) -> f64
Sample from Gaussian(0, scale) using the Box-Muller transform.
Draws two uniform samples u1, u2 ∈ (0,1), then:
z = sqrt(-2 * ln(u1)) * cos(2π * u2).
If u1 ≤ 0, uses 1e-10 as a floor.
Sourcepub fn apply_mechanism(
&mut self,
query: &DpQuery,
true_value: f64,
) -> Result<DpResult, DpError>
pub fn apply_mechanism( &mut self, query: &DpQuery, true_value: f64, ) -> Result<DpResult, DpError>
Answer a single differentially-private query.
- Validates mechanism parameters.
- Checks that the budget is not exhausted.
- Generates calibrated noise.
- Charges epsilon (and delta for Gaussian) to the budget.
- Records the result in history and returns it.
Sourcepub fn apply_batch(
&mut self,
queries: &[(DpQuery, f64)],
) -> Vec<Result<DpResult, DpError>>
pub fn apply_batch( &mut self, queries: &[(DpQuery, f64)], ) -> Vec<Result<DpResult, DpError>>
Answer a batch of queries, applying each in sequence.
Each result is Ok if the query succeeded, or Err if the budget
was exhausted or parameters were invalid. Later queries in the batch
see the already-reduced budget from earlier queries.
Sourcepub fn compose_sequential(results: &[DpResult]) -> f64
pub fn compose_sequential(results: &[DpResult]) -> f64
Sequential composition: total epsilon = sum of per-query privacy costs.
Sourcepub fn compose_advanced(results: &[DpResult], delta: f64) -> f64
pub fn compose_advanced(results: &[DpResult], delta: f64) -> f64
Advanced composition theorem (Dwork et al. 2010).
For k independent (ε, 0)-DP mechanisms:
ε_total = sqrt(2k ln(1/δ)) * ε + k * ε * (exp(ε) - 1)where ε is the maximum per-query cost and k is the number of queries.
Returns the sequential bound when results is empty.
Sourcepub fn sensitivity_clip(values: &[f64], sensitivity: f64) -> Vec<f64>
pub fn sensitivity_clip(values: &[f64], sensitivity: f64) -> Vec<f64>
Clip each value to the range [-sensitivity, sensitivity].
This enforces global sensitivity bounds before computing statistics.
Sourcepub fn budget_stats(&self) -> BudgetTracker
pub fn budget_stats(&self) -> BudgetTracker
Return a clone of the current budget tracker.
Sourcepub fn history(&self) -> &VecDeque<DpResult>
pub fn history(&self) -> &VecDeque<DpResult>
Return a reference to the bounded query-result history.
Sourcepub fn budget_mut(&mut self) -> &mut BudgetTracker
pub fn budget_mut(&mut self) -> &mut BudgetTracker
Return a mutable reference to the budget tracker (for testing / integration).
Sourcepub fn clear_history(&mut self)
pub fn clear_history(&mut self)
Clear the query history.
Auto Trait Implementations§
impl Freeze for DifferentialPrivacyEngine
impl RefUnwindSafe for DifferentialPrivacyEngine
impl Send for DifferentialPrivacyEngine
impl Sync for DifferentialPrivacyEngine
impl Unpin for DifferentialPrivacyEngine
impl UnsafeUnpin for DifferentialPrivacyEngine
impl UnwindSafe for DifferentialPrivacyEngine
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more