-
Notifications
You must be signed in to change notification settings - Fork 196
/
test_LaplaceBoundedNoise.py
116 lines (86 loc) · 3.48 KB
/
test_LaplaceBoundedNoise.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import numpy as np
from unittest import TestCase
from diffprivlib.mechanisms import LaplaceBoundedNoise
from diffprivlib.utils import global_seed
class TestLaplaceBoundedNoise(TestCase):
def setup_method(self, method):
if method.__name__ .endswith("prob"):
global_seed(314159)
self.mech = LaplaceBoundedNoise()
def teardown_method(self, method):
del self.mech
def test_not_none(self):
self.assertIsNotNone(self.mech)
def test_class(self):
from diffprivlib.mechanisms import DPMechanism
self.assertTrue(issubclass(LaplaceBoundedNoise, DPMechanism))
def test_no_params(self):
with self.assertRaises(ValueError):
self.mech.randomise(1)
def test_no_sensitivity(self):
self.mech.set_epsilon_delta(1, 0.1)
with self.assertRaises(ValueError):
self.mech.randomise(1)
def test_no_epsilon(self):
self.mech.set_sensitivity(1)
with self.assertRaises(ValueError):
self.mech.randomise(1)
def test_neg_epsilon(self):
self.mech.set_sensitivity(1)
with self.assertRaises(ValueError):
self.mech.set_epsilon_delta(-1, 0.1)
def test_inf_epsilon(self):
self.mech.set_sensitivity(1).set_epsilon_delta(float("inf"), 0.1)
for i in range(1000):
self.assertEqual(self.mech.randomise(1), 1)
def test_zero_epsilon(self):
self.mech.set_sensitivity(1)
with self.assertRaises(ValueError):
self.mech.set_epsilon_delta(0, 0.1)
def test_complex_epsilon(self):
with self.assertRaises(TypeError):
self.mech.set_epsilon_delta(1+2j, 0.25)
def test_string_epsilon(self):
with self.assertRaises(TypeError):
self.mech.set_epsilon_delta("Two", 0.25)
def test_no_delta(self):
self.mech.set_sensitivity(1)
with self.assertRaises(ValueError):
self.mech.set_epsilon(1)
def test_large_delta(self):
self.mech.set_sensitivity(1)
with self.assertRaises(ValueError):
self.mech.set_epsilon_delta(1, 0.6)
def test_non_numeric(self):
self.mech.set_sensitivity(1).set_epsilon_delta(1, 0.1)
with self.assertRaises(TypeError):
self.mech.randomise("Hello")
def test_zero_median_prob(self):
self.mech.set_sensitivity(1).set_epsilon_delta(1, 0.1)
vals = []
for i in range(10000):
vals.append(self.mech.randomise(0.5))
median = float(np.median(vals))
self.assertAlmostEqual(np.abs(median), 0.5, delta=0.1)
def test_neighbors_prob(self):
runs = 10000
delta = 0.1
self.mech.set_sensitivity(1).set_epsilon_delta(1, delta)
count = [0, 0]
for i in range(runs):
val0 = self.mech.randomise(0)
if val0 <= 1 - self.mech._noise_bound:
count[0] += 1
val1 = self.mech.randomise(1)
if val1 >= self.mech._noise_bound:
count[1] += 1
self.assertAlmostEqual(count[0] / runs, delta, delta=delta/10)
self.assertAlmostEqual(count[1] / runs, delta, delta=delta/10)
def test_within_bounds(self):
self.mech.set_sensitivity(1).set_epsilon_delta(1, 0.1)
vals = []
for i in range(1000):
vals.append(self.mech.randomise(0))
vals = np.array(vals)
self.assertTrue(np.all(vals >= -self.mech._noise_bound))
self.assertTrue(np.all(vals <= self.mech._noise_bound))