Added FactorGraph::replace(index, factor) to replace one factor with another (used in FrameSLAM).
							parent
							
								
									3c0ae0ec1c
								
							
						
					
					
						commit
						ff817551de
					
				|  | @ -17,6 +17,7 @@ | |||
| 
 | ||||
| #include <boost/foreach.hpp> | ||||
| #include <boost/tuple/tuple.hpp> | ||||
| #include <boost/format.hpp> | ||||
| #include <colamd/colamd.h> | ||||
| #include "Ordering.h" | ||||
| #include "FactorGraph.h" | ||||
|  | @ -86,19 +87,7 @@ void FactorGraph<Factor>::push_back(sharedFactor factor) { | |||
| 	if (factor==NULL) return; | ||||
| 
 | ||||
| 	int i = factors_.size() - 1;                 // index of factor
 | ||||
| 	list<string> keys = factor->keys();          // get keys for factor
 | ||||
| 
 | ||||
| 	BOOST_FOREACH(string key, keys){             // for each key push i onto list
 | ||||
| 		Indices::iterator it = indices_.find(key); // old list for that key (if exists)
 | ||||
| 		if (it==indices_.end()){                   // there's no list yet
 | ||||
| 			list<int> indices(1,i);                  // so make one
 | ||||
| 			indices_.insert(make_pair(key,indices)); // insert new indices into factorMap
 | ||||
| 		} | ||||
| 		else { | ||||
| 			list<int> *indices_ptr = &(it->second);  // get the list
 | ||||
| 			indices_ptr->push_back(i);               // add the index i to it
 | ||||
| 		} | ||||
| 	} | ||||
| 	associateFactor(i, factor); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -109,6 +98,36 @@ void FactorGraph<Factor>::push_back(const FactorGraph<Factor>& factors) { | |||
| 		push_back(*factor); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template<class Factor> | ||||
| void FactorGraph<Factor>::replace(int index, sharedFactor factor) { | ||||
|   if(index >= factors_.size()) | ||||
|     throw invalid_argument(boost::str(boost::format( | ||||
|         "Factor graph does not contain a factor with index %d.") % index)); | ||||
|   //if(factors_[index] == NULL)
 | ||||
|   //  throw invalid_argument(boost::str(boost::format(
 | ||||
|   //      "Factor with index %d is NULL." % index)));
 | ||||
| 
 | ||||
|   if(factors_[index] != NULL) { | ||||
|     // Remove this factor from its variables' index lists
 | ||||
|     list<string> keys(factor->keys()); | ||||
|     BOOST_FOREACH(string key, keys) { | ||||
|       Indices::iterator indices = indices_.find(key); | ||||
|       if(indices != indices_.end()) { | ||||
|         indices->second.remove(index); | ||||
|       } else { | ||||
|         throw invalid_argument(boost::str(boost::format( | ||||
|             "Factor graph inconsistency!  Factor %d involves variable %s but " | ||||
|             "is missing from its factor index list.") % index % key)); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // Replace the factor
 | ||||
|   factors_[index] = factor; | ||||
|   associateFactor(index, factor); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template<class Factor> | ||||
| Ordering FactorGraph<Factor>::keys() const { | ||||
|  | @ -231,6 +250,24 @@ FactorGraph<Factor>::findAndRemoveFactors(const string& key) { | |||
| 	return found; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template<class Factor> | ||||
| void FactorGraph<Factor>::associateFactor(int index, sharedFactor factor) { | ||||
|   list<string> keys = factor->keys();          // get keys for factor
 | ||||
| 
 | ||||
|   BOOST_FOREACH(string key, keys){             // for each key push i onto list
 | ||||
|       Indices::iterator it = indices_.find(key); // old list for that key (if exists)
 | ||||
|       if (it==indices_.end()){                   // there's no list yet
 | ||||
|           list<int> indices(1,index);                  // so make one
 | ||||
|           indices_.insert(make_pair(key,indices)); // insert new indices into factorMap
 | ||||
|       } | ||||
|       else { | ||||
|           list<int> *indices_ptr = &(it->second);  // get the list
 | ||||
|           indices_ptr->push_back(index);               // add the index i to it
 | ||||
|       } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| /* find factors and remove them from the factor graph: O(n)                  */ | ||||
| /* ************************************************************************* */ | ||||
|  | @ -253,6 +290,4 @@ FactorGraph<Factor> combine(const FactorGraph<Factor>& fg1, const FactorGraph<Fa | |||
| 
 | ||||
| 	return fg; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| } | ||||
|  |  | |||
|  | @ -79,6 +79,9 @@ namespace gtsam { | |||
| 		/** push back many factors */ | ||||
| 		void push_back(const FactorGraph<Factor>& factors); | ||||
| 
 | ||||
| 		/** replace a factor by index */ | ||||
| 		void replace(int index, sharedFactor factor); | ||||
| 
 | ||||
| 		/** return keys in some random order */ | ||||
| 		Ordering keys() const; | ||||
| 
 | ||||
|  | @ -111,6 +114,8 @@ namespace gtsam { | |||
| 		std::vector<sharedFactor> findAndRemoveFactors(const std::string& key); | ||||
| 
 | ||||
| 	private: | ||||
| 		/** Associate factor index with the variables connected to the factor */ | ||||
| 		void associateFactor(int index, sharedFactor factor); | ||||
| 
 | ||||
| 		/** Serialization function */ | ||||
| 		friend class boost::serialization::access; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue