1// Ceres Solver - A fast non-linear least squares minimizer
2// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
3// http://code.google.com/p/ceres-solver/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7//
8// * Redistributions of source code must retain the above copyright notice,
9//   this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above copyright notice,
11//   this list of conditions and the following disclaimer in the documentation
12//   and/or other materials provided with the distribution.
13// * Neither the name of Google Inc. nor the names of its contributors may be
14//   used to endorse or promote products derived from this software without
15//   specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27// POSSIBILITY OF SUCH DAMAGE.
28//
29// Author: sameeragarwal@google.com (Sameer Agarwal)
30//
31// Enums and other top level class definitions.
32//
33// Note: internal/types.cc defines stringification routines for some
34// of these enums. Please update those routines if you extend or
35// remove enums from here.
36
37#ifndef CERES_PUBLIC_TYPES_H_
38#define CERES_PUBLIC_TYPES_H_
39
40#include <string>
41
42#include "ceres/internal/port.h"
43#include "ceres/internal/disable_warnings.h"
44
45namespace ceres {
46
47// Basic integer types. These typedefs are in the Ceres namespace to avoid
48// conflicts with other packages having similar typedefs.
49typedef int   int32;
50
51// Argument type used in interfaces that can optionally take ownership
52// of a passed in argument. If TAKE_OWNERSHIP is passed, the called
53// object takes ownership of the pointer argument, and will call
54// delete on it upon completion.
55enum Ownership {
56  DO_NOT_TAKE_OWNERSHIP,
57  TAKE_OWNERSHIP
58};
59
60// TODO(keir): Considerably expand the explanations of each solver type.
61enum LinearSolverType {
62  // These solvers are for general rectangular systems formed from the
63  // normal equations A'A x = A'b. They are direct solvers and do not
64  // assume any special problem structure.
65
66  // Solve the normal equations using a dense Cholesky solver; based
67  // on Eigen.
68  DENSE_NORMAL_CHOLESKY,
69
70  // Solve the normal equations using a dense QR solver; based on
71  // Eigen.
72  DENSE_QR,
73
74  // Solve the normal equations using a sparse cholesky solver; requires
75  // SuiteSparse or CXSparse.
76  SPARSE_NORMAL_CHOLESKY,
77
78  // Specialized solvers, specific to problems with a generalized
79  // bi-partitite structure.
80
81  // Solves the reduced linear system using a dense Cholesky solver;
82  // based on Eigen.
83  DENSE_SCHUR,
84
85  // Solves the reduced linear system using a sparse Cholesky solver;
86  // based on CHOLMOD.
87  SPARSE_SCHUR,
88
89  // Solves the reduced linear system using Conjugate Gradients, based
90  // on a new Ceres implementation.  Suitable for large scale
91  // problems.
92  ITERATIVE_SCHUR,
93
94  // Conjugate gradients on the normal equations.
95  CGNR
96};
97
98enum PreconditionerType {
99  // Trivial preconditioner - the identity matrix.
100  IDENTITY,
101
102  // Block diagonal of the Gauss-Newton Hessian.
103  JACOBI,
104
105  // Note: The following three preconditioners can only be used with
106  // the ITERATIVE_SCHUR solver. They are well suited for Structure
107  // from Motion problems.
108
109  // Block diagonal of the Schur complement. This preconditioner may
110  // only be used with the ITERATIVE_SCHUR solver.
111  SCHUR_JACOBI,
112
113  // Visibility clustering based preconditioners.
114  //
115  // The following two preconditioners use the visibility structure of
116  // the scene to determine the sparsity structure of the
117  // preconditioner. This is done using a clustering algorithm. The
118  // available visibility clustering algorithms are described below.
119  //
120  // Note: Requires SuiteSparse.
121  CLUSTER_JACOBI,
122  CLUSTER_TRIDIAGONAL
123};
124
125enum VisibilityClusteringType {
126  // Canonical views algorithm as described in
127  //
128  // "Scene Summarization for Online Image Collections", Ian Simon, Noah
129  // Snavely, Steven M. Seitz, ICCV 2007.
130  //
131  // This clustering algorithm can be quite slow, but gives high
132  // quality clusters. The original visibility based clustering paper
133  // used this algorithm.
134  CANONICAL_VIEWS,
135
136  // The classic single linkage algorithm. It is extremely fast as
137  // compared to CANONICAL_VIEWS, but can give slightly poorer
138  // results. For problems with large number of cameras though, this
139  // is generally a pretty good option.
140  //
141  // If you are using SCHUR_JACOBI preconditioner and have SuiteSparse
142  // available, CLUSTER_JACOBI and CLUSTER_TRIDIAGONAL in combination
143  // with the SINGLE_LINKAGE algorithm will generally give better
144  // results.
145  SINGLE_LINKAGE
146};
147
148enum SparseLinearAlgebraLibraryType {
149  // High performance sparse Cholesky factorization and approximate
150  // minimum degree ordering.
151  SUITE_SPARSE,
152
153  // A lightweight replacment for SuiteSparse, which does not require
154  // a LAPACK/BLAS implementation. Consequently, its performance is
155  // also a bit lower than SuiteSparse.
156  CX_SPARSE,
157
158  // Eigen's sparse linear algebra routines. In particular Ceres uses
159  // the Simplicial LDLT routines.
160  EIGEN_SPARSE
161};
162
163enum DenseLinearAlgebraLibraryType {
164  EIGEN,
165  LAPACK
166};
167
168// Logging options
169// The options get progressively noisier.
170enum LoggingType {
171  SILENT,
172  PER_MINIMIZER_ITERATION
173};
174
175enum MinimizerType {
176  LINE_SEARCH,
177  TRUST_REGION
178};
179
180enum LineSearchDirectionType {
181  // Negative of the gradient.
182  STEEPEST_DESCENT,
183
184  // A generalization of the Conjugate Gradient method to non-linear
185  // functions. The generalization can be performed in a number of
186  // different ways, resulting in a variety of search directions. The
187  // precise choice of the non-linear conjugate gradient algorithm
188  // used is determined by NonlinerConjuateGradientType.
189  NONLINEAR_CONJUGATE_GRADIENT,
190
191  // BFGS, and it's limited memory approximation L-BFGS, are quasi-Newton
192  // algorithms that approximate the Hessian matrix by iteratively refining
193  // an initial estimate with rank-one updates using the gradient at each
194  // iteration. They are a generalisation of the Secant method and satisfy
195  // the Secant equation.  The Secant equation has an infinium of solutions
196  // in multiple dimensions, as there are N*(N+1)/2 degrees of freedom in a
197  // symmetric matrix but only N conditions are specified by the Secant
198  // equation. The requirement that the Hessian approximation be positive
199  // definite imposes another N additional constraints, but that still leaves
200  // remaining degrees-of-freedom.  (L)BFGS methods uniquely deteremine the
201  // approximate Hessian by imposing the additional constraints that the
202  // approximation at the next iteration must be the 'closest' to the current
203  // approximation (the nature of how this proximity is measured is actually
204  // the defining difference between a family of quasi-Newton methods including
205  // (L)BFGS & DFP). (L)BFGS is currently regarded as being the best known
206  // general quasi-Newton method.
207  //
208  // The principal difference between BFGS and L-BFGS is that whilst BFGS
209  // maintains a full, dense approximation to the (inverse) Hessian, L-BFGS
210  // maintains only a window of the last M observations of the parameters and
211  // gradients. Using this observation history, the calculation of the next
212  // search direction can be computed without requiring the construction of the
213  // full dense inverse Hessian approximation. This is particularly important
214  // for problems with a large number of parameters, where storage of an N-by-N
215  // matrix in memory would be prohibitive.
216  //
217  // For more details on BFGS see:
218  //
219  // Broyden, C.G., "The Convergence of a Class of Double-rank Minimization
220  // Algorithms,"; J. Inst. Maths. Applics., Vol. 6, pp 76–90, 1970.
221  //
222  // Fletcher, R., "A New Approach to Variable Metric Algorithms,"
223  // Computer Journal, Vol. 13, pp 317–322, 1970.
224  //
225  // Goldfarb, D., "A Family of Variable Metric Updates Derived by Variational
226  // Means," Mathematics of Computing, Vol. 24, pp 23–26, 1970.
227  //
228  // Shanno, D.F., "Conditioning of Quasi-Newton Methods for Function
229  // Minimization," Mathematics of Computing, Vol. 24, pp 647–656, 1970.
230  //
231  // For more details on L-BFGS see:
232  //
233  // Nocedal, J. (1980). "Updating Quasi-Newton Matrices with Limited
234  // Storage". Mathematics of Computation 35 (151): 773–782.
235  //
236  // Byrd, R. H.; Nocedal, J.; Schnabel, R. B. (1994).
237  // "Representations of Quasi-Newton Matrices and their use in
238  // Limited Memory Methods". Mathematical Programming 63 (4):
239  // 129–156.
240  //
241  // A general reference for both methods:
242  //
243  // Nocedal J., Wright S., Numerical Optimization, 2nd Ed. Springer, 1999.
244  LBFGS,
245  BFGS,
246};
247
248// Nonliner conjugate gradient methods are a generalization of the
249// method of Conjugate Gradients for linear systems. The
250// generalization can be carried out in a number of different ways
251// leading to number of different rules for computing the search
252// direction. Ceres provides a number of different variants. For more
253// details see Numerical Optimization by Nocedal & Wright.
254enum NonlinearConjugateGradientType {
255  FLETCHER_REEVES,
256  POLAK_RIBIERE,
257  HESTENES_STIEFEL,
258};
259
260enum LineSearchType {
261  // Backtracking line search with polynomial interpolation or
262  // bisection.
263  ARMIJO,
264  WOLFE,
265};
266
267// Ceres supports different strategies for computing the trust region
268// step.
269enum TrustRegionStrategyType {
270  // The default trust region strategy is to use the step computation
271  // used in the Levenberg-Marquardt algorithm. For more details see
272  // levenberg_marquardt_strategy.h
273  LEVENBERG_MARQUARDT,
274
275  // Powell's dogleg algorithm interpolates between the Cauchy point
276  // and the Gauss-Newton step. It is particularly useful if the
277  // LEVENBERG_MARQUARDT algorithm is making a large number of
278  // unsuccessful steps. For more details see dogleg_strategy.h.
279  //
280  // NOTES:
281  //
282  // 1. This strategy has not been experimented with or tested as
283  // extensively as LEVENBERG_MARQUARDT, and therefore it should be
284  // considered EXPERIMENTAL for now.
285  //
286  // 2. For now this strategy should only be used with exact
287  // factorization based linear solvers, i.e., SPARSE_SCHUR,
288  // DENSE_SCHUR, DENSE_QR and SPARSE_NORMAL_CHOLESKY.
289  DOGLEG
290};
291
292// Ceres supports two different dogleg strategies.
293// The "traditional" dogleg method by Powell and the
294// "subspace" method described in
295// R. H. Byrd, R. B. Schnabel, and G. A. Shultz,
296// "Approximate solution of the trust region problem by minimization
297//  over two-dimensional subspaces", Mathematical Programming,
298// 40 (1988), pp. 247--263
299enum DoglegType {
300  // The traditional approach constructs a dogleg path
301  // consisting of two line segments and finds the furthest
302  // point on that path that is still inside the trust region.
303  TRADITIONAL_DOGLEG,
304
305  // The subspace approach finds the exact minimum of the model
306  // constrained to the subspace spanned by the dogleg path.
307  SUBSPACE_DOGLEG
308};
309
310enum TerminationType {
311  // Minimizer terminated because one of the convergence criterion set
312  // by the user was satisfied.
313  //
314  // 1.  (new_cost - old_cost) < function_tolerance * old_cost;
315  // 2.  max_i |gradient_i| < gradient_tolerance
316  // 3.  |step|_2 <= parameter_tolerance * ( |x|_2 +  parameter_tolerance)
317  //
318  // The user's parameter blocks will be updated with the solution.
319  CONVERGENCE,
320
321  // The solver ran for maximum number of iterations or maximum amount
322  // of time specified by the user, but none of the convergence
323  // criterion specified by the user were met. The user's parameter
324  // blocks will be updated with the solution found so far.
325  NO_CONVERGENCE,
326
327  // The minimizer terminated because of an error.  The user's
328  // parameter blocks will not be updated.
329  FAILURE,
330
331  // Using an IterationCallback object, user code can control the
332  // minimizer. The following enums indicate that the user code was
333  // responsible for termination.
334  //
335  // Minimizer terminated successfully because a user
336  // IterationCallback returned SOLVER_TERMINATE_SUCCESSFULLY.
337  //
338  // The user's parameter blocks will be updated with the solution.
339  USER_SUCCESS,
340
341  // Minimizer terminated because because a user IterationCallback
342  // returned SOLVER_ABORT.
343  //
344  // The user's parameter blocks will not be updated.
345  USER_FAILURE
346};
347
348// Enums used by the IterationCallback instances to indicate to the
349// solver whether it should continue solving, the user detected an
350// error or the solution is good enough and the solver should
351// terminate.
352enum CallbackReturnType {
353  // Continue solving to next iteration.
354  SOLVER_CONTINUE,
355
356  // Terminate solver, and do not update the parameter blocks upon
357  // return. Unless the user has set
358  // Solver:Options:::update_state_every_iteration, in which case the
359  // state would have been updated every iteration
360  // anyways. Solver::Summary::termination_type is set to USER_ABORT.
361  SOLVER_ABORT,
362
363  // Terminate solver, update state and
364  // return. Solver::Summary::termination_type is set to USER_SUCCESS.
365  SOLVER_TERMINATE_SUCCESSFULLY
366};
367
368// The format in which linear least squares problems should be logged
369// when Solver::Options::lsqp_iterations_to_dump is non-empty.
370enum DumpFormatType {
371  // Print the linear least squares problem in a human readable format
372  // to stderr. The Jacobian is printed as a dense matrix. The vectors
373  // D, x and f are printed as dense vectors. This should only be used
374  // for small problems.
375  CONSOLE,
376
377  // Write out the linear least squares problem to the directory
378  // pointed to by Solver::Options::lsqp_dump_directory as text files
379  // which can be read into MATLAB/Octave. The Jacobian is dumped as a
380  // text file containing (i,j,s) triplets, the vectors D, x and f are
381  // dumped as text files containing a list of their values.
382  //
383  // A MATLAB/octave script called lm_iteration_???.m is also output,
384  // which can be used to parse and load the problem into memory.
385  TEXTFILE
386};
387
388// For SizedCostFunction and AutoDiffCostFunction, DYNAMIC can be
389// specified for the number of residuals. If specified, then the
390// number of residuas for that cost function can vary at runtime.
391enum DimensionType {
392  DYNAMIC = -1
393};
394
395enum NumericDiffMethod {
396  CENTRAL,
397  FORWARD
398};
399
400enum LineSearchInterpolationType {
401  BISECTION,
402  QUADRATIC,
403  CUBIC
404};
405
406enum CovarianceAlgorithmType {
407  DENSE_SVD,
408  SUITE_SPARSE_QR,
409  EIGEN_SPARSE_QR
410};
411
412CERES_EXPORT const char* LinearSolverTypeToString(
413    LinearSolverType type);
414CERES_EXPORT bool StringToLinearSolverType(string value,
415                                           LinearSolverType* type);
416
417CERES_EXPORT const char* PreconditionerTypeToString(PreconditionerType type);
418CERES_EXPORT bool StringToPreconditionerType(string value,
419                                             PreconditionerType* type);
420
421CERES_EXPORT const char* VisibilityClusteringTypeToString(
422    VisibilityClusteringType type);
423CERES_EXPORT bool StringToVisibilityClusteringType(string value,
424                                      VisibilityClusteringType* type);
425
426CERES_EXPORT const char* SparseLinearAlgebraLibraryTypeToString(
427    SparseLinearAlgebraLibraryType type);
428CERES_EXPORT bool StringToSparseLinearAlgebraLibraryType(
429    string value,
430    SparseLinearAlgebraLibraryType* type);
431
432CERES_EXPORT const char* DenseLinearAlgebraLibraryTypeToString(
433    DenseLinearAlgebraLibraryType type);
434CERES_EXPORT bool StringToDenseLinearAlgebraLibraryType(
435    string value,
436    DenseLinearAlgebraLibraryType* type);
437
438CERES_EXPORT const char* TrustRegionStrategyTypeToString(
439    TrustRegionStrategyType type);
440CERES_EXPORT bool StringToTrustRegionStrategyType(string value,
441                                     TrustRegionStrategyType* type);
442
443CERES_EXPORT const char* DoglegTypeToString(DoglegType type);
444CERES_EXPORT bool StringToDoglegType(string value, DoglegType* type);
445
446CERES_EXPORT const char* MinimizerTypeToString(MinimizerType type);
447CERES_EXPORT bool StringToMinimizerType(string value, MinimizerType* type);
448
449CERES_EXPORT const char* LineSearchDirectionTypeToString(
450    LineSearchDirectionType type);
451CERES_EXPORT bool StringToLineSearchDirectionType(string value,
452                                     LineSearchDirectionType* type);
453
454CERES_EXPORT const char* LineSearchTypeToString(LineSearchType type);
455CERES_EXPORT bool StringToLineSearchType(string value, LineSearchType* type);
456
457CERES_EXPORT const char* NonlinearConjugateGradientTypeToString(
458    NonlinearConjugateGradientType type);
459CERES_EXPORT bool StringToNonlinearConjugateGradientType(
460    string value,
461    NonlinearConjugateGradientType* type);
462
463CERES_EXPORT const char* LineSearchInterpolationTypeToString(
464    LineSearchInterpolationType type);
465CERES_EXPORT bool StringToLineSearchInterpolationType(
466    string value,
467    LineSearchInterpolationType* type);
468
469CERES_EXPORT const char* CovarianceAlgorithmTypeToString(
470    CovarianceAlgorithmType type);
471CERES_EXPORT bool StringToCovarianceAlgorithmType(
472    string value,
473    CovarianceAlgorithmType* type);
474
475CERES_EXPORT const char* TerminationTypeToString(TerminationType type);
476
477CERES_EXPORT bool IsSchurType(LinearSolverType type);
478CERES_EXPORT bool IsSparseLinearAlgebraLibraryTypeAvailable(
479    SparseLinearAlgebraLibraryType type);
480CERES_EXPORT bool IsDenseLinearAlgebraLibraryTypeAvailable(
481    DenseLinearAlgebraLibraryType type);
482
483}  // namespace ceres
484
485#include "ceres/internal/reenable_warnings.h"
486
487#endif  // CERES_PUBLIC_TYPES_H_
488