change to instance from pointer and cleanup lazy mistakes

This commit is contained in:
Paul P.H. Wilson 2023-03-22 00:25:04 -04:00
parent 60c3f2a9d5
commit 035e6dc45a
4 changed files with 22 additions and 14 deletions

View file

@ -37,13 +37,15 @@ UPtrDist distribution_from_xml(pugi::xml_node node);
class DiscreteIndex {
public:
explicit Discrete(pugi::xml_node node);
Discrete(const double* p, int n);
explicit DiscreteIndex(pugi::xml_node node);
DiscreteIndex(const double* p, int n);
void assign(const double* p, int n);
//! Sample a value from the distribution
//! \param seed Pseudorandom number seed pointer
//! \return Sampled value
size_t sample(uint64_t* seed) const override;
size_t sample(uint64_t* seed) const;
// Properties
const vector<double>& prob() const { return prob_; }
@ -81,9 +83,9 @@ public:
const vector<size_t>& alias() const { return di_->alias(); }
private:
vector<double> x_; //!< Possible outcomes
unique_ptr<DiscreteIndex> di_; //!< discrete probability distribution of
//!< outcome indices
vector<double> x_; //!< Possible outcomes
DiscreteIndex di_; //!< discrete probability distribution of
//!< outcome indices
};
//==============================================================================

View file

@ -114,8 +114,8 @@ public:
private:
int32_t mesh_idx_ {C_NONE};
unique_ptr<DiscreteIndex> elem_idx_dist_; //!< Distribution of
//!< mesh element indices
DiscreteIndex elem_idx_dist_; //!< Distribution of
//!< mesh element indices
};
//==============================================================================

View file

@ -25,8 +25,9 @@ namespace openmc {
DiscreteIndex::DiscreteIndex(pugi::xml_node node)
{
auto params = get_node_array<double>(node, "parameters");
std::size_t n = params.size() / 2;
prob_.assign(params.begin(), params.end());
prob_.assign(params.begin() + n, params.end());
this->init_alias();
}
@ -38,6 +39,13 @@ DiscreteIndex::DiscreteIndex(const double* p, int n)
this->init_alias();
}
void DiscreteIndex::assign(const double* p, int n)
{
prob_.assign(p, p + n);
this->init_alias();
}
void DiscreteIndex::init_alias()
{
normalize();
@ -111,21 +119,19 @@ void DiscreteIndex::normalize()
// Discrete implementation
//==============================================================================
Discrete::Discrete(pugi::xml_node node)
Discrete::Discrete(pugi::xml_node node) : di_(node)
{
auto params = get_node_array<double>(node, "parameters");
std::size_t n = params.size() / 2;
x_.assign(params.begin(), params.begin() + n);
di_ = new DiscreteIndex(params.begin() + n, n)
}
Discrete::Discrete(const double* x, const double* p, int n)
Discrete::Discrete(const double* x, const double* p, int n) : di_(p, n)
{
x_.assign(x, x + n);
di_ = new DiscreteIndex(params.begin() + n, n)
}
double Discrete::sample(uint64_t* seed) const

View file

@ -231,7 +231,7 @@ MeshSpatial::MeshSpatial(pugi::xml_node node)
}
}
elem_idx_dist_ = make_unique<DiscreteIndex>(strengths.data(), n_bins);
elem_idx_dist_.assign(strengths.data(), n_bins);
}
Position MeshSpatial::sample(uint64_t* seed) const