82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    Errors.cpp
 | |
|  * @brief   Factor Graph Configuration
 | |
|  * @brief   Errors
 | |
|  * @author  Carlos Nieto
 | |
|  * @author  Christian Potthast
 | |
|  */
 | |
| 
 | |
| #include <boost/bind.hpp>
 | |
| #include <boost/foreach.hpp>
 | |
| #include "Errors.h"
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| namespace gtsam {
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void Errors::print(const std::string& s) const {
 | |
|   odprintf("%s:\n", s.c_str());
 | |
|   BOOST_FOREACH(const Vector& v, *this)
 | |
|     gtsam::print(v);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| struct equalsVector : public std::binary_function<const Vector&, const Vector&, bool> {
 | |
| 	double tol_;
 | |
| 	equalsVector(double tol = 1e-9) : tol_(tol) {}
 | |
| 	bool operator()(const Vector& expected, const Vector& actual) {
 | |
| 		return equal_with_abs_tol(expected, actual,tol_);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| bool Errors::equals(const Errors& expected, double tol) const {
 | |
| 	if( size() != expected.size() ) return false;
 | |
| 	return equal(begin(),end(),expected.begin(),equalsVector(tol));
 | |
| 	// TODO: use boost::bind(&equal_with_abs_tol,_1, _2,tol)
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| Errors Errors::operator-(const Errors& b) const {
 | |
| #ifndef NDEBUG
 | |
| 	size_t m = size();
 | |
| 	if (b.size()!=m)
 | |
|     throw(std::invalid_argument("Errors::operator-: incompatible sizes"));
 | |
| #endif
 | |
| 	Errors result;
 | |
| 	Errors::const_iterator it = b.begin();
 | |
|   BOOST_FOREACH(const Vector& ai, *this)
 | |
| 		result.push_back(ai - *(it++));
 | |
| 	return result;
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| double dot(const Errors& a, const Errors& b) {
 | |
| #ifndef NDEBUG
 | |
| 	size_t m = a.size();
 | |
|   if (b.size()!=m)
 | |
|     throw(std::invalid_argument("Errors::dot: incompatible sizes"));
 | |
| #endif
 | |
|   double result = 0.0;
 | |
| 	Errors::const_iterator it = b.begin();
 | |
|   BOOST_FOREACH(const Vector& ai, a)
 | |
| 		result += gtsam::dot(ai, *(it++));
 | |
| 	return result;
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void axpy(double alpha, const Errors& x, Errors& y) {
 | |
| 	Errors::const_iterator it = x.begin();
 | |
|   BOOST_FOREACH(Vector& yi, y)
 | |
| 		axpy(alpha,*(it++),yi);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void print(const Errors& a, const string& s) {
 | |
| 	a.print(s);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| 
 | |
| } // gtsam
 |