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
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |