Commit Graph

592 Commits

Author SHA1 Message Date
Simon Rutishauser dfb201220c Make miniglog threadsafe on non-windows system by using
localtime_r() instead of localtime() for time formatting

Change-Id: Ib8006c685cd8ed4f374893bef56c4061ca2c9747
2015-10-15 09:44:53 +02:00
Alex Stewart 41455566ac Remove link-time optimisation (LTO).
- On GCC 4.9+ although GCC supports LTO, it requires use of the
  non-default gcc-ar & gcc-ranlib.  Whilst we can ensure Ceres is
  compiled with these, doing so with GCC 4.9 causes multiple definition
  linker errors of static ints inside Eigen when compiling the tests
  and examples when they are not also built with LTO.
- On OS X (Xcode 6 & 7) after the latest update to gtest, if LTO
  is used when compiling the tests (& examples), two tests fail
  due to typeinfo::operator== (things are fine if only Ceres itself is
  compiled with LTO).
- This patch disables LTO for all compilers. It should be revisited when
  the performance is more stable across our supported compilers.

Change-Id: I17b52957faefbdeff0aa40846dc9b342db1b02e3
2015-10-05 18:54:11 +01:00
Alex Stewart 89c40005bf Only use LTO when compiling Ceres itself, not tests or examples.
- If Ceres is built as a shared library, and LTO is enabled for Ceres
  and the tests, then type_info::operator==() incorrectly returns false
  in gtests' CheckedDowncastToActualType() in the following tests:
-- levenberg_marquardt_strategy_test.
-- gradient_checking_cost_function_test.
  on at least Xcode 6 & 7 as reported here:
  https://github.com/google/googletest/issues/595.
- This does not appear to be a gtest issue, but is perhaps an LLVM bug
  or an RTTI shared library issue.  Either way, disabling the use of
  LTO when compiling the test application resolves the issue.
- Allow LTO to be enabled for GCC, if it is supported.
- Add CMake function to allow easy appending to target properties s/t
  Ceres library-specific compile flags can be iteratively constructed.

Change-Id: I923e6aae4f7cefa098cf32b2f8fc19389e7918c9
2015-09-28 15:08:39 +01:00
Alex Stewart 26cd5326a1 Add gtest-specific flags when building/using as a shared library.
- Currently these flags are only used to define the relevant DLL export
  prefix for Windows.

Change-Id: I0c05207b512cb4a985390aefc779b91febdabb38
2015-09-21 10:16:01 +01:00
Sameer Agarwal 155765bbb3 Import the latest version of gtest and gmock.
Change-Id: I4b686c44bba823cab1dae40efa99e31340d2b52a
2015-09-16 19:23:43 +00:00
Sameer Agarwal f4b768b69a Lint changes from William Rucklidge
Change-Id: I0dac2549a8fa2bfd12f745a8d8a0db623b7ec1ac
2015-09-14 13:53:24 -07:00
Sameer Agarwal 5f2f05c726 Refactor system_test
1. Move common test infrastructure into test_util.
2. system_test now only contains powells function.
3. Add bundle_adjustment_test.

Instead of a single function which computes everything,
there is now a test for each solver configuration which
uses the reference solution computed by the fixture.

Change-Id: I16a9a9a83a845a7aaf28762bcecf1a8ff5aee805
2015-09-12 15:41:05 -07:00
Alex Stewart 1936d47e21 Revert increased inline threshold (iff Clang) to exported Ceres target.
- Increasing the inline threshold results in very variable performance
  improvements, and could potentially confuse users if they are trying
  to set the inline threshold themselves.
- As such, we no longer export our inline threshold configuration for
  Clang, but instead document how to change it in the FAQs.

Change-Id: I88e2e0001e4586ba2718535845ed1e4b1a5b72bc
2015-09-08 23:27:42 +01:00
Sameer Agarwal 1ac3dd223c Fix a bug in CompressedRowSparseMatrix::AppendRows
The test for CompressedRowSparseMatrix::AppendRows tries to add
a matrix of size zero, which results in an invalid pointer deferencing
even though that pointer is never written to.

Change-Id: I97dba37082bd5dad242ae1af0447a9178cd92027
2015-09-05 15:56:14 -07:00
Sameer Agarwal 5742b7d0f1 Improve performance of SPARSE_NORMAL_CHOLESKY + dynamic_sparsity
The outer product computation logic in SparseNormalCholeskySolver
does not work well with dynamic sparsity. The overhead of computing
the sparsity pattern of the normal equations is only amortized if
the sparsity is constant. If the sparsity can change from call to call
SparseNormalCholeskySolver will actually be more expensive.

For Eigen and for CXSparse we now explicitly compute the normal
equations using their respective matrix-matrix product routines and solve.
Change-Id: Ifbd8ed78987cdf71640e66ed69500442526a23d4
2015-09-05 14:31:52 -07:00
Keir Mierle d0b6cf657d Fix incorrect detect structure test
Change-Id: I7062f3639147c40b57947790d3b18331a39a366b
2015-09-04 18:43:41 -07:00
Alex Stewart 0e8264cc47 Add increased inline threshold (iff Clang) to exported Ceres target.
- When compiled with Clang, Ceres and all of the examples are compiled
  with an increased inlining-threshold, as the default value can result
  in poor Eigen performance.
- Previously, client code using Ceres would typically not use an
  increased inlining-threshold (unless the user has specifically added
  it themselves).  However, increasing the inlining threshold can result
  in significant performance improvements in auto-diffed CostFunctions.
- This patch adds the inlining-threshold flags to the interface flags
  for the Ceres CMake target s/t any client code using Ceres (via
  CMake), and compiled with Clang, will now be compiled with the same
  increased inlining threshold as used by Ceres itself.

Change-Id: I31e8f1abfda140d22e85bb48aa57f028a68a415e
2015-09-02 19:37:01 +01:00
Tal Ben-Nun 4f049db7c2 Adaptive numeric differentiation using Ridders' method.
This method numerically computes function derivatives in different
scales, extrapolating between intermediate results to conserve function
evaluations. Adaptive differentiation is essential to produce accurate
results for functions with noisy derivatives.

Full changelist:
-Created a new type of NumericDiffMethod (RIDDERS).
-Implemented EvaluateRiddersJacobianColumn in NumericDiff.
-Created unit tests with f(x) = x^2 + [random noise] and
 f(x) = exp(x).

Change-Id: I2d6e924d7ff686650272f29a8c981351e6f72091
2015-08-30 14:06:13 +03:00
Sameer Agarwal 070bba4b43 Lint fixes from William Rucklidge
Change-Id: I719e8852859c970091df842e59c44e02e2c65827
2015-08-25 13:37:33 -07:00
Alex Stewart 887a20ca7f Build position independent code when compiling Ceres statically.
- Previously, when Ceres was built as a static library we did not
  compile position independent code.  This means that the resulting
  static library could not be linked against shared libraries, but
  could be used by executables.
- To enable the use of a static Ceres library by other shared libraries
  as reported in [1], the static library must be generated from
  position independent code (except on Windows, where PIC does not
  apply).

[1] https://github.com/Itseez/opencv_contrib/pull/290#issuecomment-130389471

Change-Id: I99388f1784ece688f91b162d009578c5c97ddaf6
2015-08-25 18:29:08 +00:00
Sameer Agarwal 860bba588b Fix a bug in DetectStructure
The logic for determing static/dynamic f-block size in
DetectStructure was broken in a corner case, where the very first
row block which was used to initialize the f_block_size contained
more than one f blocks of varying sizes. The way the if block
was structured, no iteration was performed on the remaining
f-blocks and the loop failed to detect that the f-block size
was actually changing.

If in the remaining row blocks, there were no row blocks
with varying f-block sizes, the function will erroneously
return a static f-block size.

Thanks to Johannes Schonberger for providing a reproduction for this
rather tricky corner case.

Change-Id: Ib442a041d8b7efd29f9653be6a11a69d0eccd1ec
2015-08-25 11:14:10 -07:00
Sergey Sharybin ad2a997777 Fix for reoder program unit test when built without suitesparse
This commit fixes failure of reorder_program_test when Ceres is built without
any suitesparse.

Change-Id: Ia23ae8dfd20c482cb9cd1301f17edf9a34df3235
2015-08-22 11:18:45 +02:00
Sameer Agarwal 4bf3868bec Fix a bug in the Schur eliminator
The schur eliminator treats rows with e blocks and row with
no e blocks separately. The template specialization logic only
applies to the rows with e blocks.

So, in cases where the rows with e-blocks have a fixed size f-block
but the rows without e-blocks have f-blocks of varying sizes,
DetectStructure will return a static f-block size, but we need to be
careful that we do not blindly use that static f-block size everywhere.

This patch fixes a bug where such care was not being taken, where
it was assumed that the static f-block size could be assumed for all
f-block sizes.

A new test is added, which triggers an exception in debug mode. In
release mode this error does not present itself, due to a peculiarity
of the way Eigen works.

Thanks to Werner Trobin for reporting this bug.

Change-Id: I8ae7aabf8eed8c3f9cf74b6c74d632ba44f82581
2015-08-20 23:34:26 -07:00
Sameer Agarwal 1635ce7260 Fix a bug in the reordering code.
When the user provides an ordering which starts at a non-zero group id,
or has gaps in the groups, then CAMD, the algorithm used to reorder
the program can crash or return garbage results.

The solution is to map the ordering into grouping constraints, and then
to re-number the groups to be contiguous using a call to
MapValuesToContiguousRange. This was already done for CAMD based
ordering for Schur type solvers, but was not done for SPARSE_NORMAL_CHOLESKY.

Thanks to Bernhard Zeisl for not only reporting the bug but also
providing a reproduction.

Change-Id: I5cfae222d701dfdb8e1bda7f0b4670a30417aa89
2015-08-19 22:36:51 +00:00
Richard Stebbing a14ec27fb2 Fix SparseNormalCholeskySolver with dynamic sparsity.
The previous implementation incorrectly cached the outer product matrix
pattern even when `dynamic_sparsity = true`.

Change-Id: I1e58315a9b44f2f457d07c56b203ab2668bfb8a2
2015-08-09 23:07:39 +00:00
Alex Stewart cc8d47aabb Update all CMake to lowercase function name style.
- Updated to new CMake style where function names are all lowercase,
  this will be backwards compatible as CMake function names are
  case insensitive.
- Updated using Emacs' M-x unscreamify-cmake-buffer.

Change-Id: If7219816f560270e59212813aeb021353a64a0e2
2015-08-09 15:18:42 +01:00
Sameer Agarwal 560940fa27 A refactor of the cubic interpolation code
1. Push the boundary handling logic into the underlying array
object. This has two very significant impacts:

a. The interpolation code becomes extremely simple to write
and to test.

b. The user has more flexibility in implementing how out of bounds
values are handled. We provide one default implementation.

Change-Id: Ic2f6cf9257ce7110c62e492688e5a6c8be1e7df2
2015-08-06 14:49:55 -07:00
Sameer Agarwal 7444f23ae2 Fix a typo in small_blas.h
The reason this rather serious looking typo has not
caused any problems uptil now is because NUM_ROW_B is
computed but never actually used.

Thanks to Werner Trobin for pointing this out.

Change-Id: Id2b4d9326ec21baec8a85423e3270aefbafb611e
2015-08-03 12:24:25 -07:00
Sameer Agarwal d9790e7789 Add ProductParameterization
Often a parameter block is the Cartesian product of a number of
manifolds. For example, a rigid transformation SE(3) = SO(3) x R^3
In such cases, where you have the local parameterization
of the individual manifolds available,
ProductParameterization can be used to construct a local
parameterization of the cartesian product.

Change-Id: I4b5bcbd2407a38739c7725b129789db5c3d65a20
2015-07-27 13:37:10 -07:00
Sameer Agarwal cbdecc588a Actually fix the rawhide tolerance bug.
And undo the last two botched CLs.

Thanks to Chris Sweeney and Taylor Braun Jones for saving my bacon.
I will do appropriate penance to repend for my sins.

Change-Id: I14de958e651f85e4c1741fba2cb46ffe7e873346
2015-07-09 21:20:40 -07:00
Sameer Agarwal 3efa55c60f Fix the build
The last patch introduced a typo in the test.

Thanks to Chris Sweeney for pointing this out.

Change-Id: I1de2dba895de2d40f20d661524b57b821fb2d443
2015-07-08 14:44:58 -07:00
Sameer Agarwal 368fa5dc8f Increase tolerance for a test in polynomial_test
This test is failing on RawHide due to some compiler
changes.

https://bugzilla.redhat.com/attachment.cgi?id=1046512

Change-Id: I242314a3804b2888f06e5df0a0ea5d3bf057d5df
2015-07-08 12:32:59 -07:00
Alex Stewart 6414bd0279 Add option to use C++11 (not TR1) shared_ptr & unordered_map.
- On at least some compilers, -std=c++11 is required in order to compile
  against std::shared_ptr & std::unordered_map, which resulted in our
  checks failing to find them and using the TR1 versions instead, which
  causes conflicts for users using C++11.
- Now, if the compiler supports it and the user enables the CXX11
  option, we explicitly enable C++11 before searching for shared_ptr &
  unordered_map, which means we should always find the C++11 versions
  if they are available.
- As use of CXX11 results in a version of Ceres that must be used with
  -std=c++11 for GCC & Clang, we roll this into the Ceres target when
  the version of CMake supports this, otherwise we warn the user they
  will have to do this themselves.
- CXX11 is OFF by default, to ensure that the behaviour of Ceres is
  unchanged from before.

Change-Id: I157ea7a4fadc6bc02da176b8e771f1f327ccaf78
2015-06-22 08:54:40 +00:00
David Gossow 2a1dfd2b71 Add DynamicCostFunctionToFunctor.
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
2015-06-18 16:01:15 -07:00
pmoulon e210bbee19 Add support of EIGEN_SPARSE type in IsSparseLinearAlgebraLibraryTypeAvailable function.
Change-Id: I53f1a245509a216f31e1824486a13c4bac548a7f
2015-05-26 17:29:17 +02:00
Simon Rutishauser 1e241b7cc3 Allow the LossFunction contained in a LossFunctionWrapper to be NULL.
This is consistent with how NULL LossFunctions are treated everywhere
else.

Change-Id: Ic91e39ccb13137fcad7f85e78613a29ecde30d67
2015-05-19 17:13:57 +02:00
Sameer Agarwal 9064b4ed27 Improve numeric differentation near zero.
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
2015-05-13 21:37:15 -07:00
Petter Strandmark e059a7d39e Add a small test to make sure GradientProblemSolver works correctly.
The test makes sure the Rosenbrock function is correctly minimized from the
canonical starting point using the default settings.

Change-Id: Iea820f976707bde37162981c5db87fac5167ba9e
2015-05-04 16:11:35 +02:00
Petter Strandmark 733a20a9fc Add simple unit tests for GradientProblem.
Change-Id: Id3b25a177aa92032f7f99b0a381c4f97d07d73b2
2015-05-04 09:21:33 +02:00
Russell Smith 77e80aecf7 Additional special cases in the handling of pow(Jet,Jet).
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
2015-04-29 12:38:04 +00:00
Johannes Schönberger 239dd59ea5 Homogenize convergence operators in docs and code
Change-Id: Iec7c12e971b331d1847f9aa91349317eb6524856
2015-04-16 16:01:18 -04:00
Sameer Agarwal 365084f976 Lint changes from William Rucklidge.
Change-Id: I5a9683333fbab189058076cb2053f8f7afc7096a
2015-04-16 12:35:51 -07:00
Johannes Schönberger 4eb3b8f34e Add parameter_tolerance convergence to line search minimizer
Change-Id: Id3bd3c7490d679b87259bb0fbf0b2dbc7e831a07
2015-04-16 19:09:12 +00:00
Russell Smith a6f39a939d Fix bug where pow(JetA,JetB) returned wrong result for JetA==0.
Change-Id: Ife7f6f3aca06322fa414ef747008d2b4dc468a57
2015-04-16 18:21:21 +00:00
Johannes Schönberger e00f78edc2 Remove duplicate step norm computation
Change-Id: I58685b81e119360a5b9085bb44efc55131ec9117
2015-04-15 17:03:56 -04:00
Sameer Agarwal d500caaceb Remove confusing code from DenseJacobianWriter
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
2015-04-09 21:05:22 -07:00
Sameer Agarwal e712ce1810 Revert 81219ff.
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
2015-04-07 14:13:25 -07:00
Sameer Agarwal e78a97accb Lint changes from Jim Roseborough.
Change-Id: I4b1e9ac6c1c74e96f51e57e0cbeaa3d3d649f770
2015-04-06 16:23:23 +00:00
Sameer Agarwal e2a716994e Revert a call to SolveUpperTriangularUsingCholesky.
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
2015-04-06 02:16:46 -07:00
Sameer Agarwal 59d7f9842e Use solveInPlace correctly.
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
2015-04-06 07:41:44 +00:00
Sameer Agarwal 10cbe858f8 Make CERES_EIGEN_VERSION macro independent of CMake.
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
2015-04-05 23:35:04 -07:00
Sameer Agarwal 81219fff78 Allow using Eigen's LDLT factorization instead of LLT factorization
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
2015-04-05 22:50:41 -07:00
Alex Stewart 857c18ace0 Add versions of dependencies used to FullReport().
Change-Id: I0a41e88e0669364d21ef86146f0b572f0f08ece5
2015-04-05 14:25:25 +01:00
Alex Stewart c8eeaf4ad9 Increase tolerance in small_blas test for Cygwin.
- Previous tolerance of 2.0 * std::numeric_limits<double>::epsilon()
  was too tight for Cygwin, worked on all other known platforms.

Change-Id: Ia79ad8961272dbb608d8e8ddd3f6d52e5f0735f4
2015-03-30 19:54:26 +01:00
Chris Sweeney 4df3d11397 Bug fix for reversing OrderedGroups.
Reverse() method now handles the case where no groups exist.

Change-Id: Ia1ef08aa3cde01ceb71285b605a2e1f882c3b620
2015-03-21 17:00:40 +00:00