iteration_callback.h revision 79397c21138f54fcff6ec067b44b847f1f7e0e98
10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Ceres Solver - A fast non-linear least squares minimizer 20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2010, 2011, 2012 Google Inc. All rights reserved. 30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// http://code.google.com/p/ceres-solver/ 40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are met: 70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright notice, 90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this list of conditions and the following disclaimer. 100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above copyright notice, 110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this list of conditions and the following disclaimer in the documentation 120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and/or other materials provided with the distribution. 130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its contributors may be 140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// used to endorse or promote products derived from this software without 150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specific prior written permission. 160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// POSSIBILITY OF SUCH DAMAGE. 280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: sameeragarwal@google.com (Sameer Agarwal) 300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// When an iteration callback is specified, Ceres calls the callback 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// after each minimizer step (if the minimizer has not converged) and 330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// passes it an IterationSummary object, defined below. 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef CERES_PUBLIC_ITERATION_CALLBACK_H_ 360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define CERES_PUBLIC_ITERATION_CALLBACK_H_ 370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/types.h" 3979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/internal/disable_warnings.h" 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace ceres { 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This struct describes the state of the optimizer after each 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// iteration of the minimization. 4579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezstruct CERES_EXPORT IterationSummary { 460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong IterationSummary() 470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : iteration(0), 480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong step_is_valid(false), 490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong step_is_nonmonotonic(false), 500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong step_is_successful(false), 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cost(0.0), 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cost_change(0.0), 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong gradient_max_norm(0.0), 5479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez gradient_norm(0.0), 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong step_norm(0.0), 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong eta(0.0), 571d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling step_size(0.0), 581d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling line_search_function_evaluations(0), 591d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling line_search_gradient_evaluations(0), 601d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling line_search_iterations(0), 610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong linear_solver_iterations(0), 620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong iteration_time_in_seconds(0.0), 630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong step_solver_time_in_seconds(0.0), 640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cumulative_time_in_seconds(0.0) {} 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Current iteration number. 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int32 iteration; 680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Step was numerically valid, i.e., all values are finite and the 700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // step reduces the value of the linearized model. 710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Note: step_is_valid is false when iteration = 0. 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool step_is_valid; 740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Step did not reduce the value of the objective function 760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // sufficiently, but it was accepted because of the relaxed 770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // acceptance criterion used by the non-monotonic trust region 780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // algorithm. 790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Note: step_is_nonmonotonic is false when iteration = 0; 810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool step_is_nonmonotonic; 820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Whether or not the minimizer accepted this step or not. If the 840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ordinary trust region algorithm is used, this means that the 850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // relative reduction in the objective function value was greater 860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // than Solver::Options::min_relative_decrease. However, if the 870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // non-monotonic trust region algorithm is used 880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (Solver::Options:use_nonmonotonic_steps = true), then even if the 890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // relative decrease is not sufficient, the algorithm may accept the 900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // step and the step is declared successful. 910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Note: step_is_successful is false when iteration = 0. 930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool step_is_successful; 940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Value of the objective function. 960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double cost; 970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Change in the value of the objective function in this 990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // iteration. This can be positive or negative. 1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double cost_change; 1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Infinity norm of the gradient vector. 1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double gradient_max_norm; 1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez // 2-norm of the gradient vector. 10679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez double gradient_norm; 10779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2-norm of the size of the step computed by the optimization 1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // algorithm. 1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double step_norm; 1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For trust region algorithms, the ratio of the actual change in 1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // cost and the change in the cost of the linearized approximation. 1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double relative_decrease; 1150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Size of the trust region at the end of the current iteration. For 1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the Levenberg-Marquardt algorithm, the regularization parameter 1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // mu = 1.0 / trust_region_radius. 1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double trust_region_radius; 1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For the inexact step Levenberg-Marquardt algorithm, this is the 1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // relative accuracy with which the Newton(LM) step is solved. This 1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // number affects only the iterative solvers capable of solving 1240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // linear systems inexactly. Factorization-based exact solvers 1250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ignore it. 1260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double eta; 1270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1281d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // Step sized computed by the line search algorithm. 1291d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling double step_size; 1301d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 1311d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // Number of function value evaluations used by the line search algorithm. 1321d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling int line_search_function_evaluations; 1331d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 1341d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // Number of function gradient evaluations used by the line search algorithm. 1351d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling int line_search_gradient_evaluations; 1361d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 1371d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // Number of iterations taken by the line search algorithm. 1381d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling int line_search_iterations; 1391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 1400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Number of iterations taken by the linear solver to solve for the 1410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Newton step. 1420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int linear_solver_iterations; 1430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1441d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // All times reported below are wall times. 1451d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 1460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Time (in seconds) spent inside the minimizer loop in the current 1470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // iteration. 1480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double iteration_time_in_seconds; 1490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Time (in seconds) spent inside the trust region step solver. 1510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double step_solver_time_in_seconds; 1520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Time (in seconds) since the user called Solve(). 1540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double cumulative_time_in_seconds; 1550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 1560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Interface for specifying callbacks that are executed at the end of 1580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// each iteration of the Minimizer. The solver uses the return value 1590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of operator() to decide whether to continue solving or to 1600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// terminate. The user can return three values. 1610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SOLVER_ABORT indicates that the callback detected an abnormal 1630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// situation. The solver returns without updating the parameter blocks 1640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (unless Solver::Options::update_state_every_iteration is set 1650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true). Solver returns with Solver::Summary::termination_type set to 1660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// USER_ABORT. 1670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SOLVER_TERMINATE_SUCCESSFULLY indicates that there is no need to 1690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// optimize anymore (some user specified termination criterion has 1700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// been met). Solver returns with Solver::Summary::termination_type 1710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// set to USER_SUCCESS. 1720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SOLVER_CONTINUE indicates that the solver should continue 1740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// optimizing. 1750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// For example, the following Callback is used internally by Ceres to 1770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// log the progress of the optimization. 1780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Callback for logging the state of the minimizer to STDERR or STDOUT 1800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// depending on the user's preferences and logging level. 1810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class LoggingCallback : public IterationCallback { 1830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// public: 1840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// explicit LoggingCallback(bool log_to_stdout) 1850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// : log_to_stdout_(log_to_stdout) {} 1860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ~LoggingCallback() {} 1880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CallbackReturnType operator()(const IterationSummary& summary) { 1900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// const char* kReportRowFormat = 1910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "% 4d: f:% 8e d:% 3.2e g:% 3.2e h:% 3.2e " 1920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "rho:% 3.2e mu:% 3.2e eta:% 3.2e li:% 3d"; 1930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// string output = StringPrintf(kReportRowFormat, 1940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.iteration, 1950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.cost, 1960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.cost_change, 1970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.gradient_max_norm, 1980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.step_norm, 1990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.relative_decrease, 2000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.trust_region_radius, 2010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.eta, 2020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// summary.linear_solver_iterations); 2030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// if (log_to_stdout_) { 2040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// cout << output << endl; 2050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// } else { 2060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// VLOG(1) << output; 2070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// } 2080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// return SOLVER_CONTINUE; 2090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// } 2100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// private: 2120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// const bool log_to_stdout_; 2130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// }; 2140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 21579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezclass CERES_EXPORT IterationCallback { 2160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 2170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~IterationCallback() {} 2180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual CallbackReturnType operator()(const IterationSummary& summary) = 0; 2190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 2200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace ceres 2220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/internal/reenable_warnings.h" 22479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 2250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // CERES_PUBLIC_ITERATION_CALLBACK_H_ 226