|
|
|
@ -36,7 +36,7 @@ namespace gtsam {
|
|
|
|
|
// no Ordering is provided. When removing optional from VariableIndex, create VariableIndex
|
|
|
|
|
// before creating ordering.
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminateSequential(orderingType, function, computedVariableIndex);
|
|
|
|
|
return eliminateSequential(orderingType, function, &computedVariableIndex);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// Compute an ordering and call this function again. We are guaranteed to have a
|
|
|
|
@ -52,7 +52,7 @@ namespace gtsam {
|
|
|
|
|
return eliminateSequential(computedOrdering, function, variableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
Ordering computedOrdering = EliminationTraitsType::DefaultOrderingFunc(
|
|
|
|
|
asDerived(), variableIndex);
|
|
|
|
|
asDerived(), *variableIndex);
|
|
|
|
|
return eliminateSequential(computedOrdering, function, variableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -68,7 +68,7 @@ namespace gtsam {
|
|
|
|
|
if(!variableIndex) {
|
|
|
|
|
// If no VariableIndex provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminateSequential(ordering, function, computedVariableIndex);
|
|
|
|
|
return eliminateSequential(ordering, function, &computedVariableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
gttic(eliminateSequential);
|
|
|
|
|
// Do elimination
|
|
|
|
@ -99,7 +99,7 @@ namespace gtsam {
|
|
|
|
|
// creating ordering.
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminateMultifrontal(orderingType, function,
|
|
|
|
|
computedVariableIndex);
|
|
|
|
|
&computedVariableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
// Compute an ordering and call this function again. We are guaranteed to
|
|
|
|
|
// have a VariableIndex already here because we computed one if needed in
|
|
|
|
@ -115,7 +115,7 @@ namespace gtsam {
|
|
|
|
|
return eliminateMultifrontal(computedOrdering, function, variableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
Ordering computedOrdering = EliminationTraitsType::DefaultOrderingFunc(
|
|
|
|
|
asDerived(), variableIndex);
|
|
|
|
|
asDerived(), *variableIndex);
|
|
|
|
|
return eliminateMultifrontal(computedOrdering, function, variableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -131,7 +131,7 @@ namespace gtsam {
|
|
|
|
|
if(!variableIndex) {
|
|
|
|
|
// If no VariableIndex provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminateMultifrontal(ordering, function, computedVariableIndex);
|
|
|
|
|
return eliminateMultifrontal(ordering, function, &computedVariableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
gttic(eliminateMultifrontal);
|
|
|
|
|
// Do elimination with given ordering
|
|
|
|
@ -162,7 +162,7 @@ namespace gtsam {
|
|
|
|
|
} else {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminatePartialSequential(ordering, function, computedVariableIndex);
|
|
|
|
|
return eliminatePartialSequential(ordering, function, &computedVariableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -183,7 +183,7 @@ namespace gtsam {
|
|
|
|
|
} else {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminatePartialSequential(variables, function, computedVariableIndex);
|
|
|
|
|
return eliminatePartialSequential(variables, function, &computedVariableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -202,7 +202,7 @@ namespace gtsam {
|
|
|
|
|
} else {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminatePartialMultifrontal(ordering, function, computedVariableIndex);
|
|
|
|
|
return eliminatePartialMultifrontal(ordering, function, &computedVariableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -223,7 +223,7 @@ namespace gtsam {
|
|
|
|
|
} else {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return eliminatePartialMultifrontal(variables, function, computedVariableIndex);
|
|
|
|
|
return eliminatePartialMultifrontal(variables, function, &computedVariableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -237,7 +237,7 @@ namespace gtsam {
|
|
|
|
|
if(!variableIndex) {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex index(asDerived());
|
|
|
|
|
return marginalMultifrontalBayesNet(variables, function, index);
|
|
|
|
|
return marginalMultifrontalBayesNet(variables, function, &index);
|
|
|
|
|
} else {
|
|
|
|
|
// No ordering was provided for the marginalized variables, so order them using constrained
|
|
|
|
|
// COLAMD.
|
|
|
|
@ -255,7 +255,7 @@ namespace gtsam {
|
|
|
|
|
Ordering marginalVarsOrdering(totalOrdering.end() - nVars, totalOrdering.end());
|
|
|
|
|
|
|
|
|
|
// Call this function again with the computed orderings
|
|
|
|
|
return marginalMultifrontalBayesNet(marginalVarsOrdering, marginalizationOrdering, function, *variableIndex);
|
|
|
|
|
return marginalMultifrontalBayesNet(marginalVarsOrdering, marginalizationOrdering, function, variableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -270,7 +270,7 @@ namespace gtsam {
|
|
|
|
|
if(!variableIndex) {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex index(asDerived());
|
|
|
|
|
return marginalMultifrontalBayesNet(variables, marginalizedVariableOrdering, function, index);
|
|
|
|
|
return marginalMultifrontalBayesNet(variables, marginalizedVariableOrdering, function, &index);
|
|
|
|
|
} else {
|
|
|
|
|
gttic(marginalMultifrontalBayesNet);
|
|
|
|
|
// An ordering was provided for the marginalized variables, so we can first eliminate them
|
|
|
|
@ -278,7 +278,7 @@ namespace gtsam {
|
|
|
|
|
boost::shared_ptr<BayesTreeType> bayesTree;
|
|
|
|
|
boost::shared_ptr<FactorGraphType> factorGraph;
|
|
|
|
|
boost::tie(bayesTree,factorGraph) =
|
|
|
|
|
eliminatePartialMultifrontal(marginalizedVariableOrdering, function, *variableIndex);
|
|
|
|
|
eliminatePartialMultifrontal(marginalizedVariableOrdering, function, variableIndex);
|
|
|
|
|
|
|
|
|
|
if(const Ordering* varsAsOrdering = boost::get<const Ordering&>(&variables))
|
|
|
|
|
{
|
|
|
|
@ -304,7 +304,7 @@ namespace gtsam {
|
|
|
|
|
if(!variableIndex) {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return marginalMultifrontalBayesTree(variables, function, computedVariableIndex);
|
|
|
|
|
return marginalMultifrontalBayesTree(variables, function, &computedVariableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
// No ordering was provided for the marginalized variables, so order them using constrained
|
|
|
|
|
// COLAMD.
|
|
|
|
@ -322,7 +322,7 @@ namespace gtsam {
|
|
|
|
|
Ordering marginalVarsOrdering(totalOrdering.end() - nVars, totalOrdering.end());
|
|
|
|
|
|
|
|
|
|
// Call this function again with the computed orderings
|
|
|
|
|
return marginalMultifrontalBayesTree(marginalVarsOrdering, marginalizationOrdering, function, *variableIndex);
|
|
|
|
|
return marginalMultifrontalBayesTree(marginalVarsOrdering, marginalizationOrdering, function, variableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -337,7 +337,7 @@ namespace gtsam {
|
|
|
|
|
if(!variableIndex) {
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return marginalMultifrontalBayesTree(variables, marginalizedVariableOrdering, function, computedVariableIndex);
|
|
|
|
|
return marginalMultifrontalBayesTree(variables, marginalizedVariableOrdering, function, &computedVariableIndex);
|
|
|
|
|
} else {
|
|
|
|
|
gttic(marginalMultifrontalBayesTree);
|
|
|
|
|
// An ordering was provided for the marginalized variables, so we can first eliminate them
|
|
|
|
@ -345,7 +345,7 @@ namespace gtsam {
|
|
|
|
|
boost::shared_ptr<BayesTreeType> bayesTree;
|
|
|
|
|
boost::shared_ptr<FactorGraphType> factorGraph;
|
|
|
|
|
boost::tie(bayesTree,factorGraph) =
|
|
|
|
|
eliminatePartialMultifrontal(marginalizedVariableOrdering, function, *variableIndex);
|
|
|
|
|
eliminatePartialMultifrontal(marginalizedVariableOrdering, function, variableIndex);
|
|
|
|
|
|
|
|
|
|
if(const Ordering* varsAsOrdering = boost::get<const Ordering&>(&variables))
|
|
|
|
|
{
|
|
|
|
@ -377,13 +377,13 @@ namespace gtsam {
|
|
|
|
|
Ordering marginalizationOrdering(totalOrdering.begin(), totalOrdering.end() - variables.size());
|
|
|
|
|
|
|
|
|
|
// Eliminate and return the remaining factor graph
|
|
|
|
|
return eliminatePartialMultifrontal(marginalizationOrdering, function, *variableIndex).second;
|
|
|
|
|
return eliminatePartialMultifrontal(marginalizationOrdering, function, variableIndex).second;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// If no variable index is provided, compute one and call this function again
|
|
|
|
|
VariableIndex computedVariableIndex(asDerived());
|
|
|
|
|
return marginal(variables, function, computedVariableIndex);
|
|
|
|
|
return marginal(variables, function, &computedVariableIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|