types.h revision 79397c21138f54fcff6ec067b44b847f1f7e0e98
10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Ceres Solver - A fast non-linear least squares minimizer
20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// http://code.google.com/p/ceres-solver/
40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without
60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are met:
70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright notice,
90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   this list of conditions and the following disclaimer.
100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above copyright notice,
110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   this list of conditions and the following disclaimer in the documentation
120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   and/or other materials provided with the distribution.
130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its contributors may be
140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   used to endorse or promote products derived from this software without
150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   specific prior written permission.
160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// POSSIBILITY OF SUCH DAMAGE.
280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: sameeragarwal@google.com (Sameer Agarwal)
300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Enums and other top level class definitions.
320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Note: internal/types.cc defines stringification routines for some
340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of these enums. Please update those routines if you extend or
350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// remove enums from here.
360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef CERES_PUBLIC_TYPES_H_
380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define CERES_PUBLIC_TYPES_H_
390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
401d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <string>
411d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/port.h"
4379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/internal/disable_warnings.h"
440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace ceres {
460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Basic integer types. These typedefs are in the Ceres namespace to avoid
480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// conflicts with other packages having similar typedefs.
490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtypedef int   int32;
500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Argument type used in interfaces that can optionally take ownership
520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of a passed in argument. If TAKE_OWNERSHIP is passed, the called
530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object takes ownership of the pointer argument, and will call
540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// delete on it upon completion.
550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum Ownership {
560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  DO_NOT_TAKE_OWNERSHIP,
570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  TAKE_OWNERSHIP
580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(keir): Considerably expand the explanations of each solver type.
610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum LinearSolverType {
620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // These solvers are for general rectangular systems formed from the
630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // normal equations A'A x = A'b. They are direct solvers and do not
640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // assume any special problem structure.
650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solve the normal equations using a dense Cholesky solver; based
670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // on Eigen.
680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  DENSE_NORMAL_CHOLESKY,
690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solve the normal equations using a dense QR solver; based on
710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Eigen.
720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  DENSE_QR,
730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solve the normal equations using a sparse cholesky solver; requires
750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // SuiteSparse or CXSparse.
760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SPARSE_NORMAL_CHOLESKY,
770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Specialized solvers, specific to problems with a generalized
790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // bi-partitite structure.
800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solves the reduced linear system using a dense Cholesky solver;
820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // based on Eigen.
830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  DENSE_SCHUR,
840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solves the reduced linear system using a sparse Cholesky solver;
860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // based on CHOLMOD.
870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SPARSE_SCHUR,
880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solves the reduced linear system using Conjugate Gradients, based
900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // on a new Ceres implementation.  Suitable for large scale
910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // problems.
920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ITERATIVE_SCHUR,
930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Conjugate gradients on the normal equations.
950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  CGNR
960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum PreconditionerType {
990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Trivial preconditioner - the identity matrix.
1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  IDENTITY,
1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Block diagonal of the Gauss-Newton Hessian.
1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  JACOBI,
1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
10579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Note: The following three preconditioners can only be used with
10679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // the ITERATIVE_SCHUR solver. They are well suited for Structure
10779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // from Motion problems.
10879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Block diagonal of the Schur complement. This preconditioner may
1101d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // only be used with the ITERATIVE_SCHUR solver.
1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SCHUR_JACOBI,
1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Visibility clustering based preconditioners.
1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  //
11579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The following two preconditioners use the visibility structure of
11679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // the scene to determine the sparsity structure of the
11779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // preconditioner. This is done using a clustering algorithm. The
11879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // available visibility clustering algorithms are described below.
11979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
12079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Note: Requires SuiteSparse.
1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  CLUSTER_JACOBI,
1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  CLUSTER_TRIDIAGONAL
1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
1240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
12579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezenum VisibilityClusteringType {
12679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Canonical views algorithm as described in
12779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
12879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // "Scene Summarization for Online Image Collections", Ian Simon, Noah
12979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Snavely, Steven M. Seitz, ICCV 2007.
13079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
13179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // This clustering algorithm can be quite slow, but gives high
13279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // quality clusters. The original visibility based clustering paper
13379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // used this algorithm.
13479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  CANONICAL_VIEWS,
13579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
13679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The classic single linkage algorithm. It is extremely fast as
13779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // compared to CANONICAL_VIEWS, but can give slightly poorer
13879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // results. For problems with large number of cameras though, this
13979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // is generally a pretty good option.
14079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
14179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // If you are using SCHUR_JACOBI preconditioner and have SuiteSparse
14279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // available, CLUSTER_JACOBI and CLUSTER_TRIDIAGONAL in combination
14379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // with the SINGLE_LINKAGE algorithm will generally give better
14479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // results.
14579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  SINGLE_LINKAGE
14679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez};
14779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
1480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum SparseLinearAlgebraLibraryType {
1490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // High performance sparse Cholesky factorization and approximate
1500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // minimum degree ordering.
1510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SUITE_SPARSE,
1520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
15379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // A lightweight replacment for SuiteSparse, which does not require
15479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // a LAPACK/BLAS implementation. Consequently, its performance is
15579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // also a bit lower than SuiteSparse.
15679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  CX_SPARSE,
15779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
15879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Eigen's sparse linear algebra routines. In particular Ceres uses
15979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // the Simplicial LDLT routines.
16079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  EIGEN_SPARSE
1610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
1620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
163399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettingerenum DenseLinearAlgebraLibraryType {
164399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger  EIGEN,
165399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger  LAPACK
166399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger};
167399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger
1680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Logging options
1690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The options get progressively noisier.
1700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum LoggingType {
1710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SILENT,
1720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  PER_MINIMIZER_ITERATION
1730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
1740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1751d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum MinimizerType {
1761d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  LINE_SEARCH,
1771d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  TRUST_REGION
1781d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
1791d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1801d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum LineSearchDirectionType {
1811d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Negative of the gradient.
1821d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  STEEPEST_DESCENT,
1831d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1841d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // A generalization of the Conjugate Gradient method to non-linear
1851d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // functions. The generalization can be performed in a number of
1861d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // different ways, resulting in a variety of search directions. The
1871d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // precise choice of the non-linear conjugate gradient algorithm
1881d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // used is determined by NonlinerConjuateGradientType.
1891d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  NONLINEAR_CONJUGATE_GRADIENT,
1901d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1911d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // BFGS, and it's limited memory approximation L-BFGS, are quasi-Newton
1921d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // algorithms that approximate the Hessian matrix by iteratively refining
1931d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // an initial estimate with rank-one updates using the gradient at each
1941d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // iteration. They are a generalisation of the Secant method and satisfy
1951d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // the Secant equation.  The Secant equation has an infinium of solutions
1961d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // in multiple dimensions, as there are N*(N+1)/2 degrees of freedom in a
1971d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // symmetric matrix but only N conditions are specified by the Secant
1981d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // equation. The requirement that the Hessian approximation be positive
1991d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // definite imposes another N additional constraints, but that still leaves
2001d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // remaining degrees-of-freedom.  (L)BFGS methods uniquely deteremine the
2011d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // approximate Hessian by imposing the additional constraints that the
2021d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // approximation at the next iteration must be the 'closest' to the current
2031d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // approximation (the nature of how this proximity is measured is actually
2041d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // the defining difference between a family of quasi-Newton methods including
2051d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // (L)BFGS & DFP). (L)BFGS is currently regarded as being the best known
2061d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // general quasi-Newton method.
2071d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2081d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // The principal difference between BFGS and L-BFGS is that whilst BFGS
2091d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // maintains a full, dense approximation to the (inverse) Hessian, L-BFGS
2101d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // maintains only a window of the last M observations of the parameters and
2111d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // gradients. Using this observation history, the calculation of the next
2121d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // search direction can be computed without requiring the construction of the
2131d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // full dense inverse Hessian approximation. This is particularly important
2141d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // for problems with a large number of parameters, where storage of an N-by-N
2151d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // matrix in memory would be prohibitive.
2161d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2171d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // For more details on BFGS see:
2181d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2191d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Broyden, C.G., "The Convergence of a Class of Double-rank Minimization
2201d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Algorithms,"; J. Inst. Maths. Applics., Vol. 6, pp 76–90, 1970.
2211d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2221d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Fletcher, R., "A New Approach to Variable Metric Algorithms,"
2231d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Computer Journal, Vol. 13, pp 317–322, 1970.
2241d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2251d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Goldfarb, D., "A Family of Variable Metric Updates Derived by Variational
2261d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Means," Mathematics of Computing, Vol. 24, pp 23–26, 1970.
2271d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2281d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Shanno, D.F., "Conditioning of Quasi-Newton Methods for Function
2291d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Minimization," Mathematics of Computing, Vol. 24, pp 647–656, 1970.
2301d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2311d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // For more details on L-BFGS see:
2321d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2331d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Nocedal, J. (1980). "Updating Quasi-Newton Matrices with Limited
2341d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Storage". Mathematics of Computation 35 (151): 773–782.
2351d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2361d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Byrd, R. H.; Nocedal, J.; Schnabel, R. B. (1994).
2371d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // "Representations of Quasi-Newton Matrices and their use in
2381d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Limited Memory Methods". Mathematical Programming 63 (4):
2391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // 129–156.
2401d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2411d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // A general reference for both methods:
2421d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  //
2431d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Nocedal J., Wright S., Numerical Optimization, 2nd Ed. Springer, 1999.
2441d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  LBFGS,
2451d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  BFGS,
2461d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
2471d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
2481d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// Nonliner conjugate gradient methods are a generalization of the
2491d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// method of Conjugate Gradients for linear systems. The
2501d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// generalization can be carried out in a number of different ways
2511d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// leading to number of different rules for computing the search
2521d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// direction. Ceres provides a number of different variants. For more
2531d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// details see Numerical Optimization by Nocedal & Wright.
2541d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum NonlinearConjugateGradientType {
2551d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  FLETCHER_REEVES,
25679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  POLAK_RIBIERE,
2571d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  HESTENES_STIEFEL,
2581d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
2591d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
2601d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum LineSearchType {
2611d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // Backtracking line search with polynomial interpolation or
2621d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  // bisection.
2631d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  ARMIJO,
2641d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  WOLFE,
2651d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
2661d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
2670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Ceres supports different strategies for computing the trust region
2680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// step.
2690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum TrustRegionStrategyType {
2700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // The default trust region strategy is to use the step computation
2710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // used in the Levenberg-Marquardt algorithm. For more details see
2720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // levenberg_marquardt_strategy.h
2730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  LEVENBERG_MARQUARDT,
2740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
2750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Powell's dogleg algorithm interpolates between the Cauchy point
2760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // and the Gauss-Newton step. It is particularly useful if the
2770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // LEVENBERG_MARQUARDT algorithm is making a large number of
2780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // unsuccessful steps. For more details see dogleg_strategy.h.
2790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  //
2800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // NOTES:
2810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  //
2820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // 1. This strategy has not been experimented with or tested as
2830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // extensively as LEVENBERG_MARQUARDT, and therefore it should be
2840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // considered EXPERIMENTAL for now.
2850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  //
2860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // 2. For now this strategy should only be used with exact
2870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // factorization based linear solvers, i.e., SPARSE_SCHUR,
2880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // DENSE_SCHUR, DENSE_QR and SPARSE_NORMAL_CHOLESKY.
2890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  DOGLEG
2900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
2910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
2920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Ceres supports two different dogleg strategies.
2930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The "traditional" dogleg method by Powell and the
2940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "subspace" method described in
2950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// R. H. Byrd, R. B. Schnabel, and G. A. Shultz,
2960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "Approximate solution of the trust region problem by minimization
2970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//  over two-dimensional subspaces", Mathematical Programming,
2980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 40 (1988), pp. 247--263
2990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum DoglegType {
3000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // The traditional approach constructs a dogleg path
3010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // consisting of two line segments and finds the furthest
3020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // point on that path that is still inside the trust region.
3030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  TRADITIONAL_DOGLEG,
3040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // The subspace approach finds the exact minimum of the model
3060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // constrained to the subspace spanned by the dogleg path.
3070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SUBSPACE_DOGLEG
3080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
3090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
31079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezenum TerminationType {
31179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Minimizer terminated because one of the convergence criterion set
31279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // by the user was satisfied.
31379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
31479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // 1.  (new_cost - old_cost) < function_tolerance * old_cost;
31579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // 2.  max_i |gradient_i| < gradient_tolerance
31679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // 3.  |step|_2 <= parameter_tolerance * ( |x|_2 +  parameter_tolerance)
31779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
31879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The user's parameter blocks will be updated with the solution.
31979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  CONVERGENCE,
3200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
32179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The solver ran for maximum number of iterations or maximum amount
32279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // of time specified by the user, but none of the convergence
32379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // criterion specified by the user were met. The user's parameter
32479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // blocks will be updated with the solution found so far.
3250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  NO_CONVERGENCE,
3260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
32779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The minimizer terminated because of an error.  The user's
32879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // parameter blocks will not be updated.
32979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  FAILURE,
3300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Using an IterationCallback object, user code can control the
3320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // minimizer. The following enums indicate that the user code was
3330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // responsible for termination.
33479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
33579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Minimizer terminated successfully because a user
33679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // IterationCallback returned SOLVER_TERMINATE_SUCCESSFULLY.
33779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
33879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The user's parameter blocks will be updated with the solution.
33979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  USER_SUCCESS,
3400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
34179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Minimizer terminated because because a user IterationCallback
34279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // returned SOLVER_ABORT.
34379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
34479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The user's parameter blocks will not be updated.
34579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  USER_FAILURE
3460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
3470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Enums used by the IterationCallback instances to indicate to the
3490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// solver whether it should continue solving, the user detected an
3500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// error or the solution is good enough and the solver should
3510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// terminate.
3520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum CallbackReturnType {
3530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Continue solving to next iteration.
3540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SOLVER_CONTINUE,
3550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Terminate solver, and do not update the parameter blocks upon
3570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // return. Unless the user has set
3580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Solver:Options:::update_state_every_iteration, in which case the
3590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // state would have been updated every iteration
3600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // anyways. Solver::Summary::termination_type is set to USER_ABORT.
3610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SOLVER_ABORT,
3620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Terminate solver, update state and
3640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // return. Solver::Summary::termination_type is set to USER_SUCCESS.
3650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  SOLVER_TERMINATE_SUCCESSFULLY
3660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
3670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The format in which linear least squares problems should be logged
3690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// when Solver::Options::lsqp_iterations_to_dump is non-empty.
3700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum DumpFormatType {
3710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Print the linear least squares problem in a human readable format
3720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // to stderr. The Jacobian is printed as a dense matrix. The vectors
3730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // D, x and f are printed as dense vectors. This should only be used
3740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // for small problems.
3750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  CONSOLE,
3760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // Write out the linear least squares problem to the directory
3780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // pointed to by Solver::Options::lsqp_dump_directory as text files
3790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // which can be read into MATLAB/Octave. The Jacobian is dumped as a
3800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // text file containing (i,j,s) triplets, the vectors D, x and f are
3810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // dumped as text files containing a list of their values.
3820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  //
3830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // A MATLAB/octave script called lm_iteration_???.m is also output,
3840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // which can be used to parse and load the problem into memory.
3850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  TEXTFILE
3860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
3870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
38879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// For SizedCostFunction and AutoDiffCostFunction, DYNAMIC can be
38979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// specified for the number of residuals. If specified, then the
39079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// number of residuas for that cost function can vary at runtime.
3910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum DimensionType {
3920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  DYNAMIC = -1
3930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
3940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
3951d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum NumericDiffMethod {
3961d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  CENTRAL,
3971d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  FORWARD
3981d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
3991d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
4001d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum LineSearchInterpolationType {
4011d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  BISECTION,
4021d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  QUADRATIC,
4031d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  CUBIC
4041d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
4051d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
4061d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingenum CovarianceAlgorithmType {
4071d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  DENSE_SVD,
40879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  SUITE_SPARSE_QR,
40979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  EIGEN_SPARSE_QR
4101d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling};
4111d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
41279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* LinearSolverTypeToString(
41379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez    LinearSolverType type);
41479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToLinearSolverType(string value,
41579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez                                           LinearSolverType* type);
4160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
41779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* PreconditionerTypeToString(PreconditionerType type);
41879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToPreconditionerType(string value,
41979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez                                             PreconditionerType* type);
4200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
42179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* VisibilityClusteringTypeToString(
42279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez    VisibilityClusteringType type);
42379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToVisibilityClusteringType(string value,
42479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez                                      VisibilityClusteringType* type);
42579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
42679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* SparseLinearAlgebraLibraryTypeToString(
4270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    SparseLinearAlgebraLibraryType type);
42879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToSparseLinearAlgebraLibraryType(
4290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    string value,
4300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    SparseLinearAlgebraLibraryType* type);
4310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
43279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* DenseLinearAlgebraLibraryTypeToString(
433399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger    DenseLinearAlgebraLibraryType type);
43479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToDenseLinearAlgebraLibraryType(
435399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger    string value,
436399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger    DenseLinearAlgebraLibraryType* type);
437399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger
43879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* TrustRegionStrategyTypeToString(
43979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez    TrustRegionStrategyType type);
44079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToTrustRegionStrategyType(string value,
4410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                     TrustRegionStrategyType* type);
4420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
44379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* DoglegTypeToString(DoglegType type);
44479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToDoglegType(string value, DoglegType* type);
4450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
44679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* MinimizerTypeToString(MinimizerType type);
44779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToMinimizerType(string value, MinimizerType* type);
4481d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
44979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* LineSearchDirectionTypeToString(
45079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez    LineSearchDirectionType type);
45179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToLineSearchDirectionType(string value,
4521d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling                                     LineSearchDirectionType* type);
4531d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
45479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* LineSearchTypeToString(LineSearchType type);
45579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToLineSearchType(string value, LineSearchType* type);
4561d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
45779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* NonlinearConjugateGradientTypeToString(
4581d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    NonlinearConjugateGradientType type);
45979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToNonlinearConjugateGradientType(
4601d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    string value,
4611d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    NonlinearConjugateGradientType* type);
4621d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
46379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* LineSearchInterpolationTypeToString(
4641d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    LineSearchInterpolationType type);
46579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToLineSearchInterpolationType(
4661d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    string value,
4671d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    LineSearchInterpolationType* type);
4681d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
46979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* CovarianceAlgorithmTypeToString(
4701d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    CovarianceAlgorithmType type);
47179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool StringToCovarianceAlgorithmType(
4721d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    string value,
4731d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling    CovarianceAlgorithmType* type);
4741d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
47579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT const char* TerminationTypeToString(TerminationType type);
4760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
47779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool IsSchurType(LinearSolverType type);
47879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool IsSparseLinearAlgebraLibraryTypeAvailable(
4790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong    SparseLinearAlgebraLibraryType type);
48079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCERES_EXPORT bool IsDenseLinearAlgebraLibraryTypeAvailable(
481399f7d09e0c45af54b77b4ab9508d6f23759b927Scott Ettinger    DenseLinearAlgebraLibraryType type);
4820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
4830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}  // namespace ceres
4840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
48579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/internal/reenable_warnings.h"
48679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
4870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif  // CERES_PUBLIC_TYPES_H_
488