89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
| /* ----------------------------------------------------------------------------
 | |
| 
 | |
|  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
 | |
|  * Atlanta, Georgia 30332-0415
 | |
|  * All Rights Reserved
 | |
|  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
 | |
| 
 | |
|  * See LICENSE for the license information
 | |
| 
 | |
|  * -------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * @file Sampler.h
 | |
|  * @brief sampling from a NoiseModel
 | |
|  * @author Frank Dellaert
 | |
|  * @author Alex Cunningham
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <gtsam/linear/NoiseModel.h>
 | |
| 
 | |
| #include <random>
 | |
| 
 | |
| namespace gtsam {
 | |
| 
 | |
| /**
 | |
|  * Sampling structure that keeps internal random number generators for
 | |
|  * diagonal distributions specified by NoiseModel
 | |
|  */
 | |
| class GTSAM_EXPORT Sampler {
 | |
|  protected:
 | |
|   /** noiseModel created at generation */
 | |
|   noiseModel::Diagonal::shared_ptr model_;
 | |
| 
 | |
|   /** generator */
 | |
|   mutable std::mt19937_64 generator_;
 | |
| 
 | |
|  public:
 | |
|   typedef std::shared_ptr<Sampler> shared_ptr;
 | |
| 
 | |
|   /// @name constructors
 | |
|   /// @{
 | |
| 
 | |
|   /**
 | |
|    * Create a sampler for the distribution specified by a diagonal NoiseModel
 | |
|    * with a manually specified seed
 | |
|    *
 | |
|    * NOTE: do not use zero as a seed, it will break the generator
 | |
|    */
 | |
|   explicit Sampler(const noiseModel::Diagonal::shared_ptr& model,
 | |
|                    uint_fast64_t seed = 42u);
 | |
| 
 | |
|   /**
 | |
|    * Create a sampler for a distribution specified by a vector of sigmas
 | |
|    * directly
 | |
|    *
 | |
|    * NOTE: do not use zero as a seed, it will break the generator
 | |
|    */
 | |
|   explicit Sampler(const Vector& sigmas, uint_fast64_t seed = 42u);
 | |
| 
 | |
|   /// @}
 | |
|   /// @name access functions
 | |
|   /// @{
 | |
| 
 | |
|   size_t dim() const { return model_->dim(); }
 | |
| 
 | |
|   Vector sigmas() const { return model_->sigmas(); }
 | |
| 
 | |
|   const noiseModel::Diagonal::shared_ptr& model() const { return model_; }
 | |
| 
 | |
|   /// @}
 | |
|   /// @name basic functionality
 | |
|   /// @{
 | |
| 
 | |
|   /// sample from distribution
 | |
|   Vector sample() const;
 | |
| 
 | |
|   /// sample with given random number generator
 | |
|   static Vector sampleDiagonal(const Vector& sigmas, std::mt19937_64* rng);
 | |
|   /// @}
 | |
| 
 | |
|  protected:
 | |
|   /** given sigmas for a diagonal model, returns a sample */
 | |
|   Vector sampleDiagonal(const Vector& sigmas) const;
 | |
| };
 | |
| 
 | |
| }  // namespace gtsam
 |