lmdk_bgt.discount: Initial commit
This commit is contained in:
		@ -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)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user