blob: 28191ef3a75cde58d62a5fc54a695d257f9a38ea [file] [log] [blame]
#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,
Probability p, SecureBitGeneratorInterface<uint32_t>* gen) {
if (p.get() == 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(double raw_count, uint64_t num_contributions, Probability p) {
return (raw_count - p.get() * static_cast<double>(num_contributions)) / (1.0 - 2 * p.get());
}
} // namespace cobalt