gtsam/cpp/GaussianConditional.h

151 lines
3.8 KiB
C++

/**
* @file GaussianConditional.h
* @brief Conditional Gaussian Base class
* @author Christian Potthast
*/
// \callgraph
#pragma once
#include <map>
#include <list>
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include "Conditional.h"
#include "VectorConfig.h"
#include "Matrix.h"
namespace gtsam {
class Ordering;
/**
* A conditional Gaussian functions as the node in a Bayes network
* It has a set of parents y,z, etc. and implements a probability density on x.
* The negative log-probability is given by || Rx - (d - Sy - Tz - ...)||^2
*/
class GaussianConditional : public Conditional {
public:
typedef std::map<std::string, Matrix> Parents;
typedef Parents::const_iterator const_iterator;
typedef boost::shared_ptr<GaussianConditional> shared_ptr;
protected:
/** the triangular matrix (square root information matrix) - unit normalized */
Matrix R_;
/** the names and the matrices connecting to parent nodes */
Parents parents_;
/** the RHS vector */
Vector d_;
/** vector of standard deviations */
Vector sigmas_;
public:
/** default constructor needed for serialization */
GaussianConditional(){}
/** constructor */
GaussianConditional(const std::string& key) :
Conditional (key) {}
/** constructor with no parents
* |Rx-d|
*/
GaussianConditional(const std::string& key, Vector d, Matrix R, Vector sigmas);
/** constructor with only one parent
* |Rx+Sy-d|
*/
GaussianConditional(const std::string& key, Vector d, Matrix R,
const std::string& name1, Matrix S, Vector sigmas);
/** constructor with two parents
* |Rx+Sy+Tz-d|
*/
GaussianConditional(const std::string& key, Vector d, Matrix R,
const std::string& name1, Matrix S, const std::string& name2, Matrix T, Vector sigmas);
/**
* constructor with number of arbitrary parents
* |Rx+sum(Ai*xi)-d|
*/
GaussianConditional(const std::string& key, const Vector& d,
const Matrix& R, const Parents& parents, Vector sigmas);
/** deconstructor */
virtual ~GaussianConditional() {}
/** print */
void print(const std::string& = "GaussianConditional") const;
/** equals function */
bool equals(const Conditional &cg, double tol = 1e-9) const;
/** dimension of multivariate variable */
size_t dim() const { return R_.size2();}
/** return all parents */
std::list<std::string> parents() const;
/** return stuff contained in GaussianConditional */
const Vector& get_d() const {return d_;}
const Matrix& get_R() const {return R_;}
const Vector& get_sigmas() const {return sigmas_;}
/** STL like, return the iterator pointing to the first node */
const_iterator const parentsBegin() const {
return parents_.begin();
}
/** STL like, return the iterator pointing to the last node */
const_iterator const parentsEnd() const {
return parents_.end();
}
/** find the number of parents */
size_t nrParents() const {
return parents_.size();
}
/** determine whether a key is among the parents */
size_t contains(const std::string& key) const {
return parents_.count(key);
}
/**
* solve a conditional Gaussian
* @param x configuration in which the parents values (y,z,...) are known
* @return solution x = R \ (d - Sy - Tz - ...)
*/
virtual Vector solve(const VectorConfig& x) const;
/**
* adds a parent
*/
void add(const std::string key, Matrix S){
parents_.insert(make_pair(key, S));
}
private:
/** Serialization function */
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::make_nvp("Conditional", boost::serialization::base_object<Conditional>(*this));
ar & BOOST_SERIALIZATION_NVP(R_);
ar & BOOST_SERIALIZATION_NVP(parents_);
ar & BOOST_SERIALIZATION_NVP(d_);
ar & BOOST_SERIALIZATION_NVP(sigmas_);
}
};
}