209 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    VectorConfig.cpp
 | |
|  * @brief   Factor Graph Configuration
 | |
|  * @brief   VectorConfig
 | |
|  * @author Frank Dellaert
 | |
|  */
 | |
| 
 | |
| #include <boost/foreach.hpp>
 | |
| #include <boost/tuple/tuple.hpp>
 | |
| #include "VectorBTree.h"
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| namespace gtsam {
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	// Check if two VectorConfigs are compatible, throw exception if not
 | |
| 	static void check_compatible(const string& s, const VectorBTree& a,
 | |
| 			const VectorBTree& b) {
 | |
| 		if (!a.compatible(b))
 | |
| 			throw invalid_argument(s + ": incompatible VectorBTrees");
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	// Check if two VectorBTrees are cloned, throw exception if not
 | |
| 	// The 2 configs need exactly the same ranges tree
 | |
| 	static void check_cloned(const string& s, const VectorBTree& a,
 | |
| 			const VectorBTree& b) {
 | |
| 		if (!a.cloned(b))
 | |
| 			throw invalid_argument(s + ": only defined for cloned VectorBTrees");
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	void VectorBTree::print(const string& name) const {
 | |
| 	  odprintf("VectorBTree %s\n", name.c_str());
 | |
| 	  odprintf("size: %d\n", size_);
 | |
| 	  BOOST_FOREACH(const Pair& p, ranges_) {
 | |
| 	  	const Range& r = p.second;
 | |
| 	    odprintf("%s: %d:%d", string(p.first).c_str(), r.start(), r.size());
 | |
| 	    gtsam::print(get(r));
 | |
| 	  }
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	bool VectorBTree::equals(const VectorBTree& expected, double tol) const {
 | |
| 	  BOOST_FOREACH(const Pair& p, ranges_) {
 | |
| 	  	const Symbol& j = p.first;
 | |
| 	  	if (!expected.contains(j)) return false;
 | |
| 	  	if (!equal_with_abs_tol(expected[j], get(p.second), tol))
 | |
| 	  		return false;
 | |
| 	  }
 | |
| 	  return true;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
|   VectorBTree& VectorBTree::insert(const Symbol& j, const Vector& v) {
 | |
|   	if (contains(j)) throw invalid_argument("VectorBTree::insert: key already exists");
 | |
|   	// calculate new range from current dimensionality and dim(a)
 | |
|   	size_t n1 = values_.size(), n2 = n1 + v.size();
 | |
|   	ranges_ = ranges_.add(j,Range(n1,n2));
 | |
|   	// resize vector and COPY a into it
 | |
|     values_.resize(n2,true);
 | |
|     std::copy(v.begin(),v.end(),values_.begin()+n1);
 | |
|     // increment size
 | |
|     ++size_;
 | |
|     return *this;
 | |
|   }
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
|   VectorBTree& VectorBTree::insertAdd(const Symbol& j, const Vector& v) {
 | |
|   	if (!contains(j)) return insert(j,v);
 | |
| 		const Range& r = ranges_.find(j);
 | |
| 	  SubVector(values_,r) += v;
 | |
|     return *this;
 | |
|   }
 | |
| 
 | |
|   /* ************************************************************************* */
 | |
|   void VectorBTree::insert(const VectorBTree& config) {
 | |
| 	  BOOST_FOREACH(const Pair& p, config.ranges_)
 | |
| 	    insert(p.first,config.get(p.second));
 | |
|   }
 | |
| 
 | |
|   /* ************************************************************************* */
 | |
|   void VectorBTree::insertAdd(const VectorBTree& config) {
 | |
| 	  BOOST_FOREACH(const Pair& p, config.ranges_)
 | |
| 	    insertAdd(p.first,config.get(p.second));
 | |
|   }
 | |
| 
 | |
|   /* ************************************************************************* */
 | |
|   std::vector<Symbol> VectorBTree::get_names() const {
 | |
|     std::vector<Symbol> names;
 | |
| 	  BOOST_FOREACH(const Pair& p, ranges_)
 | |
|       names.push_back(p.first);
 | |
|     return names;
 | |
|   }
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	SubVector VectorBTree::operator[](const Symbol& j) {
 | |
| 		const Range& r = ranges_.find(j);
 | |
| 	  return SubVector(values_,r);
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	ConstSubVector VectorBTree::operator[](const Symbol& j) const {
 | |
| 		const Range& r = ranges_.find(j);
 | |
| 	  return ConstSubVector(values_,r);
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
|   double VectorBTree::max() const {
 | |
|   	double m = -std::numeric_limits<double>::infinity();
 | |
| 	  BOOST_FOREACH(const Pair& p, ranges_)
 | |
|   		m = std::max(m, gtsam::max(get(p.second)));
 | |
|   	return m;
 | |
|   }
 | |
| 
 | |
| 		/* ************************************************************************* */
 | |
| 	VectorBTree VectorBTree::scale(double s) const {
 | |
| 		VectorBTree scaled = *this;
 | |
| 		scaled.values_ *= s;
 | |
| 		return scaled;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree VectorBTree::operator*(double s) const {
 | |
| 		return scale(s);
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree VectorBTree::operator-() const {
 | |
| 		VectorBTree result = *this;
 | |
| 		result.values_ = - values_;
 | |
| 		return result;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	void VectorBTree::operator+=(const VectorBTree& b) {
 | |
| 		check_compatible("VectorBTree:operator+=", *this, b);
 | |
| 		values_ += b.values_;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree VectorBTree::operator+(const VectorBTree& b) const {
 | |
| 		check_compatible("VectorBTree:operator+", *this, b);
 | |
| 		VectorBTree result = *this;
 | |
| 		result += b;
 | |
| 		return result;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	void VectorBTree::operator-=(const VectorBTree& b) {
 | |
| 		check_compatible("VectorBTree:operator-=", *this, b);
 | |
| 		values_ -= b.values_;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree VectorBTree::operator-(const VectorBTree& b) const {
 | |
| 		VectorBTree result = *this;
 | |
| 		result -= b;
 | |
| 		return result;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	double VectorBTree::dot(const VectorBTree& b) const {
 | |
| 		check_compatible("VectorBTree:dot", *this, b);
 | |
| 		return gtsam::dot(values_,b.values_);
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree& VectorBTree::zero() {
 | |
| 		std::fill(values_.begin(), values_.end(), 0.0);
 | |
| 		return *this;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree VectorBTree::zero(const VectorBTree& x) {
 | |
| 		VectorBTree cloned(x);
 | |
| 		return cloned.zero();
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree expmap(const VectorBTree& original, const VectorBTree& delta) {
 | |
| 		check_compatible("VectorBTree:expmap", original, delta);
 | |
| 		return original + delta;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	VectorBTree expmap(const VectorBTree& original, const Vector& delta)
 | |
| 	{
 | |
| 		VectorBTree result = original;
 | |
| 		result.values_ += delta;
 | |
| 		return result;
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	void scal(double alpha, VectorBTree& x) {
 | |
| 		scal(alpha, x.values_);
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 	void axpy(double alpha, const VectorBTree& x, VectorBTree& y) {
 | |
| 		check_cloned("VectorBTree:axpy", x, y);
 | |
| 		axpy(alpha, x.values_, y.values_);
 | |
| 	}
 | |
| 
 | |
| 	/* ************************************************************************* */
 | |
| 
 | |
| } // gtsam
 |