Home | History | Annotate | Download | only in ceres
      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 (at) 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