Generalization of the inner iterations algorithm.
Add automatic recursive independent set decomposition.
Clean up the naming and the API for inner iterations.
Change-Id: I3d7d6babb9756842d7367e14b7279d2df98fb724
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc
index 16a9c1e..b24962a 100644
--- a/examples/bundle_adjuster.cc
+++ b/examples/bundle_adjuster.cc
@@ -74,8 +74,8 @@
DEFINE_bool(inner_iterations, false, "Use inner iterations to non-linearly "
"refine each successful trust region step.");
-DEFINE_string(blocks_for_inner_iterations, "cameras", "Options are: "
- "automatic, cameras, points");
+DEFINE_string(blocks_for_inner_iterations, "automatic", "Options are: "
+ "automatic, cameras, points, cameras,points, points,cameras");
DEFINE_string(linear_solver, "sparse_schur", "Options are: "
"sparse_schur, dense_schur, iterative_schur, sparse_normal_cholesky, "
@@ -145,13 +145,33 @@
if (options->use_inner_iterations) {
if (FLAGS_blocks_for_inner_iterations == "cameras") {
LOG(INFO) << "Camera blocks for inner iterations";
+ options->inner_iteration_ordering = new ParameterBlockOrdering;
for (int i = 0; i < num_cameras; ++i) {
- options->parameter_blocks_for_inner_iterations.push_back(cameras + camera_block_size * i);
+ options->inner_iteration_ordering->AddElementToGroup(cameras + camera_block_size * i, 0);
}
} else if (FLAGS_blocks_for_inner_iterations == "points") {
LOG(INFO) << "Point blocks for inner iterations";
+ options->inner_iteration_ordering = new ParameterBlockOrdering;
for (int i = 0; i < num_points; ++i) {
- options->parameter_blocks_for_inner_iterations.push_back(points + point_block_size * i);
+ options->inner_iteration_ordering->AddElementToGroup(points + point_block_size * i, 0);
+ }
+ } else if (FLAGS_blocks_for_inner_iterations == "cameras,points") {
+ LOG(INFO) << "Camera followed by point blocks for inner iterations";
+ options->inner_iteration_ordering = new ParameterBlockOrdering;
+ for (int i = 0; i < num_cameras; ++i) {
+ options->inner_iteration_ordering->AddElementToGroup(cameras + camera_block_size * i, 0);
+ }
+ for (int i = 0; i < num_points; ++i) {
+ options->inner_iteration_ordering->AddElementToGroup(points + point_block_size * i, 1);
+ }
+ } else if (FLAGS_blocks_for_inner_iterations == "points,cameras") {
+ LOG(INFO) << "Point followed by camera blocks for inner iterations";
+ options->inner_iteration_ordering = new ParameterBlockOrdering;
+ for (int i = 0; i < num_cameras; ++i) {
+ options->inner_iteration_ordering->AddElementToGroup(cameras + camera_block_size * i, 1);
+ }
+ for (int i = 0; i < num_points; ++i) {
+ options->inner_iteration_ordering->AddElementToGroup(points + point_block_size * i, 0);
}
} else if (FLAGS_blocks_for_inner_iterations == "automatic") {
LOG(INFO) << "Choosing automatic blocks for inner iterations";