yay! only the final monster to go!
parent
556fa83e9f
commit
9e3263f2b1
|
@ -147,7 +147,7 @@ public:
|
|||
weights = calculateWeights(result, mu);
|
||||
|
||||
// variable/values update
|
||||
NonlinearFactorGraph graph_iter = this->makeGraph(weights);
|
||||
NonlinearFactorGraph graph_iter = this->makeWeightedGraph(weights);
|
||||
GaussNewtonOptimizer baseOptimizer_iter(graph_iter, state_);
|
||||
Values result = baseOptimizer.optimize();
|
||||
|
||||
|
@ -202,8 +202,25 @@ public:
|
|||
}
|
||||
|
||||
/// create a graph where each factor is weighted by the gnc weights
|
||||
NonlinearFactorGraph makeGraph(const Vector& weights) const {
|
||||
return NonlinearFactorGraph(nfg_);
|
||||
NonlinearFactorGraph makeWeightedGraph(const Vector& weights) const {
|
||||
// make sure all noiseModels are Gaussian or convert to Gaussian
|
||||
NonlinearFactorGraph newGraph;
|
||||
newGraph.resize(nfg_.size());
|
||||
for (size_t i = 0; i < nfg_.size(); i++) {
|
||||
if(nfg_[i]){
|
||||
NoiseModelFactor::shared_ptr factor = boost::dynamic_pointer_cast<NoiseModelFactor>(nfg_[i]);
|
||||
noiseModel::Gaussian::shared_ptr noiseModel = boost::dynamic_pointer_cast<noiseModel::Gaussian>(factor->noiseModel());
|
||||
if(noiseModel){
|
||||
Matrix newInfo = weights[i] * noiseModel->information();
|
||||
SharedNoiseModel newNoiseModel = noiseModel::Gaussian::Information(newInfo);
|
||||
newGraph[i] = factor->cloneWithNewNoiseModel(newNoiseModel);
|
||||
}else{
|
||||
throw std::runtime_error(
|
||||
"GncOptimizer::makeWeightedGraph: unexpected non-Gaussian noise model.");
|
||||
}
|
||||
}
|
||||
}
|
||||
return newGraph;
|
||||
}
|
||||
|
||||
/// calculate gnc weights
|
||||
|
@ -384,22 +401,31 @@ TEST(GncOptimizer, calculateWeights) {
|
|||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST(GncOptimizer, makeGraph) {
|
||||
// // simple graph with Gaussian noise model
|
||||
// auto fg = example::createReallyNonlinearFactorGraph();
|
||||
// // same graph with robust noise model
|
||||
// auto fg_robust = example::sharedRobustFactorGraphWithOutliers();
|
||||
//
|
||||
// Point2 p0(3, 3);
|
||||
// Values initial;
|
||||
// initial.insert(X(1), p0);
|
||||
//
|
||||
// LevenbergMarquardtParams lmParams;
|
||||
// GncParams<LevenbergMarquardtParams> gncParams(lmParams);
|
||||
// auto gnc = GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg_robust, initial, gncParams);
|
||||
//
|
||||
// // make sure that when parsing the graph is transformed into one without robust loss
|
||||
// CHECK( fg.equals(gnc.getFactors()) );
|
||||
TEST(GncOptimizer, makeWeightedGraph) {
|
||||
// create original factor
|
||||
double sigma1 = 0.1;
|
||||
NonlinearFactorGraph nfg = example::nonlinearFactorGraphWithGivenSigma(sigma1);
|
||||
|
||||
// create expected
|
||||
double sigma2 = 10;
|
||||
NonlinearFactorGraph expected = example::nonlinearFactorGraphWithGivenSigma(sigma2);
|
||||
|
||||
// create weights
|
||||
Vector weights = Vector::Ones(1); // original info:1/0.1^2 = 100. New info: 1/10^2 = 0.01. Ratio is 10-4
|
||||
weights[0] = 1e-4;
|
||||
|
||||
// create actual
|
||||
Point2 p0(3, 3);
|
||||
Values initial;
|
||||
initial.insert(X(1), p0);
|
||||
|
||||
LevenbergMarquardtParams lmParams;
|
||||
GncParams<LevenbergMarquardtParams> gncParams(lmParams);
|
||||
auto gnc = GncOptimizer<GncParams<LevenbergMarquardtParams>>(nfg, initial, gncParams);
|
||||
NonlinearFactorGraph actual = gnc.makeWeightedGraph(weights);
|
||||
|
||||
// check it's all good
|
||||
CHECK(assert_equal(expected, actual));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
Loading…
Reference in New Issue