mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 13:45:36 -04:00
moved alias method to function and fixed sampling bug
This commit is contained in:
parent
907cf7df4d
commit
90509d928b
2 changed files with 14 additions and 5 deletions
|
|
@ -58,6 +58,9 @@ private:
|
|||
|
||||
//! Normalize distribution so that probabilities sum to unity
|
||||
void normalize();
|
||||
|
||||
//! Initialize alias tables for distribution
|
||||
void init_alias();
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -29,12 +29,18 @@ Discrete::Discrete(pugi::xml_node node)
|
|||
std::copy(params.begin(), params.begin() + n / 2, std::back_inserter(x_));
|
||||
std::copy(params.begin() + n / 2, params.end(), std::back_inserter(p_));
|
||||
|
||||
normalize();
|
||||
// Initialize alias tables
|
||||
init_alias();
|
||||
}
|
||||
|
||||
Discrete::Discrete(const double* x, const double* p, int n)
|
||||
: x_ {x, x + n}, p_ {p, p + n}
|
||||
{
|
||||
// Initialize alias tables
|
||||
init_alias();
|
||||
}
|
||||
|
||||
void Discrete::init_alias() {
|
||||
normalize();
|
||||
|
||||
// Vectors for large and small probabilities based on 1/n
|
||||
|
|
@ -42,11 +48,11 @@ Discrete::Discrete(const double* x, const double* p, int n)
|
|||
vector<size_t> small;
|
||||
|
||||
// Set and allocate memory
|
||||
alias_.reserve(n);
|
||||
alias_.reserve(x_.size());
|
||||
|
||||
// Fill large and small vectors based on 1/n
|
||||
for (int i = 0; i < n; i++) {
|
||||
p_[i] *= n;
|
||||
for (int i = 0; i < x_.size(); i++) {
|
||||
p_[i] *= x_.size();
|
||||
if (p_[i] > 1.0) {
|
||||
large.push_back(i);
|
||||
} else {
|
||||
|
|
@ -85,7 +91,7 @@ double Discrete::sample(uint64_t* seed) const
|
|||
return x_[alias_[u]];
|
||||
}
|
||||
} else {
|
||||
return x_.size();
|
||||
return x_[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue