19 return count == 0 || count - 1 <= std::numeric_limits<uint32_t>::max();
22 template <
class Populate>
void SetAliasTable(
size_t count,
const Populate &populate)
25 throw std::domain_error(
"Alias sampling requires nonempty probability support");
40 template <
class Index,
class Populate>
void BuildAliasTable(std::vector<Index> &aliases,
const Populate &populate)
45 Index under = 0, over = 0;
46 size_t numUnder = 0, numOver = 0;
47 populate([&](
size_t row,
double probability) {
52 under =
static_cast<Index
>(row);
58 over =
static_cast<Index
>(row);
63 while (numUnder && numOver)
65 const Index u = under, o = over;
89 const Index row = under;
97 const Index row = over;
108 const size_t offset = std::min<size_t>(
static_cast<size_t>(vadj),
probabilities.size() - 1);
109 const double up = std::min<double>(vadj - offset,
oneMinusEps);
118 static constexpr double oneMinusEps = 1. - std::numeric_limits<double>::epsilon();
std::vector< double > probabilities
void SetAliasTable(size_t count, const Populate &populate)
size_t SampleIndex(double v) const
static constexpr bool UseCompactIndices(size_t count)
std::vector< uint32_t > compactAliases
std::vector< uint64_t > wideAliases
void BuildAliasTable(std::vector< Index > &aliases, const Populate &populate)
static constexpr double oneMinusEps
Portable dense contraction kernels.