Added Errors class and operator* for GaussianFactor and GaussianFactorGraph. Also moved a few functions to cpp.

release/4.3a0
Frank Dellaert 2009-12-26 22:48:41 +00:00
parent 6614434b83
commit 7d1428de60
8 changed files with 115 additions and 13 deletions

36
cpp/Errors.cpp Normal file
View File

@ -0,0 +1,36 @@
/**
* @file Errors.cpp
* @brief Factor Graph Configuration
* @brief Errors
* @author Carlos Nieto
* @author Christian Potthast
*/
#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());
for (size_t i=0;i<size();i++) {
odprintf("%d:", i);
gtsam::print((*this)[i]);
}
}
/* ************************************************************************* */
bool Errors::equals(const Errors& expected, double tol) const {
if( size() != expected.size() ) return false;
for (size_t i=0;i<size();i++)
if(!equal_with_abs_tol(expected[i],(*this)[i],tol))
return false;
return true;
}
/* ************************************************************************* */
} // gtsam

31
cpp/Errors.h Normal file
View File

@ -0,0 +1,31 @@
/**
* @file Errors.h
* @brief vector of errors
* @author Frank Dellaert
*/
// \callgraph
#pragma once
#include <vector>
#include "Testable.h"
#include "Vector.h"
namespace gtsam {
/** vector of errors */
class Errors : public std::vector<Vector>, public Testable<Errors> {
public:
/** print */
void print(const std::string& s = "Errors") const;
/** equals, for unit testing */
bool equals(const Errors& expected, double tol=1e-9) const;
}; // Errors
} // gtsam

View File

@ -131,14 +131,13 @@ Vector GaussianFactor::unweighted_error(const VectorConfig& c) const {
if (empty()) return e; if (empty()) return e;
string j; Matrix Aj; string j; Matrix Aj;
FOREACH_PAIR(j, Aj, As_) FOREACH_PAIR(j, Aj, As_)
e += Vector(Aj * c[j]); e += (Aj * c[j]);
return e; return e;
} }
/* ************************************************************************* */ /* ************************************************************************* */
Vector GaussianFactor::error_vector(const VectorConfig& c) const { Vector GaussianFactor::error_vector(const VectorConfig& c) const {
Vector e = -b_; if (empty()) return (-b_);
if (empty()) return e;
return ediv(unweighted_error(c),sigmas_); return ediv(unweighted_error(c),sigmas_);
} }
@ -402,6 +401,18 @@ GaussianFactor::shared_ptr GaussianFactor::alphaFactor(const VectorConfig& x,
return factor; return factor;
} }
/* ************************************************************************* */
Vector GaussianFactor::operator*(const VectorConfig& x) const {
Vector Ax = zero(b_.size());
if (empty()) return Ax;
string j; Matrix Aj;
FOREACH_PAIR(j, Aj, As_)
Ax += (Aj * x[j]);
return ediv(Ax,sigmas_);
}
/* ************************************************************************* */ /* ************************************************************************* */
namespace gtsam { namespace gtsam {

View File

@ -230,6 +230,11 @@ public:
*/ */
shared_ptr alphaFactor(const VectorConfig& x, const VectorConfig& d) const; shared_ptr alphaFactor(const VectorConfig& x, const VectorConfig& d) const;
/**
* Return A*x
*/
Vector operator*(const VectorConfig& x) const;
/* ************************************************************************* */ /* ************************************************************************* */
// MUTABLE functions. FD:on the path to being eradicated // MUTABLE functions. FD:on the path to being eradicated
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -31,6 +31,22 @@ GaussianFactorGraph::GaussianFactorGraph(const GaussianBayesNet& CBN) :
FactorGraph<GaussianFactor> (CBN) { FactorGraph<GaussianFactor> (CBN) {
} }
/* ************************************************************************* */
double GaussianFactorGraph::error(const VectorConfig& x) const {
double total_error = 0.;
BOOST_FOREACH(sharedFactor factor,factors_)
total_error += factor->error(x);
return total_error;
}
/* ************************************************************************* */
Errors GaussianFactorGraph::operator*(const VectorConfig& x) const {
Errors e;
BOOST_FOREACH(sharedFactor factor,factors_)
e.push_back((*factor)*x);
return e;
}
/* ************************************************************************* */ /* ************************************************************************* */
set<string> GaussianFactorGraph::find_separator(const string& key) const set<string> GaussianFactorGraph::find_separator(const string& key) const
{ {

View File

@ -13,6 +13,7 @@
#pragma once #pragma once
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include "Errors.h"
#include "FactorGraph.h" #include "FactorGraph.h"
#include "GaussianFactor.h" #include "GaussianFactor.h"
#include "GaussianBayesNet.h" // needed for MATLAB toolbox !! #include "GaussianBayesNet.h" // needed for MATLAB toolbox !!
@ -73,14 +74,10 @@ namespace gtsam {
} }
/** unnormalized error */ /** unnormalized error */
double error(const VectorConfig& c) const { double error(const VectorConfig& x) const;
double total_error = 0.;
// iterate over all the factors_ to accumulate the log probabilities
for (const_iterator factor = factors_.begin(); factor != factors_.end(); factor++)
total_error += (*factor)->error(c);
return total_error; /** return A*x */
} Errors operator*(const VectorConfig& x) const;
/** Unnormalized probability. O(n) */ /** Unnormalized probability. O(n) */
double probPrime(const VectorConfig& c) const { double probPrime(const VectorConfig& c) const {

View File

@ -97,7 +97,7 @@ testBinaryBayesNet_LDADD = libgtsam.la
# Gaussian inference # Gaussian inference
headers += GaussianFactorSet.h headers += GaussianFactorSet.h
sources += VectorConfig.cpp GaussianFactor.cpp GaussianFactorGraph.cpp GaussianConditional.cpp GaussianBayesNet.cpp sources += Errors.cpp VectorConfig.cpp GaussianFactor.cpp GaussianFactorGraph.cpp GaussianConditional.cpp GaussianBayesNet.cpp
check_PROGRAMS += testVectorConfig testGaussianFactor testGaussianFactorGraph testGaussianConditional testGaussianBayesNet check_PROGRAMS += testVectorConfig testGaussianFactor testGaussianFactorGraph testGaussianConditional testGaussianBayesNet
testVectorConfig_SOURCES = testVectorConfig.cpp testVectorConfig_SOURCES = testVectorConfig.cpp
testVectorConfig_LDADD = libgtsam.la testVectorConfig_LDADD = libgtsam.la

View File

@ -11,6 +11,7 @@ using namespace std;
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include <boost/assign/std/list.hpp> // for operator += #include <boost/assign/std/list.hpp> // for operator +=
#include <boost/assign/std/vector.hpp> // for operator +=
using namespace boost::assign; using namespace boost::assign;
#include <CppUnitLite/TestHarness.h> #include <CppUnitLite/TestHarness.h>
@ -576,12 +577,17 @@ TEST( GaussianFactorGraph, gradient )
CHECK(assert_equal(zero,actual2)); CHECK(assert_equal(zero,actual2));
} }
/* ************************************************************************* * /* ************************************************************************* */
TEST( GaussianFactorGraph, multiplication ) TEST( GaussianFactorGraph, multiplication )
{ {
GaussianFactorGraph A = createGaussianFactorGraph(); GaussianFactorGraph A = createGaussianFactorGraph();
VectorConfig x = createConfig(); VectorConfig x = createConfig();
ErrorConfig actual = A * x; Errors actual = A * x;
Errors expected;
expected += Vector_(2, 0.0, 0.0);
expected += Vector_(2,15.0, 0.0);
expected += Vector_(2, 0.0,-5.0);
expected += Vector_(2,-7.5,-5.0);
CHECK(assert_equal(expected,actual)); CHECK(assert_equal(expected,actual));
} }