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)
예제 #2
0
 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))
예제 #3
0
 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))
예제 #4
0
 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)
예제 #8
0
 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))