From ceab96bea39f1fb7447a5fa8811c40fdeeacdf0e Mon Sep 17 00:00:00 2001 From: Manos Date: Fri, 8 Oct 2021 20:14:06 +0200 Subject: [PATCH] lmdk_bgt: Tested dynamic --- code/lib/lmdk_bgt.py | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/code/lib/lmdk_bgt.py b/code/lib/lmdk_bgt.py index 8ff6a7f..b4b8518 100644 --- a/code/lib/lmdk_bgt.py +++ b/code/lib/lmdk_bgt.py @@ -343,6 +343,58 @@ def adaptive(seq, lmdks, epsilon, inc_rt, dec_rt): return rls_data, bgts, skipped +def dynamic(seq, lmdks, epsilon, inc_rt, dec_rt): + ''' + Dynamic budget allocation. + + Parameters: + seq - The point sequence. + lmdks - The landmarks. + epsilon - The available privacy budget. + inc_rt - Sampling rate increase rate. + dec_rt - Sampling rate decrease rate. + 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) + # The sampling rate + samp_rt = 1 + # Track landmarks + lmdk_cur = 0 + # Track skipped releases + skipped = 0 + for i, p in enumerate(seq): + # 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: + eps_dis = bgts[i]*.5 + dis = lmdk_lib.add_laplace_noise(distance((rls_data[i - 1][1], rls_data[i - 1][2]), loc).km*1000, 1.0, eps_dis) + bgts[i] -= eps_dis + if i == 0 or distance((rls_data[i - 1][1], rls_data[i - 1][2]), loc).km*1000 > 1/bgts[i]: + # 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 adaptive_cont(seq, lmdks, epsilon, inc_rt, dec_rt): ''' Adaptive budget allocation.