71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
|  | /**
 | ||
|  |  * @file    Factor.h | ||
|  |  * @brief   A simple factor class to use in a factor graph | ||
|  |  * @brief   factor | ||
|  |  * @author  Kai Ni | ||
|  |  */ | ||
|  | 
 | ||
|  | // \callgraph
 | ||
|  | 
 | ||
|  | #pragma once
 | ||
|  | 
 | ||
|  | #include <set>
 | ||
|  | #include "FGConfig.h"
 | ||
|  | 
 | ||
|  | namespace gtsam { | ||
|  | 
 | ||
|  |   struct Variable { | ||
|  |   private: | ||
|  |     std::string key_; | ||
|  |     std::size_t dim_; | ||
|  |   public: | ||
|  |   Variable(const std::string& key, std::size_t dim) : key_(key), dim_(dim) {} | ||
|  |     bool operator< (const Variable& other) const {return key_<other.key_; } | ||
|  |     const std::string& key() const { return key_;} | ||
|  |     std::size_t        dim() const { return dim_;} | ||
|  |   }; | ||
|  | 
 | ||
|  |   class VariableSet : public std::set<Variable> { | ||
|  |   }; | ||
|  | 	 | ||
|  |   /** 
 | ||
|  |    * A simple factor class to use in a factor graph. | ||
|  |    * | ||
|  |    * We make it noncopyable so we enforce the fact that factors are | ||
|  |    * kept in pointer containers. To be safe, you should make them | ||
|  |    * immutable, i.e., practicing functional programming. However, this | ||
|  |    * conflicts with efficiency as well, esp. in the case of incomplete | ||
|  |    * QR factorization. A solution is still being sought. | ||
|  |    */  | ||
|  |   class Factor : boost::noncopyable | ||
|  |   { | ||
|  |   public: | ||
|  | 
 | ||
|  |     virtual ~Factor() {}; | ||
|  | 		 | ||
|  |     /**
 | ||
|  |      * negative log probability  | ||
|  |      */ | ||
|  |     virtual double error(const FGConfig& c) const = 0; | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * print | ||
|  |      * @param s optional string naming the factor | ||
|  |      */ | ||
|  |     virtual void print(const std::string& s="") const = 0; | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * equality up to tolerance | ||
|  |      * tricky to implement, see NonLinearFactor1 for an example | ||
|  |      */ | ||
|  |     virtual bool equals(const Factor& f, double tol=1e-9) const = 0; | ||
|  | 
 | ||
|  |     virtual std::string dump() const = 0; | ||
|  | 		 | ||
|  |     /** 
 | ||
|  |      * @return the number of nodes the factor connects | ||
|  |      */ | ||
|  |     virtual std::size_t size() const = 0; | ||
|  |   }; | ||
|  | } |