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