remove backward compatible functions in NonlinearOptimizer
parent
8bfd392b9f
commit
e726f7c7af
|
@ -69,9 +69,9 @@ int main(int argc, char** argv) {
|
|||
Ordering::shared_ptr ordering = graph->orderingCOLAMD(*initial);
|
||||
|
||||
/* 4.2.2 set up solver and optimize */
|
||||
Optimizer optimizer(graph, initial, ordering);
|
||||
Optimizer::Parameters::verbosityLevel verbosity = pose2SLAM::Optimizer::Parameters::SILENT;
|
||||
Optimizer optimizer_result = optimizer.levenbergMarquardt(1e-15, 1e-15, verbosity);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-15, 1e-15);
|
||||
Optimizer optimizer(graph, initial, ordering, params);
|
||||
Optimizer optimizer_result = optimizer.levenbergMarquardt();
|
||||
|
||||
Values result = *optimizer_result.values();
|
||||
result.print("final result");
|
||||
|
|
|
@ -83,8 +83,7 @@ int main(void) {
|
|||
SPCGOptimizer optimizer(graph, initial, solver->ordering(), solver) ;
|
||||
|
||||
cout << "before optimization, sum of error is " << optimizer.error() << endl;
|
||||
NonlinearOptimizationParameters parameter;
|
||||
SPCGOptimizer optimizer2 = optimizer.levenbergMarquardt(parameter);
|
||||
SPCGOptimizer optimizer2 = optimizer.levenbergMarquardt();
|
||||
cout << "after optimization, sum of error is " << optimizer2.error() << endl;
|
||||
|
||||
result = *optimizer2.values() ;
|
||||
|
|
|
@ -146,8 +146,8 @@ int main(int argc, char* argv[]) {
|
|||
|
||||
// Optimize the graph
|
||||
cout << "*******************************************************" << endl;
|
||||
Optimizer::Parameters::verbosityLevel verborsity = Optimizer::Parameters::DAMPED;
|
||||
Optimizer::shared_values result = Optimizer::optimizeGN(graph, initialEstimates, verborsity);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newVerbosity_(Optimizer::Parameters::DAMPED);
|
||||
Optimizer::shared_values result = Optimizer::optimizeGN(graph, initialEstimates, params);
|
||||
|
||||
// Print final results
|
||||
cout << "*******************************************************" << endl;
|
||||
|
|
|
@ -43,10 +43,10 @@ namespace gtsam {
|
|||
// initial optimization state is the same in both cases tested
|
||||
typedef NonlinearOptimizer<G, T, GaussianFactorGraph, GaussianSequentialSolver> Optimizer;
|
||||
Optimizer optimizer(boost::make_shared<const G>(graph),
|
||||
boost::make_shared<const T>(initialEstimate), ordering);
|
||||
boost::make_shared<const T>(initialEstimate), ordering, boost::make_shared<NonlinearOptimizationParameters>(parameters));
|
||||
|
||||
// Levenberg-Marquardt
|
||||
Optimizer result = optimizer.levenbergMarquardt(parameters);
|
||||
Optimizer result = optimizer.levenbergMarquardt();
|
||||
return *result.values();
|
||||
}
|
||||
|
||||
|
@ -62,10 +62,10 @@ namespace gtsam {
|
|||
// initial optimization state is the same in both cases tested
|
||||
typedef NonlinearOptimizer<G, T, GaussianFactorGraph, GaussianMultifrontalSolver> Optimizer;
|
||||
Optimizer optimizer(boost::make_shared<const G>(graph),
|
||||
boost::make_shared<const T>(initialEstimate), ordering);
|
||||
boost::make_shared<const T>(initialEstimate), ordering, boost::make_shared<NonlinearOptimizationParameters>(parameters));
|
||||
|
||||
// Levenberg-Marquardt
|
||||
Optimizer result = optimizer.levenbergMarquardt(parameters);
|
||||
Optimizer result = optimizer.levenbergMarquardt();
|
||||
return *result.values();
|
||||
}
|
||||
|
||||
|
@ -84,10 +84,11 @@ namespace gtsam {
|
|||
boost::make_shared<const G>(graph),
|
||||
boost::make_shared<const T>(initialEstimate),
|
||||
solver->ordering(),
|
||||
solver);
|
||||
solver,
|
||||
boost::make_shared<NonlinearOptimizationParameters>(parameters));
|
||||
|
||||
// Levenberg-Marquardt
|
||||
SPCGOptimizer result = optimizer.levenbergMarquardt(parameters);
|
||||
SPCGOptimizer result = optimizer.levenbergMarquardt();
|
||||
return *result.values();
|
||||
}
|
||||
|
||||
|
|
|
@ -65,20 +65,20 @@ namespace gtsam {
|
|||
verbosity_(parameters.verbosity_), lambdaMode_(parameters.lambdaMode_){}
|
||||
|
||||
|
||||
sharedThis newVerbosity_(verbosityLevel verbosity) const {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>(*this)) ;
|
||||
static sharedThis newVerbosity_(verbosityLevel verbosity) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()) ;
|
||||
ptr->verbosity_ = verbosity ;
|
||||
return ptr ;
|
||||
}
|
||||
|
||||
sharedThis newLambda_(double lambda) const {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>(*this)) ;
|
||||
static sharedThis newLambda_(double lambda) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()) ;
|
||||
ptr->lambda_ = lambda ;
|
||||
return ptr ;
|
||||
}
|
||||
|
||||
sharedThis newMaxIterations_(int maxIterations) const {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>(*this)) ;
|
||||
static sharedThis newMaxIterations_(int maxIterations) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()) ;
|
||||
ptr->maxIterations_ = maxIterations ;
|
||||
return ptr ;
|
||||
}
|
||||
|
@ -89,11 +89,11 @@ namespace gtsam {
|
|||
return ptr ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static sharedThis newDrecreaseThresholds(double absDecrease, double relDecrease) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>());
|
||||
ptr->absDecrease_ = absDecrease;
|
||||
ptr->relDecrease_ = relDecrease;
|
||||
return ptr ;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -34,34 +34,6 @@ namespace gtsam {
|
|||
/* ************************************************************************* */
|
||||
|
||||
/* ************************************************************************* */
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W>::NonlinearOptimizer(shared_graph graph,
|
||||
shared_values values, shared_ordering ordering, double lambda) :
|
||||
graph_(graph), values_(values), error_(graph->error(*values)), ordering_(ordering),
|
||||
parameters_(Parameters::newLambda(lambda)), dimensions_(new vector<size_t>(values->dims(*ordering))) {
|
||||
if (!graph) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: graph = NULL");
|
||||
if (!values) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: values = NULL");
|
||||
if (!ordering) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: ordering = NULL");
|
||||
}
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W>::NonlinearOptimizer(
|
||||
shared_graph graph, shared_values values, shared_ordering ordering, shared_solver solver, const double lambda):
|
||||
graph_(graph), values_(values), error_(graph->error(*values)), ordering_(ordering), solver_(solver),
|
||||
parameters_(Parameters::newLambda(lambda)), dimensions_(new vector<size_t>(values->dims(*ordering))) {
|
||||
if (!graph) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: graph = NULL");
|
||||
if (!values) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: values = NULL");
|
||||
if (!ordering) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: ordering = NULL");
|
||||
if (!solver) throw std::invalid_argument(
|
||||
"NonlinearOptimizer constructor: solver = NULL");
|
||||
}
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W>::NonlinearOptimizer(shared_graph graph,
|
||||
shared_values values, shared_ordering ordering, shared_parameters parameters) :
|
||||
|
@ -135,12 +107,6 @@ namespace gtsam {
|
|||
return newOptimizer;
|
||||
}
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W> NonlinearOptimizer<G, C, L, S, W>::iterate(
|
||||
Parameters::verbosityLevel verbosity) const {
|
||||
return this->newVerbosity_(verbosity).iterate();
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
|
@ -167,23 +133,6 @@ namespace gtsam {
|
|||
else return next.gaussNewton();
|
||||
}
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W> NonlinearOptimizer<G, C, L, S, W>::gaussNewton(
|
||||
double relativeThreshold,
|
||||
double absoluteThreshold,
|
||||
Parameters::verbosityLevel verbosity,
|
||||
int maxIterations) const {
|
||||
|
||||
Parameters def ;
|
||||
def.relDecrease_ = relativeThreshold ;
|
||||
def.absDecrease_ = absoluteThreshold ;
|
||||
def.verbosity_ = verbosity ;
|
||||
def.maxIterations_ = maxIterations ;
|
||||
|
||||
shared_parameters ptr(boost::make_shared<NonlinearOptimizationParameters>(def)) ;
|
||||
return newParameters_(ptr).gaussNewton() ;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Iteratively try to do tempered Gauss-Newton steps until we succeed.
|
||||
// Form damped system with given lambda, and return a new, more optimistic
|
||||
|
@ -292,21 +241,6 @@ namespace gtsam {
|
|||
return try_lambda(*linear);
|
||||
}
|
||||
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W> NonlinearOptimizer<G, C, L, S, W>::iterateLM(
|
||||
Parameters::verbosityLevel verbosity,
|
||||
double lambdaFactor,
|
||||
Parameters::LambdaMode lambdaMode) const {
|
||||
|
||||
NonlinearOptimizationParameters def(*parameters_) ;
|
||||
def.verbosity_ = verbosity ;
|
||||
def.lambdaFactor_ = lambdaFactor ;
|
||||
def.lambdaMode_ = lambdaMode ;
|
||||
shared_parameters ptr(boost::make_shared<Parameters>(def)) ;
|
||||
return newParameters_(ptr).iterateLM();
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
|
@ -344,36 +278,7 @@ namespace gtsam {
|
|||
}
|
||||
maxIterations--;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W> NonlinearOptimizer<G, C, L, S, W>::levenbergMarquardt(
|
||||
double relativeThreshold,
|
||||
double absoluteThreshold,
|
||||
Parameters::verbosityLevel verbosity,
|
||||
int maxIterations,
|
||||
double lambdaFactor,
|
||||
Parameters::LambdaMode lambdaMode) const {
|
||||
|
||||
NonlinearOptimizationParameters def;
|
||||
def.relDecrease_ = relativeThreshold ;
|
||||
def.absDecrease_ = absoluteThreshold ;
|
||||
def.verbosity_ = verbosity ;
|
||||
def.maxIterations_ = maxIterations ;
|
||||
def.lambdaFactor_ = lambdaFactor ;
|
||||
def.lambdaMode_ = lambdaMode ;
|
||||
shared_parameters ptr = boost::make_shared<Parameters>(def) ;
|
||||
return newParameters_(ptr).levenbergMarquardt() ;
|
||||
}
|
||||
|
||||
template<class G, class C, class L, class S, class W>
|
||||
NonlinearOptimizer<G, C, L, S, W> NonlinearOptimizer<G, C, L, S, W>::
|
||||
levenbergMarquardt(const NonlinearOptimizationParameters ¶meters) const {
|
||||
boost::shared_ptr<NonlinearOptimizationParameters> ptr (new NonlinearOptimizationParameters(parameters)) ;
|
||||
return newParameters_(ptr).levenbergMarquardt() ;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
}
|
||||
|
|
|
@ -159,18 +159,6 @@ namespace gtsam {
|
|||
* Constructor that evaluates new error
|
||||
*/
|
||||
|
||||
// backward compatibility
|
||||
NonlinearOptimizer(shared_graph graph,
|
||||
shared_values values,
|
||||
shared_ordering ordering,
|
||||
const double lambda);
|
||||
// backward compatibility
|
||||
NonlinearOptimizer(shared_graph graph,
|
||||
shared_values values,
|
||||
shared_ordering ordering,
|
||||
shared_solver solver,
|
||||
const double lambda);
|
||||
|
||||
// suggested constructors
|
||||
NonlinearOptimizer(shared_graph graph,
|
||||
shared_values values,
|
||||
|
@ -230,9 +218,6 @@ namespace gtsam {
|
|||
// suggested interface
|
||||
NonlinearOptimizer iterate() const;
|
||||
|
||||
// backward compatible
|
||||
NonlinearOptimizer iterate(Parameters::verbosityLevel verbosity) const;
|
||||
|
||||
/**
|
||||
* Optimize a solution for a non linear factor graph
|
||||
* @param relativeTreshold
|
||||
|
@ -243,11 +228,6 @@ namespace gtsam {
|
|||
// suggested interface
|
||||
NonlinearOptimizer gaussNewton() const;
|
||||
|
||||
// backward compatible
|
||||
NonlinearOptimizer
|
||||
gaussNewton(double relativeThreshold, double absoluteThreshold,
|
||||
Parameters::verbosityLevel verbosity = Parameters::SILENT, int maxIterations = 100) const;
|
||||
|
||||
/**
|
||||
* One iteration of Levenberg Marquardt
|
||||
*/
|
||||
|
@ -255,10 +235,6 @@ namespace gtsam {
|
|||
// suggested interface
|
||||
NonlinearOptimizer iterateLM();
|
||||
|
||||
// backward compatible
|
||||
NonlinearOptimizer iterateLM(Parameters::verbosityLevel verbosity,
|
||||
double lambdaFactor = 10, Parameters::LambdaMode lambdaMode = Parameters::BOUNDED) const;
|
||||
|
||||
/**
|
||||
* Optimize using Levenberg-Marquardt. Really Levenberg's
|
||||
* algorithm at this moment, as we just add I*\lambda to Hessian
|
||||
|
@ -277,19 +253,6 @@ namespace gtsam {
|
|||
// suggested interface
|
||||
NonlinearOptimizer levenbergMarquardt();
|
||||
|
||||
// backward compatible
|
||||
NonlinearOptimizer
|
||||
levenbergMarquardt(double relativeThreshold,
|
||||
double absoluteThreshold,
|
||||
Parameters::verbosityLevel verbosity = Parameters::SILENT,
|
||||
int maxIterations = 100,
|
||||
double lambdaFactor = 10,
|
||||
Parameters::LambdaMode lambdaMode = Parameters::BOUNDED) const;
|
||||
|
||||
// backward compatible
|
||||
NonlinearOptimizer
|
||||
levenbergMarquardt(const NonlinearOptimizationParameters ¶) const;
|
||||
|
||||
/**
|
||||
* Static interface to LM optimization using default ordering and thresholds
|
||||
* @param graph Nonlinear factor graph to optimize
|
||||
|
@ -362,15 +325,6 @@ namespace gtsam {
|
|||
return result.values();
|
||||
}
|
||||
|
||||
// backward compatible
|
||||
static shared_values optimizeGN(shared_graph graph,
|
||||
shared_values values,
|
||||
Parameters::verbosityLevel verbosity) {
|
||||
Parameters def ;
|
||||
shared_parameters parameters = def.newVerbosity_(verbosity);
|
||||
return optimizeGN(graph, values, parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Static interface to GN optimization (no shared_ptr arguments) - see above
|
||||
*/
|
||||
|
@ -381,14 +335,6 @@ namespace gtsam {
|
|||
boost::make_shared<const T>(values),
|
||||
boost::make_shared<Parameters>(parameters));
|
||||
}
|
||||
|
||||
// backward compatible
|
||||
static shared_values optimizeGN(const G& graph, const T& values, Parameters::verbosityLevel verbosity) {
|
||||
return optimizeGN(boost::make_shared<const G>(graph),
|
||||
boost::make_shared<const T>(values),
|
||||
verbosity);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -113,10 +113,10 @@ TEST(Pose2Graph, optimize) {
|
|||
shared_ptr<Ordering> ordering(new Ordering);
|
||||
*ordering += "x0","x1";
|
||||
typedef NonlinearOptimizer<Pose2Graph, Pose2Values> Optimizer;
|
||||
Optimizer optimizer0(fg, initial, ordering);
|
||||
Optimizer::Parameters::verbosityLevel verbosity = Optimizer::Parameters::SILENT;
|
||||
//Optimizer::verbosityLevel verbosity = Optimizer::ERROR;
|
||||
Optimizer optimizer = optimizer0.levenbergMarquardt(1e-15, 1e-15, verbosity);
|
||||
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-15, 1e-15);
|
||||
Optimizer optimizer0(fg, initial, ordering, params);
|
||||
Optimizer optimizer = optimizer0.levenbergMarquardt();
|
||||
|
||||
// Check with expected config
|
||||
Pose2Values expected;
|
||||
|
@ -152,9 +152,9 @@ TEST(Pose2Graph, optimizeThreePoses) {
|
|||
*ordering += "x0","x1","x2";
|
||||
|
||||
// optimize
|
||||
pose2SLAM::Optimizer optimizer0(fg, initial, ordering);
|
||||
pose2SLAM::Optimizer::Parameters::verbosityLevel verbosity = pose2SLAM::Optimizer::Parameters::SILENT;
|
||||
pose2SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt(1e-15, 1e-15, verbosity);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-15, 1e-15);
|
||||
pose2SLAM::Optimizer optimizer0(fg, initial, ordering, params);
|
||||
pose2SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt();
|
||||
|
||||
Pose2Values actual = *optimizer.values();
|
||||
|
||||
|
@ -195,9 +195,9 @@ TEST(Pose2Graph, optimizeCircle) {
|
|||
*ordering += "x0","x1","x2","x3","x4","x5";
|
||||
|
||||
// optimize
|
||||
pose2SLAM::Optimizer optimizer0(fg, initial, ordering);
|
||||
pose2SLAM::Optimizer::Parameters::verbosityLevel verbosity = pose2SLAM::Optimizer::Parameters::SILENT;
|
||||
pose2SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt(1e-15, 1e-15, verbosity);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-15, 1e-15);
|
||||
pose2SLAM::Optimizer optimizer0(fg, initial, ordering, params);
|
||||
pose2SLAM::Optimizer optimizer = optimizer0.levenbergMarquardt();
|
||||
|
||||
Pose2Values actual = *optimizer.values();
|
||||
|
||||
|
|
|
@ -71,10 +71,9 @@ TEST(Pose3Graph, optimizeCircle) {
|
|||
shared_ptr<Ordering> ordering(new Ordering);
|
||||
*ordering += "x0","x1","x2","x3","x4","x5";
|
||||
typedef NonlinearOptimizer<Pose3Graph, Pose3Values> Optimizer;
|
||||
Optimizer optimizer0(fg, initial, ordering);
|
||||
Optimizer::Parameters::verbosityLevel verbosity = Optimizer::Parameters::SILENT;
|
||||
// Optimizer::verbosityLevel verbosity = Optimizer::ERROR;
|
||||
Optimizer optimizer = optimizer0.levenbergMarquardt(1e-15, 1e-15, verbosity);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-15, 1e-15);
|
||||
Optimizer optimizer0(fg, initial, ordering, params);
|
||||
Optimizer optimizer = optimizer0.levenbergMarquardt();
|
||||
|
||||
Pose3Values actual = *optimizer.values();
|
||||
|
||||
|
|
|
@ -71,8 +71,12 @@ TEST( StereoFactor, singlePoint)
|
|||
|
||||
typedef gtsam::NonlinearOptimizer<Graph,Values,gtsam::GaussianFactorGraph,gtsam::GaussianMultifrontalSolver> Optimizer; // optimization engine for this domain
|
||||
|
||||
NonlinearOptimizationParameters parameters(1.0, 1e-3, 0,
|
||||
100, 1.0, 10, NonlinearOptimizationParameters::SILENT, NonlinearOptimizationParameters::BOUNDED);
|
||||
double absoluteThreshold = 1e-9;
|
||||
double relativeThreshold = 1e-5;
|
||||
int maxIterations = 100;
|
||||
NonlinearOptimizationParameters::verbosityLevel verbose = NonlinearOptimizationParameters::SILENT;
|
||||
NonlinearOptimizationParameters parameters(absoluteThreshold, relativeThreshold, 0,
|
||||
maxIterations, 1.0, 10, verbose, NonlinearOptimizationParameters::BOUNDED);
|
||||
|
||||
Optimizer optimizer(graph, values, ordering, make_shared<NonlinearOptimizationParameters>(parameters));
|
||||
|
||||
|
@ -84,7 +88,7 @@ TEST( StereoFactor, singlePoint)
|
|||
DOUBLES_EQUAL(0.0, afterOneIteration.error(), 1e-9);
|
||||
|
||||
// Complete solution
|
||||
Optimizer final = optimizer.gaussNewton(1E-9, 1E-5);
|
||||
Optimizer final = optimizer.gaussNewton();
|
||||
|
||||
DOUBLES_EQUAL(0.0, final.error(), 1e-6);
|
||||
}
|
||||
|
|
|
@ -197,9 +197,9 @@ TEST ( NonlinearEquality, allow_error_optimize ) {
|
|||
// optimize
|
||||
boost::shared_ptr<Ordering> ord(new Ordering());
|
||||
ord->push_back(key1);
|
||||
PoseOptimizer optimizer(graph, init, ord);
|
||||
double relThresh = 1e-5, absThresh = 1e-5;
|
||||
PoseOptimizer result = optimizer.levenbergMarquardt(relThresh, absThresh, PoseOptimizer::Parameters::SILENT);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-5, 1e-5);
|
||||
PoseOptimizer optimizer(graph, init, ord, params);
|
||||
PoseOptimizer result = optimizer.levenbergMarquardt();
|
||||
|
||||
// verify
|
||||
PoseValues expected;
|
||||
|
@ -233,9 +233,9 @@ TEST ( NonlinearEquality, allow_error_optimize_with_factors ) {
|
|||
// optimize
|
||||
boost::shared_ptr<Ordering> ord(new Ordering());
|
||||
ord->push_back(key1);
|
||||
PoseOptimizer optimizer(graph, init, ord);
|
||||
double relThresh = 1e-5, absThresh = 1e-5;
|
||||
PoseOptimizer result = optimizer.levenbergMarquardt(relThresh, absThresh, PoseOptimizer::Parameters::SILENT);
|
||||
NonlinearOptimizationParameters::sharedThis params = NonlinearOptimizationParameters::newDrecreaseThresholds(1e-5, 1e-5);
|
||||
PoseOptimizer optimizer(graph, init, ord, params);
|
||||
PoseOptimizer result = optimizer.levenbergMarquardt();
|
||||
|
||||
// verify
|
||||
PoseValues expected;
|
||||
|
|
|
@ -120,7 +120,7 @@ TEST( NonlinearOptimizer, iterateLM )
|
|||
ord->push_back("x1");
|
||||
|
||||
// create initial optimization state, with lambda=0
|
||||
Optimizer optimizer(fg, config, ord, 0.);
|
||||
Optimizer optimizer(fg, config, ord, NonlinearOptimizationParameters::newLambda(0.));
|
||||
|
||||
// normal iterate
|
||||
Optimizer iterated1 = optimizer.iterate();
|
||||
|
@ -161,20 +161,19 @@ TEST( NonlinearOptimizer, optimize )
|
|||
// optimize parameters
|
||||
shared_ptr<Ordering> ord(new Ordering());
|
||||
ord->push_back("x1");
|
||||
double relativeThreshold = 1e-5;
|
||||
double absoluteThreshold = 1e-5;
|
||||
|
||||
// initial optimization state is the same in both cases tested
|
||||
Optimizer optimizer(fg, c0, ord);
|
||||
boost::shared_ptr<NonlinearOptimizationParameters> params = boost::make_shared<NonlinearOptimizationParameters>();
|
||||
params->relDecrease_ = 1e-5;
|
||||
params->absDecrease_ = 1e-5;
|
||||
Optimizer optimizer(fg, c0, ord, params);
|
||||
|
||||
// Gauss-Newton
|
||||
Optimizer actual1 = optimizer.gaussNewton(relativeThreshold,
|
||||
absoluteThreshold);
|
||||
Optimizer actual1 = optimizer.gaussNewton();
|
||||
DOUBLES_EQUAL(0,fg->error(*(actual1.values())),tol);
|
||||
|
||||
// Levenberg-Marquardt
|
||||
Optimizer actual2 = optimizer.levenbergMarquardt(relativeThreshold,
|
||||
absoluteThreshold, Optimizer::Parameters::SILENT);
|
||||
Optimizer actual2 = optimizer.levenbergMarquardt();
|
||||
DOUBLES_EQUAL(0,fg->error(*(actual2.values())),tol);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue