• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "ceres/internal/port.h"
41 
42 namespace ceres {
43 
44 // Basic integer types. These typedefs are in the Ceres namespace to avoid
45 // conflicts with other packages having similar typedefs.
46 typedef short int16;
47 typedef int   int32;
48 
49 // Argument type used in interfaces that can optionally take ownership
50 // of a passed in argument. If TAKE_OWNERSHIP is passed, the called
51 // object takes ownership of the pointer argument, and will call
52 // delete on it upon completion.
53 enum Ownership {
54   DO_NOT_TAKE_OWNERSHIP,
55   TAKE_OWNERSHIP
56 };
57 
58 // TODO(keir): Considerably expand the explanations of each solver type.
59 enum LinearSolverType {
60   // These solvers are for general rectangular systems formed from the
61   // normal equations A'A x = A'b. They are direct solvers and do not
62   // assume any special problem structure.
63 
64   // Solve the normal equations using a dense Cholesky solver; based
65   // on Eigen.
66   DENSE_NORMAL_CHOLESKY,
67 
68   // Solve the normal equations using a dense QR solver; based on
69   // Eigen.
70   DENSE_QR,
71 
72   // Solve the normal equations using a sparse cholesky solver; requires
73   // SuiteSparse or CXSparse.
74   SPARSE_NORMAL_CHOLESKY,
75 
76   // Specialized solvers, specific to problems with a generalized
77   // bi-partitite structure.
78 
79   // Solves the reduced linear system using a dense Cholesky solver;
80   // based on Eigen.
81   DENSE_SCHUR,
82 
83   // Solves the reduced linear system using a sparse Cholesky solver;
84   // based on CHOLMOD.
85   SPARSE_SCHUR,
86 
87   // Solves the reduced linear system using Conjugate Gradients, based
88   // on a new Ceres implementation.  Suitable for large scale
89   // problems.
90   ITERATIVE_SCHUR,
91 
92   // Conjugate gradients on the normal equations.
93   CGNR
94 };
95 
96 enum PreconditionerType {
97   // Trivial preconditioner - the identity matrix.
98   IDENTITY,
99 
100   // Block diagonal of the Gauss-Newton Hessian.
101   JACOBI,
102 
103   // Block diagonal of the Schur complement. This preconditioner may
104   // only be used with the ITERATIVE_SCHUR solver. Requires
105   // SuiteSparse/CHOLMOD.
106   SCHUR_JACOBI,
107 
108   // Visibility clustering based preconditioners.
109   //
110   // These preconditioners are well suited for Structure from Motion
111   // problems, particularly problems arising from community photo
112   // collections. These preconditioners use the visibility structure
113   // of the scene to determine the sparsity structure of the
114   // preconditioner. Requires SuiteSparse/CHOLMOD.
115   CLUSTER_JACOBI,
116   CLUSTER_TRIDIAGONAL
117 };
118 
119 enum SparseLinearAlgebraLibraryType {
120   // High performance sparse Cholesky factorization and approximate
121   // minimum degree ordering.
122   SUITE_SPARSE,
123 
124   // A lightweight replacment for SuiteSparse.
125   CX_SPARSE
126 };
127 
128 enum LinearSolverTerminationType {
129   // Termination criterion was met. For factorization based solvers
130   // the tolerance is assumed to be zero. Any user provided values are
131   // ignored.
132   TOLERANCE,
133 
134   // Solver ran for max_num_iterations and terminated before the
135   // termination tolerance could be satified.
136   MAX_ITERATIONS,
137 
138   // Solver is stuck and further iterations will not result in any
139   // measurable progress.
140   STAGNATION,
141 
142   // Solver failed. Solver was terminated due to numerical errors. The
143   // exact cause of failure depends on the particular solver being
144   // used.
145   FAILURE
146 };
147 
148 // Logging options
149 // The options get progressively noisier.
150 enum LoggingType {
151   SILENT,
152   PER_MINIMIZER_ITERATION
153 };
154 
155 // Ceres supports different strategies for computing the trust region
156 // step.
157 enum TrustRegionStrategyType {
158   // The default trust region strategy is to use the step computation
159   // used in the Levenberg-Marquardt algorithm. For more details see
160   // levenberg_marquardt_strategy.h
161   LEVENBERG_MARQUARDT,
162 
163   // Powell's dogleg algorithm interpolates between the Cauchy point
164   // and the Gauss-Newton step. It is particularly useful if the
165   // LEVENBERG_MARQUARDT algorithm is making a large number of
166   // unsuccessful steps. For more details see dogleg_strategy.h.
167   //
168   // NOTES:
169   //
170   // 1. This strategy has not been experimented with or tested as
171   // extensively as LEVENBERG_MARQUARDT, and therefore it should be
172   // considered EXPERIMENTAL for now.
173   //
174   // 2. For now this strategy should only be used with exact
175   // factorization based linear solvers, i.e., SPARSE_SCHUR,
176   // DENSE_SCHUR, DENSE_QR and SPARSE_NORMAL_CHOLESKY.
177   DOGLEG
178 };
179 
180 // Ceres supports two different dogleg strategies.
181 // The "traditional" dogleg method by Powell and the
182 // "subspace" method described in
183 // R. H. Byrd, R. B. Schnabel, and G. A. Shultz,
184 // "Approximate solution of the trust region problem by minimization
185 //  over two-dimensional subspaces", Mathematical Programming,
186 // 40 (1988), pp. 247--263
187 enum DoglegType {
188   // The traditional approach constructs a dogleg path
189   // consisting of two line segments and finds the furthest
190   // point on that path that is still inside the trust region.
191   TRADITIONAL_DOGLEG,
192 
193   // The subspace approach finds the exact minimum of the model
194   // constrained to the subspace spanned by the dogleg path.
195   SUBSPACE_DOGLEG
196 };
197 
198 enum SolverTerminationType {
199   // The minimizer did not run at all; usually due to errors in the user's
200   // Problem or the solver options.
201   DID_NOT_RUN,
202 
203   // The solver ran for maximum number of iterations specified by the
204   // user, but none of the convergence criterion specified by the user
205   // were met.
206   NO_CONVERGENCE,
207 
208   // Minimizer terminated because
209   //  (new_cost - old_cost) < function_tolerance * old_cost;
210   FUNCTION_TOLERANCE,
211 
212   // Minimizer terminated because
213   // max_i |gradient_i| < gradient_tolerance * max_i|initial_gradient_i|
214   GRADIENT_TOLERANCE,
215 
216   // Minimized terminated because
217   //  |step|_2 <= parameter_tolerance * ( |x|_2 +  parameter_tolerance)
218   PARAMETER_TOLERANCE,
219 
220   // The minimizer terminated because it encountered a numerical error
221   // that it could not recover from.
222   NUMERICAL_FAILURE,
223 
224   // Using an IterationCallback object, user code can control the
225   // minimizer. The following enums indicate that the user code was
226   // responsible for termination.
227 
228   // User's IterationCallback returned SOLVER_ABORT.
229   USER_ABORT,
230 
231   // User's IterationCallback returned SOLVER_TERMINATE_SUCCESSFULLY
232   USER_SUCCESS
233 };
234 
235 // Enums used by the IterationCallback instances to indicate to the
236 // solver whether it should continue solving, the user detected an
237 // error or the solution is good enough and the solver should
238 // terminate.
239 enum CallbackReturnType {
240   // Continue solving to next iteration.
241   SOLVER_CONTINUE,
242 
243   // Terminate solver, and do not update the parameter blocks upon
244   // return. Unless the user has set
245   // Solver:Options:::update_state_every_iteration, in which case the
246   // state would have been updated every iteration
247   // anyways. Solver::Summary::termination_type is set to USER_ABORT.
248   SOLVER_ABORT,
249 
250   // Terminate solver, update state and
251   // return. Solver::Summary::termination_type is set to USER_SUCCESS.
252   SOLVER_TERMINATE_SUCCESSFULLY
253 };
254 
255 // The format in which linear least squares problems should be logged
256 // when Solver::Options::lsqp_iterations_to_dump is non-empty.
257 enum DumpFormatType {
258   // Print the linear least squares problem in a human readable format
259   // to stderr. The Jacobian is printed as a dense matrix. The vectors
260   // D, x and f are printed as dense vectors. This should only be used
261   // for small problems.
262   CONSOLE,
263 
264   // Write out the linear least squares problem to the directory
265   // pointed to by Solver::Options::lsqp_dump_directory as a protocol
266   // buffer. linear_least_squares_problems.h/cc contains routines for
267   // loading these problems. For details on the on disk format used,
268   // see matrix.proto. The files are named lm_iteration_???.lsqp.
269   PROTOBUF,
270 
271   // Write out the linear least squares problem to the directory
272   // pointed to by Solver::Options::lsqp_dump_directory as text files
273   // which can be read into MATLAB/Octave. The Jacobian is dumped as a
274   // text file containing (i,j,s) triplets, the vectors D, x and f are
275   // dumped as text files containing a list of their values.
276   //
277   // A MATLAB/octave script called lm_iteration_???.m is also output,
278   // which can be used to parse and load the problem into memory.
279   TEXTFILE
280 };
281 
282 // For SizedCostFunction and AutoDiffCostFunction, DYNAMIC can be specified for
283 // the number of residuals. If specified, then the number of residuas for that
284 // cost function can vary at runtime.
285 enum DimensionType {
286   DYNAMIC = -1
287 };
288 
289 const char* LinearSolverTypeToString(LinearSolverType type);
290 bool StringToLinearSolverType(string value, LinearSolverType* type);
291 
292 const char* PreconditionerTypeToString(PreconditionerType type);
293 bool StringToPreconditionerType(string value, PreconditionerType* type);
294 
295 const char* SparseLinearAlgebraLibraryTypeToString(
296     SparseLinearAlgebraLibraryType type);
297 bool StringToSparseLinearAlgebraLibraryType(
298     string value,
299     SparseLinearAlgebraLibraryType* type);
300 
301 const char* TrustRegionStrategyTypeToString(TrustRegionStrategyType type);
302 bool StringToTrustRegionStrategyType(string value,
303                                      TrustRegionStrategyType* type);
304 
305 const char* DoglegTypeToString(DoglegType type);
306 bool StringToDoglegType(string value, DoglegType* type);
307 
308 const char* LinearSolverTerminationTypeToString(
309     LinearSolverTerminationType type);
310 
311 const char* SolverTerminationTypeToString(SolverTerminationType type);
312 
313 bool IsSchurType(LinearSolverType type);
314 bool IsSparseLinearAlgebraLibraryTypeAvailable(
315     SparseLinearAlgebraLibraryType type);
316 
317 
318 }  // namespace ceres
319 
320 #endif  // CERES_PUBLIC_TYPES_H_
321