Added partial sequential and multifrontal elimination and const fixes

release/4.3a0
Richard Roberts 2013-06-17 21:16:06 +00:00
parent da99a6e9fb
commit 642eca5fc5
2 changed files with 46 additions and 13 deletions

View File

@ -33,8 +33,8 @@ namespace gtsam {
{ {
if(ordering && variableIndex) { if(ordering && variableIndex) {
// Do elimination // Do elimination
std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> > result = std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> > result
ELIMINATIONTREE(asDerived(), *variableIndex, *ordering).eliminate(function); = ELIMINATIONTREE(asDerived(), *variableIndex, *ordering).eliminate(function);
// If any factors are remaining, the ordering was incomplete // If any factors are remaining, the ordering was incomplete
if(!result.second->empty()) if(!result.second->empty())
throw InconsistentEliminationRequested(); throw InconsistentEliminationRequested();
@ -58,16 +58,14 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
template<class FACTOR, class FACTORGRAPH, class CONDITIONAL, template<class FACTOR, class FACTORGRAPH, class CONDITIONAL,
class BAYESNET, class ELIMINATIONTREE, class BAYESTREE, class JUNCTIONTREE> class BAYESNET, class ELIMINATIONTREE, class BAYESTREE, class JUNCTIONTREE>
boost::shared_ptr<BAYESTREE> boost::shared_ptr<BAYESTREE>
EliminateableFactorGraph<FACTOR, FACTORGRAPH, CONDITIONAL, BAYESNET, ELIMINATIONTREE, BAYESTREE, JUNCTIONTREE>:: EliminateableFactorGraph<FACTOR, FACTORGRAPH, CONDITIONAL, BAYESNET, ELIMINATIONTREE, BAYESTREE, JUNCTIONTREE>
eliminateMultifrontal( ::eliminateMultifrontal(const Eliminate& function, OptionalOrdering ordering, OptionalVariableIndex variableIndex) const
const Eliminate& function, OptionalOrdering ordering, OptionalVariableIndex variableIndex) const
{ {
if(ordering && variableIndex) { if(ordering && variableIndex) {
// Do elimination
std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> > result;
// Do elimination with given ordering // Do elimination with given ordering
result = JUNCTIONTREE(ELIMINATIONTREE(asDerived(), *variableIndex, *ordering)).eliminate(function); std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> > result
= JUNCTIONTREE(ELIMINATIONTREE(asDerived(), *variableIndex, *ordering)).eliminate(function);
// If any factors are remaining, the ordering was incomplete // If any factors are remaining, the ordering was incomplete
if(!result.second->empty()) if(!result.second->empty())
throw InconsistentEliminationRequested(); throw InconsistentEliminationRequested();
@ -88,4 +86,39 @@ namespace gtsam {
} }
} }
/* ************************************************************************* */
template<class FACTOR, class FACTORGRAPH, class CONDITIONAL,
class BAYESNET, class ELIMINATIONTREE, class BAYESTREE, class JUNCTIONTREE>
std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> >
EliminateableFactorGraph<FACTOR, FACTORGRAPH, CONDITIONAL, BAYESNET, ELIMINATIONTREE, BAYESTREE, JUNCTIONTREE>
::eliminatePartialSequential(const Eliminate& function, const OrderingUnordered& ordering,
OptionalVariableIndex variableIndex = boost::none) const
{
if(variableIndex) {
// Do elimination
return ELIMINATIONTREE(asDerived(), *variableIndex, ordering).eliminate(function);
} else {
// If no variable index is provided, compute one and call this function again
return eliminatePartialSequential(function, ordering, VariableIndexUnordered(asDerived()));
}
}
/* ************************************************************************* */
template<class FACTOR, class FACTORGRAPH, class CONDITIONAL,
class BAYESNET, class ELIMINATIONTREE, class BAYESTREE, class JUNCTIONTREE>
std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> >
EliminateableFactorGraph<FACTOR, FACTORGRAPH, CONDITIONAL, BAYESNET, ELIMINATIONTREE, BAYESTREE, JUNCTIONTREE>
::eliminatePartialMultifrontal(const Eliminate& function, const OrderingUnordered& ordering,
OptionalVariableIndex variableIndex = boost::none) const
{
if(variableIndex) {
// Do elimination
return JUNCTIONTREE(ELIMINATIONTREE(asDerived(), *variableIndex, ordering)).eliminate(function);
} else {
// If no variable index is provided, compute one and call this function again
return eliminatePartialMultifrontal(function, ordering, VariableIndexUnordered(asDerived()));
}
}
} }

View File

@ -96,7 +96,7 @@ namespace gtsam {
* B = X\backslash A \f$. */ * B = X\backslash A \f$. */
std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> > std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> >
eliminatePartialSequential(const Eliminate& function, const OrderingUnordered& ordering, eliminatePartialSequential(const Eliminate& function, const OrderingUnordered& ordering,
OptionalVariableIndex variableIndex = boost::none); OptionalVariableIndex variableIndex = boost::none) const;
/** Do sequential elimination of the given \c variables in an ordering computed by COLAMD to /** Do sequential elimination of the given \c variables in an ordering computed by COLAMD to
* produce a Bayes net and a remaining factor graph. This computes the factorization \f$ p(X) * produce a Bayes net and a remaining factor graph. This computes the factorization \f$ p(X)
@ -104,7 +104,7 @@ namespace gtsam {
* factor graph, and \f$ B = X\backslash A \f$. */ * factor graph, and \f$ B = X\backslash A \f$. */
std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> > std::pair<boost::shared_ptr<BAYESNET>, boost::shared_ptr<FACTORGRAPH> >
eliminatePartialSequential(const Eliminate& function, const std::vector<Key>& variables, eliminatePartialSequential(const Eliminate& function, const std::vector<Key>& variables,
OptionalVariableIndex variableIndex = boost::none); OptionalVariableIndex variableIndex = boost::none) const;
/** Do multifrontal elimination of the given \c variables in an ordering computed by COLAMD to /** Do multifrontal elimination of the given \c variables in an ordering computed by COLAMD to
* produce a Bayes net and a remaining factor graph. This computes the factorization \f$ p(X) * produce a Bayes net and a remaining factor graph. This computes the factorization \f$ p(X)
@ -112,7 +112,7 @@ namespace gtsam {
* factor graph, and \f$ B = X\backslash A \f$. */ * factor graph, and \f$ B = X\backslash A \f$. */
std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> > std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> >
eliminatePartialMultifrontal(const Eliminate& function, const OrderingUnordered& ordering, eliminatePartialMultifrontal(const Eliminate& function, const OrderingUnordered& ordering,
OptionalVariableIndex variableIndex = boost::none); OptionalVariableIndex variableIndex = boost::none) const;
/** Do multifrontal elimination of some variables in the given \c ordering to produce a Bayes /** Do multifrontal elimination of some variables in the given \c ordering to produce a Bayes
* tree and a remaining factor graph. This computes the factorization \f$ p(X) = p(A|B) p(B) * tree and a remaining factor graph. This computes the factorization \f$ p(X) = p(A|B) p(B)
@ -120,7 +120,7 @@ namespace gtsam {
* \f$ B = X\backslash A \f$. */ * \f$ B = X\backslash A \f$. */
std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> > std::pair<boost::shared_ptr<BAYESTREE>, boost::shared_ptr<FACTORGRAPH> >
eliminatePartialMultifrontal(const Eliminate& function, const std::vector<Key>& variables, eliminatePartialMultifrontal(const Eliminate& function, const std::vector<Key>& variables,
OptionalVariableIndex variableIndex = boost::none); OptionalVariableIndex variableIndex = boost::none) const;
private: private: