Add a static method to actually sample

release/4.3a0
Frank Dellaert 2022-02-06 20:21:19 -05:00
parent a25378abe7
commit d2f6224b84
2 changed files with 17 additions and 13 deletions

View File

@ -22,14 +22,18 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
Sampler::Sampler(const noiseModel::Diagonal::shared_ptr& model, Sampler::Sampler(const noiseModel::Diagonal::shared_ptr& model,
uint_fast64_t seed) uint_fast64_t seed)
: model_(model), generator_(seed) {} : model_(model), generator_(seed) {
if (!model) {
throw std::invalid_argument("Sampler::Sampler needs a non-null model.");
}
}
/* ************************************************************************* */ /* ************************************************************************* */
Sampler::Sampler(const Vector& sigmas, uint_fast64_t seed) Sampler::Sampler(const Vector& sigmas, uint_fast64_t seed)
: model_(noiseModel::Diagonal::Sigmas(sigmas, true)), generator_(seed) {} : model_(noiseModel::Diagonal::Sigmas(sigmas, true)), generator_(seed) {}
/* ************************************************************************* */ /* ************************************************************************* */
Vector Sampler::sampleDiagonal(const Vector& sigmas) const { Vector Sampler::sampleDiagonal(const Vector& sigmas, std::mt19937_64* rng) {
size_t d = sigmas.size(); size_t d = sigmas.size();
Vector result(d); Vector result(d);
for (size_t i = 0; i < d; i++) { for (size_t i = 0; i < d; i++) {
@ -39,14 +43,18 @@ Vector Sampler::sampleDiagonal(const Vector& sigmas) const {
if (sigma == 0.0) { if (sigma == 0.0) {
result(i) = 0.0; result(i) = 0.0;
} else { } else {
typedef std::normal_distribution<double> Normal; std::normal_distribution<double> dist(0.0, sigma);
Normal dist(0.0, sigma); result(i) = dist(*rng);
result(i) = dist(generator_);
} }
} }
return result; return result;
} }
/* ************************************************************************* */
Vector Sampler::sampleDiagonal(const Vector& sigmas) const {
return sampleDiagonal(sigmas, &generator_);
}
/* ************************************************************************* */ /* ************************************************************************* */
Vector Sampler::sample() const { Vector Sampler::sample() const {
assert(model_.get()); assert(model_.get());

View File

@ -63,15 +63,9 @@ class GTSAM_EXPORT Sampler {
/// @name access functions /// @name access functions
/// @{ /// @{
size_t dim() const { size_t dim() const { return model_->dim(); }
assert(model_.get());
return model_->dim();
}
Vector sigmas() const { Vector sigmas() const { return model_->sigmas(); }
assert(model_.get());
return model_->sigmas();
}
const noiseModel::Diagonal::shared_ptr& model() const { return model_; } const noiseModel::Diagonal::shared_ptr& model() const { return model_; }
@ -82,6 +76,8 @@ class GTSAM_EXPORT Sampler {
/// sample from distribution /// sample from distribution
Vector sample() const; Vector sample() const;
/// sample with given random number generator
static Vector sampleDiagonal(const Vector& sigmas, std::mt19937_64* rng);
/// @} /// @}
protected: protected: