fix formatting for examples
This is mostly just applying the existing clang format config, except:
- Use NOLINT on overlong comment lines.
- Wrap some sections in 'clang-format off' / 'clang format on'.
- Manually split or join some multi-line strings.
Change-Id: Ia1a40eeb92112e12c3a169309afe087af55b2f4f
diff --git a/.clang-format b/.clang-format
index 3b22926..e28c3fd 100644
--- a/.clang-format
+++ b/.clang-format
@@ -3,3 +3,4 @@
BinPackParameters: false
PointerAlignment: Left
DerivePointerAlignment: false
+CommentPragmas: NOLINT.*
diff --git a/examples/bal_problem.cc b/examples/bal_problem.cc
index 1ee3c81..ceac89a 100644
--- a/examples/bal_problem.cc
+++ b/examples/bal_problem.cc
@@ -35,6 +35,7 @@
#include <fstream>
#include <string>
#include <vector>
+
#include "Eigen/Core"
#include "ceres/rotation.h"
#include "glog/logging.h"
@@ -46,7 +47,7 @@
typedef Eigen::Map<Eigen::VectorXd> VectorRef;
typedef Eigen::Map<const Eigen::VectorXd> ConstVectorRef;
-template<typename T>
+template <typename T>
void FscanfOrDie(FILE* fptr, const char* format, T* value) {
int num_scanned = fscanf(fptr, format, value);
if (num_scanned != 1) {
@@ -82,9 +83,8 @@
FscanfOrDie(fptr, "%d", &num_points_);
FscanfOrDie(fptr, "%d", &num_observations_);
- VLOG(1) << "Header: " << num_cameras_
- << " " << num_points_
- << " " << num_observations_;
+ VLOG(1) << "Header: " << num_cameras_ << " " << num_points_ << " "
+ << num_observations_;
point_index_ = new int[num_observations_];
camera_index_ = new int[num_observations_];
@@ -97,7 +97,7 @@
FscanfOrDie(fptr, "%d", camera_index_ + i);
FscanfOrDie(fptr, "%d", point_index_ + i);
for (int j = 0; j < 2; ++j) {
- FscanfOrDie(fptr, "%lf", observations_ + 2*i + j);
+ FscanfOrDie(fptr, "%lf", observations_ + 2 * i + j);
}
}
@@ -119,7 +119,7 @@
quaternion_cursor += 4;
original_cursor += 3;
for (int j = 4; j < 10; ++j) {
- *quaternion_cursor++ = *original_cursor++;
+ *quaternion_cursor++ = *original_cursor++;
}
}
// Copy the rest of the points.
@@ -127,7 +127,7 @@
*quaternion_cursor++ = *original_cursor++;
}
// Swap in the quaternion parameters.
- delete []parameters_;
+ delete[] parameters_;
parameters_ = quaternion_parameters;
}
}
@@ -181,25 +181,25 @@
void BALProblem::WriteToPLYFile(const std::string& filename) const {
std::ofstream of(filename.c_str());
- of << "ply"
- << '\n' << "format ascii 1.0"
- << '\n' << "element vertex " << num_cameras_ + num_points_
- << '\n' << "property float x"
- << '\n' << "property float y"
- << '\n' << "property float z"
- << '\n' << "property uchar red"
- << '\n' << "property uchar green"
- << '\n' << "property uchar blue"
- << '\n' << "end_header" << std::endl;
+ of << "ply" << '\n'
+ << "format ascii 1.0" << '\n'
+ << "element vertex " << num_cameras_ + num_points_ << '\n'
+ << "property float x" << '\n'
+ << "property float y" << '\n'
+ << "property float z" << '\n'
+ << "property uchar red" << '\n'
+ << "property uchar green" << '\n'
+ << "property uchar blue" << '\n'
+ << "end_header" << std::endl;
// Export extrinsic data (i.e. camera centers) as green points.
double angle_axis[3];
double center[3];
- for (int i = 0; i < num_cameras(); ++i) {
+ for (int i = 0; i < num_cameras(); ++i) {
const double* camera = cameras() + camera_block_size() * i;
CameraToAngleAxisAndCenter(camera, angle_axis, center);
- of << center[0] << ' ' << center[1] << ' ' << center[2]
- << " 0 255 0" << '\n';
+ of << center[0] << ' ' << center[1] << ' ' << center[2] << " 0 255 0"
+ << '\n';
}
// Export the structure (i.e. 3D Points) as white points.
@@ -226,9 +226,8 @@
// c = -R't
Eigen::VectorXd inverse_rotation = -angle_axis_ref;
- AngleAxisRotatePoint(inverse_rotation.data(),
- camera + camera_block_size() - 6,
- center);
+ AngleAxisRotatePoint(
+ inverse_rotation.data(), camera + camera_block_size() - 6, center);
VectorRef(center, 3) *= -1.0;
}
@@ -243,13 +242,10 @@
}
// t = -R * c
- AngleAxisRotatePoint(angle_axis,
- center,
- camera + camera_block_size() - 6);
+ AngleAxisRotatePoint(angle_axis, center, camera + camera_block_size() - 6);
VectorRef(camera + camera_block_size() - 6, 3) *= -1.0;
}
-
void BALProblem::Normalize() {
// Compute the marginal median of the geometry.
std::vector<double> tmp(num_points_);
@@ -329,10 +325,10 @@
}
BALProblem::~BALProblem() {
- delete []point_index_;
- delete []camera_index_;
- delete []observations_;
- delete []parameters_;
+ delete[] point_index_;
+ delete[] camera_index_;
+ delete[] observations_;
+ delete[] parameters_;
}
} // namespace examples
diff --git a/examples/bal_problem.h b/examples/bal_problem.h
index e9a348e..81e8844 100644
--- a/examples/bal_problem.h
+++ b/examples/bal_problem.h
@@ -65,20 +65,20 @@
const double translation_sigma,
const double point_sigma);
- int camera_block_size() const { return use_quaternions_ ? 10 : 9; }
- int point_block_size() const { return 3; }
- int num_cameras() const { return num_cameras_; }
- int num_points() const { return num_points_; }
- int num_observations() const { return num_observations_; }
- int num_parameters() const { return num_parameters_; }
- const int* point_index() const { return point_index_; }
- const int* camera_index() const { return camera_index_; }
- const double* observations() const { return observations_; }
- const double* parameters() const { return parameters_; }
- const double* cameras() const { return parameters_; }
- double* mutable_cameras() { return parameters_; }
+ int camera_block_size() const { return use_quaternions_ ? 10 : 9; }
+ int point_block_size() const { return 3; }
+ int num_cameras() const { return num_cameras_; }
+ int num_points() const { return num_points_; }
+ int num_observations() const { return num_observations_; }
+ int num_parameters() const { return num_parameters_; }
+ const int* point_index() const { return point_index_; }
+ const int* camera_index() const { return camera_index_; }
+ const double* observations() const { return observations_; }
+ const double* parameters() const { return parameters_; }
+ const double* cameras() const { return parameters_; }
+ double* mutable_cameras() { return parameters_; }
double* mutable_points() {
- return parameters_ + camera_block_size() * num_cameras_;
+ return parameters_ + camera_block_size() * num_cameras_;
}
private:
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc
index bd1281c..e7b154e 100644
--- a/examples/bundle_adjuster.cc
+++ b/examples/bundle_adjuster.cc
@@ -64,6 +64,9 @@
#include "glog/logging.h"
#include "snavely_reprojection_error.h"
+// clang-format makes the gflags definitions too verbose
+// clang-format off
+
DEFINE_string(input, "", "Input File name");
DEFINE_string(trust_region_strategy, "levenberg_marquardt",
"Options are: levenberg_marquardt, dogleg.");
@@ -74,7 +77,7 @@
"refine each successful trust region step.");
DEFINE_string(blocks_for_inner_iterations, "automatic", "Options are: "
- "automatic, cameras, points, cameras,points, points,cameras");
+ "automatic, cameras, points, cameras,points, points,cameras");
DEFINE_string(linear_solver, "sparse_schur", "Options are: "
"sparse_schur, dense_schur, iterative_schur, sparse_normal_cholesky, "
@@ -100,8 +103,8 @@
DEFINE_bool(robustify, false, "Use a robust loss function.");
DEFINE_double(eta, 1e-2, "Default value for eta. Eta determines the "
- "accuracy of each linear solve of the truncated newton step. "
- "Changing this parameter can affect solve performance.");
+ "accuracy of each linear solve of the truncated newton step. "
+ "Changing this parameter can affect solve performance.");
DEFINE_int32(num_threads, 1, "Number of threads.");
DEFINE_int32(num_iterations, 5, "Number of iterations.");
@@ -126,6 +129,8 @@
DEFINE_string(final_ply, "", "Export the refined BAL file data as a PLY "
"file.");
+// clang-format on
+
namespace ceres {
namespace examples {
namespace {
@@ -138,11 +143,11 @@
CHECK(StringToVisibilityClusteringType(FLAGS_visibility_clustering,
&options->visibility_clustering_type));
CHECK(StringToSparseLinearAlgebraLibraryType(
- FLAGS_sparse_linear_algebra_library,
- &options->sparse_linear_algebra_library_type));
+ FLAGS_sparse_linear_algebra_library,
+ &options->sparse_linear_algebra_library_type));
CHECK(StringToDenseLinearAlgebraLibraryType(
- FLAGS_dense_linear_algebra_library,
- &options->dense_linear_algebra_library_type));
+ FLAGS_dense_linear_algebra_library,
+ &options->dense_linear_algebra_library_type));
options->use_explicit_schur_complement = FLAGS_explicit_schur_complement;
options->use_mixed_precision_solves = FLAGS_mixed_precision_solves;
options->max_num_refinement_iterations = FLAGS_max_num_refinement_iterations;
@@ -162,31 +167,37 @@
LOG(INFO) << "Camera blocks for inner iterations";
options->inner_iteration_ordering.reset(new ParameterBlockOrdering);
for (int i = 0; i < num_cameras; ++i) {
- options->inner_iteration_ordering->AddElementToGroup(cameras + camera_block_size * i, 0);
+ options->inner_iteration_ordering->AddElementToGroup(
+ cameras + camera_block_size * i, 0);
}
} else if (FLAGS_blocks_for_inner_iterations == "points") {
LOG(INFO) << "Point blocks for inner iterations";
options->inner_iteration_ordering.reset(new ParameterBlockOrdering);
for (int i = 0; i < num_points; ++i) {
- options->inner_iteration_ordering->AddElementToGroup(points + point_block_size * i, 0);
+ options->inner_iteration_ordering->AddElementToGroup(
+ points + point_block_size * i, 0);
}
} else if (FLAGS_blocks_for_inner_iterations == "cameras,points") {
LOG(INFO) << "Camera followed by point blocks for inner iterations";
options->inner_iteration_ordering.reset(new ParameterBlockOrdering);
for (int i = 0; i < num_cameras; ++i) {
- options->inner_iteration_ordering->AddElementToGroup(cameras + camera_block_size * i, 0);
+ options->inner_iteration_ordering->AddElementToGroup(
+ cameras + camera_block_size * i, 0);
}
for (int i = 0; i < num_points; ++i) {
- options->inner_iteration_ordering->AddElementToGroup(points + point_block_size * i, 1);
+ options->inner_iteration_ordering->AddElementToGroup(
+ points + point_block_size * i, 1);
}
} else if (FLAGS_blocks_for_inner_iterations == "points,cameras") {
LOG(INFO) << "Point followed by camera blocks for inner iterations";
options->inner_iteration_ordering.reset(new ParameterBlockOrdering);
for (int i = 0; i < num_cameras; ++i) {
- options->inner_iteration_ordering->AddElementToGroup(cameras + camera_block_size * i, 1);
+ options->inner_iteration_ordering->AddElementToGroup(
+ cameras + camera_block_size * i, 1);
}
for (int i = 0; i < num_points; ++i) {
- options->inner_iteration_ordering->AddElementToGroup(points + point_block_size * i, 0);
+ options->inner_iteration_ordering->AddElementToGroup(
+ points + point_block_size * i, 0);
}
} else if (FLAGS_blocks_for_inner_iterations == "automatic") {
LOG(INFO) << "Choosing automatic blocks for inner iterations";
@@ -211,8 +222,7 @@
return;
}
- ceres::ParameterBlockOrdering* ordering =
- new ceres::ParameterBlockOrdering;
+ ceres::ParameterBlockOrdering* ordering = new ceres::ParameterBlockOrdering;
// The points come before the cameras.
for (int i = 0; i < num_points; ++i) {
@@ -266,14 +276,11 @@
CostFunction* cost_function;
// Each Residual block takes a point and a camera as input and
// outputs a 2 dimensional residual.
- cost_function =
- (FLAGS_use_quaternions)
- ? SnavelyReprojectionErrorWithQuaternions::Create(
- observations[2 * i + 0],
- observations[2 * i + 1])
- : SnavelyReprojectionError::Create(
- observations[2 * i + 0],
- observations[2 * i + 1]);
+ cost_function = (FLAGS_use_quaternions)
+ ? SnavelyReprojectionErrorWithQuaternions::Create(
+ observations[2 * i + 0], observations[2 * i + 1])
+ : SnavelyReprojectionError::Create(
+ observations[2 * i + 0], observations[2 * i + 1]);
// If enabled use Huber's loss function.
LossFunction* loss_function = FLAGS_robustify ? new HuberLoss(1.0) : NULL;
@@ -289,9 +296,8 @@
if (FLAGS_use_quaternions && FLAGS_use_local_parameterization) {
LocalParameterization* camera_parameterization =
- new ProductParameterization(
- new QuaternionParameterization(),
- new IdentityParameterization(6));
+ new ProductParameterization(new QuaternionParameterization(),
+ new IdentityParameterization(6));
for (int i = 0; i < bal_problem->num_cameras(); ++i) {
problem->SetParameterization(cameras + camera_block_size * i,
camera_parameterization);
@@ -310,9 +316,8 @@
srand(FLAGS_random_seed);
bal_problem.Normalize();
- bal_problem.Perturb(FLAGS_rotation_sigma,
- FLAGS_translation_sigma,
- FLAGS_point_sigma);
+ bal_problem.Perturb(
+ FLAGS_rotation_sigma, FLAGS_translation_sigma, FLAGS_point_sigma);
BuildProblem(&bal_problem, &problem);
Solver::Options options;
diff --git a/examples/circle_fit.cc b/examples/circle_fit.cc
index e963988..c542475 100644
--- a/examples/circle_fit.cc
+++ b/examples/circle_fit.cc
@@ -48,7 +48,7 @@
// consider instead of using this one. If you already have a decent guess, Ceres
// can squeeze down the last bit of error.
//
-// [1] http://www.mathworks.com/matlabcentral/fileexchange/5557-circle-fit/content/circfit.m
+// [1] http://www.mathworks.com/matlabcentral/fileexchange/5557-circle-fit/content/circfit.m // NOLINT
#include <cstdio>
#include <vector>
@@ -65,8 +65,10 @@
using ceres::Solve;
using ceres::Solver;
-DEFINE_double(robust_threshold, 0.0, "Robust loss parameter. Set to 0 for "
- "normal squared error (no robustification).");
+DEFINE_double(robust_threshold,
+ 0.0,
+ "Robust loss parameter. Set to 0 for normal squared error (no "
+ "robustification).");
// The cost for a single sample. The returned residual is related to the
// distance of the point from the circle (passed in as x, y, m parameters).
@@ -76,10 +78,11 @@
class DistanceFromCircleCost {
public:
DistanceFromCircleCost(double xx, double yy) : xx_(xx), yy_(yy) {}
- template <typename T> bool operator()(const T* const x,
- const T* const y,
- const T* const m, // r = m^2
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const x,
+ const T* const y,
+ const T* const m, // r = m^2
+ T* residual) const {
// Since the radius is parameterized as m^2, unpack m to get r.
T r = *m * *m;
@@ -97,7 +100,7 @@
// distance in the metric sense (it has units distance^2) it produces more
// robust fits when there are outliers. This is because the cost surface is
// more convex.
- residual[0] = r*r - xp*xp - yp*yp;
+ residual[0] = r * r - xp * xp - yp * yp;
return true;
}
@@ -137,7 +140,7 @@
double xx, yy;
int num_points = 0;
while (scanf("%lf %lf\n", &xx, &yy) == 2) {
- CostFunction *cost =
+ CostFunction* cost =
new AutoDiffCostFunction<DistanceFromCircleCost, 1, 1, 1, 1>(
new DistanceFromCircleCost(xx, yy));
problem.AddResidualBlock(cost, loss, &x, &y, &m);
diff --git a/examples/curve_fitting.cc b/examples/curve_fitting.cc
index 3f577f8..fc7ff94 100644
--- a/examples/curve_fitting.cc
+++ b/examples/curve_fitting.cc
@@ -34,8 +34,8 @@
using ceres::AutoDiffCostFunction;
using ceres::CostFunction;
using ceres::Problem;
-using ceres::Solver;
using ceres::Solve;
+using ceres::Solver;
// Data generated using the following octave code.
// randn('seed', 23497);
@@ -48,6 +48,7 @@
// data = [x', y_observed'];
const int kNumObservations = 67;
+// clang-format off
const double data[] = {
0.000000e+00, 1.133898e+00,
7.500000e-02, 1.334902e+00,
@@ -117,14 +118,13 @@
4.875000e+00, 4.727863e+00,
4.950000e+00, 4.669206e+00,
};
+// clang-format on
struct ExponentialResidual {
- ExponentialResidual(double x, double y)
- : x_(x), y_(y) {}
+ ExponentialResidual(double x, double y) : x_(x), y_(y) {}
- template <typename T> bool operator()(const T* const m,
- const T* const c,
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const m, const T* const c, T* residual) const {
residual[0] = y_ - exp(m[0] * x_ + c[0]);
return true;
}
@@ -146,7 +146,8 @@
new AutoDiffCostFunction<ExponentialResidual, 1, 1, 1>(
new ExponentialResidual(data[2 * i], data[2 * i + 1])),
NULL,
- &m, &c);
+ &m,
+ &c);
}
Solver::Options options;
diff --git a/examples/denoising.cc b/examples/denoising.cc
index a4bc4d2..61ea2c6 100644
--- a/examples/denoising.cc
+++ b/examples/denoising.cc
@@ -261,7 +261,8 @@
}
if (FLAGS_foe_file.empty()) {
- std::cerr << "Please provide a Fields of Experts file name using -foe_file.\n";
+ std::cerr << "Please provide a Fields of Experts file name using -foe_file."
+ "\n";
return 1;
}
diff --git a/examples/ellipse_approximation.cc b/examples/ellipse_approximation.cc
index 59894a2..74782f4 100644
--- a/examples/ellipse_approximation.cc
+++ b/examples/ellipse_approximation.cc
@@ -37,6 +37,7 @@
#include <cmath>
#include <vector>
+
#include "ceres/ceres.h"
#include "glog/logging.h"
@@ -53,6 +54,7 @@
const int kYRows = 212;
const int kYCols = 2;
+// clang-format off
const double kYData[kYRows * kYCols] = {
+3.871364e+00, +9.916027e-01,
+3.864003e+00, +1.034148e+00,
@@ -267,6 +269,7 @@
+3.870542e+00, +9.996121e-01,
+3.865424e+00, +1.028474e+00
};
+// clang-format on
ceres::ConstMatrixRef kY(kYData, kYRows, kYCols);
class PointToLineSegmentContourCostFunction : public ceres::CostFunction {
@@ -382,9 +385,8 @@
// Eigen::MatrixXd is column major so we define our own MatrixXd which is
// row major. Eigen::VectorXd can be used directly.
- typedef Eigen::Matrix<double,
- Eigen::Dynamic, Eigen::Dynamic,
- Eigen::RowMajor> MatrixXd;
+ typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
+ MatrixXd;
using Eigen::VectorXd;
// `X` is the matrix of control points which make up the contour of line
@@ -420,18 +422,18 @@
for (int i = 0; i < num_observations; ++i) {
parameter_blocks[0] = &t[i];
problem.AddResidualBlock(
- PointToLineSegmentContourCostFunction::Create(num_segments, kY.row(i)),
- NULL,
- parameter_blocks);
+ PointToLineSegmentContourCostFunction::Create(num_segments, kY.row(i)),
+ NULL,
+ parameter_blocks);
}
// Add regularization to minimize the length of the line segment contour.
for (int i = 0; i < num_segments; ++i) {
problem.AddResidualBlock(
- EuclideanDistanceFunctor::Create(sqrt(regularization_weight)),
- NULL,
- X.data() + 2 * i,
- X.data() + 2 * ((i + 1) % num_segments));
+ EuclideanDistanceFunctor::Create(sqrt(regularization_weight)),
+ NULL,
+ X.data() + 2 * i,
+ X.data() + 2 * ((i + 1) % num_segments));
}
ceres::Solver::Options options;
diff --git a/examples/fields_of_experts.cc b/examples/fields_of_experts.cc
index 60d179a..7b7983e 100644
--- a/examples/fields_of_experts.cc
+++ b/examples/fields_of_experts.cc
@@ -33,8 +33,8 @@
#include "fields_of_experts.h"
-#include <fstream>
#include <cmath>
+#include <fstream>
#include "pgm_image.h"
@@ -80,14 +80,12 @@
const double sum = 1.0 + sq_norm * c;
const double inv = 1.0 / sum;
// 'sum' and 'inv' are always positive, assuming that 's' is.
- rho[0] = alpha_ * log(sum);
+ rho[0] = alpha_ * log(sum);
rho[1] = alpha_ * c * inv;
- rho[2] = - alpha_ * c * c * inv * inv;
+ rho[2] = -alpha_ * c * c * inv * inv;
}
-FieldsOfExperts::FieldsOfExperts()
- : size_(0), num_filters_(0) {
-}
+FieldsOfExperts::FieldsOfExperts() : size_(0), num_filters_(0) {}
bool FieldsOfExperts::LoadFromFile(const std::string& filename) {
std::ifstream foe_file(filename.c_str());
@@ -147,6 +145,5 @@
return new FieldsOfExpertsLoss(alpha_[alpha_index]);
}
-
} // namespace examples
} // namespace ceres
diff --git a/examples/fields_of_experts.h b/examples/fields_of_experts.h
index 210ca69..d7f1a4a 100644
--- a/examples/fields_of_experts.h
+++ b/examples/fields_of_experts.h
@@ -47,10 +47,9 @@
#include <iostream>
#include <vector>
-#include "ceres/loss_function.h"
#include "ceres/cost_function.h"
+#include "ceres/loss_function.h"
#include "ceres/sized_cost_function.h"
-
#include "pgm_image.h"
namespace ceres {
@@ -78,7 +77,7 @@
//
class FieldsOfExpertsLoss : public ceres::LossFunction {
public:
- explicit FieldsOfExpertsLoss(double alpha) : alpha_(alpha) { }
+ explicit FieldsOfExpertsLoss(double alpha) : alpha_(alpha) {}
virtual void Evaluate(double, double*) const;
private:
@@ -97,19 +96,13 @@
bool LoadFromFile(const std::string& filename);
// Side length of a square filter in this FoE. They are all of the same size.
- int Size() const {
- return size_;
- }
+ int Size() const { return size_; }
// Total number of pixels the filter covers.
- int NumVariables() const {
- return size_ * size_;
- }
+ int NumVariables() const { return size_ * size_; }
// Number of filters used by the FoE.
- int NumFilters() const {
- return num_filters_;
- }
+ int NumFilters() const { return num_filters_; }
// Creates a new cost function. The caller is responsible for deallocating the
// memory. alpha_index specifies which filter is used in the cost function.
@@ -119,12 +112,8 @@
ceres::LossFunction* NewLossFunction(int alpha_index) const;
// Gets the delta pixel indices for all pixels in a patch.
- const std::vector<int>& GetXDeltaIndices() const {
- return x_delta_indices_;
- }
- const std::vector<int>& GetYDeltaIndices() const {
- return y_delta_indices_;
- }
+ const std::vector<int>& GetXDeltaIndices() const { return x_delta_indices_; }
+ const std::vector<int>& GetYDeltaIndices() const { return y_delta_indices_; }
private:
// The side length of a square filter.
diff --git a/examples/helloworld.cc b/examples/helloworld.cc
index d5d546c..9e32fad 100644
--- a/examples/helloworld.cc
+++ b/examples/helloworld.cc
@@ -78,7 +78,6 @@
Solve(options, &problem, &summary);
std::cout << summary.BriefReport() << "\n";
- std::cout << "x : " << initial_x
- << " -> " << x << "\n";
+ std::cout << "x : " << initial_x << " -> " << x << "\n";
return 0;
}
diff --git a/examples/helloworld_analytic_diff.cc b/examples/helloworld_analytic_diff.cc
index 9dbbc76..6e120b5 100644
--- a/examples/helloworld_analytic_diff.cc
+++ b/examples/helloworld_analytic_diff.cc
@@ -33,20 +33,21 @@
// Minimize 0.5 (10 - x)^2 using analytic jacobian matrix.
#include <vector>
+
#include "ceres/ceres.h"
#include "glog/logging.h"
using ceres::CostFunction;
-using ceres::SizedCostFunction;
using ceres::Problem;
-using ceres::Solver;
+using ceres::SizedCostFunction;
using ceres::Solve;
+using ceres::Solver;
// A CostFunction implementing analytically derivatives for the
// function f(x) = 10 - x.
class QuadraticCostFunction
- : public SizedCostFunction<1 /* number of residuals */,
- 1 /* size of first parameter */> {
+ : public SizedCostFunction<1 /* number of residuals */,
+ 1 /* size of first parameter */> {
public:
virtual ~QuadraticCostFunction() {}
@@ -100,8 +101,7 @@
Solve(options, &problem, &summary);
std::cout << summary.BriefReport() << "\n";
- std::cout << "x : " << initial_x
- << " -> " << x << "\n";
+ std::cout << "x : " << initial_x << " -> " << x << "\n";
return 0;
}
diff --git a/examples/helloworld_numeric_diff.cc b/examples/helloworld_numeric_diff.cc
index 0810f47..474adf3 100644
--- a/examples/helloworld_numeric_diff.cc
+++ b/examples/helloworld_numeric_diff.cc
@@ -34,12 +34,12 @@
#include "ceres/ceres.h"
#include "glog/logging.h"
-using ceres::NumericDiffCostFunction;
using ceres::CENTRAL;
using ceres::CostFunction;
+using ceres::NumericDiffCostFunction;
using ceres::Problem;
-using ceres::Solver;
using ceres::Solve;
+using ceres::Solver;
// A cost functor that implements the residual r = 10 - x.
struct CostFunctor {
@@ -63,7 +63,7 @@
// Set up the only cost function (also known as residual). This uses
// numeric differentiation to obtain the derivative (jacobian).
CostFunction* cost_function =
- new NumericDiffCostFunction<CostFunctor, CENTRAL, 1, 1> (new CostFunctor);
+ new NumericDiffCostFunction<CostFunctor, CENTRAL, 1, 1>(new CostFunctor);
problem.AddResidualBlock(cost_function, NULL, &x);
// Run the solver!
@@ -73,7 +73,6 @@
Solve(options, &problem, &summary);
std::cout << summary.BriefReport() << "\n";
- std::cout << "x : " << initial_x
- << " -> " << x << "\n";
+ std::cout << "x : " << initial_x << " -> " << x << "\n";
return 0;
}
diff --git a/examples/libmv_bundle_adjuster.cc b/examples/libmv_bundle_adjuster.cc
index 22bcf5b..b1eb220 100644
--- a/examples/libmv_bundle_adjuster.cc
+++ b/examples/libmv_bundle_adjuster.cc
@@ -87,16 +87,17 @@
// There're existing problem files dumped from blender stored in folder
// ../data/libmv-ba-problems.
-#include <cstdio>
#include <fcntl.h>
+
+#include <cstdio>
#include <sstream>
#include <string>
#include <vector>
#ifdef _MSC_VER
-# include <io.h>
-# define open _open
-# define close _close
+#include <io.h>
+#define open _open
+#define close _close
typedef unsigned __int32 uint32_t;
#else
#include <stdint.h>
@@ -121,8 +122,9 @@
using std::vector;
DEFINE_string(input, "", "Input File name");
-DEFINE_string(refine_intrinsics, "", "Camera intrinsics to be refined. "
- "Options are: none, radial.");
+DEFINE_string(refine_intrinsics,
+ "",
+ "Camera intrinsics to be refined. Options are: none, radial.");
namespace {
@@ -134,7 +136,7 @@
// t is a translation vector representing its positions.
struct EuclideanCamera {
EuclideanCamera() : image(-1) {}
- EuclideanCamera(const EuclideanCamera &c) : image(c.image), R(c.R), t(c.t) {}
+ EuclideanCamera(const EuclideanCamera& c) : image(c.image), R(c.R), t(c.t) {}
int image;
Mat3 R;
@@ -147,7 +149,7 @@
// X represents the 3D position of the track.
struct EuclideanPoint {
EuclideanPoint() : track(-1) {}
- EuclideanPoint(const EuclideanPoint &p) : track(p.track), X(p.X) {}
+ EuclideanPoint(const EuclideanPoint& p) : track(p.track), X(p.X) {}
int track;
Vec3 X;
};
@@ -201,25 +203,24 @@
};
// Returns a pointer to the camera corresponding to a image.
-EuclideanCamera *CameraForImage(vector<EuclideanCamera> *all_cameras,
+EuclideanCamera* CameraForImage(vector<EuclideanCamera>* all_cameras,
const int image) {
if (image < 0 || image >= all_cameras->size()) {
return NULL;
}
- EuclideanCamera *camera = &(*all_cameras)[image];
+ EuclideanCamera* camera = &(*all_cameras)[image];
if (camera->image == -1) {
return NULL;
}
return camera;
}
-const EuclideanCamera *CameraForImage(
- const vector<EuclideanCamera> &all_cameras,
- const int image) {
+const EuclideanCamera* CameraForImage(
+ const vector<EuclideanCamera>& all_cameras, const int image) {
if (image < 0 || image >= all_cameras.size()) {
return NULL;
}
- const EuclideanCamera *camera = &all_cameras[image];
+ const EuclideanCamera* camera = &all_cameras[image];
if (camera->image == -1) {
return NULL;
}
@@ -227,7 +228,7 @@
}
// Returns maximal image number at which marker exists.
-int MaxImage(const vector<Marker> &all_markers) {
+int MaxImage(const vector<Marker>& all_markers) {
if (all_markers.size() == 0) {
return -1;
}
@@ -240,12 +241,12 @@
}
// Returns a pointer to the point corresponding to a track.
-EuclideanPoint *PointForTrack(vector<EuclideanPoint> *all_points,
+EuclideanPoint* PointForTrack(vector<EuclideanPoint>* all_points,
const int track) {
if (track < 0 || track >= all_points->size()) {
return NULL;
}
- EuclideanPoint *point = &(*all_points)[track];
+ EuclideanPoint* point = &(*all_points)[track];
if (point->track == -1) {
return NULL;
}
@@ -266,7 +267,7 @@
union {
unsigned char bytes[4];
uint32_t value;
- } endian_test = { { 0, 1, 2, 3 } };
+ } endian_test = {{0, 1, 2, 3}};
host_endian_type_ = endian_test.value;
file_endian_type_ = host_endian_type_;
}
@@ -277,7 +278,7 @@
}
}
- bool OpenFile(const std::string &file_name) {
+ bool OpenFile(const std::string& file_name) {
file_descriptor_ = open(file_name.c_str(), O_RDONLY | O_BINARY);
if (file_descriptor_ < 0) {
return false;
@@ -306,6 +307,7 @@
}
return value;
}
+
private:
static constexpr long int kLittleEndian = 0x03020100ul;
static constexpr long int kBigEndian = 0x00010203ul;
@@ -315,14 +317,17 @@
T SwitchEndian(const T value) const {
if (sizeof(T) == 4) {
unsigned int temp_value = static_cast<unsigned int>(value);
+ // clang-format off
return ((temp_value >> 24)) |
((temp_value << 8) & 0x00ff0000) |
((temp_value >> 8) & 0x0000ff00) |
((temp_value << 24));
+ // clang-format on
} else if (sizeof(T) == 1) {
return value;
} else {
- LOG(FATAL) << "Entered non-implemented part of endian switching function.";
+ LOG(FATAL) << "Entered non-implemented part of endian "
+ "switching function.";
}
}
@@ -332,16 +337,14 @@
};
// Read 3x3 column-major matrix from the file
-void ReadMatrix3x3(const EndianAwareFileReader &file_reader,
- Mat3 *matrix) {
+void ReadMatrix3x3(const EndianAwareFileReader& file_reader, Mat3* matrix) {
for (int i = 0; i < 9; i++) {
(*matrix)(i % 3, i / 3) = file_reader.Read<float>();
}
}
// Read 3-vector from file
-void ReadVector3(const EndianAwareFileReader &file_reader,
- Vec3 *vector) {
+void ReadVector3(const EndianAwareFileReader& file_reader, Vec3* vector) {
for (int i = 0; i < 3; i++) {
(*vector)(i) = file_reader.Read<float>();
}
@@ -364,12 +367,12 @@
//
// Returns false if any kind of error happened during
// reading.
-bool ReadProblemFromFile(const std::string &file_name,
+bool ReadProblemFromFile(const std::string& file_name,
double camera_intrinsics[8],
- vector<EuclideanCamera> *all_cameras,
- vector<EuclideanPoint> *all_points,
- bool *is_image_space,
- vector<Marker> *all_markers) {
+ vector<EuclideanCamera>* all_cameras,
+ vector<EuclideanPoint>* all_points,
+ bool* is_image_space,
+ vector<Marker>* all_markers) {
EndianAwareFileReader file_reader;
if (!file_reader.OpenFile(file_name)) {
return false;
@@ -451,24 +454,24 @@
// camera coordinates (i.e. the principal point is at (0, 0)) to get image
// coordinates in pixels. Templated for use with autodifferentiation.
template <typename T>
-inline void ApplyRadialDistortionCameraIntrinsics(const T &focal_length_x,
- const T &focal_length_y,
- const T &principal_point_x,
- const T &principal_point_y,
- const T &k1,
- const T &k2,
- const T &k3,
- const T &p1,
- const T &p2,
- const T &normalized_x,
- const T &normalized_y,
- T *image_x,
- T *image_y) {
+inline void ApplyRadialDistortionCameraIntrinsics(const T& focal_length_x,
+ const T& focal_length_y,
+ const T& principal_point_x,
+ const T& principal_point_y,
+ const T& k1,
+ const T& k2,
+ const T& k3,
+ const T& p1,
+ const T& p2,
+ const T& normalized_x,
+ const T& normalized_y,
+ T* image_x,
+ T* image_y) {
T x = normalized_x;
T y = normalized_y;
// Apply distortion to the normalized points to get (xd, yd).
- T r2 = x*x + y*y;
+ T r2 = x * x + y * y;
T r4 = r2 * r2;
T r6 = r4 * r2;
T r_coeff = 1.0 + k1 * r2 + k2 * r4 + k3 * r6;
@@ -496,14 +499,14 @@
const T* const X, // Point coordinates 3x1.
T* residuals) const {
// Unpack the intrinsics.
- const T& focal_length = intrinsics[OFFSET_FOCAL_LENGTH];
+ const T& focal_length = intrinsics[OFFSET_FOCAL_LENGTH];
const T& principal_point_x = intrinsics[OFFSET_PRINCIPAL_POINT_X];
const T& principal_point_y = intrinsics[OFFSET_PRINCIPAL_POINT_Y];
- const T& k1 = intrinsics[OFFSET_K1];
- const T& k2 = intrinsics[OFFSET_K2];
- const T& k3 = intrinsics[OFFSET_K3];
- const T& p1 = intrinsics[OFFSET_P1];
- const T& p2 = intrinsics[OFFSET_P2];
+ const T& k1 = intrinsics[OFFSET_K1];
+ const T& k2 = intrinsics[OFFSET_K2];
+ const T& k3 = intrinsics[OFFSET_K3];
+ const T& p1 = intrinsics[OFFSET_P1];
+ const T& p2 = intrinsics[OFFSET_P2];
// Compute projective coordinates: x = RX + t.
T x[3];
@@ -526,9 +529,13 @@
focal_length,
principal_point_x,
principal_point_y,
- k1, k2, k3,
- p1, p2,
- xn, yn,
+ k1,
+ k2,
+ k3,
+ p1,
+ p2,
+ xn,
+ yn,
&predicted_x,
&predicted_y);
@@ -551,40 +558,41 @@
std::string bundling_message = "";
#define APPEND_BUNDLING_INTRINSICS(name, flag) \
- if (bundle_intrinsics & flag) { \
- if (!bundling_message.empty()) { \
- bundling_message += ", "; \
- } \
- bundling_message += name; \
- } (void)0
+ if (bundle_intrinsics & flag) { \
+ if (!bundling_message.empty()) { \
+ bundling_message += ", "; \
+ } \
+ bundling_message += name; \
+ } \
+ (void)0
- APPEND_BUNDLING_INTRINSICS("f", BUNDLE_FOCAL_LENGTH);
+ APPEND_BUNDLING_INTRINSICS("f", BUNDLE_FOCAL_LENGTH);
APPEND_BUNDLING_INTRINSICS("px, py", BUNDLE_PRINCIPAL_POINT);
- APPEND_BUNDLING_INTRINSICS("k1", BUNDLE_RADIAL_K1);
- APPEND_BUNDLING_INTRINSICS("k2", BUNDLE_RADIAL_K2);
- APPEND_BUNDLING_INTRINSICS("p1", BUNDLE_TANGENTIAL_P1);
- APPEND_BUNDLING_INTRINSICS("p2", BUNDLE_TANGENTIAL_P2);
+ APPEND_BUNDLING_INTRINSICS("k1", BUNDLE_RADIAL_K1);
+ APPEND_BUNDLING_INTRINSICS("k2", BUNDLE_RADIAL_K2);
+ APPEND_BUNDLING_INTRINSICS("p1", BUNDLE_TANGENTIAL_P1);
+ APPEND_BUNDLING_INTRINSICS("p2", BUNDLE_TANGENTIAL_P2);
LOG(INFO) << "Bundling " << bundling_message << ".";
}
}
// Print a message to the log containing all the camera intriniscs values.
-void PrintCameraIntrinsics(const char *text, const double *camera_intrinsics) {
+void PrintCameraIntrinsics(const char* text, const double* camera_intrinsics) {
std::ostringstream intrinsics_output;
intrinsics_output << "f=" << camera_intrinsics[OFFSET_FOCAL_LENGTH];
- intrinsics_output <<
- " cx=" << camera_intrinsics[OFFSET_PRINCIPAL_POINT_X] <<
- " cy=" << camera_intrinsics[OFFSET_PRINCIPAL_POINT_Y];
+ intrinsics_output << " cx=" << camera_intrinsics[OFFSET_PRINCIPAL_POINT_X]
+ << " cy=" << camera_intrinsics[OFFSET_PRINCIPAL_POINT_Y];
-#define APPEND_DISTORTION_COEFFICIENT(name, offset) \
- { \
- if (camera_intrinsics[offset] != 0.0) { \
- intrinsics_output << " " name "=" << camera_intrinsics[offset]; \
- } \
- } (void)0
+#define APPEND_DISTORTION_COEFFICIENT(name, offset) \
+ { \
+ if (camera_intrinsics[offset] != 0.0) { \
+ intrinsics_output << " " name "=" << camera_intrinsics[offset]; \
+ } \
+ } \
+ (void)0
APPEND_DISTORTION_COEFFICIENT("k1", OFFSET_K1);
APPEND_DISTORTION_COEFFICIENT("k2", OFFSET_K2);
@@ -603,22 +611,21 @@
// Element with index i matches to a rotation+translation for
// camera at image i.
vector<Vec6> PackCamerasRotationAndTranslation(
- const vector<Marker> &all_markers,
- const vector<EuclideanCamera> &all_cameras) {
+ const vector<Marker>& all_markers,
+ const vector<EuclideanCamera>& all_cameras) {
vector<Vec6> all_cameras_R_t;
int max_image = MaxImage(all_markers);
all_cameras_R_t.resize(max_image + 1);
for (int i = 0; i <= max_image; i++) {
- const EuclideanCamera *camera = CameraForImage(all_cameras, i);
+ const EuclideanCamera* camera = CameraForImage(all_cameras, i);
if (!camera) {
continue;
}
- ceres::RotationMatrixToAngleAxis(&camera->R(0, 0),
- &all_cameras_R_t[i](0));
+ ceres::RotationMatrixToAngleAxis(&camera->R(0, 0), &all_cameras_R_t[i](0));
all_cameras_R_t[i].tail<3>() = camera->t;
}
@@ -626,31 +633,29 @@
}
// Convert cameras rotations fro mangle axis back to rotation matrix.
-void UnpackCamerasRotationAndTranslation(
- const vector<Marker> &all_markers,
- const vector<Vec6> &all_cameras_R_t,
- vector<EuclideanCamera> *all_cameras) {
+void UnpackCamerasRotationAndTranslation(const vector<Marker>& all_markers,
+ const vector<Vec6>& all_cameras_R_t,
+ vector<EuclideanCamera>* all_cameras) {
int max_image = MaxImage(all_markers);
for (int i = 0; i <= max_image; i++) {
- EuclideanCamera *camera = CameraForImage(all_cameras, i);
+ EuclideanCamera* camera = CameraForImage(all_cameras, i);
if (!camera) {
continue;
}
- ceres::AngleAxisToRotationMatrix(&all_cameras_R_t[i](0),
- &camera->R(0, 0));
+ ceres::AngleAxisToRotationMatrix(&all_cameras_R_t[i](0), &camera->R(0, 0));
camera->t = all_cameras_R_t[i].tail<3>();
}
}
-void EuclideanBundleCommonIntrinsics(const vector<Marker> &all_markers,
+void EuclideanBundleCommonIntrinsics(const vector<Marker>& all_markers,
const int bundle_intrinsics,
const int bundle_constraints,
- double *camera_intrinsics,
- vector<EuclideanCamera> *all_cameras,
- vector<EuclideanPoint> *all_points) {
+ double* camera_intrinsics,
+ vector<EuclideanCamera>* all_cameras,
+ vector<EuclideanPoint>* all_points) {
PrintCameraIntrinsics("Original intrinsics: ", camera_intrinsics);
ceres::Problem::Options problem_options;
@@ -663,49 +668,50 @@
// Block for minimization has got the following structure:
// <3 elements for angle-axis> <3 elements for translation>
vector<Vec6> all_cameras_R_t =
- PackCamerasRotationAndTranslation(all_markers, *all_cameras);
+ PackCamerasRotationAndTranslation(all_markers, *all_cameras);
// Parameterization used to restrict camera motion for modal solvers.
- ceres::SubsetParameterization *constant_transform_parameterization = NULL;
+ ceres::SubsetParameterization* constant_transform_parameterization = NULL;
if (bundle_constraints & BUNDLE_NO_TRANSLATION) {
- std::vector<int> constant_translation;
+ std::vector<int> constant_translation;
- // First three elements are rotation, last three are translation.
- constant_translation.push_back(3);
- constant_translation.push_back(4);
- constant_translation.push_back(5);
+ // First three elements are rotation, last three are translation.
+ constant_translation.push_back(3);
+ constant_translation.push_back(4);
+ constant_translation.push_back(5);
- constant_transform_parameterization =
+ constant_transform_parameterization =
new ceres::SubsetParameterization(6, constant_translation);
}
std::vector<OpenCVReprojectionError> errors;
- std::vector<ceres::AutoDiffCostFunction<OpenCVReprojectionError, 2, 8, 6, 3>> costFunctions;
+ std::vector<ceres::AutoDiffCostFunction<OpenCVReprojectionError, 2, 8, 6, 3>>
+ costFunctions;
errors.reserve(all_markers.size());
costFunctions.reserve(all_markers.size());
int num_residuals = 0;
bool have_locked_camera = false;
for (int i = 0; i < all_markers.size(); ++i) {
- const Marker &marker = all_markers[i];
- EuclideanCamera *camera = CameraForImage(all_cameras, marker.image);
- EuclideanPoint *point = PointForTrack(all_points, marker.track);
+ const Marker& marker = all_markers[i];
+ EuclideanCamera* camera = CameraForImage(all_cameras, marker.image);
+ EuclideanPoint* point = PointForTrack(all_points, marker.track);
if (camera == NULL || point == NULL) {
continue;
}
// Rotation of camera denoted in angle axis followed with
// camera translaiton.
- double *current_camera_R_t = &all_cameras_R_t[camera->image](0);
+ double* current_camera_R_t = &all_cameras_R_t[camera->image](0);
errors.emplace_back(marker.x, marker.y);
costFunctions.emplace_back(&errors.back(), ceres::DO_NOT_TAKE_OWNERSHIP);
problem.AddResidualBlock(&costFunctions.back(),
- NULL,
- camera_intrinsics,
- current_camera_R_t,
- &point->X(0));
+ NULL,
+ camera_intrinsics,
+ current_camera_R_t,
+ &point->X(0));
// We lock the first camera to better deal with scene orientation ambiguity.
if (!have_locked_camera) {
@@ -739,23 +745,23 @@
std::vector<int> constant_intrinsics;
#define MAYBE_SET_CONSTANT(bundle_enum, offset) \
- if (!(bundle_intrinsics & bundle_enum)) { \
- constant_intrinsics.push_back(offset); \
- }
- MAYBE_SET_CONSTANT(BUNDLE_FOCAL_LENGTH, OFFSET_FOCAL_LENGTH);
+ if (!(bundle_intrinsics & bundle_enum)) { \
+ constant_intrinsics.push_back(offset); \
+ }
+ MAYBE_SET_CONSTANT(BUNDLE_FOCAL_LENGTH, OFFSET_FOCAL_LENGTH);
MAYBE_SET_CONSTANT(BUNDLE_PRINCIPAL_POINT, OFFSET_PRINCIPAL_POINT_X);
MAYBE_SET_CONSTANT(BUNDLE_PRINCIPAL_POINT, OFFSET_PRINCIPAL_POINT_Y);
- MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K1, OFFSET_K1);
- MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K2, OFFSET_K2);
- MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P1, OFFSET_P1);
- MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P2, OFFSET_P2);
+ MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K1, OFFSET_K1);
+ MAYBE_SET_CONSTANT(BUNDLE_RADIAL_K2, OFFSET_K2);
+ MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P1, OFFSET_P1);
+ MAYBE_SET_CONSTANT(BUNDLE_TANGENTIAL_P2, OFFSET_P2);
#undef MAYBE_SET_CONSTANT
// Always set K3 constant, it's not used at the moment.
constant_intrinsics.push_back(OFFSET_K3);
- ceres::SubsetParameterization *subset_parameterization =
- new ceres::SubsetParameterization(8, constant_intrinsics);
+ ceres::SubsetParameterization* subset_parameterization =
+ new ceres::SubsetParameterization(8, constant_intrinsics);
problem.SetParameterization(camera_intrinsics, subset_parameterization);
}
@@ -776,15 +782,14 @@
std::cout << "Final report:\n" << summary.FullReport();
// Copy rotations and translations back.
- UnpackCamerasRotationAndTranslation(all_markers,
- all_cameras_R_t,
- all_cameras);
+ UnpackCamerasRotationAndTranslation(
+ all_markers, all_cameras_R_t, all_cameras);
PrintCameraIntrinsics("Final intrinsics: ", camera_intrinsics);
}
} // namespace
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
google::InitGoogleLogging(argv[0]);
diff --git a/examples/libmv_homography.cc b/examples/libmv_homography.cc
index fe647da..55f3b70 100644
--- a/examples/libmv_homography.cc
+++ b/examples/libmv_homography.cc
@@ -54,8 +54,8 @@
// homogeneous system of equations via singular value decomposition, giving an
// algebraic solution for the homography, then solving for a final solution by
// minimizing the symmetric transfer error in image space with Ceres (called the
-// Gold Standard Solution in "Multiple View Geometry"). The routines are based on
-// the routines from the Libmv library.
+// Gold Standard Solution in "Multiple View Geometry"). The routines are based
+// on the routines from the Libmv library.
//
// This example demonstrates custom exit criterion by having a callback check
// for image-space error.
@@ -69,7 +69,7 @@
typedef Eigen::VectorXd Vec;
typedef Eigen::Matrix<double, 3, 3> Mat3;
typedef Eigen::Matrix<double, 2, 1> Vec2;
-typedef Eigen::Matrix<double, Eigen::Dynamic, 8> MatX8;
+typedef Eigen::Matrix<double, Eigen::Dynamic, 8> MatX8;
typedef Eigen::Vector3d Vec3;
namespace {
@@ -83,8 +83,7 @@
// Default settings for homography estimation which should be suitable
// for a wide range of use cases.
EstimateHomographyOptions()
- : max_num_iterations(50),
- expected_average_symmetric_distance(1e-16) {}
+ : max_num_iterations(50), expected_average_symmetric_distance(1e-16) {}
// Maximal number of iterations for the refinement step.
int max_num_iterations;
@@ -107,9 +106,9 @@
//
// Templated to be used with autodifferentiation.
template <typename T>
-void SymmetricGeometricDistanceTerms(const Eigen::Matrix<T, 3, 3> &H,
- const Eigen::Matrix<T, 2, 1> &x1,
- const Eigen::Matrix<T, 2, 1> &x2,
+void SymmetricGeometricDistanceTerms(const Eigen::Matrix<T, 3, 3>& H,
+ const Eigen::Matrix<T, 2, 1>& x1,
+ const Eigen::Matrix<T, 2, 1>& x2,
T forward_error[2],
T backward_error[2]) {
typedef Eigen::Matrix<T, 3, 1> Vec3;
@@ -132,17 +131,13 @@
//
// D(H * x1, x2)^2 + D(H^-1 * x2, x1)^2
//
-double SymmetricGeometricDistance(const Mat3 &H,
- const Vec2 &x1,
- const Vec2 &x2) {
+double SymmetricGeometricDistance(const Mat3& H,
+ const Vec2& x1,
+ const Vec2& x2) {
Vec2 forward_error, backward_error;
- SymmetricGeometricDistanceTerms<double>(H,
- x1,
- x2,
- forward_error.data(),
- backward_error.data());
- return forward_error.squaredNorm() +
- backward_error.squaredNorm();
+ SymmetricGeometricDistanceTerms<double>(
+ H, x1, x2, forward_error.data(), backward_error.data());
+ return forward_error.squaredNorm() + backward_error.squaredNorm();
}
// A parameterization of the 2D homography matrix that uses 8 parameters so
@@ -154,24 +149,28 @@
// H = |d e f|
// |g h 1|
//
-template<typename T = double>
+template <typename T = double>
class Homography2DNormalizedParameterization {
public:
typedef Eigen::Matrix<T, 8, 1> Parameters; // a, b, ... g, h
typedef Eigen::Matrix<T, 3, 3> Parameterized; // H
// Convert from the 8 parameters to a H matrix.
- static void To(const Parameters &p, Parameterized *h) {
+ static void To(const Parameters& p, Parameterized* h) {
+ // clang-format off
*h << p(0), p(1), p(2),
p(3), p(4), p(5),
p(6), p(7), 1.0;
+ // clang-format on
}
// Convert from a H matrix to the 8 parameters.
- static void From(const Parameterized &h, Parameters *p) {
+ static void From(const Parameterized& h, Parameters* p) {
+ // clang-format off
*p << h(0, 0), h(0, 1), h(0, 2),
h(1, 0), h(1, 1), h(1, 2),
h(2, 0), h(2, 1);
+ // clang-format on
}
};
@@ -194,11 +193,10 @@
// (a-x1*g)*y1 + (b-x1*h)*y2 + c-x1 = |0|
// (-x2*a+x1*d)*y1 + (-x2*b+x1*e)*y2 + -x2*c+x1*f |0|
//
-bool Homography2DFromCorrespondencesLinearEuc(
- const Mat &x1,
- const Mat &x2,
- Mat3 *H,
- double expected_precision) {
+bool Homography2DFromCorrespondencesLinearEuc(const Mat& x1,
+ const Mat& x2,
+ Mat3* H,
+ double expected_precision) {
assert(2 == x1.rows());
assert(4 <= x1.cols());
assert(x1.rows() == x2.rows());
@@ -209,27 +207,27 @@
Mat b = Mat::Zero(n * 3, 1);
for (int i = 0; i < n; ++i) {
int j = 3 * i;
- L(j, 0) = x1(0, i); // a
- L(j, 1) = x1(1, i); // b
- L(j, 2) = 1.0; // c
+ L(j, 0) = x1(0, i); // a
+ L(j, 1) = x1(1, i); // b
+ L(j, 2) = 1.0; // c
L(j, 6) = -x2(0, i) * x1(0, i); // g
L(j, 7) = -x2(0, i) * x1(1, i); // h
- b(j, 0) = x2(0, i); // i
+ b(j, 0) = x2(0, i); // i
++j;
- L(j, 3) = x1(0, i); // d
- L(j, 4) = x1(1, i); // e
- L(j, 5) = 1.0; // f
+ L(j, 3) = x1(0, i); // d
+ L(j, 4) = x1(1, i); // e
+ L(j, 5) = 1.0; // f
L(j, 6) = -x2(1, i) * x1(0, i); // g
L(j, 7) = -x2(1, i) * x1(1, i); // h
- b(j, 0) = x2(1, i); // i
+ b(j, 0) = x2(1, i); // i
// This ensures better stability
// TODO(julien) make a lite version without this 3rd set
++j;
- L(j, 0) = x2(1, i) * x1(0, i); // a
- L(j, 1) = x2(1, i) * x1(1, i); // b
- L(j, 2) = x2(1, i); // c
+ L(j, 0) = x2(1, i) * x1(0, i); // a
+ L(j, 1) = x2(1, i) * x1(1, i); // b
+ L(j, 2) = x2(1, i); // c
L(j, 3) = -x2(0, i) * x1(0, i); // d
L(j, 4) = -x2(0, i) * x1(1, i); // e
L(j, 5) = -x2(0, i); // f
@@ -244,11 +242,10 @@
// used for homography matrix refinement.
class HomographySymmetricGeometricCostFunctor {
public:
- HomographySymmetricGeometricCostFunctor(const Vec2 &x,
- const Vec2 &y)
- : x_(x), y_(y) { }
+ HomographySymmetricGeometricCostFunctor(const Vec2& x, const Vec2& y)
+ : x_(x), y_(y) {}
- template<typename T>
+ template <typename T>
bool operator()(const T* homography_parameters, T* residuals) const {
typedef Eigen::Matrix<T, 3, 3> Mat3;
typedef Eigen::Matrix<T, 2, 1> Vec2;
@@ -257,11 +254,7 @@
Vec2 x(T(x_(0)), T(x_(1)));
Vec2 y(T(y_(0)), T(y_(1)));
- SymmetricGeometricDistanceTerms<T>(H,
- x,
- y,
- &residuals[0],
- &residuals[2]);
+ SymmetricGeometricDistanceTerms<T>(H, x, y, &residuals[0], &residuals[2]);
return true;
}
@@ -278,9 +271,10 @@
// points < 0.5px error).
class TerminationCheckingCallback : public ceres::IterationCallback {
public:
- TerminationCheckingCallback(const Mat &x1, const Mat &x2,
- const EstimateHomographyOptions &options,
- Mat3 *H)
+ TerminationCheckingCallback(const Mat& x1,
+ const Mat& x2,
+ const EstimateHomographyOptions& options,
+ Mat3* H)
: options_(options), x1_(x1), x2_(x2), H_(H) {}
virtual ceres::CallbackReturnType operator()(
@@ -293,9 +287,8 @@
// Calculate average of symmetric geometric distance.
double average_distance = 0.0;
for (int i = 0; i < x1_.cols(); i++) {
- average_distance += SymmetricGeometricDistance(*H_,
- x1_.col(i),
- x2_.col(i));
+ average_distance +=
+ SymmetricGeometricDistance(*H_, x1_.col(i), x2_.col(i));
}
average_distance /= x1_.cols();
@@ -307,17 +300,17 @@
}
private:
- const EstimateHomographyOptions &options_;
- const Mat &x1_;
- const Mat &x2_;
- Mat3 *H_;
+ const EstimateHomographyOptions& options_;
+ const Mat& x1_;
+ const Mat& x2_;
+ Mat3* H_;
};
bool EstimateHomography2DFromCorrespondences(
- const Mat &x1,
- const Mat &x2,
- const EstimateHomographyOptions &options,
- Mat3 *H) {
+ const Mat& x1,
+ const Mat& x2,
+ const EstimateHomographyOptions& options,
+ Mat3* H) {
assert(2 == x1.rows());
assert(4 <= x1.cols());
assert(x1.rows() == x2.rows());
@@ -325,26 +318,23 @@
// Step 1: Algebraic homography estimation.
// Assume algebraic estimation always succeeds.
- Homography2DFromCorrespondencesLinearEuc(x1,
- x2,
- H,
- EigenDouble::dummy_precision());
+ Homography2DFromCorrespondencesLinearEuc(
+ x1, x2, H, EigenDouble::dummy_precision());
LOG(INFO) << "Estimated matrix after algebraic estimation:\n" << *H;
// Step 2: Refine matrix using Ceres minimizer.
ceres::Problem problem;
for (int i = 0; i < x1.cols(); i++) {
- HomographySymmetricGeometricCostFunctor
- *homography_symmetric_geometric_cost_function =
- new HomographySymmetricGeometricCostFunctor(x1.col(i),
- x2.col(i));
+ HomographySymmetricGeometricCostFunctor*
+ homography_symmetric_geometric_cost_function =
+ new HomographySymmetricGeometricCostFunctor(x1.col(i), x2.col(i));
problem.AddResidualBlock(
- new ceres::AutoDiffCostFunction<
- HomographySymmetricGeometricCostFunctor,
- 4, // num_residuals
- 9>(homography_symmetric_geometric_cost_function),
+ new ceres::AutoDiffCostFunction<HomographySymmetricGeometricCostFunctor,
+ 4, // num_residuals
+ 9>(
+ homography_symmetric_geometric_cost_function),
NULL,
H->data());
}
@@ -369,9 +359,9 @@
return summary.IsSolutionUsable();
}
-} // namespace libmv
+} // namespace
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);
Mat x1(2, 100);
@@ -382,9 +372,11 @@
Mat3 homography_matrix;
// This matrix has been dumped from a Blender test file of plane tracking.
+ // clang-format off
homography_matrix << 1.243715, -0.461057, -111.964454,
0.0, 0.617589, -192.379252,
0.0, -0.000983, 1.0;
+ // clang-format on
Mat x2 = x1;
for (int i = 0; i < x2.cols(); ++i) {
@@ -405,7 +397,7 @@
EstimateHomography2DFromCorrespondences(x1, x2, options, &estimated_matrix);
// Normalize the matrix for easier comparison.
- estimated_matrix /= estimated_matrix(2 ,2);
+ estimated_matrix /= estimated_matrix(2, 2);
std::cout << "Original matrix:\n" << homography_matrix << "\n";
std::cout << "Estimated matrix:\n" << estimated_matrix << "\n";
diff --git a/examples/more_garbow_hillstrom.cc b/examples/more_garbow_hillstrom.cc
index 0dc8fbf..e39d23c 100644
--- a/examples/more_garbow_hillstrom.cc
+++ b/examples/more_garbow_hillstrom.cc
@@ -50,24 +50,27 @@
// A problem is considered solved if of the log relative error of its
// objective function is at least 4.
-
#include <cmath>
#include <iostream> // NOLINT
#include <sstream> // NOLINT
#include <string>
+
#include "ceres/ceres.h"
#include "gflags/gflags.h"
#include "glog/logging.h"
DEFINE_string(problem, "all", "Which problem to solve");
-DEFINE_bool(use_numeric_diff, false,
- "Use numeric differentiation instead of automatic "
- "differentiation.");
-DEFINE_string(numeric_diff_method, "ridders", "When using numeric "
- "differentiation, selects algorithm. Options are: central, "
- "forward, ridders.");
-DEFINE_int32(ridders_extrapolations, 3, "Maximal number of extrapolations in "
- "Ridders' method.");
+DEFINE_bool(use_numeric_diff,
+ false,
+ "Use numeric differentiation instead of automatic"
+ " differentiation.");
+DEFINE_string(numeric_diff_method,
+ "ridders",
+ "When using numeric differentiation, selects algorithm. Options "
+ "are: central, forward, ridders.");
+DEFINE_int32(ridders_extrapolations,
+ 3,
+ "Maximal number of extrapolations in Ridders' method.");
namespace ceres {
namespace examples {
@@ -78,48 +81,48 @@
options->max_num_ridders_extrapolations = FLAGS_ridders_extrapolations;
}
-#define BEGIN_MGH_PROBLEM(name, num_parameters, num_residuals) \
- struct name { \
- static constexpr int kNumParameters = num_parameters; \
- static const double initial_x[kNumParameters]; \
- static const double lower_bounds[kNumParameters]; \
- static const double upper_bounds[kNumParameters]; \
- static const double constrained_optimal_cost; \
- static const double unconstrained_optimal_cost; \
- static CostFunction* Create() { \
- if (FLAGS_use_numeric_diff) { \
- ceres::NumericDiffOptions options; \
- SetNumericDiffOptions(&options); \
- if (FLAGS_numeric_diff_method == "central") { \
- return new NumericDiffCostFunction<name, \
- ceres::CENTRAL, \
- num_residuals, \
- num_parameters>( \
- new name, ceres::TAKE_OWNERSHIP, num_residuals, options); \
- } else if (FLAGS_numeric_diff_method == "forward") { \
- return new NumericDiffCostFunction<name, \
- ceres::FORWARD, \
- num_residuals, \
- num_parameters>( \
- new name, ceres::TAKE_OWNERSHIP, num_residuals, options); \
- } else if (FLAGS_numeric_diff_method == "ridders") { \
- return new NumericDiffCostFunction<name, \
- ceres::RIDDERS, \
- num_residuals, \
- num_parameters>( \
- new name, ceres::TAKE_OWNERSHIP, num_residuals, options); \
- } else { \
- LOG(ERROR) << "Invalid numeric diff method specified"; \
- return NULL; \
- } \
- } else { \
- return new AutoDiffCostFunction<name, \
- num_residuals, \
- num_parameters>(new name); \
- } \
- } \
- template <typename T> \
+#define BEGIN_MGH_PROBLEM(name, num_parameters, num_residuals) \
+ struct name { \
+ static constexpr int kNumParameters = num_parameters; \
+ static const double initial_x[kNumParameters]; \
+ static const double lower_bounds[kNumParameters]; \
+ static const double upper_bounds[kNumParameters]; \
+ static const double constrained_optimal_cost; \
+ static const double unconstrained_optimal_cost; \
+ static CostFunction* Create() { \
+ if (FLAGS_use_numeric_diff) { \
+ ceres::NumericDiffOptions options; \
+ SetNumericDiffOptions(&options); \
+ if (FLAGS_numeric_diff_method == "central") { \
+ return new NumericDiffCostFunction<name, \
+ ceres::CENTRAL, \
+ num_residuals, \
+ num_parameters>( \
+ new name, ceres::TAKE_OWNERSHIP, num_residuals, options); \
+ } else if (FLAGS_numeric_diff_method == "forward") { \
+ return new NumericDiffCostFunction<name, \
+ ceres::FORWARD, \
+ num_residuals, \
+ num_parameters>( \
+ new name, ceres::TAKE_OWNERSHIP, num_residuals, options); \
+ } else if (FLAGS_numeric_diff_method == "ridders") { \
+ return new NumericDiffCostFunction<name, \
+ ceres::RIDDERS, \
+ num_residuals, \
+ num_parameters>( \
+ new name, ceres::TAKE_OWNERSHIP, num_residuals, options); \
+ } else { \
+ LOG(ERROR) << "Invalid numeric diff method specified"; \
+ return NULL; \
+ } \
+ } else { \
+ return new AutoDiffCostFunction<name, num_residuals, num_parameters>( \
+ new name); \
+ } \
+ } \
+ template <typename T> \
bool operator()(const T* const x, T* residual) const {
+// clang-format off
#define END_MGH_PROBLEM return true; } }; // NOLINT
@@ -535,7 +538,10 @@
#undef BEGIN_MGH_PROBLEM
#undef END_MGH_PROBLEM
-template<typename TestProblem> bool Solve(bool is_constrained, int trial) {
+// clang-format on
+
+template <typename TestProblem>
+bool Solve(bool is_constrained, int trial) {
double x[TestProblem::kNumParameters];
for (int i = 0; i < TestProblem::kNumParameters; ++i) {
x[i] = pow(10, trial) * TestProblem::initial_x[i];
@@ -563,16 +569,14 @@
Solve(options, &problem, &summary);
const double kMinLogRelativeError = 4.0;
- const double log_relative_error = -std::log10(
- std::abs(2.0 * summary.final_cost - optimal_cost) /
- (optimal_cost > 0.0 ? optimal_cost : 1.0));
+ const double log_relative_error =
+ -std::log10(std::abs(2.0 * summary.final_cost - optimal_cost) /
+ (optimal_cost > 0.0 ? optimal_cost : 1.0));
const bool success = log_relative_error >= kMinLogRelativeError;
- LOG(INFO) << "Expected : " << optimal_cost
- << " actual: " << 2.0 * summary.final_cost
- << " " << success
- << " in " << summary.total_time_in_seconds
- << " seconds";
+ LOG(INFO) << "Expected : " << optimal_cost
+ << " actual: " << 2.0 * summary.final_cost << " " << success
+ << " in " << summary.total_time_in_seconds << " seconds";
return success;
}
@@ -591,29 +595,29 @@
int constrained_successes = 0;
std::stringstream ss;
-#define UNCONSTRAINED_SOLVE(n) \
- ss << "Unconstrained Problem " << n << " : "; \
- if (FLAGS_problem == #n || FLAGS_problem == "all") { \
- unconstrained_problems += 3; \
- if (Solve<ceres::examples::TestProblem##n>(false, 0)) { \
- unconstrained_successes += 1; \
- ss << "Yes "; \
- } else { \
- ss << "No "; \
- } \
- if (Solve<ceres::examples::TestProblem##n>(false, 1)) { \
- unconstrained_successes += 1; \
- ss << "Yes "; \
- } else { \
- ss << "No "; \
- } \
- if (Solve<ceres::examples::TestProblem##n>(false, 2)) { \
- unconstrained_successes += 1; \
- ss << "Yes "; \
- } else { \
- ss << "No "; \
- } \
- } \
+#define UNCONSTRAINED_SOLVE(n) \
+ ss << "Unconstrained Problem " << n << " : "; \
+ if (FLAGS_problem == #n || FLAGS_problem == "all") { \
+ unconstrained_problems += 3; \
+ if (Solve<ceres::examples::TestProblem##n>(false, 0)) { \
+ unconstrained_successes += 1; \
+ ss << "Yes "; \
+ } else { \
+ ss << "No "; \
+ } \
+ if (Solve<ceres::examples::TestProblem##n>(false, 1)) { \
+ unconstrained_successes += 1; \
+ ss << "Yes "; \
+ } else { \
+ ss << "No "; \
+ } \
+ if (Solve<ceres::examples::TestProblem##n>(false, 2)) { \
+ unconstrained_successes += 1; \
+ ss << "Yes "; \
+ } else { \
+ ss << "No "; \
+ } \
+ } \
ss << std::endl;
UNCONSTRAINED_SOLVE(1);
@@ -636,22 +640,20 @@
UNCONSTRAINED_SOLVE(18);
UNCONSTRAINED_SOLVE(19);
- ss << "Unconstrained : "
- << unconstrained_successes
- << "/"
+ ss << "Unconstrained : " << unconstrained_successes << "/"
<< unconstrained_problems << std::endl;
-#define CONSTRAINED_SOLVE(n) \
- ss << "Constrained Problem " << n << " : "; \
- if (FLAGS_problem == #n || FLAGS_problem == "all") { \
- constrained_problems += 1; \
- if (Solve<ceres::examples::TestProblem##n>(true, 0)) { \
- constrained_successes += 1; \
- ss << "Yes "; \
- } else { \
- ss << "No "; \
- } \
- } \
+#define CONSTRAINED_SOLVE(n) \
+ ss << "Constrained Problem " << n << " : "; \
+ if (FLAGS_problem == #n || FLAGS_problem == "all") { \
+ constrained_problems += 1; \
+ if (Solve<ceres::examples::TestProblem##n>(true, 0)) { \
+ constrained_successes += 1; \
+ ss << "Yes "; \
+ } else { \
+ ss << "No "; \
+ } \
+ } \
ss << std::endl;
CONSTRAINED_SOLVE(3);
@@ -664,10 +666,8 @@
CONSTRAINED_SOLVE(14);
CONSTRAINED_SOLVE(16);
CONSTRAINED_SOLVE(18);
- ss << "Constrained : "
- << constrained_successes
- << "/"
- << constrained_problems << std::endl;
+ ss << "Constrained : " << constrained_successes << "/" << constrained_problems
+ << std::endl;
std::cout << ss.str();
return 0;
diff --git a/examples/nist.cc b/examples/nist.cc
index a9a066e..937d6bd 100644
--- a/examples/nist.cc
+++ b/examples/nist.cc
@@ -83,52 +83,70 @@
#include "glog/logging.h"
DEFINE_bool(use_tiny_solver, false, "Use TinySolver instead of Ceres::Solver");
-DEFINE_string(nist_data_dir, "", "Directory containing the NIST non-linear"
- "regression examples");
-DEFINE_string(minimizer, "trust_region",
+DEFINE_string(nist_data_dir,
+ "",
+ "Directory containing the NIST non-linear regression examples");
+DEFINE_string(minimizer,
+ "trust_region",
"Minimizer type to use, choices are: line_search & trust_region");
-DEFINE_string(trust_region_strategy, "levenberg_marquardt",
+DEFINE_string(trust_region_strategy,
+ "levenberg_marquardt",
"Options are: levenberg_marquardt, dogleg");
-DEFINE_string(dogleg, "traditional_dogleg",
+DEFINE_string(dogleg,
+ "traditional_dogleg",
"Options are: traditional_dogleg, subspace_dogleg");
-DEFINE_string(linear_solver, "dense_qr", "Options are: "
- "sparse_cholesky, dense_qr, dense_normal_cholesky and"
- "cgnr");
-DEFINE_string(preconditioner, "jacobi", "Options are: "
- "identity, jacobi");
-DEFINE_string(line_search, "wolfe",
+DEFINE_string(linear_solver,
+ "dense_qr",
+ "Options are: sparse_cholesky, dense_qr, dense_normal_cholesky "
+ "and cgnr");
+DEFINE_string(preconditioner, "jacobi", "Options are: identity, jacobi");
+DEFINE_string(line_search,
+ "wolfe",
"Line search algorithm to use, choices are: armijo and wolfe.");
-DEFINE_string(line_search_direction, "lbfgs",
+DEFINE_string(line_search_direction,
+ "lbfgs",
"Line search direction algorithm to use, choices: lbfgs, bfgs");
-DEFINE_int32(max_line_search_iterations, 20,
+DEFINE_int32(max_line_search_iterations,
+ 20,
"Maximum number of iterations for each line search.");
-DEFINE_int32(max_line_search_restarts, 10,
+DEFINE_int32(max_line_search_restarts,
+ 10,
"Maximum number of restarts of line search direction algorithm.");
-DEFINE_string(line_search_interpolation, "cubic",
- "Degree of polynomial aproximation in line search, "
- "choices are: bisection, quadratic & cubic.");
-DEFINE_int32(lbfgs_rank, 20,
+DEFINE_string(line_search_interpolation,
+ "cubic",
+ "Degree of polynomial aproximation in line search, choices are: "
+ "bisection, quadratic & cubic.");
+DEFINE_int32(lbfgs_rank,
+ 20,
"Rank of L-BFGS inverse Hessian approximation in line search.");
-DEFINE_bool(approximate_eigenvalue_bfgs_scaling, false,
+DEFINE_bool(approximate_eigenvalue_bfgs_scaling,
+ false,
"Use approximate eigenvalue scaling in (L)BFGS line search.");
-DEFINE_double(sufficient_decrease, 1.0e-4,
+DEFINE_double(sufficient_decrease,
+ 1.0e-4,
"Line search Armijo sufficient (function) decrease factor.");
-DEFINE_double(sufficient_curvature_decrease, 0.9,
+DEFINE_double(sufficient_curvature_decrease,
+ 0.9,
"Line search Wolfe sufficient curvature decrease factor.");
DEFINE_int32(num_iterations, 10000, "Number of iterations");
-DEFINE_bool(nonmonotonic_steps, false, "Trust region algorithm can use"
- " nonmonotic steps");
+DEFINE_bool(nonmonotonic_steps,
+ false,
+ "Trust region algorithm can use nonmonotic steps");
DEFINE_double(initial_trust_region_radius, 1e4, "Initial trust region radius");
-DEFINE_bool(use_numeric_diff, false,
+DEFINE_bool(use_numeric_diff,
+ false,
"Use numeric differentiation instead of automatic "
"differentiation.");
-DEFINE_string(numeric_diff_method, "ridders", "When using numeric "
- "differentiation, selects algorithm. Options are: central, "
- "forward, ridders.");
-DEFINE_double(ridders_step_size, 1e-9, "Initial step size for Ridders "
- "numeric differentiation.");
-DEFINE_int32(ridders_extrapolations, 3, "Maximal number of Ridders "
- "extrapolations.");
+DEFINE_string(numeric_diff_method,
+ "ridders",
+ "When using numeric differentiation, selects algorithm. Options "
+ "are: central, forward, ridders.");
+DEFINE_double(ridders_step_size,
+ 1e-9,
+ "Initial step size for Ridders numeric differentiation.");
+DEFINE_int32(ridders_extrapolations,
+ 3,
+ "Maximal number of Ridders extrapolations.");
namespace ceres {
namespace examples {
@@ -149,7 +167,7 @@
void SplitStringUsingChar(const string& full,
const char delim,
vector<string>* result) {
- std::back_insert_iterator< vector<string> > it(*result);
+ std::back_insert_iterator<vector<string> > it(*result);
const char* p = full.data();
const char* end = p + full.size();
@@ -222,12 +240,12 @@
// Parse the remaining parameter lines.
for (int parameter_id = 1; parameter_id < kNumParameters; ++parameter_id) {
- GetAndSplitLine(ifs, &pieces);
- // b2, b3, ....
- for (int i = 0; i < kNumTries; ++i) {
- initial_parameters_(i, parameter_id) = atof(pieces[i + 2].c_str());
- }
- final_parameters_(0, parameter_id) = atof(pieces[2 + kNumTries].c_str());
+ GetAndSplitLine(ifs, &pieces);
+ // b2, b3, ....
+ for (int i = 0; i < kNumTries; ++i) {
+ initial_parameters_(i, parameter_id) = atof(pieces[i + 2].c_str());
+ }
+ final_parameters_(0, parameter_id) = atof(pieces[2 + kNumTries].c_str());
}
// Certfied cost
@@ -241,26 +259,28 @@
GetAndSplitLine(ifs, &pieces);
// Response.
for (int j = 0; j < kNumResponses; ++j) {
- response_(i, j) = atof(pieces[j].c_str());
+ response_(i, j) = atof(pieces[j].c_str());
}
// Predictor variables.
for (int j = 0; j < kNumPredictors; ++j) {
- predictor_(i, j) = atof(pieces[j + kNumResponses].c_str());
+ predictor_(i, j) = atof(pieces[j + kNumResponses].c_str());
}
}
}
- Matrix initial_parameters(int start) const { return initial_parameters_.row(start); } // NOLINT
- Matrix final_parameters() const { return final_parameters_; }
- Matrix predictor() const { return predictor_; }
- Matrix response() const { return response_; }
- int predictor_size() const { return predictor_.cols(); }
- int num_observations() const { return predictor_.rows(); }
- int response_size() const { return response_.cols(); }
- int num_parameters() const { return initial_parameters_.cols(); }
- int num_starts() const { return initial_parameters_.rows(); }
- double certified_cost() const { return certified_cost_; }
+ Matrix initial_parameters(int start) const {
+ return initial_parameters_.row(start);
+ } // NOLINT
+ Matrix final_parameters() const { return final_parameters_; }
+ Matrix predictor() const { return predictor_; }
+ Matrix response() const { return response_; }
+ int predictor_size() const { return predictor_.cols(); }
+ int num_observations() const { return predictor_.rows(); }
+ int response_size() const { return response_.cols(); }
+ int num_parameters() const { return initial_parameters_.cols(); }
+ int num_starts() const { return initial_parameters_.rows(); }
+ double certified_cost() const { return certified_cost_; }
private:
Matrix predictor_;
@@ -270,21 +290,23 @@
double certified_cost_;
};
-#define NIST_BEGIN(CostFunctionName) \
- struct CostFunctionName { \
- CostFunctionName(const double* const x, \
- const double* const y, \
- const int n) \
- : x_(x), y_(y), n_(n) {} \
- const double* x_; \
- const double* y_; \
- const int n_; \
- template <typename T> \
- bool operator()(const T* const b, T* residual) const { \
- for (int i = 0; i < n_; ++i) { \
- const T x(x_[i]); \
+#define NIST_BEGIN(CostFunctionName) \
+ struct CostFunctionName { \
+ CostFunctionName(const double* const x, \
+ const double* const y, \
+ const int n) \
+ : x_(x), y_(y), n_(n) {} \
+ const double* x_; \
+ const double* y_; \
+ const int n_; \
+ template <typename T> \
+ bool operator()(const T* const b, T* residual) const { \
+ for (int i = 0; i < n_; ++i) { \
+ const T x(x_[i]); \
residual[i] = y_[i] - (
+// clang-format off
+
#define NIST_END ); } return true; }};
// y = b1 * (b2+x)**(-1/b3) + e
@@ -430,6 +452,8 @@
const int n_;
};
+// clang-format on
+
static void SetNumericDiffOptions(ceres::NumericDiffOptions* options) {
options->max_num_ridders_extrapolations = FLAGS_ridders_extrapolations;
options->ridders_relative_initial_step_size = FLAGS_ridders_step_size;
@@ -473,9 +497,9 @@
string JoinPath(const string& dirname, const string& basename) {
#ifdef _WIN32
- static const char separator = '\\';
+ static const char separator = '\\';
#else
- static const char separator = '/';
+ static const char separator = '/';
#endif // _WIN32
if ((!basename.empty() && basename[0] == separator) || dirname.empty()) {
@@ -491,8 +515,7 @@
CostFunction* CreateCostFunction(const Matrix& predictor,
const Matrix& response,
const int num_observations) {
- Model* model =
- new Model(predictor.data(), response.data(), num_observations);
+ Model* model = new Model(predictor.data(), response.data(), num_observations);
ceres::CostFunction* cost_function = NULL;
if (FLAGS_use_numeric_diff) {
ceres::NumericDiffOptions options;
@@ -502,28 +525,19 @@
ceres::CENTRAL,
ceres::DYNAMIC,
num_parameters>(
- model,
- ceres::TAKE_OWNERSHIP,
- num_observations,
- options);
+ model, ceres::TAKE_OWNERSHIP, num_observations, options);
} else if (FLAGS_numeric_diff_method == "forward") {
cost_function = new NumericDiffCostFunction<Model,
ceres::FORWARD,
ceres::DYNAMIC,
num_parameters>(
- model,
- ceres::TAKE_OWNERSHIP,
- num_observations,
- options);
+ model, ceres::TAKE_OWNERSHIP, num_observations, options);
} else if (FLAGS_numeric_diff_method == "ridders") {
cost_function = new NumericDiffCostFunction<Model,
ceres::RIDDERS,
ceres::DYNAMIC,
num_parameters>(
- model,
- ceres::TAKE_OWNERSHIP,
- num_observations,
- options);
+ model, ceres::TAKE_OWNERSHIP, num_observations, options);
} else {
LOG(ERROR) << "Invalid numeric diff method specified";
return 0;
@@ -572,8 +586,9 @@
int num_success = 0;
for (int start = 0; start < nist_problem.num_starts(); ++start) {
Matrix initial_parameters = nist_problem.initial_parameters(start);
- ceres::CostFunction* cost_function = CreateCostFunction<Model, num_parameters>(
- predictor, response, nist_problem.num_observations());
+ ceres::CostFunction* cost_function =
+ CreateCostFunction<Model, num_parameters>(
+ predictor, response, nist_problem.num_observations());
double initial_cost;
double final_cost;
@@ -609,8 +624,8 @@
delete cost_function;
}
- const double log_relative_error = ComputeLRE(nist_problem.final_parameters(),
- initial_parameters);
+ const double log_relative_error =
+ ComputeLRE(nist_problem.final_parameters(), initial_parameters);
const int kMinNumMatchingDigits = 4;
if (log_relative_error > kMinNumMatchingDigits) {
++num_success;
@@ -629,7 +644,6 @@
return num_success;
}
-
void SolveNISTProblems() {
if (FLAGS_nist_data_dir.empty()) {
LOG(FATAL) << "Must specify the directory containing the NIST problems";
diff --git a/examples/pgm_image.h b/examples/pgm_image.h
index 1de8d67..3d2df63 100644
--- a/examples/pgm_image.h
+++ b/examples/pgm_image.h
@@ -46,7 +46,7 @@
namespace ceres {
namespace examples {
-template<typename Real>
+template <typename Real>
class PGMImage {
public:
// Create an empty image
@@ -63,9 +63,9 @@
// Get individual pixels
Real* MutablePixel(int x, int y);
- Real Pixel(int x, int y) const;
+ Real Pixel(int x, int y) const;
Real* MutablePixelFromLinearIndex(int index);
- Real PixelFromLinearIndex(int index) const;
+ Real PixelFromLinearIndex(int index) const;
int LinearIndex(int x, int y) const;
// Adds an image to another
@@ -90,52 +90,51 @@
// --- IMPLEMENTATION
-template<typename Real>
+template <typename Real>
PGMImage<Real>::PGMImage(int width, int height)
- : height_(height), width_(width), data_(width*height, 0.0) {
-}
+ : height_(height), width_(width), data_(width * height, 0.0) {}
-template<typename Real>
+template <typename Real>
PGMImage<Real>::PGMImage(std::string filename) {
if (!ReadFromFile(filename)) {
height_ = 0;
- width_ = 0;
+ width_ = 0;
}
}
-template<typename Real>
+template <typename Real>
void PGMImage<Real>::Set(double constant) {
for (int i = 0; i < data_.size(); ++i) {
data_[i] = constant;
}
}
-template<typename Real>
+template <typename Real>
int PGMImage<Real>::width() const {
return width_;
}
-template<typename Real>
+template <typename Real>
int PGMImage<Real>::height() const {
return height_;
}
-template<typename Real>
+template <typename Real>
int PGMImage<Real>::NumPixels() const {
return width_ * height_;
}
-template<typename Real>
+template <typename Real>
Real* PGMImage<Real>::MutablePixel(int x, int y) {
return MutablePixelFromLinearIndex(LinearIndex(x, y));
}
-template<typename Real>
+template <typename Real>
Real PGMImage<Real>::Pixel(int x, int y) const {
return PixelFromLinearIndex(LinearIndex(x, y));
}
-template<typename Real>
+template <typename Real>
Real* PGMImage<Real>::MutablePixelFromLinearIndex(int index) {
CHECK(index >= 0);
CHECK(index < width_ * height_);
@@ -143,22 +142,22 @@
return &data_[index];
}
-template<typename Real>
-Real PGMImage<Real>::PixelFromLinearIndex(int index) const {
+template <typename Real>
+Real PGMImage<Real>::PixelFromLinearIndex(int index) const {
CHECK(index >= 0);
CHECK(index < width_ * height_);
CHECK(index < data_.size());
return data_[index];
}
-template<typename Real>
+template <typename Real>
int PGMImage<Real>::LinearIndex(int x, int y) const {
- return x + width_*y;
+ return x + width_ * y;
}
// Adds an image to another
-template<typename Real>
-void PGMImage<Real>::operator+= (const PGMImage<Real>& image) {
+template <typename Real>
+void PGMImage<Real>::operator+=(const PGMImage<Real>& image) {
CHECK(data_.size() == image.data_.size());
for (int i = 0; i < data_.size(); ++i) {
data_[i] += image.data_[i];
@@ -166,22 +165,22 @@
}
// Adds a constant to an image
-template<typename Real>
-void PGMImage<Real>::operator+= (Real a) {
+template <typename Real>
+void PGMImage<Real>::operator+=(Real a) {
for (int i = 0; i < data_.size(); ++i) {
data_[i] += a;
}
}
// Multiplies an image by a constant
-template<typename Real>
-void PGMImage<Real>::operator*= (Real a) {
+template <typename Real>
+void PGMImage<Real>::operator*=(Real a) {
for (int i = 0; i < data_.size(); ++i) {
data_[i] *= a;
}
}
-template<typename Real>
+template <typename Real>
bool PGMImage<Real>::WriteToFile(std::string filename) const {
std::ofstream outputfile(filename.c_str());
outputfile << "P2" << std::endl;
@@ -191,7 +190,7 @@
outputfile << width_ << ' ' << height_ << " 255 " << std::endl;
// Write data
- int num_pixels = width_*height_;
+ int num_pixels = width_ * height_;
for (int i = 0; i < num_pixels; ++i) {
// Convert to integer by rounding when writing file
outputfile << static_cast<int>(data_[i] + 0.5) << ' ';
@@ -200,10 +199,10 @@
return bool(outputfile); // Returns true/false
}
-namespace {
+namespace {
// Helper function to read data from a text file, ignoring "#" comments.
-template<typename T>
+template <typename T>
bool GetIgnoreComment(std::istream* in, T& t) {
std::string word;
bool ok;
@@ -229,7 +228,7 @@
}
} // namespace
-template<typename Real>
+template <typename Real>
bool PGMImage<Real>::ReadFromFile(std::string filename) {
std::ifstream inputfile(filename.c_str());
@@ -242,9 +241,9 @@
// Read the image header
int two_fifty_five;
- if (!GetIgnoreComment(&inputfile, width_) ||
+ if (!GetIgnoreComment(&inputfile, width_) ||
!GetIgnoreComment(&inputfile, height_) ||
- !GetIgnoreComment(&inputfile, two_fifty_five) ) {
+ !GetIgnoreComment(&inputfile, two_fifty_five)) {
return false;
}
// Assert that the number of grey levels is 255.
@@ -253,7 +252,7 @@
}
// Now read the data
- int num_pixels = width_*height_;
+ int num_pixels = width_ * height_;
data_.resize(num_pixels);
if (ch2 == '2') {
// Ascii file
@@ -297,7 +296,7 @@
return true;
}
-template<typename Real>
+template <typename Real>
bool PGMImage<Real>::SetData(const std::vector<Real>& new_data) {
// This function cannot change the dimensions
if (new_data.size() != data_.size()) {
@@ -307,7 +306,7 @@
return true;
}
-template<typename Real>
+template <typename Real>
const std::vector<Real>& PGMImage<Real>::data() const {
return data_;
}
@@ -315,5 +314,4 @@
} // namespace examples
} // namespace ceres
-
#endif // CERES_EXAMPLES_PGM_IMAGE_H_
diff --git a/examples/powell.cc b/examples/powell.cc
index bbb63d5..c75ad24 100644
--- a/examples/powell.cc
+++ b/examples/powell.cc
@@ -45,6 +45,7 @@
// Vol 7(1), March 1981.
#include <vector>
+
#include "ceres/ceres.h"
#include "gflags/gflags.h"
#include "glog/logging.h"
@@ -52,13 +53,12 @@
using ceres::AutoDiffCostFunction;
using ceres::CostFunction;
using ceres::Problem;
-using ceres::Solver;
using ceres::Solve;
+using ceres::Solver;
struct F1 {
- template <typename T> bool operator()(const T* const x1,
- const T* const x2,
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const x1, const T* const x2, T* residual) const {
// f1 = x1 + 10 * x2;
residual[0] = x1[0] + 10.0 * x2[0];
return true;
@@ -66,9 +66,8 @@
};
struct F2 {
- template <typename T> bool operator()(const T* const x3,
- const T* const x4,
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const x3, const T* const x4, T* residual) const {
// f2 = sqrt(5) (x3 - x4)
residual[0] = sqrt(5.0) * (x3[0] - x4[0]);
return true;
@@ -76,9 +75,8 @@
};
struct F3 {
- template <typename T> bool operator()(const T* const x2,
- const T* const x3,
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const x2, const T* const x3, T* residual) const {
// f3 = (x2 - 2 x3)^2
residual[0] = (x2[0] - 2.0 * x3[0]) * (x2[0] - 2.0 * x3[0]);
return true;
@@ -86,47 +84,44 @@
};
struct F4 {
- template <typename T> bool operator()(const T* const x1,
- const T* const x4,
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const x1, const T* const x4, T* residual) const {
// f4 = sqrt(10) (x1 - x4)^2
residual[0] = sqrt(10.0) * (x1[0] - x4[0]) * (x1[0] - x4[0]);
return true;
}
};
-DEFINE_string(minimizer, "trust_region",
+DEFINE_string(minimizer,
+ "trust_region",
"Minimizer type to use, choices are: line_search & trust_region");
int main(int argc, char** argv) {
GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
google::InitGoogleLogging(argv[0]);
- double x1 = 3.0;
+ double x1 = 3.0;
double x2 = -1.0;
- double x3 = 0.0;
- double x4 = 1.0;
+ double x3 = 0.0;
+ double x4 = 1.0;
Problem problem;
// Add residual terms to the problem using the using the autodiff
// wrapper to get the derivatives automatically. The parameters, x1 through
// x4, are modified in place.
- problem.AddResidualBlock(new AutoDiffCostFunction<F1, 1, 1, 1>(new F1),
- NULL,
- &x1, &x2);
- problem.AddResidualBlock(new AutoDiffCostFunction<F2, 1, 1, 1>(new F2),
- NULL,
- &x3, &x4);
- problem.AddResidualBlock(new AutoDiffCostFunction<F3, 1, 1, 1>(new F3),
- NULL,
- &x2, &x3);
- problem.AddResidualBlock(new AutoDiffCostFunction<F4, 1, 1, 1>(new F4),
- NULL,
- &x1, &x4);
+ problem.AddResidualBlock(
+ new AutoDiffCostFunction<F1, 1, 1, 1>(new F1), NULL, &x1, &x2);
+ problem.AddResidualBlock(
+ new AutoDiffCostFunction<F2, 1, 1, 1>(new F2), NULL, &x3, &x4);
+ problem.AddResidualBlock(
+ new AutoDiffCostFunction<F3, 1, 1, 1>(new F3), NULL, &x2, &x3);
+ problem.AddResidualBlock(
+ new AutoDiffCostFunction<F4, 1, 1, 1>(new F4), NULL, &x1, &x4);
Solver::Options options;
- LOG_IF(FATAL, !ceres::StringToMinimizerType(FLAGS_minimizer,
- &options.minimizer_type))
+ LOG_IF(
+ FATAL,
+ !ceres::StringToMinimizerType(FLAGS_minimizer, &options.minimizer_type))
<< "Invalid minimizer: " << FLAGS_minimizer
<< ", valid options are: trust_region and line_search.";
@@ -134,21 +129,25 @@
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_progress_to_stdout = true;
+ // clang-format off
std::cout << "Initial x1 = " << x1
<< ", x2 = " << x2
<< ", x3 = " << x3
<< ", x4 = " << x4
<< "\n";
+ // clang-format on
// Run the solver!
Solver::Summary summary;
Solve(options, &problem, &summary);
std::cout << summary.FullReport() << "\n";
+ // clang-format off
std::cout << "Final x1 = " << x1
<< ", x2 = " << x2
<< ", x3 = " << x3
<< ", x4 = " << x4
<< "\n";
+ // clang-format on
return 0;
}
diff --git a/examples/random.h b/examples/random.h
index 7b09b15..ace0711 100644
--- a/examples/random.h
+++ b/examples/random.h
@@ -52,7 +52,7 @@
x1 = 2.0 * RandDouble() - 1.0;
x2 = 2.0 * RandDouble() - 1.0;
w = x1 * x1 + x2 * x2;
- } while ( w >= 1.0 || w == 0.0 );
+ } while (w >= 1.0 || w == 0.0);
w = sqrt((-2.0 * log(w)) / w);
return x1 * w;
diff --git a/examples/robot_pose_mle.cc b/examples/robot_pose_mle.cc
index 83c0903..ab9a098 100644
--- a/examples/robot_pose_mle.cc
+++ b/examples/robot_pose_mle.cc
@@ -125,8 +125,9 @@
// will be computed by a DynamicAutoDiffCostFunction since the number of
// odoemtry observations will only be known at run time.
-#include <cstdio>
#include <math.h>
+
+#include <cstdio>
#include <vector>
#include "ceres/ceres.h"
@@ -136,9 +137,9 @@
#include "random.h"
using ceres::AutoDiffCostFunction;
-using ceres::DynamicAutoDiffCostFunction;
using ceres::CauchyLoss;
using ceres::CostFunction;
+using ceres::DynamicAutoDiffCostFunction;
using ceres::LossFunction;
using ceres::Problem;
using ceres::Solve;
@@ -147,17 +148,22 @@
using std::min;
using std::vector;
-DEFINE_double(corridor_length, 30.0, "Length of the corridor that the robot is "
- "travelling down.");
+DEFINE_double(corridor_length,
+ 30.0,
+ "Length of the corridor that the robot is travelling down.");
-DEFINE_double(pose_separation, 0.5, "The distance that the robot traverses "
- "between successive odometry updates.");
+DEFINE_double(pose_separation,
+ 0.5,
+ "The distance that the robot traverses between successive "
+ "odometry updates.");
-DEFINE_double(odometry_stddev, 0.1, "The standard deviation of "
- "odometry error of the robot.");
+DEFINE_double(odometry_stddev,
+ 0.1,
+ "The standard deviation of odometry error of the robot.");
-DEFINE_double(range_stddev, 0.01, "The standard deviation of range readings of "
- "the robot.");
+DEFINE_double(range_stddev,
+ 0.01,
+ "The standard deviation of range readings of the robot.");
// The stride length of the dynamic_autodiff_cost_function evaluator.
static constexpr int kStride = 10;
@@ -165,8 +171,8 @@
struct OdometryConstraint {
typedef AutoDiffCostFunction<OdometryConstraint, 1, 1> OdometryCostFunction;
- OdometryConstraint(double odometry_mean, double odometry_stddev) :
- odometry_mean(odometry_mean), odometry_stddev(odometry_stddev) {}
+ OdometryConstraint(double odometry_mean, double odometry_stddev)
+ : odometry_mean(odometry_mean), odometry_stddev(odometry_stddev) {}
template <typename T>
bool operator()(const T* const odometry, T* residual) const {
@@ -187,13 +193,14 @@
typedef DynamicAutoDiffCostFunction<RangeConstraint, kStride>
RangeCostFunction;
- RangeConstraint(
- int pose_index,
- double range_reading,
- double range_stddev,
- double corridor_length) :
- pose_index(pose_index), range_reading(range_reading),
- range_stddev(range_stddev), corridor_length(corridor_length) {}
+ RangeConstraint(int pose_index,
+ double range_reading,
+ double range_stddev,
+ double corridor_length)
+ : pose_index(pose_index),
+ range_reading(range_reading),
+ range_stddev(range_stddev),
+ corridor_length(corridor_length) {}
template <typename T>
bool operator()(T const* const* relative_poses, T* residuals) const {
@@ -201,8 +208,8 @@
for (int i = 0; i <= pose_index; ++i) {
global_pose += relative_poses[i][0];
}
- residuals[0] = (global_pose + range_reading - corridor_length) /
- range_stddev;
+ residuals[0] =
+ (global_pose + range_reading - corridor_length) / range_stddev;
return true;
}
@@ -235,14 +242,14 @@
void SimulateRobot(vector<double>* odometry_values,
vector<double>* range_readings) {
- const int num_steps = static_cast<int>(
- ceil(FLAGS_corridor_length / FLAGS_pose_separation));
+ const int num_steps =
+ static_cast<int>(ceil(FLAGS_corridor_length / FLAGS_pose_separation));
// The robot starts out at the origin.
double robot_location = 0.0;
for (int i = 0; i < num_steps; ++i) {
- const double actual_odometry_value = min(
- FLAGS_pose_separation, FLAGS_corridor_length - robot_location);
+ const double actual_odometry_value =
+ min(FLAGS_pose_separation, FLAGS_corridor_length - robot_location);
robot_location += actual_odometry_value;
const double actual_range = FLAGS_corridor_length - robot_location;
const double observed_odometry =
@@ -263,11 +270,14 @@
robot_location += odometry_readings[i];
const double range_error =
robot_location + range_readings[i] - FLAGS_corridor_length;
- const double odometry_error =
- FLAGS_pose_separation - odometry_readings[i];
+ const double odometry_error = FLAGS_pose_separation - odometry_readings[i];
printf("%4d: %8.3f %8.3f %8.3f %8.3f %8.3f\n",
- static_cast<int>(i), robot_location, odometry_readings[i],
- range_readings[i], range_error, odometry_error);
+ static_cast<int>(i),
+ robot_location,
+ odometry_readings[i],
+ range_readings[i],
+ range_error,
+ odometry_error);
}
}
diff --git a/examples/robust_curve_fitting.cc b/examples/robust_curve_fitting.cc
index 6186aa1..9b526c5 100644
--- a/examples/robust_curve_fitting.cc
+++ b/examples/robust_curve_fitting.cc
@@ -43,6 +43,7 @@
// data = [x', y_observed'];
const int kNumObservations = 67;
+// clang-format off
const double data[] = {
0.000000e+00, 1.133898e+00,
7.500000e-02, 1.334902e+00,
@@ -112,21 +113,20 @@
4.875000e+00, 4.727863e+00,
4.950000e+00, 4.669206e+00
};
+// clang-format on
using ceres::AutoDiffCostFunction;
-using ceres::CostFunction;
using ceres::CauchyLoss;
+using ceres::CostFunction;
using ceres::Problem;
using ceres::Solve;
using ceres::Solver;
struct ExponentialResidual {
- ExponentialResidual(double x, double y)
- : x_(x), y_(y) {}
+ ExponentialResidual(double x, double y) : x_(x), y_(y) {}
- template <typename T> bool operator()(const T* const m,
- const T* const c,
- T* residual) const {
+ template <typename T>
+ bool operator()(const T* const m, const T* const c, T* residual) const {
residual[0] = y_ - exp(m[0] * x_ + c[0]);
return true;
}
@@ -147,9 +147,7 @@
CostFunction* cost_function =
new AutoDiffCostFunction<ExponentialResidual, 1, 1, 1>(
new ExponentialResidual(data[2 * i], data[2 * i + 1]));
- problem.AddResidualBlock(cost_function,
- new CauchyLoss(0.5),
- &m, &c);
+ problem.AddResidualBlock(cost_function, new CauchyLoss(0.5), &m, &c);
}
Solver::Options options;
diff --git a/examples/rosenbrock.cc b/examples/rosenbrock.cc
index 3f64f1c..1b9aef6 100644
--- a/examples/rosenbrock.cc
+++ b/examples/rosenbrock.cc
@@ -53,7 +53,6 @@
virtual int NumParameters() const { return 2; }
};
-
int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);
@@ -68,7 +67,7 @@
std::cout << summary.FullReport() << "\n";
std::cout << "Initial x: " << -1.2 << " y: " << 1.0 << "\n";
- std::cout << "Final x: " << parameters[0]
- << " y: " << parameters[1] << "\n";
+ std::cout << "Final x: " << parameters[0] << " y: " << parameters[1]
+ << "\n";
return 0;
}
diff --git a/examples/sampled_function/sampled_function.cc b/examples/sampled_function/sampled_function.cc
index 093276a..7dec42b 100644
--- a/examples/sampled_function/sampled_function.cc
+++ b/examples/sampled_function/sampled_function.cc
@@ -35,23 +35,23 @@
#include "ceres/cubic_interpolation.h"
#include "glog/logging.h"
-using ceres::Grid1D;
-using ceres::CubicInterpolator;
using ceres::AutoDiffCostFunction;
using ceres::CostFunction;
+using ceres::CubicInterpolator;
+using ceres::Grid1D;
using ceres::Problem;
-using ceres::Solver;
using ceres::Solve;
+using ceres::Solver;
// A simple cost functor that interfaces an interpolated table of
// values with automatic differentiation.
struct InterpolatedCostFunctor {
explicit InterpolatedCostFunctor(
const CubicInterpolator<Grid1D<double> >& interpolator)
- : interpolator_(interpolator) {
- }
+ : interpolator_(interpolator) {}
- template<typename T> bool operator()(const T* x, T* residuals) const {
+ template <typename T>
+ bool operator()(const T* x, T* residuals) const {
interpolator_.Evaluate(*x, residuals);
return true;
}
diff --git a/examples/simple_bundle_adjuster.cc b/examples/simple_bundle_adjuster.cc
index dec6cd6..8180d73 100644
--- a/examples/simple_bundle_adjuster.cc
+++ b/examples/simple_bundle_adjuster.cc
@@ -52,10 +52,10 @@
delete[] parameters_;
}
- int num_observations() const { return num_observations_; }
- const double* observations() const { return observations_; }
- double* mutable_cameras() { return parameters_; }
- double* mutable_points() { return parameters_ + 9 * num_cameras_; }
+ int num_observations() const { return num_observations_; }
+ const double* observations() const { return observations_; }
+ double* mutable_cameras() { return parameters_; }
+ double* mutable_points() { return parameters_ + 9 * num_cameras_; }
double* mutable_camera_for_observation(int i) {
return mutable_cameras() + camera_index_[i] * 9;
@@ -85,7 +85,7 @@
FscanfOrDie(fptr, "%d", camera_index_ + i);
FscanfOrDie(fptr, "%d", point_index_ + i);
for (int j = 0; j < 2; ++j) {
- FscanfOrDie(fptr, "%lf", observations_ + 2*i + j);
+ FscanfOrDie(fptr, "%lf", observations_ + 2 * i + j);
}
}
@@ -96,8 +96,8 @@
}
private:
- template<typename T>
- void FscanfOrDie(FILE *fptr, const char *format, T *value) {
+ template <typename T>
+ void FscanfOrDie(FILE* fptr, const char* format, T* value) {
int num_scanned = fscanf(fptr, format, value);
if (num_scanned != 1) {
LOG(FATAL) << "Invalid UW data file.";
@@ -139,14 +139,14 @@
// Compute the center of distortion. The sign change comes from
// the camera model that Noah Snavely's Bundler assumes, whereby
// the camera coordinate system has a negative z axis.
- T xp = - p[0] / p[2];
- T yp = - p[1] / p[2];
+ T xp = -p[0] / p[2];
+ T yp = -p[1] / p[2];
// Apply second and fourth order radial distortion.
const T& l1 = camera[7];
const T& l2 = camera[8];
- T r2 = xp*xp + yp*yp;
- T distortion = 1.0 + r2 * (l1 + l2 * r2);
+ T r2 = xp * xp + yp * yp;
+ T distortion = 1.0 + r2 * (l1 + l2 * r2);
// Compute final projected point position.
const T& focal = camera[6];
@@ -165,7 +165,7 @@
static ceres::CostFunction* Create(const double observed_x,
const double observed_y) {
return (new ceres::AutoDiffCostFunction<SnavelyReprojectionError, 2, 9, 3>(
- new SnavelyReprojectionError(observed_x, observed_y)));
+ new SnavelyReprojectionError(observed_x, observed_y)));
}
double observed_x;
@@ -195,9 +195,8 @@
// dimensional residual. Internally, the cost function stores the observed
// image location and compares the reprojection against the observation.
- ceres::CostFunction* cost_function =
- SnavelyReprojectionError::Create(observations[2 * i + 0],
- observations[2 * i + 1]);
+ ceres::CostFunction* cost_function = SnavelyReprojectionError::Create(
+ observations[2 * i + 0], observations[2 * i + 1]);
problem.AddResidualBlock(cost_function,
NULL /* squared loss */,
bal_problem.mutable_camera_for_observation(i),
diff --git a/examples/slam/common/read_g2o.h b/examples/slam/common/read_g2o.h
index 71b071c..fea32e9 100644
--- a/examples/slam/common/read_g2o.h
+++ b/examples/slam/common/read_g2o.h
@@ -97,7 +97,9 @@
// where I_ij is the (i, j)-th entry of the information matrix for the
// measurement. Only the upper-triangular part is stored. The measurement order
// is the delta position followed by the delta orientation.
-template <typename Pose, typename Constraint, typename MapAllocator,
+template <typename Pose,
+ typename Constraint,
+ typename MapAllocator,
typename VectorAllocator>
bool ReadG2oFile(const std::string& filename,
std::map<int, Pose, std::less<int>, MapAllocator>* poses,
diff --git a/examples/slam/pose_graph_2d/angle_local_parameterization.h b/examples/slam/pose_graph_2d/angle_local_parameterization.h
index 428cccc..a81637c 100644
--- a/examples/slam/pose_graph_2d/angle_local_parameterization.h
+++ b/examples/slam/pose_graph_2d/angle_local_parameterization.h
@@ -41,9 +41,9 @@
// [-pi to pi).
class AngleLocalParameterization {
public:
-
template <typename T>
- bool operator()(const T* theta_radians, const T* delta_theta_radians,
+ bool operator()(const T* theta_radians,
+ const T* delta_theta_radians,
T* theta_radians_plus_delta) const {
*theta_radians_plus_delta =
NormalizeAngle(*theta_radians + *delta_theta_radians);
@@ -53,7 +53,8 @@
static ceres::LocalParameterization* Create() {
return (new ceres::AutoDiffLocalParameterization<AngleLocalParameterization,
- 1, 1>);
+ 1,
+ 1>);
}
};
diff --git a/examples/slam/pose_graph_2d/normalize_angle.h b/examples/slam/pose_graph_2d/normalize_angle.h
index afd5df4..c215671 100644
--- a/examples/slam/pose_graph_2d/normalize_angle.h
+++ b/examples/slam/pose_graph_2d/normalize_angle.h
@@ -44,7 +44,7 @@
// Use ceres::floor because it is specialized for double and Jet types.
T two_pi(2.0 * M_PI);
return angle_radians -
- two_pi * ceres::floor((angle_radians + T(M_PI)) / two_pi);
+ two_pi * ceres::floor((angle_radians + T(M_PI)) / two_pi);
}
} // namespace examples
diff --git a/examples/slam/pose_graph_2d/pose_graph_2d.cc b/examples/slam/pose_graph_2d/pose_graph_2d.cc
index 0d9b047..1172123 100644
--- a/examples/slam/pose_graph_2d/pose_graph_2d.cc
+++ b/examples/slam/pose_graph_2d/pose_graph_2d.cc
@@ -71,7 +71,8 @@
for (std::vector<Constraint2d>::const_iterator constraints_iter =
constraints.begin();
- constraints_iter != constraints.end(); ++constraints_iter) {
+ constraints_iter != constraints.end();
+ ++constraints_iter) {
const Constraint2d& constraint = *constraints_iter;
std::map<int, Pose2d>::iterator pose_begin_iter =
@@ -88,16 +89,19 @@
// Ceres will take ownership of the pointer.
ceres::CostFunction* cost_function = PoseGraph2dErrorTerm::Create(
constraint.x, constraint.y, constraint.yaw_radians, sqrt_information);
- problem->AddResidualBlock(
- cost_function, loss_function, &pose_begin_iter->second.x,
- &pose_begin_iter->second.y, &pose_begin_iter->second.yaw_radians,
- &pose_end_iter->second.x, &pose_end_iter->second.y,
- &pose_end_iter->second.yaw_radians);
+ problem->AddResidualBlock(cost_function,
+ loss_function,
+ &pose_begin_iter->second.x,
+ &pose_begin_iter->second.y,
+ &pose_begin_iter->second.yaw_radians,
+ &pose_end_iter->second.x,
+ &pose_end_iter->second.y,
+ &pose_end_iter->second.yaw_radians);
problem->SetParameterization(&pose_begin_iter->second.yaw_radians,
- angle_local_parameterization);
+ angle_local_parameterization);
problem->SetParameterization(&pose_end_iter->second.yaw_radians,
- angle_local_parameterization);
+ angle_local_parameterization);
}
// The pose graph optimization problem has three DOFs that are not fully
@@ -107,8 +111,7 @@
// internal damping which mitigate this issue, but it is better to properly
// constrain the gauge freedom. This can be done by setting one of the poses
// as constant so the optimizer cannot change it.
- std::map<int, Pose2d>::iterator pose_start_iter =
- poses->begin();
+ std::map<int, Pose2d>::iterator pose_start_iter = poses->begin();
CHECK(pose_start_iter != poses->end()) << "There are no poses.";
problem->SetParameterBlockConstant(&pose_start_iter->second.x);
problem->SetParameterBlockConstant(&pose_start_iter->second.y);
@@ -141,10 +144,11 @@
return false;
}
for (std::map<int, Pose2d>::const_iterator poses_iter = poses.begin();
- poses_iter != poses.end(); ++poses_iter) {
+ poses_iter != poses.end();
+ ++poses_iter) {
const std::map<int, Pose2d>::value_type& pair = *poses_iter;
- outfile << pair.first << " " << pair.second.x << " " << pair.second.y
- << ' ' << pair.second.yaw_radians << '\n';
+ outfile << pair.first << " " << pair.second.x << " " << pair.second.y << ' '
+ << pair.second.yaw_radians << '\n';
}
return true;
}
diff --git a/examples/slam/pose_graph_2d/pose_graph_2d_error_term.h b/examples/slam/pose_graph_2d/pose_graph_2d_error_term.h
index 20656d2..5d404e3 100644
--- a/examples/slam/pose_graph_2d/pose_graph_2d_error_term.h
+++ b/examples/slam/pose_graph_2d/pose_graph_2d_error_term.h
@@ -59,15 +59,21 @@
// [-pi, pi).
class PoseGraph2dErrorTerm {
public:
- PoseGraph2dErrorTerm(double x_ab, double y_ab, double yaw_ab_radians,
+ PoseGraph2dErrorTerm(double x_ab,
+ double y_ab,
+ double yaw_ab_radians,
const Eigen::Matrix3d& sqrt_information)
: p_ab_(x_ab, y_ab),
yaw_ab_radians_(yaw_ab_radians),
sqrt_information_(sqrt_information) {}
template <typename T>
- bool operator()(const T* const x_a, const T* const y_a, const T* const yaw_a,
- const T* const x_b, const T* const y_b, const T* const yaw_b,
+ bool operator()(const T* const x_a,
+ const T* const y_a,
+ const T* const yaw_a,
+ const T* const x_b,
+ const T* const y_b,
+ const T* const yaw_b,
T* residuals_ptr) const {
const Eigen::Matrix<T, 2, 1> p_a(*x_a, *y_a);
const Eigen::Matrix<T, 2, 1> p_b(*x_b, *y_b);
@@ -75,8 +81,7 @@
Eigen::Map<Eigen::Matrix<T, 3, 1> > residuals_map(residuals_ptr);
residuals_map.template head<2>() =
- RotationMatrix2D(*yaw_a).transpose() * (p_b - p_a) -
- p_ab_.cast<T>();
+ RotationMatrix2D(*yaw_a).transpose() * (p_b - p_a) - p_ab_.cast<T>();
residuals_map(2) = ceres::examples::NormalizeAngle(
(*yaw_b - *yaw_a) - static_cast<T>(yaw_ab_radians_));
@@ -87,12 +92,14 @@
return true;
}
- static ceres::CostFunction* Create(double x_ab, double y_ab,
+ static ceres::CostFunction* Create(double x_ab,
+ double y_ab,
double yaw_ab_radians,
const Eigen::Matrix3d& sqrt_information) {
- return (new ceres::AutoDiffCostFunction<PoseGraph2dErrorTerm, 3, 1, 1, 1, 1,
- 1, 1>(new PoseGraph2dErrorTerm(
- x_ab, y_ab, yaw_ab_radians, sqrt_information)));
+ return (new ceres::
+ AutoDiffCostFunction<PoseGraph2dErrorTerm, 3, 1, 1, 1, 1, 1, 1>(
+ new PoseGraph2dErrorTerm(
+ x_ab, y_ab, yaw_ab_radians, sqrt_information)));
}
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
diff --git a/examples/slam/pose_graph_2d/types.h b/examples/slam/pose_graph_2d/types.h
index 43e0ffe..3c13824 100644
--- a/examples/slam/pose_graph_2d/types.h
+++ b/examples/slam/pose_graph_2d/types.h
@@ -50,9 +50,7 @@
double yaw_radians;
// The name of the data type in the g2o file format.
- static std::string name() {
- return "VERTEX_SE2";
- }
+ static std::string name() { return "VERTEX_SE2"; }
};
inline std::istream& operator>>(std::istream& input, Pose2d& pose) {
@@ -77,17 +75,15 @@
Eigen::Matrix3d information;
// The name of the data type in the g2o file format.
- static std::string name() {
- return "EDGE_SE2";
- }
+ static std::string name() { return "EDGE_SE2"; }
};
inline std::istream& operator>>(std::istream& input, Constraint2d& constraint) {
input >> constraint.id_begin >> constraint.id_end >> constraint.x >>
- constraint.y >> constraint.yaw_radians >>
- constraint.information(0, 0) >> constraint.information(0, 1) >>
- constraint.information(0, 2) >> constraint.information(1, 1) >>
- constraint.information(1, 2) >> constraint.information(2, 2);
+ constraint.y >> constraint.yaw_radians >> constraint.information(0, 0) >>
+ constraint.information(0, 1) >> constraint.information(0, 2) >>
+ constraint.information(1, 1) >> constraint.information(1, 2) >>
+ constraint.information(2, 2);
// Set the lower triangular part of the information matrix.
constraint.information(1, 0) = constraint.information(0, 1);
diff --git a/examples/slam/pose_graph_3d/pose_graph_3d.cc b/examples/slam/pose_graph_3d/pose_graph_3d.cc
index 420d804..c54412d 100644
--- a/examples/slam/pose_graph_3d/pose_graph_3d.cc
+++ b/examples/slam/pose_graph_3d/pose_graph_3d.cc
@@ -28,8 +28,8 @@
//
// Author: vitus@google.com (Michael Vitus)
-#include <iostream>
#include <fstream>
+#include <iostream>
#include <string>
#include "ceres/ceres.h"
@@ -48,7 +48,8 @@
// Constructs the nonlinear least squares optimization problem from the pose
// graph constraints.
void BuildOptimizationProblem(const VectorOfConstraints& constraints,
- MapOfPoses* poses, ceres::Problem* problem) {
+ MapOfPoses* poses,
+ ceres::Problem* problem) {
CHECK(poses != NULL);
CHECK(problem != NULL);
if (constraints.empty()) {
@@ -62,7 +63,8 @@
for (VectorOfConstraints::const_iterator constraints_iter =
constraints.begin();
- constraints_iter != constraints.end(); ++constraints_iter) {
+ constraints_iter != constraints.end();
+ ++constraints_iter) {
const Constraint3d& constraint = *constraints_iter;
MapOfPoses::iterator pose_begin_iter = poses->find(constraint.id_begin);
@@ -78,7 +80,8 @@
ceres::CostFunction* cost_function =
PoseGraph3dErrorTerm::Create(constraint.t_be, sqrt_information);
- problem->AddResidualBlock(cost_function, loss_function,
+ problem->AddResidualBlock(cost_function,
+ loss_function,
pose_begin_iter->second.p.data(),
pose_begin_iter->second.q.coeffs().data(),
pose_end_iter->second.p.data(),
@@ -127,11 +130,16 @@
LOG(ERROR) << "Error opening the file: " << filename;
return false;
}
- for (std::map<int, Pose3d, std::less<int>,
+ for (std::map<int,
+ Pose3d,
+ std::less<int>,
Eigen::aligned_allocator<std::pair<const int, Pose3d> > >::
const_iterator poses_iter = poses.begin();
- poses_iter != poses.end(); ++poses_iter) {
- const std::map<int, Pose3d, std::less<int>,
+ poses_iter != poses.end();
+ ++poses_iter) {
+ const std::map<int,
+ Pose3d,
+ std::less<int>,
Eigen::aligned_allocator<std::pair<const int, Pose3d> > >::
value_type& pair = *poses_iter;
outfile << pair.first << " " << pair.second.p.transpose() << " "
diff --git a/examples/slam/pose_graph_3d/pose_graph_3d_error_term.h b/examples/slam/pose_graph_3d/pose_graph_3d_error_term.h
index aca819e..c8def17 100644
--- a/examples/slam/pose_graph_3d/pose_graph_3d_error_term.h
+++ b/examples/slam/pose_graph_3d/pose_graph_3d_error_term.h
@@ -33,7 +33,6 @@
#include "Eigen/Core"
#include "ceres/autodiff_cost_function.h"
-
#include "types.h"
namespace ceres {
@@ -75,8 +74,10 @@
: t_ab_measured_(t_ab_measured), sqrt_information_(sqrt_information) {}
template <typename T>
- bool operator()(const T* const p_a_ptr, const T* const q_a_ptr,
- const T* const p_b_ptr, const T* const q_b_ptr,
+ bool operator()(const T* const p_a_ptr,
+ const T* const q_a_ptr,
+ const T* const p_b_ptr,
+ const T* const q_b_ptr,
T* residuals_ptr) const {
Eigen::Map<const Eigen::Matrix<T, 3, 1> > p_a(p_a_ptr);
Eigen::Map<const Eigen::Quaternion<T> > q_a(q_a_ptr);
diff --git a/examples/slam/pose_graph_3d/types.h b/examples/slam/pose_graph_3d/types.h
index 2142820..25f7ba2 100644
--- a/examples/slam/pose_graph_3d/types.h
+++ b/examples/slam/pose_graph_3d/types.h
@@ -47,23 +47,23 @@
Eigen::Quaterniond q;
// The name of the data type in the g2o file format.
- static std::string name() {
- return "VERTEX_SE3:QUAT";
- }
+ static std::string name() { return "VERTEX_SE3:QUAT"; }
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
inline std::istream& operator>>(std::istream& input, Pose3d& pose) {
- input >> pose.p.x() >> pose.p.y() >> pose.p.z() >> pose.q.x() >>
- pose.q.y() >> pose.q.z() >> pose.q.w();
+ input >> pose.p.x() >> pose.p.y() >> pose.p.z() >> pose.q.x() >> pose.q.y() >>
+ pose.q.z() >> pose.q.w();
// Normalize the quaternion to account for precision loss due to
// serialization.
pose.q.normalize();
return input;
}
-typedef std::map<int, Pose3d, std::less<int>,
+typedef std::map<int,
+ Pose3d,
+ std::less<int>,
Eigen::aligned_allocator<std::pair<const int, Pose3d> > >
MapOfPoses;
@@ -83,9 +83,7 @@
Eigen::Matrix<double, 6, 6> information;
// The name of the data type in the g2o file format.
- static std::string name() {
- return "EDGE_SE3:QUAT";
- }
+ static std::string name() { return "EDGE_SE3:QUAT"; }
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
diff --git a/examples/snavely_reprojection_error.h b/examples/snavely_reprojection_error.h
index 5e51eb4..eb39d23 100644
--- a/examples/snavely_reprojection_error.h
+++ b/examples/snavely_reprojection_error.h
@@ -70,15 +70,14 @@
// Compute the center of distortion. The sign change comes from
// the camera model that Noah Snavely's Bundler assumes, whereby
// the camera coordinate system has a negative z axis.
- const T xp = - p[0] / p[2];
- const T yp = - p[1] / p[2];
+ const T xp = -p[0] / p[2];
+ const T yp = -p[1] / p[2];
// Apply second and fourth order radial distortion.
const T& l1 = camera[7];
const T& l2 = camera[8];
- const T r2 = xp*xp + yp*yp;
- const T distortion = 1.0 + r2 * (l1 + l2 * r2);
-
+ const T r2 = xp * xp + yp * yp;
+ const T distortion = 1.0 + r2 * (l1 + l2 * r2);
// Compute final projected point position.
const T& focal = camera[6];
@@ -97,7 +96,7 @@
static ceres::CostFunction* Create(const double observed_x,
const double observed_y) {
return (new ceres::AutoDiffCostFunction<SnavelyReprojectionError, 2, 9, 3>(
- new SnavelyReprojectionError(observed_x, observed_y)));
+ new SnavelyReprojectionError(observed_x, observed_y)));
}
double observed_x;
@@ -135,15 +134,15 @@
// Compute the center of distortion. The sign change comes from
// the camera model that Noah Snavely's Bundler assumes, whereby
// the camera coordinate system has a negative z axis.
- const T xp = - p[0] / p[2];
- const T yp = - p[1] / p[2];
+ const T xp = -p[0] / p[2];
+ const T yp = -p[1] / p[2];
// Apply second and fourth order radial distortion.
const T& l1 = camera[8];
const T& l2 = camera[9];
- const T r2 = xp*xp + yp*yp;
- const T distortion = 1.0 + r2 * (l1 + l2 * r2);
+ const T r2 = xp * xp + yp * yp;
+ const T distortion = 1.0 + r2 * (l1 + l2 * r2);
// Compute final projected point position.
const T& focal = camera[7];
@@ -161,10 +160,13 @@
// the client code.
static ceres::CostFunction* Create(const double observed_x,
const double observed_y) {
- return (new ceres::AutoDiffCostFunction<
- SnavelyReprojectionErrorWithQuaternions, 2, 10, 3>(
- new SnavelyReprojectionErrorWithQuaternions(observed_x,
- observed_y)));
+ return (
+ new ceres::AutoDiffCostFunction<SnavelyReprojectionErrorWithQuaternions,
+ 2,
+ 10,
+ 3>(
+ new SnavelyReprojectionErrorWithQuaternions(observed_x,
+ observed_y)));
}
double observed_x;