gtsam/inference/GaussianConditional.cpp

113 lines
3.9 KiB
C++
Raw Normal View History

2009-08-22 06:23:24 +08:00
/**
* @file GaussianConditional.cpp
2009-08-22 06:23:24 +08:00
* @brief Conditional Gaussian Base class
* @author Christian Potthast
*/
#include <string.h>
#include <boost/numeric/ublas/vector.hpp>
#include "Ordering.h"
#include "GaussianConditional.h"
2009-08-22 06:23:24 +08:00
using namespace std;
using namespace gtsam;
/* ************************************************************************* */
GaussianConditional::GaussianConditional(const Symbol& key,Vector d, Matrix R, Vector sigmas) :
2010-07-11 05:01:06 +08:00
Conditional (key), R_(R),d_(d),sigmas_(sigmas)
{
2009-08-22 06:23:24 +08:00
}
/* ************************************************************************* */
GaussianConditional::GaussianConditional(const Symbol& key, Vector d, Matrix R,
const Symbol& name1, Matrix S, Vector sigmas) :
2010-07-11 05:01:06 +08:00
Conditional (key), R_(R), d_(d), sigmas_(sigmas) {
parents_.insert(make_pair(name1, S));
2009-08-22 06:23:24 +08:00
}
/* ************************************************************************* */
GaussianConditional::GaussianConditional(const Symbol& key, Vector d, Matrix R,
const Symbol& name1, Matrix S, const Symbol& name2, Matrix T, Vector sigmas) :
2010-07-11 05:01:06 +08:00
Conditional (key), R_(R), d_(d),sigmas_(sigmas) {
parents_.insert(make_pair(name1, S));
parents_.insert(make_pair(name2, T));
2009-08-22 06:23:24 +08:00
}
/* ************************************************************************* */
GaussianConditional::GaussianConditional(const Symbol& key,
const Vector& d, const Matrix& R, const SymbolMap<Matrix>& parents, Vector sigmas) :
2010-07-11 05:01:06 +08:00
Conditional (key), R_(R), parents_(parents), d_(d),sigmas_(sigmas) {
}
2009-08-22 06:23:24 +08:00
/* ************************************************************************* */
void GaussianConditional::print(const string &s) const
2009-08-22 06:23:24 +08:00
{
cout << s << ": density on " << (string)key_ << endl;
2009-08-22 06:23:24 +08:00
gtsam::print(R_,"R");
for(Parents::const_iterator it = parents_.begin() ; it != parents_.end() ; it++ ) {
const Symbol& j = it->first;
2009-08-22 06:23:24 +08:00
const Matrix& Aj = it->second;
gtsam::print(Aj, "A["+(string)j+"]");
2009-08-22 06:23:24 +08:00
}
gtsam::print(d_,"d");
2009-11-05 14:59:59 +08:00
gtsam::print(sigmas_,"sigmas");
2009-08-22 06:23:24 +08:00
}
/* ************************************************************************* */
bool GaussianConditional::equals(const Conditional &c, double tol) const {
if (!Conditional::equals(c)) return false;
const GaussianConditional* p = dynamic_cast<const GaussianConditional*> (&c);
if (p == NULL) return false;
Parents::const_iterator it = parents_.begin();
// check if the size of the parents_ map is the same
if (parents_.size() != p->parents_.size()) return false;
2010-07-11 15:30:27 +08:00
// check if R_ and d_ are linear independent
2010-07-11 05:01:06 +08:00
for (size_t i=0; i<d_.size(); i++) {
2010-07-11 15:30:27 +08:00
list<Vector> rows1; rows1.push_back(row_(R_, i));
list<Vector> rows2; rows2.push_back(row_(p->R_, i));
2010-07-05 07:50:21 +08:00
// check if the matrices are the same
// iterate over the parents_ map
for (it = parents_.begin(); it != parents_.end(); it++) {
Parents::const_iterator it2 = p->parents_.find(it->first);
if (it2 != p->parents_.end()) {
2010-07-11 15:30:27 +08:00
rows1.push_back(row_(it->second, i));
rows2.push_back(row_(it2->second,i));
2010-07-05 07:50:21 +08:00
} else
2010-06-30 23:57:12 +08:00
return false;
2010-07-05 07:50:21 +08:00
}
2010-07-11 15:30:27 +08:00
Vector row1 = concatVectors(rows1);
Vector row2 = concatVectors(rows2);
if (!linear_dependent(row1, row2, tol)) return false;
}
2010-07-05 07:50:21 +08:00
// check if sigmas are equal
if (!(::equal_with_abs_tol(sigmas_, p->sigmas_, tol))) return false;
return true;
}
/* ************************************************************************* */
list<Symbol> GaussianConditional::parents() const {
list<Symbol> result;
for (Parents::const_iterator it = parents_.begin(); it != parents_.end(); it++)
result.push_back(it->first);
2009-11-01 00:55:17 +08:00
return result;
}
2009-08-22 06:23:24 +08:00
/* ************************************************************************* */
Vector GaussianConditional::solve(const VectorConfig& x) const {
2009-08-27 09:23:05 +08:00
Vector rhs = d_;
for (Parents::const_iterator it = parents_.begin(); it!= parents_.end(); it++) {
const Symbol& j = it->first;
2009-08-27 09:23:05 +08:00
const Matrix& Aj = it->second;
multiplyAdd(-1.0,Aj,x[j],rhs);
2009-08-27 09:23:05 +08:00
}
return backSubstituteUpper(R_, rhs, false);
2009-08-22 06:23:24 +08:00
}
/* ************************************************************************* */