def test_dp_sum_structure_complex(self): query = tensorflow_privacy.GaussianSumQuery(5.0, 0.0) def datapoint(a, b, c): return collections.OrderedDict(a=(a, ), bc=([b], (c, ))) data = [ datapoint(1.0, 2.0, 1.0), datapoint(2.0, 3.0, 1.0), datapoint(6.0, 8.0, 0.0), # Clipped to 3.0, 4.0, 0.0 ] value_type = type_conversions.type_from_tensors(data[0]) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) global_state = dp_aggregate_process.initialize() output = dp_aggregate_process.next(global_state, data, [1.0, 1.0, 1.0]) self.assertEqual(output.state.l2_norm_clip, 5.0) self.assertEqual(output.state.stddev, 0.0) self.assertEqual(output.result['a'][0], 6.0) self.assertEqual(output.result['bc'][0][0], 9.0) self.assertEqual(output.result['bc'][1][0], 2.0)
def test_dp_stateful_mean(self): class ShrinkingSumQuery(tensorflow_privacy.GaussianSumQuery): def get_noised_result(self, sample_state, global_state): global_state = self._GlobalState( tf.maximum(global_state.l2_norm_clip - 1, 0.0), global_state.stddev) return sample_state, global_state query = ShrinkingSumQuery(4.0, 0.0) value_type = type_conversions.type_from_tensors(0.0) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) global_state = dp_aggregate_process.initialize() records = [1.0, 3.0, 5.0] def run_and_check(global_state, expected_l2_norm_clip, expected_result): output = dp_aggregate_process.next(global_state, records, [1.0, 1.0, 1.0]) self.assertEqual(output.state.l2_norm_clip, expected_l2_norm_clip) self.assertEqual(output.result, expected_result) return output.state self.assertEqual(global_state.l2_norm_clip, 4.0) global_state = run_and_check(global_state, 3.0, 8.0) global_state = run_and_check(global_state, 2.0, 7.0) global_state = run_and_check(global_state, 1.0, 5.0) global_state = run_and_check(global_state, 0.0, 3.0) global_state = run_and_check(global_state, 0.0, 0.0)
def test_dp_sum_structure_list(self): query = tensorflow_privacy.GaussianSumQuery(5.0, 0.0) def datapoint(a, b): return [tf.Variable(a, name='a'), tf.Variable(b, name='b')] data = [ datapoint(1.0, 2.0), datapoint(2.0, 3.0), datapoint(6.0, 8.0), # Clipped to 3.0, 4.0 ] value_type = type_conversions.type_from_tensors(data[0]) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) global_state = dp_aggregate_process.initialize() output = dp_aggregate_process.next(global_state, data, [1.0, 1.0, 1.0]) self.assertEqual(output.state.l2_norm_clip, 5.0) self.assertEqual(output.state.stddev, 0.0) result = list(output.result) self.assertEqual(result[0], 6.0) self.assertEqual(result[1], 9.0)
def test_dp_sum_structure_nested_odict(self): query = tensorflow_privacy.GaussianSumQuery(5.0, 0.0) def datapoint(a, b, c): return collections.OrderedDict([('a', (a,)), ('bc', collections.OrderedDict([('b', [b]), ('c', (c,))]))]) data = [ datapoint(1.0, 2.0, 1.0), datapoint(2.0, 3.0, 1.0), datapoint(6.0, 8.0, 0.0), # Clipped to 3.0, 4.0, 0.0 ] value_type = type_conversions.type_from_tensors(data[0]) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) global_state = dp_aggregate_process.initialize() output = dp_aggregate_process.next(global_state, data, [1.0, 1.0, 1.0]) self.assertEqual(output['state']['l2_norm_clip'], 5.0) self.assertEqual(output['state']['stddev'], 0.0) self.assertEqual(output['result']['a'][0], 6.0) self.assertEqual(output['result']['bc']['b'][0], 9.0) self.assertEqual(output['result']['bc']['c'][0], 2.0)
def test_process_type_signature(self, value_template): query = tensorflow_privacy.GaussianSumQuery(4.0, 0.0) value_type = type_conversions.type_from_tensors(value_template) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) server_state_type = computation_types.FederatedType( computation_types.NamedTupleType([('l2_norm_clip', tf.float32), ('stddev', tf.float32)]), placements.SERVER) self.assertEqual( dp_aggregate_process.initialize.type_signature, computation_types.FunctionType( parameter=None, result=server_state_type)) client_value_type = computation_types.FederatedType(value_type, placements.CLIENTS) client_value_weight_type = computation_types.FederatedType( tf.float32, placements.CLIENTS) server_result_type = computation_types.FederatedType( value_type, placements.SERVER) server_metrics_type = computation_types.FederatedType((), placements.SERVER) self.assertEqual( dp_aggregate_process.next.type_signature, computation_types.FunctionType( parameter=computation_types.NamedTupleType([ (None, server_state_type), (None, client_value_type), (None, client_value_weight_type) ]), result=computation_types.NamedTupleType([ ('state', server_state_type), ('result', server_result_type), ('measurements', server_metrics_type) ])))
def test_process_type_signature(self, value_template): query = tensorflow_privacy.GaussianSumQuery(4.0, 0.0) value_type = type_conversions.type_from_tensors(value_template) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) server_state_type = computation_types.FederatedType( type_conversions.type_from_tensors(query.initial_global_state()), placements.SERVER) self.assertEqual( dp_aggregate_process.initialize.type_signature, computation_types.FunctionType(parameter=None, result=server_state_type)) client_value_type = computation_types.FederatedType( value_type, placements.CLIENTS) client_value_weight_type = computation_types.FederatedType( tf.float32, placements.CLIENTS) server_result_type = computation_types.FederatedType( value_type, placements.SERVER) server_metrics_type = computation_types.FederatedType( (), placements.SERVER) self.assertEqual( dp_aggregate_process.next.type_signature, computation_types.FunctionType( parameter=(server_state_type, client_value_type, client_value_weight_type), result=collections.OrderedDict( state=server_state_type, result=server_result_type, measurements=server_metrics_type)))
def test_dp_sum(self): query = tensorflow_privacy.GaussianSumQuery(4.0, 0.0) value_type = type_conversions.type_from_tensors(0.0) dp_aggregate_process = differential_privacy.build_dp_aggregate_process( value_type, query) global_state = dp_aggregate_process.initialize() output = dp_aggregate_process.next(global_state, [1.0, 3.0, 5.0], [1.0, 1.0, 1.0]) self.assertEqual(output.state.l2_norm_clip, 4.0) self.assertEqual(output.state.stddev, 0.0) self.assertEqual(output.result, 8.0)