2012-07-25 05:06:33 +08:00
/**
* @ file GradientDescentOptimizer . cpp
* @ brief
* @ author ydjian
* @ date Jun 11 , 2012
*/
# include <gtsam/nonlinear/NonlinearConjugateGradientOptimizer.h>
# include <gtsam/nonlinear/Values.h>
2013-08-06 06:31:22 +08:00
# include <gtsam/linear/GaussianFactorGraph.h>
# include <gtsam/linear/VectorValues.h>
2012-07-25 05:06:33 +08:00
# include <cmath>
using namespace std ;
namespace gtsam {
/* Return the gradient vector of a nonlinear factor given a linearization point and a variable ordering
* Can be moved to NonlinearFactorGraph . h if desired */
2013-08-06 06:31:22 +08:00
VectorValues gradientInPlace ( const NonlinearFactorGraph & nfg , const Values & values ) {
2012-07-25 05:06:33 +08:00
// Linearize graph
2013-08-06 06:31:22 +08:00
GaussianFactorGraph : : shared_ptr linear = nfg . linearize ( values ) ;
return linear - > gradientAtZero ( ) ;
2012-07-25 05:06:33 +08:00
}
double NonlinearConjugateGradientOptimizer : : System : : error ( const State & state ) const {
return graph_ . error ( state ) ;
}
NonlinearConjugateGradientOptimizer : : System : : Gradient NonlinearConjugateGradientOptimizer : : System : : gradient ( const State & state ) const {
2013-08-06 06:31:22 +08:00
return gradientInPlace ( graph_ , state ) ;
2012-07-25 05:06:33 +08:00
}
NonlinearConjugateGradientOptimizer : : System : : State NonlinearConjugateGradientOptimizer : : System : : advance ( const State & current , const double alpha , const Gradient & g ) const {
Gradient step = g ;
2013-08-06 06:31:22 +08:00
step * = alpha ;
return current . retract ( step ) ;
2012-07-25 05:06:33 +08:00
}
void NonlinearConjugateGradientOptimizer : : iterate ( ) {
2013-11-19 22:04:52 +08:00
int dummy ;
2013-08-06 06:31:22 +08:00
boost : : tie ( state_ . values , dummy ) = nonlinearConjugateGradient < System , Values > ( System ( graph_ ) , state_ . values , params_ , true /* single iterations */ ) ;
2012-07-25 05:06:33 +08:00
+ + state_ . iterations ;
state_ . error = graph_ . error ( state_ . values ) ;
}
const Values & NonlinearConjugateGradientOptimizer : : optimize ( ) {
2013-08-06 06:31:22 +08:00
boost : : tie ( state_ . values , state_ . iterations ) = nonlinearConjugateGradient < System , Values > ( System ( graph_ ) , state_ . values , params_ , false /* up to convergent */ ) ;
2012-07-25 05:06:33 +08:00
state_ . error = graph_ . error ( state_ . values ) ;
return state_ . values ;
}
} /* namespace gtsam */
2013-08-02 05:57:43 +08:00