Fix user iteration callbacks.
User callbacks got broken at some point due to the extra
layer of copying from Solver::Options to Minimizer::Options.
This copies the user callbacks when initializing
Minimizer::Options from Solver::Options, and adds a test to
this effect.
This also fixes a bug where the state updating callback was
not called before the user callbacks. This also adds a test
to solver_impl_test to ensure the state updating callbacks
work as expected.
Thanks to Luis Alberto Zarrabeitia for the report.
Issue: 46
Change-Id: I2b36415c89dafaa5c84ecaa727a325df122e1092
diff --git a/internal/ceres/trust_region_minimizer.cc b/internal/ceres/trust_region_minimizer.cc
index 4d0c91e..c475690 100644
--- a/internal/ceres/trust_region_minimizer.cc
+++ b/internal/ceres/trust_region_minimizer.cc
@@ -59,7 +59,6 @@
// the callbacks does not return SOLVER_CONTINUE, then stop and return
// its status.
CallbackReturnType TrustRegionMinimizer::RunCallbacks(
- const Minimizer::Options& options_,
const IterationSummary& iteration_summary) {
for (int i = 0; i < options_.callbacks.size(); ++i) {
const CallbackReturnType status =
@@ -219,7 +218,7 @@
summary->iterations.push_back(iteration_summary);
// Call the various callbacks.
- switch (RunCallbacks(options_, iteration_summary)) {
+ switch (RunCallbacks(iteration_summary)) {
case SOLVER_TERMINATE_SUCCESSFULLY:
summary->termination_type = USER_SUCCESS;
VLOG(1) << "Terminating: User callback returned USER_SUCCESS.";
@@ -441,7 +440,7 @@
summary->preprocessor_time_in_seconds;
summary->iterations.push_back(iteration_summary);
- switch (RunCallbacks(options_, iteration_summary)) {
+ switch (RunCallbacks(iteration_summary)) {
case SOLVER_TERMINATE_SUCCESSFULLY:
summary->termination_type = USER_SUCCESS;
VLOG(1) << "Terminating: User callback returned USER_SUCCESS.";