Add Problem::GetParameterization.
This allows the user to query the local parameterization associated
with a parameter block.
Change-Id: I3ab274aa88221c8e2def7c463825bf3927b1fdc9
diff --git a/include/ceres/problem.h b/include/ceres/problem.h
index cd433f9..77ff970 100644
--- a/include/ceres/problem.h
+++ b/include/ceres/problem.h
@@ -312,6 +312,11 @@
void SetParameterization(double* values,
LocalParameterization* local_parameterization);
+ // Get the local parameterization object associated with this
+ // parameter block. If there is no parameterization object
+ // associated then NULL is returned.
+ const LocalParameterization* GetParameterization(double* values) const;
+
// Number of parameter blocks in the problem. Always equals
// parameter_blocks().size() and parameter_block_sizes().size().
int NumParameterBlocks() const;
diff --git a/internal/ceres/problem.cc b/internal/ceres/problem.cc
index 89821b9..bc6d26a 100644
--- a/internal/ceres/problem.cc
+++ b/internal/ceres/problem.cc
@@ -178,6 +178,11 @@
problem_impl_->SetParameterization(values, local_parameterization);
}
+const LocalParameterization* Problem::GetParameterization(
+ double* values) const {
+ return problem_impl_->GetParameterization(values);
+}
+
bool Problem::Evaluate(const EvaluateOptions& evaluate_options,
double* cost,
vector<double>* residuals,
diff --git a/internal/ceres/problem_impl.cc b/internal/ceres/problem_impl.cc
index 37cd351..9882677 100644
--- a/internal/ceres/problem_impl.cc
+++ b/internal/ceres/problem_impl.cc
@@ -535,6 +535,12 @@
->SetParameterization(local_parameterization);
}
+const LocalParameterization* ProblemImpl::GetParameterization(
+ double* values) const {
+ return FindParameterBlockOrDie(parameter_block_map_, values)
+ ->local_parameterization();
+}
+
bool ProblemImpl::Evaluate(const Problem::EvaluateOptions& evaluate_options,
double* cost,
vector<double>* residuals,
diff --git a/internal/ceres/problem_impl.h b/internal/ceres/problem_impl.h
index 35c16cd..da50578 100644
--- a/internal/ceres/problem_impl.h
+++ b/internal/ceres/problem_impl.h
@@ -127,6 +127,7 @@
void SetParameterBlockVariable(double* values);
void SetParameterization(double* values,
LocalParameterization* local_parameterization);
+ const LocalParameterization* GetParameterization(double* values) const;
bool Evaluate(const Problem::EvaluateOptions& options,
double* cost,
diff --git a/internal/ceres/problem_test.cc b/internal/ceres/problem_test.cc
index 858600d..6ad56a5 100644
--- a/internal/ceres/problem_test.cc
+++ b/internal/ceres/problem_test.cc
@@ -502,6 +502,20 @@
problem.RemoveParameterBlock(y), "Parameter block not found:");
}
+TEST(Problem, GetParameterization) {
+ double x[3];
+ double y[2];
+
+ Problem problem;
+ problem.AddParameterBlock(x, 3);
+ problem.AddParameterBlock(y, 2);
+
+ LocalParameterization* parameterization = new IdentityParameterization(3);
+ problem.SetParameterization(x, parameterization);
+ EXPECT_EQ(problem.GetParameterization(x), parameterization);
+ EXPECT_TRUE(problem.GetParameterization(y) == NULL);
+}
+
TEST(Problem, ParameterBlockQueryTest) {
double x[3];
double y[4];