| 179 | } |
| 180 | |
| 181 | void SetOrdering(BALProblem* bal_problem, Solver::Options* options) { |
| 182 | const int num_points = bal_problem->num_points(); |
| 183 | const int point_block_size = bal_problem->point_block_size(); |
| 184 | double* points = bal_problem->mutable_points(); |
| 185 | |
| 186 | const int num_cameras = bal_problem->num_cameras(); |
| 187 | const int camera_block_size = bal_problem->camera_block_size(); |
| 188 | double* cameras = bal_problem->mutable_cameras(); |
| 189 | |
| 190 | if (options->use_inner_iterations) { |
| 191 | if (CERES_GET_FLAG(FLAGS_blocks_for_inner_iterations) == "cameras") { |
| 192 | LOG(INFO) << "Camera blocks for inner iterations"; |
| 193 | options->inner_iteration_ordering = |
| 194 | std::make_shared<ParameterBlockOrdering>(); |
| 195 | for (int i = 0; i < num_cameras; ++i) { |
| 196 | options->inner_iteration_ordering->AddElementToGroup( |
| 197 | cameras + camera_block_size * i, 0); |
| 198 | } |
| 199 | } else if (CERES_GET_FLAG(FLAGS_blocks_for_inner_iterations) == "points") { |
| 200 | LOG(INFO) << "Point blocks for inner iterations"; |
| 201 | options->inner_iteration_ordering = |
| 202 | std::make_shared<ParameterBlockOrdering>(); |
| 203 | for (int i = 0; i < num_points; ++i) { |
| 204 | options->inner_iteration_ordering->AddElementToGroup( |
| 205 | points + point_block_size * i, 0); |
| 206 | } |
| 207 | } else if (CERES_GET_FLAG(FLAGS_blocks_for_inner_iterations) == |
| 208 | "cameras,points") { |
| 209 | LOG(INFO) << "Camera followed by point blocks for inner iterations"; |
| 210 | options->inner_iteration_ordering = |
| 211 | std::make_shared<ParameterBlockOrdering>(); |
| 212 | for (int i = 0; i < num_cameras; ++i) { |
| 213 | options->inner_iteration_ordering->AddElementToGroup( |
| 214 | cameras + camera_block_size * i, 0); |
| 215 | } |
| 216 | for (int i = 0; i < num_points; ++i) { |
| 217 | options->inner_iteration_ordering->AddElementToGroup( |
| 218 | points + point_block_size * i, 1); |
| 219 | } |
| 220 | } else if (CERES_GET_FLAG(FLAGS_blocks_for_inner_iterations) == |
| 221 | "points,cameras") { |
| 222 | LOG(INFO) << "Point followed by camera blocks for inner iterations"; |
| 223 | options->inner_iteration_ordering = |
| 224 | std::make_shared<ParameterBlockOrdering>(); |
| 225 | for (int i = 0; i < num_cameras; ++i) { |
| 226 | options->inner_iteration_ordering->AddElementToGroup( |
| 227 | cameras + camera_block_size * i, 1); |
| 228 | } |
| 229 | for (int i = 0; i < num_points; ++i) { |
| 230 | options->inner_iteration_ordering->AddElementToGroup( |
| 231 | points + point_block_size * i, 0); |
| 232 | } |
| 233 | } else if (CERES_GET_FLAG(FLAGS_blocks_for_inner_iterations) == |
| 234 | "automatic") { |
| 235 | LOG(INFO) << "Choosing automatic blocks for inner iterations"; |
| 236 | } else { |
| 237 | LOG(FATAL) << "Unknown block type for inner iterations: " |
| 238 | << CERES_GET_FLAG(FLAGS_blocks_for_inner_iterations); |
no test coverage detected