diff --git a/src/stim/cmd/command_sample.test.cc b/src/stim/cmd/command_sample.test.cc index 2ed89ede5..4ce7abd4f 100644 --- a/src/stim/cmd/command_sample.test.cc +++ b/src/stim/cmd/command_sample.test.cc @@ -26,7 +26,7 @@ std::unordered_map line_freq_with_lifetime_matching_ar std::unordered_map result{}; size_t start = 0; for (size_t k = 0; k <= data.size(); k++) { - if (data[k] == '\n' || data[k] == '\0') { + if (k == data.size() || data[k] == '\n' || data[k] == '\0') { result[data.substr(start, k - start)]++; start = k + 1; } diff --git a/src/stim/util_bot/probability_util.cc b/src/stim/util_bot/probability_util.cc index a0dd5ba7e..2b66c0857 100644 --- a/src/stim/util_bot/probability_util.cc +++ b/src/stim/util_bot/probability_util.cc @@ -21,16 +21,25 @@ using namespace stim; RareErrorIterator::RareErrorIterator(float probability) - : next_candidate(0), is_one(probability == 1), dist(probability) { + : next_candidate(0), probability(probability) { if (!(probability >= 0 && probability <= 1)) { throw std::out_of_range("Invalid probability: " + std::to_string(probability)); } + if (0 < probability && probability < 1) { + dist = std::geometric_distribution(probability); + } } size_t RareErrorIterator::next(std::mt19937_64 &rng) { - size_t result = next_candidate + (is_one ? 0 : dist(rng)); - next_candidate = result + 1; - return result; + if (probability == 0) { + return SIZE_MAX; + } else if (probability == 1) { + return next_candidate++; + } else { + size_t result = next_candidate + dist(rng); + next_candidate = result + 1; + return result; + } } std::vector stim::sample_hit_indices(float probability, size_t attempts, std::mt19937_64 &rng) { diff --git a/src/stim/util_bot/probability_util.h b/src/stim/util_bot/probability_util.h index 65da497d4..e825a5fba 100644 --- a/src/stim/util_bot/probability_util.h +++ b/src/stim/util_bot/probability_util.h @@ -32,8 +32,10 @@ constexpr uint64_t INTENTIONAL_VERSION_SEED_INCOMPATIBILITY = 0xDEADBEEF124CULL; /// Gets more efficient as the hit probability drops. struct RareErrorIterator { size_t next_candidate; - bool is_one = false; + float probability; std::geometric_distribution dist; + RareErrorIterator() = delete; + RareErrorIterator(const RareErrorIterator &) = delete; RareErrorIterator(float probability); size_t next(std::mt19937_64 &rng);