blob: a07c8933e649548308743482fd8459f630823733 [file] [log] [blame]
Angus Kong0ae28bd2013-02-13 14:56:04 -08001// 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
Sascha Haeberling1d2624a2013-07-23 19:00:21 -070040#include <string>
41
Angus Kong0ae28bd2013-02-13 14:56:04 -080042#include "ceres/internal/port.h"
Carlos Hernandez79397c22014-08-07 17:51:38 -070043#include "ceres/internal/disable_warnings.h"
Angus Kong0ae28bd2013-02-13 14:56:04 -080044
45namespace ceres {
46
47// Basic integer types. These typedefs are in the Ceres namespace to avoid
48// conflicts with other packages having similar typedefs.
Angus Kong0ae28bd2013-02-13 14:56:04 -080049typedef 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
Carlos Hernandez79397c22014-08-07 17:51:38 -0700105 // 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
Angus Kong0ae28bd2013-02-13 14:56:04 -0800109 // Block diagonal of the Schur complement. This preconditioner may
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700110 // only be used with the ITERATIVE_SCHUR solver.
Angus Kong0ae28bd2013-02-13 14:56:04 -0800111 SCHUR_JACOBI,
112
113 // Visibility clustering based preconditioners.
114 //
Carlos Hernandez79397c22014-08-07 17:51:38 -0700115 // 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.
Angus Kong0ae28bd2013-02-13 14:56:04 -0800121 CLUSTER_JACOBI,
122 CLUSTER_TRIDIAGONAL
123};
124
Carlos Hernandez79397c22014-08-07 17:51:38 -0700125enum 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
Angus Kong0ae28bd2013-02-13 14:56:04 -0800148enum SparseLinearAlgebraLibraryType {
149 // High performance sparse Cholesky factorization and approximate
150 // minimum degree ordering.
151 SUITE_SPARSE,
152
Carlos Hernandez79397c22014-08-07 17:51:38 -0700153 // 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
Angus Kong0ae28bd2013-02-13 14:56:04 -0800161};
162
Scott Ettinger399f7d02013-09-09 12:54:43 -0700163enum DenseLinearAlgebraLibraryType {
164 EIGEN,
165 LAPACK
166};
167
Angus Kong0ae28bd2013-02-13 14:56:04 -0800168// Logging options
169// The options get progressively noisier.
170enum LoggingType {
171 SILENT,
172 PER_MINIMIZER_ITERATION
173};
174
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700175enum 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,
Carlos Hernandez79397c22014-08-07 17:51:38 -0700256 POLAK_RIBIERE,
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700257 HESTENES_STIEFEL,
258};
259
260enum LineSearchType {
261 // Backtracking line search with polynomial interpolation or
262 // bisection.
263 ARMIJO,
264 WOLFE,
265};
266
Angus Kong0ae28bd2013-02-13 14:56:04 -0800267// 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
Carlos Hernandez79397c22014-08-07 17:51:38 -0700310enum 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,
Angus Kong0ae28bd2013-02-13 14:56:04 -0800320
Carlos Hernandez79397c22014-08-07 17:51:38 -0700321 // 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.
Angus Kong0ae28bd2013-02-13 14:56:04 -0800325 NO_CONVERGENCE,
326
Carlos Hernandez79397c22014-08-07 17:51:38 -0700327 // The minimizer terminated because of an error. The user's
328 // parameter blocks will not be updated.
329 FAILURE,
Angus Kong0ae28bd2013-02-13 14:56:04 -0800330
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.
Carlos Hernandez79397c22014-08-07 17:51:38 -0700334 //
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,
Angus Kong0ae28bd2013-02-13 14:56:04 -0800340
Carlos Hernandez79397c22014-08-07 17:51:38 -0700341 // 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
Angus Kong0ae28bd2013-02-13 14:56:04 -0800346};
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
Angus Kong0ae28bd2013-02-13 14:56:04 -0800378 // 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
Carlos Hernandez79397c22014-08-07 17:51:38 -0700388// 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.
Angus Kong0ae28bd2013-02-13 14:56:04 -0800391enum DimensionType {
392 DYNAMIC = -1
393};
394
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700395enum NumericDiffMethod {
396 CENTRAL,
397 FORWARD
398};
399
400enum LineSearchInterpolationType {
401 BISECTION,
402 QUADRATIC,
403 CUBIC
404};
405
406enum CovarianceAlgorithmType {
407 DENSE_SVD,
Carlos Hernandez79397c22014-08-07 17:51:38 -0700408 SUITE_SPARSE_QR,
409 EIGEN_SPARSE_QR
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700410};
411
Carlos Hernandez79397c22014-08-07 17:51:38 -0700412CERES_EXPORT const char* LinearSolverTypeToString(
413 LinearSolverType type);
414CERES_EXPORT bool StringToLinearSolverType(string value,
415 LinearSolverType* type);
Angus Kong0ae28bd2013-02-13 14:56:04 -0800416
Carlos Hernandez79397c22014-08-07 17:51:38 -0700417CERES_EXPORT const char* PreconditionerTypeToString(PreconditionerType type);
418CERES_EXPORT bool StringToPreconditionerType(string value,
419 PreconditionerType* type);
Angus Kong0ae28bd2013-02-13 14:56:04 -0800420
Carlos Hernandez79397c22014-08-07 17:51:38 -0700421CERES_EXPORT const char* VisibilityClusteringTypeToString(
422 VisibilityClusteringType type);
423CERES_EXPORT bool StringToVisibilityClusteringType(string value,
424 VisibilityClusteringType* type);
425
426CERES_EXPORT const char* SparseLinearAlgebraLibraryTypeToString(
Angus Kong0ae28bd2013-02-13 14:56:04 -0800427 SparseLinearAlgebraLibraryType type);
Carlos Hernandez79397c22014-08-07 17:51:38 -0700428CERES_EXPORT bool StringToSparseLinearAlgebraLibraryType(
Angus Kong0ae28bd2013-02-13 14:56:04 -0800429 string value,
430 SparseLinearAlgebraLibraryType* type);
431
Carlos Hernandez79397c22014-08-07 17:51:38 -0700432CERES_EXPORT const char* DenseLinearAlgebraLibraryTypeToString(
Scott Ettinger399f7d02013-09-09 12:54:43 -0700433 DenseLinearAlgebraLibraryType type);
Carlos Hernandez79397c22014-08-07 17:51:38 -0700434CERES_EXPORT bool StringToDenseLinearAlgebraLibraryType(
Scott Ettinger399f7d02013-09-09 12:54:43 -0700435 string value,
436 DenseLinearAlgebraLibraryType* type);
437
Carlos Hernandez79397c22014-08-07 17:51:38 -0700438CERES_EXPORT const char* TrustRegionStrategyTypeToString(
439 TrustRegionStrategyType type);
440CERES_EXPORT bool StringToTrustRegionStrategyType(string value,
Angus Kong0ae28bd2013-02-13 14:56:04 -0800441 TrustRegionStrategyType* type);
442
Carlos Hernandez79397c22014-08-07 17:51:38 -0700443CERES_EXPORT const char* DoglegTypeToString(DoglegType type);
444CERES_EXPORT bool StringToDoglegType(string value, DoglegType* type);
Angus Kong0ae28bd2013-02-13 14:56:04 -0800445
Carlos Hernandez79397c22014-08-07 17:51:38 -0700446CERES_EXPORT const char* MinimizerTypeToString(MinimizerType type);
447CERES_EXPORT bool StringToMinimizerType(string value, MinimizerType* type);
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700448
Carlos Hernandez79397c22014-08-07 17:51:38 -0700449CERES_EXPORT const char* LineSearchDirectionTypeToString(
450 LineSearchDirectionType type);
451CERES_EXPORT bool StringToLineSearchDirectionType(string value,
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700452 LineSearchDirectionType* type);
453
Carlos Hernandez79397c22014-08-07 17:51:38 -0700454CERES_EXPORT const char* LineSearchTypeToString(LineSearchType type);
455CERES_EXPORT bool StringToLineSearchType(string value, LineSearchType* type);
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700456
Carlos Hernandez79397c22014-08-07 17:51:38 -0700457CERES_EXPORT const char* NonlinearConjugateGradientTypeToString(
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700458 NonlinearConjugateGradientType type);
Carlos Hernandez79397c22014-08-07 17:51:38 -0700459CERES_EXPORT bool StringToNonlinearConjugateGradientType(
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700460 string value,
461 NonlinearConjugateGradientType* type);
462
Carlos Hernandez79397c22014-08-07 17:51:38 -0700463CERES_EXPORT const char* LineSearchInterpolationTypeToString(
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700464 LineSearchInterpolationType type);
Carlos Hernandez79397c22014-08-07 17:51:38 -0700465CERES_EXPORT bool StringToLineSearchInterpolationType(
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700466 string value,
467 LineSearchInterpolationType* type);
468
Carlos Hernandez79397c22014-08-07 17:51:38 -0700469CERES_EXPORT const char* CovarianceAlgorithmTypeToString(
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700470 CovarianceAlgorithmType type);
Carlos Hernandez79397c22014-08-07 17:51:38 -0700471CERES_EXPORT bool StringToCovarianceAlgorithmType(
Sascha Haeberling1d2624a2013-07-23 19:00:21 -0700472 string value,
473 CovarianceAlgorithmType* type);
474
Carlos Hernandez79397c22014-08-07 17:51:38 -0700475CERES_EXPORT const char* TerminationTypeToString(TerminationType type);
Angus Kong0ae28bd2013-02-13 14:56:04 -0800476
Carlos Hernandez79397c22014-08-07 17:51:38 -0700477CERES_EXPORT bool IsSchurType(LinearSolverType type);
478CERES_EXPORT bool IsSparseLinearAlgebraLibraryTypeAvailable(
Angus Kong0ae28bd2013-02-13 14:56:04 -0800479 SparseLinearAlgebraLibraryType type);
Carlos Hernandez79397c22014-08-07 17:51:38 -0700480CERES_EXPORT bool IsDenseLinearAlgebraLibraryTypeAvailable(
Scott Ettinger399f7d02013-09-09 12:54:43 -0700481 DenseLinearAlgebraLibraryType type);
Angus Kong0ae28bd2013-02-13 14:56:04 -0800482
483} // namespace ceres
484
Carlos Hernandez79397c22014-08-07 17:51:38 -0700485#include "ceres/internal/reenable_warnings.h"
486
Angus Kong0ae28bd2013-02-13 14:56:04 -0800487#endif // CERES_PUBLIC_TYPES_H_