/* * LieConfig.cpp * * Created on: Jan 8, 2010 * Author: richard */ #include "LieConfig.h" #include #include #include #include #include #include "VectorConfig.h" using namespace std; #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) namespace gtsam { template void LieConfig::print(const string &s) const { cout << "LieConfig " << s << ", size " << values_.size() << "\n"; pair v; BOOST_FOREACH(v, values_) gtsam::print(v.second, v.first + ": "); } template bool LieConfig::equals(const LieConfig& expected, double tol) const { if (values_.size() != expected.values_.size()) return false; pair v; BOOST_FOREACH(v, values_) { boost::optional expval = expected.gettry(v.first); if(!expval || !gtsam::equal(v.second, *expval, tol)) return false; } return true; } template const T& LieConfig::get(const std::string& key) const { iterator it = values_.find(key); if (it == values_.end()) throw std::invalid_argument("invalid key"); else return it->second; } template boost::optional LieConfig::gettry(const std::string& key) const { const_iterator it = values_.find(key); if (it == values_.end()) return boost::optional(); else return it->second; } template void LieConfig::insert(const std::string& name, const T& val) { values_.insert(make_pair(name, val)); dim_ += dim(val); } template LieConfig expmap(const LieConfig& c, const VectorConfig& delta) { LieConfig newConfig; string j; T pj; FOREACH_PAIR(j, pj, c) { if (delta.contains(j)) { const Vector& dj = delta[j]; newConfig.insert(j, expmap(pj,dj)); } else newConfig.insert(j, pj); } return newConfig; } // This version just creates a VectorConfig then calls function above template LieConfig expmap(const LieConfig& c, const Vector& delta) { VectorConfig deltaConfig; int delta_offset = 0; string j; T pj; FOREACH_PAIR(j, pj, c) { int cur_dim = dim(pj); Vector dj = sub(delta, delta_offset, delta_offset+cur_dim); deltaConfig.insert(j,dj); delta_offset += cur_dim; } return expmap(c,deltaConfig); } }