This adds a new wrapper class called DynamicCostFunctionToFunctor
that closes a gap in the current API: the existing
CostFunctionToFunctor can only be used with a SizedCostFunction, where
the number and sizes of all parameter vectors are known at compile-time.
The DynamicCostFunctionToFunctor allows you to wrap a generic
CostFunction into a templated functor which can then be used in a
DynamicAutoDiffCostFunction.
Also updates the existing CostFunctionToFunctor class to internally use
DynamicCostFunctionToFunctor.
Change-Id: I088adc3271c58d2519126c27037c3576965a36d6
- CMake 3.0+ prefers the use of @rpath, and CMake 3.2+ produces a
developer warning if this policy is not set, thus if present we
explicitly specify the new default behaviour.
- http://www.cmake.org/cmake/help/v3.2/policy/CMP0042.html
- Also remove unnecessary check for presence of cmake_policy(), as it
exists in all versions of CMake >= 2.8 (our minimum required version).
Change-Id: Iacbf8186bee4bf07d8a53068fd528cd6237c5efb
Before this change, the default step size
for a function F(x) at x was
step_size = |x| * relative_step_size
if step_size was exactly zero, then to prevent
division by zero we would fall back to relative_step_size.
This however is not good enough, as values of x say 1e-64
would lead to step sizes ~ 1e-70 and dividing by such numbers
leads to inaccurate results. For even smaller numbers, like
1e-300, which I have observed can occur as the optimization
algorithm makes progress, this leads to NaNs.
The key change in this CL is to change the fallback mechanism
to be
step_size = max(|x| * relative_step_size, min_step_size)
where
min_step_size = sqrt(DBL_EPSILON)
This is the recommended minimum value for the step size
for double precision arithmetic on the interwebs.
This results in a small loss of precision in the transcendental
functions test, but that is unavoidable as we are not taking
sufficiently small steps anymore.
On the whole though this will improve the numerical performance
of the algorithm.
To validate this approach, one of the parameter values for the
EasyFunctorTest has been set to 1e-64, which causes the test
to start failing without the corrected fallback logic.
This change should also address some if not all of
https://github.com/ceres-solver/ceres-solver/issues/121
Change-Id: I4a9013ef358626c1ba7b8abad60b3904163d63f6
The test makes sure the Rosenbrock function is correctly minimized from the
canonical starting point using the default settings.
Change-Id: Iea820f976707bde37162981c5db87fac5167ba9e
I think this is all of the cases. These cases arise because pow(a,b) is limited
to real valued results, if the argument and result were complex valued then
these cases would disappear.
NOTE: Since there is so much special casing here, it is worth checking to see
if cpow() is implemented in terms of pow(), and what might be the consequences
of using cpow() on the type std::complex<Jet<double, N> >. It is *possible*
that a separate implementation of cpow might be required also.
Also some comment fixes.
Change-Id: Ia1e38df4cdcb548f778304c2854cacba6e1556ff
- Include example use of new find_dependency() macro in CMake 3.x to
find dependencies in <Project>Config.cmake files.
- Also fix typo in NNLS modeling docs.
Change-Id: Ie9862b69c0451ee8775826f2957f5e182d937439
The code seemed to imply that its possible to call the Write
method with a null pointer which is never the case. There would
be no point to calling Write.
Thanks to Michael Vitus for pointing this out.
Change-Id: Ic9a276856d0a7e65d53a1cc8742d4831c1a52615
Eigen upstream was broken a little while ago, and it seemed to be
the case that we needed a fix for using the LLT factorization on
ARM.
This has been fixed and AFAIK there are no stable eigen releases
with this bug in it.
For full gore, see
http://eigen.tuxfamily.org/bz/show_bug.cgi?id=992
In light of the fix, the extra layer of indirection introduced earlier
is not needed and we are reverting to normal programming.
Change-Id: I16929d2145253b38339b573b27b6b8fabd523704
- A lot of users find the CMake package installation process confusing,
particularly the use of imported targets when exporting their own
projects which use Ceres.
- This patch adds a brief description of the overall process and the
main bear-trap users are ensnared by.
Change-Id: I44c022bbd18a393868bf88ea9ddd807c5e08abc9
The call to llt in backsubstitute seems to be using one
of the fixed size specializations which is best done with
an inline call to llt/ldlt rather than introducing yet another
variant of the SolverUpperTriangularUsingCholesky and calling it.
Also change the way SolverUpperTriangularUsingCholesky handles
error. It always computes the solution even if it is garbage
and then returns the error code.
This ensures that the previous code that depends on unconditional
computation still works.
Change-Id: Idb1e6efdae9a3775a072e3b87cde02e0bbddb319
When solving a linear system using Eigen's dense Cholesky factorization
if the right hand side of the linear system is the same vector
that will store the solution, call solveInPlace instead of solve.
Change-Id: I3e6d2f21ff420c25217cd87ee5d269fdfabbf19a
CERES_EIGEN_VERSION was being defined by the CMakeList.txt file
but it is needed by the android build too. So this change
directly constructs the CERES_EIGEN_VERSION string out of the
raw Eigen version numbers.
Change-Id: I65309805a59076c3082141d9042ab7e0e1b972bc
It seems that Eigen's LLT factorization is broken on ARM.
This patch enables the use of LDLT factorization instead of LLT
factorization. The switch is controlled at compile time using a
preprocessor define - CERES_USE_EIGEN_LDLT.
By default we continue to use LLT factorization though.
To make the switching easier without introducing the Cholesky factorization
based inversion and linear system solve routines have been abstracted into
two new functions.
Android.mk has been updated to enable the LDLT factorization, but
the cmake file has not been updated as I will leave it to Alex's
capable hands to do proper detection of ARM as a target platform.
Change-Id: Iffe3abd2ce894de2a388b454df3da909b482d5e5
- Previously, if Ceres was already installed to the same location as one
of the depenedencies (e.g. /usr/local) then as the BUILD_DIR/config
path was necessarily added to the include_directories() list *after*
the INCLUDE_DIRS for the dependencies, the config.h for the
*installed* version of Ceres would be used instead of the locally
configured version, as it would appear first on the path.
- Forcing the location of the locally configured config.h to the front
of the include_directories() list ensures that it is found first
(and is thus used) even if an installed version of Ceres also exists
on the path.
Change-Id: I7b4f97a3ad0120bd11551f9b8eb6bffc66966eb4
- On MSVC, a Ceres dependency such as glog, may be named glog.lib, or
libglog.lib. By default, CMake assumes no prefix for libraries on
MSVC when using find_library(), thus find_library(glog) would fail
if glog was named libglog.lib.
- This patch caches & updates CMAKE_FIND_LIBRARY_PREFIXES in all of
Ceres' find_package scripts to include lib & "" (no prefix) on MSVC
and then returns CMAKE_FIND_LIBRARY_PREFIXES to its original state
before returning.
Change-Id: Ic82799e3b786cfb7228a51183bc189578b072bbe
- MinGW produces code that segfaults when performing matrix
multiplications in Eigen when compiled with -O3 (see below), as such
force the use of -O2 which works.
- http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556
Change-Id: I420e965d5033944374a5cc93490546c25e46bce5
- Previous tolerance of 2.0 * std::numeric_limits<double>::epsilon()
was too tight for Cygwin, worked on all other known platforms.
Change-Id: Ia79ad8961272dbb608d8e8ddd3f6d52e5f0735f4
In cmake 3.0, it is required to use full path for compilers. And it
seems like there's no need to force the compiler. Instead we can just
use set(CMAKE_C_COMPIER clang) so that we don't need to specify full
path of clang and clang++.
Change-Id: I9f6a625068e9d37a4bf5a595bafd82cbc13fdde4
- Add missing gflags threading dependency.
- Also add optional gflags Shlwapi dependency on Windows.
- Add check_cxx_source_compiles() with CMAKE_BUILD_TYPE to fix
namespace test builds on Windows with NMake generators.
- Add namespace regex on gflags.h when check_cxx_source_compiles()
fails on Windows using Visual Studio generator.
Change-Id: I6570c566e5a29c665d621a54935c16d16bac7117
1. Add documentation for cubic_interpolation.h
2. Remove the list of publications. It is an incomplete list which is
a pain to maintain.
3. Add a note about the interaction between manifolds and
NumericDiffCostFunction.
4. Fix some of the comments in cubic_interpolation.h to better reflect reality.
5. Updated the version history.
Change-Id: I0b4a5a6f3361d3fc85f1b4aec685cd80540934f1