blob: 164185eecb9cfc6787559675d0e96ccb88b96a60 [file] [log] [blame]
Keir Mierle8ebb0732012-04-30 23:09:08 -07001// 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
Sameer Agarwalcbae8562012-09-02 13:50:43 -070031#include <algorithm>
Keir Mierle27dd0d32012-10-15 13:52:36 -070032#include <cctype>
Keir Mierle8ebb0732012-04-30 23:09:08 -070033#include <string>
34#include "ceres/types.h"
Sameer Agarwalcbae8562012-09-02 13:50:43 -070035#include "glog/logging.h"
Keir Mierle8ebb0732012-04-30 23:09:08 -070036
37namespace ceres {
38
39#define CASESTR(x) case x: return #x
Sameer Agarwalcbae8562012-09-02 13:50:43 -070040#define STRENUM(x) if (value == #x) { *type = x; return true;}
41
Sergey Sharybinb53c9662013-02-25 01:14:26 +060042static void UpperCase(string* input) {
Sameer Agarwalcbae8562012-09-02 13:50:43 -070043 std::transform(input->begin(), input->end(), input->begin(), ::toupper);
44}
45
Sameer Agarwal1afd4982012-11-29 10:28:11 -080046const char* LinearSolverTypeToString(LinearSolverType type) {
47 switch (type) {
Sameer Agarwalb9f15a52012-08-18 13:06:19 -070048 CASESTR(DENSE_NORMAL_CHOLESKY);
Keir Mierle8ebb0732012-04-30 23:09:08 -070049 CASESTR(DENSE_QR);
Sameer Agarwalb9f15a52012-08-18 13:06:19 -070050 CASESTR(SPARSE_NORMAL_CHOLESKY);
Keir Mierle8ebb0732012-04-30 23:09:08 -070051 CASESTR(DENSE_SCHUR);
52 CASESTR(SPARSE_SCHUR);
53 CASESTR(ITERATIVE_SCHUR);
Keir Mierlee2a6cdc2012-05-07 06:39:56 -070054 CASESTR(CGNR);
Keir Mierle8ebb0732012-04-30 23:09:08 -070055 default:
56 return "UNKNOWN";
57 }
58}
59
Sameer Agarwalcbae8562012-09-02 13:50:43 -070060bool StringToLinearSolverType(string value, LinearSolverType* type) {
61 UpperCase(&value);
62 STRENUM(DENSE_NORMAL_CHOLESKY);
63 STRENUM(DENSE_QR);
64 STRENUM(SPARSE_NORMAL_CHOLESKY);
65 STRENUM(DENSE_SCHUR);
66 STRENUM(SPARSE_SCHUR);
67 STRENUM(ITERATIVE_SCHUR);
68 STRENUM(CGNR);
69 return false;
70}
71
Sameer Agarwal1afd4982012-11-29 10:28:11 -080072const char* PreconditionerTypeToString(PreconditionerType type) {
73 switch (type) {
Keir Mierle8ebb0732012-04-30 23:09:08 -070074 CASESTR(IDENTITY);
75 CASESTR(JACOBI);
76 CASESTR(SCHUR_JACOBI);
77 CASESTR(CLUSTER_JACOBI);
78 CASESTR(CLUSTER_TRIDIAGONAL);
79 default:
80 return "UNKNOWN";
81 }
82}
83
Sameer Agarwalcbae8562012-09-02 13:50:43 -070084bool StringToPreconditionerType(string value, PreconditionerType* type) {
85 UpperCase(&value);
86 STRENUM(IDENTITY);
87 STRENUM(JACOBI);
88 STRENUM(SCHUR_JACOBI);
89 STRENUM(CLUSTER_JACOBI);
90 STRENUM(CLUSTER_TRIDIAGONAL);
91 return false;
92}
93
Sameer Agarwalb0518732012-05-29 00:27:57 -070094const char* SparseLinearAlgebraLibraryTypeToString(
Sameer Agarwal1afd4982012-11-29 10:28:11 -080095 SparseLinearAlgebraLibraryType type) {
96 switch (type) {
Sameer Agarwalb0518732012-05-29 00:27:57 -070097 CASESTR(SUITE_SPARSE);
98 CASESTR(CX_SPARSE);
99 default:
100 return "UNKNOWN";
101 }
102}
103
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700104
105bool StringToSparseLinearAlgebraLibraryType(
106 string value,
107 SparseLinearAlgebraLibraryType* type) {
108 UpperCase(&value);
109 STRENUM(SUITE_SPARSE);
110 STRENUM(CX_SPARSE);
111 return false;
112}
113
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800114const char* TrustRegionStrategyTypeToString(TrustRegionStrategyType type) {
115 switch (type) {
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700116 CASESTR(LEVENBERG_MARQUARDT);
117 CASESTR(DOGLEG);
118 default:
119 return "UNKNOWN";
120 }
121}
122
123bool StringToTrustRegionStrategyType(string value,
124 TrustRegionStrategyType* type) {
125 UpperCase(&value);
126 STRENUM(LEVENBERG_MARQUARDT);
127 STRENUM(DOGLEG);
128 return false;
129}
130
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800131const char* DoglegTypeToString(DoglegType type) {
132 switch (type) {
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700133 CASESTR(TRADITIONAL_DOGLEG);
134 CASESTR(SUBSPACE_DOGLEG);
135 default:
136 return "UNKNOWN";
137 }
138}
139
140bool StringToDoglegType(string value, DoglegType* type) {
141 UpperCase(&value);
142 STRENUM(TRADITIONAL_DOGLEG);
143 STRENUM(SUBSPACE_DOGLEG);
144 return false;
145}
146
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800147const char* MinimizerTypeToString(MinimizerType type) {
148 switch (type) {
149 CASESTR(TRUST_REGION);
150 CASESTR(LINE_SEARCH);
151 default:
152 return "UNKNOWN";
153 }
154}
155
156bool StringToMinimizerType(string value, MinimizerType* type) {
157 UpperCase(&value);
158 STRENUM(TRUST_REGION);
159 STRENUM(LINE_SEARCH);
160 return false;
161}
162
163const char* LineSearchDirectionTypeToString(LineSearchDirectionType type) {
164 switch (type) {
165 CASESTR(STEEPEST_DESCENT);
166 CASESTR(NONLINEAR_CONJUGATE_GRADIENT);
167 CASESTR(LBFGS);
Alex Stewart9aa0e3c2013-07-05 20:22:37 +0100168 CASESTR(BFGS);
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800169 default:
170 return "UNKNOWN";
171 }
172}
173
174bool StringToLineSearchDirectionType(string value,
175 LineSearchDirectionType* type) {
176 UpperCase(&value);
177 STRENUM(STEEPEST_DESCENT);
178 STRENUM(NONLINEAR_CONJUGATE_GRADIENT);
179 STRENUM(LBFGS);
Alex Stewart9aa0e3c2013-07-05 20:22:37 +0100180 STRENUM(BFGS);
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800181 return false;
182}
183
184const char* LineSearchTypeToString(LineSearchType type) {
185 switch (type) {
186 CASESTR(ARMIJO);
Alex Stewart9aa0e3c2013-07-05 20:22:37 +0100187 CASESTR(WOLFE);
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800188 default:
189 return "UNKNOWN";
190 }
191}
192
193bool StringToLineSearchType(string value, LineSearchType* type) {
194 UpperCase(&value);
195 STRENUM(ARMIJO);
Alex Stewart9aa0e3c2013-07-05 20:22:37 +0100196 STRENUM(WOLFE);
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800197 return false;
198}
199
Sameer Agarwal09244012013-06-30 14:33:23 -0700200const char* LineSearchInterpolationTypeToString(
201 LineSearchInterpolationType type) {
202 switch (type) {
203 CASESTR(BISECTION);
204 CASESTR(QUADRATIC);
205 CASESTR(CUBIC);
206 default:
207 return "UNKNOWN";
208 }
209}
210
211bool StringToLineSearchInterpolationType(
212 string value,
213 LineSearchInterpolationType* type) {
214 UpperCase(&value);
215 STRENUM(BISECTION);
216 STRENUM(QUADRATIC);
217 STRENUM(CUBIC);
218 return false;
219}
220
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800221const char* NonlinearConjugateGradientTypeToString(
222 NonlinearConjugateGradientType type) {
223 switch (type) {
224 CASESTR(FLETCHER_REEVES);
225 CASESTR(POLAK_RIBIRERE);
226 CASESTR(HESTENES_STIEFEL);
227 default:
228 return "UNKNOWN";
229 }
230}
231
232bool StringToNonlinearConjugateGradientType(
233 string value,
234 NonlinearConjugateGradientType* type) {
235 UpperCase(&value);
236 STRENUM(FLETCHER_REEVES);
237 STRENUM(POLAK_RIBIRERE);
238 STRENUM(HESTENES_STIEFEL);
239 return false;
240}
241
Sameer Agarwal5a974712013-06-07 22:38:30 -0700242const char* CovarianceAlgorithmTypeToString(
243 CovarianceAlgorithmType type) {
244 switch (type) {
245 CASESTR(DENSE_SVD);
246 CASESTR(SPARSE_CHOLESKY);
247 CASESTR(SPARSE_QR);
248 default:
249 return "UNKNOWN";
250 }
251}
252
253bool StringToCovarianceAlgorithmType(
254 string value,
255 CovarianceAlgorithmType* type) {
256 UpperCase(&value);
257 STRENUM(DENSE_SVD);
258 STRENUM(SPARSE_CHOLESKY);
259 STRENUM(SPARSE_QR);
260 return false;
261}
262
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800263const char* SolverTerminationTypeToString(SolverTerminationType type) {
264 switch (type) {
Keir Mierle8ebb0732012-04-30 23:09:08 -0700265 CASESTR(NO_CONVERGENCE);
266 CASESTR(FUNCTION_TOLERANCE);
267 CASESTR(GRADIENT_TOLERANCE);
268 CASESTR(PARAMETER_TOLERANCE);
269 CASESTR(NUMERICAL_FAILURE);
270 CASESTR(USER_ABORT);
271 CASESTR(USER_SUCCESS);
272 CASESTR(DID_NOT_RUN);
273 default:
274 return "UNKNOWN";
275 }
276}
277
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700278const char* LinearSolverTerminationTypeToString(
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800279 LinearSolverTerminationType type) {
280 switch (type) {
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700281 CASESTR(TOLERANCE);
282 CASESTR(MAX_ITERATIONS);
283 CASESTR(STAGNATION);
284 CASESTR(FAILURE);
Sameer Agarwalfa015192012-06-11 14:21:42 -0700285 default:
286 return "UNKNOWN";
287 }
288}
289
Keir Mierle8ebb0732012-04-30 23:09:08 -0700290#undef CASESTR
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700291#undef STRENUM
Keir Mierle8ebb0732012-04-30 23:09:08 -0700292
293bool IsSchurType(LinearSolverType type) {
294 return ((type == SPARSE_SCHUR) ||
295 (type == DENSE_SCHUR) ||
296 (type == ITERATIVE_SCHUR));
297}
298
Sameer Agarwal14ee7952012-09-06 11:05:32 -0700299bool IsSparseLinearAlgebraLibraryTypeAvailable(
300 SparseLinearAlgebraLibraryType type) {
301 if (type == SUITE_SPARSE) {
302#ifdef CERES_NO_SUITESPARSE
303 return false;
304#else
305 return true;
306#endif
307 }
308
309 if (type == CX_SPARSE) {
310#ifdef CERES_NO_CXSPARSE
311 return false;
312#else
313 return true;
314#endif
315 }
316
317 LOG(WARNING) << "Unknown sparse linear algebra library " << type;
318 return false;
319}
320
Keir Mierle8ebb0732012-04-30 23:09:08 -0700321} // namespace ceres