Added debugging function to IncrementalFixedLagSmoother
parent
f03be70770
commit
9e1a07fcec
|
@ -22,6 +22,8 @@
|
||||||
#include <gtsam_unstable/nonlinear/IncrementalFixedLagSmoother.h>
|
#include <gtsam_unstable/nonlinear/IncrementalFixedLagSmoother.h>
|
||||||
#include <gtsam/base/debug.h>
|
#include <gtsam/base/debug.h>
|
||||||
|
|
||||||
|
#include <gtsam/linear/GaussianSequentialSolver.h>
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
@ -38,6 +40,96 @@ bool IncrementalFixedLagSmoother::equals(const FixedLagSmoother& rhs, double tol
|
||||||
&& isam_.equals(e->isam_, tol);
|
&& isam_.equals(e->isam_, tol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
bool checkMarginalizeLeaves(ISAM2& isam, const FastList<Key>& leafKeys) {
|
||||||
|
|
||||||
|
Matrix expectedAugmentedHessian, expected3AugmentedHessian;
|
||||||
|
|
||||||
|
vector<Index> toKeep;
|
||||||
|
|
||||||
|
const Index lastVar = isam.getOrdering().size() - 1;
|
||||||
|
|
||||||
|
for (Index i = 0; i <= lastVar; ++i)
|
||||||
|
|
||||||
|
if (find(leafKeys.begin(), leafKeys.end(), isam.getOrdering().key(i))
|
||||||
|
== leafKeys.end())
|
||||||
|
|
||||||
|
toKeep.push_back(i);
|
||||||
|
|
||||||
|
// Calculate expected marginal from iSAM2 tree
|
||||||
|
|
||||||
|
GaussianFactorGraph isamAsGraph(isam);
|
||||||
|
|
||||||
|
GaussianSequentialSolver solver(isamAsGraph);
|
||||||
|
|
||||||
|
GaussianFactorGraph marginalgfg = *solver.jointFactorGraph(toKeep);
|
||||||
|
|
||||||
|
expectedAugmentedHessian = marginalgfg.augmentedHessian();
|
||||||
|
|
||||||
|
//// Calculate expected marginal from cached linear factors
|
||||||
|
|
||||||
|
//assert(isam.params().cacheLinearizedFactors);
|
||||||
|
|
||||||
|
//GaussianSequentialSolver solver2(isam.linearFactors_, isam.params().factorization == ISAM2Params::QR);
|
||||||
|
|
||||||
|
//expected2AugmentedHessian = solver2.jointFactorGraph(toKeep)->augmentedHessian();
|
||||||
|
|
||||||
|
// Calculate expected marginal from original nonlinear factors
|
||||||
|
|
||||||
|
GaussianSequentialSolver solver3(
|
||||||
|
|
||||||
|
*isam.getFactorsUnsafe().linearize(isam.getLinearizationPoint(),
|
||||||
|
isam.getOrdering()),
|
||||||
|
|
||||||
|
isam.params().factorization == ISAM2Params::QR);
|
||||||
|
|
||||||
|
expected3AugmentedHessian =
|
||||||
|
solver3.jointFactorGraph(toKeep)->augmentedHessian();
|
||||||
|
|
||||||
|
// Do marginalization
|
||||||
|
|
||||||
|
isam.experimentalMarginalizeLeaves(leafKeys);
|
||||||
|
|
||||||
|
// Check
|
||||||
|
|
||||||
|
GaussianFactorGraph actualMarginalGraph(isam);
|
||||||
|
|
||||||
|
Matrix actualAugmentedHessian = actualMarginalGraph.augmentedHessian();
|
||||||
|
|
||||||
|
//Matrix actual2AugmentedHessian = linearFactors_.augmentedHessian();
|
||||||
|
|
||||||
|
Matrix actual3AugmentedHessian = isam.getFactorsUnsafe().linearize(
|
||||||
|
|
||||||
|
isam.getLinearizationPoint(), isam.getOrdering())->augmentedHessian();
|
||||||
|
|
||||||
|
assert(
|
||||||
|
actualAugmentedHessian.unaryExpr(std::ptr_fun(&std::isfinite<double>)).all());
|
||||||
|
|
||||||
|
// Check full marginalization
|
||||||
|
|
||||||
|
bool treeEqual = assert_equal(expectedAugmentedHessian,
|
||||||
|
actualAugmentedHessian, 1e-6);
|
||||||
|
|
||||||
|
//bool linEqual = assert_equal(expected2AugmentedHessian, actualAugmentedHessian, 1e-6);
|
||||||
|
|
||||||
|
bool nonlinEqual = assert_equal(expected3AugmentedHessian,
|
||||||
|
actualAugmentedHessian, 1e-6);
|
||||||
|
|
||||||
|
//bool linCorrect = assert_equal(expected3AugmentedHessian, expected2AugmentedHessian, 1e-6);
|
||||||
|
|
||||||
|
//actual2AugmentedHessian.bottomRightCorner(1,1) = expected3AugmentedHessian.bottomRightCorner(1,1); bool afterLinCorrect = assert_equal(expected3AugmentedHessian, actual2AugmentedHessian, 1e-6);
|
||||||
|
|
||||||
|
actual3AugmentedHessian.bottomRightCorner(1, 1) =
|
||||||
|
expected3AugmentedHessian.bottomRightCorner(1, 1);
|
||||||
|
bool afterNonlinCorrect = assert_equal(expected3AugmentedHessian,
|
||||||
|
actual3AugmentedHessian, 1e-6);
|
||||||
|
|
||||||
|
bool ok = treeEqual && /*linEqual &&*/nonlinEqual
|
||||||
|
&& /*linCorrect &&*//*afterLinCorrect &&*/afterNonlinCorrect;
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
FixedLagSmoother::Result IncrementalFixedLagSmoother::update(const NonlinearFactorGraph& newFactors, const Values& newTheta, const KeyTimestampMap& timestamps) {
|
FixedLagSmoother::Result IncrementalFixedLagSmoother::update(const NonlinearFactorGraph& newFactors, const Values& newTheta, const KeyTimestampMap& timestamps) {
|
||||||
|
|
||||||
|
@ -94,7 +186,8 @@ FixedLagSmoother::Result IncrementalFixedLagSmoother::update(const NonlinearFact
|
||||||
|
|
||||||
// Marginalize out any needed variables
|
// Marginalize out any needed variables
|
||||||
FastList<Key> leafKeys(marginalizableKeys.begin(), marginalizableKeys.end());
|
FastList<Key> leafKeys(marginalizableKeys.begin(), marginalizableKeys.end());
|
||||||
isam_.experimentalMarginalizeLeaves(leafKeys);
|
// isam_.experimentalMarginalizeLeaves(leafKeys);
|
||||||
|
checkMarginalizeLeaves(isam_, leafKeys);
|
||||||
|
|
||||||
// Remove marginalized keys from the KeyTimestampMap
|
// Remove marginalized keys from the KeyTimestampMap
|
||||||
eraseKeyTimestampMap(marginalizableKeys);
|
eraseKeyTimestampMap(marginalizableKeys);
|
||||||
|
|
Loading…
Reference in New Issue