gtsam/gtsam/nonlinear/GaussNewtonOptimizer.cpp

63 lines
2.0 KiB
C++
Raw Normal View History

/* ----------------------------------------------------------------------------
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
* Atlanta, Georgia 30332-0415
* All Rights Reserved
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
* See LICENSE for the license information
* -------------------------------------------------------------------------- */
/**
* @file GaussNewtonOptimizer.cpp
* @brief
* @author Richard Roberts
* @created Feb 26, 2012
*/
#include <gtsam/nonlinear/GaussNewtonOptimizer.h>
#include <gtsam/linear/GaussianMultifrontalSolver.h>
#include <gtsam/linear/GaussianSequentialSolver.h>
using namespace std;
namespace gtsam {
/* ************************************************************************* */
2012-05-15 03:10:02 +08:00
void GaussNewtonOptimizer::iterate() {
2012-05-15 00:51:33 +08:00
const NonlinearOptimizerState& current = state_;
// Linearize graph
2012-05-15 00:51:33 +08:00
GaussianFactorGraph::shared_ptr linear = graph_.linearize(current.values, *params_.ordering);
// Check whether to use QR
bool useQR;
2012-05-15 00:51:33 +08:00
if(params_.factorization == GaussNewtonParams::LDL)
useQR = false;
2012-05-15 00:51:33 +08:00
else if(params_.factorization == GaussNewtonParams::QR)
useQR = true;
else
throw runtime_error("Optimization parameter is invalid: GaussNewtonParams::factorization");
// Optimize
VectorValues::shared_ptr delta;
2012-05-15 00:51:33 +08:00
if(params_.elimination == GaussNewtonParams::MULTIFRONTAL)
delta = GaussianMultifrontalSolver(*linear, useQR).optimize();
2012-05-15 00:51:33 +08:00
else if(params_.elimination == GaussNewtonParams::SEQUENTIAL)
delta = GaussianSequentialSolver(*linear, useQR).optimize();
else
throw runtime_error("Optimization parameter is invalid: GaussNewtonParams::elimination");
// Maybe show output
2012-05-15 00:51:33 +08:00
if(params_.verbosity >= NonlinearOptimizerParams::DELTA) delta->print("delta");
// Create new state with new values and new error
2012-05-15 00:51:33 +08:00
state_.values = current.values.retract(*delta, *params_.ordering);
state_.error = graph_.error(state_.values);
++ state_.iterations;
}
} /* namespace gtsam */