Add a static method to actually sample
parent
a25378abe7
commit
d2f6224b84
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue