blob: 1c8a986b220fba174517cd0941f12a49cd46a06c [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
42void UpperCase(string* input) {
43 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);
168 default:
169 return "UNKNOWN";
170 }
171}
172
173bool StringToLineSearchDirectionType(string value,
174 LineSearchDirectionType* type) {
175 UpperCase(&value);
176 STRENUM(STEEPEST_DESCENT);
177 STRENUM(NONLINEAR_CONJUGATE_GRADIENT);
178 STRENUM(LBFGS);
179 return false;
180}
181
182const char* LineSearchTypeToString(LineSearchType type) {
183 switch (type) {
184 CASESTR(ARMIJO);
185 default:
186 return "UNKNOWN";
187 }
188}
189
190bool StringToLineSearchType(string value, LineSearchType* type) {
191 UpperCase(&value);
192 STRENUM(ARMIJO);
193 return false;
194}
195
196const char* NonlinearConjugateGradientTypeToString(
197 NonlinearConjugateGradientType type) {
198 switch (type) {
199 CASESTR(FLETCHER_REEVES);
200 CASESTR(POLAK_RIBIRERE);
201 CASESTR(HESTENES_STIEFEL);
202 default:
203 return "UNKNOWN";
204 }
205}
206
207bool StringToNonlinearConjugateGradientType(
208 string value,
209 NonlinearConjugateGradientType* type) {
210 UpperCase(&value);
211 STRENUM(FLETCHER_REEVES);
212 STRENUM(POLAK_RIBIRERE);
213 STRENUM(HESTENES_STIEFEL);
214 return false;
215}
216
217const char* SolverTerminationTypeToString(SolverTerminationType type) {
218 switch (type) {
Keir Mierle8ebb0732012-04-30 23:09:08 -0700219 CASESTR(NO_CONVERGENCE);
220 CASESTR(FUNCTION_TOLERANCE);
221 CASESTR(GRADIENT_TOLERANCE);
222 CASESTR(PARAMETER_TOLERANCE);
223 CASESTR(NUMERICAL_FAILURE);
224 CASESTR(USER_ABORT);
225 CASESTR(USER_SUCCESS);
226 CASESTR(DID_NOT_RUN);
227 default:
228 return "UNKNOWN";
229 }
230}
231
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700232const char* LinearSolverTerminationTypeToString(
Sameer Agarwal1afd4982012-11-29 10:28:11 -0800233 LinearSolverTerminationType type) {
234 switch (type) {
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700235 CASESTR(TOLERANCE);
236 CASESTR(MAX_ITERATIONS);
237 CASESTR(STAGNATION);
238 CASESTR(FAILURE);
Sameer Agarwalfa015192012-06-11 14:21:42 -0700239 default:
240 return "UNKNOWN";
241 }
242}
243
Keir Mierle8ebb0732012-04-30 23:09:08 -0700244#undef CASESTR
Sameer Agarwalcbae8562012-09-02 13:50:43 -0700245#undef STRENUM
Keir Mierle8ebb0732012-04-30 23:09:08 -0700246
247bool IsSchurType(LinearSolverType type) {
248 return ((type == SPARSE_SCHUR) ||
249 (type == DENSE_SCHUR) ||
250 (type == ITERATIVE_SCHUR));
251}
252
Sameer Agarwal14ee7952012-09-06 11:05:32 -0700253bool IsSparseLinearAlgebraLibraryTypeAvailable(
254 SparseLinearAlgebraLibraryType type) {
255 if (type == SUITE_SPARSE) {
256#ifdef CERES_NO_SUITESPARSE
257 return false;
258#else
259 return true;
260#endif
261 }
262
263 if (type == CX_SPARSE) {
264#ifdef CERES_NO_CXSPARSE
265 return false;
266#else
267 return true;
268#endif
269 }
270
271 LOG(WARNING) << "Unknown sparse linear algebra library " << type;
272 return false;
273}
274
Keir Mierle8ebb0732012-04-30 23:09:08 -0700275} // namespace ceres