def from_gaussian_mechanism( cls, standard_deviation: float, sensitivity: float = 1, pessimistic_estimate: bool = True, value_discretization_interval: float = 1e-4, log_mass_truncation_bound: float = -50) -> 'PrivacyLossDistribution': """Creates the privacy loss distribution of the Gaussian mechanism. Args: standard_deviation: the standard_deviation of the Gaussian distribution. sensitivity: the sensitivity of function f. (i.e. the maximum absolute change in f when an input to a single user changes.) pessimistic_estimate: a value indicating whether the rounding is done in such a way that the resulting epsilon-hockey stick divergence computation gives an upper estimate to the real value. value_discretization_interval: the length of the dicretization interval for the privacy loss distribution. The values will be rounded up/down to be integer multiples of this number. log_mass_truncation_bound: the ln of the probability mass that might be discarded from the noise distribution. The larger this number, the more error it may introduce in divergence calculations. Returns: The privacy loss distribution corresponding to the Gaussian mechanism with given parameters. """ return PrivacyLossDistribution.create_from_additive_noise( privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity, pessimistic_estimate=pessimistic_estimate, log_mass_truncation_bound=log_mass_truncation_bound), pessimistic_estimate=pessimistic_estimate, value_discretization_interval=value_discretization_interval)
def test_gaussian_get_delta_for_epsilon(self, standard_deviation, sensitivity, epsilon, expected_delta): pl = privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity) self.assertAlmostEqual(expected_delta, pl.get_delta_for_epsilon(epsilon))
def test_gaussian_inverse_privacy_loss(self, standard_deviation, sensitivity, privacy_loss, expected_x): pl = privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity) self.assertAlmostEqual(expected_x, pl.inverse_privacy_loss(privacy_loss))
def test_gaussian_value_errors(self, standard_deviation, sensitivity, log_mass_truncation_bound=-50): with self.assertRaises(ValueError): privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity, log_mass_truncation_bound=log_mass_truncation_bound)
def test_gaussian_privacy_loss(self, standard_deviation, sensitivity, sampling_prob, adjacency_type, x, expected_privacy_loss): pl = privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity, sampling_prob=sampling_prob, adjacency_type=adjacency_type) self.assertAlmostEqual(expected_privacy_loss, pl.privacy_loss(x))
def test_gaussian_get_delta_for_epsilon(self, standard_deviation, sensitivity, sampling_prob, adjacency_type, epsilon, expected_delta): pl = privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity, sampling_prob=sampling_prob, adjacency_type=adjacency_type) self.assertAlmostEqual(expected_delta, pl.get_delta_for_epsilon(epsilon))
def test_gaussian_value_errors(self, standard_deviation, sensitivity, sampling_prob=1.0, adjacency_type=ADD, log_mass_truncation_bound=-50): with self.assertRaises(ValueError): privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity, log_mass_truncation_bound=log_mass_truncation_bound, sampling_prob=sampling_prob, adjacency_type=adjacency_type)
def test_gaussian_privacy_loss_tail( self, standard_deviation, sensitivity, expected_lower_x_truncation, expected_upper_x_truncation, pessimistic_estimate, expected_tail_probability_mass_function): pl = privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity, pessimistic_estimate=pessimistic_estimate, log_mass_truncation_bound=math.log(2) + stats.norm.logcdf(-1)) tail_pld = pl.privacy_loss_tail() self.assertAlmostEqual(expected_lower_x_truncation, tail_pld.lower_x_truncation) self.assertAlmostEqual(expected_upper_x_truncation, tail_pld.upper_x_truncation) test_util.dictionary_almost_equal( self, expected_tail_probability_mass_function, tail_pld.tail_probability_mass_function)
def test_gaussian_privacy_loss(self, standard_deviation, sensitivity, x, expected_privacy_loss): pl = privacy_loss_mechanism.GaussianPrivacyLoss( standard_deviation, sensitivity=sensitivity) self.assertAlmostEqual(expected_privacy_loss, pl.privacy_loss(x))