linear_solver.h revision 399f7d09e0c45af54b77b4ab9508d6f23759b927
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// Abstract interface for objects solving linear systems of various 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// kinds. 330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef CERES_INTERNAL_LINEAR_SOLVER_H_ 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define CERES_INTERNAL_LINEAR_SOLVER_H_ 360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <cstddef> 381d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <map> 391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <string> 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <vector> 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/block_sparse_matrix.h" 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/casts.h" 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/compressed_row_sparse_matrix.h" 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/dense_sparse_matrix.h" 451d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/execution_summary.h" 460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/triplet_sparse_matrix.h" 470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/types.h" 481d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "glog/logging.h" 490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace ceres { 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass LinearOperator; 540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Abstract base class for objects that implement algorithms for 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// solving linear systems 570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Ax = b 590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// It is expected that a single instance of a LinearSolver object 610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// maybe used multiple times for solving multiple linear systems with 620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the same sparsity structure. This allows them to cache and reuse 630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// information across solves. This means that calling Solve on the 640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// same LinearSolver instance with two different linear systems will 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// result in undefined behaviour. 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Subclasses of LinearSolver use two structs to configure themselves. 680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The Options struct configures the LinearSolver object for its 690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// lifetime. The PerSolveOptions struct is used to specify options for 700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// a particular Solve call. 710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass LinearSolver { 720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong struct Options { 740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Options() 750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : type(SPARSE_NORMAL_CHOLESKY), 760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong preconditioner_type(JACOBI), 77399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger dense_linear_algebra_library_type(EIGEN), 78399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger sparse_linear_algebra_library_type(SUITE_SPARSE), 791d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling use_postordering(false), 800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong min_num_iterations(1), 810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_num_iterations(1), 820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_threads(1), 830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong residual_reset_period(10), 841d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling row_block_size(Eigen::Dynamic), 851d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling e_block_size(Eigen::Dynamic), 861d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling f_block_size(Eigen::Dynamic) { 870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearSolverType type; 900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PreconditionerType preconditioner_type; 920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger DenseLinearAlgebraLibraryType dense_linear_algebra_library_type; 94399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger SparseLinearAlgebraLibraryType sparse_linear_algebra_library_type; 950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 961d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // See solver.h for information about this flag. 971d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling bool use_postordering; 980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Number of internal iterations that the solver uses. This 1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // parameter only makes sense for iterative solvers like CG. 1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int min_num_iterations; 1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int max_num_iterations; 1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If possible, how many threads can the solver use. 1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_threads; 1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Hints about the order in which the parameter blocks should be 1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // eliminated by the linear solver. 1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For example if elimination_groups is a vector of size k, then 1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the linear solver is informed that it should eliminate the 1121d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // parameter blocks 0 ... elimination_groups[0] - 1 first, and 1131d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // then elimination_groups[0] ... elimination_groups[1] - 1 and so 1141d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // on. Within each elimination group, the linear solver is free to 1151d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // choose how the parameter blocks are ordered. Different linear 1161d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // solvers have differing requirements on elimination_groups. 1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The most common use is for Schur type solvers, where there 1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // should be at least two elimination groups and the first 1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // elimination group must form an independent set in the normal 1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // equations. The first elimination group corresponds to the 1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // num_eliminate_blocks in the Schur type solvers. 1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vector<int> elimination_groups; 1240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Iterative solvers, e.g. Preconditioned Conjugate Gradients 1260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // maintain a cheap estimate of the residual which may become 1270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // inaccurate over time. Thus for non-zero values of this 1280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // parameter, the solver can be told to recalculate the value of 1290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the residual using a |b - Ax| evaluation. 1300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int residual_reset_period; 1310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the block sizes in a BlockSparseMatrix are fixed, then in 1330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // some cases the Schur complement based solvers can detect and 1340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // specialize on them. 1350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // It is expected that these parameters are set programmatically 1370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // rather than manually. 1380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Please see schur_complement_solver.h and schur_eliminator.h for 1400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // more details. 1410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int row_block_size; 1420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int e_block_size; 1430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int f_block_size; 1440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 1450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Options for the Solve method. 1470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong struct PerSolveOptions { 1480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PerSolveOptions() 1490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : D(NULL), 1500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong preconditioner(NULL), 1510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong r_tolerance(0.0), 1520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong q_tolerance(0.0) { 1530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 1540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This option only makes sense for unsymmetric linear solvers 1560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that can solve rectangular linear systems. 1570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Given a matrix A, an optional diagonal matrix D as a vector, 1590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and a vector b, the linear solver will solve for 1600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // | A | x = | b | 1620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // | D | | 0 | 1630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If D is null, then it is treated as zero, and the solver returns 1650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the solution to 1660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A x = b 1680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In either case, x is the vector that solves the following 1700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // optimization problem. 1710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // arg min_x ||Ax - b||^2 + ||Dx||^2 1730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Here A is a matrix of size m x n, with full column rank. If A 1750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // does not have full column rank, the results returned by the 1760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // solver cannot be relied on. D, if it is not null is an array of 1770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // size n. b is an array of size m and x is an array of size n. 1780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double * D; 1790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This option only makes sense for iterative solvers. 1810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In general the performance of an iterative linear solver 1830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // depends on the condition number of the matrix A. For example 1840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the convergence rate of the conjugate gradients algorithm 1850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is proportional to the square root of the condition number. 1860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // One particularly useful technique for improving the 1880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // conditioning of a linear system is to precondition it. In its 1890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // simplest form a preconditioner is a matrix M such that instead 1900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // of solving Ax = b, we solve the linear system AM^{-1} y = b 1910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // instead, where M is such that the condition number k(AM^{-1}) 1920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is smaller than the conditioner k(A). Given the solution to 1930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this system, x = M^{-1} y. The iterative solver takes care of 1940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the mechanics of solving the preconditioned system and 1950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // returning the corrected solution x. The user only needs to 1960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // supply a linear operator. 1970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A null preconditioner is equivalent to an identity matrix being 1990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // used a preconditioner. 2000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearOperator* preconditioner; 2010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The following tolerance related options only makes sense for 2040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // iterative solvers. Direct solvers ignore them. 2050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solver terminates when 2070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // |Ax - b| <= r_tolerance * |b|. 2090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This is the most commonly used termination criterion for 2110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // iterative solvers. 2120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double r_tolerance; 2130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For PSD matrices A, let 2150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Q(x) = x'Ax - 2b'x 2170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // be the cost of the quadratic function defined by A and b. Then, 2190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the solver terminates at iteration i if 2200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // i * (Q(x_i) - Q(x_i-1)) / Q(x_i) < q_tolerance. 2220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This termination criterion is more useful when using CG to 2240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // solve the Newton step. This particular convergence test comes 2250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // from Stephen Nash's work on truncated Newton 2260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // methods. References: 2270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1. Stephen G. Nash & Ariela Sofer, Assessing A Search 2290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Direction Within A Truncated Newton Method, Operation 2300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Research Letters 9(1990) 219-221. 2310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2. Stephen G. Nash, A Survey of Truncated Newton Methods, 2330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Journal of Computational and Applied Mathematics, 2340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 124(1-2), 45-59, 2000. 2350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double q_tolerance; 2370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 2380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Summary of a call to the Solve method. We should move away from 2400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the true/false method for determining solver success. We should 2410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // let the summary object do the talking. 2420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong struct Summary { 2430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Summary() 2440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : residual_norm(0.0), 2450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_iterations(-1), 2460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong termination_type(FAILURE) { 2470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 2480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double residual_norm; 2500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_iterations; 2510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearSolverTerminationType termination_type; 2520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 2530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~LinearSolver(); 2550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solve Ax = b. 2570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual Summary Solve(LinearOperator* A, 2580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const double* b, 2590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const PerSolveOptions& per_solve_options, 2600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double* x) = 0; 2610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2621d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // The following two methods return copies instead of references so 2631d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // that the base class implementation does not have to worry about 2641d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // life time issues. Further, these calls are not expected to be 2651d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // frequent or performance sensitive. 2661d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling virtual map<string, int> CallStatistics() const { 2671d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling return map<string, int>(); 2681d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling } 2691d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 2701d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling virtual map<string, double> TimeStatistics() const { 2711d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling return map<string, double>(); 2721d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling } 2731d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 2740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Factory 2750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static LinearSolver* Create(const Options& options); 2760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 2770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This templated subclass of LinearSolver serves as a base class for 2790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// other linear solvers that depend on the particular matrix layout of 2800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the underlying linear operator. For example some linear solvers 2810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// need low level access to the TripletSparseMatrix implementing the 2820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LinearOperator interface. This class hides those implementation 2830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// details behind a private virtual method, and has the Solve method 2840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// perform the necessary upcasting. 2850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename MatrixType> 2860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass TypedLinearSolver : public LinearSolver { 2870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 2880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~TypedLinearSolver() {} 2890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual LinearSolver::Summary Solve( 2900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LinearOperator* A, 2910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const double* b, 2920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const LinearSolver::PerSolveOptions& per_solve_options, 2930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double* x) { 2941d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling ScopedExecutionTimer total_time("LinearSolver::Solve", &execution_summary_); 2950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CHECK_NOTNULL(A); 2960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CHECK_NOTNULL(b); 2970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CHECK_NOTNULL(x); 2980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SolveImpl(down_cast<MatrixType*>(A), b, per_solve_options, x); 2990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 3000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3011d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling virtual map<string, int> CallStatistics() const { 3021d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling return execution_summary_.calls(); 3031d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling } 3041d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 3051d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling virtual map<string, double> TimeStatistics() const { 3061d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling return execution_summary_.times(); 3071d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling } 3081d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 3090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 3100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual LinearSolver::Summary SolveImpl( 3110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MatrixType* A, 3120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const double* b, 3130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const LinearSolver::PerSolveOptions& per_solve_options, 3140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double* x) = 0; 3151d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 3161d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling ExecutionSummary execution_summary_; 3170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 3180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Linear solvers that depend on acccess to the low level structure of 3200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// a SparseMatrix. 3210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtypedef TypedLinearSolver<BlockSparseMatrix> BlockSparseMatrixSolver; // NOLINT 3220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtypedef TypedLinearSolver<CompressedRowSparseMatrix> CompressedRowSparseMatrixSolver; // NOLINT 3230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtypedef TypedLinearSolver<DenseSparseMatrix> DenseSparseMatrixSolver; // NOLINT 3240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtypedef TypedLinearSolver<TripletSparseMatrix> TripletSparseMatrixSolver; // NOLINT 3250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 3270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace ceres 3280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // CERES_INTERNAL_LINEAR_SOLVER_H_ 330