Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
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;
}