57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
/**
|
|
* @file corruptInitialization.h
|
|
*
|
|
* @brief Utilities for using noisemodels to corrupt given initialization value
|
|
*
|
|
* @date Jun 22, 2012
|
|
* @author Alex Cunningham
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <gtsam/linear/Sampler.h>
|
|
|
|
namespace gtsam {
|
|
|
|
/** given a noisemodel and a measurement, add noise to the measurement */
|
|
template<typename T>
|
|
T corruptWithNoise(const T& init,
|
|
const noiseModel::Base::shared_ptr& model, Sampler& sampler) {
|
|
Vector n = zero(model->dim());
|
|
noiseModel::Diagonal::shared_ptr
|
|
diag_model = boost::dynamic_pointer_cast<noiseModel::Diagonal>(model);
|
|
if (diag_model)
|
|
n = sampler.sampleNewModel(diag_model);
|
|
return init.retract(n);
|
|
}
|
|
|
|
// specialization for doubles - just adds, rather than retract
|
|
template<>
|
|
inline double corruptWithNoise<double>(const double& init,
|
|
const noiseModel::Base::shared_ptr& model, Sampler& sampler) {
|
|
double n = 0.0;
|
|
noiseModel::Diagonal::shared_ptr
|
|
diag_model = boost::dynamic_pointer_cast<noiseModel::Diagonal>(model);
|
|
if (diag_model)
|
|
n = sampler.sampleNewModel(diag_model)(0);
|
|
return init + n;
|
|
}
|
|
|
|
// specialization for doubles - just adds, rather than retract
|
|
template<>
|
|
inline Vector corruptWithNoise<Vector>(const Vector& init,
|
|
const noiseModel::Base::shared_ptr& model, Sampler& sampler) {
|
|
Vector n = zero(init.size());
|
|
noiseModel::Diagonal::shared_ptr
|
|
diag_model = boost::dynamic_pointer_cast<noiseModel::Diagonal>(model);
|
|
if (diag_model)
|
|
n = sampler.sampleNewModel(diag_model);
|
|
return init + n;
|
|
}
|
|
|
|
} // \namespace gtsam
|
|
|
|
|
|
|
|
|