Esempio n. 1
0
    def test_complex_nested_query(self):
        with self.cached_session() as sess:
            query_ab = gaussian_query.GaussianSumQuery(l2_norm_clip=1.0,
                                                       stddev=0.0)
            query_c = gaussian_query.GaussianAverageQuery(l2_norm_clip=10.0,
                                                          sum_stddev=0.0,
                                                          denominator=2.0)
            query_d = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                      stddev=0.0)

            query = nested_query.NestedQuery(
                [query_ab, {
                    'c': query_c,
                    'd': [query_d]
                }])

            record1 = [{
                'a': 0.0,
                'b': 2.71828
            }, {
                'c': (-4.0, 6.0),
                'd': [-4.0]
            }]
            record2 = [{
                'a': 3.14159,
                'b': 0.0
            }, {
                'c': (6.0, -4.0),
                'd': [5.0]
            }]

            query_result, _ = test_utils.run_query(query, [record1, record2])
            result = sess.run(query_result)
            expected = [{'a': 1.0, 'b': 1.0}, {'c': (1.0, 1.0), 'd': [1.0]}]
            self.assertAllClose(result, expected)
Esempio n. 2
0
    def test_nested_query_with_noise(self):
        with self.cached_session() as sess:
            sum_stddev = 2.71828
            denominator = 3.14159

            query1 = gaussian_query.GaussianSumQuery(l2_norm_clip=1.5,
                                                     stddev=sum_stddev)
            query2 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip=0.5,
                sum_stddev=sum_stddev,
                denominator=denominator)
            query = nested_query.NestedQuery((query1, query2))

            record1 = (3.0, [2.0, 1.5])
            record2 = (0.0, [-1.0, -3.5])

            query_result, _ = test_utils.run_query(query, [record1, record2])

            noised_averages = []
            for _ in range(1000):
                noised_averages.append(nest.flatten(sess.run(query_result)))

            result_stddev = np.std(noised_averages, 0)
            avg_stddev = sum_stddev / denominator
            expected_stddev = [sum_stddev, avg_stddev, avg_stddev]
            self.assertArrayNear(result_stddev, expected_stddev, 0.1)
Esempio n. 3
0
    def test_nested_query(self):
        population_size = tf.Variable(0)
        selection_probability = tf.Variable(0.0)
        ledger = privacy_ledger.PrivacyLedger(population_size,
                                              selection_probability, 50, 50)

        query1 = gaussian_query.GaussianAverageQuery(l2_norm_clip=4.0,
                                                     sum_stddev=2.0,
                                                     denominator=5.0,
                                                     ledger=ledger)
        query2 = gaussian_query.GaussianAverageQuery(l2_norm_clip=5.0,
                                                     sum_stddev=1.0,
                                                     denominator=5.0,
                                                     ledger=ledger)

        query = nested_query.NestedQuery([query1, query2])
        query = privacy_ledger.QueryWithLedger(query, ledger)

        record1 = [1.0, [12.0, 9.0]]
        record2 = [5.0, [1.0, 2.0]]

        # First sample.
        tf.assign(population_size, 10)
        tf.assign(selection_probability, 0.1)
        test_utils.run_query(query, [record1, record2])

        expected_queries = [[4.0, 2.0], [5.0, 1.0]]
        formatted = ledger.get_formatted_ledger_eager()
        sample_1 = formatted[0]
        self.assertAllClose(sample_1.population_size, 10.0)
        self.assertAllClose(sample_1.selection_probability, 0.1)
        self.assertAllClose(sorted(sample_1.queries), sorted(expected_queries))

        # Second sample.
        tf.assign(population_size, 20)
        tf.assign(selection_probability, 0.2)
        test_utils.run_query(query, [record1, record2])

        formatted = ledger.get_formatted_ledger_eager()
        sample_1, sample_2 = formatted
        self.assertAllClose(sample_1.population_size, 10.0)
        self.assertAllClose(sample_1.selection_probability, 0.1)
        self.assertAllClose(sorted(sample_1.queries), sorted(expected_queries))

        self.assertAllClose(sample_2.population_size, 20.0)
        self.assertAllClose(sample_2.selection_probability, 0.2)
        self.assertAllClose(sorted(sample_2.queries), sorted(expected_queries))
    def test_no_privacy_average(self):
        with self.cached_session() as sess:
            record1 = tf.constant([5.0, 0.0])
            record2 = tf.constant([-1.0, 2.0])

            query = no_privacy_query.NoPrivacyAverageQuery()
            query_result = test_utils.run_query(query, [record1, record2])
            result = sess.run(query_result)
            expected = [2.0, 1.0]
            self.assertAllClose(result, expected)
Esempio n. 5
0
  def test_gaussian_sum_no_clip_no_noise(self):
    with self.cached_session() as sess:
      record1 = tf.constant([2.0, 0.0])
      record2 = tf.constant([-1.0, 1.0])

      query = gaussian_query.GaussianSumQuery(
          l2_norm_clip=10.0, stddev=0.0)
      query_result, _ = test_utils.run_query(query, [record1, record2])
      result = sess.run(query_result)
      expected = [1.0, 1.0]
      self.assertAllClose(result, expected)
Esempio n. 6
0
  def test_gaussian_sum_with_clip_no_noise(self):
    with self.cached_session() as sess:
      record1 = tf.constant([-6.0, 8.0])  # Clipped to [-3.0, 4.0].
      record2 = tf.constant([4.0, -3.0])  # Not clipped.

      query = gaussian_query.GaussianSumQuery(
          l2_norm_clip=5.0, stddev=0.0)
      query_result, _ = test_utils.run_query(query, [record1, record2])
      result = sess.run(query_result)
      expected = [1.0, 1.0]
      self.assertAllClose(result, expected)
Esempio n. 7
0
  def test_gaussian_average_no_noise(self):
    with self.cached_session() as sess:
      record1 = tf.constant([5.0, 0.0])   # Clipped to [3.0, 0.0].
      record2 = tf.constant([-1.0, 2.0])  # Not clipped.

      query = gaussian_query.GaussianAverageQuery(
          l2_norm_clip=3.0, sum_stddev=0.0, denominator=2.0)
      query_result, _ = test_utils.run_query(query, [record1, record2])
      result = sess.run(query_result)
      expected_average = [1.0, 1.0]
      self.assertAllClose(result, expected_average)
Esempio n. 8
0
    def test_sum_query(self):
        record1 = tf.constant([2.0, 0.0])
        record2 = tf.constant([-1.0, 1.0])

        population_size = tf.Variable(0)
        selection_probability = tf.Variable(0.0)
        ledger = privacy_ledger.PrivacyLedger(population_size,
                                              selection_probability, 50, 50)

        query = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                stddev=0.0,
                                                ledger=ledger)
        query = privacy_ledger.QueryWithLedger(query, ledger)

        # First sample.
        tf.assign(population_size, 10)
        tf.assign(selection_probability, 0.1)
        test_utils.run_query(query, [record1, record2])

        expected_queries = [[10.0, 0.0]]
        formatted = ledger.get_formatted_ledger_eager()
        sample_1 = formatted[0]
        self.assertAllClose(sample_1.population_size, 10.0)
        self.assertAllClose(sample_1.selection_probability, 0.1)
        self.assertAllClose(sample_1.queries, expected_queries)

        # Second sample.
        tf.assign(population_size, 20)
        tf.assign(selection_probability, 0.2)
        test_utils.run_query(query, [record1, record2])

        formatted = ledger.get_formatted_ledger_eager()
        sample_1, sample_2 = formatted
        self.assertAllClose(sample_1.population_size, 10.0)
        self.assertAllClose(sample_1.selection_probability, 0.1)
        self.assertAllClose(sample_1.queries, expected_queries)

        self.assertAllClose(sample_2.population_size, 20.0)
        self.assertAllClose(sample_2.selection_probability, 0.2)
        self.assertAllClose(sample_2.queries, expected_queries)
    def test_no_privacy_weighted_average(self):
        with self.cached_session() as sess:
            record1 = tf.constant([4.0, 0.0])
            record2 = tf.constant([-1.0, 1.0])

            weights = [1, 3]

            query = no_privacy_query.NoPrivacyAverageQuery()
            query_result, _ = test_utils.run_query(query, [record1, record2],
                                                   weights=weights)
            result = sess.run(query_result)
            expected = [0.25, 0.75]
            self.assertAllClose(result, expected)
    def test_no_privacy_weighted_sum(self):
        with self.cached_session() as sess:
            record1 = tf.constant([2.0, 0.0])
            record2 = tf.constant([-1.0, 1.0])

            weight1 = 1
            weight2 = 2

            query = no_privacy_query.NoPrivacySumQuery()
            query_result = test_utils.run_query(query, [record1, record2],
                                                [weight1, weight2])
            result = sess.run(query_result)
            expected = [0.0, 2.0]
            self.assertAllClose(result, expected)
Esempio n. 11
0
  def test_gaussian_sum_with_noise(self):
    with self.cached_session() as sess:
      record1, record2 = 2.71828, 3.14159
      stddev = 1.0

      query = gaussian_query.GaussianSumQuery(
          l2_norm_clip=5.0, stddev=stddev)
      query_result, _ = test_utils.run_query(query, [record1, record2])

      noised_sums = []
      for _ in xrange(1000):
        noised_sums.append(sess.run(query_result))

      result_stddev = np.std(noised_sums)
      self.assertNear(result_stddev, stddev, 0.1)
Esempio n. 12
0
    def test_nested_gaussian_sum_no_clip_no_noise(self):
        with self.cached_session() as sess:
            query1 = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                     stddev=0.0)
            query2 = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                     stddev=0.0)

            query = nested_query.NestedQuery([query1, query2])

            record1 = [1.0, [2.0, 3.0]]
            record2 = [4.0, [3.0, 2.0]]

            query_result, _ = test_utils.run_query(query, [record1, record2])
            result = sess.run(query_result)
            expected = [5.0, [5.0, 5.0]]
            self.assertAllClose(result, expected)
Esempio n. 13
0
  def test_gaussian_average_with_noise(self):
    with self.cached_session() as sess:
      record1, record2 = 2.71828, 3.14159
      sum_stddev = 1.0
      denominator = 2.0

      query = gaussian_query.GaussianAverageQuery(
          l2_norm_clip=5.0, sum_stddev=sum_stddev, denominator=denominator)
      query_result, _ = test_utils.run_query(query, [record1, record2])

      noised_averages = []
      for _ in range(1000):
        noised_averages.append(sess.run(query_result))

      result_stddev = np.std(noised_averages)
      avg_stddev = sum_stddev / denominator
      self.assertNear(result_stddev, avg_stddev, 0.1)
Esempio n. 14
0
    def test_nested_gaussian_average_with_clip_no_noise(self):
        with self.cached_session() as sess:
            query1 = gaussian_query.GaussianAverageQuery(l2_norm_clip=4.0,
                                                         sum_stddev=0.0,
                                                         denominator=5.0)
            query2 = gaussian_query.GaussianAverageQuery(l2_norm_clip=5.0,
                                                         sum_stddev=0.0,
                                                         denominator=5.0)

            query = nested_query.NestedQuery([query1, query2])

            record1 = [1.0, [12.0, 9.0]]  # Clipped to [1.0, [4.0, 3.0]]
            record2 = [5.0, [1.0, 2.0]]  # Clipped to [4.0, [1.0, 2.0]]

            query_result, _ = test_utils.run_query(query, [record1, record2])
            result = sess.run(query_result)
            expected = [1.0, [1.0, 1.0]]
            self.assertAllClose(result, expected)
Esempio n. 15
0
  def test_gaussian_sum_with_changing_clip_no_noise(self):
    with self.cached_session() as sess:
      record1 = tf.constant([-6.0, 8.0])  # Clipped to [-3.0, 4.0].
      record2 = tf.constant([4.0, -3.0])  # Not clipped.

      l2_norm_clip = tf.Variable(5.0)
      l2_norm_clip_placeholder = tf.placeholder(tf.float32)
      assign_l2_norm_clip = tf.assign(l2_norm_clip, l2_norm_clip_placeholder)
      query = gaussian_query.GaussianSumQuery(
          l2_norm_clip=l2_norm_clip, stddev=0.0)
      query_result, _ = test_utils.run_query(query, [record1, record2])

      self.evaluate(tf.global_variables_initializer())
      result = sess.run(query_result)
      expected = [1.0, 1.0]
      self.assertAllClose(result, expected)

      sess.run(assign_l2_norm_clip, {l2_norm_clip_placeholder: 0.0})
      result = sess.run(query_result)
      expected = [0.0, 0.0]
      self.assertAllClose(result, expected)
 def test_incompatible_records(self, record1, record2, error_type):
     query = no_privacy_query.NoPrivacySumQuery()
     with self.assertRaises(error_type):
         test_utils.run_query(query, [record1, record2])
Esempio n. 17
0
 def test_incompatible_records(self, record1, record2, error_type):
   query = gaussian_query.GaussianSumQuery(1.0, 0.0)
   with self.assertRaises(error_type):
     test_utils.run_query(query, [record1, record2])
Esempio n. 18
0
 def test_record_incompatible_with_query(self, queries, record, error_type):
     with self.assertRaises(error_type):
         test_utils.run_query(nested_query.NestedQuery(queries), [record])