Improved interface for Sampler to allow alternate usage with noiseModels, removed references to SharedDiagonal

release/4.3a0
Alex Cunningham 2012-06-21 17:44:18 +00:00
parent 0581fe1b24
commit c8a623a1ac
3 changed files with 55 additions and 13 deletions

View File

@ -22,23 +22,29 @@
namespace gtsam { namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
Sampler::Sampler(const SharedDiagonal& model, int32_t seed) Sampler::Sampler(const noiseModel::Diagonal::shared_ptr& model, int32_t seed)
: sigmas_(model->sigmas()), generator_(static_cast<unsigned>(seed)) : model_(model), generator_(static_cast<unsigned>(seed))
{ {
} }
/* ************************************************************************* */ /* ************************************************************************* */
Sampler::Sampler(const Vector& sigmas, int32_t seed) Sampler::Sampler(const Vector& sigmas, int32_t seed)
: sigmas_(sigmas), generator_(static_cast<unsigned>(seed)) : model_(noiseModel::Diagonal::Sigmas(sigmas, true)), generator_(static_cast<unsigned>(seed))
{ {
} }
/* ************************************************************************* */ /* ************************************************************************* */
Vector Sampler::sample() { Sampler::Sampler(int32_t seed)
size_t d = dim(); : generator_(static_cast<unsigned>(seed))
{
}
/* ************************************************************************* */
Vector Sampler::sampleDiagonal(const Vector& sigmas) {
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++) {
double sigma = sigmas_(i); double sigma = sigmas(i);
// handle constrained case separately // handle constrained case separately
if (sigma == 0.0) { if (sigma == 0.0) {
@ -53,4 +59,19 @@ Vector Sampler::sample() {
return result; return result;
} }
/* ************************************************************************* */
Vector Sampler::sample() {
assert(model_.get());
const Vector& sigmas = model_->sigmas();
return sampleDiagonal(sigmas);
}
/* ************************************************************************* */
Vector Sampler::sample(const noiseModel::Diagonal::shared_ptr& model) {
assert(model.get());
const Vector& sigmas = model->sigmas();
return sampleDiagonal(sigmas);
}
/* ************************************************************************* */
} // \namespace gtsam } // \namespace gtsam

View File

@ -18,7 +18,7 @@
#pragma once #pragma once
#include <gtsam/linear/SharedDiagonal.h> #include <gtsam/linear/NoiseModel.h>
namespace gtsam { namespace gtsam {
@ -31,8 +31,8 @@ namespace gtsam {
*/ */
class Sampler { class Sampler {
protected: protected:
/** sigmas from the noise model */ /** noiseModel created at generation */
Vector sigmas_; noiseModel::Diagonal::shared_ptr model_;
/** generator */ /** generator */
boost::minstd_rand generator_; boost::minstd_rand generator_;
@ -46,7 +46,7 @@ public:
* *
* NOTE: do not use zero as a seed, it will break the generator * NOTE: do not use zero as a seed, it will break the generator
*/ */
Sampler(const SharedDiagonal& model, int32_t seed = 42u); Sampler(const noiseModel::Diagonal::shared_ptr& model, int32_t seed = 42u);
/** /**
* Create a sampler for a distribution specified by a vector of sigmas directly * Create a sampler for a distribution specified by a vector of sigmas directly
@ -55,9 +55,17 @@ public:
*/ */
Sampler(const Vector& sigmas, int32_t seed = 42u); Sampler(const Vector& sigmas, int32_t seed = 42u);
/**
* Create a sampler without a given noisemodel - pass in to sample
*
* NOTE: do not use zero as a seed, it will break the generator
*/
Sampler(int32_t seed = 42u);
/** access functions */ /** access functions */
size_t dim() const { return sigmas_.size(); } size_t dim() const { assert(model_.get()); return model_->dim(); }
Vector sigmas() const { return sigmas_; } Vector sigmas() const { assert(model_.get()); return model_->sigmas(); }
const noiseModel::Diagonal::shared_ptr& model() const { return model_; }
/** /**
* sample from distribution * sample from distribution
@ -65,6 +73,19 @@ public:
*/ */
Vector sample(); Vector sample();
/**
* Sample from noisemodel passed in as an argument,
* can be used without having initialized a model for the system.
*
* NOTE: not const due to need to update the underlying generator
*/
Vector sample(const noiseModel::Diagonal::shared_ptr& model);
protected:
/** given sigmas for a diagonal model, returns a sample */
Vector sampleDiagonal(const Vector& sigmas);
}; };
} }

View File

@ -25,7 +25,7 @@ const double tol = 1e-5;
/* ************************************************************************* */ /* ************************************************************************* */
TEST(testSampler, basic) { TEST(testSampler, basic) {
Vector sigmas = Vector_(3, 1.0, 0.1, 0.0); Vector sigmas = Vector_(3, 1.0, 0.1, 0.0);
SharedDiagonal model = noiseModel::Diagonal::Sigmas(sigmas); noiseModel::Diagonal::shared_ptr model = noiseModel::Diagonal::Sigmas(sigmas);
char seed = 'A'; char seed = 'A';
Sampler sampler1(model, seed), sampler2(model, 1), sampler3(model, 1); Sampler sampler1(model, seed), sampler2(model, 1), sampler3(model, 1);
EXPECT(assert_equal(sigmas, sampler1.sigmas())); EXPECT(assert_equal(sigmas, sampler1.sigmas()));