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
 |