lmdk_bgt.discount: Initial commit

This commit is contained in:
Manos Katsomallos 2021-07-25 18:40:54 +03:00
parent 44b1ac7e9c
commit 5f7c9d0945

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from datetime import datetime
from geopy.distance import distance from geopy.distance import distance
import math import math
import numpy as np import numpy as np
@ -420,6 +421,52 @@ def sample(seq, lmdks, epsilon):
return rls_data, bgts, skipped return rls_data, bgts, skipped
def discount(seq, lmdks, epsilon):
'''
Temporally discounted sampling.
Parameters:
seq - The point sequence.
lmdks - The landmarks.
epsilon - The available privacy budget.
Returns:
rls_data - The perturbed data.
bgts - The privacy budget allocation.
skipped - The number of skipped releases.
'''
# Uniform budget allocation
bgts = uniform(seq, lmdks, epsilon)
# Released
rls_data = [None]*len(seq)
# Track landmarks
lmdk_cur = 0
# Track skipped releases
skipped = 0
for i, p in enumerate(seq):
# The sampling rate
samp_rt = datetime.fromtimestamp(int(lmdks[lmdk_cur][3]))/datetime.fromtimestamp(int(lmdks[len(lmdks) - 1][3]))
# Check if current point is a landmark
if lmdk_lib.is_landmark(p, lmdks):
lmdk_cur += 1
# Get coordinates
loc = (p[1], p[2])
if i == 0 or lmdk_lib.should_sample(samp_rt):
# Add noise to original data
new_loc = lmdk_lib.add_polar_noise(loc, bgts[i])
rls_data[i] = [p[0], new_loc[0], new_loc[1], p[3]]
else:
skipped += 1
# Skip current release and approximate with previous
rls_data[i] = rls_data[i - 1]
if lmdk_lib.is_landmark(p, lmdks):
# Allocate the current budget to the following releases uniformly
for j in range(i + 1, len(seq)):
bgts[j] += bgts[i]/(len(lmdks) - lmdk_cur + 1)
# No budget was spent
bgts[i] = 0
return rls_data, bgts, skipped
def uniform_r(seq, lmdks, epsilon): def uniform_r(seq, lmdks, epsilon):
# Released # Released
rls_data = [None]*len(seq) rls_data = [None]*len(seq)