def check_condition_rdp_gp(args, radius, sample_rate, steps, alpha, delta, sigma, p1, p2): if radius == 0: return True if args.train_mode == 'DP' or args.train_mode == 'Sub-DP-no-amp': rdp = PrivacyEngine._get_renyi_divergence(sample_rate=sample_rate, noise_multiplier=sigma, alphas=[alpha]) * steps eps = rdp.cpu().detach().numpy()[0] elif args.train_mode == 'Sub-DP': _, eps = rdp_amplify(alpha, args.sub_training_size, args.training_size, sample_rate, sigma) eps *= steps alpha = alpha / radius eps = 3**(np.log2(radius)) * eps if alpha <= 1: return False val = np.e**(-eps) * p1**(alpha/(alpha-1)) - \ (np.e**eps * p2)**((alpha-1)/alpha) if val > 0: return True else: return False
def func(alpha): rdp = PrivacyEngine._get_renyi_divergence(sample_rate=sample_rate, noise_multiplier=sigma, alphas=[alpha]) eps = rdp.cpu().detach().numpy()[0] return eps
def rdp_bounds(radius, sample_rate, steps, alpha, sigma, p1, p2, softmax, agg_res_param=None, amplify=False, training_size=None, sub_training_size=None, clip=True): sample_rate_gp = 1 - (1 - sample_rate)**radius if not amplify: rdp = PrivacyEngine._get_renyi_divergence(sample_rate=sample_rate_gp, noise_multiplier=sigma, alphas=[alpha]) * steps eps = rdp.cpu().detach().numpy()[0] else: _, eps = rdp_amplify(alpha, sub_training_size, training_size, sample_rate_gp, sigma) eps *= steps if not softmax: lower = np.e**(-eps) * p1**(alpha / (alpha - 1)) upper = (np.e**eps * p2)**((alpha - 1) / alpha) else: if agg_res_param is not None: mgf_diff_list, varis_p1, varis_p2 = agg_res_param[ 'mgf_diff_list'], agg_res_param['varis_p1_p2'][ 0], agg_res_param['varis_p1_p2'][1] def moments(order, mean, varis): from sympy import symbols t, mu, sigma = symbols('t, mu, sigma') return mgf_diff_list[order].evalf(subs={ t: 0, mu: mean, sigma: varis }) a1a = (alpha - 1) / alpha aa1 = round(alpha / (alpha - 1)) upper_moments = moments(aa1, p2, varis_p2) upper = np.e**(eps * a1a) * upper_moments**a1a lower = np.e**(-eps) * p1**aa1 # def moments_bounds(agg_res, order): # agg_res_pow = np.power(agg_res, order) # return single_ci(agg_res_pow, 1e-5) # p1_agg_res = agg_res[:, p1_idx] # p2_agg_res = agg_res[:, p2_idx] # _, l1, _ = moments_bounds(p1_agg_res, (alpha-1)/alpha) # _, _, u2 = moments_bounds(p2_agg_res, alpha/(alpha-1)) # if l1 == 1 or u2 == 0: # p1_agg_res = np.longdouble(agg_res[:, p1_idx]) # p2_agg_res = np.longdouble(agg_res[:, p2_idx]) # _, l1, _ = moments_bounds(p1_agg_res, (alpha-1)/alpha) # _, _, u2 = moments_bounds(p2_agg_res, alpha/(alpha-1)) # lower = np.e**(-eps) * l1**(alpha/(alpha-1)) # upper = (np.e**eps * u2)**((alpha-1)/alpha) else: lower = np.e**(-eps) * p1**(alpha / (alpha - 1)) upper = (np.e**eps * p2)**((alpha - 1) / alpha) if clip: return min(max(lower, 0), 1), max(min(upper, 1), 0) else: return lower, upper