Add tests for feasibility testing of bounds constrained problems.
Change-Id: Ib86f73cc121c893d4bcfa1c8e393ef2ddddfe348
diff --git a/internal/ceres/solver_impl_test.cc b/internal/ceres/solver_impl_test.cc
index 1a810ed..671edb0 100644
--- a/internal/ceres/solver_impl_test.cc
+++ b/internal/ceres/solver_impl_test.cc
@@ -1095,7 +1095,54 @@
Solver::Summary summary;
Solve(options, &problem, &summary);
EXPECT_EQ(summary.termination_type, FAILURE);
- EXPECT_NE(summary.message.find("has at least one invalid value"), string::npos);
+ EXPECT_NE(summary.message.find("has at least one invalid value"),
+ string::npos)
+ << summary.message;
+}
+
+TEST(SolverImpl, BoundsConstrainedProblemWithLineSearchMinimizerDoesNotWork) {
+ Problem problem;
+ double x[] = {0.0, 0.0};
+ problem.AddResidualBlock(new MockCostFunctionBase<1, 2, 0, 0>(), NULL, x);
+ problem.SetParameterUpperBound(x, 0, 1.0);
+ Solver::Options options;
+ options.minimizer_type = LINE_SEARCH;
+ Solver::Summary summary;
+ Solve(options, &problem, &summary);
+ EXPECT_EQ(summary.termination_type, FAILURE);
+ EXPECT_NE(summary.message.find(
+ "LINE_SEARCH Minimizer does not support bounds"),
+ string::npos)
+ << summary.message;
+}
+
+TEST(SolverImpl, InfeasibleParameterBlock) {
+ Problem problem;
+ double x[] = {0.0, 0.0};
+ problem.AddResidualBlock(new MockCostFunctionBase<1, 2, 0, 0>(), NULL, x);
+ problem.SetParameterLowerBound(x, 0, 2.0);
+ problem.SetParameterUpperBound(x, 0, 1.0);
+ Solver::Options options;
+ Solver::Summary summary;
+ Solve(options, &problem, &summary);
+ EXPECT_EQ(summary.termination_type, FAILURE);
+ EXPECT_NE(summary.message.find("infeasible bound"), string::npos)
+ << summary.message;
+}
+
+TEST(SolverImpl, InfeasibleConstantParameterBlock) {
+ Problem problem;
+ double x[] = {0.0, 0.0};
+ problem.AddResidualBlock(new MockCostFunctionBase<1, 2, 0, 0>(), NULL, x);
+ problem.SetParameterLowerBound(x, 0, 1.0);
+ problem.SetParameterUpperBound(x, 0, 2.0);
+ problem.SetParameterBlockConstant(x);
+ Solver::Options options;
+ Solver::Summary summary;
+ Solve(options, &problem, &summary);
+ EXPECT_EQ(summary.termination_type, FAILURE);
+ EXPECT_NE(summary.message.find("infeasible value"), string::npos)
+ << summary.message;
}
} // namespace internal