Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/stim/cmd/command_sample.test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ std::unordered_map<std::string_view, size_t> line_freq_with_lifetime_matching_ar
std::unordered_map<std::string_view, size_t> 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;
}
Expand Down
17 changes: 13 additions & 4 deletions src/stim/util_bot/probability_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<size_t>(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<size_t> stim::sample_hit_indices(float probability, size_t attempts, std::mt19937_64 &rng) {
Expand Down
4 changes: 3 additions & 1 deletion src/stim/util_bot/probability_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<size_t> dist;
RareErrorIterator() = delete;
RareErrorIterator(const RareErrorIterator &) = delete;
RareErrorIterator(float probability);
size_t next(std::mt19937_64 &rng);

Expand Down
Loading