21 if (n -
k <
k)
k = n -
k;
32 if (!Minisketch::BitsSupported(bits))
return {};
33 std::vector<Minisketch>
ret;
34 for (
uint32_t impl = 0; impl <= Minisketch::MaxImplementation(); ++impl) {
35 if (Minisketch::ImplementationSupported(bits, impl)) {
36 CHECK(Minisketch::BitsSupported(bits));
37 ret.push_back(Minisketch(bits, impl, capacity));
41 CHECK(impl != 0 || !Minisketch::BitsSupported(bits));
56 std::vector<uint64_t>
counts;
61 counts.resize(capacity + 1);
66 for (
uint64_t x = 0; (x >> (bits * capacity)) == 0; ++x) {
68 for (
size_t i = 0; i <
serialized.size(); ++i) {
79 for (
size_t impl = 1; impl <
sketches.size(); ++impl) {
93 for (
size_t impl = 0; impl <
sketches.size(); ++impl) {
99 for (
size_t impl = 0; impl <
sketches.size(); ++impl) {
120 for (
uint64_t i = 0; i <= capacity && (i & mask) == i; ++i) {
127 std::random_device
rnd;
128 std::uniform_int_distribution<uint64_t>
capacity_dist(0, std::min<uint64_t>(std::numeric_limits<uint64_t>::max() >> (64 - bits),
max_capacity));
129 std::uniform_int_distribution<uint64_t>
element_dist(1, std::numeric_limits<uint64_t>::max() >> (64 - bits));
130 std::uniform_int_distribution<uint64_t> rand64(0, std::numeric_limits<uint64_t>::max());
138 for (
size_t i = 0; i < iter; ++i) {
144 for (
size_t impl = 0; impl <
sketches.size(); ++impl) {
162 for (
size_t pos = 0; pos + 1 <
elements.size(); ++pos) {
179 for (
size_t impl = 1; impl <
sketches.size(); ++impl) {
184 for (
size_t impl = 0; impl <
sketches.size(); ++impl) {
193 for (
size_t impl = 1; impl <
sketches.size(); ++impl) {
226 for (
uint32_t bits = 0; bits <= 256; ++bits) {
229 for (
size_t capacity = 0; capacity <= 1024; ++capacity) {
259 for (
size_t capacity = 0; capacity <= 512; ++capacity) {
281 }
catch (
const std::logic_error&) {}
288#ifdef MINISKETCH_VERIFY
289 const char* mode =
" in verify mode";
291 const char* mode =
"";
293 printf(
"Running libminisketch tests%s with complexity=%llu\n", mode, (
unsigned long long)
test_complexity);
297 for (
unsigned j = 2;
j <= 64; ++
j) {
306 for (
int weight = 0; weight <= 40; ++weight) {
307 for (
int bits = 2; weight == 0 ? bits <= 64 : (bits <= 32 && bits <= weight); ++bits) {
308 int capacity = weight / bits;
309 if (capacity * bits != weight)
continue;
315 printf(
"All tests successful.\n");
#define CHECK(cond)
Unconditional failure on condition failure.
MINISKETCH_API size_t minisketch_compute_capacity(uint32_t bits, size_t max_elements, uint32_t fpbits)
Compute the capacity needed to achieve a certain rate of false positives.
MINISKETCH_API size_t minisketch_compute_max_elements(uint32_t bits, size_t capacity, uint32_t fpbits)
Compute what max_elements can be decoded for a certain rate of false positives.
DecodeResult Decode(const std::string &str, CharLimit limit)
Decode a Bech32 or Bech32m string.
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.