diff --git a/gtsam/discrete/DiscreteFactorGraph.h b/gtsam/discrete/DiscreteFactorGraph.h index 818eeda4e..e665ea88b 100644 --- a/gtsam/discrete/DiscreteFactorGraph.h +++ b/gtsam/discrete/DiscreteFactorGraph.h @@ -62,9 +62,17 @@ template<> struct EliminationTraits typedef DiscreteBayesTree BayesTreeType; ///< Type of Bayes tree typedef DiscreteJunctionTree JunctionTreeType; ///< Type of Junction tree /// The default dense elimination function - static std::pair, boost::shared_ptr > + static std::pair, + boost::shared_ptr > DefaultEliminate(const FactorGraphType& factors, const Ordering& keys) { - return EliminateDiscrete(factors, keys); } + return EliminateDiscrete(factors, keys); + } + /// The default ordering generation function + static Ordering DefaultOrderingFunc( + const FactorGraphType& graph, + boost::optional variableIndex) { + return Ordering::Colamd(*variableIndex); + } }; /* ************************************************************************* */ diff --git a/gtsam/inference/EliminateableFactorGraph-inst.h b/gtsam/inference/EliminateableFactorGraph-inst.h index 35e7505c9..bebce14cd 100644 --- a/gtsam/inference/EliminateableFactorGraph-inst.h +++ b/gtsam/inference/EliminateableFactorGraph-inst.h @@ -44,9 +44,16 @@ namespace gtsam { if (orderingType == Ordering::METIS) { Ordering computedOrdering = Ordering::Metis(asDerived()); return eliminateSequential(computedOrdering, function, variableIndex); - } else { + } else if (orderingType == Ordering::COLAMD) { Ordering computedOrdering = Ordering::Colamd(*variableIndex); return eliminateSequential(computedOrdering, function, variableIndex); + } else if (orderingType == Ordering::NATURAL) { + Ordering computedOrdering = Ordering::Natural(asDerived()); + return eliminateSequential(computedOrdering, function, variableIndex); + } else { + Ordering computedOrdering = EliminationTraitsType::DefaultOrderingFunc( + asDerived(), variableIndex); + return eliminateSequential(computedOrdering, function, variableIndex); } } } @@ -100,9 +107,16 @@ namespace gtsam { if (orderingType == Ordering::METIS) { Ordering computedOrdering = Ordering::Metis(asDerived()); return eliminateMultifrontal(computedOrdering, function, variableIndex); - } else { + } else if (orderingType == Ordering::COLAMD) { Ordering computedOrdering = Ordering::Colamd(*variableIndex); return eliminateMultifrontal(computedOrdering, function, variableIndex); + } else if (orderingType == Ordering::NATURAL) { + Ordering computedOrdering = Ordering::Natural(asDerived()); + return eliminateMultifrontal(computedOrdering, function, variableIndex); + } else { + Ordering computedOrdering = EliminationTraitsType::DefaultOrderingFunc( + asDerived(), variableIndex); + return eliminateMultifrontal(computedOrdering, function, variableIndex); } } } diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 0d5057aa8..c688eb13f 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -54,6 +54,12 @@ namespace gtsam { static std::pair, boost::shared_ptr > DefaultEliminate(const FactorGraphType& factors, const Ordering& keys) { return EliminatePreferCholesky(factors, keys); } + /// The default ordering generation function + static Ordering DefaultOrderingFunc( + const FactorGraphType& graph, + boost::optional variableIndex) { + return Ordering::Colamd(*variableIndex); + } }; /* ************************************************************************* */ diff --git a/gtsam/symbolic/SymbolicFactorGraph.h b/gtsam/symbolic/SymbolicFactorGraph.h index 36379fd83..8bb75cb97 100644 --- a/gtsam/symbolic/SymbolicFactorGraph.h +++ b/gtsam/symbolic/SymbolicFactorGraph.h @@ -46,6 +46,12 @@ namespace gtsam { static std::pair, boost::shared_ptr > DefaultEliminate(const FactorGraphType& factors, const Ordering& keys) { return EliminateSymbolic(factors, keys); } + /// The default ordering generation function + static Ordering DefaultOrderingFunc( + const FactorGraphType& graph, + boost::optional variableIndex) { + return Ordering::Colamd(*variableIndex); + } }; /* ************************************************************************* */