| #include "src/algorithms/privacy/rappor.h" |
| |
| #include <unordered_set> |
| |
| #include "src/algorithms/random/distributions.h" |
| |
| namespace cobalt { |
| |
| std::vector<uint64_t> ApplyRapporNoise(const std::vector<uint64_t>& indices, uint64_t max_index, |
| double p, SecureBitGeneratorInterface<uint32_t>* gen) { |
| if (p == 0.0) { |
| return indices; |
| } |
| std::unordered_set<uint64_t> index_set(indices.begin(), indices.end()); |
| GeometricDistribution dist(gen, p); |
| for (uint64_t index = dist.Sample(); index <= max_index; index += dist.Sample() + 1) { |
| if (index_set.count(index) > 0) { |
| index_set.erase(index); |
| } else { |
| index_set.insert(index); |
| } |
| } |
| return std::vector<uint64_t>(index_set.begin(), index_set.end()); |
| } |
| |
| double DebiasRapporCount(uint64_t raw_count, uint64_t num_contributions, double p) { |
| return (static_cast<double>(raw_count) - p * static_cast<double>(num_contributions)) / |
| (1.0 - 2 * p); |
| } |
| |
| } // namespace cobalt |