def test_compute_dp_sum(self): params = dp_computations.MeanVarParams( eps=0.5, delta=1e-10, min_value=2, max_value=3, max_partitions_contributed=1, max_contributions_per_partition=1, noise_kind=NoiseKind.LAPLACE) l0_sensitivity = params.l0_sensitivity() linf_sensitivity = params.max_contributions_per_partition * max( params.min_value, params.max_value) # Laplace Mechanism l1_sensitivity = dp_computations.compute_l1_sensitivity( l0_sensitivity, linf_sensitivity) results = [ dp_computations.compute_dp_sum(sum=10, dp_params=params) for _ in range(N_ITERATIONS) ] self._test_laplace_noise(results, 10, params.eps, l1_sensitivity) # Gaussian Mechanism params.noise_kind = NoiseKind.GAUSSIAN l2_sensitivity = dp_computations.compute_l2_sensitivity( l0_sensitivity, linf_sensitivity) results = [ dp_computations.compute_dp_sum(sum=10, dp_params=params) for _ in range(N_ITERATIONS) ] self._test_gaussian_noise(results, 10, params.eps, params.delta, l2_sensitivity)
def mean_var_params(self): return dp_computations.MeanVarParams( self.eps, self.delta, self.aggregate_params.min_value, self.aggregate_params.max_value, self.aggregate_params.max_partitions_contributed, self.aggregate_params.max_contributions_per_partition, self.aggregate_params.noise_kind)
def test_l0_sensitivity(self): params = dp_computations.MeanVarParams( eps=1, delta=1e-10, min_value=2, max_value=3, max_partitions_contributed=4, max_contributions_per_partition=5, noise_kind=NoiseKind.LAPLACE) self.assertEqual(params.l0_sensitivity(), 4)
def test_compute_dp_var(self): params = dp_computations.MeanVarParams( eps=10, delta=1e-10, min_value=1, max_value=20, max_partitions_contributed=1, max_contributions_per_partition=1, noise_kind=NoiseKind.LAPLACE) (count_eps, count_delta), (_, _), (_, _) = dp_computations.equally_split_budget( params.eps, params.delta, 3) l0_sensitivity = params.l0_sensitivity() count_linf_sensitivity = params.max_contributions_per_partition # Laplace Mechanism results = [ dp_computations.compute_dp_var(count=100000, sum=1000000, sum_squares=20000000, dp_params=params) for _ in range(N_ITERATIONS) ] count_values, sum_values, sum_squares_values, var_values = zip( *results) self._test_laplace_noise( count_values, 100000, count_eps, dp_computations.compute_l1_sensitivity(l0_sensitivity, count_linf_sensitivity)) self.assertAlmostEqual(np.mean(sum_values), 1000000, delta=1) self.assertAlmostEqual(np.mean(sum_squares_values), 20000000, delta=2) self.assertAlmostEqual(np.mean(var_values), 100, delta=0.1) # Gaussian Mechanism params.noise_kind = NoiseKind.GAUSSIAN results = [ dp_computations.compute_dp_var(count=100000, sum=1000000, sum_squares=20000000, dp_params=params) for _ in range(N_ITERATIONS) ] count_values, sum_values, sum_squares_values, var_values = zip( *results) self._test_gaussian_noise( count_values, 100000, count_eps, count_delta, dp_computations.compute_l2_sensitivity(l0_sensitivity, count_linf_sensitivity)) self.assertAlmostEqual(np.mean(sum_values), 1000000, delta=5) self.assertAlmostEqual(np.mean(sum_squares_values), 20000000, delta=5) self.assertAlmostEqual(np.mean(var_values), 100, delta=0.5)