inline size_t sample_discrete ( rng_t & rng, size_t dim, const float * probs) { float t = sample_unif01(rng); for (size_t i = 0; DIST_LIKELY(i < dim - 1); ++i) { t -= probs[i]; if (DIST_UNLIKELY(t < 0)) { return i; } } return dim - 1; }
bool add_value( const Model & model, size_t groupid, count_t count = 1) { const bool add_group = driver_.add_value(model, groupid, count); if (DIST_UNLIKELY(add_group)) { shifted_scores_.packed_add(); _update_empty_groups(model); } _update_nonempty_group(model, groupid); return add_group; }
bool remove_value( const Model & model, size_t groupid, count_t count = 1) { const bool remove_group = driver_.remove_value(model, groupid, count); if (DIST_UNLIKELY(remove_group)) { shifted_scores_.packed_remove(groupid); _update_empty_groups(model); } else { _update_nonempty_group(model, groupid); } return remove_group; }
inline size_t sample_from_likelihoods ( rng_t & rng, const std::vector<float, Alloc> & likelihoods, float total_likelihood) { const size_t size = likelihoods.size(); float t = total_likelihood * sample_unif01(rng); for (size_t i = 0; DIST_LIKELY(i < size); ++i) { t -= likelihoods[i]; if (DIST_UNLIKELY(t < 0)) { return i; } } return size - 1; }