Better error reporting in the modeling API.
More informative error when user passes an
unknown parameter block to Problem methods.
Change-Id: I517360e4b0b55814904ca3e664877d76ad3f59e8
diff --git a/internal/ceres/problem_impl.cc b/internal/ceres/problem_impl.cc
index 21d1144..519e12b 100644
--- a/internal/ceres/problem_impl.cc
+++ b/internal/ceres/problem_impl.cc
@@ -56,6 +56,15 @@
typedef map<double*, internal::ParameterBlock*> ParameterMap;
+internal::ParameterBlock* FindParameterBlockOrDie(
+ const ParameterMap& parameter_map,
+ double* parameter_block) {
+ ParameterMap::const_iterator it = parameter_map.find(parameter_block);
+ CHECK(it != parameter_map.end())
+ << "Parameter block not found: " << parameter_block;
+ return it->second;
+}
+
// Returns true if two regions of memory, a and b, with sizes size_a and size_b
// respectively, overlap.
static bool RegionsAlias(const double* a, int size_a,
@@ -471,7 +480,8 @@
}
void ProblemImpl::RemoveParameterBlock(double* values) {
- ParameterBlock* parameter_block = FindOrDie(parameter_block_map_, values);
+ ParameterBlock* parameter_block =
+ FindParameterBlockOrDie(parameter_block_map_, values);
if (options_.enable_fast_parameter_block_removal) {
// Copy the dependent residuals from the parameter block because the set of
@@ -503,17 +513,17 @@
}
void ProblemImpl::SetParameterBlockConstant(double* values) {
- FindOrDie(parameter_block_map_, values)->SetConstant();
+ FindParameterBlockOrDie(parameter_block_map_, values)->SetConstant();
}
void ProblemImpl::SetParameterBlockVariable(double* values) {
- FindOrDie(parameter_block_map_, values)->SetVarying();
+ FindParameterBlockOrDie(parameter_block_map_, values)->SetVarying();
}
void ProblemImpl::SetParameterization(
double* values,
LocalParameterization* local_parameterization) {
- FindOrDie(parameter_block_map_, values)
+ FindParameterBlockOrDie(parameter_block_map_, values)
->SetParameterization(local_parameterization);
}
@@ -557,7 +567,8 @@
parameter_blocks.resize(parameter_block_ptrs.size());
for (int i = 0; i < parameter_block_ptrs.size(); ++i) {
parameter_blocks[i] =
- FindOrDie(parameter_block_map_, parameter_block_ptrs[i]);
+ FindParameterBlockOrDie(parameter_block_map_,
+ parameter_block_ptrs[i]);
}
// 2. The user may have only supplied a subset of parameter