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/foreach.hpp>
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
#include <boost/format.hpp>
|
||||||
#include <colamd/colamd.h>
|
#include <colamd/colamd.h>
|
||||||
#include "Ordering.h"
|
#include "Ordering.h"
|
||||||
#include "FactorGraph.h"
|
#include "FactorGraph.h"
|
||||||
|
@ -86,19 +87,7 @@ void FactorGraph<Factor>::push_back(sharedFactor factor) {
|
||||||
if (factor==NULL) return;
|
if (factor==NULL) return;
|
||||||
|
|
||||||
int i = factors_.size() - 1; // index of factor
|
int i = factors_.size() - 1; // index of factor
|
||||||
list<string> keys = factor->keys(); // get keys for factor
|
associateFactor(i, 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
@ -109,6 +98,36 @@ void FactorGraph<Factor>::push_back(const FactorGraph<Factor>& factors) {
|
||||||
push_back(*factor);
|
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>
|
template<class Factor>
|
||||||
Ordering FactorGraph<Factor>::keys() const {
|
Ordering FactorGraph<Factor>::keys() const {
|
||||||
|
@ -231,6 +250,24 @@ FactorGraph<Factor>::findAndRemoveFactors(const string& key) {
|
||||||
return found;
|
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) */
|
/* 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;
|
return fg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,9 @@ namespace gtsam {
|
||||||
/** push back many factors */
|
/** push back many factors */
|
||||||
void push_back(const FactorGraph<Factor>& 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 */
|
/** return keys in some random order */
|
||||||
Ordering keys() const;
|
Ordering keys() const;
|
||||||
|
|
||||||
|
@ -111,6 +114,8 @@ namespace gtsam {
|
||||||
std::vector<sharedFactor> findAndRemoveFactors(const std::string& key);
|
std::vector<sharedFactor> findAndRemoveFactors(const std::string& key);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/** Associate factor index with the variables connected to the factor */
|
||||||
|
void associateFactor(int index, sharedFactor factor);
|
||||||
|
|
||||||
/** Serialization function */
|
/** Serialization function */
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
Loading…
Reference in New Issue