Use Ridders' method in GradientChecker. Using Ridders' method gives orders of magnitude more accuracy compared to central differences. This will make things slower, but this is primarily a testing/debugging feature and the speed hit is not a concern. This should also reduce the false positive rates when users enable check_gradients. This is reflected the increased sensitivity of the tests for GradientChecker. https://github.com/ceres-solver/ceres-solver/issues/554 Change-Id: I6b871c72df55be1c31175ba062cf3c1e94e4b662
diff --git a/internal/ceres/gradient_checker.cc b/internal/ceres/gradient_checker.cc index 411a67f..ef56666 100644 --- a/internal/ceres/gradient_checker.cc +++ b/internal/ceres/gradient_checker.cc
@@ -130,9 +130,9 @@ local_parameterizations_.resize(function->parameter_block_sizes().size(), NULL); } - DynamicNumericDiffCostFunction<CostFunction, CENTRAL>* + DynamicNumericDiffCostFunction<CostFunction, RIDDERS>* finite_diff_cost_function = - new DynamicNumericDiffCostFunction<CostFunction, CENTRAL>( + new DynamicNumericDiffCostFunction<CostFunction, RIDDERS>( function, DO_NOT_TAKE_OWNERSHIP, options); finite_diff_cost_function_.reset(finite_diff_cost_function);
diff --git a/internal/ceres/gradient_checker_test.cc b/internal/ceres/gradient_checker_test.cc index cd194a7..b2dd35e 100644 --- a/internal/ceres/gradient_checker_test.cc +++ b/internal/ceres/gradient_checker_test.cc
@@ -48,6 +48,7 @@ namespace internal { using std::vector; +const double kTolerance = 1e-12; // We pick a (non-quadratic) function whose derivative are easy: // @@ -154,7 +155,7 @@ if (jacobians[j]) { for (int u = 0; u < parameter_block_sizes()[j]; ++u) { // See comments before class. - jacobians[j][u] = -f * a_[j][u] + 0.001; + jacobians[j][u] = -f * a_[j][u] + kTolerance; } } } @@ -168,7 +169,7 @@ vector<vector<double>> a_; // our vectors. }; -const double kTolerance = 1e-6; + static void CheckDimensions(const GradientChecker::ProbeResults& results, const std::vector<int>& parameter_sizes,