Add the option to use numeric differentiation to nist and more_garbow_hillstrom

Change-Id: If0a5caef90b524dcf5e2567c5b681987f5459401
diff --git a/examples/more_garbow_hillstrom.cc b/examples/more_garbow_hillstrom.cc
index 9f45040..b0ea78a 100644
--- a/examples/more_garbow_hillstrom.cc
+++ b/examples/more_garbow_hillstrom.cc
@@ -60,6 +60,10 @@
 #include "glog/logging.h"
 
 DEFINE_string(problem, "all", "Which problem to solve");
+DEFINE_bool(use_numeric_diff, false,
+            "Use numeric differentiation instead of automatic "
+            "differentiation.");
+
 
 namespace ceres {
 namespace examples {
@@ -75,9 +79,16 @@
     static const double constrained_optimal_cost;                       \
     static const double unconstrained_optimal_cost;                     \
     static CostFunction* Create() {                                     \
-      return new AutoDiffCostFunction<name,                             \
-                                      num_residuals,                    \
-                                      num_parameters>(new name);        \
+      if (FLAGS_use_numeric_diff) {                                     \
+        return new NumericDiffCostFunction<name,                        \
+                                           CENTRAL,                     \
+                                           num_residuals,               \
+                                           num_parameters>(new name);   \
+      } else {                                                          \
+        return new AutoDiffCostFunction<name,                           \
+                                        num_residuals,                  \
+                                        num_parameters>(new name);      \
+      }                                                                 \
     }                                                                   \
     template <typename T>                                               \
     bool operator()(const T* const x, T* residual) const {
diff --git a/examples/nist.cc b/examples/nist.cc
index 3d2e16a..81c3f2a 100644
--- a/examples/nist.cc
+++ b/examples/nist.cc
@@ -115,6 +115,9 @@
 DEFINE_bool(nonmonotonic_steps, false, "Trust region algorithm can use"
             " nonmonotic steps");
 DEFINE_double(initial_trust_region_radius, 1e4, "Initial trust region radius");
+DEFINE_bool(use_numeric_diff, false,
+            "Use numeric differentiation instead of automatic "
+            "differentiation.");
 
 namespace ceres {
 namespace examples {
@@ -431,12 +434,25 @@
 
     ceres::Problem problem;
     for (int i = 0; i < nist_problem.num_observations(); ++i) {
-      problem.AddResidualBlock(
-          new ceres::AutoDiffCostFunction<Model, num_residuals, num_parameters>(
-              new Model(predictor.data() + nist_problem.predictor_size() * i,
-                        response.data() + nist_problem.response_size() * i)),
-          NULL,
-          initial_parameters.data());
+      Model* model = new Model(predictor.data() + nist_problem.predictor_size() * i,
+                               response.data() + nist_problem.response_size() * i);
+      ceres::CostFunction* cost_function = NULL;
+      if (FLAGS_use_numeric_diff) {
+        cost_function =
+            new ceres::NumericDiffCostFunction<Model,
+                                               ceres::CENTRAL,
+                                               num_residuals,
+                                               num_parameters>(model);
+      } else {
+         cost_function =
+             new ceres::AutoDiffCostFunction<Model,
+                                             num_residuals,
+                                             num_parameters>(model);
+      }
+
+      problem.AddResidualBlock(cost_function,
+                               NULL,
+                               initial_parameters.data());
     }
 
     ceres::Solver::Summary summary;