properly deprecate eliminate functions

release/4.3a0
Varun Agrawal 2021-11-09 18:25:42 -05:00
parent 1bcb44784a
commit 5051f19f30
5 changed files with 40 additions and 30 deletions

View File

@ -78,29 +78,31 @@ namespace gtsam {
} }
/* ************************************************************************* */ /* ************************************************************************* */
template<class FACTORGRAPH> template <class FACTORGRAPH>
boost::shared_ptr<typename EliminateableFactorGraph<FACTORGRAPH>::BayesTreeType> boost::shared_ptr<
EliminateableFactorGraph<FACTORGRAPH>::eliminateMultifrontal( typename EliminateableFactorGraph<FACTORGRAPH>::BayesTreeType>
OptionalOrderingType orderingType, const Eliminate& function, EliminateableFactorGraph<FACTORGRAPH>::eliminateMultifrontal(
OptionalVariableIndex variableIndex) const OptionalOrderingType orderingType, const Eliminate& function,
{ OptionalVariableIndex variableIndex) const {
if(!variableIndex) { if (!variableIndex) {
// If no VariableIndex provided, compute one and call this function again IMPORTANT: we check // If no VariableIndex provided, compute one and call this function again
// for no variable index first so that it's always computed if we need to call COLAMD because // IMPORTANT: we check for no variable index first so that it's always
// no Ordering is provided. When removing optional from VariableIndex, create VariableIndex // computed if we need to call COLAMD because no Ordering is provided.
// before creating ordering. // When removing optional from VariableIndex, create VariableIndex before
// creating ordering.
VariableIndex computedVariableIndex(asDerived()); VariableIndex computedVariableIndex(asDerived());
return eliminateMultifrontal(function, computedVariableIndex, orderingType); return eliminateMultifrontal(orderingType, function,
} computedVariableIndex);
else { } else {
// Compute an ordering and call this function again. We are guaranteed to have a // Compute an ordering and call this function again. We are guaranteed to
// VariableIndex already here because we computed one if needed in the previous 'if' block. // have a VariableIndex already here because we computed one if needed in
// the previous 'if' block.
if (orderingType == Ordering::METIS) { if (orderingType == Ordering::METIS) {
Ordering computedOrdering = Ordering::Metis(asDerived()); Ordering computedOrdering = Ordering::Metis(asDerived());
return eliminateMultifrontal(computedOrdering, function, variableIndex, orderingType); return eliminateMultifrontal(computedOrdering, function, variableIndex);
} else { } else {
Ordering computedOrdering = Ordering::Colamd(*variableIndex); Ordering computedOrdering = Ordering::Colamd(*variableIndex);
return eliminateMultifrontal(computedOrdering, function, variableIndex, orderingType); return eliminateMultifrontal(computedOrdering, function, variableIndex);
} }
} }
} }
@ -273,7 +275,7 @@ namespace gtsam {
else else
{ {
// No ordering was provided for the unmarginalized variables, so order them with COLAMD. // No ordering was provided for the unmarginalized variables, so order them with COLAMD.
return factorGraph->eliminateSequential(function); return factorGraph->eliminateSequential(Ordering::COLAMD, function);
} }
} }
} }
@ -340,7 +342,7 @@ namespace gtsam {
else else
{ {
// No ordering was provided for the unmarginalized variables, so order them with COLAMD. // No ordering was provided for the unmarginalized variables, so order them with COLAMD.
return factorGraph->eliminateMultifrontal(function); return factorGraph->eliminateMultifrontal(Ordering::COLAMD, function);
} }
} }
} }

View File

@ -288,6 +288,7 @@ namespace gtsam {
FactorGraphType& asDerived() { return static_cast<FactorGraphType&>(*this); } FactorGraphType& asDerived() { return static_cast<FactorGraphType&>(*this); }
public: public:
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V41
/** \deprecated ordering and orderingType shouldn't both be specified */ /** \deprecated ordering and orderingType shouldn't both be specified */
boost::shared_ptr<BayesNetType> eliminateSequential( boost::shared_ptr<BayesNetType> eliminateSequential(
const Ordering& ordering, const Ordering& ordering,
@ -339,6 +340,7 @@ namespace gtsam {
OptionalVariableIndex variableIndex = boost::none) const { OptionalVariableIndex variableIndex = boost::none) const {
return marginalMultifrontalBayesTree(variables, function, variableIndex); return marginalMultifrontalBayesTree(variables, function, variableIndex);
} }
#endif
}; };
} }

View File

@ -290,10 +290,11 @@ namespace gtsam {
return blocks; return blocks;
} }
/* ************************************************************************* */ /* ************************************************************************ */
VectorValues GaussianFactorGraph::optimize(const Eliminate& function) const { VectorValues GaussianFactorGraph::optimize(const Eliminate& function) const {
gttic(GaussianFactorGraph_optimize); gttic(GaussianFactorGraph_optimize);
return BaseEliminateable::eliminateMultifrontal(function)->optimize(); return BaseEliminateable::eliminateMultifrontal(Ordering::COLAMD, function)
->optimize();
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -80,11 +80,14 @@ Marginals::Marginals(const GaussianFactorGraph& graph, const VectorValues& solut
/* ************************************************************************* */ /* ************************************************************************* */
void Marginals::computeBayesTree() { void Marginals::computeBayesTree() {
// The default ordering to use.
const Ordering ordering = Ordering::COLAMND;
// Compute BayesTree // Compute BayesTree
if(factorization_ == CHOLESKY) if (factorization_ == CHOLESKY)
bayesTree_ = *graph_.eliminateMultifrontal(EliminatePreferCholesky); bayesTree_ =
else if(factorization_ == QR) *graph_.eliminateMultifrontal(ordering, EliminatePreferCholesky);
bayesTree_ = *graph_.eliminateMultifrontal(EliminateQR); else if (factorization_ == QR)
bayesTree_ = *graph_.eliminateMultifrontal(ordering, EliminateQR);
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -147,11 +147,13 @@ VectorValues NonlinearOptimizer::solve(const GaussianFactorGraph& gfg,
} else if (params.isSequential()) { } else if (params.isSequential()) {
// Sequential QR or Cholesky (decided by params.getEliminationFunction()) // Sequential QR or Cholesky (decided by params.getEliminationFunction())
if (params.ordering) if (params.ordering)
delta = gfg.eliminateSequential(*params.ordering, params.getEliminationFunction(), delta = gfg.eliminateSequential(*params.ordering,
boost::none, params.orderingType)->optimize(); params.getEliminationFunction())
->optimize();
else else
delta = gfg.eliminateSequential(params.getEliminationFunction(), boost::none, delta = gfg.eliminateSequential(params.orderingType,
params.orderingType)->optimize(); params.getEliminationFunction())
->optimize();
} else if (params.isIterative()) { } else if (params.isIterative()) {
// Conjugate Gradient -> needs params.iterativeParams // Conjugate Gradient -> needs params.iterativeParams
if (!params.iterativeParams) if (!params.iterativeParams)