Fix to Roszman1's certified solution.
Extend nist.cc to test more nonlinear and linear solvers.
(Thanks to Markus Moll for finding the Roszman1 bug)
Change-Id: I92b4bab0771de85f7fe711fb0853f155991f4aaf
diff --git a/data/nist/Roszman1.dat b/data/nist/Roszman1.dat
index 0296837..1d67674 100644
--- a/data/nist/Roszman1.dat
+++ b/data/nist/Roszman1.dat
@@ -14,7 +14,7 @@
predictor variable is the excited energy state.
The argument to the ARCTAN function is in radians.
-Reference: Roszman, L., NIST (19??).
+Reference: Roszman, L., NIST (19??).
Quantum Defects for Sulfur I Atom.
@@ -38,7 +38,7 @@
Starting Values Certified Values
Start 1 Start 2 Parameter Standard Deviation
- b1 = 0.1 0.2 2.0196866396E-01 1.9172666023E-02
+ b1 = 0.1 0.2 1.20196866396E-0 1.9172666023E-02
b2 = -0.00001 -0.000005 -6.1953516256E-06 3.2058931691E-06
b3 = 1000 1200 1.2044556708E+03 7.4050983057E+01
b4 = -100 -150 -1.8134269537E+02 4.9573513849E+01
diff --git a/examples/nist.cc b/examples/nist.cc
index fb85beb..2c1a4c5 100644
--- a/examples/nist.cc
+++ b/examples/nist.cc
@@ -363,24 +363,29 @@
double certified_cost = summaries[nist_problem.num_starts()].initial_cost;
int num_success = 0;
+ const int kMinNumMatchingDigits = 4;
for (int start = 0; start < nist_problem.num_starts(); ++start) {
const ceres::Solver::Summary& summary = summaries[start];
- const int num_matching_digits =
- -std::log10(1e-18 +
- fabs(summary.final_cost - certified_cost)
- / certified_cost);
- std::cerr << "start " << start + 1 << " " ;
- if (num_matching_digits > 4) {
- ++num_success;
- std::cerr << "SUCCESS";
+
+ int num_matching_digits = 0;
+ if (summary.final_cost < certified_cost) {
+ num_matching_digits = kMinNumMatchingDigits + 1;
} else {
- std::cerr << "FAILURE";
+ num_matching_digits =
+ -std::log10(fabs(summary.final_cost - certified_cost) / certified_cost);
}
- std::cerr << " digits: " << num_matching_digits;
- std::cerr << " summary: "
- << summary.BriefReport()
- << std::endl;
+
+ if (num_matching_digits <= kMinNumMatchingDigits) {
+ std::cerr << "start " << start + 1 << " " ;
+ std::cerr << "FAILURE";
+ std::cerr << " summary: "
+ << summary.BriefReport()
+ << std::endl;
+ } else {
+ ++num_success;
+ }
}
+
return num_success;
}
@@ -436,12 +441,45 @@
// TODO(sameeragarwal): Test more combinations of non-linear and
// linear solvers.
ceres::Solver::Options options;
- options.linear_solver_type = ceres::DENSE_QR;
- options.max_num_iterations = 2000;
+ options.max_num_iterations = 10000;
options.function_tolerance *= 1e-10;
options.gradient_tolerance *= 1e-10;
options.parameter_tolerance *= 1e-10;
+ options.linear_solver_type = ceres::DENSE_QR;
+ options.trust_region_strategy_type = ceres::LEVENBERG_MARQUARDT;
+ std::cerr << "Levenberg-Marquardt - DENSE_QR\n";
+ SolveNISTProblems(options);
+
+ options.trust_region_strategy_type = ceres::DOGLEG;
+ options.dogleg_type = ceres::TRADITIONAL_DOGLEG;
+ std::cerr << "\n\nTraditional Dogleg - DENSE_QR\n\n";
+ SolveNISTProblems(options);
+
+ options.trust_region_strategy_type = ceres::DOGLEG;
+ options.dogleg_type = ceres::SUBSPACE_DOGLEG;
+ std::cerr << "\n\nSubspace Dogleg - DENSE_QR\n\n";
+ SolveNISTProblems(options);
+
+ options.linear_solver_type = ceres::DENSE_NORMAL_CHOLESKY;
+ options.trust_region_strategy_type = ceres::LEVENBERG_MARQUARDT;
+ std::cerr << "Levenberg-Marquardt - DENSE_NORMAL_CHOLESKY\n";
+ SolveNISTProblems(options);
+
+ options.trust_region_strategy_type = ceres::DOGLEG;
+ options.dogleg_type = ceres::TRADITIONAL_DOGLEG;
+ std::cerr << "\n\nTraditional Dogleg - DENSE_NORMAL_CHOLESKY\n\n";
+ SolveNISTProblems(options);
+
+ options.trust_region_strategy_type = ceres::DOGLEG;
+ options.dogleg_type = ceres::SUBSPACE_DOGLEG;
+ std::cerr << "\n\nSubspace Dogleg - DENSE_NORMAL_CHOLESKY\n\n";
+ SolveNISTProblems(options);
+
+ options.linear_solver_type = ceres::CGNR;
+ options.preconditioner_type = ceres::JACOBI;
+ options.trust_region_strategy_type = ceres::LEVENBERG_MARQUARDT;
+ std::cerr << "Levenberg-Marquardt - CGNR + JACOBI\n";
SolveNISTProblems(options);
return 0;