solver.h revision 0ae28bd5885b5daa526898fcf7c323dc2c3e1963
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#ifndef CERES_PUBLIC_SOLVER_H_ 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define CERES_PUBLIC_SOLVER_H_ 330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <cmath> 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <vector> 370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/crs_matrix.h" 380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/macros.h" 390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/port.h" 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/iteration_callback.h" 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/ordered_groups.h" 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/types.h" 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace ceres { 450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass Problem; 470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Interface for non-linear least squares solvers. 490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass Solver { 500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~Solver(); 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The options structure contains, not surprisingly, options that control how 540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the solver operates. The defaults should be suitable for a wide range of 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // problems; however, better performance is often obtainable with tweaking. 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The constants are defined inside types.h 580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong struct Options { 590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Default constructor that sets up a generic sparse problem. 600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Options() { 610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong trust_region_strategy_type = LEVENBERG_MARQUARDT; 620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dogleg_type = TRADITIONAL_DOGLEG; 630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong use_nonmonotonic_steps = false; 640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_consecutive_nonmonotonic_steps = 5; 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_num_iterations = 50; 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_solver_time_in_seconds = 1e9; 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_threads = 1; 680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong initial_trust_region_radius = 1e4; 690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_trust_region_radius = 1e16; 700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong min_trust_region_radius = 1e-32; 710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong min_relative_decrease = 1e-3; 720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong lm_min_diagonal = 1e-6; 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong lm_max_diagonal = 1e32; 740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_num_consecutive_invalid_steps = 5; 750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong function_tolerance = 1e-6; 760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong gradient_tolerance = 1e-10; 770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parameter_tolerance = 1e-8; 780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if defined(CERES_NO_SUITESPARSE) && defined(CERES_NO_CXSPARSE) 800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong linear_solver_type = DENSE_QR; 810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong linear_solver_type = SPARSE_NORMAL_CHOLESKY; 830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong preconditioner_type = JACOBI; 860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sparse_linear_algebra_library = SUITE_SPARSE; 880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if defined(CERES_NO_SUITESPARSE) && !defined(CERES_NO_CXSPARSE) 890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sparse_linear_algebra_library = CX_SPARSE; 900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_linear_solver_threads = 1; 930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if defined(CERES_NO_SUITESPARSE) 950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong use_block_amd = false; 960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong use_block_amd = true; 980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong linear_solver_ordering = NULL; 1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong use_inner_iterations = false; 1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong inner_iteration_ordering = NULL; 1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong linear_solver_min_num_iterations = 1; 1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong linear_solver_max_num_iterations = 500; 1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong eta = 1e-1; 1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong jacobi_scaling = true; 1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong logging_type = PER_MINIMIZER_ITERATION; 1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong minimizer_progress_to_stdout = false; 1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return_initial_residuals = false; 1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return_initial_gradient = false; 1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return_initial_jacobian = false; 1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return_final_residuals = false; 1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return_final_gradient = false; 1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return_final_jacobian = false; 1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong lsqp_dump_directory = "/tmp"; 1150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong lsqp_dump_format_type = TEXTFILE; 1160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong check_gradients = false; 1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong gradient_check_relative_precision = 1e-8; 1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong numeric_derivative_relative_step_size = 1e-6; 1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong update_state_every_iteration = false; 1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~Options(); 1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer options ---------------------------------------- 1240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TrustRegionStrategyType trust_region_strategy_type; 1260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Type of dogleg strategy to use. 1280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DoglegType dogleg_type; 1290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The classical trust region methods are descent methods, in that 1310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // they only accept a point if it strictly reduces the value of 1320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the objective function. 1330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Relaxing this requirement allows the algorithm to be more 1350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // efficient in the long term at the cost of some local increase 1360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in the value of the objective function. 1370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This is because allowing for non-decreasing objective function 1390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // values in a princpled manner allows the algorithm to "jump over 1400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // boulders" as the method is not restricted to move into narrow 1410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // valleys while preserving its convergence properties. 1420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Setting use_nonmonotonic_steps to true enables the 1440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // non-monotonic trust region algorithm as described by Conn, 1450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gould & Toint in "Trust Region Methods", Section 10.1. 1460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The parameter max_consecutive_nonmonotonic_steps controls the 1480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // window size used by the step selection algorithm to accept 1490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // non-monotonic steps. 1500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Even though the value of the objective function may be larger 1520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // than the minimum value encountered over the course of the 1530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // optimization, the final parameters returned to the user are the 1540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ones corresponding to the minimum cost over all iterations. 1550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool use_nonmonotonic_steps; 1560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int max_consecutive_nonmonotonic_steps; 1570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Maximum number of iterations for the minimizer to run for. 1590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int max_num_iterations; 1600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Maximum time for which the minimizer should run for. 1620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double max_solver_time_in_seconds; 1630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Number of threads used by Ceres for evaluating the cost and 1650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // jacobians. 1660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_threads; 1670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Trust region minimizer settings. 1690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double initial_trust_region_radius; 1700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double max_trust_region_radius; 1710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer terminates when the trust region radius becomes 1730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // smaller than this value. 1740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double min_trust_region_radius; 1750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Lower bound for the relative decrease before a step is 1770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // accepted. 1780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double min_relative_decrease; 1790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For the Levenberg-Marquadt algorithm, the scaled diagonal of 1810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the normal equations J'J is used to control the size of the 1820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // trust region. Extremely small and large values along the 1830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // diagonal can make this regularization scheme 1840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // fail. lm_max_diagonal and lm_min_diagonal, clamp the values of 1850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // diag(J'J) from above and below. In the normal course of 1860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // operation, the user should not have to modify these parameters. 1870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double lm_min_diagonal; 1880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double lm_max_diagonal; 1890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sometimes due to numerical conditioning problems or linear 1910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // solver flakiness, the trust region strategy may return a 1920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // numerically invalid step that can be fixed by reducing the 1930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // trust region size. So the TrustRegionMinimizer allows for a few 1940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // successive invalid steps before it declares NUMERICAL_FAILURE. 1950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int max_num_consecutive_invalid_steps; 1960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer terminates when 1980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (new_cost - old_cost) < function_tolerance * old_cost; 2000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double function_tolerance; 2020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer terminates when 2040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // max_i |gradient_i| < gradient_tolerance * max_i|initial_gradient_i| 2060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This value should typically be 1e-4 * function_tolerance. 2080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double gradient_tolerance; 2090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer terminates when 2110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // |step|_2 <= parameter_tolerance * ( |x|_2 + parameter_tolerance) 2130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double parameter_tolerance; 2150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Linear least squares solver options ------------------------------------- 2170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearSolverType linear_solver_type; 2190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Type of preconditioner to use with the iterative linear solvers. 2210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PreconditionerType preconditioner_type; 2220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Ceres supports using multiple sparse linear algebra libraries 2240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for sparse matrix ordering and factorizations. Currently, 2250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // SUITE_SPARSE and CX_SPARSE are the valid choices, depending on 2260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // whether they are linked into Ceres at build time. 2270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SparseLinearAlgebraLibraryType sparse_linear_algebra_library; 2280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Number of threads used by Ceres to solve the Newton 2300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // step. Currently only the SPARSE_SCHUR solver is capable of 2310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // using this setting. 2320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_linear_solver_threads; 2330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The order in which variables are eliminated in a linear solver 2350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // can have a significant of impact on the efficiency and accuracy 2360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // of the method. e.g., when doing sparse Cholesky factorization, 2370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // there are matrices for which a good ordering will give a 2380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Cholesky factor with O(n) storage, where as a bad ordering will 2390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // result in an completely dense factor. 2400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Ceres allows the user to provide varying amounts of hints to 2420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the solver about the variable elimination ordering to use. This 2430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // can range from no hints, where the solver is free to decide the 2440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // best possible ordering based on the user's choices like the 2450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // linear solver being used, to an exact order in which the 2460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // variables should be eliminated, and a variety of possibilities 2470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in between. 2480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Instances of the ParameterBlockOrdering class are used to 2500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // communicate this information to Ceres. 2510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Formally an ordering is an ordered partitioning of the 2530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // parameter blocks, i.e, each parameter block belongs to exactly 2540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // one group, and each group has a unique non-negative integer 2550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // associated with it, that determines its order in the set of 2560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // groups. 2570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Given such an ordering, Ceres ensures that the parameter blocks in 2590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the lowest numbered group are eliminated first, and then the 2600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // parmeter blocks in the next lowest numbered group and so on. Within 2610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // each group, Ceres is free to order the parameter blocks as it 2620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // chooses. 2630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If NULL, then all parameter blocks are assumed to be in the 2650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // same group and the solver is free to decide the best 2660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ordering. 2670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // e.g. Consider the linear system 2690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // x + y = 3 2710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2x + 3y = 7 2720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // There are two ways in which it can be solved. First eliminating x 2740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // from the two equations, solving for y and then back substituting 2750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for x, or first eliminating y, solving for x and back substituting 2760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for y. The user can construct three orderings here. 2770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // {0: x}, {1: y} - eliminate x first. 2790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // {0: y}, {1: x} - eliminate y first. 2800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // {0: x, y} - Solver gets to decide the elimination order. 2810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Thus, to have Ceres determine the ordering automatically using 2830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // heuristics, put all the variables in group 0 and to control the 2840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ordering for every variable, create groups 0..N-1, one per 2850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // variable, in the desired order. 2860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Bundle Adjustment 2880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ----------------- 2890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A particular case of interest is bundle adjustment, where the user 2910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // has two options. The default is to not specify an ordering at all, 2920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the solver will see that the user wants to use a Schur type solver 2930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and figure out the right elimination ordering. 2940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // But if the user already knows what parameter blocks are points and 2960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // what are cameras, they can save preprocessing time by partitioning 2970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the parameter blocks into two groups, one for the points and one 2980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for the cameras, where the group containing the points has an id 2990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // smaller than the group containing cameras. 3000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Once assigned, Solver::Options owns this pointer and will 3020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // deallocate the memory when destroyed. 3030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParameterBlockOrdering* linear_solver_ordering; 3040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // By virtue of the modeling layer in Ceres being block oriented, 3060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // all the matrices used by Ceres are also block oriented. When 3070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // doing sparse direct factorization of these matrices (for 3080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // SPARSE_NORMAL_CHOLESKY, SPARSE_SCHUR and ITERATIVE in 3090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // conjunction with CLUSTER_TRIDIAGONAL AND CLUSTER_JACOBI 3100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // preconditioners), the fill-reducing ordering algorithms can 3110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // either be run on the block or the scalar form of these matrices. 3120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Running it on the block form exposes more of the super-nodal 3130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // structure of the matrix to the factorization routines. Setting 3140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this parameter to true runs the ordering algorithms in block 3150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // form. Currently this option only makes sense with 3160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // sparse_linear_algebra_library = SUITE_SPARSE. 3170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool use_block_amd; 3180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Some non-linear least squares problems have additional 3200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // structure in the way the parameter blocks interact that it is 3210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // beneficial to modify the way the trust region step is computed. 3220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // e.g., consider the following regression problem 3240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // y = a_1 exp(b_1 x) + a_2 exp(b_3 x^2 + c_1) 3260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Given a set of pairs{(x_i, y_i)}, the user wishes to estimate 3280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // a_1, a_2, b_1, b_2, and c_1. 3290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Notice here that the expression on the left is linear in a_1 3310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and a_2, and given any value for b_1, b_2 and c_1, it is 3320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // possible to use linear regression to estimate the optimal 3330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // values of a_1 and a_2. Indeed, its possible to analytically 3340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // eliminate the variables a_1 and a_2 from the problem all 3350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // together. Problems like these are known as separable least 3360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // squares problem and the most famous algorithm for solving them 3370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is the Variable Projection algorithm invented by Golub & 3380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Pereyra. 3390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Similar structure can be found in the matrix factorization with 3410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // missing data problem. There the corresponding algorithm is 3420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // known as Wiberg's algorithm. 3430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Ruhe & Wedin (Algorithms for Separable Nonlinear Least Squares 3450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Problems, SIAM Reviews, 22(3), 1980) present an analyis of 3460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // various algorithms for solving separable non-linear least 3470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // squares problems and refer to "Variable Projection" as 3480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Algorithm I in their paper. 3490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Implementing Variable Projection is tedious and expensive, and 3510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // they present a simpler algorithm, which they refer to as 3520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Algorithm II, where once the Newton/Trust Region step has been 3530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // computed for the whole problem (a_1, a_2, b_1, b_2, c_1) and 3540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // additional optimization step is performed to estimate a_1 and 3550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // a_2 exactly. 3560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This idea can be generalized to cases where the residual is not 3580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // linear in a_1 and a_2, i.e., Solve for the trust region step 3590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for the full problem, and then use it as the starting point to 3600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // further optimize just a_1 and a_2. For the linear case, this 3610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // amounts to doing a single linear least squares solve. For 3620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // non-linear problems, any method for solving the a_1 and a_2 3630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // optimization problems will do. The only constraint on a_1 and 3640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // a_2 is that they do not co-occur in any residual block. 3650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This idea can be further generalized, by not just optimizing 3670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (a_1, a_2), but decomposing the graph corresponding to the 3680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Hessian matrix's sparsity structure in a collection of 3690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // non-overlapping independent sets and optimizing each of them. 3700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Setting "use_inner_iterations" to true enables the use of this 3720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // non-linear generalization of Ruhe & Wedin's Algorithm II. This 3730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // version of Ceres has a higher iteration complexity, but also 3740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // displays better convergence behaviour per iteration. Setting 3750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver::Options::num_threads to the maximum number possible is 3760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // highly recommended. 3770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool use_inner_iterations; 3780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If inner_iterations is true, then the user has two choices. 3800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1. Let the solver heuristically decide which parameter blocks 3820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to optimize in each inner iteration. To do this leave 3830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver::Options::inner_iteration_ordering untouched. 3840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2. Specify a collection of of ordered independent sets. Where 3860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the lower numbered groups are optimized before the higher 3870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // number groups. Each group must be an independent set. 3880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParameterBlockOrdering* inner_iteration_ordering; 3890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimum number of iterations for which the linear solver should 3910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // run, even if the convergence criterion is satisfied. 3920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int linear_solver_min_num_iterations; 3930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Maximum number of iterations for which the linear solver should 3950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // run. If the solver does not converge in less than 3960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // linear_solver_max_num_iterations, then it returns 3970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // MAX_ITERATIONS, as its termination type. 3980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int linear_solver_max_num_iterations; 3990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Forcing sequence parameter. The truncated Newton solver uses 4010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this number to control the relative accuracy with which the 4020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Newton step is computed. 4030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This constant is passed to ConjugateGradientsSolver which uses 4050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it to terminate the iterations when 4060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (Q_i - Q_{i-1})/Q_i < eta/i 4080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double eta; 4090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Normalize the jacobian using Jacobi scaling before calling 4110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the linear least squares solver. 4120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool jacobi_scaling; 4130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Logging options --------------------------------------------------------- 4150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LoggingType logging_type; 4170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // By default the Minimizer progress is logged to VLOG(1), which 4190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is sent to STDERR depending on the vlog level. If this flag is 4200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // set to true, and logging_type is not SILENT, the logging output 4210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is sent to STDOUT. 4220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool minimizer_progress_to_stdout; 4230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool return_initial_residuals; 4250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool return_initial_gradient; 4260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool return_initial_jacobian; 4270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool return_final_residuals; 4290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool return_final_gradient; 4300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool return_final_jacobian; 4310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // List of iterations at which the optimizer should dump the 4330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // linear least squares problem to disk. Useful for testing and 4340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // benchmarking. If empty (default), no problems are dumped. 4350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This is ignored if protocol buffers are disabled. 4370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<int> lsqp_iterations_to_dump; 4380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string lsqp_dump_directory; 4390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DumpFormatType lsqp_dump_format_type; 4400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Finite differences options ---------------------------------------------- 4420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Check all jacobians computed by each residual block with finite 4440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // differences. This is expensive since it involves computing the 4450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // derivative by normal means (e.g. user specified, autodiff, 4460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // etc), then also computing it using finite differences. The 4470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // results are compared, and if they differ substantially, details 4480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // are printed to the log. 4490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool check_gradients; 4500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Relative precision to check for in the gradient checker. If the 4520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // relative difference between an element in a jacobian exceeds 4530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this number, then the jacobian for that cost term is dumped. 4540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double gradient_check_relative_precision; 4550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Relative shift used for taking numeric derivatives. For finite 4570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // differencing, each dimension is evaluated at slightly shifted 4580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // values; for the case of central difference, this is what gets 4590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // evaluated: 4600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // delta = numeric_derivative_relative_step_size; 4620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // f_initial = f(x) 4630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // f_forward = f((1 + delta) * x) 4640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // f_backward = f((1 - delta) * x) 4650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The finite differencing is done along each dimension. The 4670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // reason to use a relative (rather than absolute) step size is 4680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that this way, numeric differentation works for functions where 4690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the arguments are typically large (e.g. 1e9) and when the 4700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // values are small (e.g. 1e-5). It is possible to construct 4710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // "torture cases" which break this finite difference heuristic, 4720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // but they do not come up often in practice. 4730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(keir): Pick a smarter number than the default above! In 4750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // theory a good choice is sqrt(eps) * x, which for doubles means 4760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // about 1e-8 * x. However, I have found this number too 4770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // optimistic. This number should be exposed for users to change. 4780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double numeric_derivative_relative_step_size; 4790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If true, the user's parameter blocks are updated at the end of 4810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // every Minimizer iteration, otherwise they are updated when the 4820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer terminates. This is useful if, for example, the user 4830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // wishes to visualize the state of the optimization every 4840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // iteration. 4850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool update_state_every_iteration; 4860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Callbacks that are executed at the end of each iteration of the 4880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer. An iteration may terminate midway, either due to 4890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // numerical failures or because one of the convergence tests has 4900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // been satisfied. In this case none of the callbacks are 4910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // executed. 4920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Callbacks are executed in the order that they are specified in 4940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this vector. By default, parameter blocks are updated only at 4950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the end of the optimization, i.e when the Minimizer 4960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // terminates. This behaviour is controlled by 4970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // update_state_every_variable. If the user wishes to have access 4980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to the update parameter blocks when his/her callbacks are 4990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // executed, then set update_state_every_iteration to true. 5000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The solver does NOT take ownership of these pointers. 5020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<IterationCallback*> callbacks; 5030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If non-empty, a summary of the execution of the solver is 5050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // recorded to this file. 5060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string solver_log; 5070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 5080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong struct Summary { 5100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Summary(); 5110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A brief one line description of the state of the solver after 5130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // termination. 5140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string BriefReport() const; 5150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A full multiline description of the state of the solver after 5170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // termination. 5180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string FullReport() const; 5190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Minimizer summary ------------------------------------------------- 5210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SolverTerminationType termination_type; 5220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the solver did not run, or there was a failure, a 5240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // description of the error. 5250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string error; 5260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Cost of the problem before and after the optimization. See 5280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // problem.h for definition of the cost of a problem. 5290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double initial_cost; 5300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double final_cost; 5310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The part of the total cost that comes from residual blocks that 5330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // were held fixed by the preprocessor because all the parameter 5340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // blocks that they depend on were fixed. 5350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double fixed_cost; 5360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Vectors of residuals before and after the optimization. The 5380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // entries of these vectors are in the order in which 5390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ResidualBlocks were added to the Problem object. 5400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Whether the residual vectors are populated with values is 5420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // controlled by Solver::Options::return_initial_residuals and 5430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver::Options::return_final_residuals respectively. 5440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<double> initial_residuals; 5450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<double> final_residuals; 5460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gradient vectors, before and after the optimization. The rows 5480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // are in the same order in which the ParameterBlocks were added 5490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to the Problem object. 5500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // NOTE: Since AddResidualBlock adds ParameterBlocks to the 5520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Problem automatically if they do not already exist, if you wish 5530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to have explicit control over the ordering of the vectors, then 5540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // use Problem::AddParameterBlock to explicitly add the 5550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ParameterBlocks in the order desired. 5560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Whether the vectors are populated with values is controlled by 5580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver::Options::return_initial_gradient and 5590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver::Options::return_final_gradient respectively. 5600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<double> initial_gradient; 5610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<double> final_gradient; 5620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Jacobian matrices before and after the optimization. The rows 5640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // of these matrices are in the same order in which the 5650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ResidualBlocks were added to the Problem object. The columns 5660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // are in the same order in which the ParameterBlocks were added 5670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to the Problem object. 5680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // NOTE: Since AddResidualBlock adds ParameterBlocks to the 5700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Problem automatically if they do not already exist, if you wish 5710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to have explicit control over the column ordering of the 5720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // matrix, then use Problem::AddParameterBlock to explicitly add 5730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the ParameterBlocks in the order desired. 5740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The Jacobian matrices are stored as compressed row sparse 5760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // matrices. Please see ceres/crs_matrix.h for more details of the 5770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // format. 5780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 5790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Whether the Jacboan matrices are populated with values is 5800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // controlled by Solver::Options::return_initial_jacobian and 5810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver::Options::return_final_jacobian respectively. 5820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CRSMatrix initial_jacobian; 5830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CRSMatrix final_jacobian; 5840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<IterationSummary> iterations; 5860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_successful_steps; 5880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_unsuccessful_steps; 5890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When the user calls Solve, before the actual optimization 5910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // occurs, Ceres performs a number of preprocessing steps. These 5920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // include error checks, memory allocations, and reorderings. This 5930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // time is accounted for as preprocessing time. 5940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double preprocessor_time_in_seconds; 5950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Time spent in the TrustRegionMinimizer. 5970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double minimizer_time_in_seconds; 5980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // After the Minimizer is finished, some time is spent in 6000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // re-evaluating residuals etc. This time is accounted for in the 6010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // postprocessor time. 6020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double postprocessor_time_in_seconds; 6030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Some total of all time spent inside Ceres when Solve is called. 6050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double total_time_in_seconds; 6060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Preprocessor summary. 6080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_parameter_blocks; 6090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_parameters; 6100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_residual_blocks; 6110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_residuals; 6120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_parameter_blocks_reduced; 6140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_parameters_reduced; 6150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_residual_blocks_reduced; 6160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_residuals_reduced; 6170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_eliminate_blocks_given; 6190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_eliminate_blocks_used; 6200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_threads_given; 6220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_threads_used; 6230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_linear_solver_threads_given; 6250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_linear_solver_threads_used; 6260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearSolverType linear_solver_type_given; 6280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearSolverType linear_solver_type_used; 6290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PreconditionerType preconditioner_type; 6310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TrustRegionStrategyType trust_region_strategy_type; 6330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DoglegType dogleg_type; 6340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SparseLinearAlgebraLibraryType sparse_linear_algebra_library; 6350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 6360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Once a least squares problem has been built, this function takes 6380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the problem and optimizes it based on the values of the options 6390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // parameters. Upon return, a detailed summary of the work performed 6400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // by the preprocessor, the non-linear minmizer and the linear 6410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // solver are reported in the summary object. 6420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void Solve(const Options& options, 6430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Problem* problem, 6440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Solver::Summary* summary); 6450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 6460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper function which avoids going through the interface. 6480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Solve(const Solver::Options& options, 6490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Problem* problem, 6500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Solver::Summary* summary); 6510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace ceres 6530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // CERES_PUBLIC_SOLVER_H_ 655