void init( const Shared & shared, const Group & group, rng_t & rng) { Shared post = shared.plus_group(group); mean = sample_gamma(rng, post.alpha, 1.f / post.inv_beta); }
void init( const Shared & shared, const Group & group, rng_t & rng) { Shared post = shared.plus_group(group); beta = sample_beta(rng, post.alpha, post.beta); }
float score_data( const Shared & shared, rng_t &) const { Shared post = shared.plus_group(*this); float score = fast_lgamma(shared.alpha + shared.beta) - fast_lgamma(post.alpha + post.beta); score += fast_lgamma(post.alpha) - fast_lgamma(shared.alpha); score += fast_lgamma(post.beta) - fast_lgamma(shared.beta); return score; }
void init( const Shared & shared, const Group & group, rng_t &) { Shared post = shared.plus_group(group); score_coeff = -fast_log(1.f + post.inv_beta); score = -fast_lgamma(post.alpha) + post.alpha * (fast_log(post.inv_beta) + score_coeff); post_alpha = post.alpha; }
float score_data( const Shared & shared, rng_t &) const { Shared post = shared.plus_group(*this); float score = fast_lgamma(post.alpha) - fast_lgamma(shared.alpha); score += shared.alpha * fast_log(shared.inv_beta) - post.alpha * fast_log(post.inv_beta); score += -log_prod; return score; }
void init( const Shared & shared, const Group & group, rng_t &) { Shared post = shared.plus_group(group); post_beta = post.beta; alpha = post.alpha + shared.r; score = fast_lgamma(post.alpha + post.beta) - fast_lgamma(post.alpha) - fast_lgamma(post.beta) + fast_lgamma(alpha); }
float score_value( const Shared & shared, const Value & value, rng_t &) const { Shared post = shared.plus_group(*this); float alpha = post.alpha + shared.r; float beta = post.beta + value; float score = fast_lgamma(post.alpha + post.beta) - fast_lgamma(alpha + beta); score += fast_lgamma(alpha) - fast_lgamma(post.alpha); score += fast_lgamma(beta) - fast_lgamma(post.beta); return score; }
float score_data( const Shared & shared, const std::vector<Group> & groups, rng_t &) const { const float shared_part = fast_lgamma(shared.alpha + shared.beta) - fast_lgamma(shared.alpha) - fast_lgamma(shared.beta); float score = 0; for (auto const & group : groups) { if (group.count) { Shared post = shared.plus_group(group); score += fast_lgamma(post.alpha) + fast_lgamma(post.beta) - fast_lgamma(post.alpha + post.beta); score += shared_part; } } return score; }
float score_data( const Shared & shared, const std::vector<Group> & groups, rng_t &) const { const float alpha_part = fast_lgamma(shared.alpha); const float beta_part = shared.alpha * fast_log(shared.inv_beta); float score = 0; for (auto const & group : groups) { if (group.count) { Shared post = shared.plus_group(group); score += fast_lgamma(post.alpha) - alpha_part; score += beta_part - post.alpha * fast_log(post.inv_beta); score += -group.log_prod; } } return score; }