blob: 622cafc79de60da011d5bc2aed7f94eb335f1c51 [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,
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