Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2016-04-20 17:45:29 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2016-04-20 17:45:29 +0300
commitaae0598aa233d43d0ffc81a070b2ce20d6871c1d (patch)
tree378100f45cf1db972c671a6886496a5604f7ab29 /extern/libmv/third_party/ceres/include
parent95d7d3c2a6aa91f1dcb33ff0cdfc751e2886d8cd (diff)
parentd7e4f920fd93a4ae5679e0eb6b228a349ab3b082 (diff)
Merge branch 'master' into temp_depsgraph_split_ubereval
Diffstat (limited to 'extern/libmv/third_party/ceres/include')
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/autodiff_cost_function.h227
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/autodiff_local_parameterization.h154
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/c_api.h146
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/ceres.h59
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/conditioned_cost_function.h99
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/cost_function.h147
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/cost_function_to_functor.h750
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/covariance.h384
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/crs_matrix.h86
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/dynamic_autodiff_cost_function.h260
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/dynamic_numeric_diff_cost_function.h265
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/fpclassify.h87
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/gradient_checker.h222
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/gradient_problem.h127
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/gradient_problem_solver.h353
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/autodiff.h317
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/disable_warnings.h44
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/eigen.h93
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/fixed_array.h191
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/macros.h170
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/manual_constructor.h208
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/numeric_diff.h208
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/port.h88
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/reenable_warnings.h38
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/scoped_ptr.h310
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/internal/variadic_evaluate.h182
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/iteration_callback.h225
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/jet.h670
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/local_parameterization.h217
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/loss_function.h401
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/normal_prior.h78
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/numeric_diff_cost_function.h315
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/ordered_groups.h201
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/problem.h481
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/rotation.h645
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/sized_cost_function.h96
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/solver.h1004
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/types.h487
-rw-r--r--extern/libmv/third_party/ceres/include/ceres/version.h49
39 files changed, 0 insertions, 10084 deletions
diff --git a/extern/libmv/third_party/ceres/include/ceres/autodiff_cost_function.h b/extern/libmv/third_party/ceres/include/ceres/autodiff_cost_function.h
deleted file mode 100644
index 7c0fa79ad0b..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/autodiff_cost_function.h
+++ /dev/null
@@ -1,227 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// Create CostFunctions as needed by the least squares framework, with
-// Jacobians computed via automatic differentiation. For more
-// information on automatic differentation, see the wikipedia article
-// at http://en.wikipedia.org/wiki/Automatic_differentiation
-//
-// To get an auto differentiated cost function, you must define a class with a
-// templated operator() (a functor) that computes the cost function in terms of
-// the template parameter T. The autodiff framework substitutes appropriate
-// "jet" objects for T in order to compute the derivative when necessary, but
-// this is hidden, and you should write the function as if T were a scalar type
-// (e.g. a double-precision floating point number).
-//
-// The function must write the computed value in the last argument
-// (the only non-const one) and return true to indicate
-// success. Please see cost_function.h for details on how the return
-// value maybe used to impose simple constraints on the parameter
-// block.
-//
-// For example, consider a scalar error e = k - x'y, where both x and y are
-// two-dimensional column vector parameters, the prime sign indicates
-// transposition, and k is a constant. The form of this error, which is the
-// difference between a constant and an expression, is a common pattern in least
-// squares problems. For example, the value x'y might be the model expectation
-// for a series of measurements, where there is an instance of the cost function
-// for each measurement k.
-//
-// The actual cost added to the total problem is e^2, or (k - x'k)^2; however,
-// the squaring is implicitly done by the optimization framework.
-//
-// To write an auto-differentiable cost function for the above model, first
-// define the object
-//
-// class MyScalarCostFunctor {
-// MyScalarCostFunctor(double k): k_(k) {}
-//
-// template <typename T>
-// bool operator()(const T* const x , const T* const y, T* e) const {
-// e[0] = T(k_) - x[0] * y[0] + x[1] * y[1];
-// return true;
-// }
-//
-// private:
-// double k_;
-// };
-//
-// Note that in the declaration of operator() the input parameters x and y come
-// first, and are passed as const pointers to arrays of T. If there were three
-// input parameters, then the third input parameter would come after y. The
-// output is always the last parameter, and is also a pointer to an array. In
-// the example above, e is a scalar, so only e[0] is set.
-//
-// Then given this class definition, the auto differentiated cost function for
-// it can be constructed as follows.
-//
-// CostFunction* cost_function
-// = new AutoDiffCostFunction<MyScalarCostFunctor, 1, 2, 2>(
-// new MyScalarCostFunctor(1.0)); ^ ^ ^
-// | | |
-// Dimension of residual -----+ | |
-// Dimension of x ---------------+ |
-// Dimension of y ------------------+
-//
-// In this example, there is usually an instance for each measumerent of k.
-//
-// In the instantiation above, the template parameters following
-// "MyScalarCostFunctor", "1, 2, 2", describe the functor as computing a
-// 1-dimensional output from two arguments, both 2-dimensional.
-//
-// AutoDiffCostFunction also supports cost functions with a
-// runtime-determined number of residuals. For example:
-//
-// CostFunction* cost_function
-// = new AutoDiffCostFunction<MyScalarCostFunctor, DYNAMIC, 2, 2>(
-// new CostFunctorWithDynamicNumResiduals(1.0), ^ ^ ^
-// runtime_number_of_residuals); <----+ | | |
-// | | | |
-// | | | |
-// Actual number of residuals ------+ | | |
-// Indicate dynamic number of residuals --------+ | |
-// Dimension of x ------------------------------------+ |
-// Dimension of y ---------------------------------------+
-//
-// The framework can currently accommodate cost functions of up to 10
-// independent variables, and there is no limit on the dimensionality
-// of each of them.
-//
-// WARNING #1: Since the functor will get instantiated with different types for
-// T, you must to convert from other numeric types to T before mixing
-// computations with other variables of type T. In the example above, this is
-// seen where instead of using k_ directly, k_ is wrapped with T(k_).
-//
-// WARNING #2: A common beginner's error when first using autodiff cost
-// functions is to get the sizing wrong. In particular, there is a tendency to
-// set the template parameters to (dimension of residual, number of parameters)
-// instead of passing a dimension parameter for *every parameter*. In the
-// example above, that would be <MyScalarCostFunctor, 1, 2>, which is missing
-// the last '2' argument. Please be careful when setting the size parameters.
-
-#ifndef CERES_PUBLIC_AUTODIFF_COST_FUNCTION_H_
-#define CERES_PUBLIC_AUTODIFF_COST_FUNCTION_H_
-
-#include "ceres/internal/autodiff.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/sized_cost_function.h"
-#include "ceres/types.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-// A cost function which computes the derivative of the cost with respect to
-// the parameters (a.k.a. the jacobian) using an autodifferentiation framework.
-// The first template argument is the functor object, described in the header
-// comment. The second argument is the dimension of the residual (or
-// ceres::DYNAMIC to indicate it will be set at runtime), and subsequent
-// arguments describe the size of the Nth parameter, one per parameter.
-//
-// The constructors take ownership of the cost functor.
-//
-// If the number of residuals (argument kNumResiduals below) is
-// ceres::DYNAMIC, then the two-argument constructor must be used. The
-// second constructor takes a number of residuals (in addition to the
-// templated number of residuals). This allows for varying the number
-// of residuals for a single autodiff cost function at runtime.
-template <typename CostFunctor,
- int kNumResiduals, // Number of residuals, or ceres::DYNAMIC.
- int N0, // Number of parameters in block 0.
- int N1 = 0, // Number of parameters in block 1.
- int N2 = 0, // Number of parameters in block 2.
- int N3 = 0, // Number of parameters in block 3.
- int N4 = 0, // Number of parameters in block 4.
- int N5 = 0, // Number of parameters in block 5.
- int N6 = 0, // Number of parameters in block 6.
- int N7 = 0, // Number of parameters in block 7.
- int N8 = 0, // Number of parameters in block 8.
- int N9 = 0> // Number of parameters in block 9.
-class AutoDiffCostFunction : public SizedCostFunction<kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9> {
- public:
- // Takes ownership of functor. Uses the template-provided value for the
- // number of residuals ("kNumResiduals").
- explicit AutoDiffCostFunction(CostFunctor* functor)
- : functor_(functor) {
- CHECK_NE(kNumResiduals, DYNAMIC)
- << "Can't run the fixed-size constructor if the "
- << "number of residuals is set to ceres::DYNAMIC.";
- }
-
- // Takes ownership of functor. Ignores the template-provided
- // kNumResiduals in favor of the "num_residuals" argument provided.
- //
- // This allows for having autodiff cost functions which return varying
- // numbers of residuals at runtime.
- AutoDiffCostFunction(CostFunctor* functor, int num_residuals)
- : functor_(functor) {
- CHECK_EQ(kNumResiduals, DYNAMIC)
- << "Can't run the dynamic-size constructor if the "
- << "number of residuals is not ceres::DYNAMIC.";
- SizedCostFunction<kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9>
- ::set_num_residuals(num_residuals);
- }
-
- virtual ~AutoDiffCostFunction() {}
-
- // Implementation details follow; clients of the autodiff cost function should
- // not have to examine below here.
- //
- // To handle varardic cost functions, some template magic is needed. It's
- // mostly hidden inside autodiff.h.
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const {
- if (!jacobians) {
- return internal::VariadicEvaluate<
- CostFunctor, double, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>
- ::Call(*functor_, parameters, residuals);
- }
- return internal::AutoDiff<CostFunctor, double,
- N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Differentiate(
- *functor_,
- parameters,
- SizedCostFunction<kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9>::num_residuals(),
- residuals,
- jacobians);
- }
-
- private:
- internal::scoped_ptr<CostFunctor> functor_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_AUTODIFF_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/autodiff_local_parameterization.h b/extern/libmv/third_party/ceres/include/ceres/autodiff_local_parameterization.h
deleted file mode 100644
index c100d4825d2..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/autodiff_local_parameterization.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sergey.vfx@gmail.com (Sergey Sharybin)
-// mierle@gmail.com (Keir Mierle)
-// sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_AUTODIFF_LOCAL_PARAMETERIZATION_H_
-#define CERES_PUBLIC_AUTODIFF_LOCAL_PARAMETERIZATION_H_
-
-#include "ceres/internal/autodiff.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/local_parameterization.h"
-
-namespace ceres {
-
-// Create local parameterization with Jacobians computed via automatic
-// differentiation. For more information on local parameterizations,
-// see include/ceres/local_parameterization.h
-//
-// To get an auto differentiated local parameterization, you must define
-// a class with a templated operator() (a functor) that computes
-//
-// x_plus_delta = Plus(x, delta);
-//
-// the template parameter T. The autodiff framework substitutes appropriate
-// "Jet" objects for T in order to compute the derivative when necessary, but
-// this is hidden, and you should write the function as if T were a scalar type
-// (e.g. a double-precision floating point number).
-//
-// The function must write the computed value in the last argument (the only
-// non-const one) and return true to indicate success.
-//
-// For example, Quaternions have a three dimensional local
-// parameterization. It's plus operation can be implemented as (taken
-// from internal/ceres/auto_diff_local_parameterization_test.cc)
-//
-// struct QuaternionPlus {
-// template<typename T>
-// bool operator()(const T* x, const T* delta, T* x_plus_delta) const {
-// const T squared_norm_delta =
-// delta[0] * delta[0] + delta[1] * delta[1] + delta[2] * delta[2];
-//
-// T q_delta[4];
-// if (squared_norm_delta > T(0.0)) {
-// T norm_delta = sqrt(squared_norm_delta);
-// const T sin_delta_by_delta = sin(norm_delta) / norm_delta;
-// q_delta[0] = cos(norm_delta);
-// q_delta[1] = sin_delta_by_delta * delta[0];
-// q_delta[2] = sin_delta_by_delta * delta[1];
-// q_delta[3] = sin_delta_by_delta * delta[2];
-// } else {
-// // We do not just use q_delta = [1,0,0,0] here because that is a
-// // constant and when used for automatic differentiation will
-// // lead to a zero derivative. Instead we take a first order
-// // approximation and evaluate it at zero.
-// q_delta[0] = T(1.0);
-// q_delta[1] = delta[0];
-// q_delta[2] = delta[1];
-// q_delta[3] = delta[2];
-// }
-//
-// QuaternionProduct(q_delta, x, x_plus_delta);
-// return true;
-// }
-// };
-//
-// Then given this struct, the auto differentiated local
-// parameterization can now be constructed as
-//
-// LocalParameterization* local_parameterization =
-// new AutoDiffLocalParameterization<QuaternionPlus, 4, 3>;
-// | |
-// Global Size ---------------+ |
-// Local Size -------------------+
-//
-// WARNING: Since the functor will get instantiated with different types for
-// T, you must to convert from other numeric types to T before mixing
-// computations with other variables of type T. In the example above, this is
-// seen where instead of using k_ directly, k_ is wrapped with T(k_).
-
-template <typename Functor, int kGlobalSize, int kLocalSize>
-class AutoDiffLocalParameterization : public LocalParameterization {
- public:
- AutoDiffLocalParameterization() :
- functor_(new Functor()) {}
-
- // Takes ownership of functor.
- explicit AutoDiffLocalParameterization(Functor* functor) :
- functor_(functor) {}
-
- virtual ~AutoDiffLocalParameterization() {}
- virtual bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const {
- return (*functor_)(x, delta, x_plus_delta);
- }
-
- virtual bool ComputeJacobian(const double* x, double* jacobian) const {
- double zero_delta[kLocalSize];
- for (int i = 0; i < kLocalSize; ++i) {
- zero_delta[i] = 0.0;
- }
-
- double x_plus_delta[kGlobalSize];
- for (int i = 0; i < kGlobalSize; ++i) {
- x_plus_delta[i] = 0.0;
- }
-
- const double* parameter_ptrs[2] = {x, zero_delta};
- double* jacobian_ptrs[2] = { NULL, jacobian };
- return internal::AutoDiff<Functor, double, kGlobalSize, kLocalSize>
- ::Differentiate(*functor_,
- parameter_ptrs,
- kGlobalSize,
- x_plus_delta,
- jacobian_ptrs);
- }
-
- virtual int GlobalSize() const { return kGlobalSize; }
- virtual int LocalSize() const { return kLocalSize; }
-
- private:
- internal::scoped_ptr<Functor> functor_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_AUTODIFF_LOCAL_PARAMETERIZATION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/c_api.h b/extern/libmv/third_party/ceres/include/ceres/c_api.h
deleted file mode 100644
index 71f41fd226b..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/c_api.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Ceres Solver - A fast non-linear least squares minimizer
- * Copyright 2013 Google Inc. All rights reserved.
- * http://code.google.com/p/ceres-solver/
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * - Neither the name of Google Inc. nor the names of its contributors may be
- * used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: mierle@gmail.com (Keir Mierle)
- *
- * A minimal C API for Ceres. Not all functionality is included. This API is
- * not intended for clients of Ceres, but is instead intended for easing the
- * process of binding Ceres to other languages.
- *
- * Currently this is a work in progress.
- */
-
-#ifndef CERES_PUBLIC_C_API_H_
-#define CERES_PUBLIC_C_API_H_
-
-#include "ceres/internal/port.h"
-#include "ceres/internal/disable_warnings.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Init the Ceres private data. Must be called before anything else. */
-CERES_EXPORT void ceres_init();
-
-/* Equivalent to CostFunction::Evaluate() in the C++ API.
- *
- * The user may keep private information inside the opaque user_data object.
- * The pointer here is the same one passed in the ceres_add_residual_block().
- */
-typedef int (*ceres_cost_function_t)(void* user_data,
- double** parameters,
- double* residuals,
- double** jacobians);
-
-/* Equivalent to LossFunction::Evaluate() from the C++ API. */
-typedef void (*ceres_loss_function_t)(void* user_data,
- double squared_norm,
- double out[3]);
-
-/* Create callback data for Ceres' stock loss functions.
- *
- * Ceres has several loss functions available by default, and these functions
- * expose those to the C API. To use the stock loss functions, call
- * ceres_create_*_loss_data(), which internally creates an instance of one of
- * the stock loss functions (for example ceres::CauchyLoss), and pass the
- * returned "loss_function_data" along with the ceres_stock_loss_function to
- * ceres_add_residual_block().
- *
- * For example:
- *
- * void* cauchy_loss_function_data =
- * ceres_create_cauchy_loss_function_data(1.2, 0.0);
- * ceres_problem_add_residual_block(
- * problem,
- * my_cost_function,
- * my_cost_function_data,
- * ceres_stock_loss_function,
- * cauchy_loss_function_data,
- * 1,
- * 2,
- * parameter_sizes,
- * parameter_pointers);
- * ...
- * ceres_free_stock_loss_function_data(cauchy_loss_function_data);
- *
- * See loss_function.h for the details of each loss function.
- */
-CERES_EXPORT void* ceres_create_huber_loss_function_data(double a);
-CERES_EXPORT void* ceres_create_softl1_loss_function_data(double a);
-CERES_EXPORT void* ceres_create_cauchy_loss_function_data(double a);
-CERES_EXPORT void* ceres_create_arctan_loss_function_data(double a);
-CERES_EXPORT void* ceres_create_tolerant_loss_function_data(double a, double b);
-
-/* Free the given stock loss function data. */
-CERES_EXPORT void ceres_free_stock_loss_function_data(void* loss_function_data);
-
-/* This is an implementation of ceres_loss_function_t contained within Ceres
- * itself, intended as a way to access the various stock Ceres loss functions
- * from the C API. This should be passed to ceres_add_residual() below, in
- * combination with a user_data pointer generated by
- * ceres_create_stock_loss_function() above. */
-CERES_EXPORT void ceres_stock_loss_function(void* user_data,
- double squared_norm,
- double out[3]);
-
-/* Equivalent to Problem from the C++ API. */
-struct ceres_problem_s;
-typedef struct ceres_problem_s ceres_problem_t;
-
-struct ceres_residual_block_id_s;
-typedef struct ceres_residual_block_id_s ceres_residual_block_id_t;
-
-/* Create and destroy a problem */
-/* TODO(keir): Add options for the problem. */
-CERES_EXPORT ceres_problem_t* ceres_create_problem();
-CERES_EXPORT void ceres_free_problem(ceres_problem_t* problem);
-
-/* Add a residual block. */
-CERES_EXPORT ceres_residual_block_id_t* ceres_problem_add_residual_block(
- ceres_problem_t* problem,
- ceres_cost_function_t cost_function,
- void* cost_function_data,
- ceres_loss_function_t loss_function,
- void* loss_function_data,
- int num_residuals,
- int num_parameter_blocks,
- int* parameter_block_sizes,
- double** parameters);
-
-CERES_EXPORT void ceres_solve(ceres_problem_t* problem);
-
-/* TODO(keir): Figure out a way to pass a config in. */
-
-#ifdef __cplusplus
-}
-#endif
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif /* CERES_PUBLIC_C_API_H_ */
diff --git a/extern/libmv/third_party/ceres/include/ceres/ceres.h b/extern/libmv/third_party/ceres/include/ceres/ceres.h
deleted file mode 100644
index 7c8981e2994..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/ceres.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-//
-// This is a forwarding header containing the public symbols exported from
-// Ceres. Anything in the "ceres" namespace is available for use.
-
-#ifndef CERES_PUBLIC_CERES_H_
-#define CERES_PUBLIC_CERES_H_
-
-#include "ceres/autodiff_cost_function.h"
-#include "ceres/autodiff_local_parameterization.h"
-#include "ceres/cost_function.h"
-#include "ceres/cost_function_to_functor.h"
-#include "ceres/covariance.h"
-#include "ceres/crs_matrix.h"
-#include "ceres/dynamic_autodiff_cost_function.h"
-#include "ceres/dynamic_numeric_diff_cost_function.h"
-#include "ceres/gradient_problem.h"
-#include "ceres/gradient_problem_solver.h"
-#include "ceres/iteration_callback.h"
-#include "ceres/jet.h"
-#include "ceres/local_parameterization.h"
-#include "ceres/loss_function.h"
-#include "ceres/numeric_diff_cost_function.h"
-#include "ceres/ordered_groups.h"
-#include "ceres/problem.h"
-#include "ceres/sized_cost_function.h"
-#include "ceres/solver.h"
-#include "ceres/types.h"
-#include "ceres/version.h"
-
-#endif // CERES_PUBLIC_CERES_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/conditioned_cost_function.h b/extern/libmv/third_party/ceres/include/ceres/conditioned_cost_function.h
deleted file mode 100644
index 3f0087c7815..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/conditioned_cost_function.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wjr@google.com (William Rucklidge)
-//
-// This file contains a cost function that can apply a transformation to
-// each residual value before they are square-summed.
-
-#ifndef CERES_PUBLIC_CONDITIONED_COST_FUNCTION_H_
-#define CERES_PUBLIC_CONDITIONED_COST_FUNCTION_H_
-
-#include <vector>
-
-#include "ceres/cost_function.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// This class allows you to apply different conditioning to the residual
-// values of a wrapped cost function. An example where this is useful is
-// where you have an existing cost function that produces N values, but you
-// want the total cost to be something other than just the sum of these
-// squared values - maybe you want to apply a different scaling to some
-// values, to change their contribution to the cost.
-//
-// Usage:
-//
-// // my_cost_function produces N residuals
-// CostFunction* my_cost_function = ...
-// CHECK_EQ(N, my_cost_function->num_residuals());
-// vector<CostFunction*> conditioners;
-//
-// // Make N 1x1 cost functions (1 parameter, 1 residual)
-// CostFunction* f_1 = ...
-// conditioners.push_back(f_1);
-// ...
-// CostFunction* f_N = ...
-// conditioners.push_back(f_N);
-// ConditionedCostFunction* ccf =
-// new ConditionedCostFunction(my_cost_function, conditioners);
-//
-// Now ccf's residual i (i=0..N-1) will be passed though the i'th conditioner.
-//
-// ccf_residual[i] = f_i(my_cost_function_residual[i])
-//
-// and the Jacobian will be affected appropriately.
-class CERES_EXPORT ConditionedCostFunction : public CostFunction {
- public:
- // Builds a cost function based on a wrapped cost function, and a
- // per-residual conditioner. Takes ownership of all of the wrapped cost
- // functions, or not, depending on the ownership parameter. Conditioners
- // may be NULL, in which case the corresponding residual is not modified.
- ConditionedCostFunction(CostFunction* wrapped_cost_function,
- const vector<CostFunction*>& conditioners,
- Ownership ownership);
- virtual ~ConditionedCostFunction();
-
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const;
-
- private:
- internal::scoped_ptr<CostFunction> wrapped_cost_function_;
- vector<CostFunction*> conditioners_;
- Ownership ownership_;
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_CONDITIONED_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/cost_function.h b/extern/libmv/third_party/ceres/include/ceres/cost_function.h
deleted file mode 100644
index fe8fc07d2ce..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/cost_function.h
+++ /dev/null
@@ -1,147 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-// keir@google.m (Keir Mierle)
-//
-// This is the interface through which the least squares solver accesses the
-// residual and Jacobian of the least squares problem. Users are expected to
-// subclass CostFunction to define their own terms in the least squares problem.
-//
-// It is recommended that users define templated residual functors for use as
-// arguments for AutoDiffCostFunction (see autodiff_cost_function.h), instead of
-// directly implementing the CostFunction interface. This often results in both
-// shorter code and faster execution than hand-coded derivatives. However,
-// specialized cases may demand direct implementation of the lower-level
-// CostFunction interface; for example, this is true when calling legacy code
-// which is not templated on numeric types.
-
-#ifndef CERES_PUBLIC_COST_FUNCTION_H_
-#define CERES_PUBLIC_COST_FUNCTION_H_
-
-#include <vector>
-#include "ceres/internal/macros.h"
-#include "ceres/internal/port.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// This class implements the computation of the cost (a.k.a. residual) terms as
-// a function of the input (control) variables, and is the interface for users
-// to describe their least squares problem to Ceres. In other words, this is the
-// modelling layer between users and the Ceres optimizer. The signature of the
-// function (number and sizes of input parameter blocks and number of outputs)
-// is stored in parameter_block_sizes_ and num_residuals_ respectively. User
-// code inheriting from this class is expected to set these two members with the
-// corresponding accessors. This information will be verified by the Problem
-// when added with AddResidualBlock().
-class CERES_EXPORT CostFunction {
- public:
- CostFunction() : num_residuals_(0) {}
-
- virtual ~CostFunction() {}
-
- // Inputs:
- //
- // parameters is an array of pointers to arrays containing the
- // various parameter blocks. parameters has the same number of
- // elements as parameter_block_sizes_. Parameter blocks are in the
- // same order as parameter_block_sizes_.i.e.,
- //
- // parameters_[i] = double[parameter_block_sizes_[i]]
- //
- // Outputs:
- //
- // residuals is an array of size num_residuals_.
- //
- // jacobians is an array of size parameter_block_sizes_ containing
- // pointers to storage for jacobian blocks corresponding to each
- // parameter block. Jacobian blocks are in the same order as
- // parameter_block_sizes, i.e. jacobians[i], is an
- // array that contains num_residuals_* parameter_block_sizes_[i]
- // elements. Each jacobian block is stored in row-major order, i.e.,
- //
- // jacobians[i][r*parameter_block_size_[i] + c] =
- // d residual[r] / d parameters[i][c]
- //
- // If jacobians is NULL, then no derivatives are returned; this is
- // the case when computing cost only. If jacobians[i] is NULL, then
- // the jacobian block corresponding to the i'th parameter block must
- // not to be returned.
- //
- // The return value indicates whether the computation of the
- // residuals and/or jacobians was successful or not.
- //
- // This can be used to communicate numerical failures in jacobian
- // computations for instance.
- //
- // A more interesting and common use is to impose constraints on the
- // parameters. If the initial values of the parameter blocks satisfy
- // the constraints, then returning false whenever the constraints
- // are not satisfied will prevent the solver from moving into the
- // infeasible region. This is not a very sophisticated mechanism for
- // enforcing constraints, but is often good enough.
- //
- // Note that it is important that the initial values of the
- // parameter block must be feasible, otherwise the solver will
- // declare a numerical problem at iteration 0.
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const = 0;
-
- const vector<int32>& parameter_block_sizes() const {
- return parameter_block_sizes_;
- }
-
- int num_residuals() const {
- return num_residuals_;
- }
-
- protected:
- vector<int32>* mutable_parameter_block_sizes() {
- return &parameter_block_sizes_;
- }
-
- void set_num_residuals(int num_residuals) {
- num_residuals_ = num_residuals;
- }
-
- private:
- // Cost function signature metadata: number of inputs & their sizes,
- // number of outputs (residuals).
- vector<int32> parameter_block_sizes_;
- int num_residuals_;
- CERES_DISALLOW_COPY_AND_ASSIGN(CostFunction);
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/cost_function_to_functor.h b/extern/libmv/third_party/ceres/include/ceres/cost_function_to_functor.h
deleted file mode 100644
index b4a516e0ab1..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/cost_function_to_functor.h
+++ /dev/null
@@ -1,750 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// CostFunctionToFunctor is an adapter class that allows users to use
-// CostFunction objects in templated functors which are to be used for
-// automatic differentiation. This allows the user to seamlessly mix
-// analytic, numeric and automatic differentiation.
-//
-// For example, let us assume that
-//
-// class IntrinsicProjection : public SizedCostFunction<2, 5, 3> {
-// public:
-// IntrinsicProjection(const double* observations);
-// virtual bool Evaluate(double const* const* parameters,
-// double* residuals,
-// double** jacobians) const;
-// };
-//
-// is a cost function that implements the projection of a point in its
-// local coordinate system onto its image plane and subtracts it from
-// the observed point projection. It can compute its residual and
-// either via analytic or numerical differentiation can compute its
-// jacobians.
-//
-// Now we would like to compose the action of this CostFunction with
-// the action of camera extrinsics, i.e., rotation and
-// translation. Say we have a templated function
-//
-// template<typename T>
-// void RotateAndTranslatePoint(const T* rotation,
-// const T* translation,
-// const T* point,
-// T* result);
-//
-// Then we can now do the following,
-//
-// struct CameraProjection {
-// CameraProjection(double* observation) {
-// intrinsic_projection_.reset(
-// new CostFunctionToFunctor<2, 5, 3>(
-// new IntrinsicProjection(observation_)));
-// }
-// template <typename T>
-// bool operator()(const T* rotation,
-// const T* translation,
-// const T* intrinsics,
-// const T* point,
-// T* residual) const {
-// T transformed_point[3];
-// RotateAndTranslatePoint(rotation, translation, point, transformed_point);
-//
-// // Note that we call intrinsic_projection_, just like it was
-// // any other templated functor.
-//
-// return (*intrinsic_projection_)(intrinsics, transformed_point, residual);
-// }
-//
-// private:
-// scoped_ptr<CostFunctionToFunctor<2,5,3> > intrinsic_projection_;
-// };
-
-#ifndef CERES_PUBLIC_COST_FUNCTION_TO_FUNCTOR_H_
-#define CERES_PUBLIC_COST_FUNCTION_TO_FUNCTOR_H_
-
-#include <numeric>
-#include <vector>
-
-#include "ceres/cost_function.h"
-#include "ceres/internal/fixed_array.h"
-#include "ceres/internal/port.h"
-#include "ceres/internal/scoped_ptr.h"
-
-namespace ceres {
-
-template <int kNumResiduals,
- int N0, int N1 = 0, int N2 = 0, int N3 = 0, int N4 = 0,
- int N5 = 0, int N6 = 0, int N7 = 0, int N8 = 0, int N9 = 0>
-class CostFunctionToFunctor {
- public:
- explicit CostFunctionToFunctor(CostFunction* cost_function)
- : cost_function_(cost_function) {
- CHECK_NOTNULL(cost_function);
- CHECK(kNumResiduals > 0 || kNumResiduals == DYNAMIC);
-
- // This block breaks the 80 column rule to keep it somewhat readable.
- CHECK((!N1 && !N2 && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && !N2 && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && (N8 > 0) && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && (N8 > 0) && (N9 > 0)))
- << "Zero block cannot precede a non-zero block. Block sizes are "
- << "(ignore trailing 0s): " << N0 << ", " << N1 << ", " << N2 << ", "
- << N3 << ", " << N4 << ", " << N5 << ", " << N6 << ", " << N7 << ", "
- << N8 << ", " << N9;
-
- const vector<int32>& parameter_block_sizes =
- cost_function->parameter_block_sizes();
- const int num_parameter_blocks =
- (N0 > 0) + (N1 > 0) + (N2 > 0) + (N3 > 0) + (N4 > 0) +
- (N5 > 0) + (N6 > 0) + (N7 > 0) + (N8 > 0) + (N9 > 0);
- CHECK_EQ(parameter_block_sizes.size(), num_parameter_blocks);
-
- CHECK_EQ(N0, parameter_block_sizes[0]);
- if (parameter_block_sizes.size() > 1) CHECK_EQ(N1, parameter_block_sizes[1]); // NOLINT
- if (parameter_block_sizes.size() > 2) CHECK_EQ(N2, parameter_block_sizes[2]); // NOLINT
- if (parameter_block_sizes.size() > 3) CHECK_EQ(N3, parameter_block_sizes[3]); // NOLINT
- if (parameter_block_sizes.size() > 4) CHECK_EQ(N4, parameter_block_sizes[4]); // NOLINT
- if (parameter_block_sizes.size() > 5) CHECK_EQ(N5, parameter_block_sizes[5]); // NOLINT
- if (parameter_block_sizes.size() > 6) CHECK_EQ(N6, parameter_block_sizes[6]); // NOLINT
- if (parameter_block_sizes.size() > 7) CHECK_EQ(N7, parameter_block_sizes[7]); // NOLINT
- if (parameter_block_sizes.size() > 8) CHECK_EQ(N8, parameter_block_sizes[8]); // NOLINT
- if (parameter_block_sizes.size() > 9) CHECK_EQ(N9, parameter_block_sizes[9]); // NOLINT
-
- CHECK_EQ(accumulate(parameter_block_sizes.begin(),
- parameter_block_sizes.end(), 0),
- N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9);
- }
-
- bool operator()(const double* x0, double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_EQ(N1, 0);
- CHECK_EQ(N2, 0);
- CHECK_EQ(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
-
- return cost_function_->Evaluate(&x0, residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_EQ(N2, 0);
- CHECK_EQ(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(2);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_EQ(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(3);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(4);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(5);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- parameter_blocks[4] = x4;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(6);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- parameter_blocks[4] = x4;
- parameter_blocks[5] = x5;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(7);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- parameter_blocks[4] = x4;
- parameter_blocks[5] = x5;
- parameter_blocks[6] = x6;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- const double* x7,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_NE(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(8);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- parameter_blocks[4] = x4;
- parameter_blocks[5] = x5;
- parameter_blocks[6] = x6;
- parameter_blocks[7] = x7;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- const double* x7,
- const double* x8,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_NE(N7, 0);
- CHECK_NE(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(9);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- parameter_blocks[4] = x4;
- parameter_blocks[5] = x5;
- parameter_blocks[6] = x6;
- parameter_blocks[7] = x7;
- parameter_blocks[8] = x8;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- const double* x7,
- const double* x8,
- const double* x9,
- double* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_NE(N7, 0);
- CHECK_NE(N8, 0);
- CHECK_NE(N9, 0);
- internal::FixedArray<const double*> parameter_blocks(10);
- parameter_blocks[0] = x0;
- parameter_blocks[1] = x1;
- parameter_blocks[2] = x2;
- parameter_blocks[3] = x3;
- parameter_blocks[4] = x4;
- parameter_blocks[5] = x5;
- parameter_blocks[6] = x6;
- parameter_blocks[7] = x7;
- parameter_blocks[8] = x8;
- parameter_blocks[9] = x9;
- return cost_function_->Evaluate(parameter_blocks.get(), residuals, NULL);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0, JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_EQ(N1, 0);
- CHECK_EQ(N2, 0);
- CHECK_EQ(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- return EvaluateWithJets(&x0, residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_EQ(N2, 0);
- CHECK_EQ(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(2);
- jets[0] = x0;
- jets[1] = x1;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_EQ(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(3);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_EQ(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(4);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- const JetT* x4,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_EQ(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(5);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- jets[4] = x4;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- const JetT* x4,
- const JetT* x5,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_EQ(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(6);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- jets[4] = x4;
- jets[5] = x5;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- const JetT* x4,
- const JetT* x5,
- const JetT* x6,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_EQ(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(7);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- jets[4] = x4;
- jets[5] = x5;
- jets[6] = x6;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- const JetT* x4,
- const JetT* x5,
- const JetT* x6,
- const JetT* x7,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_NE(N7, 0);
- CHECK_EQ(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(8);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- jets[4] = x4;
- jets[5] = x5;
- jets[6] = x6;
- jets[7] = x7;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- const JetT* x4,
- const JetT* x5,
- const JetT* x6,
- const JetT* x7,
- const JetT* x8,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_NE(N7, 0);
- CHECK_NE(N8, 0);
- CHECK_EQ(N9, 0);
- internal::FixedArray<const JetT*> jets(9);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- jets[4] = x4;
- jets[5] = x5;
- jets[6] = x6;
- jets[7] = x7;
- jets[8] = x8;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- template <typename JetT>
- bool operator()(const JetT* x0,
- const JetT* x1,
- const JetT* x2,
- const JetT* x3,
- const JetT* x4,
- const JetT* x5,
- const JetT* x6,
- const JetT* x7,
- const JetT* x8,
- const JetT* x9,
- JetT* residuals) const {
- CHECK_NE(N0, 0);
- CHECK_NE(N1, 0);
- CHECK_NE(N2, 0);
- CHECK_NE(N3, 0);
- CHECK_NE(N4, 0);
- CHECK_NE(N5, 0);
- CHECK_NE(N6, 0);
- CHECK_NE(N7, 0);
- CHECK_NE(N8, 0);
- CHECK_NE(N9, 0);
- internal::FixedArray<const JetT*> jets(10);
- jets[0] = x0;
- jets[1] = x1;
- jets[2] = x2;
- jets[3] = x3;
- jets[4] = x4;
- jets[5] = x5;
- jets[6] = x6;
- jets[7] = x7;
- jets[8] = x8;
- jets[9] = x9;
- return EvaluateWithJets(jets.get(), residuals);
- }
-
- private:
- template <typename JetT>
- bool EvaluateWithJets(const JetT** inputs, JetT* output) const {
- const int kNumParameters = N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9;
- const vector<int32>& parameter_block_sizes =
- cost_function_->parameter_block_sizes();
- const int num_parameter_blocks = parameter_block_sizes.size();
- const int num_residuals = cost_function_->num_residuals();
-
- internal::FixedArray<double> parameters(kNumParameters);
- internal::FixedArray<double*> parameter_blocks(num_parameter_blocks);
- internal::FixedArray<double> jacobians(num_residuals * kNumParameters);
- internal::FixedArray<double*> jacobian_blocks(num_parameter_blocks);
- internal::FixedArray<double> residuals(num_residuals);
-
- // Build a set of arrays to get the residuals and jacobians from
- // the CostFunction wrapped by this functor.
- double* parameter_ptr = parameters.get();
- double* jacobian_ptr = jacobians.get();
- for (int i = 0; i < num_parameter_blocks; ++i) {
- parameter_blocks[i] = parameter_ptr;
- jacobian_blocks[i] = jacobian_ptr;
- for (int j = 0; j < parameter_block_sizes[i]; ++j) {
- *parameter_ptr++ = inputs[i][j].a;
- }
- jacobian_ptr += num_residuals * parameter_block_sizes[i];
- }
-
- if (!cost_function_->Evaluate(parameter_blocks.get(),
- residuals.get(),
- jacobian_blocks.get())) {
- return false;
- }
-
- // Now that we have the incoming Jets, which are carrying the
- // partial derivatives of each of the inputs w.r.t to some other
- // underlying parameters. The derivative of the outputs of the
- // cost function w.r.t to the same underlying parameters can now
- // be computed by applying the chain rule.
- //
- // d output[i] d output[i] d input[j]
- // -------------- = sum_j ----------- * ------------
- // d parameter[k] d input[j] d parameter[k]
- //
- // d input[j]
- // -------------- = inputs[j], so
- // d parameter[k]
- //
- // outputJet[i] = sum_k jacobian[i][k] * inputJet[k]
- //
- // The following loop, iterates over the residuals, computing one
- // output jet at a time.
- for (int i = 0; i < num_residuals; ++i) {
- output[i].a = residuals[i];
- output[i].v.setZero();
-
- for (int j = 0; j < num_parameter_blocks; ++j) {
- const int32 block_size = parameter_block_sizes[j];
- for (int k = 0; k < parameter_block_sizes[j]; ++k) {
- output[i].v +=
- jacobian_blocks[j][i * block_size + k] * inputs[j][k].v;
- }
- }
- }
-
- return true;
- }
-
- private:
- internal::scoped_ptr<CostFunction> cost_function_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_COST_FUNCTION_TO_FUNCTOR_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/covariance.h b/extern/libmv/third_party/ceres/include/ceres/covariance.h
deleted file mode 100644
index 35fde4de05d..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/covariance.h
+++ /dev/null
@@ -1,384 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_COVARIANCE_H_
-#define CERES_PUBLIC_COVARIANCE_H_
-
-#include <utility>
-#include <vector>
-#include "ceres/internal/port.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-class Problem;
-
-namespace internal {
-class CovarianceImpl;
-} // namespace internal
-
-// WARNING
-// =======
-// It is very easy to use this class incorrectly without understanding
-// the underlying mathematics. Please read and understand the
-// documentation completely before attempting to use this class.
-//
-//
-// This class allows the user to evaluate the covariance for a
-// non-linear least squares problem and provides random access to its
-// blocks
-//
-// Background
-// ==========
-// One way to assess the quality of the solution returned by a
-// non-linear least squares solve is to analyze the covariance of the
-// solution.
-//
-// Let us consider the non-linear regression problem
-//
-// y = f(x) + N(0, I)
-//
-// i.e., the observation y is a random non-linear function of the
-// independent variable x with mean f(x) and identity covariance. Then
-// the maximum likelihood estimate of x given observations y is the
-// solution to the non-linear least squares problem:
-//
-// x* = arg min_x |f(x)|^2
-//
-// And the covariance of x* is given by
-//
-// C(x*) = inverse[J'(x*)J(x*)]
-//
-// Here J(x*) is the Jacobian of f at x*. The above formula assumes
-// that J(x*) has full column rank.
-//
-// If J(x*) is rank deficient, then the covariance matrix C(x*) is
-// also rank deficient and is given by
-//
-// C(x*) = pseudoinverse[J'(x*)J(x*)]
-//
-// Note that in the above, we assumed that the covariance
-// matrix for y was identity. This is an important assumption. If this
-// is not the case and we have
-//
-// y = f(x) + N(0, S)
-//
-// Where S is a positive semi-definite matrix denoting the covariance
-// of y, then the maximum likelihood problem to be solved is
-//
-// x* = arg min_x f'(x) inverse[S] f(x)
-//
-// and the corresponding covariance estimate of x* is given by
-//
-// C(x*) = inverse[J'(x*) inverse[S] J(x*)]
-//
-// So, if it is the case that the observations being fitted to have a
-// covariance matrix not equal to identity, then it is the user's
-// responsibility that the corresponding cost functions are correctly
-// scaled, e.g. in the above case the cost function for this problem
-// should evaluate S^{-1/2} f(x) instead of just f(x), where S^{-1/2}
-// is the inverse square root of the covariance matrix S.
-//
-// This class allows the user to evaluate the covariance for a
-// non-linear least squares problem and provides random access to its
-// blocks. The computation assumes that the CostFunctions compute
-// residuals such that their covariance is identity.
-//
-// Since the computation of the covariance matrix requires computing
-// the inverse of a potentially large matrix, this can involve a
-// rather large amount of time and memory. However, it is usually the
-// case that the user is only interested in a small part of the
-// covariance matrix. Quite often just the block diagonal. This class
-// allows the user to specify the parts of the covariance matrix that
-// she is interested in and then uses this information to only compute
-// and store those parts of the covariance matrix.
-//
-// Rank of the Jacobian
-// --------------------
-// As we noted above, if the jacobian is rank deficient, then the
-// inverse of J'J is not defined and instead a pseudo inverse needs to
-// be computed.
-//
-// The rank deficiency in J can be structural -- columns which are
-// always known to be zero or numerical -- depending on the exact
-// values in the Jacobian.
-//
-// Structural rank deficiency occurs when the problem contains
-// parameter blocks that are constant. This class correctly handles
-// structural rank deficiency like that.
-//
-// Numerical rank deficiency, where the rank of the matrix cannot be
-// predicted by its sparsity structure and requires looking at its
-// numerical values is more complicated. Here again there are two
-// cases.
-//
-// a. The rank deficiency arises from overparameterization. e.g., a
-// four dimensional quaternion used to parameterize SO(3), which is
-// a three dimensional manifold. In cases like this, the user should
-// use an appropriate LocalParameterization. Not only will this lead
-// to better numerical behaviour of the Solver, it will also expose
-// the rank deficiency to the Covariance object so that it can
-// handle it correctly.
-//
-// b. More general numerical rank deficiency in the Jacobian
-// requires the computation of the so called Singular Value
-// Decomposition (SVD) of J'J. We do not know how to do this for
-// large sparse matrices efficiently. For small and moderate sized
-// problems this is done using dense linear algebra.
-//
-// Gauge Invariance
-// ----------------
-// In structure from motion (3D reconstruction) problems, the
-// reconstruction is ambiguous upto a similarity transform. This is
-// known as a Gauge Ambiguity. Handling Gauges correctly requires the
-// use of SVD or custom inversion algorithms. For small problems the
-// user can use the dense algorithm. For more details see
-//
-// Ken-ichi Kanatani, Daniel D. Morris: Gauges and gauge
-// transformations for uncertainty description of geometric structure
-// with indeterminacy. IEEE Transactions on Information Theory 47(5):
-// 2017-2028 (2001)
-//
-// Example Usage
-// =============
-//
-// double x[3];
-// double y[2];
-//
-// Problem problem;
-// problem.AddParameterBlock(x, 3);
-// problem.AddParameterBlock(y, 2);
-// <Build Problem>
-// <Solve Problem>
-//
-// Covariance::Options options;
-// Covariance covariance(options);
-//
-// vector<pair<const double*, const double*> > covariance_blocks;
-// covariance_blocks.push_back(make_pair(x, x));
-// covariance_blocks.push_back(make_pair(y, y));
-// covariance_blocks.push_back(make_pair(x, y));
-//
-// CHECK(covariance.Compute(covariance_blocks, &problem));
-//
-// double covariance_xx[3 * 3];
-// double covariance_yy[2 * 2];
-// double covariance_xy[3 * 2];
-// covariance.GetCovarianceBlock(x, x, covariance_xx)
-// covariance.GetCovarianceBlock(y, y, covariance_yy)
-// covariance.GetCovarianceBlock(x, y, covariance_xy)
-//
-class CERES_EXPORT Covariance {
- public:
- struct CERES_EXPORT Options {
- Options()
-#ifndef CERES_NO_SUITESPARSE
- : algorithm_type(SUITE_SPARSE_QR),
-#else
- : algorithm_type(EIGEN_SPARSE_QR),
-#endif
- min_reciprocal_condition_number(1e-14),
- null_space_rank(0),
- num_threads(1),
- apply_loss_function(true) {
- }
-
- // Ceres supports three different algorithms for covariance
- // estimation, which represent different tradeoffs in speed,
- // accuracy and reliability.
- //
- // 1. DENSE_SVD uses Eigen's JacobiSVD to perform the
- // computations. It computes the singular value decomposition
- //
- // U * S * V' = J
- //
- // and then uses it to compute the pseudo inverse of J'J as
- //
- // pseudoinverse[J'J]^ = V * pseudoinverse[S] * V'
- //
- // It is an accurate but slow method and should only be used
- // for small to moderate sized problems. It can handle
- // full-rank as well as rank deficient Jacobians.
- //
- // 2. EIGEN_SPARSE_QR uses the sparse QR factorization algorithm
- // in Eigen to compute the decomposition
- //
- // Q * R = J
- //
- // [J'J]^-1 = [R*R']^-1
- //
- // It is a moderately fast algorithm for sparse matrices.
- //
- // 3. SUITE_SPARSE_QR uses the SuiteSparseQR sparse QR
- // factorization algorithm. It uses dense linear algebra and is
- // multi threaded, so for large sparse sparse matrices it is
- // significantly faster than EIGEN_SPARSE_QR.
- //
- // Neither EIGEN_SPARSE_QR not SUITE_SPARSE_QR are capable of
- // computing the covariance if the Jacobian is rank deficient.
- CovarianceAlgorithmType algorithm_type;
-
- // If the Jacobian matrix is near singular, then inverting J'J
- // will result in unreliable results, e.g, if
- //
- // J = [1.0 1.0 ]
- // [1.0 1.0000001 ]
- //
- // which is essentially a rank deficient matrix, we have
- //
- // inv(J'J) = [ 2.0471e+14 -2.0471e+14]
- // [-2.0471e+14 2.0471e+14]
- //
- // This is not a useful result. Therefore, by default
- // Covariance::Compute will return false if a rank deficient
- // Jacobian is encountered. How rank deficiency is detected
- // depends on the algorithm being used.
- //
- // 1. DENSE_SVD
- //
- // min_sigma / max_sigma < sqrt(min_reciprocal_condition_number)
- //
- // where min_sigma and max_sigma are the minimum and maxiumum
- // singular values of J respectively.
- //
- // 2. SUITE_SPARSE_QR and EIGEN_SPARSE_QR
- //
- // rank(J) < num_col(J)
- //
- // Here rank(J) is the estimate of the rank of J returned by the
- // sparse QR factorization algorithm. It is a fairly reliable
- // indication of rank deficiency.
- //
- double min_reciprocal_condition_number;
-
- // When using DENSE_SVD, the user has more control in dealing with
- // singular and near singular covariance matrices.
- //
- // As mentioned above, when the covariance matrix is near
- // singular, instead of computing the inverse of J'J, the
- // Moore-Penrose pseudoinverse of J'J should be computed.
- //
- // If J'J has the eigen decomposition (lambda_i, e_i), where
- // lambda_i is the i^th eigenvalue and e_i is the corresponding
- // eigenvector, then the inverse of J'J is
- //
- // inverse[J'J] = sum_i e_i e_i' / lambda_i
- //
- // and computing the pseudo inverse involves dropping terms from
- // this sum that correspond to small eigenvalues.
- //
- // How terms are dropped is controlled by
- // min_reciprocal_condition_number and null_space_rank.
- //
- // If null_space_rank is non-negative, then the smallest
- // null_space_rank eigenvalue/eigenvectors are dropped
- // irrespective of the magnitude of lambda_i. If the ratio of the
- // smallest non-zero eigenvalue to the largest eigenvalue in the
- // truncated matrix is still below
- // min_reciprocal_condition_number, then the Covariance::Compute()
- // will fail and return false.
- //
- // Setting null_space_rank = -1 drops all terms for which
- //
- // lambda_i / lambda_max < min_reciprocal_condition_number.
- //
- // This option has no effect on the SUITE_SPARSE_QR and
- // EIGEN_SPARSE_QR algorithms.
- int null_space_rank;
-
- int num_threads;
-
- // Even though the residual blocks in the problem may contain loss
- // functions, setting apply_loss_function to false will turn off
- // the application of the loss function to the output of the cost
- // function and in turn its effect on the covariance.
- //
- // TODO(sameergaarwal): Expand this based on Jim's experiments.
- bool apply_loss_function;
- };
-
- explicit Covariance(const Options& options);
- ~Covariance();
-
- // Compute a part of the covariance matrix.
- //
- // The vector covariance_blocks, indexes into the covariance matrix
- // block-wise using pairs of parameter blocks. This allows the
- // covariance estimation algorithm to only compute and store these
- // blocks.
- //
- // Since the covariance matrix is symmetric, if the user passes
- // (block1, block2), then GetCovarianceBlock can be called with
- // block1, block2 as well as block2, block1.
- //
- // covariance_blocks cannot contain duplicates. Bad things will
- // happen if they do.
- //
- // Note that the list of covariance_blocks is only used to determine
- // what parts of the covariance matrix are computed. The full
- // Jacobian is used to do the computation, i.e. they do not have an
- // impact on what part of the Jacobian is used for computation.
- //
- // The return value indicates the success or failure of the
- // covariance computation. Please see the documentation for
- // Covariance::Options for more on the conditions under which this
- // function returns false.
- bool Compute(
- const vector<pair<const double*, const double*> >& covariance_blocks,
- Problem* problem);
-
- // Return the block of the covariance matrix corresponding to
- // parameter_block1 and parameter_block2.
- //
- // Compute must be called before the first call to
- // GetCovarianceBlock and the pair <parameter_block1,
- // parameter_block2> OR the pair <parameter_block2,
- // parameter_block1> must have been present in the vector
- // covariance_blocks when Compute was called. Otherwise
- // GetCovarianceBlock will return false.
- //
- // covariance_block must point to a memory location that can store a
- // parameter_block1_size x parameter_block2_size matrix. The
- // returned covariance will be a row-major matrix.
- bool GetCovarianceBlock(const double* parameter_block1,
- const double* parameter_block2,
- double* covariance_block) const;
-
- private:
- internal::scoped_ptr<internal::CovarianceImpl> impl_;
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_COVARIANCE_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/crs_matrix.h b/extern/libmv/third_party/ceres/include/ceres/crs_matrix.h
deleted file mode 100644
index d2d62894194..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/crs_matrix.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_CRS_MATRIX_H_
-#define CERES_PUBLIC_CRS_MATRIX_H_
-
-#include <vector>
-#include "ceres/internal/port.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// A compressed row sparse matrix used primarily for communicating the
-// Jacobian matrix to the user.
-struct CERES_EXPORT CRSMatrix {
- CRSMatrix() : num_rows(0), num_cols(0) {}
-
- int num_rows;
- int num_cols;
-
- // A compressed row matrix stores its contents in three arrays,
- // rows, cols and values.
- //
- // rows is a num_rows + 1 sized array that points into the cols and
- // values array. For each row i:
- //
- // cols[rows[i]] ... cols[rows[i + 1] - 1] are the indices of the
- // non-zero columns of row i.
- //
- // values[rows[i]] .. values[rows[i + 1] - 1] are the values of the
- // corresponding entries.
- //
- // cols and values contain as many entries as there are non-zeros in
- // the matrix.
- //
- // e.g, consider the 3x4 sparse matrix
- //
- // [ 0 10 0 4 ]
- // [ 0 2 -3 2 ]
- // [ 1 2 0 0 ]
- //
- // The three arrays will be:
- //
- //
- // -row0- ---row1--- -row2-
- // rows = [ 0, 2, 5, 7]
- // cols = [ 1, 3, 1, 2, 3, 0, 1]
- // values = [10, 4, 2, -3, 2, 1, 2]
-
- vector<int> cols;
- vector<int> rows;
- vector<double> values;
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_CRS_MATRIX_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/dynamic_autodiff_cost_function.h b/extern/libmv/third_party/ceres/include/ceres/dynamic_autodiff_cost_function.h
deleted file mode 100644
index f9342cdbab9..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/dynamic_autodiff_cost_function.h
+++ /dev/null
@@ -1,260 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-// mierle@gmail.com (Keir Mierle)
-//
-// This autodiff implementation differs from the one found in
-// autodiff_cost_function.h by supporting autodiff on cost functions
-// with variable numbers of parameters with variable sizes. With the
-// other implementation, all the sizes (both the number of parameter
-// blocks and the size of each block) must be fixed at compile time.
-//
-// The functor API differs slightly from the API for fixed size
-// autodiff; the expected interface for the cost functors is:
-//
-// struct MyCostFunctor {
-// template<typename T>
-// bool operator()(T const* const* parameters, T* residuals) const {
-// // Use parameters[i] to access the i'th parameter block.
-// }
-// }
-//
-// Since the sizing of the parameters is done at runtime, you must
-// also specify the sizes after creating the dynamic autodiff cost
-// function. For example:
-//
-// DynamicAutoDiffCostFunction<MyCostFunctor, 3> cost_function(
-// new MyCostFunctor());
-// cost_function.AddParameterBlock(5);
-// cost_function.AddParameterBlock(10);
-// cost_function.SetNumResiduals(21);
-//
-// Under the hood, the implementation evaluates the cost function
-// multiple times, computing a small set of the derivatives (four by
-// default, controlled by the Stride template parameter) with each
-// pass. There is a tradeoff with the size of the passes; you may want
-// to experiment with the stride.
-
-#ifndef CERES_PUBLIC_DYNAMIC_AUTODIFF_COST_FUNCTION_H_
-#define CERES_PUBLIC_DYNAMIC_AUTODIFF_COST_FUNCTION_H_
-
-#include <cmath>
-#include <numeric>
-#include <vector>
-
-#include "ceres/cost_function.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/jet.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-template <typename CostFunctor, int Stride = 4>
-class DynamicAutoDiffCostFunction : public CostFunction {
- public:
- explicit DynamicAutoDiffCostFunction(CostFunctor* functor)
- : functor_(functor) {}
-
- virtual ~DynamicAutoDiffCostFunction() {}
-
- void AddParameterBlock(int size) {
- mutable_parameter_block_sizes()->push_back(size);
- }
-
- void SetNumResiduals(int num_residuals) {
- set_num_residuals(num_residuals);
- }
-
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const {
- CHECK_GT(num_residuals(), 0)
- << "You must call DynamicAutoDiffCostFunction::SetNumResiduals() "
- << "before DynamicAutoDiffCostFunction::Evaluate().";
-
- if (jacobians == NULL) {
- return (*functor_)(parameters, residuals);
- }
-
- // The difficulty with Jets, as implemented in Ceres, is that they were
- // originally designed for strictly compile-sized use. At this point, there
- // is a large body of code that assumes inside a cost functor it is
- // acceptable to do e.g. T(1.5) and get an appropriately sized jet back.
- //
- // Unfortunately, it is impossible to communicate the expected size of a
- // dynamically sized jet to the static instantiations that existing code
- // depends on.
- //
- // To work around this issue, the solution here is to evaluate the
- // jacobians in a series of passes, each one computing Stripe *
- // num_residuals() derivatives. This is done with small, fixed-size jets.
- const int num_parameter_blocks = parameter_block_sizes().size();
- const int num_parameters = std::accumulate(parameter_block_sizes().begin(),
- parameter_block_sizes().end(),
- 0);
-
- // Allocate scratch space for the strided evaluation.
- vector<Jet<double, Stride> > input_jets(num_parameters);
- vector<Jet<double, Stride> > output_jets(num_residuals());
-
- // Make the parameter pack that is sent to the functor (reused).
- vector<Jet<double, Stride>* > jet_parameters(num_parameter_blocks,
- static_cast<Jet<double, Stride>* >(NULL));
- int num_active_parameters = 0;
-
- // To handle constant parameters between non-constant parameter blocks, the
- // start position --- a raw parameter index --- of each contiguous block of
- // non-constant parameters is recorded in start_derivative_section.
- vector<int> start_derivative_section;
- bool in_derivative_section = false;
- int parameter_cursor = 0;
-
- // Discover the derivative sections and set the parameter values.
- for (int i = 0; i < num_parameter_blocks; ++i) {
- jet_parameters[i] = &input_jets[parameter_cursor];
-
- const int parameter_block_size = parameter_block_sizes()[i];
- if (jacobians[i] != NULL) {
- if (!in_derivative_section) {
- start_derivative_section.push_back(parameter_cursor);
- in_derivative_section = true;
- }
-
- num_active_parameters += parameter_block_size;
- } else {
- in_derivative_section = false;
- }
-
- for (int j = 0; j < parameter_block_size; ++j, parameter_cursor++) {
- input_jets[parameter_cursor].a = parameters[i][j];
- }
- }
-
- // When `num_active_parameters % Stride != 0` then it can be the case
- // that `active_parameter_count < Stride` while parameter_cursor is less
- // than the total number of parameters and with no remaining non-constant
- // parameter blocks. Pushing parameter_cursor (the total number of
- // parameters) as a final entry to start_derivative_section is required
- // because if a constant parameter block is encountered after the
- // last non-constant block then current_derivative_section is incremented
- // and would otherwise index an invalid position in
- // start_derivative_section. Setting the final element to the total number
- // of parameters means that this can only happen at most once in the loop
- // below.
- start_derivative_section.push_back(parameter_cursor);
-
- // Evaluate all of the strides. Each stride is a chunk of the derivative to
- // evaluate, typically some size proportional to the size of the SIMD
- // registers of the CPU.
- int num_strides = static_cast<int>(ceil(num_active_parameters /
- static_cast<float>(Stride)));
-
- int current_derivative_section = 0;
- int current_derivative_section_cursor = 0;
-
- for (int pass = 0; pass < num_strides; ++pass) {
- // Set most of the jet components to zero, except for
- // non-constant #Stride parameters.
- const int initial_derivative_section = current_derivative_section;
- const int initial_derivative_section_cursor =
- current_derivative_section_cursor;
-
- int active_parameter_count = 0;
- parameter_cursor = 0;
-
- for (int i = 0; i < num_parameter_blocks; ++i) {
- for (int j = 0; j < parameter_block_sizes()[i];
- ++j, parameter_cursor++) {
- input_jets[parameter_cursor].v.setZero();
- if (active_parameter_count < Stride &&
- parameter_cursor >= (
- start_derivative_section[current_derivative_section] +
- current_derivative_section_cursor)) {
- if (jacobians[i] != NULL) {
- input_jets[parameter_cursor].v[active_parameter_count] = 1.0;
- ++active_parameter_count;
- ++current_derivative_section_cursor;
- } else {
- ++current_derivative_section;
- current_derivative_section_cursor = 0;
- }
- }
- }
- }
-
- if (!(*functor_)(&jet_parameters[0], &output_jets[0])) {
- return false;
- }
-
- // Copy the pieces of the jacobians into their final place.
- active_parameter_count = 0;
-
- current_derivative_section = initial_derivative_section;
- current_derivative_section_cursor = initial_derivative_section_cursor;
-
- for (int i = 0, parameter_cursor = 0; i < num_parameter_blocks; ++i) {
- for (int j = 0; j < parameter_block_sizes()[i];
- ++j, parameter_cursor++) {
- if (active_parameter_count < Stride &&
- parameter_cursor >= (
- start_derivative_section[current_derivative_section] +
- current_derivative_section_cursor)) {
- if (jacobians[i] != NULL) {
- for (int k = 0; k < num_residuals(); ++k) {
- jacobians[i][k * parameter_block_sizes()[i] + j] =
- output_jets[k].v[active_parameter_count];
- }
- ++active_parameter_count;
- ++current_derivative_section_cursor;
- } else {
- ++current_derivative_section;
- current_derivative_section_cursor = 0;
- }
- }
- }
- }
-
- // Only copy the residuals over once (even though we compute them on
- // every loop).
- if (pass == num_strides - 1) {
- for (int k = 0; k < num_residuals(); ++k) {
- residuals[k] = output_jets[k].a;
- }
- }
- }
- return true;
- }
-
- private:
- internal::scoped_ptr<CostFunctor> functor_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_DYNAMIC_AUTODIFF_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/dynamic_numeric_diff_cost_function.h b/extern/libmv/third_party/ceres/include/ceres/dynamic_numeric_diff_cost_function.h
deleted file mode 100644
index 2b6e8260286..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/dynamic_numeric_diff_cost_function.h
+++ /dev/null
@@ -1,265 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mierle@gmail.com (Keir Mierle)
-// sameeragarwal@google.com (Sameer Agarwal)
-// thadh@gmail.com (Thad Hughes)
-//
-// This numeric diff implementation differs from the one found in
-// numeric_diff_cost_function.h by supporting numericdiff on cost
-// functions with variable numbers of parameters with variable
-// sizes. With the other implementation, all the sizes (both the
-// number of parameter blocks and the size of each block) must be
-// fixed at compile time.
-//
-// The functor API differs slightly from the API for fixed size
-// numeric diff; the expected interface for the cost functors is:
-//
-// struct MyCostFunctor {
-// template<typename T>
-// bool operator()(double const* const* parameters, double* residuals) const {
-// // Use parameters[i] to access the i'th parameter block.
-// }
-// }
-//
-// Since the sizing of the parameters is done at runtime, you must
-// also specify the sizes after creating the
-// DynamicNumericDiffCostFunction. For example:
-//
-// DynamicAutoDiffCostFunction<MyCostFunctor, CENTRAL> cost_function(
-// new MyCostFunctor());
-// cost_function.AddParameterBlock(5);
-// cost_function.AddParameterBlock(10);
-// cost_function.SetNumResiduals(21);
-
-#ifndef CERES_PUBLIC_DYNAMIC_NUMERIC_DIFF_COST_FUNCTION_H_
-#define CERES_PUBLIC_DYNAMIC_NUMERIC_DIFF_COST_FUNCTION_H_
-
-#include <cmath>
-#include <numeric>
-#include <vector>
-
-#include "ceres/cost_function.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/internal/eigen.h"
-#include "ceres/internal/numeric_diff.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-template <typename CostFunctor, NumericDiffMethod method = CENTRAL>
-class DynamicNumericDiffCostFunction : public CostFunction {
- public:
- explicit DynamicNumericDiffCostFunction(const CostFunctor* functor,
- Ownership ownership = TAKE_OWNERSHIP,
- double relative_step_size = 1e-6)
- : functor_(functor),
- ownership_(ownership),
- relative_step_size_(relative_step_size) {
- }
-
- virtual ~DynamicNumericDiffCostFunction() {
- if (ownership_ != TAKE_OWNERSHIP) {
- functor_.release();
- }
- }
-
- void AddParameterBlock(int size) {
- mutable_parameter_block_sizes()->push_back(size);
- }
-
- void SetNumResiduals(int num_residuals) {
- set_num_residuals(num_residuals);
- }
-
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const {
- CHECK_GT(num_residuals(), 0)
- << "You must call DynamicNumericDiffCostFunction::SetNumResiduals() "
- << "before DynamicNumericDiffCostFunction::Evaluate().";
-
- const vector<int32>& block_sizes = parameter_block_sizes();
- CHECK(!block_sizes.empty())
- << "You must call DynamicNumericDiffCostFunction::AddParameterBlock() "
- << "before DynamicNumericDiffCostFunction::Evaluate().";
-
- const bool status = EvaluateCostFunctor(parameters, residuals);
- if (jacobians == NULL || !status) {
- return status;
- }
-
- // Create local space for a copy of the parameters which will get mutated.
- int parameters_size = accumulate(block_sizes.begin(), block_sizes.end(), 0);
- vector<double> parameters_copy(parameters_size);
- vector<double*> parameters_references_copy(block_sizes.size());
- parameters_references_copy[0] = &parameters_copy[0];
- for (int block = 1; block < block_sizes.size(); ++block) {
- parameters_references_copy[block] = parameters_references_copy[block - 1]
- + block_sizes[block - 1];
- }
-
- // Copy the parameters into the local temp space.
- for (int block = 0; block < block_sizes.size(); ++block) {
- memcpy(parameters_references_copy[block],
- parameters[block],
- block_sizes[block] * sizeof(*parameters[block]));
- }
-
- for (int block = 0; block < block_sizes.size(); ++block) {
- if (jacobians[block] != NULL &&
- !EvaluateJacobianForParameterBlock(block_sizes[block],
- block,
- relative_step_size_,
- residuals,
- &parameters_references_copy[0],
- jacobians)) {
- return false;
- }
- }
- return true;
- }
-
- private:
- bool EvaluateJacobianForParameterBlock(const int parameter_block_size,
- const int parameter_block,
- const double relative_step_size,
- double const* residuals_at_eval_point,
- double** parameters,
- double** jacobians) const {
- using Eigen::Map;
- using Eigen::Matrix;
- using Eigen::Dynamic;
- using Eigen::RowMajor;
-
- typedef Matrix<double, Dynamic, 1> ResidualVector;
- typedef Matrix<double, Dynamic, 1> ParameterVector;
- typedef Matrix<double, Dynamic, Dynamic, RowMajor> JacobianMatrix;
-
- int num_residuals = this->num_residuals();
-
- Map<JacobianMatrix> parameter_jacobian(jacobians[parameter_block],
- num_residuals,
- parameter_block_size);
-
- // Mutate one element at a time and then restore.
- Map<ParameterVector> x_plus_delta(parameters[parameter_block],
- parameter_block_size);
- ParameterVector x(x_plus_delta);
- ParameterVector step_size = x.array().abs() * relative_step_size;
-
- // To handle cases where a paremeter is exactly zero, instead use
- // the mean step_size for the other dimensions.
- double fallback_step_size = step_size.sum() / step_size.rows();
- if (fallback_step_size == 0.0) {
- // If all the parameters are zero, there's no good answer. Use the given
- // relative step_size as absolute step_size and hope for the best.
- fallback_step_size = relative_step_size;
- }
-
- // For each parameter in the parameter block, use finite
- // differences to compute the derivative for that parameter.
- for (int j = 0; j < parameter_block_size; ++j) {
- if (step_size(j) == 0.0) {
- // The parameter is exactly zero, so compromise and use the
- // mean step_size from the other parameters. This can break in
- // many cases, but it's hard to pick a good number without
- // problem specific knowledge.
- step_size(j) = fallback_step_size;
- }
- x_plus_delta(j) = x(j) + step_size(j);
-
- ResidualVector residuals(num_residuals);
- if (!EvaluateCostFunctor(parameters, &residuals[0])) {
- // Something went wrong; bail.
- return false;
- }
-
- // Compute this column of the jacobian in 3 steps:
- // 1. Store residuals for the forward part.
- // 2. Subtract residuals for the backward (or 0) part.
- // 3. Divide out the run.
- parameter_jacobian.col(j).matrix() = residuals;
-
- double one_over_h = 1 / step_size(j);
- if (method == CENTRAL) {
- // Compute the function on the other side of x(j).
- x_plus_delta(j) = x(j) - step_size(j);
-
- if (!EvaluateCostFunctor(parameters, &residuals[0])) {
- // Something went wrong; bail.
- return false;
- }
-
- parameter_jacobian.col(j) -= residuals;
- one_over_h /= 2;
- } else {
- // Forward difference only; reuse existing residuals evaluation.
- parameter_jacobian.col(j) -=
- Map<const ResidualVector>(residuals_at_eval_point, num_residuals);
- }
- x_plus_delta(j) = x(j); // Restore x_plus_delta.
-
- // Divide out the run to get slope.
- parameter_jacobian.col(j) *= one_over_h;
- }
- return true;
- }
-
- bool EvaluateCostFunctor(double const* const* parameters,
- double* residuals) const {
- return EvaluateCostFunctorImpl(functor_.get(),
- parameters,
- residuals,
- functor_.get());
- }
-
- // Helper templates to allow evaluation of a functor or a
- // CostFunction.
- bool EvaluateCostFunctorImpl(const CostFunctor* functor,
- double const* const* parameters,
- double* residuals,
- const void* /* NOT USED */) const {
- return (*functor)(parameters, residuals);
- }
-
- bool EvaluateCostFunctorImpl(const CostFunctor* functor,
- double const* const* parameters,
- double* residuals,
- const CostFunction* /* NOT USED */) const {
- return functor->Evaluate(parameters, residuals, NULL);
- }
-
- internal::scoped_ptr<const CostFunctor> functor_;
- Ownership ownership_;
- const double relative_step_size_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_DYNAMIC_AUTODIFF_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/fpclassify.h b/extern/libmv/third_party/ceres/include/ceres/fpclassify.h
deleted file mode 100644
index da8a4d086b8..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/fpclassify.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-//
-// Portable floating point classification. The names are picked such that they
-// do not collide with macros. For example, "isnan" in C99 is a macro and hence
-// does not respect namespaces.
-//
-// TODO(keir): Finish porting!
-
-#ifndef CERES_PUBLIC_FPCLASSIFY_H_
-#define CERES_PUBLIC_FPCLASSIFY_H_
-
-#if defined(_MSC_VER)
-#include <float.h>
-#endif
-
-#include <limits>
-
-namespace ceres {
-
-#if defined(_MSC_VER)
-
-inline bool IsFinite (double x) { return _finite(x) != 0; }
-inline bool IsInfinite(double x) { return _finite(x) == 0 && _isnan(x) == 0; }
-inline bool IsNaN (double x) { return _isnan(x) != 0; }
-inline bool IsNormal (double x) {
- int classification = _fpclass(x);
- return classification == _FPCLASS_NN ||
- classification == _FPCLASS_PN;
-}
-
-#elif defined(ANDROID) && defined(_STLPORT_VERSION)
-
-// On Android, when using the STLPort, the C++ isnan and isnormal functions
-// are defined as macros.
-inline bool IsNaN (double x) { return isnan(x); }
-inline bool IsNormal (double x) { return isnormal(x); }
-// On Android NDK r6, when using STLPort, the isinf and isfinite functions are
-// not available, so reimplement them.
-inline bool IsInfinite(double x) {
- return x == std::numeric_limits<double>::infinity() ||
- x == -std::numeric_limits<double>::infinity();
-}
-inline bool IsFinite(double x) {
- return !isnan(x) && !IsInfinite(x);
-}
-
-# else
-
-// These definitions are for the normal Unix suspects.
-inline bool IsFinite (double x) { return std::isfinite(x); }
-inline bool IsInfinite(double x) { return std::isinf(x); }
-inline bool IsNaN (double x) { return std::isnan(x); }
-inline bool IsNormal (double x) { return std::isnormal(x); }
-
-#endif
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_FPCLASSIFY_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/gradient_checker.h b/extern/libmv/third_party/ceres/include/ceres/gradient_checker.h
deleted file mode 100644
index 79ebae5f13e..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/gradient_checker.h
+++ /dev/null
@@ -1,222 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-// Copyright 2007 Google Inc. All Rights Reserved.
-//
-// Author: wjr@google.com (William Rucklidge)
-//
-// This file contains a class that exercises a cost function, to make sure
-// that it is computing reasonable derivatives. It compares the Jacobians
-// computed by the cost function with those obtained by finite
-// differences.
-
-#ifndef CERES_PUBLIC_GRADIENT_CHECKER_H_
-#define CERES_PUBLIC_GRADIENT_CHECKER_H_
-
-#include <cstddef>
-#include <algorithm>
-#include <vector>
-
-#include "ceres/internal/eigen.h"
-#include "ceres/internal/fixed_array.h"
-#include "ceres/internal/macros.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/numeric_diff_cost_function.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-// An object that exercises a cost function, to compare the answers that it
-// gives with derivatives estimated using finite differencing.
-//
-// The only likely usage of this is for testing.
-//
-// How to use: Fill in an array of pointers to parameter blocks for your
-// CostFunction, and then call Probe(). Check that the return value is
-// 'true'. See prober_test.cc for an example.
-//
-// This is templated similarly to NumericDiffCostFunction, as it internally
-// uses that.
-template <typename CostFunctionToProbe,
- int M = 0, int N0 = 0, int N1 = 0, int N2 = 0, int N3 = 0, int N4 = 0>
-class GradientChecker {
- public:
- // Here we stash some results from the probe, for later
- // inspection.
- struct GradientCheckResults {
- // Computed cost.
- Vector cost;
-
- // The sizes of these matrices are dictated by the cost function's
- // parameter and residual block sizes. Each vector's length will
- // term->parameter_block_sizes().size(), and each matrix is the
- // Jacobian of the residual with respect to the corresponding parameter
- // block.
-
- // Derivatives as computed by the cost function.
- vector<Matrix> term_jacobians;
-
- // Derivatives as computed by finite differencing.
- vector<Matrix> finite_difference_jacobians;
-
- // Infinity-norm of term_jacobians - finite_difference_jacobians.
- double error_jacobians;
- };
-
- // Checks the Jacobian computed by a cost function.
- //
- // probe_point: The parameter values at which to probe.
- // error_tolerance: A threshold for the infinity-norm difference
- // between the Jacobians. If the Jacobians differ by more than
- // this amount, then the probe fails.
- //
- // term: The cost function to test. Not retained after this call returns.
- //
- // results: On return, the two Jacobians (and other information)
- // will be stored here. May be NULL.
- //
- // Returns true if no problems are detected and the difference between the
- // Jacobians is less than error_tolerance.
- static bool Probe(double const* const* probe_point,
- double error_tolerance,
- CostFunctionToProbe *term,
- GradientCheckResults* results) {
- CHECK_NOTNULL(probe_point);
- CHECK_NOTNULL(term);
- LOG(INFO) << "-------------------- Starting Probe() --------------------";
-
- // We need a GradientCheckeresults, whether or not they supplied one.
- internal::scoped_ptr<GradientCheckResults> owned_results;
- if (results == NULL) {
- owned_results.reset(new GradientCheckResults);
- results = owned_results.get();
- }
-
- // Do a consistency check between the term and the template parameters.
- CHECK_EQ(M, term->num_residuals());
- const int num_residuals = M;
- const vector<int32>& block_sizes = term->parameter_block_sizes();
- const int num_blocks = block_sizes.size();
-
- CHECK_LE(num_blocks, 5) << "Unable to test functions that take more "
- << "than 5 parameter blocks";
- if (N0) {
- CHECK_EQ(N0, block_sizes[0]);
- CHECK_GE(num_blocks, 1);
- } else {
- CHECK_LT(num_blocks, 1);
- }
- if (N1) {
- CHECK_EQ(N1, block_sizes[1]);
- CHECK_GE(num_blocks, 2);
- } else {
- CHECK_LT(num_blocks, 2);
- }
- if (N2) {
- CHECK_EQ(N2, block_sizes[2]);
- CHECK_GE(num_blocks, 3);
- } else {
- CHECK_LT(num_blocks, 3);
- }
- if (N3) {
- CHECK_EQ(N3, block_sizes[3]);
- CHECK_GE(num_blocks, 4);
- } else {
- CHECK_LT(num_blocks, 4);
- }
- if (N4) {
- CHECK_EQ(N4, block_sizes[4]);
- CHECK_GE(num_blocks, 5);
- } else {
- CHECK_LT(num_blocks, 5);
- }
-
- results->term_jacobians.clear();
- results->term_jacobians.resize(num_blocks);
- results->finite_difference_jacobians.clear();
- results->finite_difference_jacobians.resize(num_blocks);
-
- internal::FixedArray<double*> term_jacobian_pointers(num_blocks);
- internal::FixedArray<double*>
- finite_difference_jacobian_pointers(num_blocks);
- for (int i = 0; i < num_blocks; i++) {
- results->term_jacobians[i].resize(num_residuals, block_sizes[i]);
- term_jacobian_pointers[i] = results->term_jacobians[i].data();
- results->finite_difference_jacobians[i].resize(
- num_residuals, block_sizes[i]);
- finite_difference_jacobian_pointers[i] =
- results->finite_difference_jacobians[i].data();
- }
- results->cost.resize(num_residuals, 1);
-
- CHECK(term->Evaluate(probe_point, results->cost.data(),
- term_jacobian_pointers.get()));
- NumericDiffCostFunction<CostFunctionToProbe, CENTRAL, M, N0, N1, N2, N3, N4>
- numeric_term(term, DO_NOT_TAKE_OWNERSHIP);
- CHECK(numeric_term.Evaluate(probe_point, results->cost.data(),
- finite_difference_jacobian_pointers.get()));
-
- results->error_jacobians = 0;
- for (int i = 0; i < num_blocks; i++) {
- Matrix jacobian_difference = results->term_jacobians[i] -
- results->finite_difference_jacobians[i];
- results->error_jacobians =
- std::max(results->error_jacobians,
- jacobian_difference.lpNorm<Eigen::Infinity>());
- }
-
- LOG(INFO) << "========== term-computed derivatives ==========";
- for (int i = 0; i < num_blocks; i++) {
- LOG(INFO) << "term_computed block " << i;
- LOG(INFO) << "\n" << results->term_jacobians[i];
- }
-
- LOG(INFO) << "========== finite-difference derivatives ==========";
- for (int i = 0; i < num_blocks; i++) {
- LOG(INFO) << "finite_difference block " << i;
- LOG(INFO) << "\n" << results->finite_difference_jacobians[i];
- }
-
- LOG(INFO) << "========== difference ==========";
- for (int i = 0; i < num_blocks; i++) {
- LOG(INFO) << "difference block " << i;
- LOG(INFO) << (results->term_jacobians[i] -
- results->finite_difference_jacobians[i]);
- }
-
- LOG(INFO) << "||difference|| = " << results->error_jacobians;
-
- return results->error_jacobians < error_tolerance;
- }
-
- private:
- CERES_DISALLOW_IMPLICIT_CONSTRUCTORS(GradientChecker);
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_GRADIENT_CHECKER_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/gradient_problem.h b/extern/libmv/third_party/ceres/include/ceres/gradient_problem.h
deleted file mode 100644
index 55a8be1df09..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/gradient_problem.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_GRADIENT_PROBLEM_H_
-#define CERES_PUBLIC_GRADIENT_PROBLEM_H_
-
-#include "ceres/internal/macros.h"
-#include "ceres/internal/port.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/local_parameterization.h"
-
-namespace ceres {
-
-class FirstOrderFunction;
-
-// Instances of GradientProblem represent general non-linear
-// optimization problems that must be solved using just the value of
-// the objective function and its gradient. Unlike the Problem class,
-// which can only be used to model non-linear least squares problems,
-// instances of GradientProblem not restricted in the form of the
-// objective function.
-//
-// Structurally GradientProblem is a composition of a
-// FirstOrderFunction and optionally a LocalParameterization.
-//
-// The FirstOrderFunction is responsible for evaluating the cost and
-// gradient of the objective function.
-//
-// The LocalParameterization is responsible for going back and forth
-// between the ambient space and the local tangent space. (See
-// local_parameterization.h for more details). When a
-// LocalParameterization is not provided, then the tangent space is
-// assumed to coincide with the ambient Euclidean space that the
-// gradient vector lives in.
-//
-// Example usage:
-//
-// The following demonstrate the problem construction for Rosenbrock's function
-//
-// f(x,y) = (1-x)^2 + 100(y - x^2)^2;
-//
-// class Rosenbrock : public ceres::FirstOrderFunction {
-// public:
-// virtual ~Rosenbrock() {}
-//
-// virtual bool Evaluate(const double* parameters,
-// double* cost,
-// double* gradient) const {
-// const double x = parameters[0];
-// const double y = parameters[1];
-//
-// cost[0] = (1.0 - x) * (1.0 - x) + 100.0 * (y - x * x) * (y - x * x);
-// if (gradient != NULL) {
-// gradient[0] = -2.0 * (1.0 - x) - 200.0 * (y - x * x) * 2.0 * x;
-// gradient[1] = 200.0 * (y - x * x);
-// }
-// return true;
-// };
-//
-// virtual int NumParameters() const { return 2; };
-// };
-//
-// ceres::GradientProblem problem(new Rosenbrock());
-class CERES_EXPORT GradientProblem {
- public:
- // Takes ownership of the function.
- explicit GradientProblem(FirstOrderFunction* function);
-
- // Takes ownership of the function and the parameterization.
- GradientProblem(FirstOrderFunction* function,
- LocalParameterization* parameterization);
-
- int NumParameters() const;
- int NumLocalParameters() const;
-
- // This call is not thread safe.
- bool Evaluate(const double* parameters, double* cost, double* gradient) const;
- bool Plus(const double* x, const double* delta, double* x_plus_delta) const;
-
- private:
- internal::scoped_ptr<FirstOrderFunction> function_;
- internal::scoped_ptr<LocalParameterization> parameterization_;
- internal::scoped_array<double> scratch_;
-};
-
-// A FirstOrderFunction object implements the evaluation of a function
-// and its gradient.
-class CERES_EXPORT FirstOrderFunction {
- public:
- virtual ~FirstOrderFunction() {}
- // cost is never NULL. gradient may be null.
- virtual bool Evaluate(const double* const parameters,
- double* cost,
- double* gradient) const = 0;
- virtual int NumParameters() const = 0;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_GRADIENT_PROBLEM_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/gradient_problem_solver.h b/extern/libmv/third_party/ceres/include/ceres/gradient_problem_solver.h
deleted file mode 100644
index db706f7dbaf..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/gradient_problem_solver.h
+++ /dev/null
@@ -1,353 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_GRADIENT_PROBLEM_SOLVER_H_
-#define CERES_PUBLIC_GRADIENT_PROBLEM_SOLVER_H_
-
-#include <cmath>
-#include <string>
-#include <vector>
-#include "ceres/internal/macros.h"
-#include "ceres/internal/port.h"
-#include "ceres/iteration_callback.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-class GradientProblem;
-
-class CERES_EXPORT GradientProblemSolver {
- public:
- virtual ~GradientProblemSolver();
-
- // The options structure contains, not surprisingly, options that control how
- // the solver operates. The defaults should be suitable for a wide range of
- // problems; however, better performance is often obtainable with tweaking.
- //
- // The constants are defined inside types.h
- struct CERES_EXPORT Options {
- // Default constructor that sets up a generic sparse problem.
- Options() {
- line_search_direction_type = LBFGS;
- line_search_type = WOLFE;
- nonlinear_conjugate_gradient_type = FLETCHER_REEVES;
- max_lbfgs_rank = 20;
- use_approximate_eigenvalue_bfgs_scaling = false;
- line_search_interpolation_type = CUBIC;
- min_line_search_step_size = 1e-9;
- line_search_sufficient_function_decrease = 1e-4;
- max_line_search_step_contraction = 1e-3;
- min_line_search_step_contraction = 0.6;
- max_num_line_search_step_size_iterations = 20;
- max_num_line_search_direction_restarts = 5;
- line_search_sufficient_curvature_decrease = 0.9;
- max_line_search_step_expansion = 10.0;
- max_num_iterations = 50;
- max_solver_time_in_seconds = 1e9;
- function_tolerance = 1e-6;
- gradient_tolerance = 1e-10;
- logging_type = PER_MINIMIZER_ITERATION;
- minimizer_progress_to_stdout = false;
- }
-
- // Returns true if the options struct has a valid
- // configuration. Returns false otherwise, and fills in *error
- // with a message describing the problem.
- bool IsValid(string* error) const;
-
- // Minimizer options ----------------------------------------
- LineSearchDirectionType line_search_direction_type;
- LineSearchType line_search_type;
- NonlinearConjugateGradientType nonlinear_conjugate_gradient_type;
-
- // The LBFGS hessian approximation is a low rank approximation to
- // the inverse of the Hessian matrix. The rank of the
- // approximation determines (linearly) the space and time
- // complexity of using the approximation. Higher the rank, the
- // better is the quality of the approximation. The increase in
- // quality is however is bounded for a number of reasons.
- //
- // 1. The method only uses secant information and not actual
- // derivatives.
- //
- // 2. The Hessian approximation is constrained to be positive
- // definite.
- //
- // So increasing this rank to a large number will cost time and
- // space complexity without the corresponding increase in solution
- // quality. There are no hard and fast rules for choosing the
- // maximum rank. The best choice usually requires some problem
- // specific experimentation.
- //
- // For more theoretical and implementation details of the LBFGS
- // method, please see:
- //
- // Nocedal, J. (1980). "Updating Quasi-Newton Matrices with
- // Limited Storage". Mathematics of Computation 35 (151): 773–782.
- int max_lbfgs_rank;
-
- // As part of the (L)BFGS update step (BFGS) / right-multiply step (L-BFGS),
- // the initial inverse Hessian approximation is taken to be the Identity.
- // However, Oren showed that using instead I * \gamma, where \gamma is
- // chosen to approximate an eigenvalue of the true inverse Hessian can
- // result in improved convergence in a wide variety of cases. Setting
- // use_approximate_eigenvalue_bfgs_scaling to true enables this scaling.
- //
- // It is important to note that approximate eigenvalue scaling does not
- // always improve convergence, and that it can in fact significantly degrade
- // performance for certain classes of problem, which is why it is disabled
- // by default. In particular it can degrade performance when the
- // sensitivity of the problem to different parameters varies significantly,
- // as in this case a single scalar factor fails to capture this variation
- // and detrimentally downscales parts of the jacobian approximation which
- // correspond to low-sensitivity parameters. It can also reduce the
- // robustness of the solution to errors in the jacobians.
- //
- // Oren S.S., Self-scaling variable metric (SSVM) algorithms
- // Part II: Implementation and experiments, Management Science,
- // 20(5), 863-874, 1974.
- bool use_approximate_eigenvalue_bfgs_scaling;
-
- // Degree of the polynomial used to approximate the objective
- // function. Valid values are BISECTION, QUADRATIC and CUBIC.
- //
- // BISECTION corresponds to pure backtracking search with no
- // interpolation.
- LineSearchInterpolationType line_search_interpolation_type;
-
- // If during the line search, the step_size falls below this
- // value, it is truncated to zero.
- double min_line_search_step_size;
-
- // Line search parameters.
-
- // Solving the line search problem exactly is computationally
- // prohibitive. Fortunately, line search based optimization
- // algorithms can still guarantee convergence if instead of an
- // exact solution, the line search algorithm returns a solution
- // which decreases the value of the objective function
- // sufficiently. More precisely, we are looking for a step_size
- // s.t.
- //
- // f(step_size) <= f(0) + sufficient_decrease * f'(0) * step_size
- //
- double line_search_sufficient_function_decrease;
-
- // In each iteration of the line search,
- //
- // new_step_size >= max_line_search_step_contraction * step_size
- //
- // Note that by definition, for contraction:
- //
- // 0 < max_step_contraction < min_step_contraction < 1
- //
- double max_line_search_step_contraction;
-
- // In each iteration of the line search,
- //
- // new_step_size <= min_line_search_step_contraction * step_size
- //
- // Note that by definition, for contraction:
- //
- // 0 < max_step_contraction < min_step_contraction < 1
- //
- double min_line_search_step_contraction;
-
- // Maximum number of trial step size iterations during each line search,
- // if a step size satisfying the search conditions cannot be found within
- // this number of trials, the line search will terminate.
- int max_num_line_search_step_size_iterations;
-
- // Maximum number of restarts of the line search direction algorithm before
- // terminating the optimization. Restarts of the line search direction
- // algorithm occur when the current algorithm fails to produce a new descent
- // direction. This typically indicates a numerical failure, or a breakdown
- // in the validity of the approximations used.
- int max_num_line_search_direction_restarts;
-
- // The strong Wolfe conditions consist of the Armijo sufficient
- // decrease condition, and an additional requirement that the
- // step-size be chosen s.t. the _magnitude_ ('strong' Wolfe
- // conditions) of the gradient along the search direction
- // decreases sufficiently. Precisely, this second condition
- // is that we seek a step_size s.t.
- //
- // |f'(step_size)| <= sufficient_curvature_decrease * |f'(0)|
- //
- // Where f() is the line search objective and f'() is the derivative
- // of f w.r.t step_size (d f / d step_size).
- double line_search_sufficient_curvature_decrease;
-
- // During the bracketing phase of the Wolfe search, the step size is
- // increased until either a point satisfying the Wolfe conditions is
- // found, or an upper bound for a bracket containing a point satisfying
- // the conditions is found. Precisely, at each iteration of the
- // expansion:
- //
- // new_step_size <= max_step_expansion * step_size.
- //
- // By definition for expansion, max_step_expansion > 1.0.
- double max_line_search_step_expansion;
-
- // Maximum number of iterations for the minimizer to run for.
- int max_num_iterations;
-
- // Maximum time for which the minimizer should run for.
- double max_solver_time_in_seconds;
-
- // Minimizer terminates when
- //
- // (new_cost - old_cost) < function_tolerance * old_cost;
- //
- double function_tolerance;
-
- // Minimizer terminates when
- //
- // max_i |x - Project(Plus(x, -g(x))| < gradient_tolerance
- //
- // This value should typically be 1e-4 * function_tolerance.
- double gradient_tolerance;
-
- // Logging options ---------------------------------------------------------
-
- LoggingType logging_type;
-
- // By default the Minimizer progress is logged to VLOG(1), which
- // is sent to STDERR depending on the vlog level. If this flag is
- // set to true, and logging_type is not SILENT, the logging output
- // is sent to STDOUT.
- bool minimizer_progress_to_stdout;
-
- // Callbacks that are executed at the end of each iteration of the
- // Minimizer. An iteration may terminate midway, either due to
- // numerical failures or because one of the convergence tests has
- // been satisfied. In this case none of the callbacks are
- // executed.
-
- // Callbacks are executed in the order that they are specified in
- // this vector. By default, parameter blocks are updated only at
- // the end of the optimization, i.e when the Minimizer
- // terminates. This behaviour is controlled by
- // update_state_every_variable. If the user wishes to have access
- // to the update parameter blocks when his/her callbacks are
- // executed, then set update_state_every_iteration to true.
- //
- // The solver does NOT take ownership of these pointers.
- vector<IterationCallback*> callbacks;
- };
-
- struct CERES_EXPORT Summary {
- Summary();
-
- // A brief one line description of the state of the solver after
- // termination.
- string BriefReport() const;
-
- // A full multiline description of the state of the solver after
- // termination.
- string FullReport() const;
-
- bool IsSolutionUsable() const;
-
- // Minimizer summary -------------------------------------------------
- TerminationType termination_type;
-
- // Reason why the solver terminated.
- string message;
-
- // Cost of the problem (value of the objective function) before
- // the optimization.
- double initial_cost;
-
- // Cost of the problem (value of the objective function) after the
- // optimization.
- double final_cost;
-
- // IterationSummary for each minimizer iteration in order.
- vector<IterationSummary> iterations;
-
- // Sum total of all time spent inside Ceres when Solve is called.
- double total_time_in_seconds;
-
- // Time (in seconds) spent evaluating the cost.
- double cost_evaluation_time_in_seconds;
-
- // Time (in seconds) spent evaluating the gradient.
- double gradient_evaluation_time_in_seconds;
-
- // Number of parameters in the probem.
- int num_parameters;
-
- // Dimension of the tangent space of the problem.
- int num_local_parameters;
-
- // Type of line search direction used.
- LineSearchDirectionType line_search_direction_type;
-
- // Type of the line search algorithm used.
- LineSearchType line_search_type;
-
- // When performing line search, the degree of the polynomial used
- // to approximate the objective function.
- LineSearchInterpolationType line_search_interpolation_type;
-
- // If the line search direction is NONLINEAR_CONJUGATE_GRADIENT,
- // then this indicates the particular variant of non-linear
- // conjugate gradient used.
- NonlinearConjugateGradientType nonlinear_conjugate_gradient_type;
-
- // If the type of the line search direction is LBFGS, then this
- // indicates the rank of the Hessian approximation.
- int max_lbfgs_rank;
- };
-
- // Once a least squares problem has been built, this function takes
- // the problem and optimizes it based on the values of the options
- // parameters. Upon return, a detailed summary of the work performed
- // by the preprocessor, the non-linear minmizer and the linear
- // solver are reported in the summary object.
- virtual void Solve(const GradientProblemSolver::Options& options,
- const GradientProblem& problem,
- double* parameters,
- GradientProblemSolver::Summary* summary);
-};
-
-// Helper function which avoids going through the interface.
-CERES_EXPORT void Solve(const GradientProblemSolver::Options& options,
- const GradientProblem& problem,
- double* parameters,
- GradientProblemSolver::Summary* summary);
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_GRADIENT_PROBLEM_SOLVER_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/autodiff.h b/extern/libmv/third_party/ceres/include/ceres/internal/autodiff.h
deleted file mode 100644
index 3a96625e3fd..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/autodiff.h
+++ /dev/null
@@ -1,317 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-//
-// Computation of the Jacobian matrix for vector-valued functions of multiple
-// variables, using automatic differentiation based on the implementation of
-// dual numbers in jet.h. Before reading the rest of this file, it is adivsable
-// to read jet.h's header comment in detail.
-//
-// The helper wrapper AutoDiff::Differentiate() computes the jacobian of
-// functors with templated operator() taking this form:
-//
-// struct F {
-// template<typename T>
-// bool operator()(const T *x, const T *y, ..., T *z) {
-// // Compute z[] based on x[], y[], ...
-// // return true if computation succeeded, false otherwise.
-// }
-// };
-//
-// All inputs and outputs may be vector-valued.
-//
-// To understand how jets are used to compute the jacobian, a
-// picture may help. Consider a vector-valued function, F, returning 3
-// dimensions and taking a vector-valued parameter of 4 dimensions:
-//
-// y x
-// [ * ] F [ * ]
-// [ * ] <--- [ * ]
-// [ * ] [ * ]
-// [ * ]
-//
-// Similar to the 2-parameter example for f described in jet.h, computing the
-// jacobian dy/dx is done by substutiting a suitable jet object for x and all
-// intermediate steps of the computation of F. Since x is has 4 dimensions, use
-// a Jet<double, 4>.
-//
-// Before substituting a jet object for x, the dual components are set
-// appropriately for each dimension of x:
-//
-// y x
-// [ * | * * * * ] f [ * | 1 0 0 0 ] x0
-// [ * | * * * * ] <--- [ * | 0 1 0 0 ] x1
-// [ * | * * * * ] [ * | 0 0 1 0 ] x2
-// ---+--- [ * | 0 0 0 1 ] x3
-// | ^ ^ ^ ^
-// dy/dx | | | +----- infinitesimal for x3
-// | | +------- infinitesimal for x2
-// | +--------- infinitesimal for x1
-// +----------- infinitesimal for x0
-//
-// The reason to set the internal 4x4 submatrix to the identity is that we wish
-// to take the derivative of y separately with respect to each dimension of x.
-// Each column of the 4x4 identity is therefore for a single component of the
-// independent variable x.
-//
-// Then the jacobian of the mapping, dy/dx, is the 3x4 sub-matrix of the
-// extended y vector, indicated in the above diagram.
-//
-// Functors with multiple parameters
-// ---------------------------------
-// In practice, it is often convenient to use a function f of two or more
-// vector-valued parameters, for example, x[3] and z[6]. Unfortunately, the jet
-// framework is designed for a single-parameter vector-valued input. The wrapper
-// in this file addresses this issue adding support for functions with one or
-// more parameter vectors.
-//
-// To support multiple parameters, all the parameter vectors are concatenated
-// into one and treated as a single parameter vector, except that since the
-// functor expects different inputs, we need to construct the jets as if they
-// were part of a single parameter vector. The extended jets are passed
-// separately for each parameter.
-//
-// For example, consider a functor F taking two vector parameters, p[2] and
-// q[3], and producing an output y[4]:
-//
-// struct F {
-// template<typename T>
-// bool operator()(const T *p, const T *q, T *z) {
-// // ...
-// }
-// };
-//
-// In this case, the necessary jet type is Jet<double, 5>. Here is a
-// visualization of the jet objects in this case:
-//
-// Dual components for p ----+
-// |
-// -+-
-// y [ * | 1 0 | 0 0 0 ] --- p[0]
-// [ * | 0 1 | 0 0 0 ] --- p[1]
-// [ * | . . | + + + ] |
-// [ * | . . | + + + ] v
-// [ * | . . | + + + ] <--- F(p, q)
-// [ * | . . | + + + ] ^
-// ^^^ ^^^^^ |
-// dy/dp dy/dq [ * | 0 0 | 1 0 0 ] --- q[0]
-// [ * | 0 0 | 0 1 0 ] --- q[1]
-// [ * | 0 0 | 0 0 1 ] --- q[2]
-// --+--
-// |
-// Dual components for q --------------+
-//
-// where the 4x2 submatrix (marked with ".") and 4x3 submatrix (marked with "+"
-// of y in the above diagram are the derivatives of y with respect to p and q
-// respectively. This is how autodiff works for functors taking multiple vector
-// valued arguments (up to 6).
-//
-// Jacobian NULL pointers
-// ----------------------
-// In general, the functions below will accept NULL pointers for all or some of
-// the Jacobian parameters, meaning that those Jacobians will not be computed.
-
-#ifndef CERES_PUBLIC_INTERNAL_AUTODIFF_H_
-#define CERES_PUBLIC_INTERNAL_AUTODIFF_H_
-
-#include <stddef.h>
-
-#include "ceres/jet.h"
-#include "ceres/internal/eigen.h"
-#include "ceres/internal/fixed_array.h"
-#include "ceres/internal/variadic_evaluate.h"
-#include "glog/logging.h"
-
-namespace ceres {
-namespace internal {
-
-// Extends src by a 1st order pertubation for every dimension and puts it in
-// dst. The size of src is N. Since this is also used for perturbations in
-// blocked arrays, offset is used to shift which part of the jet the
-// perturbation occurs. This is used to set up the extended x augmented by an
-// identity matrix. The JetT type should be a Jet type, and T should be a
-// numeric type (e.g. double). For example,
-//
-// 0 1 2 3 4 5 6 7 8
-// dst[0] [ * | . . | 1 0 0 | . . . ]
-// dst[1] [ * | . . | 0 1 0 | . . . ]
-// dst[2] [ * | . . | 0 0 1 | . . . ]
-//
-// is what would get put in dst if N was 3, offset was 3, and the jet type JetT
-// was 8-dimensional.
-template <typename JetT, typename T, int N>
-inline void Make1stOrderPerturbation(int offset, const T* src, JetT* dst) {
- DCHECK(src);
- DCHECK(dst);
- for (int j = 0; j < N; ++j) {
- dst[j].a = src[j];
- dst[j].v.setZero();
- dst[j].v[offset + j] = T(1.0);
- }
-}
-
-// Takes the 0th order part of src, assumed to be a Jet type, and puts it in
-// dst. This is used to pick out the "vector" part of the extended y.
-template <typename JetT, typename T>
-inline void Take0thOrderPart(int M, const JetT *src, T dst) {
- DCHECK(src);
- for (int i = 0; i < M; ++i) {
- dst[i] = src[i].a;
- }
-}
-
-// Takes N 1st order parts, starting at index N0, and puts them in the M x N
-// matrix 'dst'. This is used to pick out the "matrix" parts of the extended y.
-template <typename JetT, typename T, int N0, int N>
-inline void Take1stOrderPart(const int M, const JetT *src, T *dst) {
- DCHECK(src);
- DCHECK(dst);
- for (int i = 0; i < M; ++i) {
- Eigen::Map<Eigen::Matrix<T, N, 1> >(dst + N * i, N) =
- src[i].v.template segment<N>(N0);
- }
-}
-
-// This is in a struct because default template parameters on a
-// function are not supported in C++03 (though it is available in
-// C++0x). N0 through N5 are the dimension of the input arguments to
-// the user supplied functor.
-template <typename Functor, typename T,
- int N0 = 0, int N1 = 0, int N2 = 0, int N3 = 0, int N4 = 0,
- int N5 = 0, int N6 = 0, int N7 = 0, int N8 = 0, int N9 = 0>
-struct AutoDiff {
- static bool Differentiate(const Functor& functor,
- T const *const *parameters,
- int num_outputs,
- T *function_value,
- T **jacobians) {
- // This block breaks the 80 column rule to keep it somewhat readable.
- DCHECK_GT(num_outputs, 0);
- DCHECK((!N1 && !N2 && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && !N2 && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && (N8 > 0) && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && (N8 > 0) && (N9 > 0)))
- << "Zero block cannot precede a non-zero block. Block sizes are "
- << "(ignore trailing 0s): " << N0 << ", " << N1 << ", " << N2 << ", "
- << N3 << ", " << N4 << ", " << N5 << ", " << N6 << ", " << N7 << ", "
- << N8 << ", " << N9;
-
- typedef Jet<T, N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9> JetT;
- FixedArray<JetT, (256 * 7) / sizeof(JetT)> x(
- N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9 + num_outputs);
-
- // These are the positions of the respective jets in the fixed array x.
- const int jet0 = 0;
- const int jet1 = N0;
- const int jet2 = N0 + N1;
- const int jet3 = N0 + N1 + N2;
- const int jet4 = N0 + N1 + N2 + N3;
- const int jet5 = N0 + N1 + N2 + N3 + N4;
- const int jet6 = N0 + N1 + N2 + N3 + N4 + N5;
- const int jet7 = N0 + N1 + N2 + N3 + N4 + N5 + N6;
- const int jet8 = N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7;
- const int jet9 = N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8;
-
- const JetT *unpacked_parameters[10] = {
- x.get() + jet0,
- x.get() + jet1,
- x.get() + jet2,
- x.get() + jet3,
- x.get() + jet4,
- x.get() + jet5,
- x.get() + jet6,
- x.get() + jet7,
- x.get() + jet8,
- x.get() + jet9,
- };
-
- JetT* output = x.get() + N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9;
-
-#define CERES_MAKE_1ST_ORDER_PERTURBATION(i) \
- if (N ## i) { \
- internal::Make1stOrderPerturbation<JetT, T, N ## i>( \
- jet ## i, \
- parameters[i], \
- x.get() + jet ## i); \
- }
- CERES_MAKE_1ST_ORDER_PERTURBATION(0);
- CERES_MAKE_1ST_ORDER_PERTURBATION(1);
- CERES_MAKE_1ST_ORDER_PERTURBATION(2);
- CERES_MAKE_1ST_ORDER_PERTURBATION(3);
- CERES_MAKE_1ST_ORDER_PERTURBATION(4);
- CERES_MAKE_1ST_ORDER_PERTURBATION(5);
- CERES_MAKE_1ST_ORDER_PERTURBATION(6);
- CERES_MAKE_1ST_ORDER_PERTURBATION(7);
- CERES_MAKE_1ST_ORDER_PERTURBATION(8);
- CERES_MAKE_1ST_ORDER_PERTURBATION(9);
-#undef CERES_MAKE_1ST_ORDER_PERTURBATION
-
- if (!VariadicEvaluate<Functor, JetT,
- N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Call(
- functor, unpacked_parameters, output)) {
- return false;
- }
-
- internal::Take0thOrderPart(num_outputs, output, function_value);
-
-#define CERES_TAKE_1ST_ORDER_PERTURBATION(i) \
- if (N ## i) { \
- if (jacobians[i]) { \
- internal::Take1stOrderPart<JetT, T, \
- jet ## i, \
- N ## i>(num_outputs, \
- output, \
- jacobians[i]); \
- } \
- }
- CERES_TAKE_1ST_ORDER_PERTURBATION(0);
- CERES_TAKE_1ST_ORDER_PERTURBATION(1);
- CERES_TAKE_1ST_ORDER_PERTURBATION(2);
- CERES_TAKE_1ST_ORDER_PERTURBATION(3);
- CERES_TAKE_1ST_ORDER_PERTURBATION(4);
- CERES_TAKE_1ST_ORDER_PERTURBATION(5);
- CERES_TAKE_1ST_ORDER_PERTURBATION(6);
- CERES_TAKE_1ST_ORDER_PERTURBATION(7);
- CERES_TAKE_1ST_ORDER_PERTURBATION(8);
- CERES_TAKE_1ST_ORDER_PERTURBATION(9);
-#undef CERES_TAKE_1ST_ORDER_PERTURBATION
- return true;
- }
-};
-
-} // namespace internal
-} // namespace ceres
-
-#endif // CERES_PUBLIC_INTERNAL_AUTODIFF_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/disable_warnings.h b/extern/libmv/third_party/ceres/include/ceres/internal/disable_warnings.h
deleted file mode 100644
index 78924de1346..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/disable_warnings.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// This file has the sole purpose to silence warnings when including Ceres.
-
-// This is not your usual header guard. The macro CERES_WARNINGS_DISABLED
-// shows up again in reenable_warnings.h.
-#ifndef CERES_WARNINGS_DISABLED
-#define CERES_WARNINGS_DISABLED
-
-#ifdef _MSC_VER
-#pragma warning( push )
-// Disable the warning C4251 which is trigerred by stl classes in
-// Ceres' public interface. To quote MSDN: "C4251 can be ignored "
-// "if you are deriving from a type in the Standard C++ Library"
-#pragma warning( disable : 4251 )
-#endif
-
-#endif // CERES_WARNINGS_DISABLED
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/eigen.h b/extern/libmv/third_party/ceres/include/ceres/internal/eigen.h
deleted file mode 100644
index 85df54b8f99..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/eigen.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_INTERNAL_EIGEN_H_
-#define CERES_INTERNAL_EIGEN_H_
-
-#include "Eigen/Core"
-
-namespace ceres {
-
-typedef Eigen::Matrix<double, Eigen::Dynamic, 1> Vector;
-typedef Eigen::Matrix<double,
- Eigen::Dynamic,
- Eigen::Dynamic,
- Eigen::RowMajor> Matrix;
-typedef Eigen::Map<Vector> VectorRef;
-typedef Eigen::Map<Matrix> MatrixRef;
-typedef Eigen::Map<const Vector> ConstVectorRef;
-typedef Eigen::Map<const Matrix> ConstMatrixRef;
-
-// Column major matrices for DenseSparseMatrix/DenseQRSolver
-typedef Eigen::Matrix<double,
- Eigen::Dynamic,
- Eigen::Dynamic,
- Eigen::ColMajor> ColMajorMatrix;
-
-typedef Eigen::Map<ColMajorMatrix, 0,
- Eigen::Stride<Eigen::Dynamic, 1> > ColMajorMatrixRef;
-
-typedef Eigen::Map<const ColMajorMatrix,
- 0,
- Eigen::Stride<Eigen::Dynamic, 1> > ConstColMajorMatrixRef;
-
-
-
-// C++ does not support templated typdefs, thus the need for this
-// struct so that we can support statically sized Matrix and Maps.
-template <int num_rows = Eigen::Dynamic, int num_cols = Eigen::Dynamic>
-struct EigenTypes {
- typedef Eigen::Matrix <double, num_rows, num_cols, Eigen::RowMajor>
- Matrix;
-
- typedef Eigen::Map<
- Eigen::Matrix<double, num_rows, num_cols, Eigen::RowMajor> >
- MatrixRef;
-
- typedef Eigen::Matrix <double, num_rows, 1>
- Vector;
-
- typedef Eigen::Map <
- Eigen::Matrix<double, num_rows, 1> >
- VectorRef;
-
-
- typedef Eigen::Map<
- const Eigen::Matrix<double, num_rows, num_cols, Eigen::RowMajor> >
- ConstMatrixRef;
-
- typedef Eigen::Map <
- const Eigen::Matrix<double, num_rows, 1> >
- ConstVectorRef;
-};
-
-} // namespace ceres
-
-#endif // CERES_INTERNAL_EIGEN_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/fixed_array.h b/extern/libmv/third_party/ceres/include/ceres/internal/fixed_array.h
deleted file mode 100644
index 694070b228c..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/fixed_array.h
+++ /dev/null
@@ -1,191 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: rennie@google.com (Jeffrey Rennie)
-// Author: sanjay@google.com (Sanjay Ghemawat) -- renamed to FixedArray
-
-#ifndef CERES_PUBLIC_INTERNAL_FIXED_ARRAY_H_
-#define CERES_PUBLIC_INTERNAL_FIXED_ARRAY_H_
-
-#include <cstddef>
-#include "Eigen/Core"
-#include "ceres/internal/macros.h"
-#include "ceres/internal/manual_constructor.h"
-#include "glog/logging.h"
-
-namespace ceres {
-namespace internal {
-
-// A FixedArray<T> represents a non-resizable array of T where the
-// length of the array does not need to be a compile time constant.
-//
-// FixedArray allocates small arrays inline, and large arrays on
-// the heap. It is a good replacement for non-standard and deprecated
-// uses of alloca() and variable length arrays (a GCC extension).
-//
-// FixedArray keeps performance fast for small arrays, because it
-// avoids heap operations. It also helps reduce the chances of
-// accidentally overflowing your stack if large input is passed to
-// your function.
-//
-// Also, FixedArray is useful for writing portable code. Not all
-// compilers support arrays of dynamic size.
-
-// Most users should not specify an inline_elements argument and let
-// FixedArray<> automatically determine the number of elements
-// to store inline based on sizeof(T).
-//
-// If inline_elements is specified, the FixedArray<> implementation
-// will store arrays of length <= inline_elements inline.
-//
-// Finally note that unlike vector<T> FixedArray<T> will not zero-initialize
-// simple types like int, double, bool, etc.
-//
-// Non-POD types will be default-initialized just like regular vectors or
-// arrays.
-
-#if defined(_WIN64)
- typedef __int64 ssize_t;
-#elif defined(_WIN32)
- typedef __int32 ssize_t;
-#endif
-
-template <typename T, ssize_t inline_elements = -1>
-class FixedArray {
- public:
- // For playing nicely with stl:
- typedef T value_type;
- typedef T* iterator;
- typedef T const* const_iterator;
- typedef T& reference;
- typedef T const& const_reference;
- typedef T* pointer;
- typedef std::ptrdiff_t difference_type;
- typedef size_t size_type;
-
- // REQUIRES: n >= 0
- // Creates an array object that can store "n" elements.
- //
- // FixedArray<T> will not zero-initialiaze POD (simple) types like int,
- // double, bool, etc.
- // Non-POD types will be default-initialized just like regular vectors or
- // arrays.
- explicit FixedArray(size_type n);
-
- // Releases any resources.
- ~FixedArray();
-
- // Returns the length of the array.
- inline size_type size() const { return size_; }
-
- // Returns the memory size of the array in bytes.
- inline size_t memsize() const { return size_ * sizeof(T); }
-
- // Returns a pointer to the underlying element array.
- inline const T* get() const { return &array_[0].element; }
- inline T* get() { return &array_[0].element; }
-
- // REQUIRES: 0 <= i < size()
- // Returns a reference to the "i"th element.
- inline T& operator[](size_type i) {
- DCHECK_LT(i, size_);
- return array_[i].element;
- }
-
- // REQUIRES: 0 <= i < size()
- // Returns a reference to the "i"th element.
- inline const T& operator[](size_type i) const {
- DCHECK_LT(i, size_);
- return array_[i].element;
- }
-
- inline iterator begin() { return &array_[0].element; }
- inline iterator end() { return &array_[size_].element; }
-
- inline const_iterator begin() const { return &array_[0].element; }
- inline const_iterator end() const { return &array_[size_].element; }
-
- private:
- // Container to hold elements of type T. This is necessary to handle
- // the case where T is a a (C-style) array. The size of InnerContainer
- // and T must be the same, otherwise callers' assumptions about use
- // of this code will be broken.
- struct InnerContainer {
- T element;
- };
-
- // How many elements should we store inline?
- // a. If not specified, use a default of 256 bytes (256 bytes
- // seems small enough to not cause stack overflow or unnecessary
- // stack pollution, while still allowing stack allocation for
- // reasonably long character arrays.
- // b. Never use 0 length arrays (not ISO C++)
- static const size_type S1 = ((inline_elements < 0)
- ? (256/sizeof(T)) : inline_elements);
- static const size_type S2 = (S1 <= 0) ? 1 : S1;
- static const size_type kInlineElements = S2;
-
- size_type const size_;
- InnerContainer* const array_;
-
- // Allocate some space, not an array of elements of type T, so that we can
- // skip calling the T constructors and destructors for space we never use.
- ManualConstructor<InnerContainer> inline_space_[kInlineElements];
-};
-
-// Implementation details follow
-
-template <class T, ssize_t S>
-inline FixedArray<T, S>::FixedArray(typename FixedArray<T, S>::size_type n)
- : size_(n),
- array_((n <= kInlineElements
- ? reinterpret_cast<InnerContainer*>(inline_space_)
- : new InnerContainer[n])) {
- // Construct only the elements actually used.
- if (array_ == reinterpret_cast<InnerContainer*>(inline_space_)) {
- for (size_t i = 0; i != size_; ++i) {
- inline_space_[i].Init();
- }
- }
-}
-
-template <class T, ssize_t S>
-inline FixedArray<T, S>::~FixedArray() {
- if (array_ != reinterpret_cast<InnerContainer*>(inline_space_)) {
- delete[] array_;
- } else {
- for (size_t i = 0; i != size_; ++i) {
- inline_space_[i].Destroy();
- }
- }
-}
-
-} // namespace internal
-} // namespace ceres
-
-#endif // CERES_PUBLIC_INTERNAL_FIXED_ARRAY_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/macros.h b/extern/libmv/third_party/ceres/include/ceres/internal/macros.h
deleted file mode 100644
index 1ed55be6e03..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/macros.h
+++ /dev/null
@@ -1,170 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-//
-// Various Google-specific macros.
-//
-// This code is compiled directly on many platforms, including client
-// platforms like Windows, Mac, and embedded systems. Before making
-// any changes here, make sure that you're not breaking any platforms.
-
-#ifndef CERES_PUBLIC_INTERNAL_MACROS_H_
-#define CERES_PUBLIC_INTERNAL_MACROS_H_
-
-#include <cstddef> // For size_t.
-
-// A macro to disallow the copy constructor and operator= functions
-// This should be used in the private: declarations for a class
-//
-// For disallowing only assign or copy, write the code directly, but declare
-// the intend in a comment, for example:
-//
-// void operator=(const TypeName&); // _DISALLOW_ASSIGN
-
-// Note, that most uses of CERES_DISALLOW_ASSIGN and CERES_DISALLOW_COPY
-// are broken semantically, one should either use disallow both or
-// neither. Try to avoid these in new code.
-#define CERES_DISALLOW_COPY_AND_ASSIGN(TypeName) \
- TypeName(const TypeName&); \
- void operator=(const TypeName&)
-
-// A macro to disallow all the implicit constructors, namely the
-// default constructor, copy constructor and operator= functions.
-//
-// This should be used in the private: declarations for a class
-// that wants to prevent anyone from instantiating it. This is
-// especially useful for classes containing only static methods.
-#define CERES_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
- TypeName(); \
- CERES_DISALLOW_COPY_AND_ASSIGN(TypeName)
-
-// The arraysize(arr) macro returns the # of elements in an array arr.
-// The expression is a compile-time constant, and therefore can be
-// used in defining new arrays, for example. If you use arraysize on
-// a pointer by mistake, you will get a compile-time error.
-//
-// One caveat is that arraysize() doesn't accept any array of an
-// anonymous type or a type defined inside a function. In these rare
-// cases, you have to use the unsafe ARRAYSIZE() macro below. This is
-// due to a limitation in C++'s template system. The limitation might
-// eventually be removed, but it hasn't happened yet.
-
-// This template function declaration is used in defining arraysize.
-// Note that the function doesn't need an implementation, as we only
-// use its type.
-template <typename T, size_t N>
-char (&ArraySizeHelper(T (&array)[N]))[N];
-
-// That gcc wants both of these prototypes seems mysterious. VC, for
-// its part, can't decide which to use (another mystery). Matching of
-// template overloads: the final frontier.
-#ifndef _WIN32
-template <typename T, size_t N>
-char (&ArraySizeHelper(const T (&array)[N]))[N];
-#endif
-
-#define arraysize(array) (sizeof(ArraySizeHelper(array)))
-
-// ARRAYSIZE performs essentially the same calculation as arraysize,
-// but can be used on anonymous types or types defined inside
-// functions. It's less safe than arraysize as it accepts some
-// (although not all) pointers. Therefore, you should use arraysize
-// whenever possible.
-//
-// The expression ARRAYSIZE(a) is a compile-time constant of type
-// size_t.
-//
-// ARRAYSIZE catches a few type errors. If you see a compiler error
-//
-// "warning: division by zero in ..."
-//
-// when using ARRAYSIZE, you are (wrongfully) giving it a pointer.
-// You should only use ARRAYSIZE on statically allocated arrays.
-//
-// The following comments are on the implementation details, and can
-// be ignored by the users.
-//
-// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in
-// the array) and sizeof(*(arr)) (the # of bytes in one array
-// element). If the former is divisible by the latter, perhaps arr is
-// indeed an array, in which case the division result is the # of
-// elements in the array. Otherwise, arr cannot possibly be an array,
-// and we generate a compiler error to prevent the code from
-// compiling.
-//
-// Since the size of bool is implementation-defined, we need to cast
-// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final
-// result has type size_t.
-//
-// This macro is not perfect as it wrongfully accepts certain
-// pointers, namely where the pointer size is divisible by the pointee
-// size. Since all our code has to go through a 32-bit compiler,
-// where a pointer is 4 bytes, this means all pointers to a type whose
-// size is 3 or greater than 4 will be (righteously) rejected.
-//
-// Kudos to Jorg Brown for this simple and elegant implementation.
-//
-// - wan 2005-11-16
-//
-// Starting with Visual C++ 2005, WinNT.h includes ARRAYSIZE. However,
-// the definition comes from the over-broad windows.h header that
-// introduces a macro, ERROR, that conflicts with the logging framework
-// that Ceres uses. Instead, rename ARRAYSIZE to CERES_ARRAYSIZE.
-#define CERES_ARRAYSIZE(a) \
- ((sizeof(a) / sizeof(*(a))) / \
- static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
-
-// Tell the compiler to warn about unused return values for functions
-// declared with this macro. The macro should be used on function
-// declarations following the argument list:
-//
-// Sprocket* AllocateSprocket() MUST_USE_RESULT;
-//
-#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \
- && !defined(COMPILER_ICC)
-#define CERES_MUST_USE_RESULT __attribute__ ((warn_unused_result))
-#else
-#define CERES_MUST_USE_RESULT
-#endif
-
-// Platform independent macros to get aligned memory allocations.
-// For example
-//
-// MyFoo my_foo CERES_ALIGN_ATTRIBUTE(16);
-//
-// Gives us an instance of MyFoo which is aligned at a 16 byte
-// boundary.
-#if defined(_MSC_VER)
-#define CERES_ALIGN_ATTRIBUTE(n) __declspec(align(n))
-#define CERES_ALIGN_OF(T) __alignof(T)
-#elif defined(__GNUC__)
-#define CERES_ALIGN_ATTRIBUTE(n) __attribute__((aligned(n)))
-#define CERES_ALIGN_OF(T) __alignof(T)
-#endif
-
-#endif // CERES_PUBLIC_INTERNAL_MACROS_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/manual_constructor.h b/extern/libmv/third_party/ceres/include/ceres/internal/manual_constructor.h
deleted file mode 100644
index 7ea723d2a83..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/manual_constructor.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: kenton@google.com (Kenton Varda)
-//
-// ManualConstructor statically-allocates space in which to store some
-// object, but does not initialize it. You can then call the constructor
-// and destructor for the object yourself as you see fit. This is useful
-// for memory management optimizations, where you want to initialize and
-// destroy an object multiple times but only allocate it once.
-//
-// (When I say ManualConstructor statically allocates space, I mean that
-// the ManualConstructor object itself is forced to be the right size.)
-
-#ifndef CERES_PUBLIC_INTERNAL_MANUAL_CONSTRUCTOR_H_
-#define CERES_PUBLIC_INTERNAL_MANUAL_CONSTRUCTOR_H_
-
-#include <new>
-
-namespace ceres {
-namespace internal {
-
-// ------- Define CERES_ALIGNED_CHAR_ARRAY --------------------------------
-
-#ifndef CERES_ALIGNED_CHAR_ARRAY
-
-// Because MSVC and older GCCs require that the argument to their alignment
-// construct to be a literal constant integer, we use a template instantiated
-// at all the possible powers of two.
-template<int alignment, int size> struct AlignType { };
-template<int size> struct AlignType<0, size> { typedef char result[size]; };
-
-#if !defined(CERES_ALIGN_ATTRIBUTE)
-#define CERES_ALIGNED_CHAR_ARRAY you_must_define_CERES_ALIGNED_CHAR_ARRAY_for_your_compiler
-#else // !defined(CERES_ALIGN_ATTRIBUTE)
-
-#define CERES_ALIGN_TYPE_TEMPLATE(X) \
- template<int size> struct AlignType<X, size> { \
- typedef CERES_ALIGN_ATTRIBUTE(X) char result[size]; \
- }
-
-CERES_ALIGN_TYPE_TEMPLATE(1);
-CERES_ALIGN_TYPE_TEMPLATE(2);
-CERES_ALIGN_TYPE_TEMPLATE(4);
-CERES_ALIGN_TYPE_TEMPLATE(8);
-CERES_ALIGN_TYPE_TEMPLATE(16);
-CERES_ALIGN_TYPE_TEMPLATE(32);
-CERES_ALIGN_TYPE_TEMPLATE(64);
-CERES_ALIGN_TYPE_TEMPLATE(128);
-CERES_ALIGN_TYPE_TEMPLATE(256);
-CERES_ALIGN_TYPE_TEMPLATE(512);
-CERES_ALIGN_TYPE_TEMPLATE(1024);
-CERES_ALIGN_TYPE_TEMPLATE(2048);
-CERES_ALIGN_TYPE_TEMPLATE(4096);
-CERES_ALIGN_TYPE_TEMPLATE(8192);
-// Any larger and MSVC++ will complain.
-
-#undef CERES_ALIGN_TYPE_TEMPLATE
-
-#define CERES_ALIGNED_CHAR_ARRAY(T, Size) \
- typename AlignType<CERES_ALIGN_OF(T), sizeof(T) * Size>::result
-
-#endif // !defined(CERES_ALIGN_ATTRIBUTE)
-
-#endif // CERES_ALIGNED_CHAR_ARRAY
-
-template <typename Type>
-class ManualConstructor {
- public:
- // No constructor or destructor because one of the most useful uses of
- // this class is as part of a union, and members of a union cannot have
- // constructors or destructors. And, anyway, the whole point of this
- // class is to bypass these.
-
- inline Type* get() {
- return reinterpret_cast<Type*>(space_);
- }
- inline const Type* get() const {
- return reinterpret_cast<const Type*>(space_);
- }
-
- inline Type* operator->() { return get(); }
- inline const Type* operator->() const { return get(); }
-
- inline Type& operator*() { return *get(); }
- inline const Type& operator*() const { return *get(); }
-
- // This is needed to get around the strict aliasing warning GCC generates.
- inline void* space() {
- return reinterpret_cast<void*>(space_);
- }
-
- // You can pass up to four constructor arguments as arguments of Init().
- inline void Init() {
- new(space()) Type;
- }
-
- template <typename T1>
- inline void Init(const T1& p1) {
- new(space()) Type(p1);
- }
-
- template <typename T1, typename T2>
- inline void Init(const T1& p1, const T2& p2) {
- new(space()) Type(p1, p2);
- }
-
- template <typename T1, typename T2, typename T3>
- inline void Init(const T1& p1, const T2& p2, const T3& p3) {
- new(space()) Type(p1, p2, p3);
- }
-
- template <typename T1, typename T2, typename T3, typename T4>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4) {
- new(space()) Type(p1, p2, p3, p4);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5) {
- new(space()) Type(p1, p2, p3, p4, p5);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5, const T6& p6) {
- new(space()) Type(p1, p2, p3, p4, p5, p6);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5, const T6& p6, const T7& p7) {
- new(space()) Type(p1, p2, p3, p4, p5, p6, p7);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5, const T6& p6, const T7& p7, const T8& p8) {
- new(space()) Type(p1, p2, p3, p4, p5, p6, p7, p8);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5, const T6& p6, const T7& p7, const T8& p8,
- const T9& p9) {
- new(space()) Type(p1, p2, p3, p4, p5, p6, p7, p8, p9);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5, const T6& p6, const T7& p7, const T8& p8,
- const T9& p9, const T10& p10) {
- new(space()) Type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
- }
-
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
- inline void Init(const T1& p1, const T2& p2, const T3& p3, const T4& p4,
- const T5& p5, const T6& p6, const T7& p7, const T8& p8,
- const T9& p9, const T10& p10, const T11& p11) {
- new(space()) Type(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
- }
-
- inline void Destroy() {
- get()->~Type();
- }
-
- private:
- CERES_ALIGNED_CHAR_ARRAY(Type, 1) space_;
-};
-
-#undef CERES_ALIGNED_CHAR_ARRAY
-
-} // namespace internal
-} // namespace ceres
-
-#endif // CERES_PUBLIC_INTERNAL_MANUAL_CONSTRUCTOR_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/numeric_diff.h b/extern/libmv/third_party/ceres/include/ceres/internal/numeric_diff.h
deleted file mode 100644
index 3b264b45af3..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/numeric_diff.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-// mierle@gmail.com (Keir Mierle)
-//
-// Finite differencing routine used by NumericDiffCostFunction.
-
-#ifndef CERES_PUBLIC_INTERNAL_NUMERIC_DIFF_H_
-#define CERES_PUBLIC_INTERNAL_NUMERIC_DIFF_H_
-
-#include <cstring>
-
-#include "Eigen/Dense"
-#include "ceres/cost_function.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/internal/variadic_evaluate.h"
-#include "ceres/types.h"
-#include "glog/logging.h"
-
-
-namespace ceres {
-namespace internal {
-
-// Helper templates that allow evaluation of a variadic functor or a
-// CostFunction object.
-template <typename CostFunctor,
- int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7, int N8, int N9 >
-bool EvaluateImpl(const CostFunctor* functor,
- double const* const* parameters,
- double* residuals,
- const void* /* NOT USED */) {
- return VariadicEvaluate<CostFunctor,
- double,
- N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Call(
- *functor,
- parameters,
- residuals);
-}
-
-template <typename CostFunctor,
- int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7, int N8, int N9 >
-bool EvaluateImpl(const CostFunctor* functor,
- double const* const* parameters,
- double* residuals,
- const CostFunction* /* NOT USED */) {
- return functor->Evaluate(parameters, residuals, NULL);
-}
-
-// This is split from the main class because C++ doesn't allow partial template
-// specializations for member functions. The alternative is to repeat the main
-// class for differing numbers of parameters, which is also unfortunate.
-template <typename CostFunctor,
- NumericDiffMethod kMethod,
- int kNumResiduals,
- int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7, int N8, int N9,
- int kParameterBlock,
- int kParameterBlockSize>
-struct NumericDiff {
- // Mutates parameters but must restore them before return.
- static bool EvaluateJacobianForParameterBlock(
- const CostFunctor* functor,
- double const* residuals_at_eval_point,
- const double relative_step_size,
- int num_residuals,
- double **parameters,
- double *jacobian) {
- using Eigen::Map;
- using Eigen::Matrix;
- using Eigen::RowMajor;
- using Eigen::ColMajor;
-
- const int NUM_RESIDUALS =
- (kNumResiduals != ceres::DYNAMIC ? kNumResiduals : num_residuals);
-
- typedef Matrix<double, kNumResiduals, 1> ResidualVector;
- typedef Matrix<double, kParameterBlockSize, 1> ParameterVector;
-
- // The convoluted reasoning for choosing the Row/Column major
- // ordering of the matrix is an artifact of the restrictions in
- // Eigen that prevent it from creating RowMajor matrices with a
- // single column. In these cases, we ask for a ColMajor matrix.
- typedef Matrix<double,
- kNumResiduals,
- kParameterBlockSize,
- (kParameterBlockSize == 1) ? ColMajor : RowMajor>
- JacobianMatrix;
-
- Map<JacobianMatrix> parameter_jacobian(jacobian,
- NUM_RESIDUALS,
- kParameterBlockSize);
-
- // Mutate 1 element at a time and then restore.
- Map<ParameterVector> x_plus_delta(parameters[kParameterBlock],
- kParameterBlockSize);
- ParameterVector x(x_plus_delta);
- ParameterVector step_size = x.array().abs() * relative_step_size;
-
- // To handle cases where a parameter is exactly zero, instead use
- // the mean step_size for the other dimensions. If all the
- // parameters are zero, there's no good answer. Take
- // relative_step_size as a guess and hope for the best.
- const double fallback_step_size =
- (step_size.sum() == 0)
- ? relative_step_size
- : step_size.sum() / step_size.rows();
-
- // For each parameter in the parameter block, use finite differences to
- // compute the derivative for that parameter.
-
- ResidualVector residuals(NUM_RESIDUALS);
- for (int j = 0; j < kParameterBlockSize; ++j) {
- const double delta =
- (step_size(j) == 0.0) ? fallback_step_size : step_size(j);
-
- x_plus_delta(j) = x(j) + delta;
-
- if (!EvaluateImpl<CostFunctor, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>(
- functor, parameters, residuals.data(), functor)) {
- return false;
- }
-
- // Compute this column of the jacobian in 3 steps:
- // 1. Store residuals for the forward part.
- // 2. Subtract residuals for the backward (or 0) part.
- // 3. Divide out the run.
- parameter_jacobian.col(j) = residuals;
-
- double one_over_delta = 1.0 / delta;
- if (kMethod == CENTRAL) {
- // Compute the function on the other side of x(j).
- x_plus_delta(j) = x(j) - delta;
-
- if (!EvaluateImpl<CostFunctor, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>(
- functor, parameters, residuals.data(), functor)) {
- return false;
- }
-
- parameter_jacobian.col(j) -= residuals;
- one_over_delta /= 2;
- } else {
- // Forward difference only; reuse existing residuals evaluation.
- parameter_jacobian.col(j) -=
- Map<const ResidualVector>(residuals_at_eval_point, NUM_RESIDUALS);
- }
- x_plus_delta(j) = x(j); // Restore x_plus_delta.
-
- // Divide out the run to get slope.
- parameter_jacobian.col(j) *= one_over_delta;
- }
- return true;
- }
-};
-
-template <typename CostFunctor,
- NumericDiffMethod kMethod,
- int kNumResiduals,
- int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7, int N8, int N9,
- int kParameterBlock>
-struct NumericDiff<CostFunctor, kMethod, kNumResiduals,
- N0, N1, N2, N3, N4, N5, N6, N7, N8, N9,
- kParameterBlock, 0> {
- // Mutates parameters but must restore them before return.
- static bool EvaluateJacobianForParameterBlock(
- const CostFunctor* functor,
- double const* residuals_at_eval_point,
- const double relative_step_size,
- const int num_residuals,
- double **parameters,
- double *jacobian) {
- LOG(FATAL) << "Control should never reach here.";
- return true;
- }
-};
-
-} // namespace internal
-} // namespace ceres
-
-#endif // CERES_PUBLIC_INTERNAL_NUMERIC_DIFF_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/port.h b/extern/libmv/third_party/ceres/include/ceres/internal/port.h
deleted file mode 100644
index e38eb713aa8..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/port.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-
-#ifndef CERES_PUBLIC_INTERNAL_PORT_H_
-#define CERES_PUBLIC_INTERNAL_PORT_H_
-
-// This file needs to compile as c code.
-#ifdef __cplusplus
-
-#include <string>
-
-#include "ceres/internal/config.h"
-
-#if defined(CERES_TR1_MEMORY_HEADER)
-#include <tr1/memory>
-#else
-#include <memory>
-#endif
-
-namespace ceres {
-
-// It is unfortunate that this import of the entire standard namespace is
-// necessary. The reasons are historical and won't be explained here, but
-// suffice to say it is not a mistake and can't be removed without breaking
-// things outside of the Ceres optimization package.
-using namespace std;
-
-// This is necessary to properly handle the case that there is a different
-// "string" implementation in the global namespace.
-using std::string;
-
-#if defined(CERES_TR1_SHARED_PTR)
-using std::tr1::shared_ptr;
-#else
-using std::shared_ptr;
-#endif
-
-} // namespace ceres
-
-#endif // __cplusplus
-
-// A macro to signal which functions and classes are exported when
-// building a DLL with MSVC.
-//
-// Note that the ordering here is important, CERES_BUILDING_SHARED_LIBRARY
-// is only defined locally when Ceres is compiled, it is never exported to
-// users. However, in order that we do not have to configure config.h
-// separately for building vs installing, if we are using MSVC and building
-// a shared library, then both CERES_BUILDING_SHARED_LIBRARY and
-// CERES_USING_SHARED_LIBRARY will be defined when Ceres is compiled.
-// Hence it is important that the check for CERES_BUILDING_SHARED_LIBRARY
-// happens first.
-#if defined(_MSC_VER) && defined(CERES_BUILDING_SHARED_LIBRARY)
-# define CERES_EXPORT __declspec(dllexport)
-#elif defined(_MSC_VER) && defined(CERES_USING_SHARED_LIBRARY)
-# define CERES_EXPORT __declspec(dllimport)
-#else
-# define CERES_EXPORT
-#endif
-
-#endif // CERES_PUBLIC_INTERNAL_PORT_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/reenable_warnings.h b/extern/libmv/third_party/ceres/include/ceres/internal/reenable_warnings.h
deleted file mode 100644
index 1f477d8d2ac..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/reenable_warnings.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-
-// This is not your usual header guard. See disable_warnings.h
-#ifdef CERES_WARNINGS_DISABLED
-#undef CERES_WARNINGS_DISABLED
-
-#ifdef _MSC_VER
-#pragma warning( pop )
-#endif
-
-#endif // CERES_WARNINGS_DISABLED
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/scoped_ptr.h b/extern/libmv/third_party/ceres/include/ceres/internal/scoped_ptr.h
deleted file mode 100644
index 5dfb551243c..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/scoped_ptr.h
+++ /dev/null
@@ -1,310 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: jorg@google.com (Jorg Brown)
-//
-// This is an implementation designed to match the anticipated future TR2
-// implementation of the scoped_ptr class, and its closely-related brethren,
-// scoped_array, scoped_ptr_malloc, and make_scoped_ptr.
-
-#ifndef CERES_PUBLIC_INTERNAL_SCOPED_PTR_H_
-#define CERES_PUBLIC_INTERNAL_SCOPED_PTR_H_
-
-#include <assert.h>
-#include <stdlib.h>
-#include <cstddef>
-#include <algorithm>
-
-namespace ceres {
-namespace internal {
-
-template <class C> class scoped_ptr;
-template <class C, class Free> class scoped_ptr_malloc;
-template <class C> class scoped_array;
-
-template <class C>
-scoped_ptr<C> make_scoped_ptr(C *);
-
-// A scoped_ptr<T> is like a T*, except that the destructor of
-// scoped_ptr<T> automatically deletes the pointer it holds (if
-// any). That is, scoped_ptr<T> owns the T object that it points
-// to. Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to
-// a T object. Also like T*, scoped_ptr<T> is thread-compatible, and
-// once you dereference it, you get the threadsafety guarantees of T.
-//
-// The size of a scoped_ptr is small: sizeof(scoped_ptr<C>) == sizeof(C*)
-template <class C>
-class scoped_ptr {
- public:
- // The element type
- typedef C element_type;
-
- // Constructor. Defaults to intializing with NULL.
- // There is no way to create an uninitialized scoped_ptr.
- // The input parameter must be allocated with new.
- explicit scoped_ptr(C* p = NULL) : ptr_(p) { }
-
- // Destructor. If there is a C object, delete it.
- // We don't need to test ptr_ == NULL because C++ does that for us.
- ~scoped_ptr() {
- enum { type_must_be_complete = sizeof(C) };
- delete ptr_;
- }
-
- // Reset. Deletes the current owned object, if any.
- // Then takes ownership of a new object, if given.
- // this->reset(this->get()) works.
- void reset(C* p = NULL) {
- if (p != ptr_) {
- enum { type_must_be_complete = sizeof(C) };
- delete ptr_;
- ptr_ = p;
- }
- }
-
- // Accessors to get the owned object.
- // operator* and operator-> will assert() if there is no current object.
- C& operator*() const {
- assert(ptr_ != NULL);
- return *ptr_;
- }
- C* operator->() const {
- assert(ptr_ != NULL);
- return ptr_;
- }
- C* get() const { return ptr_; }
-
- // Comparison operators.
- // These return whether a scoped_ptr and a raw pointer refer to
- // the same object, not just to two different but equal objects.
- bool operator==(const C* p) const { return ptr_ == p; }
- bool operator!=(const C* p) const { return ptr_ != p; }
-
- // Swap two scoped pointers.
- void swap(scoped_ptr& p2) {
- C* tmp = ptr_;
- ptr_ = p2.ptr_;
- p2.ptr_ = tmp;
- }
-
- // Release a pointer.
- // The return value is the current pointer held by this object.
- // If this object holds a NULL pointer, the return value is NULL.
- // After this operation, this object will hold a NULL pointer,
- // and will not own the object any more.
- C* release() {
- C* retVal = ptr_;
- ptr_ = NULL;
- return retVal;
- }
-
- private:
- C* ptr_;
-
- // google3 friend class that can access copy ctor (although if it actually
- // calls a copy ctor, there will be a problem) see below
- friend scoped_ptr<C> make_scoped_ptr<C>(C *p);
-
- // Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't
- // make sense, and if C2 == C, it still doesn't make sense because you should
- // never have the same object owned by two different scoped_ptrs.
- template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
- template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
-
- // Disallow evil constructors
- scoped_ptr(const scoped_ptr&);
- void operator=(const scoped_ptr&);
-};
-
-// Free functions
-template <class C>
-inline void swap(scoped_ptr<C>& p1, scoped_ptr<C>& p2) {
- p1.swap(p2);
-}
-
-template <class C>
-inline bool operator==(const C* p1, const scoped_ptr<C>& p2) {
- return p1 == p2.get();
-}
-
-template <class C>
-inline bool operator==(const C* p1, const scoped_ptr<const C>& p2) {
- return p1 == p2.get();
-}
-
-template <class C>
-inline bool operator!=(const C* p1, const scoped_ptr<C>& p2) {
- return p1 != p2.get();
-}
-
-template <class C>
-inline bool operator!=(const C* p1, const scoped_ptr<const C>& p2) {
- return p1 != p2.get();
-}
-
-template <class C>
-scoped_ptr<C> make_scoped_ptr(C *p) {
- // This does nothing but to return a scoped_ptr of the type that the passed
- // pointer is of. (This eliminates the need to specify the name of T when
- // making a scoped_ptr that is used anonymously/temporarily.) From an
- // access control point of view, we construct an unnamed scoped_ptr here
- // which we return and thus copy-construct. Hence, we need to have access
- // to scoped_ptr::scoped_ptr(scoped_ptr const &). However, it is guaranteed
- // that we never actually call the copy constructor, which is a good thing
- // as we would call the temporary's object destructor (and thus delete p)
- // if we actually did copy some object, here.
- return scoped_ptr<C>(p);
-}
-
-// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate
-// with new [] and the destructor deletes objects with delete [].
-//
-// As with scoped_ptr<C>, a scoped_array<C> either points to an object
-// or is NULL. A scoped_array<C> owns the object that it points to.
-// scoped_array<T> is thread-compatible, and once you index into it,
-// the returned objects have only the threadsafety guarantees of T.
-//
-// Size: sizeof(scoped_array<C>) == sizeof(C*)
-template <class C>
-class scoped_array {
- public:
- // The element type
- typedef C element_type;
-
- // Constructor. Defaults to intializing with NULL.
- // There is no way to create an uninitialized scoped_array.
- // The input parameter must be allocated with new [].
- explicit scoped_array(C* p = NULL) : array_(p) { }
-
- // Destructor. If there is a C object, delete it.
- // We don't need to test ptr_ == NULL because C++ does that for us.
- ~scoped_array() {
- enum { type_must_be_complete = sizeof(C) };
- delete[] array_;
- }
-
- // Reset. Deletes the current owned object, if any.
- // Then takes ownership of a new object, if given.
- // this->reset(this->get()) works.
- void reset(C* p = NULL) {
- if (p != array_) {
- enum { type_must_be_complete = sizeof(C) };
- delete[] array_;
- array_ = p;
- }
- }
-
- // Get one element of the current object.
- // Will assert() if there is no current object, or index i is negative.
- C& operator[](std::ptrdiff_t i) const {
- assert(i >= 0);
- assert(array_ != NULL);
- return array_[i];
- }
-
- // Get a pointer to the zeroth element of the current object.
- // If there is no current object, return NULL.
- C* get() const {
- return array_;
- }
-
- // Comparison operators.
- // These return whether a scoped_array and a raw pointer refer to
- // the same array, not just to two different but equal arrays.
- bool operator==(const C* p) const { return array_ == p; }
- bool operator!=(const C* p) const { return array_ != p; }
-
- // Swap two scoped arrays.
- void swap(scoped_array& p2) {
- C* tmp = array_;
- array_ = p2.array_;
- p2.array_ = tmp;
- }
-
- // Release an array.
- // The return value is the current pointer held by this object.
- // If this object holds a NULL pointer, the return value is NULL.
- // After this operation, this object will hold a NULL pointer,
- // and will not own the object any more.
- C* release() {
- C* retVal = array_;
- array_ = NULL;
- return retVal;
- }
-
- private:
- C* array_;
-
- // Forbid comparison of different scoped_array types.
- template <class C2> bool operator==(scoped_array<C2> const& p2) const;
- template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
-
- // Disallow evil constructors
- scoped_array(const scoped_array&);
- void operator=(const scoped_array&);
-};
-
-// Free functions
-template <class C>
-inline void swap(scoped_array<C>& p1, scoped_array<C>& p2) {
- p1.swap(p2);
-}
-
-template <class C>
-inline bool operator==(const C* p1, const scoped_array<C>& p2) {
- return p1 == p2.get();
-}
-
-template <class C>
-inline bool operator==(const C* p1, const scoped_array<const C>& p2) {
- return p1 == p2.get();
-}
-
-template <class C>
-inline bool operator!=(const C* p1, const scoped_array<C>& p2) {
- return p1 != p2.get();
-}
-
-template <class C>
-inline bool operator!=(const C* p1, const scoped_array<const C>& p2) {
- return p1 != p2.get();
-}
-
-// This class wraps the c library function free() in a class that can be
-// passed as a template argument to scoped_ptr_malloc below.
-class ScopedPtrMallocFree {
- public:
- inline void operator()(void* x) const {
- free(x);
- }
-};
-
-} // namespace internal
-} // namespace ceres
-
-#endif // CERES_PUBLIC_INTERNAL_SCOPED_PTR_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/internal/variadic_evaluate.h b/extern/libmv/third_party/ceres/include/ceres/internal/variadic_evaluate.h
deleted file mode 100644
index 9a473d5b25c..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/internal/variadic_evaluate.h
+++ /dev/null
@@ -1,182 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-// mierle@gmail.com (Keir Mierle)
-
-#ifndef CERES_PUBLIC_INTERNAL_VARIADIC_EVALUATE_H_
-#define CERES_PUBLIC_INTERNAL_VARIADIC_EVALUATE_H_
-
-#include <stddef.h>
-
-#include "ceres/jet.h"
-#include "ceres/internal/eigen.h"
-#include "ceres/internal/fixed_array.h"
-#include "glog/logging.h"
-
-namespace ceres {
-namespace internal {
-
-// This block of quasi-repeated code calls the user-supplied functor, which may
-// take a variable number of arguments. This is accomplished by specializing the
-// struct based on the size of the trailing parameters; parameters with 0 size
-// are assumed missing.
-template<typename Functor, typename T, int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7, int N8, int N9>
-struct VariadicEvaluate {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- input[4],
- input[5],
- input[6],
- input[7],
- input[8],
- input[9],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7, int N8>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, N3, N4, N5, N6, N7, N8, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- input[4],
- input[5],
- input[6],
- input[7],
- input[8],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2, int N3, int N4,
- int N5, int N6, int N7>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, N3, N4, N5, N6, N7, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- input[4],
- input[5],
- input[6],
- input[7],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2, int N3, int N4,
- int N5, int N6>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, N3, N4, N5, N6, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- input[4],
- input[5],
- input[6],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2, int N3, int N4,
- int N5>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, N3, N4, N5, 0, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- input[4],
- input[5],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2, int N3, int N4>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, N3, N4, 0, 0, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- input[4],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2, int N3>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, N3, 0, 0, 0, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- input[3],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1, int N2>
-struct VariadicEvaluate<Functor, T, N0, N1, N2, 0, 0, 0, 0, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- input[2],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0, int N1>
-struct VariadicEvaluate<Functor, T, N0, N1, 0, 0, 0, 0, 0, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- input[1],
- output);
- }
-};
-
-template<typename Functor, typename T, int N0>
-struct VariadicEvaluate<Functor, T, N0, 0, 0, 0, 0, 0, 0, 0, 0, 0> {
- static bool Call(const Functor& functor, T const *const *input, T* output) {
- return functor(input[0],
- output);
- }
-};
-
-} // namespace internal
-} // namespace ceres
-
-#endif // CERES_PUBLIC_INTERNAL_VARIADIC_EVALUATE_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/iteration_callback.h b/extern/libmv/third_party/ceres/include/ceres/iteration_callback.h
deleted file mode 100644
index 237ada6e0c9..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/iteration_callback.h
+++ /dev/null
@@ -1,225 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// When an iteration callback is specified, Ceres calls the callback
-// after each minimizer step (if the minimizer has not converged) and
-// passes it an IterationSummary object, defined below.
-
-#ifndef CERES_PUBLIC_ITERATION_CALLBACK_H_
-#define CERES_PUBLIC_ITERATION_CALLBACK_H_
-
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// This struct describes the state of the optimizer after each
-// iteration of the minimization.
-struct CERES_EXPORT IterationSummary {
- IterationSummary()
- : iteration(0),
- step_is_valid(false),
- step_is_nonmonotonic(false),
- step_is_successful(false),
- cost(0.0),
- cost_change(0.0),
- gradient_max_norm(0.0),
- gradient_norm(0.0),
- step_norm(0.0),
- eta(0.0),
- step_size(0.0),
- line_search_function_evaluations(0),
- line_search_gradient_evaluations(0),
- line_search_iterations(0),
- linear_solver_iterations(0),
- iteration_time_in_seconds(0.0),
- step_solver_time_in_seconds(0.0),
- cumulative_time_in_seconds(0.0) {}
-
- // Current iteration number.
- int32 iteration;
-
- // Step was numerically valid, i.e., all values are finite and the
- // step reduces the value of the linearized model.
- //
- // Note: step_is_valid is false when iteration = 0.
- bool step_is_valid;
-
- // Step did not reduce the value of the objective function
- // sufficiently, but it was accepted because of the relaxed
- // acceptance criterion used by the non-monotonic trust region
- // algorithm.
- //
- // Note: step_is_nonmonotonic is false when iteration = 0;
- bool step_is_nonmonotonic;
-
- // Whether or not the minimizer accepted this step or not. If the
- // ordinary trust region algorithm is used, this means that the
- // relative reduction in the objective function value was greater
- // than Solver::Options::min_relative_decrease. However, if the
- // non-monotonic trust region algorithm is used
- // (Solver::Options:use_nonmonotonic_steps = true), then even if the
- // relative decrease is not sufficient, the algorithm may accept the
- // step and the step is declared successful.
- //
- // Note: step_is_successful is false when iteration = 0.
- bool step_is_successful;
-
- // Value of the objective function.
- double cost;
-
- // Change in the value of the objective function in this
- // iteration. This can be positive or negative.
- double cost_change;
-
- // Infinity norm of the gradient vector.
- double gradient_max_norm;
-
- // 2-norm of the gradient vector.
- double gradient_norm;
-
- // 2-norm of the size of the step computed by the optimization
- // algorithm.
- double step_norm;
-
- // For trust region algorithms, the ratio of the actual change in
- // cost and the change in the cost of the linearized approximation.
- double relative_decrease;
-
- // Size of the trust region at the end of the current iteration. For
- // the Levenberg-Marquardt algorithm, the regularization parameter
- // mu = 1.0 / trust_region_radius.
- double trust_region_radius;
-
- // For the inexact step Levenberg-Marquardt algorithm, this is the
- // relative accuracy with which the Newton(LM) step is solved. This
- // number affects only the iterative solvers capable of solving
- // linear systems inexactly. Factorization-based exact solvers
- // ignore it.
- double eta;
-
- // Step sized computed by the line search algorithm.
- double step_size;
-
- // Number of function value evaluations used by the line search algorithm.
- int line_search_function_evaluations;
-
- // Number of function gradient evaluations used by the line search algorithm.
- int line_search_gradient_evaluations;
-
- // Number of iterations taken by the line search algorithm.
- int line_search_iterations;
-
- // Number of iterations taken by the linear solver to solve for the
- // Newton step.
- int linear_solver_iterations;
-
- // All times reported below are wall times.
-
- // Time (in seconds) spent inside the minimizer loop in the current
- // iteration.
- double iteration_time_in_seconds;
-
- // Time (in seconds) spent inside the trust region step solver.
- double step_solver_time_in_seconds;
-
- // Time (in seconds) since the user called Solve().
- double cumulative_time_in_seconds;
-};
-
-// Interface for specifying callbacks that are executed at the end of
-// each iteration of the Minimizer. The solver uses the return value
-// of operator() to decide whether to continue solving or to
-// terminate. The user can return three values.
-//
-// SOLVER_ABORT indicates that the callback detected an abnormal
-// situation. The solver returns without updating the parameter blocks
-// (unless Solver::Options::update_state_every_iteration is set
-// true). Solver returns with Solver::Summary::termination_type set to
-// USER_ABORT.
-//
-// SOLVER_TERMINATE_SUCCESSFULLY indicates that there is no need to
-// optimize anymore (some user specified termination criterion has
-// been met). Solver returns with Solver::Summary::termination_type
-// set to USER_SUCCESS.
-//
-// SOLVER_CONTINUE indicates that the solver should continue
-// optimizing.
-//
-// For example, the following Callback is used internally by Ceres to
-// log the progress of the optimization.
-//
-// Callback for logging the state of the minimizer to STDERR or STDOUT
-// depending on the user's preferences and logging level.
-//
-// class LoggingCallback : public IterationCallback {
-// public:
-// explicit LoggingCallback(bool log_to_stdout)
-// : log_to_stdout_(log_to_stdout) {}
-//
-// ~LoggingCallback() {}
-//
-// CallbackReturnType operator()(const IterationSummary& summary) {
-// const char* kReportRowFormat =
-// "% 4d: f:% 8e d:% 3.2e g:% 3.2e h:% 3.2e "
-// "rho:% 3.2e mu:% 3.2e eta:% 3.2e li:% 3d";
-// string output = StringPrintf(kReportRowFormat,
-// summary.iteration,
-// summary.cost,
-// summary.cost_change,
-// summary.gradient_max_norm,
-// summary.step_norm,
-// summary.relative_decrease,
-// summary.trust_region_radius,
-// summary.eta,
-// summary.linear_solver_iterations);
-// if (log_to_stdout_) {
-// cout << output << endl;
-// } else {
-// VLOG(1) << output;
-// }
-// return SOLVER_CONTINUE;
-// }
-//
-// private:
-// const bool log_to_stdout_;
-// };
-//
-class CERES_EXPORT IterationCallback {
- public:
- virtual ~IterationCallback() {}
- virtual CallbackReturnType operator()(const IterationSummary& summary) = 0;
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_ITERATION_CALLBACK_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/jet.h b/extern/libmv/third_party/ceres/include/ceres/jet.h
deleted file mode 100644
index 74ce1e9dd53..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/jet.h
+++ /dev/null
@@ -1,670 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-//
-// A simple implementation of N-dimensional dual numbers, for automatically
-// computing exact derivatives of functions.
-//
-// While a complete treatment of the mechanics of automatic differentation is
-// beyond the scope of this header (see
-// http://en.wikipedia.org/wiki/Automatic_differentiation for details), the
-// basic idea is to extend normal arithmetic with an extra element, "e," often
-// denoted with the greek symbol epsilon, such that e != 0 but e^2 = 0. Dual
-// numbers are extensions of the real numbers analogous to complex numbers:
-// whereas complex numbers augment the reals by introducing an imaginary unit i
-// such that i^2 = -1, dual numbers introduce an "infinitesimal" unit e such
-// that e^2 = 0. Dual numbers have two components: the "real" component and the
-// "infinitesimal" component, generally written as x + y*e. Surprisingly, this
-// leads to a convenient method for computing exact derivatives without needing
-// to manipulate complicated symbolic expressions.
-//
-// For example, consider the function
-//
-// f(x) = x^2 ,
-//
-// evaluated at 10. Using normal arithmetic, f(10) = 100, and df/dx(10) = 20.
-// Next, augument 10 with an infinitesimal to get:
-//
-// f(10 + e) = (10 + e)^2
-// = 100 + 2 * 10 * e + e^2
-// = 100 + 20 * e -+-
-// -- |
-// | +--- This is zero, since e^2 = 0
-// |
-// +----------------- This is df/dx!
-//
-// Note that the derivative of f with respect to x is simply the infinitesimal
-// component of the value of f(x + e). So, in order to take the derivative of
-// any function, it is only necessary to replace the numeric "object" used in
-// the function with one extended with infinitesimals. The class Jet, defined in
-// this header, is one such example of this, where substitution is done with
-// templates.
-//
-// To handle derivatives of functions taking multiple arguments, different
-// infinitesimals are used, one for each variable to take the derivative of. For
-// example, consider a scalar function of two scalar parameters x and y:
-//
-// f(x, y) = x^2 + x * y
-//
-// Following the technique above, to compute the derivatives df/dx and df/dy for
-// f(1, 3) involves doing two evaluations of f, the first time replacing x with
-// x + e, the second time replacing y with y + e.
-//
-// For df/dx:
-//
-// f(1 + e, y) = (1 + e)^2 + (1 + e) * 3
-// = 1 + 2 * e + 3 + 3 * e
-// = 4 + 5 * e
-//
-// --> df/dx = 5
-//
-// For df/dy:
-//
-// f(1, 3 + e) = 1^2 + 1 * (3 + e)
-// = 1 + 3 + e
-// = 4 + e
-//
-// --> df/dy = 1
-//
-// To take the gradient of f with the implementation of dual numbers ("jets") in
-// this file, it is necessary to create a single jet type which has components
-// for the derivative in x and y, and passing them to a templated version of f:
-//
-// template<typename T>
-// T f(const T &x, const T &y) {
-// return x * x + x * y;
-// }
-//
-// // The "2" means there should be 2 dual number components.
-// Jet<double, 2> x(0); // Pick the 0th dual number for x.
-// Jet<double, 2> y(1); // Pick the 1st dual number for y.
-// Jet<double, 2> z = f(x, y);
-//
-// LOG(INFO) << "df/dx = " << z.a[0]
-// << "df/dy = " << z.a[1];
-//
-// Most users should not use Jet objects directly; a wrapper around Jet objects,
-// which makes computing the derivative, gradient, or jacobian of templated
-// functors simple, is in autodiff.h. Even autodiff.h should not be used
-// directly; instead autodiff_cost_function.h is typically the file of interest.
-//
-// For the more mathematically inclined, this file implements first-order
-// "jets". A 1st order jet is an element of the ring
-//
-// T[N] = T[t_1, ..., t_N] / (t_1, ..., t_N)^2
-//
-// which essentially means that each jet consists of a "scalar" value 'a' from T
-// and a 1st order perturbation vector 'v' of length N:
-//
-// x = a + \sum_i v[i] t_i
-//
-// A shorthand is to write an element as x = a + u, where u is the pertubation.
-// Then, the main point about the arithmetic of jets is that the product of
-// perturbations is zero:
-//
-// (a + u) * (b + v) = ab + av + bu + uv
-// = ab + (av + bu) + 0
-//
-// which is what operator* implements below. Addition is simpler:
-//
-// (a + u) + (b + v) = (a + b) + (u + v).
-//
-// The only remaining question is how to evaluate the function of a jet, for
-// which we use the chain rule:
-//
-// f(a + u) = f(a) + f'(a) u
-//
-// where f'(a) is the (scalar) derivative of f at a.
-//
-// By pushing these things through sufficiently and suitably templated
-// functions, we can do automatic differentiation. Just be sure to turn on
-// function inlining and common-subexpression elimination, or it will be very
-// slow!
-//
-// WARNING: Most Ceres users should not directly include this file or know the
-// details of how jets work. Instead the suggested method for automatic
-// derivatives is to use autodiff_cost_function.h, which is a wrapper around
-// both jets.h and autodiff.h to make taking derivatives of cost functions for
-// use in Ceres easier.
-
-#ifndef CERES_PUBLIC_JET_H_
-#define CERES_PUBLIC_JET_H_
-
-#include <cmath>
-#include <iosfwd>
-#include <iostream> // NOLINT
-#include <limits>
-#include <string>
-
-#include "Eigen/Core"
-#include "ceres/fpclassify.h"
-
-namespace ceres {
-
-template <typename T, int N>
-struct Jet {
- enum { DIMENSION = N };
-
- // Default-construct "a" because otherwise this can lead to false errors about
- // uninitialized uses when other classes relying on default constructed T
- // (where T is a Jet<T, N>). This usually only happens in opt mode. Note that
- // the C++ standard mandates that e.g. default constructed doubles are
- // initialized to 0.0; see sections 8.5 of the C++03 standard.
- Jet() : a() {
- v.setZero();
- }
-
- // Constructor from scalar: a + 0.
- explicit Jet(const T& value) {
- a = value;
- v.setZero();
- }
-
- // Constructor from scalar plus variable: a + t_i.
- Jet(const T& value, int k) {
- a = value;
- v.setZero();
- v[k] = T(1.0);
- }
-
- // Constructor from scalar and vector part
- // The use of Eigen::DenseBase allows Eigen expressions
- // to be passed in without being fully evaluated until
- // they are assigned to v
- template<typename Derived>
- EIGEN_STRONG_INLINE Jet(const T& a, const Eigen::DenseBase<Derived> &v)
- : a(a), v(v) {
- }
-
- // Compound operators
- Jet<T, N>& operator+=(const Jet<T, N> &y) {
- *this = *this + y;
- return *this;
- }
-
- Jet<T, N>& operator-=(const Jet<T, N> &y) {
- *this = *this - y;
- return *this;
- }
-
- Jet<T, N>& operator*=(const Jet<T, N> &y) {
- *this = *this * y;
- return *this;
- }
-
- Jet<T, N>& operator/=(const Jet<T, N> &y) {
- *this = *this / y;
- return *this;
- }
-
- // The scalar part.
- T a;
-
- // The infinitesimal part.
- //
- // Note the Eigen::DontAlign bit is needed here because this object
- // gets allocated on the stack and as part of other arrays and
- // structs. Forcing the right alignment there is the source of much
- // pain and suffering. Even if that works, passing Jets around to
- // functions by value has problems because the C++ ABI does not
- // guarantee alignment for function arguments.
- //
- // Setting the DontAlign bit prevents Eigen from using SSE for the
- // various operations on Jets. This is a small performance penalty
- // since the AutoDiff code will still expose much of the code as
- // statically sized loops to the compiler. But given the subtle
- // issues that arise due to alignment, especially when dealing with
- // multiple platforms, it seems to be a trade off worth making.
- Eigen::Matrix<T, N, 1, Eigen::DontAlign> v;
-};
-
-// Unary +
-template<typename T, int N> inline
-Jet<T, N> const& operator+(const Jet<T, N>& f) {
- return f;
-}
-
-// TODO(keir): Try adding __attribute__((always_inline)) to these functions to
-// see if it causes a performance increase.
-
-// Unary -
-template<typename T, int N> inline
-Jet<T, N> operator-(const Jet<T, N>&f) {
- return Jet<T, N>(-f.a, -f.v);
-}
-
-// Binary +
-template<typename T, int N> inline
-Jet<T, N> operator+(const Jet<T, N>& f,
- const Jet<T, N>& g) {
- return Jet<T, N>(f.a + g.a, f.v + g.v);
-}
-
-// Binary + with a scalar: x + s
-template<typename T, int N> inline
-Jet<T, N> operator+(const Jet<T, N>& f, T s) {
- return Jet<T, N>(f.a + s, f.v);
-}
-
-// Binary + with a scalar: s + x
-template<typename T, int N> inline
-Jet<T, N> operator+(T s, const Jet<T, N>& f) {
- return Jet<T, N>(f.a + s, f.v);
-}
-
-// Binary -
-template<typename T, int N> inline
-Jet<T, N> operator-(const Jet<T, N>& f,
- const Jet<T, N>& g) {
- return Jet<T, N>(f.a - g.a, f.v - g.v);
-}
-
-// Binary - with a scalar: x - s
-template<typename T, int N> inline
-Jet<T, N> operator-(const Jet<T, N>& f, T s) {
- return Jet<T, N>(f.a - s, f.v);
-}
-
-// Binary - with a scalar: s - x
-template<typename T, int N> inline
-Jet<T, N> operator-(T s, const Jet<T, N>& f) {
- return Jet<T, N>(s - f.a, -f.v);
-}
-
-// Binary *
-template<typename T, int N> inline
-Jet<T, N> operator*(const Jet<T, N>& f,
- const Jet<T, N>& g) {
- return Jet<T, N>(f.a * g.a, f.a * g.v + f.v * g.a);
-}
-
-// Binary * with a scalar: x * s
-template<typename T, int N> inline
-Jet<T, N> operator*(const Jet<T, N>& f, T s) {
- return Jet<T, N>(f.a * s, f.v * s);
-}
-
-// Binary * with a scalar: s * x
-template<typename T, int N> inline
-Jet<T, N> operator*(T s, const Jet<T, N>& f) {
- return Jet<T, N>(f.a * s, f.v * s);
-}
-
-// Binary /
-template<typename T, int N> inline
-Jet<T, N> operator/(const Jet<T, N>& f,
- const Jet<T, N>& g) {
- // This uses:
- //
- // a + u (a + u)(b - v) (a + u)(b - v)
- // ----- = -------------- = --------------
- // b + v (b + v)(b - v) b^2
- //
- // which holds because v*v = 0.
- const T g_a_inverse = T(1.0) / g.a;
- const T f_a_by_g_a = f.a * g_a_inverse;
- return Jet<T, N>(f.a * g_a_inverse, (f.v - f_a_by_g_a * g.v) * g_a_inverse);
-}
-
-// Binary / with a scalar: s / x
-template<typename T, int N> inline
-Jet<T, N> operator/(T s, const Jet<T, N>& g) {
- const T minus_s_g_a_inverse2 = -s / (g.a * g.a);
- return Jet<T, N>(s / g.a, g.v * minus_s_g_a_inverse2);
-}
-
-// Binary / with a scalar: x / s
-template<typename T, int N> inline
-Jet<T, N> operator/(const Jet<T, N>& f, T s) {
- const T s_inverse = 1.0 / s;
- return Jet<T, N>(f.a * s_inverse, f.v * s_inverse);
-}
-
-// Binary comparison operators for both scalars and jets.
-#define CERES_DEFINE_JET_COMPARISON_OPERATOR(op) \
-template<typename T, int N> inline \
-bool operator op(const Jet<T, N>& f, const Jet<T, N>& g) { \
- return f.a op g.a; \
-} \
-template<typename T, int N> inline \
-bool operator op(const T& s, const Jet<T, N>& g) { \
- return s op g.a; \
-} \
-template<typename T, int N> inline \
-bool operator op(const Jet<T, N>& f, const T& s) { \
- return f.a op s; \
-}
-CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
-CERES_DEFINE_JET_COMPARISON_OPERATOR( <= ) // NOLINT
-CERES_DEFINE_JET_COMPARISON_OPERATOR( > ) // NOLINT
-CERES_DEFINE_JET_COMPARISON_OPERATOR( >= ) // NOLINT
-CERES_DEFINE_JET_COMPARISON_OPERATOR( == ) // NOLINT
-CERES_DEFINE_JET_COMPARISON_OPERATOR( != ) // NOLINT
-#undef CERES_DEFINE_JET_COMPARISON_OPERATOR
-
-// Pull some functions from namespace std.
-//
-// This is necessary because we want to use the same name (e.g. 'sqrt') for
-// double-valued and Jet-valued functions, but we are not allowed to put
-// Jet-valued functions inside namespace std.
-//
-// TODO(keir): Switch to "using".
-inline double abs (double x) { return std::abs(x); }
-inline double log (double x) { return std::log(x); }
-inline double exp (double x) { return std::exp(x); }
-inline double sqrt (double x) { return std::sqrt(x); }
-inline double cos (double x) { return std::cos(x); }
-inline double acos (double x) { return std::acos(x); }
-inline double sin (double x) { return std::sin(x); }
-inline double asin (double x) { return std::asin(x); }
-inline double tan (double x) { return std::tan(x); }
-inline double atan (double x) { return std::atan(x); }
-inline double sinh (double x) { return std::sinh(x); }
-inline double cosh (double x) { return std::cosh(x); }
-inline double tanh (double x) { return std::tanh(x); }
-inline double pow (double x, double y) { return std::pow(x, y); }
-inline double atan2(double y, double x) { return std::atan2(y, x); }
-
-// In general, f(a + h) ~= f(a) + f'(a) h, via the chain rule.
-
-// abs(x + h) ~= x + h or -(x + h)
-template <typename T, int N> inline
-Jet<T, N> abs(const Jet<T, N>& f) {
- return f.a < T(0.0) ? -f : f;
-}
-
-// log(a + h) ~= log(a) + h / a
-template <typename T, int N> inline
-Jet<T, N> log(const Jet<T, N>& f) {
- const T a_inverse = T(1.0) / f.a;
- return Jet<T, N>(log(f.a), f.v * a_inverse);
-}
-
-// exp(a + h) ~= exp(a) + exp(a) h
-template <typename T, int N> inline
-Jet<T, N> exp(const Jet<T, N>& f) {
- const T tmp = exp(f.a);
- return Jet<T, N>(tmp, tmp * f.v);
-}
-
-// sqrt(a + h) ~= sqrt(a) + h / (2 sqrt(a))
-template <typename T, int N> inline
-Jet<T, N> sqrt(const Jet<T, N>& f) {
- const T tmp = sqrt(f.a);
- const T two_a_inverse = T(1.0) / (T(2.0) * tmp);
- return Jet<T, N>(tmp, f.v * two_a_inverse);
-}
-
-// cos(a + h) ~= cos(a) - sin(a) h
-template <typename T, int N> inline
-Jet<T, N> cos(const Jet<T, N>& f) {
- return Jet<T, N>(cos(f.a), - sin(f.a) * f.v);
-}
-
-// acos(a + h) ~= acos(a) - 1 / sqrt(1 - a^2) h
-template <typename T, int N> inline
-Jet<T, N> acos(const Jet<T, N>& f) {
- const T tmp = - T(1.0) / sqrt(T(1.0) - f.a * f.a);
- return Jet<T, N>(acos(f.a), tmp * f.v);
-}
-
-// sin(a + h) ~= sin(a) + cos(a) h
-template <typename T, int N> inline
-Jet<T, N> sin(const Jet<T, N>& f) {
- return Jet<T, N>(sin(f.a), cos(f.a) * f.v);
-}
-
-// asin(a + h) ~= asin(a) + 1 / sqrt(1 - a^2) h
-template <typename T, int N> inline
-Jet<T, N> asin(const Jet<T, N>& f) {
- const T tmp = T(1.0) / sqrt(T(1.0) - f.a * f.a);
- return Jet<T, N>(asin(f.a), tmp * f.v);
-}
-
-// tan(a + h) ~= tan(a) + (1 + tan(a)^2) h
-template <typename T, int N> inline
-Jet<T, N> tan(const Jet<T, N>& f) {
- const T tan_a = tan(f.a);
- const T tmp = T(1.0) + tan_a * tan_a;
- return Jet<T, N>(tan_a, tmp * f.v);
-}
-
-// atan(a + h) ~= atan(a) + 1 / (1 + a^2) h
-template <typename T, int N> inline
-Jet<T, N> atan(const Jet<T, N>& f) {
- const T tmp = T(1.0) / (T(1.0) + f.a * f.a);
- return Jet<T, N>(atan(f.a), tmp * f.v);
-}
-
-// sinh(a + h) ~= sinh(a) + cosh(a) h
-template <typename T, int N> inline
-Jet<T, N> sinh(const Jet<T, N>& f) {
- return Jet<T, N>(sinh(f.a), cosh(f.a) * f.v);
-}
-
-// cosh(a + h) ~= cosh(a) + sinh(a) h
-template <typename T, int N> inline
-Jet<T, N> cosh(const Jet<T, N>& f) {
- return Jet<T, N>(cosh(f.a), sinh(f.a) * f.v);
-}
-
-// tanh(a + h) ~= tanh(a) + (1 - tanh(a)^2) h
-template <typename T, int N> inline
-Jet<T, N> tanh(const Jet<T, N>& f) {
- const T tanh_a = tanh(f.a);
- const T tmp = T(1.0) - tanh_a * tanh_a;
- return Jet<T, N>(tanh_a, tmp * f.v);
-}
-
-// Jet Classification. It is not clear what the appropriate semantics are for
-// these classifications. This picks that IsFinite and isnormal are "all"
-// operations, i.e. all elements of the jet must be finite for the jet itself
-// to be finite (or normal). For IsNaN and IsInfinite, the answer is less
-// clear. This takes a "any" approach for IsNaN and IsInfinite such that if any
-// part of a jet is nan or inf, then the entire jet is nan or inf. This leads
-// to strange situations like a jet can be both IsInfinite and IsNaN, but in
-// practice the "any" semantics are the most useful for e.g. checking that
-// derivatives are sane.
-
-// The jet is finite if all parts of the jet are finite.
-template <typename T, int N> inline
-bool IsFinite(const Jet<T, N>& f) {
- if (!IsFinite(f.a)) {
- return false;
- }
- for (int i = 0; i < N; ++i) {
- if (!IsFinite(f.v[i])) {
- return false;
- }
- }
- return true;
-}
-
-// The jet is infinite if any part of the jet is infinite.
-template <typename T, int N> inline
-bool IsInfinite(const Jet<T, N>& f) {
- if (IsInfinite(f.a)) {
- return true;
- }
- for (int i = 0; i < N; i++) {
- if (IsInfinite(f.v[i])) {
- return true;
- }
- }
- return false;
-}
-
-// The jet is NaN if any part of the jet is NaN.
-template <typename T, int N> inline
-bool IsNaN(const Jet<T, N>& f) {
- if (IsNaN(f.a)) {
- return true;
- }
- for (int i = 0; i < N; ++i) {
- if (IsNaN(f.v[i])) {
- return true;
- }
- }
- return false;
-}
-
-// The jet is normal if all parts of the jet are normal.
-template <typename T, int N> inline
-bool IsNormal(const Jet<T, N>& f) {
- if (!IsNormal(f.a)) {
- return false;
- }
- for (int i = 0; i < N; ++i) {
- if (!IsNormal(f.v[i])) {
- return false;
- }
- }
- return true;
-}
-
-// atan2(b + db, a + da) ~= atan2(b, a) + (- b da + a db) / (a^2 + b^2)
-//
-// In words: the rate of change of theta is 1/r times the rate of
-// change of (x, y) in the positive angular direction.
-template <typename T, int N> inline
-Jet<T, N> atan2(const Jet<T, N>& g, const Jet<T, N>& f) {
- // Note order of arguments:
- //
- // f = a + da
- // g = b + db
-
- T const tmp = T(1.0) / (f.a * f.a + g.a * g.a);
- return Jet<T, N>(atan2(g.a, f.a), tmp * (- g.a * f.v + f.a * g.v));
-}
-
-
-// pow -- base is a differentiable function, exponent is a constant.
-// (a+da)^p ~= a^p + p*a^(p-1) da
-template <typename T, int N> inline
-Jet<T, N> pow(const Jet<T, N>& f, double g) {
- T const tmp = g * pow(f.a, g - T(1.0));
- return Jet<T, N>(pow(f.a, g), tmp * f.v);
-}
-
-// pow -- base is a constant, exponent is a differentiable function.
-// (a)^(p+dp) ~= a^p + a^p log(a) dp
-template <typename T, int N> inline
-Jet<T, N> pow(double f, const Jet<T, N>& g) {
- T const tmp = pow(f, g.a);
- return Jet<T, N>(tmp, log(f) * tmp * g.v);
-}
-
-
-// pow -- both base and exponent are differentiable functions.
-// (a+da)^(b+db) ~= a^b + b * a^(b-1) da + a^b log(a) * db
-template <typename T, int N> inline
-Jet<T, N> pow(const Jet<T, N>& f, const Jet<T, N>& g) {
- T const tmp1 = pow(f.a, g.a);
- T const tmp2 = g.a * pow(f.a, g.a - T(1.0));
- T const tmp3 = tmp1 * log(f.a);
-
- return Jet<T, N>(tmp1, tmp2 * f.v + tmp3 * g.v);
-}
-
-// Define the helper functions Eigen needs to embed Jet types.
-//
-// NOTE(keir): machine_epsilon() and precision() are missing, because they don't
-// work with nested template types (e.g. where the scalar is itself templated).
-// Among other things, this means that decompositions of Jet's does not work,
-// for example
-//
-// Matrix<Jet<T, N> ... > A, x, b;
-// ...
-// A.solve(b, &x)
-//
-// does not work and will fail with a strange compiler error.
-//
-// TODO(keir): This is an Eigen 2.0 limitation that is lifted in 3.0. When we
-// switch to 3.0, also add the rest of the specialization functionality.
-template<typename T, int N> inline const Jet<T, N>& ei_conj(const Jet<T, N>& x) { return x; } // NOLINT
-template<typename T, int N> inline const Jet<T, N>& ei_real(const Jet<T, N>& x) { return x; } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_imag(const Jet<T, N>& ) { return Jet<T, N>(0.0); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_abs (const Jet<T, N>& x) { return fabs(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_abs2(const Jet<T, N>& x) { return x * x; } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_sqrt(const Jet<T, N>& x) { return sqrt(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_exp (const Jet<T, N>& x) { return exp(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_log (const Jet<T, N>& x) { return log(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_sin (const Jet<T, N>& x) { return sin(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_cos (const Jet<T, N>& x) { return cos(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_tan (const Jet<T, N>& x) { return tan(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_atan(const Jet<T, N>& x) { return atan(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_sinh(const Jet<T, N>& x) { return sinh(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_cosh(const Jet<T, N>& x) { return cosh(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_tanh(const Jet<T, N>& x) { return tanh(x); } // NOLINT
-template<typename T, int N> inline Jet<T, N> ei_pow (const Jet<T, N>& x, Jet<T, N> y) { return pow(x, y); } // NOLINT
-
-// Note: This has to be in the ceres namespace for argument dependent lookup to
-// function correctly. Otherwise statements like CHECK_LE(x, 2.0) fail with
-// strange compile errors.
-template <typename T, int N>
-inline std::ostream &operator<<(std::ostream &s, const Jet<T, N>& z) {
- return s << "[" << z.a << " ; " << z.v.transpose() << "]";
-}
-
-} // namespace ceres
-
-namespace Eigen {
-
-// Creating a specialization of NumTraits enables placing Jet objects inside
-// Eigen arrays, getting all the goodness of Eigen combined with autodiff.
-template<typename T, int N>
-struct NumTraits<ceres::Jet<T, N> > {
- typedef ceres::Jet<T, N> Real;
- typedef ceres::Jet<T, N> NonInteger;
- typedef ceres::Jet<T, N> Nested;
-
- static typename ceres::Jet<T, N> dummy_precision() {
- return ceres::Jet<T, N>(1e-12);
- }
-
- static inline Real epsilon() {
- return Real(std::numeric_limits<T>::epsilon());
- }
-
- enum {
- IsComplex = 0,
- IsInteger = 0,
- IsSigned,
- ReadCost = 1,
- AddCost = 1,
- // For Jet types, multiplication is more expensive than addition.
- MulCost = 3,
- HasFloatingPoint = 1,
- RequireInitialization = 1
- };
-};
-
-} // namespace Eigen
-
-#endif // CERES_PUBLIC_JET_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/local_parameterization.h b/extern/libmv/third_party/ceres/include/ceres/local_parameterization.h
deleted file mode 100644
index 656c4d46662..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/local_parameterization.h
+++ /dev/null
@@ -1,217 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-// sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_LOCAL_PARAMETERIZATION_H_
-#define CERES_PUBLIC_LOCAL_PARAMETERIZATION_H_
-
-#include <vector>
-#include "ceres/internal/port.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// Purpose: Sometimes parameter blocks x can overparameterize a problem
-//
-// min f(x)
-// x
-//
-// In that case it is desirable to choose a parameterization for the
-// block itself to remove the null directions of the cost. More
-// generally, if x lies on a manifold of a smaller dimension than the
-// ambient space that it is embedded in, then it is numerically and
-// computationally more effective to optimize it using a
-// parameterization that lives in the tangent space of that manifold
-// at each point.
-//
-// For example, a sphere in three dimensions is a 2 dimensional
-// manifold, embedded in a three dimensional space. At each point on
-// the sphere, the plane tangent to it defines a two dimensional
-// tangent space. For a cost function defined on this sphere, given a
-// point x, moving in the direction normal to the sphere at that point
-// is not useful. Thus a better way to do a local optimization is to
-// optimize over two dimensional vector delta in the tangent space at
-// that point and then "move" to the point x + delta, where the move
-// operation involves projecting back onto the sphere. Doing so
-// removes a redundent dimension from the optimization, making it
-// numerically more robust and efficient.
-//
-// More generally we can define a function
-//
-// x_plus_delta = Plus(x, delta),
-//
-// where x_plus_delta has the same size as x, and delta is of size
-// less than or equal to x. The function Plus, generalizes the
-// definition of vector addition. Thus it satisfies the identify
-//
-// Plus(x, 0) = x, for all x.
-//
-// A trivial version of Plus is when delta is of the same size as x
-// and
-//
-// Plus(x, delta) = x + delta
-//
-// A more interesting case if x is two dimensional vector, and the
-// user wishes to hold the first coordinate constant. Then, delta is a
-// scalar and Plus is defined as
-//
-// Plus(x, delta) = x + [0] * delta
-// [1]
-//
-// An example that occurs commonly in Structure from Motion problems
-// is when camera rotations are parameterized using Quaternion. There,
-// it is useful only make updates orthogonal to that 4-vector defining
-// the quaternion. One way to do this is to let delta be a 3
-// dimensional vector and define Plus to be
-//
-// Plus(x, delta) = [cos(|delta|), sin(|delta|) delta / |delta|] * x
-//
-// The multiplication between the two 4-vectors on the RHS is the
-// standard quaternion product.
-//
-// Given g and a point x, optimizing f can now be restated as
-//
-// min f(Plus(x, delta))
-// delta
-//
-// Given a solution delta to this problem, the optimal value is then
-// given by
-//
-// x* = Plus(x, delta)
-//
-// The class LocalParameterization defines the function Plus and its
-// Jacobian which is needed to compute the Jacobian of f w.r.t delta.
-class CERES_EXPORT LocalParameterization {
- public:
- virtual ~LocalParameterization();
-
- // Generalization of the addition operation,
- //
- // x_plus_delta = Plus(x, delta)
- //
- // with the condition that Plus(x, 0) = x.
- virtual bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const = 0;
-
- // The jacobian of Plus(x, delta) w.r.t delta at delta = 0.
- //
- // jacobian is a row-major GlobalSize() x LocalSize() matrix.
- virtual bool ComputeJacobian(const double* x, double* jacobian) const = 0;
-
- // local_matrix = global_matrix * jacobian
- //
- // global_matrix is a num_rows x GlobalSize row major matrix.
- // local_matrix is a num_rows x LocalSize row major matrix.
- // jacobian(x) is the matrix returned by ComputeJacobian at x.
- //
- // This is only used by GradientProblem. For most normal uses, it is
- // okay to use the default implementation.
- virtual bool MultiplyByJacobian(const double* x,
- const int num_rows,
- const double* global_matrix,
- double* local_matrix) const;
-
- // Size of x.
- virtual int GlobalSize() const = 0;
-
- // Size of delta.
- virtual int LocalSize() const = 0;
-};
-
-// Some basic parameterizations
-
-// Identity Parameterization: Plus(x, delta) = x + delta
-class CERES_EXPORT IdentityParameterization : public LocalParameterization {
- public:
- explicit IdentityParameterization(int size);
- virtual ~IdentityParameterization() {}
- virtual bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const;
- virtual bool ComputeJacobian(const double* x,
- double* jacobian) const;
- virtual bool MultiplyByJacobian(const double* x,
- const int num_cols,
- const double* global_matrix,
- double* local_matrix) const;
- virtual int GlobalSize() const { return size_; }
- virtual int LocalSize() const { return size_; }
-
- private:
- const int size_;
-};
-
-// Hold a subset of the parameters inside a parameter block constant.
-class CERES_EXPORT SubsetParameterization : public LocalParameterization {
- public:
- explicit SubsetParameterization(int size,
- const vector<int>& constant_parameters);
- virtual ~SubsetParameterization() {}
- virtual bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const;
- virtual bool ComputeJacobian(const double* x,
- double* jacobian) const;
- virtual bool MultiplyByJacobian(const double* x,
- const int num_cols,
- const double* global_matrix,
- double* local_matrix) const;
- virtual int GlobalSize() const {
- return static_cast<int>(constancy_mask_.size());
- }
- virtual int LocalSize() const { return local_size_; }
-
- private:
- const int local_size_;
- vector<int> constancy_mask_;
-};
-
-// Plus(x, delta) = [cos(|delta|), sin(|delta|) delta / |delta|] * x
-// with * being the quaternion multiplication operator. Here we assume
-// that the first element of the quaternion vector is the real (cos
-// theta) part.
-class CERES_EXPORT QuaternionParameterization : public LocalParameterization {
- public:
- virtual ~QuaternionParameterization() {}
- virtual bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const;
- virtual bool ComputeJacobian(const double* x,
- double* jacobian) const;
- virtual int GlobalSize() const { return 4; }
- virtual int LocalSize() const { return 3; }
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_LOCAL_PARAMETERIZATION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/loss_function.h b/extern/libmv/third_party/ceres/include/ceres/loss_function.h
deleted file mode 100644
index 2c585009990..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/loss_function.h
+++ /dev/null
@@ -1,401 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// The LossFunction interface is the way users describe how residuals
-// are converted to cost terms for the overall problem cost function.
-// For the exact manner in which loss functions are converted to the
-// overall cost for a problem, see problem.h.
-//
-// For least squares problem where there are no outliers and standard
-// squared loss is expected, it is not necessary to create a loss
-// function; instead passing a NULL to the problem when adding
-// residuals implies a standard squared loss.
-//
-// For least squares problems where the minimization may encounter
-// input terms that contain outliers, that is, completely bogus
-// measurements, it is important to use a loss function that reduces
-// their associated penalty.
-//
-// Consider a structure from motion problem. The unknowns are 3D
-// points and camera parameters, and the measurements are image
-// coordinates describing the expected reprojected position for a
-// point in a camera. For example, we want to model the geometry of a
-// street scene with fire hydrants and cars, observed by a moving
-// camera with unknown parameters, and the only 3D points we care
-// about are the pointy tippy-tops of the fire hydrants. Our magic
-// image processing algorithm, which is responsible for producing the
-// measurements that are input to Ceres, has found and matched all
-// such tippy-tops in all image frames, except that in one of the
-// frame it mistook a car's headlight for a hydrant. If we didn't do
-// anything special (i.e. if we used a basic quadratic loss), the
-// residual for the erroneous measurement will result in extreme error
-// due to the quadratic nature of squared loss. This results in the
-// entire solution getting pulled away from the optimimum to reduce
-// the large error that would otherwise be attributed to the wrong
-// measurement.
-//
-// Using a robust loss function, the cost for large residuals is
-// reduced. In the example above, this leads to outlier terms getting
-// downweighted so they do not overly influence the final solution.
-//
-// What cost function is best?
-//
-// In general, there isn't a principled way to select a robust loss
-// function. The authors suggest starting with a non-robust cost, then
-// only experimenting with robust loss functions if standard squared
-// loss doesn't work.
-
-#ifndef CERES_PUBLIC_LOSS_FUNCTION_H_
-#define CERES_PUBLIC_LOSS_FUNCTION_H_
-
-#include "glog/logging.h"
-#include "ceres/internal/macros.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-class CERES_EXPORT LossFunction {
- public:
- virtual ~LossFunction() {}
-
- // For a residual vector with squared 2-norm 'sq_norm', this method
- // is required to fill in the value and derivatives of the loss
- // function (rho in this example):
- //
- // out[0] = rho(sq_norm),
- // out[1] = rho'(sq_norm),
- // out[2] = rho''(sq_norm),
- //
- // Here the convention is that the contribution of a term to the
- // cost function is given by 1/2 rho(s), where
- //
- // s = ||residuals||^2.
- //
- // Calling the method with a negative value of 's' is an error and
- // the implementations are not required to handle that case.
- //
- // Most sane choices of rho() satisfy:
- //
- // rho(0) = 0,
- // rho'(0) = 1,
- // rho'(s) < 1 in outlier region,
- // rho''(s) < 0 in outlier region,
- //
- // so that they mimic the least squares cost for small residuals.
- virtual void Evaluate(double sq_norm, double out[3]) const = 0;
-};
-
-// Some common implementations follow below.
-//
-// Note: in the region of interest (i.e. s < 3) we have:
-// TrivialLoss >= HuberLoss >= SoftLOneLoss >= CauchyLoss
-
-
-// This corresponds to no robustification.
-//
-// rho(s) = s
-//
-// At s = 0: rho = [0, 1, 0].
-//
-// It is not normally necessary to use this, as passing NULL for the
-// loss function when building the problem accomplishes the same
-// thing.
-class CERES_EXPORT TrivialLoss : public LossFunction {
- public:
- virtual void Evaluate(double, double*) const;
-};
-
-// Scaling
-// -------
-// Given one robustifier
-// s -> rho(s)
-// one can change the length scale at which robustification takes
-// place, by adding a scale factor 'a' as follows:
-//
-// s -> a^2 rho(s / a^2).
-//
-// The first and second derivatives are:
-//
-// s -> rho'(s / a^2),
-// s -> (1 / a^2) rho''(s / a^2),
-//
-// but the behaviour near s = 0 is the same as the original function,
-// i.e.
-//
-// rho(s) = s + higher order terms,
-// a^2 rho(s / a^2) = s + higher order terms.
-//
-// The scalar 'a' should be positive.
-//
-// The reason for the appearance of squaring is that 'a' is in the
-// units of the residual vector norm whereas 's' is a squared
-// norm. For applications it is more convenient to specify 'a' than
-// its square. The commonly used robustifiers below are described in
-// un-scaled format (a = 1) but their implementations work for any
-// non-zero value of 'a'.
-
-// Huber.
-//
-// rho(s) = s for s <= 1,
-// rho(s) = 2 sqrt(s) - 1 for s >= 1.
-//
-// At s = 0: rho = [0, 1, 0].
-//
-// The scaling parameter 'a' corresponds to 'delta' on this page:
-// http://en.wikipedia.org/wiki/Huber_Loss_Function
-class CERES_EXPORT HuberLoss : public LossFunction {
- public:
- explicit HuberLoss(double a) : a_(a), b_(a * a) { }
- virtual void Evaluate(double, double*) const;
-
- private:
- const double a_;
- // b = a^2.
- const double b_;
-};
-
-// Soft L1, similar to Huber but smooth.
-//
-// rho(s) = 2 (sqrt(1 + s) - 1).
-//
-// At s = 0: rho = [0, 1, -1/2].
-class CERES_EXPORT SoftLOneLoss : public LossFunction {
- public:
- explicit SoftLOneLoss(double a) : b_(a * a), c_(1 / b_) { }
- virtual void Evaluate(double, double*) const;
-
- private:
- // b = a^2.
- const double b_;
- // c = 1 / a^2.
- const double c_;
-};
-
-// Inspired by the Cauchy distribution
-//
-// rho(s) = log(1 + s).
-//
-// At s = 0: rho = [0, 1, -1].
-class CERES_EXPORT CauchyLoss : public LossFunction {
- public:
- explicit CauchyLoss(double a) : b_(a * a), c_(1 / b_) { }
- virtual void Evaluate(double, double*) const;
-
- private:
- // b = a^2.
- const double b_;
- // c = 1 / a^2.
- const double c_;
-};
-
-// Loss that is capped beyond a certain level using the arc-tangent function.
-// The scaling parameter 'a' determines the level where falloff occurs.
-// For costs much smaller than 'a', the loss function is linear and behaves like
-// TrivialLoss, and for values much larger than 'a' the value asymptotically
-// approaches the constant value of a * PI / 2.
-//
-// rho(s) = a atan(s / a).
-//
-// At s = 0: rho = [0, 1, 0].
-class CERES_EXPORT ArctanLoss : public LossFunction {
- public:
- explicit ArctanLoss(double a) : a_(a), b_(1 / (a * a)) { }
- virtual void Evaluate(double, double*) const;
-
- private:
- const double a_;
- // b = 1 / a^2.
- const double b_;
-};
-
-// Loss function that maps to approximately zero cost in a range around the
-// origin, and reverts to linear in error (quadratic in cost) beyond this range.
-// The tolerance parameter 'a' sets the nominal point at which the
-// transition occurs, and the transition size parameter 'b' sets the nominal
-// distance over which most of the transition occurs. Both a and b must be
-// greater than zero, and typically b will be set to a fraction of a.
-// The slope rho'[s] varies smoothly from about 0 at s <= a - b to
-// about 1 at s >= a + b.
-//
-// The term is computed as:
-//
-// rho(s) = b log(1 + exp((s - a) / b)) - c0.
-//
-// where c0 is chosen so that rho(0) == 0
-//
-// c0 = b log(1 + exp(-a / b)
-//
-// This has the following useful properties:
-//
-// rho(s) == 0 for s = 0
-// rho'(s) ~= 0 for s << a - b
-// rho'(s) ~= 1 for s >> a + b
-// rho''(s) > 0 for all s
-//
-// In addition, all derivatives are continuous, and the curvature is
-// concentrated in the range a - b to a + b.
-//
-// At s = 0: rho = [0, ~0, ~0].
-class CERES_EXPORT TolerantLoss : public LossFunction {
- public:
- explicit TolerantLoss(double a, double b);
- virtual void Evaluate(double, double*) const;
-
- private:
- const double a_, b_, c_;
-};
-
-// Composition of two loss functions. The error is the result of first
-// evaluating g followed by f to yield the composition f(g(s)).
-// The loss functions must not be NULL.
-class ComposedLoss : public LossFunction {
- public:
- explicit ComposedLoss(const LossFunction* f, Ownership ownership_f,
- const LossFunction* g, Ownership ownership_g);
- virtual ~ComposedLoss();
- virtual void Evaluate(double, double*) const;
-
- private:
- internal::scoped_ptr<const LossFunction> f_, g_;
- const Ownership ownership_f_, ownership_g_;
-};
-
-// The discussion above has to do with length scaling: it affects the space
-// in which s is measured. Sometimes you want to simply scale the output
-// value of the robustifier. For example, you might want to weight
-// different error terms differently (e.g., weight pixel reprojection
-// errors differently from terrain errors).
-//
-// If rho is the wrapped robustifier, then this simply outputs
-// s -> a * rho(s)
-//
-// The first and second derivatives are, not surprisingly
-// s -> a * rho'(s)
-// s -> a * rho''(s)
-//
-// Since we treat the a NULL Loss function as the Identity loss
-// function, rho = NULL is a valid input and will result in the input
-// being scaled by a. This provides a simple way of implementing a
-// scaled ResidualBlock.
-class CERES_EXPORT ScaledLoss : public LossFunction {
- public:
- // Constructs a ScaledLoss wrapping another loss function. Takes
- // ownership of the wrapped loss function or not depending on the
- // ownership parameter.
- ScaledLoss(const LossFunction* rho, double a, Ownership ownership) :
- rho_(rho), a_(a), ownership_(ownership) { }
-
- virtual ~ScaledLoss() {
- if (ownership_ == DO_NOT_TAKE_OWNERSHIP) {
- rho_.release();
- }
- }
- virtual void Evaluate(double, double*) const;
-
- private:
- internal::scoped_ptr<const LossFunction> rho_;
- const double a_;
- const Ownership ownership_;
- CERES_DISALLOW_COPY_AND_ASSIGN(ScaledLoss);
-};
-
-// Sometimes after the optimization problem has been constructed, we
-// wish to mutate the scale of the loss function. For example, when
-// performing estimation from data which has substantial outliers,
-// convergence can be improved by starting out with a large scale,
-// optimizing the problem and then reducing the scale. This can have
-// better convergence behaviour than just using a loss function with a
-// small scale.
-//
-// This templated class allows the user to implement a loss function
-// whose scale can be mutated after an optimization problem has been
-// constructed.
-//
-// Example usage
-//
-// Problem problem;
-//
-// // Add parameter blocks
-//
-// CostFunction* cost_function =
-// new AutoDiffCostFunction < UW_Camera_Mapper, 2, 9, 3>(
-// new UW_Camera_Mapper(feature_x, feature_y));
-//
-// LossFunctionWrapper* loss_function(new HuberLoss(1.0), TAKE_OWNERSHIP);
-//
-// problem.AddResidualBlock(cost_function, loss_function, parameters);
-//
-// Solver::Options options;
-// Solger::Summary summary;
-//
-// Solve(options, &problem, &summary)
-//
-// loss_function->Reset(new HuberLoss(1.0), TAKE_OWNERSHIP);
-//
-// Solve(options, &problem, &summary)
-//
-class CERES_EXPORT LossFunctionWrapper : public LossFunction {
- public:
- LossFunctionWrapper(LossFunction* rho, Ownership ownership)
- : rho_(rho), ownership_(ownership) {
- }
-
- virtual ~LossFunctionWrapper() {
- if (ownership_ == DO_NOT_TAKE_OWNERSHIP) {
- rho_.release();
- }
- }
-
- virtual void Evaluate(double sq_norm, double out[3]) const {
- CHECK_NOTNULL(rho_.get());
- rho_->Evaluate(sq_norm, out);
- }
-
- void Reset(LossFunction* rho, Ownership ownership) {
- if (ownership_ == DO_NOT_TAKE_OWNERSHIP) {
- rho_.release();
- }
- rho_.reset(rho);
- ownership_ = ownership;
- }
-
- private:
- internal::scoped_ptr<const LossFunction> rho_;
- Ownership ownership_;
- CERES_DISALLOW_COPY_AND_ASSIGN(LossFunctionWrapper);
-};
-
-} // namespace ceres
-
-#include "ceres/internal/disable_warnings.h"
-
-#endif // CERES_PUBLIC_LOSS_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/normal_prior.h b/extern/libmv/third_party/ceres/include/ceres/normal_prior.h
deleted file mode 100644
index df665054530..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/normal_prior.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// Cost term that implements a prior on a parameter block using a
-// normal distribution.
-
-#ifndef CERES_PUBLIC_NORMAL_PRIOR_H_
-#define CERES_PUBLIC_NORMAL_PRIOR_H_
-
-#include "ceres/cost_function.h"
-#include "ceres/internal/eigen.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// Implements a cost function of the form
-//
-// cost(x) = ||A(x - b)||^2
-//
-// where, the matrix A and the vector b are fixed and x is the
-// variable. In case the user is interested in implementing a cost
-// function of the form
-//
-// cost(x) = (x - mu)^T S^{-1} (x - mu)
-//
-// where, mu is a vector and S is a covariance matrix, then, A =
-// S^{-1/2}, i.e the matrix A is the square root of the inverse of the
-// covariance, also known as the stiffness matrix. There are however
-// no restrictions on the shape of A. It is free to be rectangular,
-// which would be the case if the covariance matrix S is rank
-// deficient.
-
-class CERES_EXPORT NormalPrior: public CostFunction {
- public:
- // Check that the number of rows in the vector b are the same as the
- // number of columns in the matrix A, crash otherwise.
- NormalPrior(const Matrix& A, const Vector& b);
-
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const;
- private:
- Matrix A_;
- Vector b_;
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_NORMAL_PRIOR_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/numeric_diff_cost_function.h b/extern/libmv/third_party/ceres/include/ceres/numeric_diff_cost_function.h
deleted file mode 100644
index de6b74ad552..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/numeric_diff_cost_function.h
+++ /dev/null
@@ -1,315 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-// sameeragarwal@google.com (Sameer Agarwal)
-//
-// Create CostFunctions as needed by the least squares framework with jacobians
-// computed via numeric (a.k.a. finite) differentiation. For more details see
-// http://en.wikipedia.org/wiki/Numerical_differentiation.
-//
-// To get an numerically differentiated cost function, you must define
-// a class with a operator() (a functor) that computes the residuals.
-//
-// The function must write the computed value in the last argument
-// (the only non-const one) and return true to indicate success.
-// Please see cost_function.h for details on how the return value
-// maybe used to impose simple constraints on the parameter block.
-//
-// For example, consider a scalar error e = k - x'y, where both x and y are
-// two-dimensional column vector parameters, the prime sign indicates
-// transposition, and k is a constant. The form of this error, which is the
-// difference between a constant and an expression, is a common pattern in least
-// squares problems. For example, the value x'y might be the model expectation
-// for a series of measurements, where there is an instance of the cost function
-// for each measurement k.
-//
-// The actual cost added to the total problem is e^2, or (k - x'k)^2; however,
-// the squaring is implicitly done by the optimization framework.
-//
-// To write an numerically-differentiable cost function for the above model, first
-// define the object
-//
-// class MyScalarCostFunctor {
-// MyScalarCostFunctor(double k): k_(k) {}
-//
-// bool operator()(const double* const x,
-// const double* const y,
-// double* residuals) const {
-// residuals[0] = k_ - x[0] * y[0] + x[1] * y[1];
-// return true;
-// }
-//
-// private:
-// double k_;
-// };
-//
-// Note that in the declaration of operator() the input parameters x
-// and y come first, and are passed as const pointers to arrays of
-// doubles. If there were three input parameters, then the third input
-// parameter would come after y. The output is always the last
-// parameter, and is also a pointer to an array. In the example above,
-// the residual is a scalar, so only residuals[0] is set.
-//
-// Then given this class definition, the numerically differentiated
-// cost function with central differences used for computing the
-// derivative can be constructed as follows.
-//
-// CostFunction* cost_function
-// = new NumericDiffCostFunction<MyScalarCostFunctor, CENTRAL, 1, 2, 2>(
-// new MyScalarCostFunctor(1.0)); ^ ^ ^ ^
-// | | | |
-// Finite Differencing Scheme -+ | | |
-// Dimension of residual ------------+ | |
-// Dimension of x ----------------------+ |
-// Dimension of y -------------------------+
-//
-// In this example, there is usually an instance for each measurement of k.
-//
-// In the instantiation above, the template parameters following
-// "MyScalarCostFunctor", "1, 2, 2", describe the functor as computing
-// a 1-dimensional output from two arguments, both 2-dimensional.
-//
-// NumericDiffCostFunction also supports cost functions with a
-// runtime-determined number of residuals. For example:
-//
-// CostFunction* cost_function
-// = new NumericDiffCostFunction<MyScalarCostFunctor, CENTRAL, DYNAMIC, 2, 2>(
-// new CostFunctorWithDynamicNumResiduals(1.0), ^ ^ ^
-// TAKE_OWNERSHIP, | | |
-// runtime_number_of_residuals); <----+ | | |
-// | | | |
-// | | | |
-// Actual number of residuals ------+ | | |
-// Indicate dynamic number of residuals --------------------+ | |
-// Dimension of x ------------------------------------------------+ |
-// Dimension of y ---------------------------------------------------+
-//
-// The framework can currently accommodate cost functions of up to 10
-// independent variables, and there is no limit on the dimensionality
-// of each of them.
-//
-// The central difference method is considerably more accurate at the cost of
-// twice as many function evaluations than forward difference. Consider using
-// central differences begin with, and only after that works, trying forward
-// difference to improve performance.
-//
-// WARNING #1: A common beginner's error when first using
-// NumericDiffCostFunction is to get the sizing wrong. In particular,
-// there is a tendency to set the template parameters to (dimension of
-// residual, number of parameters) instead of passing a dimension
-// parameter for *every parameter*. In the example above, that would
-// be <MyScalarCostFunctor, 1, 2>, which is missing the last '2'
-// argument. Please be careful when setting the size parameters.
-//
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-//
-// ALTERNATE INTERFACE
-//
-// For a variety of reason, including compatibility with legacy code,
-// NumericDiffCostFunction can also take CostFunction objects as
-// input. The following describes how.
-//
-// To get a numerically differentiated cost function, define a
-// subclass of CostFunction such that the Evaluate() function ignores
-// the jacobian parameter. The numeric differentiation wrapper will
-// fill in the jacobian parameter if necessary by repeatedly calling
-// the Evaluate() function with small changes to the appropriate
-// parameters, and computing the slope. For performance, the numeric
-// differentiation wrapper class is templated on the concrete cost
-// function, even though it could be implemented only in terms of the
-// virtual CostFunction interface.
-//
-// The numerically differentiated version of a cost function for a cost function
-// can be constructed as follows:
-//
-// CostFunction* cost_function
-// = new NumericDiffCostFunction<MyCostFunction, CENTRAL, 1, 4, 8>(
-// new MyCostFunction(...), TAKE_OWNERSHIP);
-//
-// where MyCostFunction has 1 residual and 2 parameter blocks with sizes 4 and 8
-// respectively. Look at the tests for a more detailed example.
-//
-// TODO(keir): Characterize accuracy; mention pitfalls; provide alternatives.
-
-#ifndef CERES_PUBLIC_NUMERIC_DIFF_COST_FUNCTION_H_
-#define CERES_PUBLIC_NUMERIC_DIFF_COST_FUNCTION_H_
-
-#include "Eigen/Dense"
-#include "ceres/cost_function.h"
-#include "ceres/internal/numeric_diff.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/sized_cost_function.h"
-#include "ceres/types.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-template <typename CostFunctor,
- NumericDiffMethod method = CENTRAL,
- int kNumResiduals = 0, // Number of residuals, or ceres::DYNAMIC
- int N0 = 0, // Number of parameters in block 0.
- int N1 = 0, // Number of parameters in block 1.
- int N2 = 0, // Number of parameters in block 2.
- int N3 = 0, // Number of parameters in block 3.
- int N4 = 0, // Number of parameters in block 4.
- int N5 = 0, // Number of parameters in block 5.
- int N6 = 0, // Number of parameters in block 6.
- int N7 = 0, // Number of parameters in block 7.
- int N8 = 0, // Number of parameters in block 8.
- int N9 = 0> // Number of parameters in block 9.
-class NumericDiffCostFunction
- : public SizedCostFunction<kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9> {
- public:
- NumericDiffCostFunction(CostFunctor* functor,
- Ownership ownership = TAKE_OWNERSHIP,
- int num_residuals = kNumResiduals,
- const double relative_step_size = 1e-6)
- :functor_(functor),
- ownership_(ownership),
- relative_step_size_(relative_step_size) {
- if (kNumResiduals == DYNAMIC) {
- SizedCostFunction<kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9>
- ::set_num_residuals(num_residuals);
- }
- }
-
- ~NumericDiffCostFunction() {
- if (ownership_ != TAKE_OWNERSHIP) {
- functor_.release();
- }
- }
-
- virtual bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const {
- using internal::FixedArray;
- using internal::NumericDiff;
-
- const int kNumParameters = N0 + N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9;
- const int kNumParameterBlocks =
- (N0 > 0) + (N1 > 0) + (N2 > 0) + (N3 > 0) + (N4 > 0) +
- (N5 > 0) + (N6 > 0) + (N7 > 0) + (N8 > 0) + (N9 > 0);
-
- // Get the function value (residuals) at the the point to evaluate.
- if (!internal::EvaluateImpl<CostFunctor,
- N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>(
- functor_.get(),
- parameters,
- residuals,
- functor_.get())) {
- return false;
- }
-
- if (jacobians == NULL) {
- return true;
- }
-
- // Create a copy of the parameters which will get mutated.
- FixedArray<double> parameters_copy(kNumParameters);
- FixedArray<double*> parameters_reference_copy(kNumParameterBlocks);
-
- parameters_reference_copy[0] = parameters_copy.get();
- if (N1) parameters_reference_copy[1] = parameters_reference_copy[0] + N0;
- if (N2) parameters_reference_copy[2] = parameters_reference_copy[1] + N1;
- if (N3) parameters_reference_copy[3] = parameters_reference_copy[2] + N2;
- if (N4) parameters_reference_copy[4] = parameters_reference_copy[3] + N3;
- if (N5) parameters_reference_copy[5] = parameters_reference_copy[4] + N4;
- if (N6) parameters_reference_copy[6] = parameters_reference_copy[5] + N5;
- if (N7) parameters_reference_copy[7] = parameters_reference_copy[6] + N6;
- if (N8) parameters_reference_copy[8] = parameters_reference_copy[7] + N7;
- if (N9) parameters_reference_copy[9] = parameters_reference_copy[8] + N8;
-
-#define COPY_PARAMETER_BLOCK(block) \
- if (N ## block) memcpy(parameters_reference_copy[block], \
- parameters[block], \
- sizeof(double) * N ## block); // NOLINT
-
- COPY_PARAMETER_BLOCK(0);
- COPY_PARAMETER_BLOCK(1);
- COPY_PARAMETER_BLOCK(2);
- COPY_PARAMETER_BLOCK(3);
- COPY_PARAMETER_BLOCK(4);
- COPY_PARAMETER_BLOCK(5);
- COPY_PARAMETER_BLOCK(6);
- COPY_PARAMETER_BLOCK(7);
- COPY_PARAMETER_BLOCK(8);
- COPY_PARAMETER_BLOCK(9);
-
-#undef COPY_PARAMETER_BLOCK
-
-#define EVALUATE_JACOBIAN_FOR_BLOCK(block) \
- if (N ## block && jacobians[block] != NULL) { \
- if (!NumericDiff<CostFunctor, \
- method, \
- kNumResiduals, \
- N0, N1, N2, N3, N4, N5, N6, N7, N8, N9, \
- block, \
- N ## block >::EvaluateJacobianForParameterBlock( \
- functor_.get(), \
- residuals, \
- relative_step_size_, \
- SizedCostFunction<kNumResiduals, \
- N0, N1, N2, N3, N4, \
- N5, N6, N7, N8, N9>::num_residuals(), \
- parameters_reference_copy.get(), \
- jacobians[block])) { \
- return false; \
- } \
- }
-
- EVALUATE_JACOBIAN_FOR_BLOCK(0);
- EVALUATE_JACOBIAN_FOR_BLOCK(1);
- EVALUATE_JACOBIAN_FOR_BLOCK(2);
- EVALUATE_JACOBIAN_FOR_BLOCK(3);
- EVALUATE_JACOBIAN_FOR_BLOCK(4);
- EVALUATE_JACOBIAN_FOR_BLOCK(5);
- EVALUATE_JACOBIAN_FOR_BLOCK(6);
- EVALUATE_JACOBIAN_FOR_BLOCK(7);
- EVALUATE_JACOBIAN_FOR_BLOCK(8);
- EVALUATE_JACOBIAN_FOR_BLOCK(9);
-
-#undef EVALUATE_JACOBIAN_FOR_BLOCK
-
- return true;
- }
-
- private:
- internal::scoped_ptr<CostFunctor> functor_;
- Ownership ownership_;
- const double relative_step_size_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_NUMERIC_DIFF_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/ordered_groups.h b/extern/libmv/third_party/ceres/include/ceres/ordered_groups.h
deleted file mode 100644
index c316d712e97..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/ordered_groups.h
+++ /dev/null
@@ -1,201 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_ORDERED_GROUPS_H_
-#define CERES_PUBLIC_ORDERED_GROUPS_H_
-
-#include <map>
-#include <set>
-#include <vector>
-#include "ceres/internal/port.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-// A class for storing and manipulating an ordered collection of
-// groups/sets with the following semantics:
-//
-// Group ids are non-negative integer values. Elements are any type
-// that can serve as a key in a map or an element of a set.
-//
-// An element can only belong to one group at a time. A group may
-// contain an arbitrary number of elements.
-//
-// Groups are ordered by their group id.
-template <typename T>
-class OrderedGroups {
- public:
- // Add an element to a group. If a group with this id does not
- // exist, one is created. This method can be called any number of
- // times for the same element. Group ids should be non-negative
- // numbers.
- //
- // Return value indicates if adding the element was a success.
- bool AddElementToGroup(const T element, const int group) {
- if (group < 0) {
- return false;
- }
-
- typename map<T, int>::const_iterator it = element_to_group_.find(element);
- if (it != element_to_group_.end()) {
- if (it->second == group) {
- // Element is already in the right group, nothing to do.
- return true;
- }
-
- group_to_elements_[it->second].erase(element);
- if (group_to_elements_[it->second].size() == 0) {
- group_to_elements_.erase(it->second);
- }
- }
-
- element_to_group_[element] = group;
- group_to_elements_[group].insert(element);
- return true;
- }
-
- void Clear() {
- group_to_elements_.clear();
- element_to_group_.clear();
- }
-
- // Remove the element, no matter what group it is in. Return value
- // indicates if the element was actually removed.
- bool Remove(const T element) {
- const int current_group = GroupId(element);
- if (current_group < 0) {
- return false;
- }
-
- group_to_elements_[current_group].erase(element);
-
- if (group_to_elements_[current_group].size() == 0) {
- // If the group is empty, then get rid of it.
- group_to_elements_.erase(current_group);
- }
-
- element_to_group_.erase(element);
- return true;
- }
-
- // Bulk remove elements. The return value indicates the number of
- // elements successfully removed.
- int Remove(const vector<T>& elements) {
- if (NumElements() == 0 || elements.size() == 0) {
- return 0;
- }
-
- int num_removed = 0;
- for (int i = 0; i < elements.size(); ++i) {
- num_removed += Remove(elements[i]);
- }
- return num_removed;
- }
-
- // Reverse the order of the groups in place.
- void Reverse() {
- typename map<int, set<T> >::reverse_iterator it =
- group_to_elements_.rbegin();
- map<int, set<T> > new_group_to_elements;
- new_group_to_elements[it->first] = it->second;
-
- int new_group_id = it->first + 1;
- for (++it; it != group_to_elements_.rend(); ++it) {
- for (typename set<T>::const_iterator element_it = it->second.begin();
- element_it != it->second.end();
- ++element_it) {
- element_to_group_[*element_it] = new_group_id;
- }
- new_group_to_elements[new_group_id] = it->second;
- new_group_id++;
- }
-
- group_to_elements_.swap(new_group_to_elements);
- }
-
- // Return the group id for the element. If the element is not a
- // member of any group, return -1.
- int GroupId(const T element) const {
- typename map<T, int>::const_iterator it = element_to_group_.find(element);
- if (it == element_to_group_.end()) {
- return -1;
- }
- return it->second;
- }
-
- bool IsMember(const T element) const {
- typename map<T, int>::const_iterator it = element_to_group_.find(element);
- return (it != element_to_group_.end());
- }
-
- // This function always succeeds, i.e., implicitly there exists a
- // group for every integer.
- int GroupSize(const int group) const {
- typename map<int, set<T> >::const_iterator it =
- group_to_elements_.find(group);
- return (it == group_to_elements_.end()) ? 0 : it->second.size();
- }
-
- int NumElements() const {
- return element_to_group_.size();
- }
-
- // Number of groups with one or more elements.
- int NumGroups() const {
- return group_to_elements_.size();
- }
-
- // The first group with one or more elements. Calling this when
- // there are no groups with non-zero elements will result in a
- // crash.
- int MinNonZeroGroup() const {
- CHECK_NE(NumGroups(), 0);
- return group_to_elements_.begin()->first;
- }
-
- const map<int, set<T> >& group_to_elements() const {
- return group_to_elements_;
- }
-
- const map<T, int>& element_to_group() const {
- return element_to_group_;
- }
-
- private:
- map<int, set<T> > group_to_elements_;
- map<T, int> element_to_group_;
-};
-
-// Typedef for the most commonly used version of OrderedGroups.
-typedef OrderedGroups<double*> ParameterBlockOrdering;
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_ORDERED_GROUP_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/problem.h b/extern/libmv/third_party/ceres/include/ceres/problem.h
deleted file mode 100644
index f75ede3a5c6..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/problem.h
+++ /dev/null
@@ -1,481 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-// keir@google.com (Keir Mierle)
-//
-// The Problem object is used to build and hold least squares problems.
-
-#ifndef CERES_PUBLIC_PROBLEM_H_
-#define CERES_PUBLIC_PROBLEM_H_
-
-#include <cstddef>
-#include <map>
-#include <set>
-#include <vector>
-
-#include "glog/logging.h"
-#include "ceres/internal/macros.h"
-#include "ceres/internal/port.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-
-namespace ceres {
-
-class CostFunction;
-class LossFunction;
-class LocalParameterization;
-class Solver;
-struct CRSMatrix;
-
-namespace internal {
-class Preprocessor;
-class ProblemImpl;
-class ParameterBlock;
-class ResidualBlock;
-} // namespace internal
-
-// A ResidualBlockId is an opaque handle clients can use to remove residual
-// blocks from a Problem after adding them.
-typedef internal::ResidualBlock* ResidualBlockId;
-
-// A class to represent non-linear least squares problems. Such
-// problems have a cost function that is a sum of error terms (known
-// as "residuals"), where each residual is a function of some subset
-// of the parameters. The cost function takes the form
-//
-// N 1
-// SUM --- loss( || r_i1, r_i2,..., r_ik ||^2 ),
-// i=1 2
-//
-// where
-//
-// r_ij is residual number i, component j; the residual is a
-// function of some subset of the parameters x1...xk. For
-// example, in a structure from motion problem a residual
-// might be the difference between a measured point in an
-// image and the reprojected position for the matching
-// camera, point pair. The residual would have two
-// components, error in x and error in y.
-//
-// loss(y) is the loss function; for example, squared error or
-// Huber L1 loss. If loss(y) = y, then the cost function is
-// non-robustified least squares.
-//
-// This class is specifically designed to address the important subset
-// of "sparse" least squares problems, where each component of the
-// residual depends only on a small number number of parameters, even
-// though the total number of residuals and parameters may be very
-// large. This property affords tremendous gains in scale, allowing
-// efficient solving of large problems that are otherwise
-// inaccessible.
-//
-// The canonical example of a sparse least squares problem is
-// "structure-from-motion" (SFM), where the parameters are points and
-// cameras, and residuals are reprojection errors. Typically a single
-// residual will depend only on 9 parameters (3 for the point, 6 for
-// the camera).
-//
-// To create a least squares problem, use the AddResidualBlock() and
-// AddParameterBlock() methods, documented below. Here is an example least
-// squares problem containing 3 parameter blocks of sizes 3, 4 and 5
-// respectively and two residual terms of size 2 and 6:
-//
-// double x1[] = { 1.0, 2.0, 3.0 };
-// double x2[] = { 1.0, 2.0, 3.0, 5.0 };
-// double x3[] = { 1.0, 2.0, 3.0, 6.0, 7.0 };
-//
-// Problem problem;
-//
-// problem.AddResidualBlock(new MyUnaryCostFunction(...), x1);
-// problem.AddResidualBlock(new MyBinaryCostFunction(...), x2, x3);
-//
-// Please see cost_function.h for details of the CostFunction object.
-class CERES_EXPORT Problem {
- public:
- struct CERES_EXPORT Options {
- Options()
- : cost_function_ownership(TAKE_OWNERSHIP),
- loss_function_ownership(TAKE_OWNERSHIP),
- local_parameterization_ownership(TAKE_OWNERSHIP),
- enable_fast_removal(false),
- disable_all_safety_checks(false) {}
-
- // These flags control whether the Problem object owns the cost
- // functions, loss functions, and parameterizations passed into
- // the Problem. If set to TAKE_OWNERSHIP, then the problem object
- // will delete the corresponding cost or loss functions on
- // destruction. The destructor is careful to delete the pointers
- // only once, since sharing cost/loss/parameterizations is
- // allowed.
- Ownership cost_function_ownership;
- Ownership loss_function_ownership;
- Ownership local_parameterization_ownership;
-
- // If true, trades memory for faster RemoveResidualBlock() and
- // RemoveParameterBlock() operations.
- //
- // By default, RemoveParameterBlock() and RemoveResidualBlock() take time
- // proportional to the size of the entire problem. If you only ever remove
- // parameters or residuals from the problem occassionally, this might be
- // acceptable. However, if you have memory to spare, enable this option to
- // make RemoveParameterBlock() take time proportional to the number of
- // residual blocks that depend on it, and RemoveResidualBlock() take (on
- // average) constant time.
- //
- // The increase in memory usage is twofold: an additonal hash set per
- // parameter block containing all the residuals that depend on the parameter
- // block; and a hash set in the problem containing all residuals.
- bool enable_fast_removal;
-
- // By default, Ceres performs a variety of safety checks when constructing
- // the problem. There is a small but measurable performance penalty to
- // these checks, typically around 5% of construction time. If you are sure
- // your problem construction is correct, and 5% of the problem construction
- // time is truly an overhead you want to avoid, then you can set
- // disable_all_safety_checks to true.
- //
- // WARNING: Do not set this to true, unless you are absolutely sure of what
- // you are doing.
- bool disable_all_safety_checks;
- };
-
- // The default constructor is equivalent to the
- // invocation Problem(Problem::Options()).
- Problem();
- explicit Problem(const Options& options);
-
- ~Problem();
-
- // Add a residual block to the overall cost function. The cost
- // function carries with it information about the sizes of the
- // parameter blocks it expects. The function checks that these match
- // the sizes of the parameter blocks listed in parameter_blocks. The
- // program aborts if a mismatch is detected. loss_function can be
- // NULL, in which case the cost of the term is just the squared norm
- // of the residuals.
- //
- // The user has the option of explicitly adding the parameter blocks
- // using AddParameterBlock. This causes additional correctness
- // checking; however, AddResidualBlock implicitly adds the parameter
- // blocks if they are not present, so calling AddParameterBlock
- // explicitly is not required.
- //
- // The Problem object by default takes ownership of the
- // cost_function and loss_function pointers. These objects remain
- // live for the life of the Problem object. If the user wishes to
- // keep control over the destruction of these objects, then they can
- // do this by setting the corresponding enums in the Options struct.
- //
- // Note: Even though the Problem takes ownership of cost_function
- // and loss_function, it does not preclude the user from re-using
- // them in another residual block. The destructor takes care to call
- // delete on each cost_function or loss_function pointer only once,
- // regardless of how many residual blocks refer to them.
- //
- // Example usage:
- //
- // double x1[] = {1.0, 2.0, 3.0};
- // double x2[] = {1.0, 2.0, 5.0, 6.0};
- // double x3[] = {3.0, 6.0, 2.0, 5.0, 1.0};
- //
- // Problem problem;
- //
- // problem.AddResidualBlock(new MyUnaryCostFunction(...), NULL, x1);
- // problem.AddResidualBlock(new MyBinaryCostFunction(...), NULL, x2, x1);
- //
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- const vector<double*>& parameter_blocks);
-
- // Convenience methods for adding residuals with a small number of
- // parameters. This is the common case. Instead of specifying the
- // parameter block arguments as a vector, list them as pointers.
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3, double* x4);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3, double* x4, double* x5);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3, double* x4, double* x5,
- double* x6);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3, double* x4, double* x5,
- double* x6, double* x7);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3, double* x4, double* x5,
- double* x6, double* x7, double* x8);
- ResidualBlockId AddResidualBlock(CostFunction* cost_function,
- LossFunction* loss_function,
- double* x0, double* x1, double* x2,
- double* x3, double* x4, double* x5,
- double* x6, double* x7, double* x8,
- double* x9);
-
- // Add a parameter block with appropriate size to the problem.
- // Repeated calls with the same arguments are ignored. Repeated
- // calls with the same double pointer but a different size results
- // in undefined behaviour.
- void AddParameterBlock(double* values, int size);
-
- // Add a parameter block with appropriate size and parameterization
- // to the problem. Repeated calls with the same arguments are
- // ignored. Repeated calls with the same double pointer but a
- // different size results in undefined behaviour.
- void AddParameterBlock(double* values,
- int size,
- LocalParameterization* local_parameterization);
-
- // Remove a parameter block from the problem. The parameterization of the
- // parameter block, if it exists, will persist until the deletion of the
- // problem (similar to cost/loss functions in residual block removal). Any
- // residual blocks that depend on the parameter are also removed, as
- // described above in RemoveResidualBlock().
- //
- // If Problem::Options::enable_fast_removal is true, then the
- // removal is fast (almost constant time). Otherwise, removing a parameter
- // block will incur a scan of the entire Problem object.
- //
- // WARNING: Removing a residual or parameter block will destroy the implicit
- // ordering, rendering the jacobian or residuals returned from the solver
- // uninterpretable. If you depend on the evaluated jacobian, do not use
- // remove! This may change in a future release.
- void RemoveParameterBlock(double* values);
-
- // Remove a residual block from the problem. Any parameters that the residual
- // block depends on are not removed. The cost and loss functions for the
- // residual block will not get deleted immediately; won't happen until the
- // problem itself is deleted.
- //
- // WARNING: Removing a residual or parameter block will destroy the implicit
- // ordering, rendering the jacobian or residuals returned from the solver
- // uninterpretable. If you depend on the evaluated jacobian, do not use
- // remove! This may change in a future release.
- void RemoveResidualBlock(ResidualBlockId residual_block);
-
- // Hold the indicated parameter block constant during optimization.
- void SetParameterBlockConstant(double* values);
-
- // Allow the indicated parameter block to vary during optimization.
- void SetParameterBlockVariable(double* values);
-
- // Set the local parameterization for one of the parameter blocks.
- // The local_parameterization is owned by the Problem by default. It
- // is acceptable to set the same parameterization for multiple
- // parameters; the destructor is careful to delete local
- // parameterizations only once. The local parameterization can only
- // be set once per parameter, and cannot be changed once set.
- void SetParameterization(double* values,
- LocalParameterization* local_parameterization);
-
- // Get the local parameterization object associated with this
- // parameter block. If there is no parameterization object
- // associated then NULL is returned.
- const LocalParameterization* GetParameterization(double* values) const;
-
- // Set the lower/upper bound for the parameter with position "index".
- void SetParameterLowerBound(double* values, int index, double lower_bound);
- void SetParameterUpperBound(double* values, int index, double upper_bound);
-
- // Number of parameter blocks in the problem. Always equals
- // parameter_blocks().size() and parameter_block_sizes().size().
- int NumParameterBlocks() const;
-
- // The size of the parameter vector obtained by summing over the
- // sizes of all the parameter blocks.
- int NumParameters() const;
-
- // Number of residual blocks in the problem. Always equals
- // residual_blocks().size().
- int NumResidualBlocks() const;
-
- // The size of the residual vector obtained by summing over the
- // sizes of all of the residual blocks.
- int NumResiduals() const;
-
- // The size of the parameter block.
- int ParameterBlockSize(const double* values) const;
-
- // The size of local parameterization for the parameter block. If
- // there is no local parameterization associated with this parameter
- // block, then ParameterBlockLocalSize = ParameterBlockSize.
- int ParameterBlockLocalSize(const double* values) const;
-
- // Is the given parameter block present in this problem or not?
- bool HasParameterBlock(const double* values) const;
-
- // Fills the passed parameter_blocks vector with pointers to the
- // parameter blocks currently in the problem. After this call,
- // parameter_block.size() == NumParameterBlocks.
- void GetParameterBlocks(vector<double*>* parameter_blocks) const;
-
- // Fills the passed residual_blocks vector with pointers to the
- // residual blocks currently in the problem. After this call,
- // residual_blocks.size() == NumResidualBlocks.
- void GetResidualBlocks(vector<ResidualBlockId>* residual_blocks) const;
-
- // Get all the parameter blocks that depend on the given residual block.
- void GetParameterBlocksForResidualBlock(
- const ResidualBlockId residual_block,
- vector<double*>* parameter_blocks) const;
-
- // Get the CostFunction for the given residual block.
- const CostFunction* GetCostFunctionForResidualBlock(
- const ResidualBlockId residual_block) const;
-
- // Get the LossFunction for the given residual block. Returns NULL
- // if no loss function is associated with this residual block.
- const LossFunction* GetLossFunctionForResidualBlock(
- const ResidualBlockId residual_block) const;
-
- // Get all the residual blocks that depend on the given parameter block.
- //
- // If Problem::Options::enable_fast_removal is true, then
- // getting the residual blocks is fast and depends only on the number of
- // residual blocks. Otherwise, getting the residual blocks for a parameter
- // block will incur a scan of the entire Problem object.
- void GetResidualBlocksForParameterBlock(
- const double* values,
- vector<ResidualBlockId>* residual_blocks) const;
-
- // Options struct to control Problem::Evaluate.
- struct EvaluateOptions {
- EvaluateOptions()
- : apply_loss_function(true),
- num_threads(1) {
- }
-
- // The set of parameter blocks for which evaluation should be
- // performed. This vector determines the order that parameter
- // blocks occur in the gradient vector and in the columns of the
- // jacobian matrix. If parameter_blocks is empty, then it is
- // assumed to be equal to vector containing ALL the parameter
- // blocks. Generally speaking the parameter blocks will occur in
- // the order in which they were added to the problem. But, this
- // may change if the user removes any parameter blocks from the
- // problem.
- //
- // NOTE: This vector should contain the same pointers as the ones
- // used to add parameter blocks to the Problem. These parameter
- // block should NOT point to new memory locations. Bad things will
- // happen otherwise.
- vector<double*> parameter_blocks;
-
- // The set of residual blocks to evaluate. This vector determines
- // the order in which the residuals occur, and how the rows of the
- // jacobian are ordered. If residual_blocks is empty, then it is
- // assumed to be equal to the vector containing all the residual
- // blocks. If this vector is empty, then it is assumed to be equal
- // to a vector containing ALL the residual blocks. Generally
- // speaking the residual blocks will occur in the order in which
- // they were added to the problem. But, this may change if the
- // user removes any residual blocks from the problem.
- vector<ResidualBlockId> residual_blocks;
-
- // Even though the residual blocks in the problem may contain loss
- // functions, setting apply_loss_function to false will turn off
- // the application of the loss function to the output of the cost
- // function. This is of use for example if the user wishes to
- // analyse the solution quality by studying the distribution of
- // residuals before and after the solve.
- bool apply_loss_function;
-
- int num_threads;
- };
-
- // Evaluate Problem. Any of the output pointers can be NULL. Which
- // residual blocks and parameter blocks are used is controlled by
- // the EvaluateOptions struct above.
- //
- // Note 1: The evaluation will use the values stored in the memory
- // locations pointed to by the parameter block pointers used at the
- // time of the construction of the problem. i.e.,
- //
- // Problem problem;
- // double x = 1;
- // problem.AddResidualBlock(new MyCostFunction, NULL, &x);
- //
- // double cost = 0.0;
- // problem.Evaluate(Problem::EvaluateOptions(), &cost, NULL, NULL, NULL);
- //
- // The cost is evaluated at x = 1. If you wish to evaluate the
- // problem at x = 2, then
- //
- // x = 2;
- // problem.Evaluate(Problem::EvaluateOptions(), &cost, NULL, NULL, NULL);
- //
- // is the way to do so.
- //
- // Note 2: If no local parameterizations are used, then the size of
- // the gradient vector (and the number of columns in the jacobian)
- // is the sum of the sizes of all the parameter blocks. If a
- // parameter block has a local parameterization, then it contributes
- // "LocalSize" entries to the gradient vector (and the number of
- // columns in the jacobian).
- bool Evaluate(const EvaluateOptions& options,
- double* cost,
- vector<double>* residuals,
- vector<double>* gradient,
- CRSMatrix* jacobian);
-
- private:
- friend class Solver;
- friend class Covariance;
- internal::scoped_ptr<internal::ProblemImpl> problem_impl_;
- CERES_DISALLOW_COPY_AND_ASSIGN(Problem);
-};
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_PROBLEM_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/rotation.h b/extern/libmv/third_party/ceres/include/ceres/rotation.h
deleted file mode 100644
index e3dbfe84a5a..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/rotation.h
+++ /dev/null
@@ -1,645 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-// sameeragarwal@google.com (Sameer Agarwal)
-//
-// Templated functions for manipulating rotations. The templated
-// functions are useful when implementing functors for automatic
-// differentiation.
-//
-// In the following, the Quaternions are laid out as 4-vectors, thus:
-//
-// q[0] scalar part.
-// q[1] coefficient of i.
-// q[2] coefficient of j.
-// q[3] coefficient of k.
-//
-// where: i*i = j*j = k*k = -1 and i*j = k, j*k = i, k*i = j.
-
-#ifndef CERES_PUBLIC_ROTATION_H_
-#define CERES_PUBLIC_ROTATION_H_
-
-#include <algorithm>
-#include <cmath>
-#include "glog/logging.h"
-
-namespace ceres {
-
-// Trivial wrapper to index linear arrays as matrices, given a fixed
-// column and row stride. When an array "T* array" is wrapped by a
-//
-// (const) MatrixAdapter<T, row_stride, col_stride> M"
-//
-// the expression M(i, j) is equivalent to
-//
-// arrary[i * row_stride + j * col_stride]
-//
-// Conversion functions to and from rotation matrices accept
-// MatrixAdapters to permit using row-major and column-major layouts,
-// and rotation matrices embedded in larger matrices (such as a 3x4
-// projection matrix).
-template <typename T, int row_stride, int col_stride>
-struct MatrixAdapter;
-
-// Convenience functions to create a MatrixAdapter that treats the
-// array pointed to by "pointer" as a 3x3 (contiguous) column-major or
-// row-major matrix.
-template <typename T>
-MatrixAdapter<T, 1, 3> ColumnMajorAdapter3x3(T* pointer);
-
-template <typename T>
-MatrixAdapter<T, 3, 1> RowMajorAdapter3x3(T* pointer);
-
-// Convert a value in combined axis-angle representation to a quaternion.
-// The value angle_axis is a triple whose norm is an angle in radians,
-// and whose direction is aligned with the axis of rotation,
-// and quaternion is a 4-tuple that will contain the resulting quaternion.
-// The implementation may be used with auto-differentiation up to the first
-// derivative, higher derivatives may have unexpected results near the origin.
-template<typename T>
-void AngleAxisToQuaternion(const T* angle_axis, T* quaternion);
-
-// Convert a quaternion to the equivalent combined axis-angle representation.
-// The value quaternion must be a unit quaternion - it is not normalized first,
-// and angle_axis will be filled with a value whose norm is the angle of
-// rotation in radians, and whose direction is the axis of rotation.
-// The implemention may be used with auto-differentiation up to the first
-// derivative, higher derivatives may have unexpected results near the origin.
-template<typename T>
-void QuaternionToAngleAxis(const T* quaternion, T* angle_axis);
-
-// Conversions between 3x3 rotation matrix (in column major order) and
-// axis-angle rotation representations. Templated for use with
-// autodifferentiation.
-template <typename T>
-void RotationMatrixToAngleAxis(const T* R, T* angle_axis);
-
-template <typename T, int row_stride, int col_stride>
-void RotationMatrixToAngleAxis(
- const MatrixAdapter<const T, row_stride, col_stride>& R,
- T* angle_axis);
-
-template <typename T>
-void AngleAxisToRotationMatrix(const T* angle_axis, T* R);
-
-template <typename T, int row_stride, int col_stride>
-void AngleAxisToRotationMatrix(
- const T* angle_axis,
- const MatrixAdapter<T, row_stride, col_stride>& R);
-
-// Conversions between 3x3 rotation matrix (in row major order) and
-// Euler angle (in degrees) rotation representations.
-//
-// The {pitch,roll,yaw} Euler angles are rotations around the {x,y,z}
-// axes, respectively. They are applied in that same order, so the
-// total rotation R is Rz * Ry * Rx.
-template <typename T>
-void EulerAnglesToRotationMatrix(const T* euler, int row_stride, T* R);
-
-template <typename T, int row_stride, int col_stride>
-void EulerAnglesToRotationMatrix(
- const T* euler,
- const MatrixAdapter<T, row_stride, col_stride>& R);
-
-// Convert a 4-vector to a 3x3 scaled rotation matrix.
-//
-// The choice of rotation is such that the quaternion [1 0 0 0] goes to an
-// identity matrix and for small a, b, c the quaternion [1 a b c] goes to
-// the matrix
-//
-// [ 0 -c b ]
-// I + 2 [ c 0 -a ] + higher order terms
-// [ -b a 0 ]
-//
-// which corresponds to a Rodrigues approximation, the last matrix being
-// the cross-product matrix of [a b c]. Together with the property that
-// R(q1 * q2) = R(q1) * R(q2) this uniquely defines the mapping from q to R.
-//
-// The rotation matrix is row-major.
-//
-// No normalization of the quaternion is performed, i.e.
-// R = ||q||^2 * Q, where Q is an orthonormal matrix
-// such that det(Q) = 1 and Q*Q' = I
-template <typename T> inline
-void QuaternionToScaledRotation(const T q[4], T R[3 * 3]);
-
-template <typename T, int row_stride, int col_stride> inline
-void QuaternionToScaledRotation(
- const T q[4],
- const MatrixAdapter<T, row_stride, col_stride>& R);
-
-// Same as above except that the rotation matrix is normalized by the
-// Frobenius norm, so that R * R' = I (and det(R) = 1).
-template <typename T> inline
-void QuaternionToRotation(const T q[4], T R[3 * 3]);
-
-template <typename T, int row_stride, int col_stride> inline
-void QuaternionToRotation(
- const T q[4],
- const MatrixAdapter<T, row_stride, col_stride>& R);
-
-// Rotates a point pt by a quaternion q:
-//
-// result = R(q) * pt
-//
-// Assumes the quaternion is unit norm. This assumption allows us to
-// write the transform as (something)*pt + pt, as is clear from the
-// formula below. If you pass in a quaternion with |q|^2 = 2 then you
-// WILL NOT get back 2 times the result you get for a unit quaternion.
-template <typename T> inline
-void UnitQuaternionRotatePoint(const T q[4], const T pt[3], T result[3]);
-
-// With this function you do not need to assume that q has unit norm.
-// It does assume that the norm is non-zero.
-template <typename T> inline
-void QuaternionRotatePoint(const T q[4], const T pt[3], T result[3]);
-
-// zw = z * w, where * is the Quaternion product between 4 vectors.
-template<typename T> inline
-void QuaternionProduct(const T z[4], const T w[4], T zw[4]);
-
-// xy = x cross y;
-template<typename T> inline
-void CrossProduct(const T x[3], const T y[3], T x_cross_y[3]);
-
-template<typename T> inline
-T DotProduct(const T x[3], const T y[3]);
-
-// y = R(angle_axis) * x;
-template<typename T> inline
-void AngleAxisRotatePoint(const T angle_axis[3], const T pt[3], T result[3]);
-
-// --- IMPLEMENTATION
-
-template<typename T, int row_stride, int col_stride>
-struct MatrixAdapter {
- T* pointer_;
- explicit MatrixAdapter(T* pointer)
- : pointer_(pointer)
- {}
-
- T& operator()(int r, int c) const {
- return pointer_[r * row_stride + c * col_stride];
- }
-};
-
-template <typename T>
-MatrixAdapter<T, 1, 3> ColumnMajorAdapter3x3(T* pointer) {
- return MatrixAdapter<T, 1, 3>(pointer);
-}
-
-template <typename T>
-MatrixAdapter<T, 3, 1> RowMajorAdapter3x3(T* pointer) {
- return MatrixAdapter<T, 3, 1>(pointer);
-}
-
-template<typename T>
-inline void AngleAxisToQuaternion(const T* angle_axis, T* quaternion) {
- const T& a0 = angle_axis[0];
- const T& a1 = angle_axis[1];
- const T& a2 = angle_axis[2];
- const T theta_squared = a0 * a0 + a1 * a1 + a2 * a2;
-
- // For points not at the origin, the full conversion is numerically stable.
- if (theta_squared > T(0.0)) {
- const T theta = sqrt(theta_squared);
- const T half_theta = theta * T(0.5);
- const T k = sin(half_theta) / theta;
- quaternion[0] = cos(half_theta);
- quaternion[1] = a0 * k;
- quaternion[2] = a1 * k;
- quaternion[3] = a2 * k;
- } else {
- // At the origin, sqrt() will produce NaN in the derivative since
- // the argument is zero. By approximating with a Taylor series,
- // and truncating at one term, the value and first derivatives will be
- // computed correctly when Jets are used.
- const T k(0.5);
- quaternion[0] = T(1.0);
- quaternion[1] = a0 * k;
- quaternion[2] = a1 * k;
- quaternion[3] = a2 * k;
- }
-}
-
-template<typename T>
-inline void QuaternionToAngleAxis(const T* quaternion, T* angle_axis) {
- const T& q1 = quaternion[1];
- const T& q2 = quaternion[2];
- const T& q3 = quaternion[3];
- const T sin_squared_theta = q1 * q1 + q2 * q2 + q3 * q3;
-
- // For quaternions representing non-zero rotation, the conversion
- // is numerically stable.
- if (sin_squared_theta > T(0.0)) {
- const T sin_theta = sqrt(sin_squared_theta);
- const T& cos_theta = quaternion[0];
-
- // If cos_theta is negative, theta is greater than pi/2, which
- // means that angle for the angle_axis vector which is 2 * theta
- // would be greater than pi.
- //
- // While this will result in the correct rotation, it does not
- // result in a normalized angle-axis vector.
- //
- // In that case we observe that 2 * theta ~ 2 * theta - 2 * pi,
- // which is equivalent saying
- //
- // theta - pi = atan(sin(theta - pi), cos(theta - pi))
- // = atan(-sin(theta), -cos(theta))
- //
- const T two_theta =
- T(2.0) * ((cos_theta < 0.0)
- ? atan2(-sin_theta, -cos_theta)
- : atan2(sin_theta, cos_theta));
- const T k = two_theta / sin_theta;
- angle_axis[0] = q1 * k;
- angle_axis[1] = q2 * k;
- angle_axis[2] = q3 * k;
- } else {
- // For zero rotation, sqrt() will produce NaN in the derivative since
- // the argument is zero. By approximating with a Taylor series,
- // and truncating at one term, the value and first derivatives will be
- // computed correctly when Jets are used.
- const T k(2.0);
- angle_axis[0] = q1 * k;
- angle_axis[1] = q2 * k;
- angle_axis[2] = q3 * k;
- }
-}
-
-// The conversion of a rotation matrix to the angle-axis form is
-// numerically problematic when then rotation angle is close to zero
-// or to Pi. The following implementation detects when these two cases
-// occurs and deals with them by taking code paths that are guaranteed
-// to not perform division by a small number.
-template <typename T>
-inline void RotationMatrixToAngleAxis(const T* R, T* angle_axis) {
- RotationMatrixToAngleAxis(ColumnMajorAdapter3x3(R), angle_axis);
-}
-
-template <typename T, int row_stride, int col_stride>
-void RotationMatrixToAngleAxis(
- const MatrixAdapter<const T, row_stride, col_stride>& R,
- T* angle_axis) {
- // x = k * 2 * sin(theta), where k is the axis of rotation.
- angle_axis[0] = R(2, 1) - R(1, 2);
- angle_axis[1] = R(0, 2) - R(2, 0);
- angle_axis[2] = R(1, 0) - R(0, 1);
-
- static const T kOne = T(1.0);
- static const T kTwo = T(2.0);
-
- // Since the right hand side may give numbers just above 1.0 or
- // below -1.0 leading to atan misbehaving, we threshold.
- T costheta = std::min(std::max((R(0, 0) + R(1, 1) + R(2, 2) - kOne) / kTwo,
- T(-1.0)),
- kOne);
-
- // sqrt is guaranteed to give non-negative results, so we only
- // threshold above.
- T sintheta = std::min(sqrt(angle_axis[0] * angle_axis[0] +
- angle_axis[1] * angle_axis[1] +
- angle_axis[2] * angle_axis[2]) / kTwo,
- kOne);
-
- // Use the arctan2 to get the right sign on theta
- const T theta = atan2(sintheta, costheta);
-
- // Case 1: sin(theta) is large enough, so dividing by it is not a
- // problem. We do not use abs here, because while jets.h imports
- // std::abs into the namespace, here in this file, abs resolves to
- // the int version of the function, which returns zero always.
- //
- // We use a threshold much larger then the machine epsilon, because
- // if sin(theta) is small, not only do we risk overflow but even if
- // that does not occur, just dividing by a small number will result
- // in numerical garbage. So we play it safe.
- static const double kThreshold = 1e-12;
- if ((sintheta > kThreshold) || (sintheta < -kThreshold)) {
- const T r = theta / (kTwo * sintheta);
- for (int i = 0; i < 3; ++i) {
- angle_axis[i] *= r;
- }
- return;
- }
-
- // Case 2: theta ~ 0, means sin(theta) ~ theta to a good
- // approximation.
- if (costheta > 0.0) {
- const T kHalf = T(0.5);
- for (int i = 0; i < 3; ++i) {
- angle_axis[i] *= kHalf;
- }
- return;
- }
-
- // Case 3: theta ~ pi, this is the hard case. Since theta is large,
- // and sin(theta) is small. Dividing by theta by sin(theta) will
- // either give an overflow or worse still numerically meaningless
- // results. Thus we use an alternate more complicated formula
- // here.
-
- // Since cos(theta) is negative, division by (1-cos(theta)) cannot
- // overflow.
- const T inv_one_minus_costheta = kOne / (kOne - costheta);
-
- // We now compute the absolute value of coordinates of the axis
- // vector using the diagonal entries of R. To resolve the sign of
- // these entries, we compare the sign of angle_axis[i]*sin(theta)
- // with the sign of sin(theta). If they are the same, then
- // angle_axis[i] should be positive, otherwise negative.
- for (int i = 0; i < 3; ++i) {
- angle_axis[i] = theta * sqrt((R(i, i) - costheta) * inv_one_minus_costheta);
- if (((sintheta < 0.0) && (angle_axis[i] > 0.0)) ||
- ((sintheta > 0.0) && (angle_axis[i] < 0.0))) {
- angle_axis[i] = -angle_axis[i];
- }
- }
-}
-
-template <typename T>
-inline void AngleAxisToRotationMatrix(const T* angle_axis, T* R) {
- AngleAxisToRotationMatrix(angle_axis, ColumnMajorAdapter3x3(R));
-}
-
-template <typename T, int row_stride, int col_stride>
-void AngleAxisToRotationMatrix(
- const T* angle_axis,
- const MatrixAdapter<T, row_stride, col_stride>& R) {
- static const T kOne = T(1.0);
- const T theta2 = DotProduct(angle_axis, angle_axis);
- if (theta2 > T(std::numeric_limits<double>::epsilon())) {
- // We want to be careful to only evaluate the square root if the
- // norm of the angle_axis vector is greater than zero. Otherwise
- // we get a division by zero.
- const T theta = sqrt(theta2);
- const T wx = angle_axis[0] / theta;
- const T wy = angle_axis[1] / theta;
- const T wz = angle_axis[2] / theta;
-
- const T costheta = cos(theta);
- const T sintheta = sin(theta);
-
- R(0, 0) = costheta + wx*wx*(kOne - costheta);
- R(1, 0) = wz*sintheta + wx*wy*(kOne - costheta);
- R(2, 0) = -wy*sintheta + wx*wz*(kOne - costheta);
- R(0, 1) = wx*wy*(kOne - costheta) - wz*sintheta;
- R(1, 1) = costheta + wy*wy*(kOne - costheta);
- R(2, 1) = wx*sintheta + wy*wz*(kOne - costheta);
- R(0, 2) = wy*sintheta + wx*wz*(kOne - costheta);
- R(1, 2) = -wx*sintheta + wy*wz*(kOne - costheta);
- R(2, 2) = costheta + wz*wz*(kOne - costheta);
- } else {
- // Near zero, we switch to using the first order Taylor expansion.
- R(0, 0) = kOne;
- R(1, 0) = angle_axis[2];
- R(2, 0) = -angle_axis[1];
- R(0, 1) = -angle_axis[2];
- R(1, 1) = kOne;
- R(2, 1) = angle_axis[0];
- R(0, 2) = angle_axis[1];
- R(1, 2) = -angle_axis[0];
- R(2, 2) = kOne;
- }
-}
-
-template <typename T>
-inline void EulerAnglesToRotationMatrix(const T* euler,
- const int row_stride_parameter,
- T* R) {
- CHECK_EQ(row_stride_parameter, 3);
- EulerAnglesToRotationMatrix(euler, RowMajorAdapter3x3(R));
-}
-
-template <typename T, int row_stride, int col_stride>
-void EulerAnglesToRotationMatrix(
- const T* euler,
- const MatrixAdapter<T, row_stride, col_stride>& R) {
- const double kPi = 3.14159265358979323846;
- const T degrees_to_radians(kPi / 180.0);
-
- const T pitch(euler[0] * degrees_to_radians);
- const T roll(euler[1] * degrees_to_radians);
- const T yaw(euler[2] * degrees_to_radians);
-
- const T c1 = cos(yaw);
- const T s1 = sin(yaw);
- const T c2 = cos(roll);
- const T s2 = sin(roll);
- const T c3 = cos(pitch);
- const T s3 = sin(pitch);
-
- R(0, 0) = c1*c2;
- R(0, 1) = -s1*c3 + c1*s2*s3;
- R(0, 2) = s1*s3 + c1*s2*c3;
-
- R(1, 0) = s1*c2;
- R(1, 1) = c1*c3 + s1*s2*s3;
- R(1, 2) = -c1*s3 + s1*s2*c3;
-
- R(2, 0) = -s2;
- R(2, 1) = c2*s3;
- R(2, 2) = c2*c3;
-}
-
-template <typename T> inline
-void QuaternionToScaledRotation(const T q[4], T R[3 * 3]) {
- QuaternionToScaledRotation(q, RowMajorAdapter3x3(R));
-}
-
-template <typename T, int row_stride, int col_stride> inline
-void QuaternionToScaledRotation(
- const T q[4],
- const MatrixAdapter<T, row_stride, col_stride>& R) {
- // Make convenient names for elements of q.
- T a = q[0];
- T b = q[1];
- T c = q[2];
- T d = q[3];
- // This is not to eliminate common sub-expression, but to
- // make the lines shorter so that they fit in 80 columns!
- T aa = a * a;
- T ab = a * b;
- T ac = a * c;
- T ad = a * d;
- T bb = b * b;
- T bc = b * c;
- T bd = b * d;
- T cc = c * c;
- T cd = c * d;
- T dd = d * d;
-
- R(0, 0) = aa + bb - cc - dd; R(0, 1) = T(2) * (bc - ad); R(0, 2) = T(2) * (ac + bd); // NOLINT
- R(1, 0) = T(2) * (ad + bc); R(1, 1) = aa - bb + cc - dd; R(1, 2) = T(2) * (cd - ab); // NOLINT
- R(2, 0) = T(2) * (bd - ac); R(2, 1) = T(2) * (ab + cd); R(2, 2) = aa - bb - cc + dd; // NOLINT
-}
-
-template <typename T> inline
-void QuaternionToRotation(const T q[4], T R[3 * 3]) {
- QuaternionToRotation(q, RowMajorAdapter3x3(R));
-}
-
-template <typename T, int row_stride, int col_stride> inline
-void QuaternionToRotation(const T q[4],
- const MatrixAdapter<T, row_stride, col_stride>& R) {
- QuaternionToScaledRotation(q, R);
-
- T normalizer = q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3];
- CHECK_NE(normalizer, T(0));
- normalizer = T(1) / normalizer;
-
- for (int i = 0; i < 3; ++i) {
- for (int j = 0; j < 3; ++j) {
- R(i, j) *= normalizer;
- }
- }
-}
-
-template <typename T> inline
-void UnitQuaternionRotatePoint(const T q[4], const T pt[3], T result[3]) {
- const T t2 = q[0] * q[1];
- const T t3 = q[0] * q[2];
- const T t4 = q[0] * q[3];
- const T t5 = -q[1] * q[1];
- const T t6 = q[1] * q[2];
- const T t7 = q[1] * q[3];
- const T t8 = -q[2] * q[2];
- const T t9 = q[2] * q[3];
- const T t1 = -q[3] * q[3];
- result[0] = T(2) * ((t8 + t1) * pt[0] + (t6 - t4) * pt[1] + (t3 + t7) * pt[2]) + pt[0]; // NOLINT
- result[1] = T(2) * ((t4 + t6) * pt[0] + (t5 + t1) * pt[1] + (t9 - t2) * pt[2]) + pt[1]; // NOLINT
- result[2] = T(2) * ((t7 - t3) * pt[0] + (t2 + t9) * pt[1] + (t5 + t8) * pt[2]) + pt[2]; // NOLINT
-}
-
-template <typename T> inline
-void QuaternionRotatePoint(const T q[4], const T pt[3], T result[3]) {
- // 'scale' is 1 / norm(q).
- const T scale = T(1) / sqrt(q[0] * q[0] +
- q[1] * q[1] +
- q[2] * q[2] +
- q[3] * q[3]);
-
- // Make unit-norm version of q.
- const T unit[4] = {
- scale * q[0],
- scale * q[1],
- scale * q[2],
- scale * q[3],
- };
-
- UnitQuaternionRotatePoint(unit, pt, result);
-}
-
-template<typename T> inline
-void QuaternionProduct(const T z[4], const T w[4], T zw[4]) {
- zw[0] = z[0] * w[0] - z[1] * w[1] - z[2] * w[2] - z[3] * w[3];
- zw[1] = z[0] * w[1] + z[1] * w[0] + z[2] * w[3] - z[3] * w[2];
- zw[2] = z[0] * w[2] - z[1] * w[3] + z[2] * w[0] + z[3] * w[1];
- zw[3] = z[0] * w[3] + z[1] * w[2] - z[2] * w[1] + z[3] * w[0];
-}
-
-// xy = x cross y;
-template<typename T> inline
-void CrossProduct(const T x[3], const T y[3], T x_cross_y[3]) {
- x_cross_y[0] = x[1] * y[2] - x[2] * y[1];
- x_cross_y[1] = x[2] * y[0] - x[0] * y[2];
- x_cross_y[2] = x[0] * y[1] - x[1] * y[0];
-}
-
-template<typename T> inline
-T DotProduct(const T x[3], const T y[3]) {
- return (x[0] * y[0] + x[1] * y[1] + x[2] * y[2]);
-}
-
-template<typename T> inline
-void AngleAxisRotatePoint(const T angle_axis[3], const T pt[3], T result[3]) {
- const T theta2 = DotProduct(angle_axis, angle_axis);
- if (theta2 > T(std::numeric_limits<double>::epsilon())) {
- // Away from zero, use the rodriguez formula
- //
- // result = pt costheta +
- // (w x pt) * sintheta +
- // w (w . pt) (1 - costheta)
- //
- // We want to be careful to only evaluate the square root if the
- // norm of the angle_axis vector is greater than zero. Otherwise
- // we get a division by zero.
- //
- const T theta = sqrt(theta2);
- const T costheta = cos(theta);
- const T sintheta = sin(theta);
- const T theta_inverse = 1.0 / theta;
-
- const T w[3] = { angle_axis[0] * theta_inverse,
- angle_axis[1] * theta_inverse,
- angle_axis[2] * theta_inverse };
-
- // Explicitly inlined evaluation of the cross product for
- // performance reasons.
- const T w_cross_pt[3] = { w[1] * pt[2] - w[2] * pt[1],
- w[2] * pt[0] - w[0] * pt[2],
- w[0] * pt[1] - w[1] * pt[0] };
- const T tmp =
- (w[0] * pt[0] + w[1] * pt[1] + w[2] * pt[2]) * (T(1.0) - costheta);
-
- result[0] = pt[0] * costheta + w_cross_pt[0] * sintheta + w[0] * tmp;
- result[1] = pt[1] * costheta + w_cross_pt[1] * sintheta + w[1] * tmp;
- result[2] = pt[2] * costheta + w_cross_pt[2] * sintheta + w[2] * tmp;
- } else {
- // Near zero, the first order Taylor approximation of the rotation
- // matrix R corresponding to a vector w and angle w is
- //
- // R = I + hat(w) * sin(theta)
- //
- // But sintheta ~ theta and theta * w = angle_axis, which gives us
- //
- // R = I + hat(w)
- //
- // and actually performing multiplication with the point pt, gives us
- // R * pt = pt + w x pt.
- //
- // Switching to the Taylor expansion near zero provides meaningful
- // derivatives when evaluated using Jets.
- //
- // Explicitly inlined evaluation of the cross product for
- // performance reasons.
- const T w_cross_pt[3] = { angle_axis[1] * pt[2] - angle_axis[2] * pt[1],
- angle_axis[2] * pt[0] - angle_axis[0] * pt[2],
- angle_axis[0] * pt[1] - angle_axis[1] * pt[0] };
-
- result[0] = pt[0] + w_cross_pt[0];
- result[1] = pt[1] + w_cross_pt[1];
- result[2] = pt[2] + w_cross_pt[2];
- }
-}
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_ROTATION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/sized_cost_function.h b/extern/libmv/third_party/ceres/include/ceres/sized_cost_function.h
deleted file mode 100644
index 4f98d4eb95c..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/sized_cost_function.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-//
-// A convenience class for cost functions which are statically sized.
-// Compared to the dynamically-sized base class, this reduces boilerplate.
-//
-// The kNumResiduals template parameter can be a constant such as 2 or 5, or it
-// can be ceres::DYNAMIC. If kNumResiduals is ceres::DYNAMIC, then subclasses
-// are responsible for calling set_num_residuals() at runtime.
-
-#ifndef CERES_PUBLIC_SIZED_COST_FUNCTION_H_
-#define CERES_PUBLIC_SIZED_COST_FUNCTION_H_
-
-#include "ceres/types.h"
-#include "ceres/cost_function.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-template<int kNumResiduals,
- int N0 = 0, int N1 = 0, int N2 = 0, int N3 = 0, int N4 = 0,
- int N5 = 0, int N6 = 0, int N7 = 0, int N8 = 0, int N9 = 0>
-class SizedCostFunction : public CostFunction {
- public:
- SizedCostFunction() {
- CHECK(kNumResiduals > 0 || kNumResiduals == DYNAMIC)
- << "Cost functions must have at least one residual block.";
-
- // This block breaks the 80 column rule to keep it somewhat readable.
- CHECK((!N1 && !N2 && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && !N2 && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && !N3 && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && !N4 && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && !N5 && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && !N6 && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && !N7 && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && !N8 && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && (N8 > 0) && !N9) ||
- ((N1 > 0) && (N2 > 0) && (N3 > 0) && (N4 > 0) && (N5 > 0) && (N6 > 0) && (N7 > 0) && (N8 > 0) && (N9 > 0)))
- << "Zero block cannot precede a non-zero block. Block sizes are "
- << "(ignore trailing 0s): " << N0 << ", " << N1 << ", " << N2 << ", "
- << N3 << ", " << N4 << ", " << N5 << ", " << N6 << ", " << N7 << ", "
- << N8 << ", " << N9;
-
- set_num_residuals(kNumResiduals);
-
-#define ADD_PARAMETER_BLOCK(N) \
- if (N) mutable_parameter_block_sizes()->push_back(N);
- ADD_PARAMETER_BLOCK(N0);
- ADD_PARAMETER_BLOCK(N1);
- ADD_PARAMETER_BLOCK(N2);
- ADD_PARAMETER_BLOCK(N3);
- ADD_PARAMETER_BLOCK(N4);
- ADD_PARAMETER_BLOCK(N5);
- ADD_PARAMETER_BLOCK(N6);
- ADD_PARAMETER_BLOCK(N7);
- ADD_PARAMETER_BLOCK(N8);
- ADD_PARAMETER_BLOCK(N9);
-#undef ADD_PARAMETER_BLOCK
- }
-
- virtual ~SizedCostFunction() { }
-
- // Subclasses must implement Evaluate().
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_SIZED_COST_FUNCTION_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/solver.h b/extern/libmv/third_party/ceres/include/ceres/solver.h
deleted file mode 100644
index a5efa2a3915..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/solver.h
+++ /dev/null
@@ -1,1004 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#ifndef CERES_PUBLIC_SOLVER_H_
-#define CERES_PUBLIC_SOLVER_H_
-
-#include <cmath>
-#include <string>
-#include <vector>
-#include "ceres/crs_matrix.h"
-#include "ceres/internal/macros.h"
-#include "ceres/internal/port.h"
-#include "ceres/iteration_callback.h"
-#include "ceres/ordered_groups.h"
-#include "ceres/types.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-class Problem;
-
-// Interface for non-linear least squares solvers.
-class CERES_EXPORT Solver {
- public:
- virtual ~Solver();
-
- // The options structure contains, not surprisingly, options that control how
- // the solver operates. The defaults should be suitable for a wide range of
- // problems; however, better performance is often obtainable with tweaking.
- //
- // The constants are defined inside types.h
- struct CERES_EXPORT Options {
- // Default constructor that sets up a generic sparse problem.
- Options() {
- minimizer_type = TRUST_REGION;
- line_search_direction_type = LBFGS;
- line_search_type = WOLFE;
- nonlinear_conjugate_gradient_type = FLETCHER_REEVES;
- max_lbfgs_rank = 20;
- use_approximate_eigenvalue_bfgs_scaling = false;
- line_search_interpolation_type = CUBIC;
- min_line_search_step_size = 1e-9;
- line_search_sufficient_function_decrease = 1e-4;
- max_line_search_step_contraction = 1e-3;
- min_line_search_step_contraction = 0.6;
- max_num_line_search_step_size_iterations = 20;
- max_num_line_search_direction_restarts = 5;
- line_search_sufficient_curvature_decrease = 0.9;
- max_line_search_step_expansion = 10.0;
- trust_region_strategy_type = LEVENBERG_MARQUARDT;
- dogleg_type = TRADITIONAL_DOGLEG;
- use_nonmonotonic_steps = false;
- max_consecutive_nonmonotonic_steps = 5;
- max_num_iterations = 50;
- max_solver_time_in_seconds = 1e9;
- num_threads = 1;
- initial_trust_region_radius = 1e4;
- max_trust_region_radius = 1e16;
- min_trust_region_radius = 1e-32;
- min_relative_decrease = 1e-3;
- min_lm_diagonal = 1e-6;
- max_lm_diagonal = 1e32;
- max_num_consecutive_invalid_steps = 5;
- function_tolerance = 1e-6;
- gradient_tolerance = 1e-10;
- parameter_tolerance = 1e-8;
-
-#if defined(CERES_NO_SUITESPARSE) && defined(CERES_NO_CXSPARSE) && !defined(CERES_ENABLE_LGPL_CODE)
- linear_solver_type = DENSE_QR;
-#else
- linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-#endif
-
- preconditioner_type = JACOBI;
- visibility_clustering_type = CANONICAL_VIEWS;
- dense_linear_algebra_library_type = EIGEN;
-
- // Choose a default sparse linear algebra library in the order:
- //
- // SUITE_SPARSE > CX_SPARSE > EIGEN_SPARSE
-#if !defined(CERES_NO_SUITESPARSE)
- sparse_linear_algebra_library_type = SUITE_SPARSE;
-#else
- #if !defined(CERES_NO_CXSPARSE)
- sparse_linear_algebra_library_type = CX_SPARSE;
- #else
- #if defined(CERES_USE_EIGEN_SPARSE)
- sparse_linear_algebra_library_type = EIGEN_SPARSE;
- #endif
- #endif
-#endif
-
- num_linear_solver_threads = 1;
- use_explicit_schur_complement = false;
- use_postordering = false;
- dynamic_sparsity = false;
- min_linear_solver_iterations = 0;
- max_linear_solver_iterations = 500;
- eta = 1e-1;
- jacobi_scaling = true;
- use_inner_iterations = false;
- inner_iteration_tolerance = 1e-3;
- logging_type = PER_MINIMIZER_ITERATION;
- minimizer_progress_to_stdout = false;
- trust_region_problem_dump_directory = "/tmp";
- trust_region_problem_dump_format_type = TEXTFILE;
- check_gradients = false;
- gradient_check_relative_precision = 1e-8;
- numeric_derivative_relative_step_size = 1e-6;
- update_state_every_iteration = false;
- }
-
- // Returns true if the options struct has a valid
- // configuration. Returns false otherwise, and fills in *error
- // with a message describing the problem.
- bool IsValid(string* error) const;
-
- // Minimizer options ----------------------------------------
-
- // Ceres supports the two major families of optimization strategies -
- // Trust Region and Line Search.
- //
- // 1. The line search approach first finds a descent direction
- // along which the objective function will be reduced and then
- // computes a step size that decides how far should move along
- // that direction. The descent direction can be computed by
- // various methods, such as gradient descent, Newton's method and
- // Quasi-Newton method. The step size can be determined either
- // exactly or inexactly.
- //
- // 2. The trust region approach approximates the objective
- // function using using a model function (often a quadratic) over
- // a subset of the search space known as the trust region. If the
- // model function succeeds in minimizing the true objective
- // function the trust region is expanded; conversely, otherwise it
- // is contracted and the model optimization problem is solved
- // again.
- //
- // Trust region methods are in some sense dual to line search methods:
- // trust region methods first choose a step size (the size of the
- // trust region) and then a step direction while line search methods
- // first choose a step direction and then a step size.
- MinimizerType minimizer_type;
-
- LineSearchDirectionType line_search_direction_type;
- LineSearchType line_search_type;
- NonlinearConjugateGradientType nonlinear_conjugate_gradient_type;
-
- // The LBFGS hessian approximation is a low rank approximation to
- // the inverse of the Hessian matrix. The rank of the
- // approximation determines (linearly) the space and time
- // complexity of using the approximation. Higher the rank, the
- // better is the quality of the approximation. The increase in
- // quality is however is bounded for a number of reasons.
- //
- // 1. The method only uses secant information and not actual
- // derivatives.
- //
- // 2. The Hessian approximation is constrained to be positive
- // definite.
- //
- // So increasing this rank to a large number will cost time and
- // space complexity without the corresponding increase in solution
- // quality. There are no hard and fast rules for choosing the
- // maximum rank. The best choice usually requires some problem
- // specific experimentation.
- //
- // For more theoretical and implementation details of the LBFGS
- // method, please see:
- //
- // Nocedal, J. (1980). "Updating Quasi-Newton Matrices with
- // Limited Storage". Mathematics of Computation 35 (151): 773–782.
- int max_lbfgs_rank;
-
- // As part of the (L)BFGS update step (BFGS) / right-multiply step (L-BFGS),
- // the initial inverse Hessian approximation is taken to be the Identity.
- // However, Oren showed that using instead I * \gamma, where \gamma is
- // chosen to approximate an eigenvalue of the true inverse Hessian can
- // result in improved convergence in a wide variety of cases. Setting
- // use_approximate_eigenvalue_bfgs_scaling to true enables this scaling.
- //
- // It is important to note that approximate eigenvalue scaling does not
- // always improve convergence, and that it can in fact significantly degrade
- // performance for certain classes of problem, which is why it is disabled
- // by default. In particular it can degrade performance when the
- // sensitivity of the problem to different parameters varies significantly,
- // as in this case a single scalar factor fails to capture this variation
- // and detrimentally downscales parts of the jacobian approximation which
- // correspond to low-sensitivity parameters. It can also reduce the
- // robustness of the solution to errors in the jacobians.
- //
- // Oren S.S., Self-scaling variable metric (SSVM) algorithms
- // Part II: Implementation and experiments, Management Science,
- // 20(5), 863-874, 1974.
- bool use_approximate_eigenvalue_bfgs_scaling;
-
- // Degree of the polynomial used to approximate the objective
- // function. Valid values are BISECTION, QUADRATIC and CUBIC.
- //
- // BISECTION corresponds to pure backtracking search with no
- // interpolation.
- LineSearchInterpolationType line_search_interpolation_type;
-
- // If during the line search, the step_size falls below this
- // value, it is truncated to zero.
- double min_line_search_step_size;
-
- // Line search parameters.
-
- // Solving the line search problem exactly is computationally
- // prohibitive. Fortunately, line search based optimization
- // algorithms can still guarantee convergence if instead of an
- // exact solution, the line search algorithm returns a solution
- // which decreases the value of the objective function
- // sufficiently. More precisely, we are looking for a step_size
- // s.t.
- //
- // f(step_size) <= f(0) + sufficient_decrease * f'(0) * step_size
- //
- double line_search_sufficient_function_decrease;
-
- // In each iteration of the line search,
- //
- // new_step_size >= max_line_search_step_contraction * step_size
- //
- // Note that by definition, for contraction:
- //
- // 0 < max_step_contraction < min_step_contraction < 1
- //
- double max_line_search_step_contraction;
-
- // In each iteration of the line search,
- //
- // new_step_size <= min_line_search_step_contraction * step_size
- //
- // Note that by definition, for contraction:
- //
- // 0 < max_step_contraction < min_step_contraction < 1
- //
- double min_line_search_step_contraction;
-
- // Maximum number of trial step size iterations during each line search,
- // if a step size satisfying the search conditions cannot be found within
- // this number of trials, the line search will terminate.
- int max_num_line_search_step_size_iterations;
-
- // Maximum number of restarts of the line search direction algorithm before
- // terminating the optimization. Restarts of the line search direction
- // algorithm occur when the current algorithm fails to produce a new descent
- // direction. This typically indicates a numerical failure, or a breakdown
- // in the validity of the approximations used.
- int max_num_line_search_direction_restarts;
-
- // The strong Wolfe conditions consist of the Armijo sufficient
- // decrease condition, and an additional requirement that the
- // step-size be chosen s.t. the _magnitude_ ('strong' Wolfe
- // conditions) of the gradient along the search direction
- // decreases sufficiently. Precisely, this second condition
- // is that we seek a step_size s.t.
- //
- // |f'(step_size)| <= sufficient_curvature_decrease * |f'(0)|
- //
- // Where f() is the line search objective and f'() is the derivative
- // of f w.r.t step_size (d f / d step_size).
- double line_search_sufficient_curvature_decrease;
-
- // During the bracketing phase of the Wolfe search, the step size is
- // increased until either a point satisfying the Wolfe conditions is
- // found, or an upper bound for a bracket containing a point satisfying
- // the conditions is found. Precisely, at each iteration of the
- // expansion:
- //
- // new_step_size <= max_step_expansion * step_size.
- //
- // By definition for expansion, max_step_expansion > 1.0.
- double max_line_search_step_expansion;
-
- TrustRegionStrategyType trust_region_strategy_type;
-
- // Type of dogleg strategy to use.
- DoglegType dogleg_type;
-
- // The classical trust region methods are descent methods, in that
- // they only accept a point if it strictly reduces the value of
- // the objective function.
- //
- // Relaxing this requirement allows the algorithm to be more
- // efficient in the long term at the cost of some local increase
- // in the value of the objective function.
- //
- // This is because allowing for non-decreasing objective function
- // values in a princpled manner allows the algorithm to "jump over
- // boulders" as the method is not restricted to move into narrow
- // valleys while preserving its convergence properties.
- //
- // Setting use_nonmonotonic_steps to true enables the
- // non-monotonic trust region algorithm as described by Conn,
- // Gould & Toint in "Trust Region Methods", Section 10.1.
- //
- // The parameter max_consecutive_nonmonotonic_steps controls the
- // window size used by the step selection algorithm to accept
- // non-monotonic steps.
- //
- // Even though the value of the objective function may be larger
- // than the minimum value encountered over the course of the
- // optimization, the final parameters returned to the user are the
- // ones corresponding to the minimum cost over all iterations.
- bool use_nonmonotonic_steps;
- int max_consecutive_nonmonotonic_steps;
-
- // Maximum number of iterations for the minimizer to run for.
- int max_num_iterations;
-
- // Maximum time for which the minimizer should run for.
- double max_solver_time_in_seconds;
-
- // Number of threads used by Ceres for evaluating the cost and
- // jacobians.
- int num_threads;
-
- // Trust region minimizer settings.
- double initial_trust_region_radius;
- double max_trust_region_radius;
-
- // Minimizer terminates when the trust region radius becomes
- // smaller than this value.
- double min_trust_region_radius;
-
- // Lower bound for the relative decrease before a step is
- // accepted.
- double min_relative_decrease;
-
- // For the Levenberg-Marquadt algorithm, the scaled diagonal of
- // the normal equations J'J is used to control the size of the
- // trust region. Extremely small and large values along the
- // diagonal can make this regularization scheme
- // fail. max_lm_diagonal and min_lm_diagonal, clamp the values of
- // diag(J'J) from above and below. In the normal course of
- // operation, the user should not have to modify these parameters.
- double min_lm_diagonal;
- double max_lm_diagonal;
-
- // Sometimes due to numerical conditioning problems or linear
- // solver flakiness, the trust region strategy may return a
- // numerically invalid step that can be fixed by reducing the
- // trust region size. So the TrustRegionMinimizer allows for a few
- // successive invalid steps before it declares NUMERICAL_FAILURE.
- int max_num_consecutive_invalid_steps;
-
- // Minimizer terminates when
- //
- // (new_cost - old_cost) < function_tolerance * old_cost;
- //
- double function_tolerance;
-
- // Minimizer terminates when
- //
- // max_i |x - Project(Plus(x, -g(x))| < gradient_tolerance
- //
- // This value should typically be 1e-4 * function_tolerance.
- double gradient_tolerance;
-
- // Minimizer terminates when
- //
- // |step|_2 <= parameter_tolerance * ( |x|_2 + parameter_tolerance)
- //
- double parameter_tolerance;
-
- // Linear least squares solver options -------------------------------------
-
- LinearSolverType linear_solver_type;
-
- // Type of preconditioner to use with the iterative linear solvers.
- PreconditionerType preconditioner_type;
-
- // Type of clustering algorithm to use for visibility based
- // preconditioning. This option is used only when the
- // preconditioner_type is CLUSTER_JACOBI or CLUSTER_TRIDIAGONAL.
- VisibilityClusteringType visibility_clustering_type;
-
- // Ceres supports using multiple dense linear algebra libraries
- // for dense matrix factorizations. Currently EIGEN and LAPACK are
- // the valid choices. EIGEN is always available, LAPACK refers to
- // the system BLAS + LAPACK library which may or may not be
- // available.
- //
- // This setting affects the DENSE_QR, DENSE_NORMAL_CHOLESKY and
- // DENSE_SCHUR solvers. For small to moderate sized probem EIGEN
- // is a fine choice but for large problems, an optimized LAPACK +
- // BLAS implementation can make a substantial difference in
- // performance.
- DenseLinearAlgebraLibraryType dense_linear_algebra_library_type;
-
- // Ceres supports using multiple sparse linear algebra libraries
- // for sparse matrix ordering and factorizations. Currently,
- // SUITE_SPARSE and CX_SPARSE are the valid choices, depending on
- // whether they are linked into Ceres at build time.
- SparseLinearAlgebraLibraryType sparse_linear_algebra_library_type;
-
- // Number of threads used by Ceres to solve the Newton
- // step. Currently only the SPARSE_SCHUR solver is capable of
- // using this setting.
- int num_linear_solver_threads;
-
- // The order in which variables are eliminated in a linear solver
- // can have a significant of impact on the efficiency and accuracy
- // of the method. e.g., when doing sparse Cholesky factorization,
- // there are matrices for which a good ordering will give a
- // Cholesky factor with O(n) storage, where as a bad ordering will
- // result in an completely dense factor.
- //
- // Ceres allows the user to provide varying amounts of hints to
- // the solver about the variable elimination ordering to use. This
- // can range from no hints, where the solver is free to decide the
- // best possible ordering based on the user's choices like the
- // linear solver being used, to an exact order in which the
- // variables should be eliminated, and a variety of possibilities
- // in between.
- //
- // Instances of the ParameterBlockOrdering class are used to
- // communicate this information to Ceres.
- //
- // Formally an ordering is an ordered partitioning of the
- // parameter blocks, i.e, each parameter block belongs to exactly
- // one group, and each group has a unique non-negative integer
- // associated with it, that determines its order in the set of
- // groups.
- //
- // Given such an ordering, Ceres ensures that the parameter blocks in
- // the lowest numbered group are eliminated first, and then the
- // parmeter blocks in the next lowest numbered group and so on. Within
- // each group, Ceres is free to order the parameter blocks as it
- // chooses.
- //
- // If NULL, then all parameter blocks are assumed to be in the
- // same group and the solver is free to decide the best
- // ordering.
- //
- // e.g. Consider the linear system
- //
- // x + y = 3
- // 2x + 3y = 7
- //
- // There are two ways in which it can be solved. First eliminating x
- // from the two equations, solving for y and then back substituting
- // for x, or first eliminating y, solving for x and back substituting
- // for y. The user can construct three orderings here.
- //
- // {0: x}, {1: y} - eliminate x first.
- // {0: y}, {1: x} - eliminate y first.
- // {0: x, y} - Solver gets to decide the elimination order.
- //
- // Thus, to have Ceres determine the ordering automatically using
- // heuristics, put all the variables in group 0 and to control the
- // ordering for every variable, create groups 0..N-1, one per
- // variable, in the desired order.
- //
- // Bundle Adjustment
- // -----------------
- //
- // A particular case of interest is bundle adjustment, where the user
- // has two options. The default is to not specify an ordering at all,
- // the solver will see that the user wants to use a Schur type solver
- // and figure out the right elimination ordering.
- //
- // But if the user already knows what parameter blocks are points and
- // what are cameras, they can save preprocessing time by partitioning
- // the parameter blocks into two groups, one for the points and one
- // for the cameras, where the group containing the points has an id
- // smaller than the group containing cameras.
- shared_ptr<ParameterBlockOrdering> linear_solver_ordering;
-
- // Use an explicitly computed Schur complement matrix with
- // ITERATIVE_SCHUR.
- //
- // By default this option is disabled and ITERATIVE_SCHUR
- // evaluates evaluates matrix-vector products between the Schur
- // complement and a vector implicitly by exploiting the algebraic
- // expression for the Schur complement.
- //
- // The cost of this evaluation scales with the number of non-zeros
- // in the Jacobian.
- //
- // For small to medium sized problems there is a sweet spot where
- // computing the Schur complement is cheap enough that it is much
- // more efficient to explicitly compute it and use it for evaluating
- // the matrix-vector products.
- //
- // Enabling this option tells ITERATIVE_SCHUR to use an explicitly
- // computed Schur complement.
- //
- // NOTE: This option can only be used with the SCHUR_JACOBI
- // preconditioner.
- bool use_explicit_schur_complement;
-
- // Sparse Cholesky factorization algorithms use a fill-reducing
- // ordering to permute the columns of the Jacobian matrix. There
- // are two ways of doing this.
-
- // 1. Compute the Jacobian matrix in some order and then have the
- // factorization algorithm permute the columns of the Jacobian.
-
- // 2. Compute the Jacobian with its columns already permuted.
-
- // The first option incurs a significant memory penalty. The
- // factorization algorithm has to make a copy of the permuted
- // Jacobian matrix, thus Ceres pre-permutes the columns of the
- // Jacobian matrix and generally speaking, there is no performance
- // penalty for doing so.
-
- // In some rare cases, it is worth using a more complicated
- // reordering algorithm which has slightly better runtime
- // performance at the expense of an extra copy of the Jacobian
- // matrix. Setting use_postordering to true enables this tradeoff.
- bool use_postordering;
-
- // Some non-linear least squares problems are symbolically dense but
- // numerically sparse. i.e. at any given state only a small number
- // of jacobian entries are non-zero, but the position and number of
- // non-zeros is different depending on the state. For these problems
- // it can be useful to factorize the sparse jacobian at each solver
- // iteration instead of including all of the zero entries in a single
- // general factorization.
- //
- // If your problem does not have this property (or you do not know),
- // then it is probably best to keep this false, otherwise it will
- // likely lead to worse performance.
-
- // This settings affects the SPARSE_NORMAL_CHOLESKY solver.
- bool dynamic_sparsity;
-
- // Some non-linear least squares problems have additional
- // structure in the way the parameter blocks interact that it is
- // beneficial to modify the way the trust region step is computed.
- //
- // e.g., consider the following regression problem
- //
- // y = a_1 exp(b_1 x) + a_2 exp(b_3 x^2 + c_1)
- //
- // Given a set of pairs{(x_i, y_i)}, the user wishes to estimate
- // a_1, a_2, b_1, b_2, and c_1.
- //
- // Notice here that the expression on the left is linear in a_1
- // and a_2, and given any value for b_1, b_2 and c_1, it is
- // possible to use linear regression to estimate the optimal
- // values of a_1 and a_2. Indeed, its possible to analytically
- // eliminate the variables a_1 and a_2 from the problem all
- // together. Problems like these are known as separable least
- // squares problem and the most famous algorithm for solving them
- // is the Variable Projection algorithm invented by Golub &
- // Pereyra.
- //
- // Similar structure can be found in the matrix factorization with
- // missing data problem. There the corresponding algorithm is
- // known as Wiberg's algorithm.
- //
- // Ruhe & Wedin (Algorithms for Separable Nonlinear Least Squares
- // Problems, SIAM Reviews, 22(3), 1980) present an analyis of
- // various algorithms for solving separable non-linear least
- // squares problems and refer to "Variable Projection" as
- // Algorithm I in their paper.
- //
- // Implementing Variable Projection is tedious and expensive, and
- // they present a simpler algorithm, which they refer to as
- // Algorithm II, where once the Newton/Trust Region step has been
- // computed for the whole problem (a_1, a_2, b_1, b_2, c_1) and
- // additional optimization step is performed to estimate a_1 and
- // a_2 exactly.
- //
- // This idea can be generalized to cases where the residual is not
- // linear in a_1 and a_2, i.e., Solve for the trust region step
- // for the full problem, and then use it as the starting point to
- // further optimize just a_1 and a_2. For the linear case, this
- // amounts to doing a single linear least squares solve. For
- // non-linear problems, any method for solving the a_1 and a_2
- // optimization problems will do. The only constraint on a_1 and
- // a_2 is that they do not co-occur in any residual block.
- //
- // This idea can be further generalized, by not just optimizing
- // (a_1, a_2), but decomposing the graph corresponding to the
- // Hessian matrix's sparsity structure in a collection of
- // non-overlapping independent sets and optimizing each of them.
- //
- // Setting "use_inner_iterations" to true enables the use of this
- // non-linear generalization of Ruhe & Wedin's Algorithm II. This
- // version of Ceres has a higher iteration complexity, but also
- // displays better convergence behaviour per iteration. Setting
- // Solver::Options::num_threads to the maximum number possible is
- // highly recommended.
- bool use_inner_iterations;
-
- // If inner_iterations is true, then the user has two choices.
- //
- // 1. Let the solver heuristically decide which parameter blocks
- // to optimize in each inner iteration. To do this leave
- // Solver::Options::inner_iteration_ordering untouched.
- //
- // 2. Specify a collection of of ordered independent sets. Where
- // the lower numbered groups are optimized before the higher
- // number groups. Each group must be an independent set. Not
- // all parameter blocks need to be present in the ordering.
- shared_ptr<ParameterBlockOrdering> inner_iteration_ordering;
-
- // Generally speaking, inner iterations make significant progress
- // in the early stages of the solve and then their contribution
- // drops down sharply, at which point the time spent doing inner
- // iterations is not worth it.
- //
- // Once the relative decrease in the objective function due to
- // inner iterations drops below inner_iteration_tolerance, the use
- // of inner iterations in subsequent trust region minimizer
- // iterations is disabled.
- double inner_iteration_tolerance;
-
- // Minimum number of iterations for which the linear solver should
- // run, even if the convergence criterion is satisfied.
- int min_linear_solver_iterations;
-
- // Maximum number of iterations for which the linear solver should
- // run. If the solver does not converge in less than
- // max_linear_solver_iterations, then it returns MAX_ITERATIONS,
- // as its termination type.
- int max_linear_solver_iterations;
-
- // Forcing sequence parameter. The truncated Newton solver uses
- // this number to control the relative accuracy with which the
- // Newton step is computed.
- //
- // This constant is passed to ConjugateGradientsSolver which uses
- // it to terminate the iterations when
- //
- // (Q_i - Q_{i-1})/Q_i < eta/i
- double eta;
-
- // Normalize the jacobian using Jacobi scaling before calling
- // the linear least squares solver.
- bool jacobi_scaling;
-
- // Logging options ---------------------------------------------------------
-
- LoggingType logging_type;
-
- // By default the Minimizer progress is logged to VLOG(1), which
- // is sent to STDERR depending on the vlog level. If this flag is
- // set to true, and logging_type is not SILENT, the logging output
- // is sent to STDOUT.
- bool minimizer_progress_to_stdout;
-
- // List of iterations at which the minimizer should dump the trust
- // region problem. Useful for testing and benchmarking. If empty
- // (default), no problems are dumped.
- vector<int> trust_region_minimizer_iterations_to_dump;
-
- // Directory to which the problems should be written to. Should be
- // non-empty if trust_region_minimizer_iterations_to_dump is
- // non-empty and trust_region_problem_dump_format_type is not
- // CONSOLE.
- string trust_region_problem_dump_directory;
- DumpFormatType trust_region_problem_dump_format_type;
-
- // Finite differences options ----------------------------------------------
-
- // Check all jacobians computed by each residual block with finite
- // differences. This is expensive since it involves computing the
- // derivative by normal means (e.g. user specified, autodiff,
- // etc), then also computing it using finite differences. The
- // results are compared, and if they differ substantially, details
- // are printed to the log.
- bool check_gradients;
-
- // Relative precision to check for in the gradient checker. If the
- // relative difference between an element in a jacobian exceeds
- // this number, then the jacobian for that cost term is dumped.
- double gradient_check_relative_precision;
-
- // Relative shift used for taking numeric derivatives. For finite
- // differencing, each dimension is evaluated at slightly shifted
- // values; for the case of central difference, this is what gets
- // evaluated:
- //
- // delta = numeric_derivative_relative_step_size;
- // f_initial = f(x)
- // f_forward = f((1 + delta) * x)
- // f_backward = f((1 - delta) * x)
- //
- // The finite differencing is done along each dimension. The
- // reason to use a relative (rather than absolute) step size is
- // that this way, numeric differentation works for functions where
- // the arguments are typically large (e.g. 1e9) and when the
- // values are small (e.g. 1e-5). It is possible to construct
- // "torture cases" which break this finite difference heuristic,
- // but they do not come up often in practice.
- //
- // TODO(keir): Pick a smarter number than the default above! In
- // theory a good choice is sqrt(eps) * x, which for doubles means
- // about 1e-8 * x. However, I have found this number too
- // optimistic. This number should be exposed for users to change.
- double numeric_derivative_relative_step_size;
-
- // If true, the user's parameter blocks are updated at the end of
- // every Minimizer iteration, otherwise they are updated when the
- // Minimizer terminates. This is useful if, for example, the user
- // wishes to visualize the state of the optimization every
- // iteration.
- bool update_state_every_iteration;
-
- // Callbacks that are executed at the end of each iteration of the
- // Minimizer. An iteration may terminate midway, either due to
- // numerical failures or because one of the convergence tests has
- // been satisfied. In this case none of the callbacks are
- // executed.
-
- // Callbacks are executed in the order that they are specified in
- // this vector. By default, parameter blocks are updated only at
- // the end of the optimization, i.e when the Minimizer
- // terminates. This behaviour is controlled by
- // update_state_every_variable. If the user wishes to have access
- // to the update parameter blocks when his/her callbacks are
- // executed, then set update_state_every_iteration to true.
- //
- // The solver does NOT take ownership of these pointers.
- vector<IterationCallback*> callbacks;
- };
-
- struct CERES_EXPORT Summary {
- Summary();
-
- // A brief one line description of the state of the solver after
- // termination.
- string BriefReport() const;
-
- // A full multiline description of the state of the solver after
- // termination.
- string FullReport() const;
-
- bool IsSolutionUsable() const;
-
- // Minimizer summary -------------------------------------------------
- MinimizerType minimizer_type;
-
- TerminationType termination_type;
-
- // Reason why the solver terminated.
- string message;
-
- // Cost of the problem (value of the objective function) before
- // the optimization.
- double initial_cost;
-
- // Cost of the problem (value of the objective function) after the
- // optimization.
- double final_cost;
-
- // The part of the total cost that comes from residual blocks that
- // were held fixed by the preprocessor because all the parameter
- // blocks that they depend on were fixed.
- double fixed_cost;
-
- // IterationSummary for each minimizer iteration in order.
- vector<IterationSummary> iterations;
-
- // Number of minimizer iterations in which the step was
- // accepted. Unless use_non_monotonic_steps is true this is also
- // the number of steps in which the objective function value/cost
- // went down.
- int num_successful_steps;
-
- // Number of minimizer iterations in which the step was rejected
- // either because it did not reduce the cost enough or the step
- // was not numerically valid.
- int num_unsuccessful_steps;
-
- // Number of times inner iterations were performed.
- int num_inner_iteration_steps;
-
- // All times reported below are wall times.
-
- // When the user calls Solve, before the actual optimization
- // occurs, Ceres performs a number of preprocessing steps. These
- // include error checks, memory allocations, and reorderings. This
- // time is accounted for as preprocessing time.
- double preprocessor_time_in_seconds;
-
- // Time spent in the TrustRegionMinimizer.
- double minimizer_time_in_seconds;
-
- // After the Minimizer is finished, some time is spent in
- // re-evaluating residuals etc. This time is accounted for in the
- // postprocessor time.
- double postprocessor_time_in_seconds;
-
- // Some total of all time spent inside Ceres when Solve is called.
- double total_time_in_seconds;
-
- // Time (in seconds) spent in the linear solver computing the
- // trust region step.
- double linear_solver_time_in_seconds;
-
- // Time (in seconds) spent evaluating the residual vector.
- double residual_evaluation_time_in_seconds;
-
- // Time (in seconds) spent evaluating the jacobian matrix.
- double jacobian_evaluation_time_in_seconds;
-
- // Time (in seconds) spent doing inner iterations.
- double inner_iteration_time_in_seconds;
-
- // Number of parameter blocks in the problem.
- int num_parameter_blocks;
-
- // Number of parameters in the probem.
- int num_parameters;
-
- // Dimension of the tangent space of the problem (or the number of
- // columns in the Jacobian for the problem). This is different
- // from num_parameters if a parameter block is associated with a
- // LocalParameterization
- int num_effective_parameters;
-
- // Number of residual blocks in the problem.
- int num_residual_blocks;
-
- // Number of residuals in the problem.
- int num_residuals;
-
- // Number of parameter blocks in the problem after the inactive
- // and constant parameter blocks have been removed. A parameter
- // block is inactive if no residual block refers to it.
- int num_parameter_blocks_reduced;
-
- // Number of parameters in the reduced problem.
- int num_parameters_reduced;
-
- // Dimension of the tangent space of the reduced problem (or the
- // number of columns in the Jacobian for the reduced
- // problem). This is different from num_parameters_reduced if a
- // parameter block in the reduced problem is associated with a
- // LocalParameterization.
- int num_effective_parameters_reduced;
-
- // Number of residual blocks in the reduced problem.
- int num_residual_blocks_reduced;
-
- // Number of residuals in the reduced problem.
- int num_residuals_reduced;
-
- // Number of threads specified by the user for Jacobian and
- // residual evaluation.
- int num_threads_given;
-
- // Number of threads actually used by the solver for Jacobian and
- // residual evaluation. This number is not equal to
- // num_threads_given if OpenMP is not available.
- int num_threads_used;
-
- // Number of threads specified by the user for solving the trust
- // region problem.
- int num_linear_solver_threads_given;
-
- // Number of threads actually used by the solver for solving the
- // trust region problem. This number is not equal to
- // num_threads_given if OpenMP is not available.
- int num_linear_solver_threads_used;
-
- // Type of the linear solver requested by the user.
- LinearSolverType linear_solver_type_given;
-
- // Type of the linear solver actually used. This may be different
- // from linear_solver_type_given if Ceres determines that the
- // problem structure is not compatible with the linear solver
- // requested or if the linear solver requested by the user is not
- // available, e.g. The user requested SPARSE_NORMAL_CHOLESKY but
- // no sparse linear algebra library was available.
- LinearSolverType linear_solver_type_used;
-
- // Size of the elimination groups given by the user as hints to
- // the linear solver.
- vector<int> linear_solver_ordering_given;
-
- // Size of the parameter groups used by the solver when ordering
- // the columns of the Jacobian. This maybe different from
- // linear_solver_ordering_given if the user left
- // linear_solver_ordering_given blank and asked for an automatic
- // ordering, or if the problem contains some constant or inactive
- // parameter blocks.
- vector<int> linear_solver_ordering_used;
-
- // True if the user asked for inner iterations to be used as part
- // of the optimization.
- bool inner_iterations_given;
-
- // True if the user asked for inner iterations to be used as part
- // of the optimization and the problem structure was such that
- // they were actually performed. e.g., in a problem with just one
- // parameter block, inner iterations are not performed.
- bool inner_iterations_used;
-
- // Size of the parameter groups given by the user for performing
- // inner iterations.
- vector<int> inner_iteration_ordering_given;
-
- // Size of the parameter groups given used by the solver for
- // performing inner iterations. This maybe different from
- // inner_iteration_ordering_given if the user left
- // inner_iteration_ordering_given blank and asked for an automatic
- // ordering, or if the problem contains some constant or inactive
- // parameter blocks.
- vector<int> inner_iteration_ordering_used;
-
- // Type of the preconditioner requested by the user.
- PreconditionerType preconditioner_type_given;
-
- // Type of the preconditioner actually used. This may be different
- // from linear_solver_type_given if Ceres determines that the
- // problem structure is not compatible with the linear solver
- // requested or if the linear solver requested by the user is not
- // available.
- PreconditionerType preconditioner_type_used;
-
- // Type of clustering algorithm used for visibility based
- // preconditioning. Only meaningful when the preconditioner_type
- // is CLUSTER_JACOBI or CLUSTER_TRIDIAGONAL.
- VisibilityClusteringType visibility_clustering_type;
-
- // Type of trust region strategy.
- TrustRegionStrategyType trust_region_strategy_type;
-
- // Type of dogleg strategy used for solving the trust region
- // problem.
- DoglegType dogleg_type;
-
- // Type of the dense linear algebra library used.
- DenseLinearAlgebraLibraryType dense_linear_algebra_library_type;
-
- // Type of the sparse linear algebra library used.
- SparseLinearAlgebraLibraryType sparse_linear_algebra_library_type;
-
- // Type of line search direction used.
- LineSearchDirectionType line_search_direction_type;
-
- // Type of the line search algorithm used.
- LineSearchType line_search_type;
-
- // When performing line search, the degree of the polynomial used
- // to approximate the objective function.
- LineSearchInterpolationType line_search_interpolation_type;
-
- // If the line search direction is NONLINEAR_CONJUGATE_GRADIENT,
- // then this indicates the particular variant of non-linear
- // conjugate gradient used.
- NonlinearConjugateGradientType nonlinear_conjugate_gradient_type;
-
- // If the type of the line search direction is LBFGS, then this
- // indicates the rank of the Hessian approximation.
- int max_lbfgs_rank;
- };
-
- // Once a least squares problem has been built, this function takes
- // the problem and optimizes it based on the values of the options
- // parameters. Upon return, a detailed summary of the work performed
- // by the preprocessor, the non-linear minmizer and the linear
- // solver are reported in the summary object.
- virtual void Solve(const Options& options,
- Problem* problem,
- Solver::Summary* summary);
-};
-
-// Helper function which avoids going through the interface.
-CERES_EXPORT void Solve(const Solver::Options& options,
- Problem* problem,
- Solver::Summary* summary);
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_SOLVER_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/types.h b/extern/libmv/third_party/ceres/include/ceres/types.h
deleted file mode 100644
index a07c8933e64..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/types.h
+++ /dev/null
@@ -1,487 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// Enums and other top level class definitions.
-//
-// Note: internal/types.cc defines stringification routines for some
-// of these enums. Please update those routines if you extend or
-// remove enums from here.
-
-#ifndef CERES_PUBLIC_TYPES_H_
-#define CERES_PUBLIC_TYPES_H_
-
-#include <string>
-
-#include "ceres/internal/port.h"
-#include "ceres/internal/disable_warnings.h"
-
-namespace ceres {
-
-// Basic integer types. These typedefs are in the Ceres namespace to avoid
-// conflicts with other packages having similar typedefs.
-typedef int int32;
-
-// Argument type used in interfaces that can optionally take ownership
-// of a passed in argument. If TAKE_OWNERSHIP is passed, the called
-// object takes ownership of the pointer argument, and will call
-// delete on it upon completion.
-enum Ownership {
- DO_NOT_TAKE_OWNERSHIP,
- TAKE_OWNERSHIP
-};
-
-// TODO(keir): Considerably expand the explanations of each solver type.
-enum LinearSolverType {
- // These solvers are for general rectangular systems formed from the
- // normal equations A'A x = A'b. They are direct solvers and do not
- // assume any special problem structure.
-
- // Solve the normal equations using a dense Cholesky solver; based
- // on Eigen.
- DENSE_NORMAL_CHOLESKY,
-
- // Solve the normal equations using a dense QR solver; based on
- // Eigen.
- DENSE_QR,
-
- // Solve the normal equations using a sparse cholesky solver; requires
- // SuiteSparse or CXSparse.
- SPARSE_NORMAL_CHOLESKY,
-
- // Specialized solvers, specific to problems with a generalized
- // bi-partitite structure.
-
- // Solves the reduced linear system using a dense Cholesky solver;
- // based on Eigen.
- DENSE_SCHUR,
-
- // Solves the reduced linear system using a sparse Cholesky solver;
- // based on CHOLMOD.
- SPARSE_SCHUR,
-
- // Solves the reduced linear system using Conjugate Gradients, based
- // on a new Ceres implementation. Suitable for large scale
- // problems.
- ITERATIVE_SCHUR,
-
- // Conjugate gradients on the normal equations.
- CGNR
-};
-
-enum PreconditionerType {
- // Trivial preconditioner - the identity matrix.
- IDENTITY,
-
- // Block diagonal of the Gauss-Newton Hessian.
- JACOBI,
-
- // Note: The following three preconditioners can only be used with
- // the ITERATIVE_SCHUR solver. They are well suited for Structure
- // from Motion problems.
-
- // Block diagonal of the Schur complement. This preconditioner may
- // only be used with the ITERATIVE_SCHUR solver.
- SCHUR_JACOBI,
-
- // Visibility clustering based preconditioners.
- //
- // The following two preconditioners use the visibility structure of
- // the scene to determine the sparsity structure of the
- // preconditioner. This is done using a clustering algorithm. The
- // available visibility clustering algorithms are described below.
- //
- // Note: Requires SuiteSparse.
- CLUSTER_JACOBI,
- CLUSTER_TRIDIAGONAL
-};
-
-enum VisibilityClusteringType {
- // Canonical views algorithm as described in
- //
- // "Scene Summarization for Online Image Collections", Ian Simon, Noah
- // Snavely, Steven M. Seitz, ICCV 2007.
- //
- // This clustering algorithm can be quite slow, but gives high
- // quality clusters. The original visibility based clustering paper
- // used this algorithm.
- CANONICAL_VIEWS,
-
- // The classic single linkage algorithm. It is extremely fast as
- // compared to CANONICAL_VIEWS, but can give slightly poorer
- // results. For problems with large number of cameras though, this
- // is generally a pretty good option.
- //
- // If you are using SCHUR_JACOBI preconditioner and have SuiteSparse
- // available, CLUSTER_JACOBI and CLUSTER_TRIDIAGONAL in combination
- // with the SINGLE_LINKAGE algorithm will generally give better
- // results.
- SINGLE_LINKAGE
-};
-
-enum SparseLinearAlgebraLibraryType {
- // High performance sparse Cholesky factorization and approximate
- // minimum degree ordering.
- SUITE_SPARSE,
-
- // A lightweight replacment for SuiteSparse, which does not require
- // a LAPACK/BLAS implementation. Consequently, its performance is
- // also a bit lower than SuiteSparse.
- CX_SPARSE,
-
- // Eigen's sparse linear algebra routines. In particular Ceres uses
- // the Simplicial LDLT routines.
- EIGEN_SPARSE
-};
-
-enum DenseLinearAlgebraLibraryType {
- EIGEN,
- LAPACK
-};
-
-// Logging options
-// The options get progressively noisier.
-enum LoggingType {
- SILENT,
- PER_MINIMIZER_ITERATION
-};
-
-enum MinimizerType {
- LINE_SEARCH,
- TRUST_REGION
-};
-
-enum LineSearchDirectionType {
- // Negative of the gradient.
- STEEPEST_DESCENT,
-
- // A generalization of the Conjugate Gradient method to non-linear
- // functions. The generalization can be performed in a number of
- // different ways, resulting in a variety of search directions. The
- // precise choice of the non-linear conjugate gradient algorithm
- // used is determined by NonlinerConjuateGradientType.
- NONLINEAR_CONJUGATE_GRADIENT,
-
- // BFGS, and it's limited memory approximation L-BFGS, are quasi-Newton
- // algorithms that approximate the Hessian matrix by iteratively refining
- // an initial estimate with rank-one updates using the gradient at each
- // iteration. They are a generalisation of the Secant method and satisfy
- // the Secant equation. The Secant equation has an infinium of solutions
- // in multiple dimensions, as there are N*(N+1)/2 degrees of freedom in a
- // symmetric matrix but only N conditions are specified by the Secant
- // equation. The requirement that the Hessian approximation be positive
- // definite imposes another N additional constraints, but that still leaves
- // remaining degrees-of-freedom. (L)BFGS methods uniquely deteremine the
- // approximate Hessian by imposing the additional constraints that the
- // approximation at the next iteration must be the 'closest' to the current
- // approximation (the nature of how this proximity is measured is actually
- // the defining difference between a family of quasi-Newton methods including
- // (L)BFGS & DFP). (L)BFGS is currently regarded as being the best known
- // general quasi-Newton method.
- //
- // The principal difference between BFGS and L-BFGS is that whilst BFGS
- // maintains a full, dense approximation to the (inverse) Hessian, L-BFGS
- // maintains only a window of the last M observations of the parameters and
- // gradients. Using this observation history, the calculation of the next
- // search direction can be computed without requiring the construction of the
- // full dense inverse Hessian approximation. This is particularly important
- // for problems with a large number of parameters, where storage of an N-by-N
- // matrix in memory would be prohibitive.
- //
- // For more details on BFGS see:
- //
- // Broyden, C.G., "The Convergence of a Class of Double-rank Minimization
- // Algorithms,"; J. Inst. Maths. Applics., Vol. 6, pp 76–90, 1970.
- //
- // Fletcher, R., "A New Approach to Variable Metric Algorithms,"
- // Computer Journal, Vol. 13, pp 317–322, 1970.
- //
- // Goldfarb, D., "A Family of Variable Metric Updates Derived by Variational
- // Means," Mathematics of Computing, Vol. 24, pp 23–26, 1970.
- //
- // Shanno, D.F., "Conditioning of Quasi-Newton Methods for Function
- // Minimization," Mathematics of Computing, Vol. 24, pp 647–656, 1970.
- //
- // For more details on L-BFGS see:
- //
- // Nocedal, J. (1980). "Updating Quasi-Newton Matrices with Limited
- // Storage". Mathematics of Computation 35 (151): 773–782.
- //
- // Byrd, R. H.; Nocedal, J.; Schnabel, R. B. (1994).
- // "Representations of Quasi-Newton Matrices and their use in
- // Limited Memory Methods". Mathematical Programming 63 (4):
- // 129–156.
- //
- // A general reference for both methods:
- //
- // Nocedal J., Wright S., Numerical Optimization, 2nd Ed. Springer, 1999.
- LBFGS,
- BFGS,
-};
-
-// Nonliner conjugate gradient methods are a generalization of the
-// method of Conjugate Gradients for linear systems. The
-// generalization can be carried out in a number of different ways
-// leading to number of different rules for computing the search
-// direction. Ceres provides a number of different variants. For more
-// details see Numerical Optimization by Nocedal & Wright.
-enum NonlinearConjugateGradientType {
- FLETCHER_REEVES,
- POLAK_RIBIERE,
- HESTENES_STIEFEL,
-};
-
-enum LineSearchType {
- // Backtracking line search with polynomial interpolation or
- // bisection.
- ARMIJO,
- WOLFE,
-};
-
-// Ceres supports different strategies for computing the trust region
-// step.
-enum TrustRegionStrategyType {
- // The default trust region strategy is to use the step computation
- // used in the Levenberg-Marquardt algorithm. For more details see
- // levenberg_marquardt_strategy.h
- LEVENBERG_MARQUARDT,
-
- // Powell's dogleg algorithm interpolates between the Cauchy point
- // and the Gauss-Newton step. It is particularly useful if the
- // LEVENBERG_MARQUARDT algorithm is making a large number of
- // unsuccessful steps. For more details see dogleg_strategy.h.
- //
- // NOTES:
- //
- // 1. This strategy has not been experimented with or tested as
- // extensively as LEVENBERG_MARQUARDT, and therefore it should be
- // considered EXPERIMENTAL for now.
- //
- // 2. For now this strategy should only be used with exact
- // factorization based linear solvers, i.e., SPARSE_SCHUR,
- // DENSE_SCHUR, DENSE_QR and SPARSE_NORMAL_CHOLESKY.
- DOGLEG
-};
-
-// Ceres supports two different dogleg strategies.
-// The "traditional" dogleg method by Powell and the
-// "subspace" method described in
-// R. H. Byrd, R. B. Schnabel, and G. A. Shultz,
-// "Approximate solution of the trust region problem by minimization
-// over two-dimensional subspaces", Mathematical Programming,
-// 40 (1988), pp. 247--263
-enum DoglegType {
- // The traditional approach constructs a dogleg path
- // consisting of two line segments and finds the furthest
- // point on that path that is still inside the trust region.
- TRADITIONAL_DOGLEG,
-
- // The subspace approach finds the exact minimum of the model
- // constrained to the subspace spanned by the dogleg path.
- SUBSPACE_DOGLEG
-};
-
-enum TerminationType {
- // Minimizer terminated because one of the convergence criterion set
- // by the user was satisfied.
- //
- // 1. (new_cost - old_cost) < function_tolerance * old_cost;
- // 2. max_i |gradient_i| < gradient_tolerance
- // 3. |step|_2 <= parameter_tolerance * ( |x|_2 + parameter_tolerance)
- //
- // The user's parameter blocks will be updated with the solution.
- CONVERGENCE,
-
- // The solver ran for maximum number of iterations or maximum amount
- // of time specified by the user, but none of the convergence
- // criterion specified by the user were met. The user's parameter
- // blocks will be updated with the solution found so far.
- NO_CONVERGENCE,
-
- // The minimizer terminated because of an error. The user's
- // parameter blocks will not be updated.
- FAILURE,
-
- // Using an IterationCallback object, user code can control the
- // minimizer. The following enums indicate that the user code was
- // responsible for termination.
- //
- // Minimizer terminated successfully because a user
- // IterationCallback returned SOLVER_TERMINATE_SUCCESSFULLY.
- //
- // The user's parameter blocks will be updated with the solution.
- USER_SUCCESS,
-
- // Minimizer terminated because because a user IterationCallback
- // returned SOLVER_ABORT.
- //
- // The user's parameter blocks will not be updated.
- USER_FAILURE
-};
-
-// Enums used by the IterationCallback instances to indicate to the
-// solver whether it should continue solving, the user detected an
-// error or the solution is good enough and the solver should
-// terminate.
-enum CallbackReturnType {
- // Continue solving to next iteration.
- SOLVER_CONTINUE,
-
- // Terminate solver, and do not update the parameter blocks upon
- // return. Unless the user has set
- // Solver:Options:::update_state_every_iteration, in which case the
- // state would have been updated every iteration
- // anyways. Solver::Summary::termination_type is set to USER_ABORT.
- SOLVER_ABORT,
-
- // Terminate solver, update state and
- // return. Solver::Summary::termination_type is set to USER_SUCCESS.
- SOLVER_TERMINATE_SUCCESSFULLY
-};
-
-// The format in which linear least squares problems should be logged
-// when Solver::Options::lsqp_iterations_to_dump is non-empty.
-enum DumpFormatType {
- // Print the linear least squares problem in a human readable format
- // to stderr. The Jacobian is printed as a dense matrix. The vectors
- // D, x and f are printed as dense vectors. This should only be used
- // for small problems.
- CONSOLE,
-
- // Write out the linear least squares problem to the directory
- // pointed to by Solver::Options::lsqp_dump_directory as text files
- // which can be read into MATLAB/Octave. The Jacobian is dumped as a
- // text file containing (i,j,s) triplets, the vectors D, x and f are
- // dumped as text files containing a list of their values.
- //
- // A MATLAB/octave script called lm_iteration_???.m is also output,
- // which can be used to parse and load the problem into memory.
- TEXTFILE
-};
-
-// For SizedCostFunction and AutoDiffCostFunction, DYNAMIC can be
-// specified for the number of residuals. If specified, then the
-// number of residuas for that cost function can vary at runtime.
-enum DimensionType {
- DYNAMIC = -1
-};
-
-enum NumericDiffMethod {
- CENTRAL,
- FORWARD
-};
-
-enum LineSearchInterpolationType {
- BISECTION,
- QUADRATIC,
- CUBIC
-};
-
-enum CovarianceAlgorithmType {
- DENSE_SVD,
- SUITE_SPARSE_QR,
- EIGEN_SPARSE_QR
-};
-
-CERES_EXPORT const char* LinearSolverTypeToString(
- LinearSolverType type);
-CERES_EXPORT bool StringToLinearSolverType(string value,
- LinearSolverType* type);
-
-CERES_EXPORT const char* PreconditionerTypeToString(PreconditionerType type);
-CERES_EXPORT bool StringToPreconditionerType(string value,
- PreconditionerType* type);
-
-CERES_EXPORT const char* VisibilityClusteringTypeToString(
- VisibilityClusteringType type);
-CERES_EXPORT bool StringToVisibilityClusteringType(string value,
- VisibilityClusteringType* type);
-
-CERES_EXPORT const char* SparseLinearAlgebraLibraryTypeToString(
- SparseLinearAlgebraLibraryType type);
-CERES_EXPORT bool StringToSparseLinearAlgebraLibraryType(
- string value,
- SparseLinearAlgebraLibraryType* type);
-
-CERES_EXPORT const char* DenseLinearAlgebraLibraryTypeToString(
- DenseLinearAlgebraLibraryType type);
-CERES_EXPORT bool StringToDenseLinearAlgebraLibraryType(
- string value,
- DenseLinearAlgebraLibraryType* type);
-
-CERES_EXPORT const char* TrustRegionStrategyTypeToString(
- TrustRegionStrategyType type);
-CERES_EXPORT bool StringToTrustRegionStrategyType(string value,
- TrustRegionStrategyType* type);
-
-CERES_EXPORT const char* DoglegTypeToString(DoglegType type);
-CERES_EXPORT bool StringToDoglegType(string value, DoglegType* type);
-
-CERES_EXPORT const char* MinimizerTypeToString(MinimizerType type);
-CERES_EXPORT bool StringToMinimizerType(string value, MinimizerType* type);
-
-CERES_EXPORT const char* LineSearchDirectionTypeToString(
- LineSearchDirectionType type);
-CERES_EXPORT bool StringToLineSearchDirectionType(string value,
- LineSearchDirectionType* type);
-
-CERES_EXPORT const char* LineSearchTypeToString(LineSearchType type);
-CERES_EXPORT bool StringToLineSearchType(string value, LineSearchType* type);
-
-CERES_EXPORT const char* NonlinearConjugateGradientTypeToString(
- NonlinearConjugateGradientType type);
-CERES_EXPORT bool StringToNonlinearConjugateGradientType(
- string value,
- NonlinearConjugateGradientType* type);
-
-CERES_EXPORT const char* LineSearchInterpolationTypeToString(
- LineSearchInterpolationType type);
-CERES_EXPORT bool StringToLineSearchInterpolationType(
- string value,
- LineSearchInterpolationType* type);
-
-CERES_EXPORT const char* CovarianceAlgorithmTypeToString(
- CovarianceAlgorithmType type);
-CERES_EXPORT bool StringToCovarianceAlgorithmType(
- string value,
- CovarianceAlgorithmType* type);
-
-CERES_EXPORT const char* TerminationTypeToString(TerminationType type);
-
-CERES_EXPORT bool IsSchurType(LinearSolverType type);
-CERES_EXPORT bool IsSparseLinearAlgebraLibraryTypeAvailable(
- SparseLinearAlgebraLibraryType type);
-CERES_EXPORT bool IsDenseLinearAlgebraLibraryTypeAvailable(
- DenseLinearAlgebraLibraryType type);
-
-} // namespace ceres
-
-#include "ceres/internal/reenable_warnings.h"
-
-#endif // CERES_PUBLIC_TYPES_H_
diff --git a/extern/libmv/third_party/ceres/include/ceres/version.h b/extern/libmv/third_party/ceres/include/ceres/version.h
deleted file mode 100644
index 370b08af73e..00000000000
--- a/extern/libmv/third_party/ceres/include/ceres/version.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2014 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mierle@gmail.com (Keir Mierle)
-
-#ifndef CERES_PUBLIC_VERSION_H_
-#define CERES_PUBLIC_VERSION_H_
-
-#define CERES_VERSION_MAJOR 1
-#define CERES_VERSION_MINOR 10
-#define CERES_VERSION_REVISION 0
-#define CERES_VERSION_ABI 1
-
-// Classic CPP stringifcation; the extra level of indirection allows the
-// preprocessor to expand the macro before being converted to a string.
-#define CERES_TO_STRING_HELPER(x) #x
-#define CERES_TO_STRING(x) CERES_TO_STRING_HELPER(x)
-
-// The Ceres version as a string; for example "1.9.0".
-#define CERES_VERSION_STRING CERES_TO_STRING(CERES_VERSION_MAJOR) "." \
- CERES_TO_STRING(CERES_VERSION_MINOR) "." \
- CERES_TO_STRING(CERES_VERSION_REVISION)
-
-#endif // CERES_PUBLIC_VERSION_H_