6 uint32_t every_n_blocks,
size_t starting_index)
7 : m_table(
std::move(table))
8 , m_pick(
std::move(pick))
9 , m_current(starting_index)
10 , m_blocks_until(every_n_blocks)
24 const size_t here =
m_current.load(std::memory_order_relaxed);
25 for (
size_t i = 0; i < all.size(); ++i) {
26 all[i].set_active(i == here);
50 m_every_n_blocks.store(every_n_blocks, std::memory_order_relaxed);
51 m_blocks_until = every_n_blocks;
58 const size_t here =
m_current.load(std::memory_order_relaxed);
62 if (next >= row.size()) {
79 const size_t here =
m_current.load(std::memory_order_relaxed);
84 all[here].set_active(
false);
85 all[
index].set_active(
true);
91 if (param ==
"current") {
101 if (query ==
"current") {
102 return static_cast<double>(
current());
static size_t weighted_pick(std::span< const double > weights, Stochastic &generator)
Weighted random draw over a row of nonnegative weights.
std::span< RelationSlot > slots() const noexcept
std::function< size_t(std::span< const double > row)> Pick
Chooses a successor from a row of weights.
void ensure_established()
Activate slot m_current and deactivate every other slot that currently exists.
std::atomic< size_t > m_current
void jump(size_t index)
Make a slot the active one.
void set_parameter(std::string_view param, double value) override
Set operator parameter.
void set_every_n_blocks(uint32_t every_n_blocks) noexcept
Change or disable the self-contained step rate.
size_t advance()
Step once.
void process(float frames) override
Self-contained step.
WalkOperator(std::shared_ptr< Kinesis::Stochastic::Weights > table, Pick pick={}, uint32_t every_n_blocks=0, size_t starting_index=0)
std::atomic< uint32_t > m_every_n_blocks
std::shared_ptr< Kinesis::Stochastic::Weights > m_table
size_t current() const noexcept
Kinesis::Stochastic::Stochastic m_generator
std::optional< double > query_state(std::string_view query) const override
Query walk state.