@@ -115,6 +115,9 @@ DEFINE_int32(num_iterations, 10000, "Number of iterations");
115
115
DEFINE_bool (nonmonotonic_steps, false , " Trust region algorithm can use"
116
116
" nonmonotic steps" );
117
117
DEFINE_double (initial_trust_region_radius, 1e4 , " Initial trust region radius" );
118
+ DEFINE_bool (use_numeric_diff, false ,
119
+ " Use numeric differentiation instead of automatic "
120
+ " differentiation." );
118
121
119
122
namespace ceres {
120
123
namespace examples {
@@ -431,12 +434,25 @@ int RegressionDriver(const string& filename,
431
434
432
435
ceres::Problem problem;
433
436
for (int i = 0 ; i < nist_problem.num_observations (); ++i) {
434
- problem.AddResidualBlock (
435
- new ceres::AutoDiffCostFunction<Model, num_residuals, num_parameters>(
436
- new Model (predictor.data () + nist_problem.predictor_size () * i,
437
- response.data () + nist_problem.response_size () * i)),
438
- NULL ,
439
- initial_parameters.data ());
437
+ Model* model = new Model (predictor.data () + nist_problem.predictor_size () * i,
438
+ response.data () + nist_problem.response_size () * i);
439
+ ceres::CostFunction* cost_function = NULL ;
440
+ if (FLAGS_use_numeric_diff) {
441
+ cost_function =
442
+ new ceres::NumericDiffCostFunction<Model,
443
+ ceres::CENTRAL,
444
+ num_residuals,
445
+ num_parameters>(model);
446
+ } else {
447
+ cost_function =
448
+ new ceres::AutoDiffCostFunction<Model,
449
+ num_residuals,
450
+ num_parameters>(model);
451
+ }
452
+
453
+ problem.AddResidualBlock (cost_function,
454
+ NULL ,
455
+ initial_parameters.data ());
440
456
}
441
457
442
458
ceres::Solver::Summary summary;
0 commit comments