Initial design

release/4.3a0
Frank dellaert 2020-11-25 11:02:01 -05:00
parent c957478da1
commit 7e29944f95
1 changed files with 115 additions and 0 deletions

115
tests/testGncOptimizer.cpp Normal file
View File

@ -0,0 +1,115 @@
/* ----------------------------------------------------------------------------
* 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 testGncOptimizer.cpp
* @brief Unit tests for GncOptimizer class
* @author Jignnan Shi
* @author Luca Carlone
* @author Frank Dellaert
*/
#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
#include <tests/smallExample.h>
/* ************************************************************************* */
template <class BaseOptimizerParameters>
class GncParams {
using BaseOptimizer = BaseOptimizerParameters::OptimizerType;
GncParams(const BaseOptimizerParameters& baseOptimizerParams)
: baseOptimizerParams(baseOptimizerParams) {}
BaseOptimizerParameters baseOptimizerParams;
/// any other specific GNC parameters:
};
/* ************************************************************************* */
template <class GncParameters>
class GncOptimizer {
public:
// types etc
private:
FG INITIAL GncParameters params_;
public:
GncOptimizer(FG, INITIAL, const GncParameters& params) : params(params) {
// Check that all noise models are Gaussian
}
Values optimize() const {
NonlinearFactorGraph currentGraph = graph_;
for (i : {1, 2, 3}) {
BaseOptimizer::Optimizer baseOptimizer(currentGraph, initial);
VALUES currentSolution = baseOptimizer.optimize();
if (converged) {
return currentSolution;
}
graph_i = this->makeGraph(currentSolution);
}
}
NonlinearFactorGraph makeGraph(const Values& currentSolution) const {
// calculate some weights
this->calculateWeights();
// copy the graph with new weights
}
};
/* ************************************************************************* */
TEST(GncOptimizer, calculateWeights) {
}
/* ************************************************************************* */
TEST(GncOptimizer, copyGraph) {
}
/* ************************************************************************* */
TEST(GncOptimizer, makeGraph) {
// has to have Gaussian noise models !
auto fg = example::createReallyNonlinearFactorGraph();
Point2 p0(3, 3);
Values initial;
initial.insert(X(1), p0);
LevenbergMarquardtParams lmParams;
GncParams gncParams(lmParams);
auto gnc = GncOptimizer(fg, initial, gncParams);
NonlinearFactorGraph actual = gnc.makeGraph(initial);
}
/* ************************************************************************* */
TEST(GncOptimizer, optimize) {
// has to have Gaussian noise models !
auto fg = example::createReallyNonlinearFactorGraph();
Point2 p0(3, 3);
Values initial;
initial.insert(X(1), p0);
LevenbergMarquardtParams lmParams;
GncParams gncParams(lmParams);
auto gnc = GncOptimizer(fg, initial, gncParams);
Values actual = gnc.optimize();
DOUBLES_EQUAL(0, fg.error(actual2), tol);
}
/* ************************************************************************* */
int main() {
TestResult tr;
return TestRegistry::runAllTests(tr);
}
/* ************************************************************************* */